使用yolo-seg模型实现自定义自动动态抠图

yolov8导航

        如果大家想要了解关于yolov8的其他任务和相关内容可以点击这个链接,我这边整理了许多其他任务的说明博文,后续也会持续更新,包括yolov8模型优化、sam等等的相关内容。

YOLOv8(附带各种任务详细说明链接)

介绍

在这篇博客中,我们将探索如何使用YOLO-SEG模型来自动进行图像中对象的抠图。YOLO-SEG是一种结合了YOLO(You Only Look Once)快速目标检测能力和图像分割的深度学习模型,能够在单个网络中同时实现目标检测和像素级分割。

安装与设置:点击上面yolov8的导航跳转有参考

或者点击这里:超详细的YOLOv8安装与测试指南:让计算机视觉任务变得简单_yolo ultralytics 安装-CSDN博客

数据准备与训练:

看这里:

超详细YOLOv8实例分割全程概述:环境、训练、验证与预测详解_yolov8环境搭建-CSDN博客

抠图应用

训练完成后,你可以使用训练好的模型对新图像进行自动抠图。YOLO-SEG能够识别图像中的对象,并生成对应的分割掩码,从而实现精准抠图。

from ultralytics import YOLO
from matplotlib import pyplot as plt
import numpy as np
import cv2

# 加载sam模型,如果没有这个框架也会自动的为你下载
model = YOLO('yolov8n-seg.pt')

# 读取一张图片,
orig_img = cv2.imread('test.jpg')
# 这里特别注意,因为使用yolov8训练的时候默认会把图片resize成448*640的尺寸,所以这里也得改成你训练的尺寸
orig_img = cv2.resize(orig_img, (640, 448))  # 注意OpenCV中尺寸是先宽度后高度


# 使用模型进行推理, 后面save=True的参数可以输出测试分割的图片
results = model(orig_img,save=True)

# 这里是我获取mask编码部分的。
mask = results[0].masks.data[0].cpu().numpy().astype(np.bool_)


# 应用掩码到原始图像
# 如果你想要背景是黑色的
masked_image = np.zeros_like(orig_img)
masked_image[mask] = orig_img[mask]

# 如果你想要背景透明(假设原始图像是RGB格式)
# 创建一个RGBA图像,其中背景是透明的
alpha_channel = np.ones(mask.shape, dtype=orig_img.dtype) * 255  # 创建alpha通道
masked_image_rgba = np.dstack((masked_image, alpha_channel))  # 将alpha通道添加到RGB通道
masked_image_rgba[~mask] = (0, 0, 0, 0)  # 将非掩码区域设置为透明

# 保存图片,黑色背景
cv2.imwrite('masked_image_test.jpg', masked_image)

# 如果背景是透明的
cv2.imwrite('masked_image_test.png', masked_image_rgba)

原图:

正常输出结果:

抠图结果:

        到了这一步。你学废了吗。

  • 9
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
以下是使用PythonYOLO-NAS模型进行水果识别的代码: ```python # 导入相关的库 import cv2 import numpy as np import argparse # 设置命令行参数 ap = argparse.ArgumentParser() ap.add_argument("-i", "--image", required=True, help="path to input image") ap.add_argument("-m", "--model", required=True, help="path to yolo-nas model") ap.add_argument("-c", "--classes", required=True, help="path to text file containing class names") args = vars(ap.parse_args()) # 加载类别名 classes = None with open(args["classes"], 'r') as f: classes = [line.strip() for line in f.readlines()] # 加载模型 net = cv2.dnn.readNet(args["model"]) # 加载输入图像并进行预处理 image = cv2.imread(args["image"]) blob = cv2.dnn.blobFromImage(image, 1/255.0, (416, 416), swapRB=True, crop=False) # 设置模型的输入和输出节点 net.setInput(blob) layerNames = net.getLayerNames() outputLayers = [layerNames[i[0] - 1] for i in net.getUnconnectedOutLayers()] layerOutputs = net.forward(outputLayers) # 初始化输出结果 boxes = [] confidences = [] classIDs = [] # 循环遍历每个输出层,提取检测结果 for output in layerOutputs: for detection in output: scores = detection[5:] classID = np.argmax(scores) confidence = scores[classID] # 过滤掉置信度低的检测结果 if confidence > 0.5: box = detection[0:4] * np.array([image.shape[1], image.shape[0], image.shape[1], image.shape[0]]) (centerX, centerY, width, height) = box.astype("int") # 计算边框的左上角坐标 x = int(centerX - (width / 2)) y = int(centerY - (height / 2)) # 更新输出结果 boxes.append([x, y, int(width), int(height)]) confidences.append(float(confidence)) classIDs.append(classID) # 对输出结果进行NMS处理,去除冗余的检测结果 idxs = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4) # 在图像上绘制检测结果 if len(idxs) > 0: for i in idxs.flatten(): (x, y) = (boxes[i][0], boxes[i][1]) (w, h) = (boxes[i][2], boxes[i][3]) color = [int(c) for c in COLORS[classIDs[i]]] cv2.rectangle(image, (x, y), (x + w, y + h), color, 2) text = "{}: {:.4f}".format(classes[classIDs[i]], confidences[i]) cv2.putText(image, text, (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2) # 显示输出图像 cv2.imshow("Image", image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 使用时可以在命令行中运行以下命令: ``` python fruit_detection.py --image input_image.jpg --model yolo-nas.weights --classes classes.txt ``` 其中,`input_image.jpg`是要识别的图像,`yolo-nas.weights`是YOLO-NAS模型的权重文件,`classes.txt`是包含类别名的文本文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

E寻数据

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值