介绍
在快速发展的计算机视觉领域,“只看一次”(YOLO)模型不断突破实时物体检测和分割的界限。从最初的迭代开始,YOLO 就改变了机器解读视觉数据的方式,优先考虑速度和准确性。如今,随着 YOLOv11 的推出,我们看到了性能和功能的显著提升,尤其是在物体分割方面——这项关键技术不仅使我们能够检测物体,还能在图像中区分物体的精确边界。
在之前的博文中,我探讨了如何使用YOLOv8和YOLOv9实现对象分割,并讨论了每个版本为该领域带来的改进。YOLOv11 在此基础上构建,增强了神经架构并优化了分割功能,从而能够更准确、更高效地描绘对象。这使得它对于自动驾驶、医学成像和实时监控等应用尤为重要,因为在这些应用中,了解对象的形状和大小与简单地检测它们同样重要。
与单纯的检测不同,物体分割旨在理解物体的精确空间属性,从而将图像划分成有意义的区域。YOLOv11 采用先进的卷积层和创新的主干网络,即使在复杂或杂乱的场景中也能提供更清晰、更准确的物体边界。在本篇博文中,我将向您展示 YOLOv11 如何改进分割任务,并概述如何在您自己的项目中实现它的步骤。
如何使用 YOLOv11 进行图像处理
步骤 1:安装必要的库
<span style="color:rgba(0, 0, 0, 0.8)"><span style="background-color:#ffffff"><span style="background-color:#f9f9f9"><span style="color:#242424">pip 安装 opencv-python ultralytics numpy</span></span></span></span>
步骤 2:导入库
<span style="color:rgba(0, 0, 0, 0.8)"><span style="background-color:#ffffff"><span style="background-color:#f9f9f9"><span style="color:#242424"><span style="color:#aa0d91">从</span>ultralytics<span style="color:#aa0d91">导入</span> YOLO
<span style="color:#aa0d91">导入</span>随机
<span style="color:#aa0d91">导入</span>cv2
<span style="color:#aa0d91">导入</span>numpy<span style="color:#aa0d91">作为</span>np</span></span></span></span>
步骤 3:选择您的型号
<span style="color:rgba(0, 0, 0, 0.8)"><span style="background-color:#ffffff"><span style="background-color:#f9f9f9"><span style="color:#242424"><span style="color:#836c28">模型</span>=YOLO(<span style="color:#c41a16">“yolo11x-seg.pt”</span>)</span></span></span></span>
你可以比较不同的模型,并权衡它们各自的优缺点。在本例中,我们选择了 yolov11x-seg.pt。
步骤 4:使用 YOLOv11 分割图像中的对象
<span style="color:rgba(0, 0, 0, 0.8)"><span style="background-color:#ffffff"><span style="background-color:#f9f9f9"><span style="color:#242424">img = cv2.imread( <span style="color:#c41a16">"YourImagePath"</span> )
<span style="color:#007400"># 如果你想要所有类</span>
yolo_classes = <span style="color:#5c2699">list</span> (model.names.values())
classes_ids = [yolo_classes.index(clas) <span style="color:#aa0d91">for</span> clas <span style="color:#aa0d91">in</span> yolo_classes]
conf = <span style="color:#1c00cf">0.2</span>
results = model.predict(img, conf=conf)
colors = [random.choices( <span style="color:#5c2699">range</span> ( <span style="color:#1c00cf">256</span> ), k= <span style="color:#1c00cf">3</span> ) <span style="color:#aa0d91">for</span> _ <span style="color:#aa0d91">in</span> classes_ids]
<span style="color:#5c2699">print</span> (results)
<span style="color:#aa0d91">for</span> result <span style="color:#aa0d91">in</span> results:
<span style="color:#aa0d91">for</span> mask, box <span style="color:#aa0d91">in </span> <span style="color:#5c2699">zip</span> (result.masks.xy, result.boxes):
points = np.int32([mask])
color_number = classes_ids.index( <span style="color:#5c2699">int</span> (box.cls[ <span style="color:#1c00cf">0</span> ]))
cv2.fillPoly(img, points, colors[color_number])</span></span></span></span>
1.加载图像:
img = cv2.imread("YourImagePath")
使用OpenCV的函数从指定路径读取图像cv2.imread()
。
2. 预测准备:
yolo_classes = list(model.names.values())
创建 YOLOv11 模型识别的类名列表。classes_ids = [yolo_classes.index(clas) for clas in yolo_classes]
创建与这些名称对应的类 ID 列表。conf = 0.2
设置对象检测的置信度阈值。只有置信度得分高于此阈值的预测才会被考虑。
3.运行模型预测:
results = model.predict(img, conf=conf)
调用predict()
YOLOv11 模型的方法对加载的图像进行预测。结果包括检测到的物体、其边界框、掩膜(多边形轮廓)、置信度分数和类别预测。colors = [random.choices(range(256), k=3) for _ in classes_ids]
生成一个随机颜色列表,每个类别一个,用于视觉表示。
4.处理结果和可视化蒙版:
- 循环
for
遍历结果中检测到的每个对象: mask, box = zip(result.masks.xy, result.boxes)
解压对象的掩码坐标和边界框信息。points = np.int32([mask])
将掩码坐标(可能是浮点格式)转换为整数,以便使用 OpenCV 在图像上绘制。color_number = classes_ids.index(int(box.cls[0]))
根据对象的预测类别确定视觉表示的颜色索引。cv2.fillPoly(img, points, colors[color_number])
使用原始图像上的相应颜色填充由蒙版坐标定义的多边形,从而有效地创建对象的视觉分割。
步骤 5:保存并绘制结果图像
<span style="color:rgba(0, 0, 0, 0.8)"><span style="background-color:#ffffff"><span style="background-color:#f9f9f9"><span style="color:#242424">cv2.imshow( <span style="color:#c41a16">"图像"</span>,img)
cv2.waitKey( <span style="color:#1c00cf">0</span> )
cv2.imwrite( <span style="color:#c41a16">"您的保存路径"</span>,img)</span></span></span></span>
完整代码:
<span style="color:rgba(0, 0, 0, 0.8)"><span style="background-color:#ffffff"><span style="background-color:#f9f9f9"><span style="color:#242424"><span style="color:#aa0d91">从</span>ultralytics<span style="color:#aa0d91">导入</span>YOLO
<span style="color:#aa0d91">导入</span>随机
<span style="color:#aa0d91">导入</span>cv2
<span style="color:#aa0d91">导入</span>numpy<span style="color:#aa0d91">作为</span>np
model = YOLO( <span style="color:#c41a16">"yolo11x-seg.pt"</span> )
img = cv2.imread( <span style="color:#c41a16">"YourImagePath"</span> )
<span style="color:#007400"># 如果你想要所有类</span>
yolo_classes = <span style="color:#5c2699">list</span> (model.names.values())
classes_ids = [yolo_classes.index(clas) <span style="color:#aa0d91">for</span> clas <span style="color:#aa0d91">in</span> yolo_classes]
conf = <span style="color:#1c00cf">0.2</span>
results = model.predict(img, conf=conf)
colors = [random.choices( <span style="color:#5c2699">range</span> ( <span style="color:#1c00cf">256</span> ), k= <span style="color:#1c00cf">3</span> ) <span style="color:#aa0d91">for</span> _ <span style="color:#aa0d91">in</span> classes_ids]
<span style="color:#aa0d91">for</span> result <span style="color:#aa0d91">in</span> results:
<span style="color:#aa0d91">for</span> mask, box <span style="color:#aa0d91">in </span> <span style="color:#5c2699">zip</span> (result.masks.xy, result.boxes):
points = np.int32([mask])
color_number = classes_ids.index( <span style="color:#5c2699">int</span> (box.cls[ <span style="color:#1c00cf">0</span> ]))
cv2.fillPoly(img,点,颜色[color_number])
cv2.imshow(<span style="color:#c41a16">“图像”</span>,img)
cv2.waitKey(<span style="color:#1c00cf">0</span>)
cv2.imwrite(<span style="color:#c41a16">“YourSavePath”</span>,img)</span></span></span></span>
YOLOv11模型及项目代码+零基础入门教程↓
结论
在本教程中,我们学习了如何使用 YOLOv11 在图像和视频中分割物体。如果您觉得这段代码有用,请点赞并评论!我也希望您关注我,了解更多关于数据科学及其他相关主题的知识。感谢您的阅读!