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

目录

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值