当前位置: 首页 > news >正文

【深度学习】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

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

看起来任务是简单的:

在这里插入图片描述

相关文章:

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

文章目录 项目背景造数据训练 项目背景 在日常开发中,经常会遇到一些图片是由多个图片拼接来的,如下图就是三个图片横向拼接来的。是否可以利用yolov8-seg模型来识别出这张图片的三张子图区域呢,这是文本要做的事情。 造数据 假设拼接方式有…...

Python升级打怪—Django入门

目录 一、Django简介 二、安装Django 三、创建Dajngo项目 (一) 创建项目 (二) 项目结构介绍 (三) 运行项目 (四) 结果 一、Django简介 Django是一个高级Python web框架,鼓励快速开发和干净、实用的设计。由经验丰富的开发人员构建,它解决了web开…...

leetcode面试题17.最大子矩阵

sooooooo long没刷题了,汗颜 题目链接:leetcode面试题17 1.题目 给定一个正整数、负整数和 0 组成的 N M 矩阵,编写代码找出元素总和最大的子矩阵。 返回一个数组 [r1, c1, r2, c2],其中 r1, c1 分别代表子矩阵左上角的行号和…...

计算机网络:构建联结的基础

目录 1. 网络拓扑结构 1.1 星型拓扑 1.2 环型拓扑 1.3 总线型拓扑 1.4 网状拓扑 2. 传输介质 2.1 双绞线 2.2 同轴电缆 2.3 光纤 2.4 无线电波 3. 协议栈模型 3.1 OSI模型 3.2 TCP/IP模型 4. 网络设备 4.1 交换机 4.2 路由器 4.3 网关 4.4 防火墙 5. IP地址…...

node和npm安装;electron、 electron-builder安装

1、node和npm安装 参考: https://blog.csdn.net/sw150811426/article/details/137147783 下载: https://nodejs.org/dist/v20.15.1/ 安装: 点击下载msi直接运行安装 安装完直接cmd打开可以,默认安装就已经添加了环境变量&…...

操作系统概念(黑皮书)阅读笔记

操作系统概念(黑皮书)阅读笔记 进程和内存管理部分章节 导论: 操作系统类似于政府,其本身不能实现任何有用功能,而是提供一个方便其他程序执行有用工作的环境 ​ 个人理解:os是government的作用&#xff0…...

matlab gui下的tcp client客户端编程框架

GUI界面 函数外定义全局变量 %全局变量 global TcpClient; %matlab作为tcpip客户端 建立连接 在“连接”按钮的回调函数下添加以下代码: global TcpClient;%全局变量 TcpClient tcpip(‘192.168.1.10’, 7, ‘NetworkRole’,‘client’); %连接到服务器地址和端…...

Matplotlib : Python 的绘图库

Matplotlib 是一个 Python 的绘图库,广泛用于生成各种静态、动态、交互式的图表。它基于 NumPy,一个用于科学计算的 Python 库。Matplotlib 可以用于生成出版质量级别的图表,并且提供了丰富的定制选项,以适应不同用户的需求。以下…...

数据编织 VS 数据仓库 VS 数据湖

目录 1. 什么是数据编织?2. 数据编织的工作原理3. 代码示例4. 数据编织的优势5. 应用场景6. 数据编织 vs 数据仓库6.1 数据存储方式6.2 数据更新和实时性6.3 灵活性和可扩展性6.4 查询性能6.5 数据治理和一致性6.6 适用场景6.7 代码示例比较 7. 数据编织 vs 数据湖7.1 数据存储…...

CSS(十一)——CSS分组和嵌套,尺寸(Dimension)

CSS 分组 和 嵌套 选择器 分组选择器 举个例子,多个标签有同一个样式,就可以不一个一个分开写,使用分组选择器 比如: h1 {color:green; } h2 {color:green; } p {color:green; } 就可以写为: h1,h2,p {color…...

必备神器!三款优秀远程控制电脑软件推荐

嘿,各位职场小伙伴们,今儿个咱们来聊聊个挺实用又带点“科技范儿”的话题——电脑远程控制那点事儿。作为刚踏入职场不久的新人,我深刻体会到,在这信息爆炸的时代,掌握几招远程操作的技能,简直就是给自个儿…...

关于正运动学解机器人手臂算法

机器人正运动学是机器人学的一个分支,研究机器人的运动和位置之间的关系。它通过解析机器人的结构和关节参数,以及给定的关节角度,来计算机器人的末端执行器的位置和姿态。 机器人正运动学算法通常使用DH(Denavit-Hartenberg&…...

MySQL 约束 (constraint)

文章目录 约束(constraint)列级约束和表级约束给约束起名字(constraint)非空约束(no null)检查约束(check)唯一性约束 (unique)主键约束 (primary key)主键分类单一主键复合主键主键自增 (auto_increment) 外键约束外什…...

用python程序发送文件(python实例二十六)

目录 1.认识Python 2.环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3.文件上传 3.1 代码构思 3.2 服务端代码 3.3 客户端代码 3.4 运行结果 4.总结 1.认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具…...

最新源支付系统源码 V7版全开源 免授权 附搭建教程

本文来自:最新源支付系统源码 V7版全开源 免授权 附搭建教程 - 源码1688 简介: 最新源支付系统源码_V7版全开源_免授权_附详细搭建教程_站长亲测 YPay是专为个人站长打造的聚合免签系统,拥有卓越的性能和丰富的功能。它采用全新轻量化的界面…...

HTML:lang属性作用

lang作用 用法常见语言代码优点示例结构效果说明分析HTML 基础结构导航栏内容部分总结 扩展 用法 HTML 文档级别: 在 <html> 标签上使用 lang 属性&#xff0c;指定整个文档的语言。 <!DOCTYPE html> <html lang"en"> <head><meta charse…...

Android SurfaceFlinger——纹理的绘制流程(二十八)

在系统开机动画的播放流程中,会从给定的资源文件中加载纹理数据并初始化一个 OpenGL 纹理对象,这里我们就来解析软件模拟纹理的绘制流程。 一、纹理概述 在 Android 的 SurfaceFlinger 系统组件中,纹理(Texture)是一个核心概念,特别是在涉及到图形渲染和显示的过程中。 …...

深入解析Memcached:C#中的应用与实战案例

目录 Memcached简介Memcached的特点Memcached的工作原理Memcached的应用场景Memcached的安装和配置Memcached与C#的集成 引入依赖配置Memcached客户端C#代码示例 存储数据读取数据删除数据深入解析Memcached 数据存储和过期策略分布式架构性能优化实战案例 缓存数据库查询结果实…...

keyring 库

目录 安装 keyring 基本用法 1. 设置密码 2. 获取密码 3. 删除密码 4. 返回当前使用的默认密钥环 5. 列出所有密码 支持的后端 keyring 是一个 Python 库&#xff0c;用于将敏感信息&#xff08;如密码&#xff09;安全地存储在操作系统的密码管理器中。它支持多种平台…...

[css3] 如何设置边框颜色渐变

div {border: 4px solid;border-image: linear-gradient(to right, #8f41e9, #578aef) 1; }参考&#xff1a; 5种CSS实现渐变色边框&#xff08;Gradient borders方法的汇总...

Cursor Free VIP:如何轻松突破AI编程助手限制的完整指南

Cursor Free VIP&#xff1a;如何轻松突破AI编程助手限制的完整指南 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached your t…...

GitHub代码仓库导航:开发者如何高效构建与使用技术资源地图

1. 项目概述&#xff1a;一个面向开发者的代码仓库导航 最近在GitHub上闲逛&#xff0c;发现了一个挺有意思的仓库&#xff0c;叫 yeabnoah/vx_code 。乍一看这个标题&#xff0c;可能会有点摸不着头脑&#xff0c; vx_code 是什么&#xff1f;是某种新的编程语言&#xf…...

【限时技术白皮书】ElevenLabs藏文模型权重结构首度曝光:Transformer Decoder层中Tibetan Syllable Tokenization模块详解

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;ElevenLabs藏文语音生成技术全景概览 ElevenLabs 作为全球领先的文本到语音&#xff08;TTS&#xff09;平台&#xff0c;目前尚未官方支持藏文&#xff08;བོད་སྐད་&#xff09;语音合成。其公…...

构建高可用代理池:开源工具agentpull的架构解析与实战部署

1. 项目概述&#xff1a;一个轻量级、可编程的代理拉取工具最近在折腾一些自动化任务和分布式爬虫时&#xff0c;经常遇到一个头疼的问题&#xff1a;如何高效、稳定地管理海量的代理IP资源。无论是数据采集、社交媒体运营还是安全测试&#xff0c;一个可靠的代理池都是基础设施…...

基于NXP芯片的跳频技术如何构建高安全汽车无钥匙进入系统

1. 项目概述与核心价值最近几年&#xff0c;汽车的无钥匙进入与启动系统&#xff08;PEPS&#xff09;几乎成了新车的标配&#xff0c;但随之而来的安全挑战也日益严峻。你可能听说过&#xff0c;甚至亲身经历过&#xff0c;不法分子利用“中继攻击”设备&#xff0c;在车主不知…...

AppleJuice与法律边界:如何在教育框架内负责任地使用

AppleJuice与法律边界&#xff1a;如何在教育框架内负责任地使用 【免费下载链接】AppleJuice Apple BLE proximity pairing message spoofing 项目地址: https://gitcode.com/gh_mirrors/ap/AppleJuice AppleJuice作为一款专注于Apple BLE近距离配对消息模拟的开源项目…...

Android 显示框架:SurfaceFlinger与合成策略探析

1. SurfaceFlinger的核心角色解析 第一次拆解Android显示系统时&#xff0c;我被SurfaceFlinger这个名称逗笑了——"Surface抛洒者"&#xff1f;后来发现这个命名意外地准确。想象你正在布置多屏艺术展&#xff0c;SurfaceFlinger就是那个决定每幅画作展示位置、叠加…...

WinDirStat:Windows磁盘空间分析与清理的终极解决方案

WinDirStat&#xff1a;Windows磁盘空间分析与清理的终极解决方案 【免费下载链接】windirstat WinDirStat is a disk usage statistics viewer and cleanup tool for Microsoft Windows 项目地址: https://gitcode.com/gh_mirrors/wi/windirstat WinDirStat是一款专为W…...

科技中介机构如何提升服务能力与客户转化率?

观点作者&#xff1a;科易网-国家科技成果转化&#xff08;厦门&#xff09;示范基地 一、现状概述&#xff1a;科技成果转化中的“最后一公里”困境 近年来&#xff0c;我国科技创新投入持续增长&#xff0c;技术产出规模不断扩大。然而&#xff0c;科技成果从实验室走向市场、…...

如何高效使用大麦网抢票脚本:5分钟快速上手终极指南

如何高效使用大麦网抢票脚本&#xff1a;5分钟快速上手终极指南 【免费下载链接】DamaiHelper 大麦网演唱会演出抢票脚本。 项目地址: https://gitcode.com/gh_mirrors/dama/DamaiHelper 还在为抢不到心仪的演唱会门票而烦恼吗&#xff1f;面对秒光的票源和昂贵的黄牛票…...