输入输出
- image: 416 * 416
- output
- grid_1 (13 * 13 * 3 * (5 + nb_class))
- grid_2 (26 * 26 * 3 * (5 + nb_class))
- grid_3 (52 * 52 * 3 * (5 + nb_class))
grid_1 输出的是分辨率小, 目标对象很大的objects; 相对应 grid_3 输出是分辨率大, 目标对象小的objects;
grid_1为例, 有13 * 13 cells, 每个cell中有3个不同大小的anchor, 每个anchor可对应一个候选的object;
anchor中, 预测box的对应信息 t x , t y , t w , t h , s c o r e o b j e c t n e s s , p c l a s s 1 , p c l a s s 2 t_x, t_y, t_w, t_h,score_{objectness}, p_{class_1}, p_{class_2} tx,ty,tw,th,scoreobjectness,pclass1,pclass2, 详细参考预测部分
架构
- YOLOV3
- Darknet-53: yolov3的backbone, 总共有53层卷积操作, 代码中会加上BN层,Leaky_Relu层, padding层
- resBlock: 5个resBlock操作, 5次下采样, 每次下采样, 分辨率会降低1倍, 最终分辨率降低为原图的1/32倍
- Conv2d_BN_Leaky_noBias
- resBlock: 5个resBlock操作, 5次下采样, 每次下采样, 分辨率会降低1倍, 最终分辨率降低为原图的1/32倍
- predict_out: 主要结构是1*1, 3*3卷积操作, 两次上采样, 最后形成3个不同尺度的grid输出
- Darknet-53: yolov3的backbone, 总共有53层卷积操作, 代码中会加上BN层,Leaky_Relu层, padding层
对象检测算法中, YOLO是one-stage算法, 即同时预测bbox的位置信息和对bbox里的object分类.
预测
模型输出: o u t p u t = [ t x , t y , t w , t h , s c o r e o b j e c t n e s s , p c l a s s 1 , p c l a s s 2 , . . . . , p c l a s s n ] output=[t_x, t_y, t_w, t_h,score_{objectness}, p_{class_1}, p_{class_2}, ...., p_{class_n}] output=[tx,ty,tw,th,scoreobjectness,pclass1,pclass2,....,pclassn]
1. bbox的坐标和objectness_score
x c e n t e r = σ ( t x ) + c x (1) x_{center}=\sigma(t_x) + c_x\tag{1} xcenter=σ(tx)+cx(1) y c e n t e r = σ ( t y ) + c y (2) y_{center}=\sigma(t_y) + c_y\tag{2} ycenter=σ(ty)+cy(2) w o b j e c t = w a n c h o r ∗ e t w (3) w_{object}=w_{anchor} * e^{t_w}\tag{3} wobject=wanchor∗etw(3) h o b j e c t = h a n c h o r ∗ e t h (4) h_{object}=h_{anchor} * e^{t_h}\tag{4} hobject=hanchor∗eth(4)
公式(1)(2)的中心点坐标是相对于grid的, 不是原image;
公式(3)(4)中anchor的width和height被称为bbox的先验;
所以yolo直接预测的是bbox的中心点坐标 [ − ∞ , + ∞ ] [-\infty, +\infty] [−∞,+∞], 然后sigmoid函数压缩到(0, 1), 表示相对grid中cell左上角的偏移, 公式(1)中 c x , c y c_x, c_y cx,cy代表grid中, cell的坐标;对于宽和高, yolo直接预测的是bbox相对于anchor的对应边的比值然后在取对数, 印象中yolo9000论文里提到这么做是为了好训练?
论文中提到yolo预测objectness_score是通过逻辑回归(是sigmoid, 把值压缩到了[0, 1]?)
2. 类别预测
- softmax函数
3. 多scale预测
- 类似FPN网络, 指抽取feature在不同的下采样level上, 分辨率高的feature, 语义信息丰富, 粒度细;分辨率低的feature, 语义信息少, 粒度粗?
- 多scale抽特征, 在很多论文中都用了, yolo, fpn, maskrcnn, unet++
4. 特征抽取
- Darknet-53: Darknet是resnet与其他的混合版. 作者对比了Darknet-53 和resnet-101, resnet-152, 结论是Darknet-53 和resnet-152有similar performance, 而且Darknet-53比resnet-152快了2倍, 原因是resnet层数太多了, 不efficient
损失
四部分损失: [ l o s s x y + l o s s w h + l o s s o b j e c t n e s s + l o s s c l a s s ] [loss_{xy} + loss_{wh} + loss_{objectness} + loss_{class}] [lossxy+losswh+lossobjectness+lossclass]
计算损失的时候, grid predict的每一个cell中都会有一个预测box, 会为每一个预测bbox匹配最优的groud_truth(iou最大), 如果bbox中实际没有groud_truth, 就不会产生坐标, 宽高, 类别损失, 但可能会有objectness损失(如果预测box与真实box覆盖面积超过阈值的时候, 该cell中的预测box会有objectness损失).
-
l
o
s
s
x
y
loss_{xy}
lossxy 坐标损失:
∑ o b j e c t ( c p r e d − c t r u e ) ∗ s c a l e (5) \sum_{object}{(c_{pred} - c_{true}) * scale}\tag{5} object∑(cpred−ctrue)∗scale(5)
c p r e d c_{pred} cpred 表示object在grid上的中心点坐标, scale是比例因子, object面积越大, scale越小
- l o s s w h loss_{wh} losswh 宽高损失:
∑ o b j c e t ( t p r e d − t t r u e ) ∗ s c a l e (6) \sum_{objcet}{(t_{pred} - t_{true}) * scale}\tag{6} objcet∑(tpred−ttrue)∗scale(6)
t p r e d t_{pred} tpred 表示 t w , t h t_w, t_h tw,th即模型直接预测的值, scale同上
只有有object的grid有 l o s s x y loss_{xy} lossxy, l o s s w h loss_{wh} losswh
-
l
o
s
s
o
b
j
e
c
t
n
e
s
s
loss_{objectness}
lossobjectness 是否包含对象损失 :
∑ o b j e c t ( c o n f p r e d − c o n f t r u e ) ∗ s c a l e o b j + ∑ n o o b j ( i o u > 0.5 ) ∗ s c a l e n o o b j (7) \sum_{object}{(conf_{pred}-conf_{true}) * scale_{obj}} + \sum_{noobj}{(iou > 0.5) * scale_{noobj}}\tag{7} object∑(confpred−conftrue)∗scaleobj+noobj∑(iou>0.5)∗scalenoobj(7)
i o u > 0.5 iou > 0.5 iou>0.5 如上所述, 每一个预测的bbox与某个true_box覆盖率超过0.5, 虽然实际中该bbox中没有对象, 也产生损失;scale是比例因子.
-
l
o
s
s
c
l
a
s
s
loss_{class}
lossclass 类别损失 :
l o s s c l a s s = ∑ o b j e c t s o f t m a x _ c r o s s _ e n t r o p y (8) loss_{class} = \sum_{object}{softmax\_cross\_entropy}\tag{8} lossclass=object∑softmax_cross_entropy(8)
只有有object的grid有 l o s s c l a s s loss_{class} lossclass
评估
有objectness, 且classification正确的
recall_50 = iou>0.5; recall_75 = iou>0.75
anchor的作用
anchor 其实没什么作用?, 因为模型学习的是相对anchor width和height的比值; 模型认为细粒度的grid, 可以有比较多的objects存在, 粗粒度的grid, 相对允许的objects个数少一些;
实际训练标注样本
- 训练中添加没有object的图片, 应该是没用的, 因为不会产生loss