【深度学习】目标检测之YOLOv3算法

YOLO系列目标检测算法官方代码

https://pjreddie.com/darknet/yolo/

YOLOv3

网络结构

Darknet-53:
共有53个卷积层进行32倍下采样
在这里插入图片描述
Darknet-53为了加深网络,也采取的类似ResNet的跳接结构,但和ResNet的残差块结构不同:

  • ResNet的下采样过程,在与上一个卷积组邻接的残差块中实现【深度学习】ResNet系列网络结构
  • Darknet-53的下采样过程,是在Residual跳接之前,用一个单独的卷积层实现的

在这里插入图片描述
Darknet-53中所有的Residual都是如上图所示的结构

YOLOv3保留Darknet-53标准结构Avgpool以上的部分(不包括Avgpool)。在此基础上和SSD一样,在三个不同size的Feature Map上接Detection Head。此外,仿照FPN,较深层的Detection Head的Feature Map经过上采样,和较浅层的Detection Head的Feature Map按channel方向进行拼接

YOLOv3网络结构如下:
在这里插入图片描述

anchor的编解码

YOLOv3的编解码和YOLOv2的编解码方式相同:

先验

  • 每个Detection Head的最后一个卷积层的输入Feature Map(也就是使用anchor的Feature Map)的每一个cell的左上角点座标cxc_xcyc_ycxcy=0,1,2,...c_x、c_y=0,1,2,...
  • anchor的width和height,pxp_xphp_h。注意,YOLOv3中的anchor和YOLOv2、SSD中的anchor都不相同。
    SSD中的anchor,width和height是相对于原图像的size进行归一化后的值,其值范围在0011之间;
    YOLOv2中的anchor,width和height是以使用anchor的Feature Map的width和heigth为基准的绝对的值,其值范围在00FeaturnMapwidthheightFeaturn Map的width(height)之间;
    YOLOv3中的anchor,width和height是以初始输入图像(第一个卷积层的输入tensor)的witdh和height为基准的绝对的值,其值范围在00widthheight初始输入图像的width(height)之间。(YOLOv3的anchor的值,除以各自所在的Feature Map的下采样倍数,就和YOLOv2的anchor的值定义相同了)

YOLOv3通过COCO数据集的ground truth box的大小,聚类得到9个anchor的值。每个Detection Head使用其中的三个。具体值如下:

最浅的Detection Head:

(10,13), (16,30), (33,23),

中间的Detection Head:

(30,61), (62,45), (59,119),

最深的Detection Head:

(116,90), (156,198), (373,326)

输出
和YOLOv2相同,YOLOv3每个cell生成三个anchor(YOLOv2是五个),每个anchor对应自己的输出:4(center_x, center_y, width, height) + 1(置信度) + num_classes(和SSD不同,这个num_classes不包括background,SSD就是通过增加一个background起到YOLO中置信度的作用)

center_x:txt_x
center_y:tyt_y
width:twt_w
height:tht_h
置信度:tot_o

编码方式
bx=Sigmoid(tx)+cxb_x=Sigmoid(t_x) + c_x
by=Sigmoid(ty)+cyb_y=Sigmoid(t_y)+c_y
bw=pxetwb_w=p_xe^{t_w}
bh=phethb_h=p_he^{t_h}
bo=Sigmoid(to)b_o=Sigmoid(t_o)

label
gxg_xgyg_ygwg_wghg_h:原始图像上的ground truth box的中心点座标、width以及height归一化后的值(注意计算loss时,gxg_xgyg_y要乘预测所使用的Feature Map的width、height;gwg_wghg_h要乘初始输入图像的width、height)

置信度label:计算方式和YOLOv2相同。【深度学习】目标检测之YOLOv2算法&6D姿态估计之YOLO-6D算法

损失函数

和YOLOv2相同,计算损失函数前,要先确定哪个anchor负责哪个落入cell中的object的预测,确定方法与YOLOv2相同。【深度学习】目标检测之YOLOv2算法&6D姿态估计之YOLO-6D算法

损失函数计算:

  • 第一项:所有负责预测目标的anchor的座标损失(bxbybwbhb_x、b_y、b_w、b_h​)。label是gxgygwghg_x​、g_y​、g_w​、g_h​(注意计算loss时,gxg_xgyg_y要乘预测所使用的Feature Map的width、height;gwg_wghg_h要乘初始输入图像的width、height)。使用均方损失函数。衡量目标定位准确度。前面的系数设置为1
  • 第二项:不负责预测目标的anchor的座标损失(bxbybwbhb_x、b_y、b_w、b_h​)。label是cell的左上点xx、cell的左上点yy、anchor的widthwidth、anchor的heigthheigth。因为这样的label对应的实际输出是零。使用均方损失函数。前面的系数设置为1
  • 第三项:负责预测目标的anchor的confidence损失bob_o。label是Pr(object)IOU(b,object)Pr(object)∗IOU(b,object)使用binary cross-entropy loss(不使用Softmax)。衡量可能有目标的准确度。前面的系数设置为5
  • 第四项:不负责预测目标的anchor的confidece损失bob_o。计算Pr(object)IOU(b,object)Pr(object)∗IOU(b,object)如果计算结果小于0.5,label是零。使用binary cross-entropy loss(不使用Softmax)。前面的系数设置为1
  • 第五项:负责预测目标的anchor的类别损失使用binary cross-entropy loss(不使用Softmax)(在这里相当于多个独立的逻辑分类器,这样的多标签方法有助于对训练数据更好的建模)

binary cross-entropy loss

二分类的交叉熵损失函数:
对于一个样本:Hy/(p(y))=[y/log(p(y))+(1y/)log(1p(y))]H_{y^/}(p(y)) =-[y^/*log(p(y))+(1-y^/)log(1-p(y))]
其中,y/y^/是label信息,positive是1,negative是0。p(y)p(y)是网络的输出,也就是结果是positive的概率

AP(Average Precision)的含义和计算方法

注意,多类别的目标检测任务中,AP是针对单独一类目标而言的

  • 正确率(Precision)
    (Precision)=TPTP+FP正确率(Precision) = \dfrac{TP}{TP + FP}
    判断为True的样本中,真实为True的比例

  • 真阳性率(True Positive Rate,TPR),灵敏度(Sensitivity),召回率(Recall)
    =TPTP+FN真阳性率 = \dfrac{TP}{TP + FN}
    真实为True的样本中,判断为True的比例

Precision和Recall用到目标检测领域,就是:
假设有一组图片,里面有若干待检测的目标,Precision就代表模型检测出来的目标有多大比例是真正的目标物体Recall就代表所有真实的目标有多大比例被模型检测出来了

以Recall为横轴,Precision为纵轴绘制的曲线,就是PR曲线

AP(Average Precision),就是对PR曲线的纵轴(Precision)的值取平均。所谓11point-AP,就是将R轴平分11个点,对应的P轴的值取平均。

mAP(mean Average Precision)的含义和计算方法

mAP是所有类别的AP值的均值

结语

如果您有修改意见或问题,欢迎留言或者通过邮箱和我联系。
手打很辛苦,如果我的文章对您有帮助,转载请注明出处。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章