【深度学习】yolov8-seg分割训练,拼接图的分割复原

文章目录

  • 项目背景
  • 造数据
  • 训练

项目背景

在日常开发中,经常会遇到一些图片是由多个图片拼接来的,如下图就是三个图片横向拼接来的。是否可以利用yolov8-seg模型来识别出这张图片的三张子图区域呢,这是文本要做的事情。

在这里插入图片描述

造数据

假设拼接方式有:横向拼接2张图为新图(最短边是高reisze到768,另一边等比resize)、横向拼接3张图为新图(最短边是高reisze到768,另一边等比resize)、纵向拼接2张图为新图(最短边是高reisze到768,另一边等比resize)、纵向拼接3张图为新图(最短边是高reisze到768,另一边等比resize)、拼接一个22的图(每张图大小resize到一样,总大小12901280)。

这个代码会造分割数据。

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, 0, 640, 640, 0, 640))elif i == 1:new_image.paste(img, (640, 0))coords.append((640, 0, 1280, 0, 1280, 640, 640, 640))elif i == 2:new_image.paste(img, (0, 640))coords.append((0, 640, 640, 640, 640, 1280, 0, 1280))elif i == 3:new_image.paste(img, (640, 640))coords.append((640, 640, 1280, 640, 1280, 1280, 640, 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], 0, x_offset + image.size[0], max_height, x_offset, 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, max_width, y_offset + image.size[1], 0, 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:x1, y1, x2, y2, x3, y3, x4, y4 = coordx1 /= widthy1 /= heightx2 /= widthy2 /= heightx3 /= widthy3 /= heightx4 /= widthy4 /= heightlabels.append(f"0 {x1:.5f} {y1:.5f} {x2:.5f} {y2:.5f} {x3:.5f} {y3:.5f} {x4:.5f} {y4:.5f}")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, 5)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)output_image_path = os.path.join(output_folder, f'composite_image_paper_{i + 1:06d}.jpg')new_image.save(output_image_path, 'JPEG')label_path = os.path.join(label_folder, f'composite_image_paper_{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/10025doc_textPaperShot/'
# image_folder = '/ssd/xiedong/datasets/multilabelsTask/multilabels_new/'
output_folder = '/ssd/xiedong/datasets/composite_images_yolov8seg/images'
label_folder = '/ssd/xiedong/datasets/composite_images_yolov8seg/labels'
num_images = 10000
generate_dataset(image_folder, output_folder, label_folder, num_images)

有的图片还是很有难度的,比如这张图,分界不明显,模型是否能搞定是个未知数。当然,我会认为模型可以在一定程度上识别语义或者排版,还是有几率可以识别对的。

在这里插入图片描述

训练

我想得到一个后续可以直接用的环境,我直接用docker搞个环境。搞的过程:

docker run -it --gpus all --net host  --shm-size=8g -v /ssd/xiedong/yolov8segdir:/ssd/xiedong/yolov8segdir ultralytics/ultralytics:8.2.62  bash
docker tag ultralytics/ultralytics:8.2.62 kevinchina/deeplearning:ultralytics-8.2.62
docker push kevinchina/deeplearning:ultralytics-8.2.62

写一个数据集data.yaml:

cd /ssd/xiedong/yolov8segdir
vim data.yaml
path: /ssd/xiedong/yolov8segdir/composite_images_yolov8seg
train: images # train images (relative to 'path') 128 images
val: images # val images (relative to 'path') 128 images
test: # test images (optional)# Classes
names:0: paper

执行这个代码开始训练模型:

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

代码会自动下载这个模型到本地,网络问题,也可能需要自己用wget下载到当前训练代码的执行目录。

https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8m-seg.pt

开始训练:

python -m torch.distributed.run --nproc_per_node 3 x03train.py

这样训练就可以了:
在这里插入图片描述

看起来任务是简单的:

在这里插入图片描述

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

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

相关文章

生成式AI与自然语言处理的结合-提升生成式AI的语言理解能力

引言 近年来,生成式AI已逐渐成为科技发展的前沿领域,其未来发展方向备受关注。对于人类生活和工作方式的影响,生成式AI在对话系统(Chat)和自主代理(Agent)中的表现引发了广泛讨论。本文将全面探…

Postman中的API Schema验证:确保响应精准无误

Postman中的API Schema验证:确保响应精准无误 在API开发和测试过程中,验证响应数据的准确性和一致性是至关重要的。Postman提供了一个强大的功能——API Schema验证,它允许开发者根据预定义的JSON Schema来检查API响应。本文将详细介绍如何在…

微软全球蓝屏带来的思考及未来战争走向

微软全球蓝屏事件不仅揭示了技术层面的问题和挑战,还引发了对未来战争走向的一些深入思考。以下是关于这些思考的内容: 微软全球蓝屏带来的思考: 系统稳定性与安全性:微软全球蓝屏事件凸显了操作系统稳定性和安全性的重要性。一…

Oracle配置TCPS加密协议测试

文章目录 一、环境信息二、配置过程1.创建证书2.监听配置2.1.配置sqlnet.ora2.2.配置listener.ora文件2.3.配置tnsnames.ora文件2.4.重载监听 3.数据库本地测试3.1. tcps登录测试3.2.日志监控 一、环境信息 操作系统:Linux 版本信息:Oracle 19c 参考文档…

asp.net core 集成redis详解

ASP.NET Core 集成 Redis 详解如下: 目录 一、Redis简介 二、在ASP.NET Core中集成Redis 三、Redis的高级用法 四、注意事项 一、Redis简介 Redis是一个开源的内存数据结构存储系统,它可以用作数据库、缓存和消息代理。Redis内置了复制、Lua脚本、…

在可编辑 div (contentEditable)末尾插入换行符(\n 或 \<br\>)无效的解决办法

背景: 给可编辑 div 末尾插入换行符, 发现仍然未换行; 解决方法: 提前给 div 末尾插入一个 <br> 就行了, 之后看自己情况要不要去掉 示例代码: // 如果输入框末尾没有 BR 换行符, 则自动加一个, 避免 Ctrl Enter 两次才显示 const currLastEl dom_input.lastElement…

缓存框架 Caffeine 的可视化探索与实践

作者&#xff1a;vivo 互联网服务器团队- Wang Zhi Caffeine 作为一个高性能的缓存框架而被大量使用。本文基于Caffeine已有的基础进行定制化开发实现可视化功能。 一、背景 Caffeine缓存是一个高性能、可扩展、内存优化的 Java 缓存库&#xff0c;基于 Google 的 Guava Cac…

Ubuntu20.04 设置静态ip

Ubuntu 从 17.10 开始&#xff0c;已放弃在 /etc/network/interfaces 里固定 IP 的配置&#xff0c;interfaces 文件不复存在&#xff0c;即使配置也不会生效&#xff0c;而是改成 netplan 方式 &#xff0c;配置写在 /etc/netplan/01-netcfg.yaml &#xff0c;50-cloud-init.y…

机器学习笔记-02-基础线性算法认识(问题-解答自查版)

前言 以下问题以Q&A形式记录&#xff0c;基本上都是笔者在初学一轮后&#xff0c;掌握不牢或者频繁忘记的点 Q&A的形式有助于学习过程中时刻关注自己的输入与输出关系&#xff0c;也适合做查漏补缺和复盘。 本文可以让读者用作自查&#xff0c;答案在后面&#xff0…

跟《经济学人》学英文:2024年07月20日这期 At last, Wall Street has something to cheer

At last, Wall Street has something to cheer 华尔街终于有值得欢呼的事情了 at last&#xff1a;终于&#xff1b;最后&#xff1b; Consumer banks, on the other hand, are starting to suffer 原文&#xff1a; Capital markets are twitchy. When interest rates spi…

数据危机!4大硬盘数据恢复工具,教你如何正确挽回珍贵记忆!

在这个数字化的时代&#xff0c;硬盘里的数据对我们来说简直太重要了。但糟糕的是&#xff0c;数据丢失这种事时不时就会发生&#xff0c;可能是因为不小心删了&#xff0c;硬盘坏了&#xff0c;或者中了病毒。遇到这种情况&#xff0c;很多人可能就慌了&#xff0c;不知道怎么…

货架管理a

路由->vue的el标签->Api->call方法里calljs的api接口->数据声明const xxxData-> 编辑按钮:点击跳出页面并把这一行的数据给到表单formDataba2 保存按钮:formDataba2改过的数据->xxApi发送->查询Api 跳转仓库:把tableData.value数据清空->callXxxAp…

Windows环境下安装Redis并设置Redis开机自启

文章目录 0. 前言1. 下载 Windows 版本的Redis2. 为 Redis 设置连接密码&#xff08;可选&#xff09;3. 启动 Redis4. 设置 Redis 开机自启4.1 将 Redis 进程注册为服务4.2 设置 Redis 服务开机自启4.3 重启电脑测试是否配置成功4.4 关闭 Redis 开机自启&#xff08;拓展&…

Typora笔记上传到CSDN

1.Typora 安装 Typora链接&#xff1a;百度网盘 提取码&#xff1a;b6d1 旧版本是不需要破解的 后来的版本比如1.5.9把放在typora的根目录下就可以了 2.上传到CSDN 步骤 csdn 写文章-使用MD编辑器-导入本地md文件即可 问题 图片没法显示 原因 图片的链接是本地的 当然没法…

Ubuntu 24 PXE Server bios+uefi 自动化部署esxi 6 7 8

pxe server 前言 PXE(Preboot eXecution Environment,预启动执行环境)是一种网络启动协议,允许计算机通过网络启动而不是使用本地硬盘。PXE服务器是实现这一功能的服务器,它提供了启动镜像和引导加载程序,使得客户端计算机可以通过网络启动并安装操作系统或运行其他软件…

java学习记录09:Lambda表达式与引用

Lambda表达式 例子&#xff1a; &#xff08;o1&#xff0c;o2&#xff09; -> Interger.compare(o1,o2); 格式&#xff1a; -> : lambda操作符 -> 的左边: lambda形参列表&#xff0c;对应着要重写的接口中的抽象方法的形参列表。 ->的右边&#xff1a;lamb…

python编程表白爱心代码,来自程序员的浪漫!

Python爱心表白代码 感觉的紫色要更加浪漫&#xff0c;其中的文字也是可以直接更改的&#xff0c;非常方便 <文末附带精品籽料> 改变爱心的颜色: 在源代码的13-15行位置&#xff0c;可以通过更改16进制颜色色值进行改变爱心的颜色&#xff0c;这里小编改了一点绿色&…

阶层差异下的社会角色与认知逻辑

阶层差异下的社会角色与认知逻辑 在中国传统文化中&#xff0c;有句古话&#xff1a;“仗义每从屠狗辈&#xff0c;负心多是读书人。”这句话揭示了不同社会阶层的人&#xff0c;在认知和行为上存在的差异。 社会底层&#xff1a;道德与情感的坚守者 社会底层人群&#xff0c…

05 循环神经网络

目录 1. 基本概念 2. 简单循环网络 2.1 简单循环网络 2.2 长程依赖问题 3. 循环神经网络的模式与参数学习 3.1 循环神经网络的模式 3.2 参数学习 4. 基于门控的循环神经网络 4.1 长短期记忆网络 4.2 LSTM网络的变体网络 4.3 门控循环单元网络 5. 深层循环神经网络…

ios 企业签名证书购买_iOS苹果企业签名须知

很多用户在初次或者说是已经使用过苹果签名服务的都会就直接问别人多少钱&#xff0c;那这个到底是多少钱合理呢&#xff1f;就目前市场上来讲这个价格太多了最低的有100元最高的也有1000元的或是更高的&#xff0c;是不是价格高的就贵呢&#xff1f; 在这想告诉大家其实不贵&…