1.IOU的原理及伪代码实现:
图像示例
原理:
IoU(Intersection over Union)是目标检测中常用的评价指标,用于衡量预测边界框(Bounding Box)与真实边界框之间的重叠程度。IoU 的计算方式是通过目标框的交集面积除以它们的并集面积。
IoU 的数学定义如下:
IoU(Intersection over Union)是目标检测中常用的评价指标,用于衡量预测边界框与真实边界框之间的重叠程度。IoU 的计算方式是通过目标框的交集面积除以它们的并集面积。
以下是 IoU 的伪代码:
python
def calculate_iou(boxA, boxB):
# boxA 和 boxB 分别表示两个边界框,每个边界框是一个四元组 (x, y, w, h),表示左上角坐标和宽高
# 计算交集的坐标
xA = max(boxA[0], boxB[0])
yA = max(boxA[1], boxB[1])
xB = min(boxA[0] + boxA[2], boxB[0] + boxB[2])
yB = min(boxA[1] + boxA[3], boxB[1] + boxB[3])
# 计算交集和并集的面积
intersection_area = max(0, xB - xA + 1) * max(0, yB - yA + 1)
boxA_area = (boxA[2] + 1) * (boxA[3] + 1)
boxB_area = (boxB[2] + 1) * (boxB[3] + 1)
union_area = boxA_area + boxB_area - intersection_area
# 计算 IoU
iou = intersection_area / union_area
return iou
2.非极大值抑制(NMS)
NMS是一种用于去除冗余边界框的技术,通常用于目标检测任务。其基本原理是在一系列具有置信度得分的边界框中,选择置信度最高的边界框,然后移除与该边界框重叠度过高的其他边界框,以保留最具代表性的框。
NMS 的伪代码简要阐述如下:
输入: 一组边界框 boxes,每个边界框对应的置信度得分 scores,以及两个阈值 conf_threshold(置信度阈值)和 iou_threshold(IoU 阈值)。
按照置信度得分排序: 将边界框按照其置信度得分从高到低进行排序,得到排序后的索引列表 sorted_indices。
初始化结果列表: 创建一个空列表 selected_indices 用于存储最终选定的边界框的索引。
循环选择边界框: 从排序后的列表中选择置信度最高的边界框,将其索引加入 selected_indices 中。然后,计算该边界框与剩余边界框的 IoU(交并比),移除与该边界框重叠度过高的其他边界框。
迭代过程: 重复上述步骤,直到排序后的列表中没有边界框。
输出: 返回 selected_indices,即最终选定的边界框的索引列表。
python
def non_max_suppression(boxes, scores, conf_threshold=0.5, iou_threshold=0.5):
# boxes: 边界框坐标列表 [(x1, y1, x2, y2), ...]
# scores: 对应边界框的置信度列表 [score1, score2, ...]
# conf_threshold: 置信度阈值
# iou_threshold: IoU 阈值
selected_indices = []
# 按照置信度对边界框进行排序
sorted_indices = sorted(range(len(scores)), key=lambda i: scores[i], reverse=True)
while len(sorted_indices) > 0:
# 选出置信度最高的边界框
best_box_index = sorted_indices[0]
selected_indices.append(best_box_index)
# 计算最高置信度边界框与其它边界框的 IoU
other_indices = sorted_indices[1:]
indices_to_remove = []
for idx in other_indices:
iou = calculate_iou(boxes[best_box_index], boxes[idx])
if iou > iou_threshold:
indices_to_remove.append(idx)
# 移除与最高置信度边界框重叠度过高的边界框
for idx in indices_to_remove:
sorted_indices.remove(idx)
# 移除已处理的最高置信度边界框
sorted_indices = sorted_indices[1:]
return selected_indices
3.decoupled head"解耦头"
在目标检测中,Decouple Head的实现主要是将目标位置和类别信息的提取分开处理。
具体来说,Decouple Head会将特征图分成不同的分支,每个分支负责提取目标位置或类别信息。这些分支分别进行训练,然后对提取的特征进行融合,生成最终的检测结果。
Decoupled Head的优势在于可以更好地处理不同尺度和精细度的语义信息。通过将像素级的预测与特征提取分开,可以更好地利用底层和高层特征之间的语义信息,从而提高分割的准确性和细节保留能力。
yolox和之前的yolo系列的分类头的区别,对于由backbone得到的特征图,经过一系列降维后,在之前的yolo系列中,关于分类的概率和bbox坐标的预测都是同时完成,它们共享前一层的参数。实验表明,解耦合检测头能加快模型收敛速度、提高检测精度,同时也会带来一点额外的参数量和计算成本。