前言

之前我们已经训练了识别是否佩戴口罩的模型文件,可以有效识别人群是否口罩,本文将会讲解如何将识别到的目标裁剪出来

目标识别

需要指定 save_txt=True,保存数据标注文件 txt

yolo predict model=runs/detect/train26/weights/best.pt source=ultralytics/assets/mask save_txt=True

查看标注文件目录及文件格式

坐标转换

数据标注文件中格式(除类别之外都是归一化之后的值)

w:图片像素宽度

h:图片像素高度

0 0.301826 0.367765 0.123616 0.229143

label x_center y_center _width _height

x1=(x_center-width/2) * w

x2=(x_center+width/2) * w

y1=(y_center-height/2) * h

y2=(y_center+height/2) * h

剪裁脚本

import os

from PIL import Image

import shutil

def findSingleFile(path):

# 创建 cutpictures 文件夹(先判断)

cutp = os.path.join(path, "cutpictures")

# 判断文件夹是否存在

if os.path.exists(cutp):

# 如果文件夹存在,先删除再创建

# 递归删除文件夹

shutil.rmtree(cutp)

os.makedirs(cutp)

else:

# 如果文件夹不存在,直接创建

os.makedirs(cutp)

for filename in os.listdir(path):

if not os.path.isdir(os.path.join(path,filename)):

# 无后缀文件名

filename_nosuffix = filename.split(".")[0]

# 文件后缀

file_suffix = filename.split(".")[1]

# print(filename_nosuffix)

img_path = os.path.join(path,filename)

label_path = os.path.join(path,'labels',filename_nosuffix+".txt")

# print(img_path)

# print(label_path)

# 生成裁剪图片(遍历 txt 每一行)eg: mask_0_1.jpg

# 0 裁剪的图片序号 1 类别序号

img = Image.open(img_path)

w, h = img.size

with open(label_path, 'r+', encoding='utf-8') as f:

# 读取txt文件中的第一行,数据类型str

lines = f.readlines()

# 根据空格切割字符串,最后得到的是一个list

for index, line in enumerate(lines):

msg = line.split(" ")

category = int(msg[0])

x_center = float(msg[1])

y_center = float(msg[2])

width = float(msg[3])

height = float(msg[4])

x1 = int((x_center - width / 2) * w) # x_center - width/2

y1 = int((y_center - height / 2) * h) # y_center - height/2

x2 = int((x_center + width / 2) * w) # x_center + width/2

y2 = int((y_center + height / 2) * h) # y_center + height/2

# print(x1, ",", y1, ",", x2, ",", y2, "," ,category)

# 保存图片

img_roi = img.crop((x1, y1, x2, y2))

save_path = os.path.join(cutp, "{}_{}_{}.{}".format(filename_nosuffix, index, category, file_suffix))

img_roi.save(save_path)

print("裁剪图片存放目录:", cutp)

def main():

import argparse

# 创建 ArgumentParser 对象

parser = argparse.ArgumentParser(description='输入目标检测裁剪目录')

# 添加参数

parser.add_argument('--dir', help='目录名', required=True)

# 解析命令行参数

args = parser.parse_args()

dir = args.dir

# print('目录参数:', dir)

findSingleFile(dir)

return

if __name__ == '__main__':

main()

执行脚本(需要指定 --dir 目录位置参数)

python cutpictures.py --dir /home/hualiujie/baoxinshagnchuan/ultralytics-main-cgh/runs/detect/predict6

生成成功,文件名含义: {无后缀文件名}_{裁剪图片序号}_{标签类别序号}

参考文章

利用yolov5进行目标检测,并将检测到的目标裁剪出来_目标检测_小脑斧ai吃肉-华为云开发者联盟 (csdn.net)

本文由博客一文多发平台 OpenWrite 发布!

参考阅读

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。