一个版本的快速实现参考
blog
yolov1 loss 详细介绍
快速回忆可以参考
yolov1-yolov4纵向比较
YoloV1将原始图片Resize到448x448,经过网络多次conv和pooling,最终得到的特征7x7x30;
这7x7的特征,对应的是将原图划分为7x7的网格。YoloV1要求每一个网格负责输出2个预测目标框,这两个框有它们各自的位置信息x,y,w,h和置信度conf信息。
我们先计算每个GroundTruth (GT) 的中心点,确定GT的中心落在哪一个网格,那么这个GT box就由该网格负责预测(回归),网格的类就是GT的类,具体由网格中两个预测框中的哪一个预测框来回归GT box,由预测框和GT box之间的IOU决定,IoU更大的预测框负责回归该GT box。那么此时我们分配给预测框的标签是:
c o n f conf conf = P r ( O b j e c t ) P_r(Object) Pr(Object)* I O U p r e d t r u t h IOU^{truth}_{pred} IOUpredtruth
其中
在C>0的位置计算分类损失,在最大IoU的位置计算contain_loss和定位损失。较小IoU的位置计算not_contain_loss,在c<0的位置计算nooobj_loss,要给正样本的损失加一个大一点的权重。
YoloV1采用类和置信度分开预测的方法,由两者乘积决定预测框最终的置信度,送入NMS的就是这个最终置信度;而faster cnn是直接在类别预测中,包含了置信度预测。YoloV1对类别的预测是由网格来决定,进一步说,是由网格中置信度较大的那一个预测框来决定。另一个IoU较小的框不参与类的预测。这也是为什么特征图最终维度是7x7x( 2x(4+1) + 20) 而不是 7x7( 2x(4+1+20) ),也就是说如果多个物体出现在同一个网格内,那YoloV1只能负责预测其中的一个类概率最大的物体,这是一个比较大的缺点,导致了YoloV1的召回率低。
由于不同大小的边界框对预测偏差的敏感度不同,小的边界框对预测偏差的敏感度更大。为了均衡不同尺寸边界框对预测偏差的敏感度的差异。作者巧妙的对边界框的 w,h 取根号值再求 L2 loss. YOLO 中更重视坐标预测,赋予坐标损失更大的权重,记为 coord,在 pascal voc 训练中 coodd=5 ,classification error 部分的权重取 1。
某边界框的置信度定义为:某边界框的 confidence = 该边界框存在某类对象的概率 pr (object) 该边界框与该对象的 ground truth 的 IOU 值* ,若该边界框存在某个对象 pr (object)=1 ,否则 pr (object)=0 。由于一幅图中大部分网格中是没有物体的,这些网格中的边界框的 confidence 置为 0,相比于有物体的网格,这些不包含物体的网格更多,对梯度更新的贡献更大,会导致网络不稳定。为了平衡上述问题,**YOLO 损失函数中对没有物体的边界框的 confidence error 赋予较小的权重,记为 noobj,对有物体的边界框的 confidence error 赋予较大的权重。在 pascal VOC 训练中 noobj=0.5 ,**有物体的边界框的 confidence error 的权重设为 1.
YoloV1的缺点
相比较于faster rcnn这种根据海量anchor来预测偏移量的模型【学习的是平移和尺度变换的参数】,yolov1的目的是直接学习xywh的坐标,学习的难度比较大,召回率低。
YoloV2
网络改动,不用yolov1中类似googlenet的结构,改用了darknet19,用global average pooling取代了全连接层,一方面减少参数避免过拟合,另一方面使得输入不必固定size。darknet中大量使用1x1卷积来降低通道数,以降低模型计算量和参数数目。另外图像输入大小在yolov1中是224x224,而yolov2为了使用高分辨率,将输入从224变成448,而另一方面,为了使得输出的feature map是奇数[保证最终有一个中心位置,对预测物体有极大帮助],又将输入从448变成416,所以最终的feature map大小是416/32=13 x 13
上图提到了 t x , t y , t w , t h t_x,t_y,t_w,t_h tx,ty,tw,th,那么下图中代表了 t x , t y , t w , t h t_x,t_y,t_w,t_h tx,ty,tw,th到真正预测框的变换,这里 C x , C y C_x, C_y Cx,Cy是C点的坐标,C点是该grid左上角的坐标,
Anchor box:下图的黑色虚线框, p h p_h ph 和 p w p_w pw代表它的长宽。
BoundingBox:下图蓝色框, b h b_h bh和 b w b_w bw代表它的长宽。
下图中的σ定义为sigmoid激活函数,这里用sigmoid函数是为了让预测框的中心位置位于grid中,这种对偏移量的约束一定程度上保证了训练时间减少,加快收敛。
参考
yolov2 anchor+特征融合
faster rcnn+yolov1+yolov2
yolov4全面详解