经过一段时间的代码解读和反复试验,加上与各位网友的交流,写下一点个人理解,希望对大家有所帮助。
yolo3算法属于one-stage算法,主要体现在,可以直接输出框和类型,这一点和faster-rcnn不一样。在faster-rcnn中,会先进行rpn网络进行proposal的提取,得到roi,随后再与特征图进行roi-pooling,得出结果。而yolo3直接由输入图片和kmean预先设定尺寸的锚框anchor进行预测,直接得出结果,不同于faster-rcnn的two-stage。
yolo3的算法主体框架是darknet53,在yolo2的darknet19上进行了改进,为了解决darknet53层数增加可能带来的梯度消失,借鉴了resnet的残差块,使用了short-cut,网络层数的增加提高了yolo的检测性能。同时,为了提高对小目标的召回率(recall),darknet53借鉴了类似fpn网络的上采样,将更上层的上采样信息与网络更浅层的特征信息进行concat,而不仅仅是采用最后一层的卷积结果进行预测。这就是yolo3的三种尺度。yolo3的三种大小的特征图分别为13×13,26×26,52×52,特征图越大代表着检测小物体的能力更强。
下图是yolo3的骨架网络示意:
对于416×416的输入来说,13×13的特征图代表着32个像素经过网络后变成1个像素,也代表着,特征图的1个像素意味着输入原图的32个像素点,这样也就不难理解,