【深度学习】yolov8-det目标检测训练,拼接图的分割复原

项目背景

https://blog.csdn.net/x1131230123/article/details/140606459

似乎这个任务是简单的,利用目标检测是否可以完成得好呢?

生成数据集

利用这个代码产生数据集:

为了将标签转换为YOLOv5格式,需要将左上角和右下角的坐标转换为YOLO格式的中心点坐标和宽高。YOLOv5标签格式是这样的:

\text{{class}} , \text{{x_center}} , \text{{y_center}} , \text{{width}} , \text{{height}}

其中,(\text{{x_center}})、(\text{{y_center}})、(\text{{width}})和(\text{{height}})都是相对于图片宽度和高度的归一化值。以下是修改后的代码:

import os
import random
from PIL import Imagedef list_path_all_files(dirname):result = []for maindir, subdir, file_name_list in os.walk(dirname):for filename in file_name_list:if filename.lower().endswith('.jpg'):apath = os.path.join(maindir, filename)result.append(apath)return resultdef resize_image(image, target_size, resize_by='height'):w, h = image.sizeif resize_by == 'height':if h != target_size:ratio = target_size / hnew_width = int(w * ratio)image = image.resize((new_width, target_size), Image.ANTIALIAS)elif resize_by == 'width':if w != target_size:ratio = target_size / wnew_height = int(h * ratio)image = image.resize((target_size, new_height), Image.ANTIALIAS)return imagedef create_2x2_image(images):target_size = (640, 640)new_image = Image.new('RGB', (1280, 1280))coords = []for i, img in enumerate(images):img = img.resize(target_size, Image.ANTIALIAS)if i == 0:new_image.paste(img, (0, 0))coords.append((0, 0, 640, 640))elif i == 1:new_image.paste(img, (640, 0))coords.append((640, 0, 1280, 640))elif i == 2:new_image.paste(img, (0, 640))coords.append((0, 640, 640, 1280))elif i == 3:new_image.paste(img, (640, 640))coords.append((640, 640, 1280, 1280))return new_image, coordsdef concatenate_images(image_list, mode='horizontal', target_size=768):if mode == 'horizontal':resized_images = [resize_image(image, target_size, 'height') for image in image_list]total_width = sum(image.size[0] for image in resized_images)max_height = target_sizenew_image = Image.new('RGB', (total_width, max_height))x_offset = 0coords = []for image in resized_images:new_image.paste(image, (x_offset, 0))coords.append((x_offset, 0, x_offset + image.size[0], max_height))x_offset += image.size[0]elif mode == 'vertical':resized_images = [resize_image(image, target_size, 'width') for image in image_list]total_height = sum(image.size[1] for image in resized_images)max_width = target_sizenew_image = Image.new('RGB', (max_width, total_height))y_offset = 0coords = []for image in resized_images:new_image.paste(image, (0, y_offset))coords.append((0, y_offset, max_width, y_offset + image.size[1]))y_offset += image.size[1]return new_image, coordsdef generate_labels(coords, image_size):labels = []width, height = image_sizefor coord in coords:x_min, y_min, x_max, y_max = coordx_center = (x_min + x_max) / 2.0 / widthy_center = (y_min + y_max) / 2.0 / heightbox_width = (x_max - x_min) / widthbox_height = (y_max - y_min) / heightlabels.append(f"0 {x_center} {y_center} {box_width} {box_height}")return labelsdef generate_dataset(image_folder, output_folder, label_folder, num_images):image_paths = list_path_all_files(image_folder)if not os.path.exists(output_folder):os.makedirs(output_folder)if not os.path.exists(label_folder):os.makedirs(label_folder)for i in range(num_images):random_choice = random.randint(1, 6)if random_choice == 1:selected_images = [Image.open(random.choice(image_paths)) for _ in range(2)]new_image, coords = concatenate_images(selected_images, mode='horizontal')elif random_choice == 2:selected_images = [Image.open(random.choice(image_paths)) for _ in range(3)]new_image, coords = concatenate_images(selected_images, mode='horizontal')elif random_choice == 3:selected_images = [Image.open(random.choice(image_paths)) for _ in range(2)]new_image, coords = concatenate_images(selected_images, mode='vertical')elif random_choice == 4:selected_images = [Image.open(random.choice(image_paths)) for _ in range(3)]new_image, coords = concatenate_images(selected_images, mode='vertical')elif random_choice == 5:selected_images = [Image.open(random.choice(image_paths)) for _ in range(4)]new_image, coords = create_2x2_image(selected_images)elif random_choice == 6:# Single image caseselected_images = [Image.open(random.choice(image_paths))]new_image = selected_images[0]coords = [(0, 0, new_image.size[0], new_image.size[1])]output_image_path = os.path.join(output_folder, f'composite_image_{i + 1:06d}.jpg')new_image.save(output_image_path, 'JPEG')label_path = os.path.join(label_folder, f'composite_image_{i + 1:06d}.txt')labels = generate_labels(coords, new_image.size)with open(label_path, 'w') as label_file:for label in labels:label_file.write(label + '\n')# 示例用法
image_folder = '/ssd/xiedong/datasets/multilabelsTask/multilabels_new/'
output_folder = '/ssd/xiedong/yolov8detdir/composite_images/train/images/'
label_folder = '/ssd/xiedong/yolov8detdir/composite_images/train/labels/'
num_images = 8000
generate_dataset(image_folder, output_folder, label_folder, num_images)

修改后的 generate_labels 函数将坐标转换为YOLOv5标签格式。生成的标签文件会包含每个图像中的标签,格式为 “0 x_center y_center width height”。

训练

data_det.yaml:

path: /ssd/xiedong/yolov8detdir/composite_images
train: train/images # train images (relative to 'path') 128 images
val: val/images # val images (relative to 'path') 128 images
test: # test images (optional)# Classes
names:0: paper

x03train_det.py:

from ultralytics import YOLO# Load a model
model = YOLO("yolov8m.pt")  # load a pretrained model (recommended for training)project = "/ssd/xiedong/yolov8detdir/paperdet"
# Train the model with 2 GPUs
results = model.train(data="data_det.yaml", epochs=50, imgsz=640, device=[2, 3], batch=180, project=project)

启动容器:

docker run -it --gpus all   --shm-size=8g -v /ssd/xiedong/yolov8detdir:/ssd/xiedong/yolov8detdir ultralytics/ultralytics:8.2.62  bash

启动训练:

cd /ssd/xiedong/yolov8detdir
python -m torch.distributed.run --nproc_per_node 2 x03train_det.py

推理

/ssd/xiedong/yolov8detdir/paperdet/train2/weights/best.pt
from ultralytics import YOLO# Load a model
model = YOLO("/ssd/xiedong/yolov8detdir/paperdet/train2/weights/best.pt")  # pretrained YOLOv8n model# Run batched inference on a list of images
results = model(["composite_image_000006.jpg"])  # return a list of Results objects# Process results list
for result in results:boxes = result.boxes  # Boxes object for bounding box outputsmasks = result.masks  # Masks object for segmentation masks outputskeypoints = result.keypoints  # Keypoints object for pose outputsprobs = result.probs  # Probs object for classification outputsobb = result.obb  # Oriented boxes object for OBB outputsresult.save(filename="result.jpg")  # save to disk

推理效果是很好的:
在这里插入图片描述

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

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

相关文章

【性能测试-登录时密码加密存储如何传参】

目的】 登录接口,密码加密传输,开发不做处理的情况下,密码如何加密传输 【方案】 使用前置处理器:JSR223 预处理程序,主要是在执行登录接口前将密码按照加密算法获得对应的加密密码,并传入接口 【说明】前…

如何对视频文件加密_如何加密视频文件_视频文件如何加密

“嘿,小李,你知道咱们公司的新项目资料都是视频形式的吗?这些视频里有很多机密信息,我们需要好好保护起来。” “是啊,我也在想这个问题。你有没有什么好办法来加密这些视频文件呢?” “我听说有个叫域智盾…

生成式AI的双重路径:Chat与Agent的融合与竞争

文章目录 每日一句正能量前言整体介绍对话系统(Chat)自主代理(Agent)结论 技术对比技术差异优势与劣势技术挑战结论 未来展望发展趋势Chat与Agent的前景社会和经济影响结论 后记 每日一句正能量 在避风的港湾里,找不到…

代码随想录算法训练营第38天|LeetCode 322. 零钱兑换、279.完全平方数、139.单词拆分

1. LeetCode 322. 零钱兑换 题目链接:https://leetcode.cn/problems/coin-change/description/ 文章链接:https://programmercarl.com/0322.零钱兑换.html 视频链接:https://www.bilibili.com/video/BV14K411R7yv/ 思路: 硬币无限…

实现领域驱动设计(DDD)系列详解:领域模型的持久化

领域驱动设计主要通过限界上下文应对复杂度,它是绑定业务架构、应用架构和数据架构的关键架构单元。设计由领域而非数据驱动,且为了保证定义了领域模型的应用架构和定义了数据模型的数据架构的变化方向相同,就应该在领域建模阶段率先定义领域…

我的世界!

每位冒险家在《我的世界》中的出生点都各不相同, 有的出生在桦木森林,有的出生在草原, 还有的出生在临近海洋的沙滩。 这些环境叫做生物群系,也常被称为生态系统。 在《我的世界》中的不同生物群系具有不同的地域特色—— 不…

本地化部署一个简单的AI大模型,Llama3.1

7 月 23 日消息,Meta 今晚正式发布llama3.1,提供 8B、70B 及 405B 参数版本。 Meta 称 4050 亿参数的 Llama 3.1-405B 在常识、可引导性、数学、工具使用和多语言翻译等一系列任务中,可与 GPT-4、GPT-4o、Claude 3.5 Sonnet 等领先的闭源模型…

Qt遇到qt自身组件找不到

比如在使用qtcharts的时候,找不到 解决方法: 在cmakelist中添加 find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Charts REQUIRED) 是一个 CMake 命令,用于查找并配置 Qt 库中的特定组件。这条命令的作用是找到 Qt 的主要版本(…

ST Stellar-E SR5E1 22KW OBC combo 3KW DC-DC汽车充电器解决方案

对于全球的环境保护意识抬头,全球的汽车产业慢慢步入电动化的时代,以减少碳排放。整车系统主要是由电池、电驱、电控的三电所构成,其中电池系统是整车的动力来源,而对电池充电的OBC系统更甚重要。一具高度安全性且高效的OBC系统&a…

MybatisPlus设置动态表名

对于一些数据量比较大的表,为了提高查询性能,我们一般将表拆分成多张表,常见的是根据数据量,按年分表或者按月分表;分表虽然太高了查询性能,但是在查询的时候,如何才能查询执行分表数据呢&#…

7.25扣...

思路:别的语言都可以不用辅助数组,我Java就得用! c:先计算字符串中数字个数,然后利用双指针将原本字符串逆序从数组最后往前插入,若遇到数字则替换为逆序的“number”,这个过程会使新字符串从后往前覆盖&am…

UI界面卡顿检测工具--UIHaltDetector

引言: 在日常工作当中,我们经常会遇到软件的界面出现卡顿的问题,而为了确定卡顿原因,我特地写了一个UI界面卡顿的小工具:UIHaltDetector;该工具可以在检测到目标窗口出现卡顿的时候直接打印堆栈日志和输出…

MySQL SQL 编程练习

目录 创建表并插入数据 查看表结构 创建触发器 创建INSERT 触发器 创建DELETE 触发器 创建更新触发器 创建存储过程 创建提取emp_new表所有员工姓名和工资的存储过程s1 创建存储过程s2,实现输入员工姓名后返回员工的年龄 创建一个存储过程s3,有2个参数&…

springboot校园商店配送系统-计算机毕业设计源68448

摘要 本文详细阐述了基于Spring Boot框架的校园商店配送系统的设计与实现过程。该系统针对校园内的用户需求,整合了用户注册与登录、商品浏览与购买、订单管理、配送追踪、用户反馈收集以及后台管理等功能,为校园内的普通用户、商家、配送员和管理员提供…

算法与算法分析

目录 一.前言 二.算法的特性和要求 三.分析算法--时间效率 四. 分析算法--空间效率 一.前言 算法就是对特定问题求解方法和步骤的一种描述,它是指令的有限序列。其中,每个指令表示一个或多个操作。总而言之,我们数据结构就是通过算法实现操…

FPGA实现LCD1602控制

目录 注意! 本工程采用野火征途PRO开发板,外接LCD1602部件进行测试。 有偿提供代码!!!可以定制功能!!! 联系方式见底部 一、基础知识 1.1 引脚信息 1.2 指令 1.2.1 清屏 1.…

【有效的括号】

有效的括号 一、题目二、思路三、代码 一、题目 二、思路 利用栈先进后出的特点存储左括号:后面遍历遇到的左括号要先闭合 用map存储左括号与右括号的对应关系,利用键值对快速查找右括号进行匹配 三、代码 使用.has()方法判断当前遍历的字符是否是右括…

项目架构知识点总结

项目架构知识点总结 【一】重要注解【1】SpringBootApplication(1)⭐️ComponentScan 注解(2)⭐️EnableAutoConfiguration 注解(3)⭐️SpringBootConfiguration 注解(4)Inherited 注…

vite+cesium+天地图

创建vite项目 直接在地址栏输入cmd进入命令行(vite项目默认为vue3) # yarn yarn create vite 项目名称 --template vue 创建成功后依次执行 yarn install yarn dev 安装cesium和vite-plugin-cesium 没有加版本号默认为最新版本 加版本号如cesium1.1…

sql注入的专项练习 sqlilabs(含代码审计)

在做题之前先复习了数据库的增删改查,然后自己用本地的环境,在自己建的库里面进行了sql语句的测试,主要是回顾了一下sql注入联合注入查询的语句和sql注入的一般做题步骤。 1.获取当前数据库 2.获取数据库中的表 3.获取表中的字段名 一、sql…