You Only Look Once,YOLO.
YOLO 的核心思想:利用整张图作为网络的输入,直接在输出层回归 bounding box(边界框) 的位置及其所属的类别。
yolo虽然有三个版本,由于yolo v3在性能和准确性基本上秒杀前两个版本,甚至官网都没有给出下载老版本的链接。因此,我们仅需读懂yolo v3模型结构即可。
细节:
- 卷积的本质是提取图片的特征,分类是其他层做的事情。
- 通过划分单元格做检测。
- 多尺度训练。
- 端到端训练,只使用一个loss funtion。即只关注输入和输出
- 使用激活函数:“leaky ReLU”。
- 使用batch normalization作为正则化、加速收敛和避免过拟合的方法。后文简写为BN。
- 新的基本单元DarknetConv2D_BN_Leaky,即卷积+BN+leaky ReLU(激活函数)。
- 残差单元resblock=DarknetConv2D_BN_Leaky+...+DarknetConv2D_BN_Leaky +add
- 残差单元体resblock_body。zeropadding+DarknetConv2D_BN_Leaky+resblock。
- anchors的9个参数是用聚类方式获得,格式为w_1,h_1,w_2,h_2,...w_9,h_9。
- 结构中没有池化和全连接层,使用步长为2的卷积达到图片缩小的目的。
- 输入图片尺寸固定416*416。
- 主干网络是darknet-53,共252层。
结构:
- 如下图所示,输入416*416图片。经过尺寸为3*3的32个卷积DarknetConv2D_BN_Leaky层。
- 依次经过重复单元依次为1、2、8、8、4的5个残差体(resblock_body)。
- 残差体中DarknetConv2D_BN_Leaky单元的步长为2。
- 经过残差体的2次步长为2的卷积,图片尺寸缩小为以前的1/32。
- 生成y1、y2、y3三个结果。
- 输出尺寸分别为13*13*255、26*26*255、52*52*255。
- 输出深度为255=3*(5+80),每个单元3个box,box有(x, y, w, h, confidence)五个基本参数,coco数据集的种类是80.
- 中间层和后面的某一层的上采样进行拼接。拼接的操作和残差层add的操作是不一样的,拼接会扩充张量的维度,而add只是直接相加不会导致张量维度的改变。
实现:
darknet官网
pjreddie.com/darknet/
keras实现yolo3
github.com/qqwweee/keras-yolo3
tensorflow实现yolo3
github.com/wizyoung/YOLOv3_TensorFlow
You Only Live Once.