基于yolov8的版面分析AI能力生产全流程

news2024/11/19 17:08:47

目录

1.coco数据集

1.1 基本定义

1.2应用场景

1.3 数据结构

2.labelme标注工具

2.1 基本定义

2.2 应用场景

2.3 安装步骤

3. 模型训练

3.1 数据标注

3.2 环境准备

3.3 数据预处理

3.4 模型训练

3.5 模型推理

4.参考链接

1.coco数据集

1.1 基本定义

COCO数据集是指Common Objects in Context数据集,是一个用于目标检测、图像分割和图像标注任务的知名数据集。COCO数据集由微软研究院创建,旨在提供更广泛的物体类别和更丰富的场景上下文,以促进计算机视觉领域的研究。

1.2应用场景

object instances(目标实例)

object keypoints(目标上的关键点)

image captions(看图说话)

1.3 数据结构

基本数据结构包含info、image、license,使用JSON文件存储。以Object Instance为例,json示例如下:

{

    "info": info,               # dict

    "licenses": [license],      # list,内部是dict

    "images": [image],          # list,内部是dict

    "annotations": [annotation],# list,内部是dict

    "categories": [category]    # list,内部是dict

}

info{                           # 数据集信息描述

    "year": int,                # 数据集年份

    "version": str,             # 数据集版本

    "description": str,         # 数据集描述

    "contributor": str,         # 数据集提供者

    "url": str,                 # 数据集下载链接

    "date_created": datetime,   # 数据集创建日期

}

license{

    "id": int,

    "name": str,

    "url": str,

}

image{      # images是一个list,存放所有图片(dict)信息。image是一个dict,存放单张图片信息

    "id": int,                  # 图片的ID编号(每张图片ID唯一)

    "width": int,               # 图片宽

    "height": int,              # 图片高

    "file_name": str,           # 图片名字

    "license": int,             # 协议

    "flickr_url": str,          # flickr链接地址

    "coco_url": str,            # 网络连接地址

    "date_captured": datetime,  # 数据集获取日期

}

annotation{ # annotations是一个list,存放所有标注(dict)信息。annotation是一个dict,存放单个目标标注信息。

    "id": int,                  # 目标对象ID(每个对象ID唯一),每张图片可能有多个目标

    "image_id": int,            # 对应图片ID

    "category_id": int,         # 对应类别ID,与categories中的ID对应

    "segmentation": RLE or [polygon],   # 实例分割,对象的边界点坐标[x1,y1,x2,y2,....,xn,yn]

    "area": float,              # 对象区域面积

    "bbox": [xmin,ymin,width,height], # 目标检测,对象定位边框[x,y,w,h]

    "iscrowd": 0 or 1,          # 表示是否是人群

}

categories{                     # 类别描述

    "id": int,                  # 类别对应的ID(0默认为背景)

    "name": str,                # 子类别名字

    "supercategory": str,       # 主类别名字

}

COCO格式数据集的目录结构如下:

train2017是训练集数据

val2017是验证集数据

annotations是基于train2017、val2017原始数据的标注文件

注:标注文件是json格式且文件名称以instances_开头

目录结构示例如下:

COCO_ROOT #根目录

├── annotations # 存放json格式的标注

│ ├── instances_train2017.json

│ └── instances_val2017.json

└── train2017 # 存放图片文件

│ ├── 000000000001.jpg

│ ├── 000000000002.jpg

│ └── 000000000003.jpg

└── val2017

├── 000000000004.jpg

└── 000000000005.jpg

2.labelme标注工具

2.1 基本定义

Labelme 是一个图形界面的图像标注软件。其的设计灵感来自于 http://labelme.csail.mit.edu/ 。它是用 Python 语言编写的,图形界面使用的是 Qt(PyQt)。

2.2 应用场景

对图像进行多边形,矩形,圆形,多段线,线段,点形式的标注(可用于目标检测,图像分割,等任务)。

对图像进行进行 flag 形式的标注(可用于图像分类 和 清理 任务)。

视频标注

生成 VOC 格式的数据集(for semantic / instance segmentation)

生成 COCO 格式的数据集(for instance segmentation)

2.3 安装步骤

pip install labelme -i https://pypi.tuna.tsinghua.edu.cn/simple

3.模型训练

3.1数据标注

label.txt

__ignore__

_background_

Text

Title

Figure

Figure caption

Table

Table caption

Header

Footer

Reference

Equation

对图片区域进行打标签

# 格式: labelme 图片路径 --labels 标签路径

labelme image_file --labels labels.txt

生成image.json

{

  "version": "5.2.1",

  "flags": {},

  "shapes": [

    {

      "label": "Title",

      "points": [

        [

          237.36842105263167,

          269.28947368421063

        ],

        [

          2205.789473684211,

          564.0263157894738

        ]

      ],

      "group_id": null,

      "description": "",

      "shape_type": "rectangle",

      "flags": {}

    },

    {

      "label": "Header",

      "points": [

        [

          884.7368421052631,

          58.76315789473695

        ],

        [

          1468.9473684210527,

          216.65789473684222

        ]

      ],

      "group_id": null,

      "description": "",

      "shape_type": "rectangle",

      "flags": {}

    },

    {

      "label": "Text",

      "points": [

        [

          385.12195121951225,

          594.9634146341465

        ],

        [

          1646.0975609756097,

          936.4268292682927

        ]

      ],

      "group_id": null,

      "description": "",

      "shape_type": "rectangle",

      "flags": {}

    }

  ],

  "imagePath": "title2.jpg",

  "imageData": "",

  "imageHeight": 3507,

  "imageWidth": 2480

}

3.2 环境准备

镜像制作

FROM 172.31.108.13/library/cuda:11.6_cudnn8_py3

RUN pip install torch==1.12.1 torchvision==0.13.1 torchaudio==0.12.1 opencv-python==4.10.0.84 ultralytics==8.2.66 -i https://pypi.tuna.tsinghua.edu.cn/simple

docker run --shm-size 128G --rm -it -v 执行目录:/data yolo_gpu:8 /bin/bash

3.3 数据预处理

将标注文件转coco格式

# train

python3 labelme2coco.py CDLA_dir/train train_save_path  --labels labels.txt

# val

python3 labelme2coco.py CDLA_dir/val val_save_path  --labels labels.txt

coco标注文件的json格式转txt

import json

import os

import argparse

#多了一个进度条可优化

from tqdm import tqdm

import glob

import cv2

import numpy as np

def convert_label_json(json_dir,save_dir,classes):

    files=os.listdir(json_dir)

    #筛选出json文件

    jsonFiles=[]

    for file in files:

        if os.path.splitext(file)[1]==".json":

            jsonFiles.append(file)

    #获取类型        

    classes=classes.split(',')

    

    #获取json对应中对应元素

    for json_path in tqdm(jsonFiles):

        path=os.path.join(json_dir,json_path)

        with open(path,'r') as loadFile:

            print(loadFile)

            json_dict=json.load(loadFile)

        h,w=json_dict['imageHeight'],json_dict['imageWidth']

        txt_path=os.path.join(save_dir,json_path.replace('json','txt'))

        txt_file=open(txt_path,'w')

        

        for shape_dict in json_dict['shapes']:

            label=shape_dict['label']

            label_index=classes.index(label)

            points=shape_dict['points']

            points_nor_list=[]

            for point in points:

                points_nor_list.append(point[0]/w)

                points_nor_list.append(point[1]/h)

            points_nor_list=list(map(lambda x:str(x),points_nor_list))

            points_nor_str=' '.join(points_nor_list)

            label_str=str(label_index)+' '+points_nor_str+'\n'

            txt_file.writelines(label_str)

            

            

if __name__=="__main__":

    parser=argparse.ArgumentParser(description="json convert to txt params")

    #设json文件所在地址

    parser.add_argument('-json',type=str,default='val',help='json path')

    #设置txt文件保存地址

    parser.add_argument('-save',type=str,default='val',help='save path')

    #设置label类型,用“,”分隔

    parser.add_argument('-classes',type=str,default='Header,Text,Reference,Figure caption,Figure,Table caption,Table,Title,Footer,Equation',help='classes')

    args=parser.parse_args()

    print(args.json,args.save,args.classes)

    convert_label_json(args.json,args.save,args.classes)

python coco2txt.py

# train

python3 coco2txt.py -json train -save train

# val

python3 coco2txt.py -json val -save val

​​​​​​​3.4 模型训练

from ultralytics import YOLO

from ultralytics.utils import DEFAULT_CFG

import os

import sys

sys.path.insert(0, os.path.dirname(os.getcwd()))

os.environ['CUDA_VISIBLE_DEVICES'] = '1'

DEFAULT_CFG.save_dir= "/data/model"

def train():

    # 加载模型

    print('model load。。。')

    model = YOLO("8npt/8nbest.pt")  # 加载模型

    print('model load completed。。。')

    #epochs=300, batch=16,save_dir=

    #训练模型    model.train(data="/data/img-layout.yaml", name="layout", epochs=10, device=1,batch=16 ,save=True)

    metrics = model.val()  # 在验证集上评估模型性能

if __name__ == '__main__':

    train()

训练产物介绍

名称

作用

args.yaml

训练参数

results.csv

训练过程效果指标

weights

权重文件

last.pt:最后一次训练迭代结束后的模型权重

best.pt:训练过程中在验证集上表现最好的模型权重

​​​​​​​3.5 模型推理

#import sys

#import os

import cv2

import json

#sys.path.insert(0, os.path.dirname(os.getcwd()))

#os.environ['CUDA_VISIBLE_DEVICES'] = '1'

from ultralytics import YOLO

def infer():

    model = YOLO('8mpt/8mbest.pt')

    results = model('title2.jpg')

    names = results[0].names

    boxes = results[0].boxes

    for box in boxes:

        cls = int(box.cls[0])

        x1, y1, x2, y2 = box.xyxy[0]

        x1, y1, x2, y2 = int(x1), int(y1), int(x2), int(y2)

        w, h = x2 - x1, y2 - y1

        box = x1,y1,w,h

        region = {'type': names[cls],'bbox':box}

        print(json.dumps(region))

    cv2.imwrite('result.png', results[0].plot())

if __name__ == '__main__':

    infer()

4.参考链接

Labelme工具: GitHub - wkentaro/labelme: Image Polygonal Annotation with Python (polygon, rectangle, circle, line, point and image-level flag annotation).

Cdla数据集: GitHub - buptlihang/CDLA: CDLA: A Chinese document layout analysis (CDLA) dataset

Yolo8训练: GitHub - jiangnanboy/layout_analysis: 中文版面检测(Chinese layout detection),yolov8 is used to detect the layout of Chinese document images。

Yolo8训练参数: https://docs.ultralytics.com/modes/train(ultralytics/cfg/default.yaml)

Yolo8权重: Releases · ultralytics/assets · GitHub

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

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

相关文章

数据库的相关知识

数据库的相关知识 1.数据库能够做什么? 存储大量数据,方便检索和访问保持数据信息的一致、完整共享和安全通过组合分析,产生新的有用信息 2.数据库作用? 存储数据、检索数据、生成新的数据 3.数据库要求? 统一、…

51单片机的自动洗手器【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机红外传感器继电器LED等模块构成。适用于红外感应洗手器、自动出水等相似项目。 可实现功能: 1、红外传感器实时采集人体信息,如果有人靠近,则闭合水泵继电器开始出水,人离开5s后,继电…

微信5大隐藏技巧,让你成为聊天高手

微信,这个几乎人人都在使用的应用,它的一些隐藏功能却鲜为人知。 今天,就让我们一起来探索这些实用的小技巧,让你的微信使用体验更上一层楼。 一键长截图,保存完整信息 在微信里,当你需要截取某个网页或公…

JAVA八股文1

1.Java 基础 1.1 语法基础 封装 利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体。数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。用户无需知道对象内…

【算法】链表:2.两数相加(medium)+模拟

系列专栏 《分治》 《模拟》 《Linux》 目录 1、题目链接 2、题目介绍 3、解法 (模拟) 4、代码 1、题目链接 2. 两数相加 - 力扣(LeetCode) 2、题目介绍 3、解法 (模拟) 理解题目要求: 我们有两个链表,每个链表代表一个…

完成Sentinel-Dashboard控制台数据的持久化-同步到Nacos

本次案例采用的是Sentinel1.8.8版本 一、Sentinel源码环境搭建 1、下载Sentinel源码工程 git clone https://github.com/alibaba/Sentinel.git 2、导入到idea 这里可以先运行DashboardApplication.java试一下是否运行成功,若成功,源码环境搭建完毕&a…

华为OD机试 - 最长广播响应 - 广度优先搜索(Python/JS/C/C++ 2024 E卷 200分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,…

计算机视觉学习笔记--高斯金字塔,DoG金字塔和拉普拉斯金字塔附带代码

尺度空间和图像金字塔 尺度并非指图像的大小,而是指图像的模糊程度,从近距离到远距离图像越来越模糊的过程,也是图像的尺度越来越大的过程。尺度空间是图像在不同尺度下的连续表示。其中最常见的是使用高斯核对图像进行卷积。随着高斯滤波核…

网格剖分-耳切法效果展示

1.前言 将简单多边形转换成一组由同样顶点组成的三角形集合是计算机图形学中的一个经典问题。问题中,简单多边形是指由一组有序顶点组成的,点V0~点Vn-1。相邻的顶点之间通过边(Vi,Vi-1)连接,并且边(Vn-1,V0)连接起始点…

换毛季来临,铲屎官如何应对猫咪掉毛?宠物空气净化器该怎么选?

养猫前,我是潇洒自如的单身汉;养猫后,我就是勤恳辛劳的保姆!每天下班还要“伺候”猫孩子,收拾它一天在家掉落的猫毛。虽说我没有洁癖,但换毛季可不是开玩笑的,稍微偷懒几天没有清理,…

C++竞赛初阶—— 石头剪子布

题目内容 石头剪子布,是一种猜拳游戏。起源于中国,然后传到日本、朝鲜等地,随着亚欧贸易的不断发展它传到了欧洲,到了近现代逐渐风靡世界。简单明了的规则,使得石头剪子布没有任何规则漏洞可钻,单次玩法比…

苹果开发者网站iOS应用创建全流程详解

引言 在当今的移动开发领域,uni-app 和 Flutter 等跨平台开发工具为开发者提供了便利,可以一次编写代码并部署到多个平台。然而,尽管这些工具简化了应用的开发过程,但它们在iOS应用的构建和发布环节往往并不涉及太多。对于希望在…

上传本地项目到GitHub远程仓库(极简洁操作版)

第一步:在GitHub创建一个空的仓库 第二步:将仓库克隆(下载)到本地 第三步:将你要上传的所有文件放到这个克隆的仓库文件夹中 第四步:通过git add .将待上传文件添加到暂存区 此时,可以通过git …

网际报文协议ICMP及ICMP重定向实例详解5

之前在一个项目中遇到了与ICMP重定向相关的问题,因为缺乏对ICMP相关内容的了解,排查了很长一段时间才查出来。本文给大家简要地介绍一下ICMP及ICMP重定向相关的内容。 1、ICMP的概念 ICMP(Internet Control Message Protocol)网际…

156-反溯源隐藏C2项目域前置云函数数据中转DNS转发

演示案例: CS-隐藏防朔源-域前置-C2&CDN CS-隐藏防朔源-云函数-C2&API 触发 CS-隐藏防朔源-DNS 解析-C2&流量伪装 CS-隐藏防朔源-数据转发-C2&Iptables&中间件 接上节课的知识点,上节课只讲了利用CDN进行隐藏的方式 #域前置-CDN 配合…

每日一练:分割回文串Ⅳ

1745. 分割回文串 IV - 力扣(LeetCode) 题目要求: 给你一个字符串 s ,如果可以将它分割成三个 非空 回文子字符串,那么返回 true ,否则返回 false 。 当一个字符串正着读和反着读是一模一样的&#xff0…

Win32 API 控制台鼠标操作、坐标获取与相关函数介绍

Win32 API 控制台鼠标操作、坐标获取与相关函数介绍 一、前置介绍读取控制台输入缓冲区数据 ReadConsoleInput 函数控制台输入缓冲区中的输入事件 INPUT_RECORD 结构鼠标输入事件 MOUSE_EVENT_RECORD 结构更改输入模式 SetConsoleMode 函数 二、鼠标坐标获取(以下代码环境为 VS…

阿里出品2024版Java架构师面试指南,涵盖Java所有核心技能

最近很多粉丝朋友私信我说:熬过了去年的裁员潮却没熬过现在的内卷;打开Boss直拒一排已读不回,回的基本都是外包,薪资还给的不高,对技术水平要求也远超从前;感觉Java一个初中级岗位有上千人同时竞争&#xf…

面试必备:经典的 Shell 十三问!

1. 为何叫做shell? 我们知道计算机的运作不能离开硬件,但使用者却无法直接操作硬件,硬件的驱动只能通过一种称为操作系统(OS,Operating System)的软件来管控。linux严格来说只是一个操作系统,我们称之为内核(kernel)。 使用者没…

基于vue框架的大学生在线教育jp6jw(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能:学生,教师,课程类型,课程信息,资料类型,课程资料,课程名称,选课信息,学生咨询,教师回复 开题报告内容 基于Vue框架的大学生在线教育平台开题报告 一、课题背景 随着互联网技术的飞速发展和全球教育需求的日益多元化,在线教…