参考多篇博文,方便自己查阅。
Yolo算法不再是窗口滑动了,而是直接将原始图片分割成互不重合的小方块,然后通过卷积最后生产这样大小的特征图,基于上面的分析,可以认为特征图的每个元素也是对应原始图片的一个小
方块,然后用每个元素来可以预测那些中心点在该小方格内的目标,这就是Yolo算法的朴素思想,
最新的YOLOv3算法再以往的结构上做出了改进,增加了多尺度检测,以及更深的网络结构darknet53,这是比较主要的改进,还有某些细节上的变动.
1.yolov1基本内容
(1)网络结构
网络结构借鉴了 GoogLeNet ,24个卷积层,2个全链接层。(用1×1 reduction layers 紧跟 3×3 convolutional layers 取代Goolenet的 inception modules )
(2)主要实现思路
-
将一幅图像分成SxS个网格(grid cell),如果某个object的中心 落在这个网格中,则这个网格就负责预测这个object。
-
每个网格要预测B个bounding box,每个bounding box除了要回归自身的位置(x, y, w, h)之外,还要附带预测一个confidence值和一组类别信息。 这个confidence代表了所预测的box中含有object的置信度和这个box预测的有多准两重信息,其值是这样计算的:
其中如果有object落在一个grid cell里,第一项取1,否则取0。 第二项是预测的bounding box和实际的groundtruth之间的IoU值。
-
网络最终输出的特征向量公式:如果是图像分为SxS个网格,每个网格要预测B个bounding box还要预测C个categories,输出就是S x S x (5*B+C)的一个tensor。 注意:每个网格预测一组类别信息,而不是每个bounding box预测一组类别信息。
-
在test的时候,每个网格预测的class信息和bounding box预测的confidence信息相乘,就得到每个bounding box的class-specific confidence score:
等式左边第一项就是每个网格预测的类别信息,第二三项就是每个bounding box预测的confidence。这个乘积即encode了预测的box属于某一类的概率,也有该box准确度的信息。
-
得到每个box的class-specific confidence score以后,设置阈值,滤掉得分低的boxes,对保留的boxes进行NMS处理,就得到最终的检测结果。
c. 主要改进点:
-
对不同大小的box预测中,相比于大box预测偏一点,小box预测偏一点肯定更不能被忍受的。而sum-square error loss中对同样的偏移loss是一样。 为了缓和这个问题,作者用了一个比较取巧的办法,就是将box的width和height取平方根代替原本的height和width。这个参考下面的图很容易理解,小box的横轴值较小,发生偏移时,反应到y轴上相比大box要大。
-
使用**函数使用leak RELU
-
端到端的设计
-
(3)缺点
-
YOLO对相互靠的很近的物体,还有很小的群体 检测效果不好,这是因为一个网格中只预测了两个框,并且只属于一类。
-
对测试图像中,同一类物体出现的新的不常见的长宽比和其他情况是。泛化能力偏弱。
-
由于损失函数的问题,定位误差是影响检测效果的主要原因。尤其是大小物体的处理上,还有待加强。
(4)简单总结yolov1
yolov1的检测过程可以简单总结为一副图像划分为sxs个格子。每个格子预测n个预设框的位置和confidence,同时每个格子预测C个类别结果,网络输出sxsxn个框的位置,如何获取物体位置呢,最后用nms方法,挑选出最合适的框位置。
这里介绍一下非极大值抑制算法(non maximum suppression, NMS),这个算法不单单是针对Yolo算法的,而是所有的检测算法中都会用到。NMS算法主要解决的是一个目标被多次检测的问题,如图11中人脸检测,可以看到人脸被多次检测,但是其实我们希望最后仅仅输出其中一个最好的预测框,比如对于美女,只想要红色那个检测结果。那么可以采用NMS算法来实现这样的效果:首先从所有的检测框中找到置信度最大的那个框,然后挨个计算其与剩余框的IOU,如果其值大于一定阈值(重合度过高),那么就将该框剔除;然后对剩余的检测框重复上述过程,直到处理完所有的检测框。Yolo预测过程也需要用到NMS算法。
2. yolov3
(1) 网络结构
程序员网络结果图
(2)主要改进
-
使用darknet-53作为backbone提取图像特征
-
引入多尺度,改善小物体的检测
-
logistic替代Softmax
other:
yolo模型的可视化工具:https://lutzroeder.github.io/netron/
参考blog:
https://blog.csdn.net/c20081052/article/details/80236015
https://blog.csdn.net/m0_37192554/article/details/81092514
https://blog.csdn.net/leviopku/article/details/82660381
https://www.cnblogs.com/ywheunji/p/10761239.html