YOLO_v1和YOLO_v2比较
YOLO的误差主要分为三大部分:IOU损失、分类损失、坐标损失,IOU损失分为了no_objects_loss和objects_loss。
no_objects和objects的分辨:
objects:anchor_boxes与ground truth的IOU最大的框
no_objects:除去IOU最大的框都是
confidence_loss:
confidence:判断锚框内是否存在检测物体
YOLO_v1:只有一个anchor_box(缺点:只能检测一个单元格内包含一个目标的情况),将目标检测看成回归问题,采用均方差损失函数。
修正系数:no_objects_loss和objects_loss分别是0.5和1
YOLO_v2:总共有845个anchor_boxes,与true_boxes匹配的用于预测pred_boxes,未与true_boxes匹配的anchor_boxes用于预测background。
- objects_loss:与true_boxes所匹配的anchor_boxes去和预测的pred_boxes计算objects_loss。(预测前景)
- no_objects_loss:
- 未与true_boxes所匹配的anchor_boxes中,若与true_boxes的IOU>0.6,则无需计算loss。
- 未与true_boxes所匹配的anchor_boxes中,若与true_boxes的IOU<0.6,则计算no_objects_loss。(预测背景)
修正系数:no_objects_loss和objects_loss分别是1和5
classification_loss:
YOLO_v2和YOLO_v1基本一致,就是经过softmax()后,20维向量(数据集中分类种类为20种)的均方误差。
coordinates_loss:
YOLO_v1:
- 计算x,y的误差相对于整个图像(416x416)的offset坐标误差的均方
- 计算w,h的误差w,h平方根的差的均方误差
修正系数:5
YOLO_v2: - 计算x,y的误差相对于gird cell的offset(这个offset是取sigmoid函数得到的处于(0,1)的值)坐标误差的均方
- 计算w,h的误差w,h与对true_boxes匹配的anchor_boxes的长宽的比值取log函数
修正系数:1
def yolo_loss(args,
anchors,
num_classes,
rescore_confidence=False,
print_loss=False):
"""
参数
----------
yolo_output : 神经网络最后一层的输出,shape:[batch_size,13,13,125]
true_boxes : 实际框的位置和类别,我们的输入。三个维度:
第一个维度:图片张数
第二个维度:一张图片中有几个实际框
第三个维度: [x, y, w, h, class],x,y 是实际框的中心点坐标,w,h 是框的宽度和高度。x,y,w,h 均是除以图片分辨率得到的[0,1]范围的值。
detectors_mask : 取值是0或者1,这里的shape是[ batch_size,13,13,5,1],其值可参考函数preprocess_true_boxes()的输出,五个维度:
第一个维度:图片张数
第二个维度:true_boxes的中心位于第几行(y方向上属于第几个gird cell)
第三个维度:true_boxes的中心位于第几列(x方向上属于第几个gird cell)
第四个维度:哪个anchor box
第五个维度:0/1。1的就是用于预测改true boxes 的 anchor boxes
matching_true_boxes :这里的shape是[-1,13,13,5,5],其值可参考函数preprocess_true_boxes()的输出,五个维度:
第一个维度:图片张数
第二个维度:true_boxes的中心位于第几行(y方向上属于第几个gird cel)
第三个维度:true_boxes的中心位于第几列(x方向上属于第几个gird cel)
第四个维度:第几个anchor box
第五个维度:[x,y,w,h,class]。这里的x,y表示offset,是相当于gird cell的坐标,w,h是取了log函数的,class是属于第几类。
anchors : 实际anchor boxes 的值,论文中使用了五个。[w,h],都是相对于gird cell 长宽的比值。二个维度:
第一个维度:anchor boxes的数量,这里是5
第二个维度:[w,h],w,h,都是相对于gird cell 长宽的比值。
[1.08, 1.19], [3.42, 4.41], [6.63, 11.38], [9.42, 5.11], [16.62, 10.52]
num_classes :类别个数(有多少类)
rescore_confidence : bool值,False和True计算confidence_loss的objects_loss不同,后面代码可以看到。
print_loss : bool值,是否打印损失,包括总损失,IOU损失,分类损失,坐标损失
返回值
-------
total_loss : float,总损失
"""
(yolo_output, true_boxes, detectors_mask, matching_true_boxes) = args
num_anchors = len(anchors)
object_scale = 5 '物体位于gird cell时计算置信度的修正系数'
no_object_scale = 1 '物体位于gird cell时计算置信度的修正系数'
class_scale = 1 '计算分类损失的修正系数'
coordinates_scale = 1</

YOLO_v1和YOLO_v2在目标检测上存在显著区别。YOLO_v1使用单一anchor_box,将检测视为回归问题,而YOLO_v2引入多个anchor_boxes以提升检测效果。confidence_loss方面,YOLO_v2增强了对背景和前景的区分,调整了修正系数。classification_loss保持相似,但YOLO_v2增加了更多类别预测。coordinates_loss上,YOLO_v2改进了坐标计算方式,使用相对网格单元的偏移量和log尺度。这些改进提高了YOLO_v2的定位精度和检测效率。
最低0.47元/天 解锁文章
9万+

被折叠的 条评论
为什么被折叠?



