yolov3

输入输出

  • 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
    • predict_out: 主要结构是1*1, 3*3卷积操作, 两次上采样, 最后形成3个不同尺度的grid输出

在这里插入图片描述

Darknet
resBlock
 
Conv2d_BN_Leaky_noBias
loop n times
resBlock_1
filters=64, n_times=1
Layer 4=>14
Conv2d_BN_Leaky_noBias
filters=32, kernal=3*3
Layer 0=>3
resBlock_2
filters=128, n_times=2
Layer 15=>32
resBlock_3
filters=256, n_times=8
Layer 33=>92
resBlock_4
filters=512, n_times=8
Layer 93=>152
resBlock_5
filters=1024, n_times=4
Layer 153=>184
output
Conv2d_BN_Leaky_noBias
Padding
下采样
filters kernal=3*3 stride=2
X
output
Conv2d_BN_Leaky_noBias
filters//2 kernal=1*1
Conv2d_BN_Leaky_noBias
filters kernal=3*3
Add
BatchNormalization
Conv2d
use_bias=False
LeakyReLu
 
YOLOV3
predict_grid_output
 
predict_out
last_layers
Conv2d_BN_Leaky_noBias_结构
output
output
上采样
Darknet.resBlock_4
output
上采样
Darknet.resBlock_3
predict_grid_output
grid_1
13 * 13
predict_grid_output
grid_2
26 * 26
predict_grid_output
grid_3
52 * 52
Darknet
image
416*416
predict_out
filters=512
predict_out
filters=256
predict_out
filters=128
Conv2d
filters = output_dim, kernal=1*1
grid_ output
filters*2 kernal=3*3
Add
input_from_Darknet
UpSampling2D
上采样
output
filter//2 kernal=1*1
filters kernal=1*1
X
filters*2 kernal=3*3
filters kernal=1*1
filters *2 kernal=3*3
filters kernal=1*1

对象检测算法中, 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=wanchoretw(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=hanchoreth(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损失).

  1. 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(cpredctrue)scale(5)

c p r e d c_{pred} cpred 表示object在grid上的中心点坐标, scale是比例因子, object面积越大, scale越小

  1. 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(tpredttrue)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

  1. 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(confpredconftrue)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是比例因子.

  1. 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=objectsoftmax_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

reference

Keras代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值