如何使用 YOLOv11 分割对象

介绍

在快速发展的计算机视觉领域,“只看一次”(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 在图像和视频中分割物体。如果您觉得这段代码有用,请点赞并评论!我也希望您关注我,了解更多关于数据科学及其他相关主题的知识。感谢您的阅读!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值