首页 > 其他分享 >AI Mass人工智能大模型即服务时代:AI Mass在图像识别中的应用案例

AI Mass人工智能大模型即服务时代:AI Mass在图像识别中的应用案例

时间:2023-12-24 19:05:15浏览次数:39  
标签:layers 图像识别 name nn AI self relu Mass size


作者:禅与计算机程序设计艺术

1.背景介绍

概述

随着人工智能技术的飞速发展,计算机视觉、自然语言处理等领域也得到了极大的关注。近年来,各大公司纷纷加入人工智能产品和解决方案供应商阵营,对人工智能的发展带来了巨大的变革。其中,以Google为代表的大数据及机器学习技术促进了人工智能的普及和增长,特别是在图像识别领域。因此,越来越多的人开始关注并使用基于大数据的AI产品和服务。

定义

人工智能(Artificial Intelligence,简称AI)是指能够像人的智慧一样自动执行重复性任务的机器。2016年,由IBM提出的AI的定义为“机器学习、计算、推理和决策的能力”。更确切地说,AI是指一种以获取知识、学习、分析和决策的方式,模仿人类的潜意识行为,并可以从环境中学习并改善自身的能力。AI通过实现计算机的自我学习、改善性能、解决复杂的问题、创新设计新的产品和服务,已经成为行业的热门话题。

类型

监督学习与无监督学习

监督学习(Supervised Learning)是机器学习的一类方法,它从训练集(具有既定输入输出关系的数据集合)中学习,利用训练好的模型预测新样本的输出结果,是一种典型的基于训练数据进行模式识别的机器学习方法。其主要目的是找到一个映射函数f(x),使得对于任意给定的输入x,其对应的输出y等于预先设定的输出y',即f(x)=y'。监督学习的目标是学习到输入到输出的映射关系。

无监督学习(Unsupervised Learning)是机器学习的另一类方法,它不使用标签信息,而是通过对训练数据进行聚类、降维、概率分布估计等方式发现数据的内在结构和规律。无监督学习的目标是从数据中找寻隐藏的模式和关系。

半监督学习与强化学习

半监督学习(Semi-Supervised Learning)是指训练数据既包括 labeled 数据也包括 unlabeled 数据。labeled 数据是指已经标注过的训练数据,而 unlabeled 数据则是没有标注过的训练数据。半监督学习通过用 unlabeled 数据学习模型参数,将模型适用于现实世界的应用场景。相比于完全无监督学习,半监督学习更具实际价值。

强化学习(Reinforcement Learning)又称为反馈学习,是机器学习中的一个子领域,其目标是让机器通过不断探索和学习环境,完成一系列任务。强化学习解决的问题是如何在环境中最大化长期累积奖励。强化学习算法通常都采用时间片的形式,每隔一段时间,学习器都会收到一定的反馈信息,然后根据这个反馈信息选择动作,以此进行学习和迭代。

市场份额排名

截至目前,全球AI企业已占据全球总量的75%以上,其中规模最大的是谷歌母公司Alphabet。中国AI企业数量仅次于美国和欧洲。根据IDC发布的最新报告显示,截至2019年底,中国AI初创企业数量为1万余家,2020年目标是5万余家。

2.核心概念与联系

大模型

AI Mass或者AI模型即基于大数据的计算机视觉、自然语言理解、推荐系统、深度学习等人工智能技术的一个整体。

例如,“ImageNet Large Scale Visual Recognition Challenge”就是一个大模型的竞赛。它是一个图片分类领域的大型挑战赛,旨在评估计算机视觉模型的准确性、鲁棒性、泛化性。该竞赛的参赛队伍需要提交算法模型,通过竞争激烈的提交评审和比赛,筛选出最佳方案,最终获得优胜者奖金。

云端AI服务

云端AI服务的目的是将人工智能技术能力部署到云端,以便可以快速、低成本的实现应用。云端AI服务包括基于虚拟机或容器的远程访问服务、远程开发服务、机器学习平台服务、数据分析服务、AI咨询服务等。

例如,亚马逊AWS的Amazon SageMaker可以作为一个平台服务,帮助开发人员训练机器学习模型、构建预测服务等。微软Azure提供了一系列的服务,如Azure Cognitive Services、Azure Machine Learning Service等。腾讯云提供了腾讯云图智产品,提供一系列的智能图像识别服务,如图像拼接、智能修复、AI图像识别等。

3.核心算法原理和具体操作步骤以及数学模型公式详细讲解

深度学习与卷积神经网络

深度学习是指多个非线性层次组成的特征提取机制。深度学习通常是使用神经网络(Neural Network)来实现的,神经网络是由多个节点和连接组成的网络,每个节点都是神经元,有连接的两个节点之间传递信号。

卷积神经网络(Convolutional Neural Networks, CNNs)是深度学习中最常用的一种网络结构,它的基本思路是提取局部相关的特征,并在不同的空间位置进行池化操作。CNNs 的一些基础组件包括卷积层、池化层、全连接层、批归一化层、激活层等。

具体的操作步骤如下:

  1. 初始化网络结构: 选择合适的卷积核大小、过滤器个数、池化窗口大小等参数;
  2. 卷积层:卷积层主要作用是提取图像的局部特征,通过滑动窗口对图像进行扫描,提取与每个窗口对应的特征,然后通过激活函数(ReLU、Sigmoid等)进行非线性转换,缩小特征图的尺寸;
  3. 池化层:池化层主要用来降低图像的分辨率,通过移动窗口进行滑动,选取图像中的最大值作为输出,缩减图像的空间尺寸;
  4. 全连接层:全连接层将上一步的输出与权重矩阵相乘,产生新的输出,并通过激活函数进行非线性转换;
  5. 损失函数:损失函数用于衡量模型预测结果与真实结果之间的差距,并反向传播更新参数;
  6. 优化器:优化器用于控制梯度下降过程,以最小化损失函数的值;
  7. 模型训练:按照数据集进行训练,把数据输入到网络中进行训练,调整网络的参数,使得模型效果达到最好。

搭建模型架构

使用VGG16架构搭建模型

卷积神经网络(CNNs)经过多次的精彩发展,在图像识别领域表现突出,且在不同场景下取得了极大的成功。比较著名的有AlexNet、VGG、GoogLeNet、ResNet等。

AlexNet 是第一个迄今为止基于深度学习进行图像识别的网络。AlexNet 的论文《ImageNet Classification with Deep Convolutional Neural Networks》被认为是深度学习在图像识别上的里程碑事件。AlexNet 在 ILSVRC-2012 图像识别挑战赛上夺冠,证明其性能超过了当时的其他候选人。

为了加快 VGG 的训练速度,作者们在 VGG16 的基础上做了一些改进,引入了短边放缩策略,以及去掉全连接层后加上全局平均池化层的方法,最终得到了 VGG16 。

VGG16 是第二个被广泛使用的 CNN 架构,由 16 个卷积层和三个全连接层构成。网络结构如下图所示:

VGG16 可以很好地解决图像分类、物体检测等任务,并且速度也非常快,因为它采用了高度优化的结构。但是,由于 VGG16 不是所有的层都能有效果,所以我们一般只把前几层训练,再训练最后一层。

Faster R-CNN

Faster R-CNN 是一个对象检测框架,其主要的特点是速度快,准确率高。Faster R-CNN 将 region proposal 方法与卷积神经网络结合起来,生成预测框,并将这些框送入神经网络进行预测。

首先,用 Selective Search 或 Edge Boxes 方法提取出很多候选区域。然后,用分类器(Alexnet)进行分类,对候选区域进行打分。最后,用回归器(Fast R-CNN)对候选框进行修正,用三个全连接层生成 bbox,并送入到损失函数进行训练。

Faster R-CNN 的优点是速度快,准确率高,而且不需要对物体进行旋转。缺点是由于 Selective Search 方法只能识别简单的物体,无法检测复杂的物体。

YOLO v3

YOLO (You Only Look Once) 是第三个被广泛使用的 CNN 架构,其基本思想是利用网格结构来进行快速的物体检测。

YOLOv3 中的 “only look once” 表示只需要进行一次预测就可以得到物体的所有信息,而不是像 Faster R-CNN 和 SSD 需要多次预测才能得到物体的信息。

YOLOv3 的网络结构相较于其它两种架构有很大变化。它有五个部分组成,分别是backbone network、neck、head、output generator、loss function。backbone network 为骨干网络,用来提取特征;neck 提供可微调的区域建议,帮助 YOLOv3 更好地检测不同尺寸的物体;head 负责预测物体类别和坐标偏移;output generator 负责将 head 的输出转换成真实的预测框,并在一定程度上消除重叠;loss function 计算所有预测框的损失值。

YOLOv3 在速度上要比其它两种架构快很多,原因是它将特征提取与预测分离开来,特征提取可以在整个图片上单独运行,这使得 YOLOv3 在小尺寸物体上表现更好。

RetinaNet

RetinaNet 是 Facebook AI Research 团队提出的物体检测模型,其主要特点是速度快,准确率高,并且与速度快相关的网络设计。

RetinaNet 的主体架构同样是 Backbone + Neck + Head。Backbone 网络用来提取特征,比如 ResNet-101 或者 ResNext-101;Neck 用来提供可微调的区域建议,帮助 RetinaNet 更好地检测不同尺寸的物体;Head 负责预测物体类别和坐标偏移,其中分类头采用两个独立的分支,一个用于分类,一个用于回归;loss function 对所有预测框的损失值进行求和,平衡不同尺寸的物体;训练策略采用 focal loss 来处理类别不均衡问题。

与 Faster R-CNN 相比,RetinaNet 有更高的检测性能,但训练速度慢于 Faster R-CNN。RetinaNet 的优点是训练速度快,准确率高,与 Faster R-CNN 相同的是,它不能检测复杂的物体。

4.具体代码实例和详细解释说明

TensorFlow 实现

安装 TensorFlow

在命令行中输入以下命令安装 TensorFlow:

pip install tensorflow==1.14.0 # 指定版本号

使用 TensorFlow 实现 VGG16 训练

加载数据集

这里我们使用 CIFAR-10 数据集,一共有 60k 张图片,每个图片大小为 32x32x3。

import numpy as np
from tensorflow.keras.datasets import cifar10

# Load the data set
(train_images, train_labels), (test_images, test_labels) = cifar10.load_data()
num_classes = len(np.unique(train_labels))

# Normalize pixel values to be between 0 and 1
train_images = train_images / 255.0
test_images = test_images / 255.0
创建模型

创建 VGG16 模型,其卷积层有 5 个,分别是卷积层 + ReLU 激活层 * 2、最大池化层 + 随机失活层 * 2、卷积层 + ReLU 激活层 * 3、最大池化层 + 随机失活层 * 2。最后一层全连接层输出有 num_classes 个神经元。

from tensorflow.keras import layers, models

model = models.Sequential([
    layers.Conv2D(input_shape=(32, 32, 3), filters=64, kernel_size=(3, 3), activation='relu', name='block1_conv1'),
    layers.Conv2D(filters=64, kernel_size=(3, 3), activation='relu', name='block1_conv2'),
    layers.MaxPooling2D((2, 2), strides=(2, 2), name='block1_pool'),
    layers.Dropout(rate=0.25, name='block1_dropout'),

    layers.Conv2D(filters=128, kernel_size=(3, 3), activation='relu', name='block2_conv1'),
    layers.Conv2D(filters=128, kernel_size=(3, 3), activation='relu', name='block2_conv2'),
    layers.MaxPooling2D((2, 2), strides=(2, 2), name='block2_pool'),
    layers.Dropout(rate=0.25, name='block2_dropout'),

    layers.Conv2D(filters=256, kernel_size=(3, 3), activation='relu', name='block3_conv1'),
    layers.Conv2D(filters=256, kernel_size=(3, 3), activation='relu', name='block3_conv2'),
    layers.Conv2D(filters=256, kernel_size=(3, 3), activation='relu', name='block3_conv3'),
    layers.MaxPooling2D((2, 2), strides=(2, 2), name='block3_pool'),
    layers.Dropout(rate=0.25, name='block3_dropout'),

    layers.Conv2D(filters=512, kernel_size=(3, 3), activation='relu', name='block4_conv1'),
    layers.Conv2D(filters=512, kernel_size=(3, 3), activation='relu', name='block4_conv2'),
    layers.Conv2D(filters=512, kernel_size=(3, 3), activation='relu', name='block4_conv3'),
    layers.MaxPooling2D((2, 2), strides=(2, 2), name='block4_pool'),
    layers.Dropout(rate=0.25, name='block4_dropout'),

    layers.Conv2D(filters=512, kernel_size=(3, 3), activation='relu', name='block5_conv1'),
    layers.Conv2D(filters=512, kernel_size=(3, 3), activation='relu', name='block5_conv2'),
    layers.Conv2D(filters=512, kernel_size=(3, 3), activation='relu', name='block5_conv3'),
    layers.MaxPooling2D((2, 2), strides=(2, 2), name='block5_pool'),
    layers.Dropout(rate=0.25, name='block5_dropout'),

    layers.Flatten(),
    layers.Dense(units=4096, activation='relu', name='fc1'),
    layers.Dense(units=4096, activation='relu', name='fc2'),
    layers.Dense(units=num_classes, activation='softmax', name='predictions')
])
编译模型

使用 categorical crossentropy 损失函数和 Adam 优化器。

from tensorflow.keras.optimizers import Adam

optimizer = Adam(lr=0.001)
model.compile(optimizer=optimizer,
              loss='categorical_crossentropy',
              metrics=['accuracy'])
设置回调函数

设置 EarlyStopping 回调函数,在验证集的 accuracy 不再提升时停止训练。

from tensorflow.keras.callbacks import EarlyStopping

earlystop = EarlyStopping(monitor='val_accuracy', patience=10, verbose=1)
训练模型

训练模型,batch_size 为 32,epochs 为 100。

history = model.fit(train_images,
                    keras.utils.to_categorical(train_labels, num_classes), 
                    epochs=100, 
                    batch_size=32, 
                    validation_split=0.2, 
                    callbacks=[earlystop])
可视化训练过程

可视化训练过程中 accuracy 和 loss 的变化。

import matplotlib.pyplot as plt

acc = history.history['accuracy']
val_acc = history.history['val_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']

plt.figure(figsize=(10, 6))
plt.subplot(2, 2, 1)
plt.plot(acc, label='Training Accuracy')
plt.plot(val_acc, label='Validation Accuracy')
plt.legend(loc='lower right')
plt.ylabel('Accuracy')
plt.ylim([min(plt.ylim()),1])
plt.title('Training and Validation Accuracy')

plt.subplot(2, 2, 2)
plt.plot(loss, label='Training Loss')
plt.plot(val_loss, label='Validation Loss')
plt.legend(loc='upper right')
plt.ylabel('Cross Entropy')
plt.ylim([0,max(plt.ylim())])
plt.title('Training and Validation Loss')
plt.show()
测试模型

测试模型,打印准确率。

test_loss, test_acc = model.evaluate(test_images,
                                     keras.utils.to_categorical(test_labels, num_classes))
print("Test accuracy:", test_acc)

PyTorch 实现

PyTorch 的实现方式和 Tensorflow 类似,也是建立 Sequential 模型,然后添加各种层。

import torch
import torchvision
import torchvision.transforms as transforms

transform = transforms.Compose(
    [transforms.ToTensor(),
     transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
                                        download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,
                                          shuffle=True, num_workers=2)

testset = torchvision.datasets.CIFAR10(root='./data', train=False,
                                       download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=4,
                                         shuffle=False, num_workers=2)

classes = ('plane', 'car', 'bird', 'cat',
           'deer', 'dog', 'frog', 'horse','ship', 'truck')

使用 VGG16 训练

创建模型

创建一个 VGG16 模型,输入图片大小为 32x32x3,输出为 10 个类别。

import torch.nn as nn
import torch.nn.functional as F

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 64, 3, padding=1)
        self.bn1 = nn.BatchNorm2d(64)
        self.pool1 = nn.MaxPool2d(kernel_size=2, stride=2)

        self.conv2 = nn.Conv2d(64, 128, 3, padding=1)
        self.bn2 = nn.BatchNorm2d(128)
        self.pool2 = nn.MaxPool2d(kernel_size=2, stride=2)

        self.conv3 = nn.Conv2d(128, 256, 3, padding=1)
        self.bn3 = nn.BatchNorm2d(256)
        self.conv4 = nn.Conv2d(256, 256, 3, padding=1)
        self.bn4 = nn.BatchNorm2d(256)
        self.pool3 = nn.MaxPool2d(kernel_size=2, stride=2)

        self.conv5 = nn.Conv2d(256, 512, 3, padding=1)
        self.bn5 = nn.BatchNorm2d(512)
        self.conv6 = nn.Conv2d(512, 512, 3, padding=1)
        self.bn6 = nn.BatchNorm2d(512)
        self.pool4 = nn.MaxPool2d(kernel_size=2, stride=2)

        self.conv7 = nn.Conv2d(512, 512, 3, padding=1)
        self.bn7 = nn.BatchNorm2d(512)
        self.conv8 = nn.Conv2d(512, 512, 3, padding=1)
        self.bn8 = nn.BatchNorm2d(512)
        self.pool5 = nn.MaxPool2d(kernel_size=2, stride=2)

        self.fc1 = nn.Linear(8*8*512, 4096)
        self.fc2 = nn.Linear(4096, 4096)
        self.fc3 = nn.Linear(4096, 10)

    def forward(self, x):
        x = self.conv1(x)
        x = self.bn1(x)
        x = F.relu(x)
        x = self.pool1(x)

        x = self.conv2(x)
        x = self.bn2(x)
        x = F.relu(x)
        x = self.pool2(x)

        x = self.conv3(x)
        x = self.bn3(x)
        x = F.relu(x)
        x = self.conv4(x)
        x = self.bn4(x)
        x = F.relu(x)
        x = self.pool3(x)

        x = self.conv5(x)
        x = self.bn5(x)
        x = F.relu(x)
        x = self.conv6(x)
        x = self.bn6(x)
        x = F.relu(x)
        x = self.pool4(x)

        x = self.conv7(x)
        x = self.bn7(x)
        x = F.relu(x)
        x = self.conv8(x)
        x = self.bn8(x)
        x = F.relu(x)
        x = self.pool5(x)

        x = x.view(-1, 8*8*512)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x
编译模型

使用交叉熵损失函数和 Adam 优化器。

criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(net.parameters(), lr=0.001)
训练模型

循环迭代,每次训练一轮,保存训练过程中的损失函数值和正确率值。

for epoch in range(2):    # 两轮迭代

    running_loss = 0.0
    total = 0
    correct = 0

    for i, data in enumerate(trainloader, 0):
        inputs, labels = data
        optimizer.zero_grad()

        outputs = net(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += predicted.eq(labels).sum().item()

        running_loss += loss.item()
        if i % 2000 == 1999:    # 每 2000 个 mini-batches 打印一次
            print('[%d, %5d] loss: %.3f | acc: %.3f%% (%d/%d)'
                  %(epoch+1, i+1, running_loss/(2000), 100.*correct/total, correct, total))

            running_loss = 0.0

    save_checkpoint({'state_dict': net.state_dict()}, True) # 保存模型
测试模型

遍历测试数据集,计算正确率。

correct = 0
total = 0
with torch.no_grad():
    for data in testloader:
        images, labels = data
        outputs = net(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print('Accuracy of the network on the 10000 test images: %d %%' % (
    100 * correct / total))


标签:layers,图像识别,name,nn,AI,self,relu,Mass,size
From: https://blog.51cto.com/universsky/8956538

相关文章

  • AI Mass人工智能大模型即服务时代:AI Mass在客户服务中的应用案例
    作者:禅与计算机程序设计艺术1.背景介绍在过去的几年里,人工智能(AI)技术正在飞速发展。很多行业都处于迎头赶上的阶段,如自动驾驶、智慧医疗、虚拟现实等。同时,AI还在向其他领域迈进,如图像处理、语音识别、视频分析等。企业也越来越重视建立更加透明、高效的服务体系,通过各种渠道提......
  • AI Mass人工智能大模型即服务时代:智能医疗的智慧护理
    作者:禅与计算机程序设计艺术1.背景介绍随着人工智能、机器学习等科技的快速发展,医疗领域也面临着前所未有的技术革命。在这个过程中,我们可以看到医疗机构的健康管理方式发生了巨大的变化,不再依赖于传统的人力进行诊断,而是借助人工智能及其强大的计算能力自动分析患者的生理数据,通......
  • AI Mass人工智能大模型即服务时代:如何训练你的AI Mass模型
    作者:禅与计算机程序设计艺术1.背景介绍随着技术的不断进步,越来越多的创新应用出现在我们生活中。人们对创新的追求、对科技的热情,都导致了越来越多的人选择学习并尝试新的技术。而AI领域也如火如荼,应用广泛、领先于传统机器学习的各个方向,极大地推动了人类发展。人工智能即机器学......
  • AI Mass人工智能大模型即服务时代:大模型在医疗领域的应用
    作者:禅与计算机程序设计艺术1.背景介绍随着科技的飞速发展,人工智能技术已经引起了广泛的关注。从最早的机器翻译到自动驾驶汽车,再到现在主流的深度学习框架、自然语言处理工具等,都处于蓬勃发展阶段。但是由于数据量太大,训练复杂网络模型耗费时间成本高等特点,导致模型更新缓慢、迭......
  • AI Mass人工智能大模型即服务时代:从模型搜索到模型优化
    作者:禅与计算机程序设计艺术1.背景介绍在2021年7月1日至9月30日,第十六届全国人工智能创新创业大赛(AICity2021)刚刚结束,很多参赛队伍都在寻找突破性的应用场景,而其中最引人注目的AIMass项目就是基于人类大脑智能模型的智能机器人或智能助手,解决一些实际问题,比如看护、送菜、看病......
  • AI Mass人工智能大模型即服务时代:AI Mass对制造业的影响
    作者:禅与计算机程序设计艺术1.背景介绍人工智能(ArtificialIntelligence,AI)近几年在各个领域都取得了突破性的进步。但在制造业领域的应用却存在很大的障碍,因为制造业企业面临着快速变化的市场环境、需求量激增、成本持续降低等诸多不利因素。同时,由于产业结构的复杂性和高投入成本......
  • OpenAI Q* 是一个彻底的 谣言...
    OpenAI仍未明确解释Q*究竟是什么,但透露的线索倒是相当不少。11月22日,就在OpenAI决定解雇(后又重新聘用)CEOSamAltman的几天之后,技术媒体TheInformation报道称OpenAI取得了一项重大技术突破,使其能够“开发出更强大的AI模型”。新模型被命名为Q*(音为「Qstar」),“具......
  • 基于 Flink SQL 和 Paimon 构建流式湖仓新方案
    本文整理自阿里云智能开源表存储负责人,FounderofPaimon,FlinkPMC成员李劲松在云栖大会开源大数据专场的分享。本篇内容主要分为三部分:数据分析架构演进介绍ApachePaimonFlink+Paimon流式湖仓一、数据分析架构演进目前,数据分析架构正在从Hive到Lakehouse的演变。传统数......
  • 基于Tensorflow技术开发的计算机毕业设计辅助生成器(使用AI大模型技术)
    这是一个辅助生成计算机毕业设计的工具,可以自动完成毕业设计的源码。它基于几百个github上面开源的java和python项目,运用tensorflow技术,训练出了AI大模型。基本实现了计算机毕业设计生成器,能够初步生成Java或python基本源码。目前该项目处理实验阶段,还不成熟,成功率55%左右。体验地......
  • 安全帽AI识别算法在LiteCVR智慧工地解决方案中的应用
    智慧工地是利用物联网、云计算、大数据等先进技术来优化和管理工地施工过程的一种新型施工模式。视频监控在智慧工地中发挥着重要的作用。LiteCVR视频监控系统可以实时监测工地的人员和设备,及时发现安全隐患。例如,监控摄像头可以检测到工人是否佩戴安全帽,是否按规定操作,以及工地是......