【附源码】YOLOv8:批量处理图片与目标检测裁剪

打印 上一主题 下一主题

主题 1536|帖子 1536|积分 4608

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
系列文章目次

机器学习:批量处理图片与目标检测裁剪


  

前言

提示:这里可以添加本文要记录的大概内容:
YOLOv8是一个高效且正确的目标检测模型,可以或许实现对图像中物体的检测和定位。根据需求,我们希望利用YOLOv8模型通过返回的坐标来裁剪标签内容图片,并将其生存到本地。下面内容是一个基于Python的实现方法,该方法利用了ultralytics库来加载和运行YOLOv8模型,并对检测到的物体进行裁剪和生存操纵。

一、单一照片处理与裁剪

1.源代码

   代码如下(示例):
  1. from ultralytics import YOLO
  2. import cv2
  3. import os
  4. # 加载模型,根据实际使用的模型进行替换
  5. model = YOLO("yolov8n.pt")
  6. # 假设已经有了要处理的图像路径列表
  7. image_files = ['path/to/your/image1.jpg']
  8. #image_files = ['path/to/your/image1.jpg', 'path/to/your/image2.jpg']
  9. # 指定裁剪图像的保存目录
  10. crop_dir_name = "save"
  11. if not os.path.exists(crop_dir_name):
  12.     os.mkdir(crop_dir_name)
  13. # 对每张图像进行处理
  14. for image_file in image_files:
  15.     # 读取图像
  16.     im0 = cv2.imread(image_file)
  17.    
  18.     # 使用模型进行预测,不显示结果
  19.     results = model.predict(im0, show=False)
  20.    
  21.     # 获取检测结果中的边界框
  22.     boxes = results[0].boxes.xyxy.cpu().numpy()  # xyxy格式的边界框坐标
  23.     clss = results[0].boxes.cls.cpu().numpy()  # 检测到的类别编号
  24.    
  25.     # 遍历每个检测到的物体
  26.     for box, cls in zip(boxes, clss):
  27.         # 根据边界框坐标裁剪图像
  28.         crop_obj = im0[int(box[1]):int(box[3]), int(box[0]):int(box[2])]
  29.         
  30.         # 保存裁剪后的图像到指定目录
  31.         save_path = os.path.join(crop_dir_name, f"{os.path.basename(image_file)}_{cls}.png")
  32.         cv2.imwrite(save_path, crop_obj)
  33. # 注意:上述代码中的"yolov8n.pt"是模型权重文件的路径,根据实际情况替换为的模型文件路径。
复制代码
2.代码分析

这段代码首先加载了YOLOv8模型,然后对指定目次下的每张图像进行处理,利用模型检测图像中的物体,并将检测到的物体根据界限框坐标进行裁剪,最后将裁剪后的图像生存到本地目次中。

二、多个照片处理与裁剪(指定文件夹)

1.源代码

   代码如下(示例):
  1. from ultralytics import YOLO
  2. import cv2
  3. import os
  4. import numpy as np
  5. # 初始化YOLOv8模型,这里使用yolov8n.pt作为示例
  6. model = YOLO("best.pt")
  7. # 指定包含图片的文件夹路径
  8. image_folder = 'C:xxx/保存照片地点'
  9. # 指定裁剪后图片的保存目录
  10. crops_folder = 'C:xxx/推理照片地点'
  11. if not os.path.exists(crops_folder):
  12.     os.makedirs(crops_folder)
  13. # 获取所有图片文件的路径
  14. image_files = [os.path.join(image_folder, f) for f in os.listdir(image_folder) if
  15.                f.endswith(('jpg', 'png', 'jpeg', 'bmp'))]
  16. # 遍历所有图片文件
  17. for image_file in image_files:
  18.     # 读取图片
  19.     im0 = cv2.imread(image_file)
  20.     if im0 is None:
  21.         print(f"Warning: {image_file} is not a valid image and will be skipped.")
  22.         continue
  23.     # 使用模型进行预测,不显示结果
  24.     results = model.predict(source=image_file, show=False)  # 确保source参数正确传递
  25.     # 检查results是否为列表
  26.     if isinstance(results, list):
  27.         # 遍历每个检测结果
  28.         for result in results:
  29.             # 获取边界框和类别
  30.             boxes = result.boxes.xyxy.cpu().numpy()  # 获取xyxy格式的边界框坐标
  31.             clss = result.boxes.cls.cpu().numpy()    # 获取检测到的类别编号
  32.             # 裁剪和保存图片
  33.             for idx, (box, cls) in enumerate(zip(boxes, clss)):
  34.                 x1, y1, x2, y2 = box
  35.                 crop_img = im0[int(y1):int(y2), int(x1):int(x2)]
  36.                 # 保存裁剪后的图片
  37.                 save_path = os.path.join(crops_folder, f"{os.path.basename(image_file).split('.')[0]}_{idx}_{int(cls)}.png")
  38.                 cv2.imwrite(save_path, crop_img)
  39.                 print(f"Saved cropped image to {save_path}")
  40.     else:
  41.         print(f"No detection results for {image_file}")
  42. print("Image processing completed.")
复制代码
2.代码分析

这段代码会遍历指定文件夹中的全部图片文件,对每张图片利用YOLOv8模型进行目标检测,并将检测到的每个物文体剪成单独的图片,生存到指定的文件夹中。图片的命名格式为原始图片名称加上检测到物体的索引和种别编号。
记得更换image_folder和crops_folder为自己的图片文件夹路径和裁剪图片的生存路径。此外,根据自己的YOLOv8模型文件的实际路径,调整YOLO()构造函数中的参数。

总结

以上就是本日要讲的内容,本文仅仅简朴介绍了YOLOv8批量处理图片与目标检测裁剪的方法,如果对您有帮助,还请点个赞吧 (OvO)

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大号在练葵花宝典

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表