过两天打算讲YOLO系列,现在这里挖个坑,关于这方面的详解其实网上挺多的,主要应该是看别人的博客吧,看完再回去看论文
YOLO v1:
什么都不说,先上网络结构
不得不吐槽这图有一半被挡住了但是是原论文就这样了,还是觉得Joseph太随意了
这个结构与rcnn系列的结构最大的不同就是end-to-end,而rcnn需要一个selective search,就算到了faster网络也是rpn和fast两个网络结合的,另外,YOLO将物体检测作为一个回归问题,一次forward得到物体的位置和其所属类别及相应的置信概率,rcnn系列两部分求解:物体类别(分类问题),物体位置的bounding box(回归问题)
看看网络都有什么值得注意的:
借鉴了GoogLeNet网络inception的一部分,使用了1x1卷积,减少了参数和特征图的数量,但是因为最后用了全连接,使得网络不能输入任意维度的图片。
另外还有一个fast的版本,只用了9个卷积层和2个全连接层,速度翻倍但是检测效果下降。
接下来讲最后预测部分的全连接层
输入图像分割成SxS个格子,物体中心的格子负责该物体的检测,即回归出B个(类别和boundingbox),类别有C类(如VOC有20类)boundingbox有5个值,相对偏移坐标x,y和长宽h,w最后还有confidence置信度。x,y根据与当前格子中心的相对位置进行偏移,h,w根据与全图的比例被缩放到[0,1],confidence算的是P(object) * IOU,P根据有无物体取0或1
因此网络的输出维度是 S*S*(B*5 + C)
每个格子能够出B个boundingbox,但是最后只保留置信度最大的那个,而格子数量有限,所以小物体或者是多个物体挤在一起这些情况不能搞定。
看Loss function
CoordError是预测结果和gt的均方,λ的出现时因为坐标和长宽对网络影响不同,长宽那里开了根号是因为不然框的大小对产生的loss有很大的影响,这不应该是这样的,所以开根号减小了误差,然而其实效果并不好,而且这样小物体的检测框产生的误差太小,于是做不好小物体检测
IOUError是对每个格子预测的confidence的loss,而加入权值是因为在不包含物体的格子里,confidence为0居多,而这样的格子又大于有包含物体的格子,因此对网络的影响会比有物体的格子大
ClassError是分类误差,全使用均方来计算因为这样容易优化
YOLO的训练是先把网络去掉尾巴在ImageNet上用224*224训练出一个分类网络,然后在VOC上加上最后的全连接,并且调整参数使得输入448*448的图像,这应该是当时算图像精度高的了
然后是他的结果
效果比不上rcnn系列但是他快啊,像起飞了
Error分析来看,背景的误检率低了不少,是因为网络感受的是整张图,而rcnn系列只能看到region proposal的东西,太局限了
缺点就是YOLO对于位置的检测效果偏差,而且召回率底,想想每个格子最多检测出一个物体,那还不是漏掉一大堆。
因此,为了改进他,作者又提出了YOLO v2和顺带的YOLO9000:
YOLO v2就是一些trick的大集合,把主流的各大结构都借来用了(除了OHEM),上个图感受下
BN。。。就不讲了,什么?大清亡了?
High Resolution Classifier
就是把网络在ImageNet预训练和正式训练的输入维度都提高了,改到448*448
Fully Convolutional
终于进入全卷积的时代了,推翻全连接层,网络能接受各种尺寸(??尺度)的输入了
New Network
换了一个网络,叫暗网的(darknet)
和VGG16模型设计理念相似,主要采用3*3卷积,采用2*2的maxpooling层之后,特征图维度降低2倍,而同时将特征图的channles增加两倍,另外也用了1x1的卷积减少计算量,最后比VGG少了一大截的计算量(懒得算)
pass-through
一个很异于常人的Fine-Grain方法,在YOLOv3改邪归正掉了,具体做法是在最后一次maxpooling之后,把上一层的特征图水平垂直隔行采样,变成4个新的特征图concate在当前层,形象点就是横切竖切:
Multi-Scale Training
也是个小trick来的,训练时,每10个batches就随机从{320;352;::;608}中选择一个尺寸。这样能适应更多尺度的输入
接下来是重头戏
Anchor Boxes
听名字都知道是从Faster-RCNN借鉴来的
首先用了416*416的网络输入(416是个好东西),最后特征图那里得到的是13*13,奇数方便有一个中心格子来预测,每个格子提出9个proposal一共就有13 * 13 * 9 = 1521个boxes,而之前版本只有7*7*2 = 98个,因此能找到更多的object了,召回率也上升了,然而准确率又稍有下降,没关系
Dimension Clusters
Faster-rcnn的anchor是预先设定的,这里用K-means把数据集的boundingbox做了统计,最后取了前五个作为anchor
这样做了之后,五个框的效果比肩Faster的9框
Direct location prediction
另一个问题是模型在训练的时候不稳定,尤其是在训练刚开始的时候,作者认为是在预测位置的时候出现的,回顾下YOLO对位置的预测
中心坐标加上偏移量,偏移量的参数w,在模型开始时期不稳定,可能造成偏移量很大,检测到别的object上面去了
于是做出以下改动
Loss函数
没有在论文里看到任何关于Loss函数的介绍,有代码可能可以参考一下,不写了没时间了
结果反正也是很好的
YOLO9000不写了没时间了
然后是YOLOv3,文章写得很欢,但是仔细看下来没有很多惊艳的方法,倒是显得中规中矩,然而人家结果好啊
先看网络,还是darknet
这次学着跟别人一样加深网络,有53层所以叫Darknet-53,然后由于觉得上一代的小尺度物体的检测还是没做好,于是认认真真地加上了常见的取多层特征,倒数三层出来的特征图,各做一次卷积然后去predict,每个格predict三个框,三层就是9个
另外在boundingbox的loss设计上增加了点小改动,如果一个boundingbox与gt重合度很大而且比同个格子内的其他boundingbox都要好的话,confidence直接设为1,这是使网络更倾向于效果好的boundingbox,而当某个boundingbox的confidence在某个阈值(0.5)之下时,该box被忽略,也不产生任何loss
还有softmax也被改成了independent logistic classifier ,虽然对这个了解不多,论文里也没多说理由,只是说没必要用到softmax,可能是为了做多标签分类,而loss函数也换成了二值交叉熵,没记错的话这个好像是sigmod专用的
然后结果,他借了别人的图以示嘲讽
用时完爆,好到爆表,真的爆表了
现在的表现是对小物体更加鲁棒了,然而反而reveal了网络对中型大型物体的效果差点了 有待改进
所以说YOLO v3只是个tech report嘛
inception也发展了好几个系列了,放一起写好了
https://blog.csdn.net/qq_14845119/article/details/73648100
https://blog.csdn.net/yuanchheneducn/article/details/53045551
还没写完,之后再贴上reference网址好了
reference:
https://zhuanlan.zhihu.com/p/25236464
https://blog.csdn.net/jesse_mx/article/details/53925356