yolov3详解

前言

使用yolo v3有一段时间了,从最开始简单的工程使用,到后来代码和论文更深的理解,现在做个总结与回顾

bouding box 回归

和v2基本没有区别,依旧使用维度聚类v2使用sigmoid函数使得偏移值限制在这个范围内,网络每个预测框依旧预测出5个值 t x , t y , t w , t h , t o t_x,t_y,t_w,t_h,t_o tx,ty,tw,th,to,单元格左上角坐标为 ( c x , c y ) (c_x,c_y) (cx,cy), ( p w , p h ) (p_w,p_h) pwph是anchor的宽和高,那么预测对应于

具体可看下图

PS:这里有一个问题,不管FasterRCNN还是YOLO,都不是直接回归bounding box的长宽(就像这样: b w = p w t ′ w b_w=p_wt′_w bw=pwtw),而是要做一个对数变换,实际预测的是log(⋅)。这里小小解释一下。

这是因为如果不做变换,直接预测相对形变t′w,那么要求 t ′ w t′_w tw>0,因为你的框框的长宽不可能是负数。这样,是在做一个有不等式条件约束的优化问题,没法直接用SGD来做。所以先取一个对数变换,将其不等式约束去掉,就可以了。

另外,YOLO会对每个bounding box给出是否是object的置信度预测,用来区分objects和背景。这个值使用logistic回归。当某个bounding box与ground truth的IoU大于其他所有bounding box时,target给1;如果某个bounding box不是IoU最大的那个,但是IoU也大于了某个阈值(我们取0.5),那么我们忽略它(既不惩罚,也不奖励),这个做法是从Faster RCNN借鉴的。我们对每个ground truth只分配一个最好的bounding box与其对应。如果某个bounding box没有倍assign到任何一个ground truth对应,那么它对边框位置大小的回归和class的预测没有贡献,我们只惩罚它的objectness,即试图减小其confidence。

这里当时一直没有看懂,知道把yolov3的代码看懂了才有了一定理解,我们那keras-yolov3那版代码举例,来看下他的置信度损失这一部分

ignore_mask = tf.TensorArray(K.dtype(y_true[0]), size=1, dynamic_size=True)
object_mask_bool = K.cast(object_mask, 'bool')
def loop_body(b, ignore_mask):
    true_box = tf.boolean_mask(y_true[l][b,...,0:4], object_mask_bool[b,...,0])
    iou = box_iou(pred_box[b], true_box)
    best_iou = K.max(iou, axis=-1)
    ignore_mask = ignore_mask.write(b, K.cast(best_iou<ignore_thresh, K.dtype(true_box)))
    return b+1, ignore_mask
_, ignore_mask = K.control_flow_ops.while_loop(lambda b,*args: b<m, loop_body, [0, ignore_mask])
confidence_loss = object_mask * K.binary_crossentropy(object_mask, raw_pred[...,4:5], from_logits=True)+ \
            (1-object_mask) * K.binary_crossentropy(object_mask, raw_pred[...,4:5], from_logits=True) * ignore_mask

前半部分就是预测目标的所有anchor损失:其中object_mask就是ground truth与anchor匹配时的那个bool值,只有与ground truth有着最大iou的那个anchor target才会给1
后半部分是预测背景的anchor损失:其含义为,其不负责预测目标的anchor(1-object_mask可对应),如果其anchor生成的prediction box与GT大于我们设置的阈值,但并不是最好的,我们忽略它,如果prediction box与所有GT iou都小于阈值(对应我们的ignore_mask)则惩罚其confidence

Darknet 53 架构

yolo v3的backbone引入了残差结构,所以现在网络可以变得很深。整个v3结构里面,是没有池化层和全连接层的。前向传播过程中,张量的尺寸变换是通过改变卷积核的步长来实现的,比如stride=(2, 2),这就等于将图像边长缩小了一半(即面积缩小到原来的1/4)。yolo_v3也和v2一样,backbone都会将输出特征图缩小到输入的1/32。所以,通常都要求输入图片是32的倍数。
在这里插入图片描述

多尺度预测

在这里插入图片描述
参考FPN,可以看到最后v3输出3中不同尺度的张量,每个单元格预测3个pred box,每个box预测一组box信息(x,y,w,h)和一组类别概率(coco是80类),所以是3*(5+80)=255

参考文献

  1. https://xmfbit.github.io/2018/04/01/paper-yolov3/
  2. https://blog.csdn.net/leviopku/article/details/82660381
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值