在计算机视觉领域,边界框、多边形和掩码是常用的标注格式。它们之间的转换通常需要编写自定义脚本。本文将展示如何使用Supervision库轻松完成这些转换。
边界框(xyxy)是与计算机视觉最常关联的标注格式,用于对象检测,模型学习用方框标记对象。多边形标注用于实例分割,模型学习用多边形(复杂形状)而非方框标记对象。掩码类似于多边形,因为它们可以显示图像中的对象或区域,但掩码是图像的二进制像素表示,对象/区域像素为1,背景/无关像素为0。
本文将展示如何将多边形转换为边界框(xyxy)、将多边形转换为掩码、将掩码转换为边界框(xyxy)以及将掩码转换为多边形。
在这个示例中,将使用一个名为Supervision的开源计算机视觉工具。Supervision支持多种导入格式,如Inference、Ultralytics YOLOv8和Azure Image Analysis。将从Roboflow的托管推理API导入预测结果。
prediction = model.predict(test_image_url, hosted=True).json()
detections = sv.Detections.from_inference(prediction)
更多关于不同导入格式的信息和代码示例,请查看Supervision Detections API文档。
有时,实例分割可能比对象检测更慢、更复杂。如果不需要多边形检测的额外精度和细节,最好用多边形进行标注,然后转换为边界框以训练对象检测模型。
以下是如何将多边形数据转换为边界框数据的方法:
import supervision as sv
bounding_boxes = [sv.polygon_to_xyxy(p) for p in polygons]
多边形数组是一个NumPy数组,用于多个多边形,这就是为什么遍历多边形数组。
import supervision as sv
detections = sv.Detections.from_inference(prediction)
bounding_boxes = detections.xyxy
首先,导入Supervision。然后,导入想要转换的多边形数据。在这个例子中,使用Roboflow的托管推理API的推理结果,但还有更多的导入选项。
多边形数据通常用作标注格式和推理导出格式,可以转换为掩码,用于训练语义分割数据集。由于多边形由直线组成,掩码通常更能捕捉对象形状的细节。
import supervision as sv
masks = [sv.polygon_to_mask(p, (width, height)) for p in polygons]
多边形数组是一个ndarray,用于多个多边形,这就是为什么遍历多边形数组。
import supervision as sv
detections = sv.Detections.from_inference(prediction)
masks = detections.mask
导入Supervision后,可以从源导入检测结果。在这个例子中,使用Roboflow的托管推理API的推理结果,但还有更多的导入选项。
语义分割和实例分割模型通常比基于边界框的对象检测模型慢,因此将掩码数据转换为边界框可能是有益的。此外,由于掩码包含像素级数据,以边界框格式存储数据可以提高效率和存储优势。
import supervision as sv
bounding_boxes = sv.mask_to_xyxy(masks)
import supervision as sv
detections = sv.Detections.from_inference(prediction)
bounding_boxes = detections.xyxy
导入Supervision后,可以从源导入检测结果。在这个例子中,使用Roboflow的托管推理API的推理结果,但还有更多的导入选项。
在许多情况下,可能需要将掩码转换为多边形。例如,可能希望将从分割模型中使用的二进制掩码转换为自动化标注系统中的多边形标注。
对于掩码到多边形的转换,使用supervision.mask_to_polygons()函数将掩码转换为多边形。
import supervision as sv
detections = sv.Detections.from_inference(prediction)
polygons = [sv.mask_to_polygons(m) for m in detections.mask]
在这个例子中,使用Roboflow的托管推理API的推理结果,但还有更多的导入选项。
以上就是本指南的全部内容!介绍了如何在边界框、掩码和多边形数据结构之间进行各种有用的转换。以前需要编写长脚本的任务,现在可以简化为一两行简洁的代码。