计算机视觉一些面试基础整理(持续更新)

2023-12-20 04:13:19

1.IOU的原理及伪代码实现:

图像示例
在这里插入图片描述
原理:
IoU(Intersection over Union)是目标检测中常用的评价指标,用于衡量预测边界框(Bounding Box)与真实边界框之间的重叠程度。IoU 的计算方式是通过目标框的交集面积除以它们的并集面积。
IoU 的数学定义如下:在这里插入图片描述
IoU(Intersection over Union)是目标检测中常用的评价指标,用于衡量预测边界框与真实边界框之间的重叠程度。IoU 的计算方式是通过目标框的交集面积除以它们的并集面积。

以下是 IoU 的伪代码:

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,即最终选定的边界框的索引列表。

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坐标的预测都是同时完成,它们共享前一层的参数。实验表明,解耦合检测头能加快模型收敛速度、提高检测精度,同时也会带来一点额外的参数量和计算成本。

文章来源:https://blog.csdn.net/sexy19910923/article/details/135086122
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。