本文参考博客如下:
yolo代码分析
You Only Look Once: Unified, Real-Time Object Detection
晓雷机器学习笔记-图解YOLO
视觉随笔-YOLO详解-赵丽丽
R-CNN 利用selective search 提出的 region proposals 结合卷积神经网络,通过R-CNN、SPP-net、Fast R-CNN、Faster R-CNN等方法 证明了“Proposal +classification”方法在目标检测上的有效性。
而本文提出了另一种思路,将Object Detection的问题转化为一个Regression问题。
即给定输入图像,直接在图像的读哟个位置上回归标出目标bounding box 以及其分类类别。
YOLO特点: 1、速度快,在Titan X的GPU上能达到45帧每秒;
2、使用全图作为Context信息,背景错误(将背景错认为物体的情况)比较小;
3、范化能力强。在自然图像上训练好的结果,在艺术作品中依旧有很好的效果。
网络结构
此网络借鉴了GoogleNet ,共有24个卷积层,2个全连接层。
(用1×1 reduction layers 紧跟 3×3 convolutional layers 取代Goolenet的 inception modules )
上图是 fast 版本的yolo ,只有9个卷积层,其他结构与原YOLO基本一致。
yolo大致流程
输入原图,将原图Resize 成 448 *448,图片分割成 7*7网格(cell)
如果某个object的中心落坐在网格中,泽这个网格负责预测这个object。CNN 特征提取和预测: 卷积层部分负责提特征,全连接层负责预
a)7*7*2 =98个 bounding box(bbox)坐标x,y,w,h和是否有物体的confidence
每个网格都要预测 B个bounding box,每个bounding box 除了要回归自身的位置(x,y,w,h)还要附带一个confidence值;
confidence代表了所预测box中含有object的置信度和这个box预测的有多准两重信息。
(如果object落在一个gird cell里 第一项设为1,反之则为0;第二项是预测的bounding box 和实际的groundingtruth之间的 IoU值)
b)7*7 =49个cell 所属20个物体的概率;
yolo 7*7的切割是在代码里面看不出来的,yolo是直接使用整张图片的特征进行回归,这里以7*7 b=2,class=20来说,后面全连接直接回归1470个值,1470是按照yolo自己定义的方式表示具体的含义 。这个1470是怎么算出来的呢?
而每个bounding box 都要预测5个值(x,y,w,h)和confidence;每个网络还要预测一个类别信息;
则S*S 个网格要预测B个bounding box 还要预测 C个categories。
每张图片最后预测出来的结果维度为:S*S*(B*5+C)=1470;- 过滤bbox (通过nms)
每个网格预测的class信息和bounding box预测的confidence信息相乘,就得到每个bounding box的class-specific confidence score:
得到每个box的class-specific confidence score以后,设置阈值,滤掉得分低的boxes,对保留的boxes进行NMS处理,就得到最终的检测结果。
LOSS函数设计
设计的目的:让坐标(x,y,w,h),confidence ,classification 这三方面达到很好的平衡;
在训练过程中,8维的localization error 和20维的 classification error,显然不能同等的重要;
另外如果一个网格中没有object,那么就会将这些网格中的box的confidence 设置为0,而因为这样的空网格是大量存在的,相较于少数有object的网格,这种做法是overpowering的,这样会导致网络不稳定甚至发散。
所以我们不能简单的全部采用sum-squared error loss
所以采取如下措施:
步骤一(蓝色):更重视8维的坐标预测,给这些损失前面赋予更大的loss weight(论文中取 5)。
步骤二(红色):有object 的bbox的loss 取1;
步骤三(橙色):对没有object的bbox的confidence loss,赋予小的loss weight(论文中取 0.5)。
步骤四(紫色):类别classification的loss 取1;
注1:对于大小不同的bbox预测,小的box更不能忍受预测的偏差。所以作者采用了一个比较取巧的方法,将box的width和height 分别取平方根代替原本的width和height。如下图所示,small bbox 的横坐标小,发生偏移时,反映到y轴上的loss 比big box大
注2:一个网格预测多个bounding box,在训练时我们希望每个object(ground true box)只有一个bounding box专门负责(一个object 一个bbox)。具体做法是与ground true box(object)的IOU最大的bounding box 负责该ground true box(object)的预测。这种做法称作bounding box predictor的specialization(专职化)。每个预测器会对特定(sizes,aspect ratio or classed of object)的ground true box预测的越来越好。(个人理解:IOU最大者偏移会更少一些,可以更快速的学习到正确位置)
YOLO的缺点
精确度差 YOLO对相互靠的很近的物体,还有很小的群体 检测效果不好,这是因为一个网格中只预测了两个框,并且只属于一类。
泛化能力弱 对测试图像中,同一类物体出现的新的不常见的长宽比和其他情况是。。
//YOLO方法模型训练依赖于物体识别标注数据,因此,对于非常规的物体形状或比例,YOLO的检测效果并不理想。损失函数问题没有根本解决。由于损失函数的问题,定位误差是影响检测效果的主要原因。尤其是大小物体的处理上,还有待加强。
//大物体IOU误差和小物体IOU误差对网络训练中loss贡献值接近(虽然采用求平方根方式,但没有根本解决问题)