Skip to content

Latest commit

 

History

History
247 lines (147 loc) · 13 KB

智能识别.md

File metadata and controls

247 lines (147 loc) · 13 KB

人工智能图像识别

目录

  • 智能识别概述
  • YOLO算法介绍
  • 使用场景
  • 局限性与不足



一、智能识别概述

随着计算机技术的迅速发展和科技的不断进步,图像识别技术已经在众多领域中得到了应用,其产生的目的是为了让计算机代替人类去处理大量的物理信息,并以此用来识别不同模式下目标和对象的一门技术。

而「计算机的图像识别」和「人类的图像识别」在原理上并没有本质的区别,只是要处理的信息更加繁琐,并且计算机缺少人类在感觉与视觉差上的影响。其实和人类一样,我们在识别某种物品的时候也不单单是凭借整个图像存储在脑海中的记忆来识别的,我们识别图像都是依靠图像所具有的本身特征而先将这些图像分了类,然后通过各个类别所具有的特征将图像识别出来的。

而在建设智慧校园、智慧城市的当下,人工智能识别成为进一步发展的必需品。在这个项目中,我们采用了在传统图像识别基础上融合神经网络算法的识别方式。




二、YOLO算法介绍

YOLO全称是you only look once,指的是只需要浏览一次即可判断图中的物体类别以及位置信息。它建立在darknet框架之上,采用单个卷积神经网络实现的实时目标检测算法,提高了目标检测的精度与速度。

darknet



  • darknet框架

考虑到我们团队的能力,我们采用基于较为小众的darknet框架的yolo算法,darknet适合我们团队的原因主要如下:

1.易于安装:在makefile里面选择自己需要的附加项(cuda,cudnn,opencv等)直接make即可,几分钟完成安装;

2.没有任何依赖项:整个框架都用C语言进行编写,可以不依赖任何库,连opencv作者都编写了可以对其进行替代的函数;

3.结构明晰,源代码查看、修改方便:其框架的基础文件都在src文件夹,而定义的一些检测、分类函数则在example文件夹,可根据需要直接对源代码进行查看和修改;

4.友好python接口:虽然darknet使用c语言进行编写,但是也提供了python的接口,通过python函数,能够使用python直接对训练好的.weight格式的模型进行调用;

5.易于移植:该框架部署到机器本地十分简单,且可以根据机器情况,使用cpu和gpu,特别是检测识别任务的本地端部署,darknet会显得异常方便。

  • YOLO优势

Yolov3 is fast and accurate

YOLO作为实时检测算法,其速度与效率在同类算法中优势明显,因此我们将其部署在系统中,以完美适配所需的动态监测要求。

(1)YOLO很快,因为用回归的方法,并且不用复杂的框架。

(2)YOLO会基于整张图片信息进行预测,而其他滑窗式的检测框架,只能基于局部图片信息进行推理。

(3)YOLO学到的图片特征更为通用。



  • YOLO核心思想

    利用整张图作为网络的输入,并直接在输出层回归bounding box的位置和bounding box所属的类别。
    其中,每个bounding box具有5个值,分别预测x(x_center),y(y_center),w(width),h(height),以及confidence(置信度),此外还输出类别信息。

YOLO算法采用一个单独的CNN模型实现end-to-end的目标检测,整个系统流程:首先将输入图片resize到448x448,然后送入CNN网络,最后处理网络预测结果得到检测的目标。相比R-CNN算法,其是一个统一的框架,其速度更快,而且YOLO的训练过程也是end-to-end的。作者在YOLO算法中把物体检测(object detection)问题处理成回归问题,用一个卷积神经网络结构就可以从输入图像直接预测bounding box和类别概率。



  • 实现过程

1)图像分割

YOLO首先将图像分割为S×S个格子,每个单元格负责去检测那些中心点落在该格子内的目标,如可以看到狗这个目标的中心落在左下角一个单元格内,那么该单元格负责预测这个狗。

基本思想是使用图像分类和定位算法(image classification and Localization algorithm)然后将算法应用到这些格子上,然后需要对每个小网格定义一个5+k(k为预测类别个数)维向量的目标标签。YOLO算法使用的是取目标对象边框中心点的算法,即考虑边框的中心点在哪个格子中。

2)网格处理

每个单元格会预测B个边界框(bounding box)以及边界框的置信度(confidence score)。我们定义置信度$C=Pr(Obeject)*IOU^{truth}_{pred}$,如果没有目标,置信值为零。另外,我们希望预测的置信值和ground truth的intersection over union (IOU)相同。

每一个bounding box包含5个值:x,y,w,h和confidence。(x,y)代表与格子相关的box的中心。(w,h)为与全图信息相关的box的宽和高。confidence代表预测boxes的IOU和gound truth。 IOU即为交并比,反应两个框框的相似度。

每个格子(grid cell)预测条件概率值C($Pr(Class_i|Object)$)。概率值C代表了格子包含一个目标的概率,每一格子只预测一类概率。在测试时,每个box通过类别概率和box置信度相乘来得到特定类别置信分数:
$Pr(Class_i|Object)*Pr(Object)*IOU^{truth}{pred}=Pr(Class_i)*IOU^{truth}{pred}$
这个分数代表该类别出现在box中的概率和box和目标的合适度。在PASCAL VOC数据集上评价时,我们采用S=7,B=2,C=20(该数据集包含20个类别),最终预测结果为7×7×30的tensor。



3)非极大值抑制筛选

对于同一个目标被多个单元格识别的问题,我们采用了非极大值抑制算法:NMS算法来实现这样的效果:首先从所有的检测框中找到置信度最大的那个框,然后挨个计算其与剩余框的IOU,如果其值大于一定阈值(重合度过高),那么就将该框剔除;然后对剩余的检测框重复上述过程,直到处理完所有的检测框。



4)损失函数

a)坐标预测误差
b)置信度预测误差
c)分类预测误差
结合三种误差,得到损失函数:Loss = λcoord * 坐标预测误差 +(含object的box confidence预测误差 + λnoobj * 不含object的box confidence预测误差) + 类别预测误差



5)训练过程

YOLO的基础网络灵感来源于GoogLeNet,但是并没有采取其inception的结构,而是简单的使用了1×1的卷积核。base model共有24个卷积层,后面接2个全连接层。
在训练网络的时候,作者首先用ImageNet预训练前20个卷积层,作者训练的结果是top-5 accuracy = 88%。
训练好分类网络后,进行检测的训练,由于检测一般需要较大的分辨率,所以作者将输入图像大小修改为448*448。

另外YOLO并没有使用Relu激活函数,而是使用了leaky rectified linear激活函数,如下:

事实上,在 YOLO 中识别的关键就是我们的 weights(权重)文件,权重文件保存的就是训练好的网络各层的权值,也就是通过训练集训练出来的。训练好之后,应用时只要加载权值就可以了。

我们通过进行数据集的标定并投入卷积神经网络训练,深度学习之后,可以得到权重文件,在加以引用之后即可实现我们所设想的目标识别功能。




三、使用场景

食堂的环境评测

  • 通过搜集大量的不同整洁程度的食堂照片,并人工进行数据的标注等级,并投入卷积训练,从而得出有关食堂整洁等级评判的weights文件。我们将之部署到连接食堂摄像头的主机之上,定期的开启算法进行食堂环境评测,结合气体传感器的信息形成完善的评价体系,并将数据同步到小程序上供客户读取。

用餐完毕的判断

  • 通过大量数据集进行训练,形成对于餐盘空满状态的判断数据集。在这个算法体系下,我们选择了只进行四种类别的判断,即person、full、none、half来收集座位是否有人,餐盘的满、空、近空状态信息。我们通过存储十秒前的数据,与现在进行对比,若判断到原先有人,现在人离开座位,且餐盘处于近空或空状态,则判断其为用餐完毕。

机器人回收餐盘

  • 系统发布指令让机器人来到餐桌前,机器人通过装载的摄像头完成餐盘的边界标定与判断,从而能够在餐盘范围内进行回收。通过训练好的碗筷、垃圾数据集,进行碗筷的判断,将碗筷分门别类放好,垃圾回收,再将餐盘收回机器人

校园道路的环境评测

  • 通过训练数据集,其中包含模糊的垃圾大类,我们在道路上部署的摄像头设置为仅进行垃圾、落叶、掉落物件的判断,以节约性能。其中,垃圾与落叶则通过训练数据集大类进行模糊判断。而对于掉落物件,我们则采取动态的掉落判断,若判断到其在5秒内的z坐标发生变化,则判断为掉落物件,并进行标注位置信息,以便后续进行招领。

垃圾的分类回收

  • 我们进行垃圾分类的数据集精确训练,从而形成四种类别垃圾的判断功能。在机器人上部署该权重以及正常的目标识别权重,从而进行垃圾回收识别以及到达目的区域的比对判断。

位置的判断

  • 我们在获取图像信息的同时,同时也希望对图中的物件进行位置的判断,从而能够使其同步在小程序地图之中,因此我们在摄像头传输图像与识别后,进行了从图像坐标系到现实坐标系的换算。

  • 首先我们需要知道摄像头的内置参数,即光心位置、焦距,同时我们已知摄像头的位置参数。我们通过将图像坐标系/像素坐标系先转化为三维的相机坐标系再转化为世界坐标系,从而将之同步为显示坐标。从图像坐标系到相机坐标系为刚体变换,从相机坐标系到世界坐标系则主要通过旋转变换和平移变换。

  • 由相似三角形的换算,我们可以得出用矩阵表达的像素坐标系(x,y)-相机坐标系($X_c,Y_c,Z_c$)换算公式:

$$ Z_c \begin{pmatrix} x \ y \ 1 \ \end{pmatrix}

\begin{pmatrix} fx & 0 & 0 & u_0 \ 0 & fy & 0 & v_0 \ 0 & 0 & 1 & 0 \ \end{pmatrix} \begin{pmatrix} X_c \ Y_c \ Z_c \ 1 \ \end{pmatrix} $$ 其中fx、fy是相机焦距f除以dx、dy得到的值,即fx = f / dx, fy = f / dy。 u0、v0表示的是图像的中心像素坐标和图像圆点像素坐标之间相差的横向和纵向像素数。

相机坐标系到世界坐标系的转换可以用如下公式表示: $X_c=RX+T$
其中R表示旋转,T表示平移,$R=r1r2r3$
r1,r2,r3分别为绕X、Y、Z旋转的参数矩阵。
我们得到相机坐标系{$X_c,Y_c,Z_c$}到世界坐标系{$X_w,Y_w,Z_w$}的换算公式: $$ \begin{pmatrix} X_c \ Y_c \ Z_c \ \end{pmatrix}

\begin{pmatrix} r_{00} & r_{01} & r_{02} \ r_{10} & r_{11} & r_{12} \ r_{20} & r_{21} & r_{22} \ \end{pmatrix} \begin{pmatrix} X_w\ Y_w\ Z_w\ 1 \ \end{pmatrix} + \begin{pmatrix} T_x \ T_y \ T_z \ \end{pmatrix} $$ 得到世界坐标系后,与原点摄像头的位置坐标叠加即可得到目标在现实坐标系的位置,并同步更新至地图中显示。




四、局限性与不足

在这个项目中,我们运用YOLO算法在各个领域作为基石,但仍存在一些局限性以及不足之处。

1)对于较小的物品,以及连成一片的群体性物体,YOLO算法识别的准确度尚还存在一些欠缺。

2)定位上还存在一些误差可以改进,但限于能力不足以及设备短缺无法精进。

3)在一些复杂的道路环境上,机器识别算法的准确度可能受到限制。

4)对于餐盘的空满状态判断,以及垃圾的分类识别,目前仅停留在通过大量的数据集进行训练来形成足够可靠的weights文件,并不具备足够的效率。