论文复现相信很多人都做过了,虽然好像yolov3作者也没代码分享出来。我当时复现的yolov3,特征提取部分是darknet53的前52层,侦测层大家应该都类似,分3个尺度,与特征提取网络的输出有路由。关于yolov3,有个问题——感受野。这在论文中没怎么提到,在yolov1的论文中提到最后特征图的视野可以覆盖全图(有这个印象)。yolov1没有先验框 ,偏移是相对于原图的边界而言的。
yolov3 解决的问题 1多目标 2 多类别 3 同类不同尺寸目标
1多目标
经常在一些关于yolov3的文章中看到一张图片,原图被分为了很多个格子。但这里要说一句,这些 抽象出来的小格子并不是用来做边框回归的。个人认为这个框只是用来判断clf,即目标中心点有没有落在这个小格子里面。所以这里也很自然会有个想法,这些格子多大合适呢,它应该满足的设定是:只容得下一个目标的中点。所以在这个网络检测的时候,可以想象在每个这样的小格子上方都有一只眼睛, 重点来了,这只眼睛看到的范围很大,绝对比图上的那些小格子大多了。但首先,每只眼睛会在自己下方小格子的范围内先看看,物体的中点有没有落在这里面,然后在 感受野 范围内做边框回归。当然这只是为了说起来方便一些,事实上,光看那一个小格子,是不足以判断目标中心和小格子边界的关系的,clf 和 边框回归 应该也没有什么先后关系。眼睛 在自己感受野的范围内 做提取特征等一系列操作,这当中可能就先把目标边界 “看”出来了(没完全在感受野里的可能就“看”了一部分吧),中心点也 get 到了, 把中心点和小格子比一下,看看是归我这只眼睛管还是归其它眼睛管。yolov3里的边框回归也是,加先验框提升精度是自然的,但如果不用先验框呢,以什么为边界做偏移呢,原图行不行?这得看感受野是不是足够大了,毕竟卷积核参数共享。对同一个卷积核卷完了之后得到的下一级特征图上的每个1X1格子,他们知道自己的位置吗?这里边框回归用了先验框。再提一点, 网络设计那么深,除了提取更深层次的特征之外有没有可能也是为了获得足够大的感受野呢,毕竟yolov3里面没有池化,大步长卷积也很少。
2 多类别
标签,代价函数的事。
3同类不同尺寸目标
侦测网络3个尺度的特征图,且小尺度对应大目标,大尺度对应小目标。路由也是,较浅的网络层结果,感受野小,特征分辨率更高,这样的输出和后面大尺度的特征图一起做关于小目标的边框回归。小尺度就和较深的网络层输出(有更大感受野,特征分辨率较低)一起做大目标的边框回归。
第一次写,分享一下感受。可能写的随心所欲了点,错别字,语法可能也有问题。yolov3这个模型出来时间也挺长了,印象也有点模糊了,嘿嘿。希望各位有空路过的大佬如果不嫌弃我写的太乱的话,给点意见。