基于TensorFlow+YOLOV3的目标识别研究与实现

时间:2024-03-24 22:51:34

一、TensorFlow:
它是谷歌研发的关于人工智能开源的学习框架。Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算,TensorFlow为张量从流图的一端流动到另一端计算过程。TensorFlow是将复杂的数据结构传输至人工智能神经网中进行分析和处理过程的系统。
TensorFlow可用于语音、图像、视频识别等多项深度学习领域;目前,TensorFlow支持Mac os、window和Linux系统;同时也支持多种编程语言,例如C++、python等;是人工智能学习与研究中较好的框架。
TensorFlow的安装(python方向):
在安装TensorFlow前需要先安装Anaconda,Anaconda有自带的python,然后再安装TensorFlow。
(1)在清华镜像源下载Anaconda并安装;我下载安装的是Anaconda3-4.2.0,对应的python版本是3.5.2;下载地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-4.2.0-Windows-x86_64.exe
(2)安装成功后打开Anaconda prompt,直接输入以下任意命令
pip install tensorflow(安装cpu版本)
pip install tensorflow-gpu(安装gpu版本)
pip install tensorflow==版本(安装指定版本tensorflow,一般不建议)
安装完成后,输入python进入python编辑,输入
import tensorflow,如出现下图情况则安装成功: 基于TensorFlow+YOLOV3的目标识别研究与实现

二、YOLOV3目标识别算法
YOLO是You only look once 的缩写,即在目标识别的时候只需要看一次图片;在处理物体检测时,YOLO将之看成是回归问题来处理,用一个卷积神经网络结构就可以预测出图像中边界框(bounding box:将目标包围起来的矩形框)和类别概率。
YOLO的优点:
(1)速度快,因为只需要看一次图像,且相较于RCNN的滑动窗口,YOLO则是将图像分为S*S的网格;所以速度比较快。
(2)YOLO是基于图像的全局信息进行预测,与Fast R-CNN相比,YOLO在误检测(将背景检测为物体)方面的错误率能降低一半多。
(3)准确率较高

2.1 实现原理
2.1.1 YOLOV1
(1)(Yolo的CNN网络)先将输入的图像划分为S*S的网格;然后对每个网格分别预测B边界框(bounding boxes),C个类别概率以及边界框的置信度(confidence score:这个边界框含有目标的可能性大小和这个边界框的准确度,用S表示);每个网格会检查是否有物体的中心落在本身网格内,若有,则该网格负责预测该目标。如下图所示:
基于TensorFlow+YOLOV3的目标识别研究与实现
YOLO网络结构主要有两部分,第一部分是特征提取网络,主要负责提取物体的通用特征,一般在ImageNet上进行预训练;第二部分是后处理网络,目的是回归出待检测物体的坐标和类别。
(2)损失函数
YOLO全部使用了均方和误差作为loss函数,由三部分组成:坐标误差、IOU误差和分类误差。
注释:IOU(Intersection over Union是一种测量在特定数据集中检测相应物体准确度的一个标准,通俗理解就是重叠度)
基于TensorFlow+YOLOV3的目标识别研究与实现
2.1.2 YOLOV2
相较于V1,V2添加了BN(batch normalization:批规范化)层;用448x448的输入分辨率在ImageNet上进行参数微调;取消全连接层,使用anchor boxes(锚点框)来预测目标方框;使用anchor boxes的就把分类置信度和空间位置分离,有效地提高了召回率。
2.1.3 YOLOV3
在YOLO系列的算法里面,作者只是在V1的论文中给出结构图,在V2和V3中均没有结构图,以下结构图是从名叫“木盏”的博文中截取的,准确性可以保证,对于YOLO系列算法的理解有很大帮助。
基于TensorFlow+YOLOV3的目标识别研究与实现
DBL:是yolov3中的基本组件;就是卷积+BN+Leaky relu;对于v3来说,BN和leaky relu已经是和卷积层不可分离的部分了(最后一层卷积除外),共同构成了最小组件。
resn:其中n代表数字;表示res_block中含有多少个res_unit;这是yolo_v3的大组件,yolo_v3开始借鉴了ResNet的残差结构,使用这种结构可以让网络结构更深而不出现退化现象(从v2的darknet-19上升到v3的darknet-53,前者没有残差结构)。对于res_block的解释,可以在图1的右下角直观看到,其基本组件也是DBL。
concat:张量拼接。将darknet中间层和后面的某一层的上采样进行拼接。拼接的操作和残差层相加(add)加的操作是不一样的,拼接会扩充张量的维度,而add只是直接相加不会导致张量维度的改变。

在V3的结构中,池化和全连接两层均没有,向前传播的过程中张量(选定区域的图像)的尺寸变化是通过改变卷积核的步长进而得以实现;例如stride=(2,2),就将图像缩小为原来的1/4(长宽各减半)。V3和V2都会将输出的特征图缩小为输入的1/32;所以一般要求输入图片是32的倍数。贴一张图一边理解步长:
基于TensorFlow+YOLOV3的目标识别研究与实现
上图中,输入的原图为cc=77;步长stride=(1,1),即每次水平和垂直方向上都位移一个单位;阴影部分为kk=33的卷积核;最后形成55的输出图,输出图像的维度为:(c-k)/步长+1。注:水平和垂直步长必须一致,计算时随便取一个就行,不要考虑其他情况,先会走再慢慢跑。
y1,y2和y3的深度都是255,边长的规律是13:26:52。
对于COCO类别而言,有80个种类,所以每个box应该对每个种类都输出一个概率。
yolo v3设定的是每个网格单元预测3个box,所以每个box需要有(x, y, w, h, confidence)五个基本参数,然后还要有80个类别的概率。所以3
(5 + 80) = 255。这个255就是这么来的。其中x,y表示以图片左上角为基准点目标的中心;w,h表示预测框的宽和高;confidence表示这个框的置信度。如下图:
基于TensorFlow+YOLOV3的目标识别研究与实现
非极大值抑制:在进行目标的识别的时候,难免会有几个网格负责检测同一个物体的存在,这样就会出现很多的预测框预测同一个物体,因为我们只需要一个,所以这就必须抛弃掉一些不必要的预测框,最后得到概率最大的框,既是我们最后得到的包围框;说白了就是选一个最准确的框。
步骤:(1)去掉没有重叠度(IOU)没有达到阀值的边框
(2)while(剩下的预测框)
b.选择概率最大的边框,输出为预测结果      
c.剩下边框中如果和输出边框有很大的交并(IOU),则它
们的输出被抑制。
注意:如果有多个目标则需要对各个目标各进行非极大值抑制。

YOLOV3目标识别的简要步骤
步骤1:输入图像,通过parser.add_argument()将之设置成为416416的图像(也可是320320、448*448必须是32的倍数,在步长处有这样设置的原因)
步骤2:确定物体中心的网格
步骤3:做非极大值抑制得到最后的预测框和概率
步骤4:最后就是我们看到的预测结果了
以上预测步骤只是宏观上的流程,因为是对目标的识别就没有讲述对数据模型的训练。关于这一点可以参考手写数字的训练(mnist数据集,网上教程比较多且齐全),YOLO的图像的数据集有些庞大,我的电脑是装双系统(mac+window8.1),我是用window装tensorflow-cpu版,跑手写数字就死了好几次,成功的一次还跑了老久,所以不建议自己训练YOLOV3的权重文件,可以直接下载用就行;
权重下载:https:// pjreddie.com/media/files/yolov3.weights
关于代码的具体实现分析在论文完成后会补上(也可能边写论文边补,看时间再定吧!)

主要参考博文
https://blog.csdn.net/leviopku/article/details/82660381
https://www.cnblogs.com/-1024/p/8908771.html