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)