YOLOv1的label和损失

YOLOv1中的要预测的值,即label

 

1.实际图片

通过卷积层提取特征,变为7*7的grid,每个cell都有单独的真值

confidence:如果目标的中心落在了该cell中,则该cell的confidence为1,否则为0。如果该cell的confidence为1,下面的坐标和class才有意义,否则下面的class都没有意义。

labels[0][:,:,0]

labels[0][:,:,1] labels[0][:,:,2] labels[0][:,:,3] labels[0][:,:,4] 用来预测目标的边界

labels[0][:,:,5:20]表示目标是哪一个类,是这个类则对应的值为1,其他类的都为0

类别:

CLASSES = ['aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus',
           'car', 'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse',
           'motorbike', 'person', 'pottedplant', 'sheep', 'sofa',
           'train', 'tvmonitor']
由于本图片是一个鸟,所以bird类别对应的为1,其他类别为0.
labels[0][:,:,7]

 

 

对于下一个目标:

labels[0][:,:,0]

labels[0][:,:,1] labels[0][:,:,2] labels[0][:,:,3] labels[0][:,:,4] 用来预测目标的边界

 

表征类别数的:

因为类别是狗,所以只有labels[0][:,:,16]。因为不含有其他的类别,所以其他的labels[0][:,:,x]都为0

 

 

YOLOv1 label中的x,y,w,h

输入图片分辨率为448*448,下采样64倍变为7*7的feature map

首先,我们通过标注时的左上角(170,10)、右下角(434,178)坐标计算中心点坐标(302,94),宽高(264,168).

然后,计算中心点在格点中的位置(302/64,94/64)为(4.71875,1.46875)。我们记录下格点的索引(4,1),然后将(0.71875和0.46875)作为预测目标,即label中的x,y。这就是我们要预测的目标

将宽高(264,168)归一化后(264//448,168/448),即(0.589,0.375),然后求平方根得到(0.767,0.612),这个就是预测目标,即label中的根号w,根号h.这就是我们要预测的目标

计算x,y,w,h中的程序为:

boxes_tran = tf.stack(
    [boxes[..., 0] * self.cell_size - x_offset,
     boxes[..., 1] * self.cell_size - y_offset,
     tf.sqrt(boxes[..., 2]),
     tf.sqrt(boxes[..., 3])], axis=-1)

其中boxes是中心点坐标(302,94),宽高(264,168)除以448后的值,x_offset,y_offset就是格点的索引.tf.sqrt就是求平方根,

boxes[..., 0] * self.cell_size=302/468 × 7=302/64

 

YOLOv1的损失计算:

 

损失函数的代码:

# 在训练时,如果该单元格内确实存在目标,那么只选择IOU最大的那个边界框来负责预测该目标,而其它边界框认为不存在目标
object_mask = tf.reduce_max(iou_predict_truth, 3, keep_dims=True)#类似于np.max
object_mask = tf.cast((iou_predict_truth >= object_mask), tf.float32) * response 

#object_mask 即上图中的

#计算

object_delta = object_mask * (predict_confidence - iou_predict_truth)
object_loss = tf.reduce_mean(tf.reduce_sum(tf.square(object_delta))

#计算坐标损失

coord_mask = tf.expand_dims(object_mask, 4)
boxes_delta = coord_mask * (predict_boxes - boxes_tran)
coord_loss = tf.reduce_mean(tf.reduce_sum(tf.square(boxes_delta))

#计算类别损失,其中response=label[:,:,:0] 只有该cell中含有目标的中心点时,label[:,:,:0]=0,否则label[:,:,:0]=1.

classes = labels[..., 5:]表示实际的各个类别,当该cell中含有目标的中心点时,对应的目标类别为1,其他的类别为0.
class_delta = response * (predict_classes - classes)
class_loss = tf.reduce_mean(tf.reduce_sum(tf.square(class_delta))

 

#计算noobject confidence loss

noobject_probs = tf.ones_like(object_mask, dtype=tf.float32) - object_mask
noobject_delta = noobject_probs * predict_confidence
noobject_loss = tf.reduce_mean(tf.reduce_sum(tf.square(noobject_delta))

 

#总的损失是各个损失的加和

tf.losses.add_loss(class_loss)
tf.losses.add_loss(object_loss)
tf.losses.add_loss(noobject_loss)
tf.losses.add_loss(coord_loss)
  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值