自定义训练 YOLOv8 分割模型,并以 TFlite 部署

如果你以前使用过目标检测,是否曾因边界框未正确包围物体而感到沮丧?或者它提供了错误的或不完整的包围?那可以尝试使用图像分割,它比目标检测更先进,因为它完全包围了物体。对物体进行分割之后,可以快速将其转换为最先进的TensorFlow Lite(TFLite)模型。

什么是物体分割?

98d18d790e6a6e5181d82b9292ee06ae.png

物体分割是一个计算机视觉问题,包括检测和区分图像中的离散物体或感兴趣区域。它也被称为图像或实例分割。物体分割的目的是为图像中的每个项目或实例提供唯一的标签或标识,同时精确定义这些物体的边界。

这项工作是语义分割的子集,它为图像中的每个像素分配一个标签,但不区分同一物品类别的不同实例。

用于物体分割的各种技术和算法包括传统方法,如阈值处理、边缘检测和区域生长,以及基于深度学习的方法,如卷积神经网络(CNN)和更高级的模型,如Mask R-CNN、YOLO(You Only Look Once)和FCN(完全卷积网络)。这些方法显著提高了物体分割任务的准确性和效率,使它们成为许多计算机视觉系统的重要组成部分。让我们开始进行图像分割编程

0. 在Roboflow中选择实例分割任务

选择实例分割,而不是目标检测

99e38e0dc8e24478525c745c8e0cf50f.png

1. 从命令提示符中安装ultralytics

这将安装ultralytics ver8

!pip install ultralytics

2. 读取图像并调整大小以适应屏幕

读取图像并在图像过大时调整大小。WaitKey(0)将无限期显示窗口,直到按下任意键(适用于图像显示)。

import cv2
from yolo_segmentation import YOLOSegmentation
img = cv2.imread("rugby.jpg")
img = cv2.resize(img,None, fx=0.3, fy=0.3)

3. 下载权重并分配变量给YOLO分割模型 

ys = YOLOSegmentation('yolov8m-seg.pt')
bboxes, classes, segmentations, scores = ys.detect(img)

下面是YOLOSegmentation类的文件,我们可以在关键字"return"之后看到序列顺序。

4. 了解data.yaml文件

Data.yaml文件指定文件的路径和类别ID。

蓝色的ID为0,灰色的ID为1,绿色的ID为2,红色的ID为3,黄色的ID为4。

506fd039b0040444e04d326c9eaa64d5.png

#https://pysource.com/2023/02/21/yolo-v8-segmentationfrom ultralytics import YOLO
import numpy as np
class YOLOSegmentation:
def __init(self, model_path):
self.model = YOLO(model_path)
def detect(self, img):
height, width, channels = img.shape
results = self.model.predict(source=img.copy(), save=False, save_txt=False)
result = results[0]
segmentation_contours_idx = []
for seg in result.masks.segments:
# contours
seg[:, 0] *= width
seg[:, 1] *= height
segment = np.array(seg, dtype=np.int32)
segmentation_contours_idx.append(segment)
bboxes = np.array(result.boxes.xyxy.cpu(), dtype="int")
class_ids = np.array(result.boxes.cls.cpu(), dtype="int")
scores = np.array(result.boxes.conf.cpu(), dtype="float").round(2)
return bboxes, class_ids, segmentation_contours_idx, scores

4. 解释代码 

运行代码并尝试解释它。

它显示类别为飞盘或运动球的图像大小为448x640。

for bbox, class_id, seg, score in zip(bboxes, classes, segmentations, scores):
cv2.rectangle(img,(x,y), (x2, y2),(0,0,255),2)
print(bboxes)

c9e06423dace659f702c3e98e83cc480.png

5. 绘制边界框

绘制边界框以确保我们正确地识别了物体。

for bbox, class_id, seg, score in zip(bboxes, classes, segmentations, scores):
cv2.rectangle(img,(x,y), (x2, y2),(0,0,255),2)

52c568a38db659cb34fe8fb3ae96bfb8.png

6. 绘制多边形

以下是opencv的格式:cv2.polylines(image, [pts], isClosed, color, thickness)

for bbox, class_id, seg, score in zip(bboxes, classes, segmentations, scores):
cv2.rectangle(img,(x,y), (x2, y2),(0,0,255),2)
cv2.polylines(img,[seg], True, (255,0,0), 2)

7. 在图像中显示类别ID

for bbox, class_id, seg, score in zip(bboxes, classes, segmentations, scores):
cv2.rectangle(img,(x,y), (x2, y2),(0,0,255),2)
cv2.polylines(img,[seg], True, (255,0,0), 2)
cv2.putText(img,str(class_id), (x, y-10), cv2.FONT_HERSHEY_PLAIN, 2, (0,0,255),2)

f5f5be5a190513446324d6b2f8f68995.png

8. 若要填充形状,只需使用FillPoly

for bbox, class_id, seg, score in zip(bboxes, classes, segmentations, scores):
cv2.rectangle(img,(x,y), (x2, y2),(0,0,255),2)
cv2.polylines(img,[seg], True, (255,0,0), 2)
cv2.putText(img,str(class_id), (x, y-10), cv2.FONT_HERSHEY_PLAIN, 2, (0,0,255),2)
cv2.fillPoly(img, pts=[seg], color=(255, 0, 0))

e1a8cd091a38c4cd2ab687647627f7dc.png

9. 现在加载我们自己的图像

现在将自己的权重和图像添加到pycharm中

a5dd078ff87731f7e8b11f8c5d032ba7.png

更改以下代码

img = cv2.imread("rugby.jpg")

→ img = cv2.imread("container.jpg")

ys = YOLOSegmentation('yolov8m-seg.pt')

→ ys = YOLOSegmentation('best.pt')

img = cv2.imread("rugby.jpg")
ys = YOLOSegmentation('yolov8m-seg.pt')
img = cv2.imread("container.jpg")
ys = YOLOSegmentation('best.pt')

10. 测试图像

这是Pycharm中的测试结果。根据data.yaml文件,类别ID为0(蓝色),1(灰色),2(绿色),3(红色)和4(黄色)。

cecf9c85110f65f5279113175aab1952.png

94052236dfdc8491ff48e441f14e932d.png

9.1 分数

分数按照Roboflow中的顺序,生成为data.yaml文件。

8e427d7d2011fdcf3380549af95596e0.png

我们可以看到灰色颜色有一个重复的问题,左侧被认为是灰色物体。

9.2 分数

分数显示蓝色和黄色的检测分数相对较高。最差的得分是灰色,因为其中一个物体被过度检测。

564b129cda7f0c3bef8aae0d7ea74f0d.png

10. 现在将其转换为TFLite模型

要转换为TFlite模型,只需运行以下命令

!yolo export model=/content/runs/segment/train2/weights/best.pt format=tflite

结论

正如您所看到的,通过物体分割,我们可以获得更精确的位置和边界框。尝试这个方法,看看是否可以将它与其他OpenCV函数一起使用!

参考文献

Ref1:https://nirmalamurali.medium.com/image-classification-vs-semantic-segmentation-vs-instance-segmentation-625c33a08d50

Ref2:https://pysource.com/2023/02/21/instance-segmentation-yolo-v8-opencv-with-python-tutorial/

·  END  ·

HAPPY LIFE

b715c4d0537ef542e2c9cfe4ecee507a.png

本文仅供学习交流使用,如有侵权请联系作者删除

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/139833.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于模型预测人工势场的船舶运动规划方法,考虑复杂遭遇场景下的COLREG(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

MongoDB实战之快速开始

写在前面:以前使用mongo只了解了个增删改查,而且没有集成springboot里面使用过。最近花了几小时系统的学习了一遍MongoDB,为了巩固和方便查找,在此记录下学习过程。 一、MongoDB的简介 MongoDB 是一个高性能、高可用性和易扩展的 NoSQL 数据…

细说雪花算法

文章目录 背景一、介绍二、结构三、数据库分表1.垂直分表2.水平分表(1)主键自增(2)取模(3)雪花算法(主角登场) 总结 背景 需要选择合适的方案去应对数据规模的增长,以应…

kibana操作elasticsearch(增删改查)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

论文阅读 Memory Enhanced Global-Local Aggregation for Video Object Detection

Memory Enhanced Global-Local Aggregation for Video Object Detection Abstract 人类如何识别视频中的物体?由于单一帧的质量低下,仅仅利用一帧图像内的信息可能很难让人们在这一帧中识别被遮挡的物体。我们认为人们识别视频中的物体有两个重要线索&…

vue3学习源码笔记(小白入门系列)------KeepAlive 原理

目录 说明组件是如何被缓存的,什么时候被激活对于KeepAlive 中组件 如何完成激活的对于KeepAlive 中组件 如何完成休眠的 总结 说明 Vue 内置了 KeepAlive 组件,实现缓存多个组件实例切换时,完成对卸载组件实例的缓存,从而使得组…

信号隔离的利器:光耦合器的应用与重要性 | 百能云芯

在当今数字化和电子技术的时代,各种电子设备和电路在我们的日常生活和工作中扮演着至关重要的角色。为了使这些设备正常运行并确保它们之间的相互作用,一种叫做光耦合器(CTR)的元件扮演着重要的连接桥梁角色。接下来云芯将带您深入…

abap中程序跳转(全)

1.常用 1.CALL TRANSACTION 1.CALL TRANSACTION ta WITH|WITHOUT AUTHORITY-CHECK [AND SKIP FIRST SCREEN]. 其中ta为事务码tcode使用时要打单引号() 2. CALL TRANSACTION ta WITH|WITHOUT AUTHORITY-CHECK USING bdc_tab { {[MODE mode] [UPDATE u…

基于tornado BELLE 搭建本地的web 服务

我的github 将BELLE 封装成web 后端服务,采用tornado 框架 import timeimport torch import torch.nn as nnfrom gptq import * from modelutils import * from quant import *from transformers import AutoTokenizer import sys import json #import lightgbm a…

FPGA基于1G/2.5G Ethernet PCS/PMA or SGMII实现 UDP 网络视频传输,提供工程和QT上位机源码加技术支持

目录 1、前言版本更新说明免责声明 2、我这里已有的以太网方案3、设计思路框架视频源选择OV5640摄像头配置及采集动态彩条UDP协议栈UDP视频数据组包UDP协议栈数据发送UDP协议栈数据缓冲IP地址、端口号的修改Tri Mode Ethernet MAC1G/2.5G Ethernet PCS/PMA or SGMIIQT上位机和源…

【动态规划】392. 判断子序列、115. 不同的子序列

提示:努力生活,开心、快乐的一天 文章目录 392. 判断子序列💡解题思路🤔遇到的问题💻代码实现🎯题目总结 115. 不同的子序列💡解题思路🤔遇到的问题💻代码实现&#x1f3…

将Sketch文件转化为PSD文件的简单在线工具!

设计工作不仅需要UI设计工具,还需要Photoshop。常见的UI设计工具Sketch与Photoshop软件不兼容。如果你想在实际工作中完成Sketch转psd,你需要使用其他软件进行转换。但是在转换过程中容易丢失文件,导致同样的工作需要重复多次才能完成&#x…