一、前言
基于上一篇的SSD对工件裂纹检测之后,又推出的准确率更高的模型yolov3。SSD虽然速度快,但是准确率实在不高,对非裂纹的区域容易错检。后面提出的RetinaNet和yolov3无论是在速度上还是准确率上都非常棒,准确率已经超过了Faster RCNN。在这里就以yolov3为准,进行裂纹的检测定位。
二、yolov3算法
yolov3是在yolov2和yolov1的基础上进行改进的,关于yolov2和yolov1算法请参考:
yolov1:
https://blog.csdn.net/hrsstudy/article/details/70305791
https://blog.csdn.net/zhangjunp3/article/details/80421814
yolov2:
https://blog.csdn.net/u014380165/article/details/77961414
其中yolov2是在yolov1的基础上进行改进的。
关于yolov3,写一下自己的理解。相比于yolov2,使用多尺度feature map上的特征进行预测,不再是单个feature map,使用DarkNet53而不是DarkNet19。
类别预测方面主要是将原来的单标签分类改进为多标签分类,因此网络结构上就将原来用于单标签多分类的softmax层换成用于多标签多分类的逻辑回归层。首先说明一下为什么要做这样的修改,原来分类网络中的softmax层都是假设一张图像或一个object只属于一个类别,但是在一些复杂场景下,一个object可能属于多个类,比如你的类别中有woman和person这两个类,那么如果一张图像中有一个woman,那么你检测的结果中类别标签就要同时有woman和person两个类,这就是多标签分类,需要用逻辑回归层来对每个类别做二分类。
逻辑回归层主要用到sigmoid函数,该函数可以将输入约束在0到1的范围内,因此当一张图像经过特征提取后的某一类输出经过sigmoid函数约束后如果大于0.5,就表示属于该类。
YOLO v3采用多个scale融合的方式做预测。原来的YOLO v2有一个层叫:passthrough layer,假设最后提取的feature map的size是 13 ∗ 13 13*13 13∗13,那么这个层的作用就是将前面一层的 26 ∗ 26 26*26 26∗26的feature map和本层的 13 ∗ 13 13*13 13∗13的feature map进行连接,有点像ResNet。当时这么操作也是为了加强YOLO算法对小目标检测的精确度。这个思想在YOLO v3中得到了进一步加强,在YOLO v3中采用类似FPN的upsample和融合做法(最后融合了3个scale,其他两个scale的大小分别是2626和5252),在多个scale的feature map上做检测,对于小目标的检测效果提升还是比较明显的。前面提到过在YOLO v3中每个grid cell预测3个bounding box,看起来比YOLO v2中每个grid cell预测5个bounding box要少,其实不是!因为YOLO v3采用了多个scale的特征融合,所以boundign box的数量要比之前多很多,以输入图像为 416 ∗ 416 416*416 416∗416为例: ( 13 ∗ 13 + 26 ∗ 26 + 52 ∗ 52 ) ∗ 3 (13*13+26*26+52*52)*3 (13∗13+26∗26+