【YOLOX】Python画预测框+预测标签和真实框

这段代码实现了一个目标检测结果的可视化功能。它读取图像、真实框信息,根据预设的置信度阈值过滤预测框,并使用不同的颜色对不同类别的检测框进行标注。此外,还显示了每个框的类别ID和置信度分数。代码中定义的颜色数组 `_COLORS` 用于区分不同类别的边界框。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
黑色框为真实框,真实标签就不给了,肉眼多少还是能分辨出来的

anno_infos = parse_rec(annopath.format(img_info["file_name"].replace("_V.jpg","")))
vis_res = vis(anno_infos,img, bboxes, scores, cls, cls_conf, self.cls_names)
cv2.imwrite(save_file_name, vis_res)
import cv2
import numpy as np
def vis(anno_infos,img, boxes, scores, cls_ids, conf=0.5, class_names=None):

    for i in range(len(boxes)):
        box = boxes[i]
        cls_id = int(cls_ids[i])
        score = scores[i]
        if score < conf:
            continue
        x0 = int(box[0])
        y0 = int(box[1])
        x1 = int(box[2])
        y1 = int(box[3])

        color = (_COLORS[cls_id] * 255).astype(np.uint8).tolist()
        text = '{}:{:.1f}%'.format(class_names[cls_id], score * 100)
        txt_color = (0, 0, 0) if np.mean(_COLORS[cls_id]) > 0.5 else (255, 255, 255)
        txt_color=(255, 255, 255)
        font = cv2.FONT_HERSHEY_SIMPLEX

        txt_size = cv2.getTextSize(text, font, 0.4, 1)[0]
        cv2.rectangle(img, (x0, y0), (x1, y1), color, 2)

        txt_bk_color = (_COLORS[cls_id] * 255 * 0.7).astype(np.uint8).tolist()
        cv2.rectangle(
            img,
            (x0, y0-int(1.5*txt_size[1])),
            (x0 + txt_size[0] + 1, y0 -1 ),
            txt_bk_color,
            -1
        )
        cv2.putText(img, text, (x0, y0 - txt_size[1]+4), font, 0.4, txt_color, thickness=1)
        for anno_info in anno_infos:
            bbox = anno_info["bbox"]
            cv2.rectangle(img, (bbox[0], bbox[1]), (bbox[2], bbox[3]), [0,0,0], 1)

    return img


_COLORS = np.array(
    [
        0.000, 0.447, 0.741,
        0.850, 0.325, 0.098,
        0.929, 0.694, 0.125,
        0.494, 0.184, 0.556,
        0.466, 0.674, 0.188,
        0.301, 0.745, 0.933,
        0.635, 0.078, 0.184,
        0.300, 0.300, 0.300,
        0.600, 0.600, 0.600,
        1.000, 0.000, 0.000,
        1.000, 0.500, 0.000,
        0.749, 0.749, 0.000,
        0.000, 1.000, 0.000,
        0.000, 0.000, 1.000,
        0.667, 0.000, 1.000,
        0.333, 0.333, 0.000,
        0.333, 0.667, 0.000,
        0.333, 1.000, 0.000,
        0.667, 0.333, 0.000,
        0.667, 0.667, 0.000,
        0.667, 1.000, 0.000,
        1.000, 0.333, 0.000,
        1.000, 0.667, 0.000,
        1.000, 1.000, 0.000,
        0.000, 0.333, 0.500,
        0.000, 0.667, 0.500,
        0.000, 1.000, 0.500,
        0.333, 0.000, 0.500,
        0.333, 0.333, 0.500,
        0.333, 0.667, 0.500,
        0.333, 1.000, 0.500,
        0.667, 0.000, 0.500,
        0.667, 0.333, 0.500,
        0.667, 0.667, 0.500,
        0.667, 1.000, 0.500,
        1.000, 0.000, 0.500,
        1.000, 0.333, 0.500,
        1.000, 0.667, 0.500,
        1.000, 1.000, 0.500,
        0.000, 0.333, 1.000,
        0.000, 0.667, 1.000,
        0.000, 1.000, 1.000,
        0.333, 0.000, 1.000,
        0.333, 0.333, 1.000,
        0.333, 0.667, 1.000,
        0.333, 1.000, 1.000,
        0.667, 0.000, 1.000,
        0.667, 0.333, 1.000,
        0.667, 0.667, 1.000,
        0.667, 1.000, 1.000,
        1.000, 0.000, 1.000,
        1.000, 0.333, 1.000,
        1.000, 0.667, 1.000,
        0.333, 0.000, 0.000,
        0.500, 0.000, 0.000,
        0.667, 0.000, 0.000,
        0.833, 0.000, 0.000,
        1.000, 0.000, 0.000,
        0.000, 0.167, 0.000,
        0.000, 0.333, 0.000,
        0.000, 0.500, 0.000,
        0.000, 0.667, 0.000,
        0.000, 0.833, 0.000,
        0.000, 1.000, 0.000,
        0.000, 0.000, 0.167,
        0.000, 0.000, 0.333,
        0.000, 0.000, 0.500,
        0.000, 0.000, 0.667,
        0.000, 0.000, 0.833,
        0.000, 0.000, 1.000,
        0.000, 0.000, 0.000,
        0.143, 0.143, 0.143,
        0.286, 0.286, 0.286,
        0.429, 0.429, 0.429,
        0.571, 0.571, 0.571,
        0.714, 0.714, 0.714,
        0.857, 0.857, 0.857,
        0.000, 0.447, 0.741,
        0.314, 0.717, 0.741,
        0.50, 0.5, 0
    ]
).astype(np.float32).reshape(-1, 3)
### YOLO模型中的预测实现与绘制 YOLO(You Only Look Once)是一种实时目标检测架,其核心思想是将输入图像划分为网格结构,并让每个网格负责预测边界及其对应的类别概率。以下是关于YOLO模型中预测的实现、计算以及绘制的具体说明。 #### 预测的核心概念 在YOLO模型中,每个网格单元会预测多个边界(Bounding Box),这些边界由中心坐标 \( (x, y) \)、宽度 \( w \) 高度 \( h \) 表示[^1]。此外,还会预测一个置信度分数来衡量该边界内是否存在对象的概率。对于每个边界,还会有对应的一组条件类别概率表示属于不同类别的可能性。 #### 边界的计算方式 YOLO通过网络输出张量来进行边界预测。假设我们有一个大小为 \( S \times S \) 的网格划分,则最终的输出是一个形状为 \( S \times S \times B \times (5+C) \) 的张量,其中: - \( S \): 网格的数量; - \( B \): 每个网格预测的边界数量; - \( C \): 类别数; - \( 5 \): 中心位置 \( x, y \),宽高 \( w, h \),以及置信度得分。 具体来说,边界的位置尺寸可以通过如下公式得到: \[ b_x = σ(t_x) + c_x,\quad b_y = σ(t_y) + c_y, \] \[ b_w = p_we^{t_w},\quad b_h = p_he^{t_h}, \] 这里 \( t_x, t_y, t_w, t_h \) 是网络输出的结果;\( c_x, c_y \) 是当前网格单元左上角相对于整个图像的比例偏移;\( p_w, p_h \) 则是从先验锚定获得的基础尺度。 #### 绘制预测的方法 为了可视化YOLO模型产生的预测结果,在Python环境中可以利用OpenCV库完成这一操作: ```python import cv2 import numpy as np def draw_bounding_boxes(image, boxes, class_names): """ 在给定图像上绘制边界。 参数: image: 输入图像数组. boxes: 包含边界信息的列表 [(x_min, y_min, x_max, y_max), ...]. class_names: 对应于每个边界的标签名 ['class_name', ...]. 返回: 带有标注的新图像. """ img_copy = image.copy() height, width, _ = img_copy.shape for box, name in zip(boxes, class_names): x_min, y_min, x_max, y_max = map(int, box) color = tuple(np.random.randint(0, 255, size=3).tolist()) # 随机颜色 # 绘制矩形 cv2.rectangle(img_copy, (x_min, y_min), (x_max, y_max), color=color, thickness=2) # 添加文字描述 text_size, _ = cv2.getTextSize(name, fontFace=cv2.FONT_HERSHEY_SIMPLEX, fontScale=0.6, thickness=1) text_width, text_height = text_size cv2.rectangle(img_copy, (x_min, y_min - text_height - 4), (x_min + text_width + 4, y_min), color, -1) cv2.putText( img_copy, name, org=(x_min + 2, y_min - 4), fontFace=cv2.FONT_HERSHEY_SIMPLEX, fontScale=0.6, color=(255, 255, 255), thickness=1 ) return img_copy ``` 上述函数接受原始图像数据、一系列边界坐标及相应的类别名称作为参数,并返回带有标记的新图像副本。 #### NMS处理后的预测筛选 由于同一个物体可能会被多个重叠的边界覆盖到,因此需要采用非极大抑制(Non-Maximum Suppression, NMS)。NMS按照以下逻辑工作:首先按置信度降序排列候选集合;接着选取最高分者保留下来并剔除其余与其IoU超过阈值的所有项;重复此过程直到无剩余待选为止。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星空•物语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值