【自用备份】YOLO学习问题

YOLO v3
1、 box与grid cell中心对齐吗 , v3中是先判断obj中心所在的三个grid cell , 再与9个 box中心对齐选出IOU最大的吗 , 有的网文写和grid cell没有关系 , 直接与所有 box比较?那此时 box需要有位置吧?不然中心对齐比较只有9种?
就目前看的代码而言 , 都将三种grid size分开计算 , 也就是每次只计算在当前grid size(如13*13)下真值与预测值的损失;匹配真值框与框的方式:与grid cell无关 , 直接比较三种与真值框的IOU(中心对齐) , 最大的来进行预测 。
2、真值是怎么标记的 , 也要做成13*13*255 , 26*26*255 , 52*52*255三个长方体吗 , 还是就几个框 , 几个坐标?
目前看来是要做成长方体的 , 但是有看到两种(x, y, w, h)的赋值方法 , 一种以填充缩放后在图像中的绝对坐标赋值 , 一种赋值坐标偏移量 。
第一种 , 比如原始图像大小为480*576 , 将其填充为正方形并缩放为416*416大小 , 则其上标记的真值框坐标也需要变换为416*416图像上的坐标 , 将变换后的坐标进行赋值 。但实际后来求损失时 , 会求出(tx, ty, tw, th) , 相当于多转了一步 。
# Coordinatestx[b, best_n, gj, gi] = gx - gx.floor() # 根据真实框所在位置 , 得到其相当于网络的位置ty[b, best_n, gj, gi] = gy - gy.floor()# Width and heighttw[b, best_n, gj, gi] = torch.log(gw / anchors[best_n][:, 0] + 1e-16)th[b, best_n, gj, gi] = torch.log(gh / anchors[best_n][:, 1] + 1e-16)# One-hot encoding of labeltcls[b, best_n, gj, gi, target_labels] = 1 #将真实框的标签转换为one-hot编码形式# Compute label correctness and iou at best anchor 计算预测的和真实一样的索引class_mask[b, best_n, gj, gi] = (pred_cls[b, best_n, gj, gi].argmax(-1) == target_labels).float()iou_scores[b, best_n, gj, gi] = bbox_iou(pred_boxes[b, best_n, gj, gi], target_boxes, x1y1x2y2=False) #与真实框想匹配的预测框之间的iou值tconf = obj_mask.float() # 真实框的置信度 , 也就是1
第二种 , 比如变换后的真值框坐标为(x1, y1, x2, y2)(x, y, w, h) , 计算中心坐标所在的grid cell , 比如13*13的grid size就除以32(每个格子32*32 , 整个图像416*416) , 得到的整数部分作为(cx, cy) , 小数部分则可认为是中心点在该格子内的相对位置(0-1之间) , 也就是进行赋值的“相对grid cell左上角的偏移量dx,dy”;pw, ph则用真值框w, h除以的w, h , 再log()得到 。【但我觉得按照论文的话 , 它不该对三个都进行赋值 , 在第4问也有提到其置信度赋值的问题】
【【自用备份】YOLO学习问题】_x, x_index = math.modf(cx / INPUT_WIDTH * feature_size)# 真值框偏移量_y, y_index = math.modf(cy / INPUT_HEIGHT * feature_size)for i, anchor in enumerate(anchors):# 该特征图scale下的三个anchor框iou = IOU_center(anchor, (w, h))p_w, p_h = w / anchor[0], h / anchor[1]targets[feature_size][int(x_index), int(y_index), i] = np.array([iou, _x, _y, np.log(p_w), np.log(p_h), *one_hot(CLASS_NUM, int(cls))])
3、多标签分类使用函数提现在哪里 , v2中用进行分类也没有体现在网络架构中 , 只有预先训练分类的时候有层 , 后来就移除了 , 那最后的检测网络中就没有了?
使用进行多标签分类体现在训练阶段使用预测结果计算损失时 , 将后的预测值(假如有80个类 , 则有80个0-1之间的类别预测值 , 表示属于这个类的概率)与类别真值(one-hot)计算二分类交叉熵损失: