Пытаясь реализовать Faster RCNN с PyTorch, я наткнулся на замечательное руководство здесь , и меня смутили операции, происходящие после этапа расчета IoU. Я понимаю, что положительные метки должны быть назначены для якорей, у которых IoU:
и отрицательно для якорей, у которых IoU меньше 0,3. Остальным пофиг. Может ли кто-нибудь объяснить, что происходит в следующем разделе?
Рассмотрим сценарий ios a и b, нам нужно найти две вещи здесь
- высшее значение для каждого gt_box и соответствующего ему якорного ящика
- наибольшее значение iou для каждого якорного ящика и соответствующего ему наземного истинного ящика
case-1
gt_argmax_ious = ious.argmax(axis=0)
print(gt_argmax_ious)
gt_max_ious = ious[gt_argmax_ious, np.arange(ious.shape[1])]
print(gt_max_ious)
# Out:
# [2262 5620]
# [0.68130493 0.61035156]
case-2
argmax_ious = iou.argmax(axis=1)
print(argmax_ious.shape)
print(argmax_ious)
max_ious = ious[np.arange(len(inside_index)), argmax_ious]
print(max_ious)
# Out:
# (22500,)
# [0, 1, 0, ..., 1, 0, 0]
# [0.06811669 0.07083762 0.07083762 ... 0. 0. 0.]
Найдите якорные ящики с этим max_ious (gt_max_ious)
gt_argmax_ious = np.where(ious == gt_max_ious)[0]
print(gt_argmax_ious)
# Out:
# [2262, 2508, 5620, 5628, 5636, 5644, 5866, 5874, 5882, 5890, 6112,
# 6120, 6128, 6136, 6358, 6366, 6374, 6382]
Теперь у нас есть три массива
argmax_ious
- сообщает, какой наземный объект истинности имеет максимум iou с каждым якорем. max_ious
- сообщает max_iou
наземный объект истинности с каждым якорем. gt_argmax_ious
- Сообщает якорям с наивысшим перекрытием пересечения-союз (IoU) поле истинности земли.
Используя argmax_ious
и max_ious
, мы можем назначать метки и местоположения для якорные ящики, которые удовлетворяют [b] и [c]. Используя gt_argmax_ious
, мы можем назначить метки и места для якорных ящиков, которые удовлетворяют [a].