在计算机视觉领域,边界框是一种常用的工具,用于可视化模型的预测结果。通过分析边界框,可以评估模型的性能,比如模型是否错过了某些预测,或者某些对象是否更倾向于产生误报。结合对数据集中类别平衡的理解,测试模型并分析边界框所学到的知识将有助于提高模型性能。
然而,边界框并不是由模型本身在照片上绘制的。这是一个后处理步骤,可能由模型执行,也可能不执行。例如,使用Roboflow Python包时,可以选择只解析模型的JSON输出,并选择自己绘制边界框。
在本教程中,将创建一个带有边界框的示例图像。在开始之前,可以查看下面的实时演示,了解这种方法的实际效果。这个工作流程使用了将在本文中介绍的相同代码。
要在Python中绘制边界框,需要四个坐标:一个坐标代表边界框的每个角落。例如,Roboflow API提供了边界框的x和y坐标以及高度和宽度。有了这些信息,可以计算出盒子每个角落的坐标并可视化边界框。
在本指南中,将使用名为supervision的Python包,它提供了超过10个标注器,用于可视化计算机视觉预测。这些包括标签、盒子、分割掩码和模糊标注器。可以使用supervision从原始坐标绘制边界框。还可以从各种支持的库(例如Roboflow Inference、Detectron2、Transformers、Ultralytics)加载坐标并绘制预测。
首先,安装supervision:
pip install supervision
创建一个新文件,并添加以下代码:
import supervision as sv
import cv2
import numpy as np
image = cv2.imread("image.jpeg")
detections = sv.Detections(
xyxy=np.array([x0, y0, x1, y1]),
class_id=np.array([0]),
confidence=np.array([0.94])
)
bounding_box_annotator = sv.BoundingBoxAnnotator()
annotated_frame = bounding_box_annotator.annotate(
scene=image.copy(),
detections=detections
)
sv.plot_image(annotated_frame)
需要添加自己的预测列表,其中包含代表想要绘制的边界框的x、y、宽度和高度值。在这个例子中,添加了Roboflow模型返回的预测,该模型在本文末尾讨论。
在上面的代码中,用预测对应的值替换x0、y0、x1和y1的值。如果有多个框要绘制,在NumPy数组中将它们作为新的列表项添加。
或者,可以直接从detectron2、Ultralytics YOLO模型和Roboflow模型等模型加载预测。要了解更多信息,请参考supervision Detections API文档。
以下是从Roboflow supervision加载检测的示例:
import cv2
import supervision as sv
from inference import get_model
model = get_model(model_id="yolov8n-640")
image = cv2.imread(<SOURCE_IMAGE_PATH>)
results = model.infer(image)[0]
detections = sv.Detections.from_inference(results)
让在这张图片上运行代码:运行代码后,可以打开“example_with_bounding_boxes.jpg”文件,查看预测结果。以下是结果:
成功地在图片上绘制了边界框和相应的标签!
supervision Python包支持广泛的标注器,用于目标检测、分割和关键点检测。例如,可以使用圆角框标注器在对象周围绘制圆角边界框,或者使用颜色标注器用特定颜色填充边界框区域。要了解更多关于Roboflow supervision中可用的标注器,请参考supervision Annotators文档。