整个训练分两部分
原图尺寸:input_shape
标签:原始标签 box 为 (class, xmin, ymin, xmax, ymax) 每个值都是用原图片归一化( [0,1])
论文中提到 random crops, rotation, hue, saturation, exposure shift 等,但实际代码是最常用的预处理方式,四个角剪切 + 中心,翻转,再四个角 + 中心
用 ImageNet 数据集经过 DarkNet19 + avgpool + softmax 之后,得到 1000 分类。
图片尺寸 :input_shape = [height, width]
图片预处理
resize 为 416x416 并除以 255 进行像素级别归一化
标签预处理
由于每个 grid cell 对应 B 个 anchor,因此,上面的所有 anchor 指 B 个 anchor
detectors_mask 记录了每一个 grid cell 对应的 box 与哪个 anchor 的 IOU 最大。
true_box 记录了每个 box 相对于 grid cell 的偏移。
经过 DarkNet19 之后,得到 output,维度为 output_shape ([batch_size, height, width, num_anchors, 5 + num_classes]),其中最后一维依次为 [x,y,w,h, confidence, class_one_hot]
grid : [1, output_shape[1], output_shape[2], 1, 2] 其中 2 为 output_shape 的索引
对于 grid,比如 output_shape 为的 height 为 4, width 为 3
grid 为 (0, 0), (0, 1), (0,2) (1,0) … (3, 2)
anchor : [1, 1, 1, num_anchor, 2]
pre_yx = (grid + sigmoid(output[…, :2]) )/ output_shape[1:3]
pre_hw = exp(output[…, 2:4]) * anchor/ output_shape[1:3]
pred_box = [pre_yx, pred_hw]
pre_box_confidence = sigmoid(output_confidence)
pre_box_class = sofmax(output_class_one_hot)
此时 pre_* 也记录了相对于每个 grid cell 的偏移
no_object_scale = 1
object_scale = 5
no_object_loss = no_object_scale * (1 - object_detections) * (1 - detectors_mask) * (-pre_confidence)^2
objects_loss = (object_scale * detectors_mask * square(1 - pred_confidence)
confidence_loss = no_object_loss + objects_loss
classification_loss = class_scale * detectors_mask * square(matching_classes - pred_class_prob)
classification_loss = one_hot(matching_classes[..., 4], num_classes)
matching_boxes = matching_true_boxes[..., 0:4]
coordinates_loss = coordinates_scale * detectors_mask * square(matching_boxes - pred_boxes)
total_loss = 0.5 * (sum(confidence_loss) + sum(classification_loss) + sum(coordinates_loss))
160 epoch
learning rate 10-3 60(10-4) 90(10-5)
weight decay 0.0005 momentum 0.9
data augment : 与 Yolo 相同
当看到 detection 标签的时候, 反向传播包括 detection 和 classification 的 loss,看到 classification 标签的时候,只计算反向传播 classification 的 loss
参考物体检测训练部分
经过 DarkNet19 之后,得到 box, box_confidence, box_class_probs,记录了预测 box 的坐标,box 分数,box所属分类 。维度依次为 ([batch_size, height, width, num_anchors, 4],[batch_size, height, width, num_anchors, 1],[batch_size, height, width, num_anchors, num_classes])))
box 恢复到输入图片大小
box, box_class_scores 根据 IoU 0.5 进行 NMS 过滤,最多保留 10 个。
以上,就是 YoloV2 的基本实现。