yolov5之识别点选

文章描述了一个OCR识别系统的构建过程,包括使用EasyDL标注数据集,转换为VOC和V5格式,将数据集应用于Yolov5目标检测模型训练,之后对图片进行切割并使用单字识别模型,最后构建服务进行文字检测和识别。
摘要由CSDN通过智能技术生成

1.使用easydl标注数据集

具体操作查看官网就行

2.将数据集转换为v5格式

首先将easydl数据集转换为voc

import glob
import os
import random
import shutil
import math
# 将xml转移到Annotations文件夹
# 把jpg图片按比例随机放入train和val文件夹
# 同时生成train.txt,val.txt,这两个文件放的是图片路径

src_path = r'E:\ocr识别\jiangsu\images\labelimg'
dst_path = r'E:\ocr识别\jiangsu\voc'
dst_path_main = os.path.join(dst_path, 'VOC')
dst_path_xml = os.path.join(dst_path_main,'Annotations')
dst_path_train = os.path.join(dst_path_main,'train')
dst_path_val = os.path.join(dst_path_main,'val')
if not os.path.exists(dst_path_main):
    os.makedirs(dst_path_main)

if not os.path.exists(dst_path_xml):
    os.makedirs(dst_path_xml)

if not os.path.exists(dst_path_train):
    os.makedirs(dst_path_train)

if not os.path.exists(dst_path_val):
    os.makedirs(dst_path_val)

files = os.listdir(src_path)
for file in files:
    file_name = file.split('.')[0]
    file_ext = file.split('.')[-1]
    if file_ext == 'jpg':
        continue
    shutil.copyfile(os.path.join(src_path,file), os.path.join(dst_path_xml, file))

img_files = glob.glob(os.path.join(src_path, '*.jpg'))
print(type(img_files))
total_img_count = len(img_files)
val_rate = 0.2
val_img_count = int(total_img_count * val_rate)
print(val_img_count)
val_files = random.sample(img_files,val_img_count)
train_files = list(set(img_files).difference(set(val_files)))
print(len(train_files))

f_train = open(os.path.join(dst_path_main,'train.txt'), 'w')
f_val = open(os.path.join(dst_path_main,'val.txt'), 'w')

for file in val_files:
    shutil.copyfile(file, os.path.join(dst_path_val, os.path.split(file)[-1]))
    f_val.write(os.path.join(dst_path_val, os.path.split(file)[-1])+'\n')

for file in train_files:
    shutil.copyfile(file, os.path.join(dst_path_train, os.path.split(file)[-1]))
    f_train.write(os.path.join(dst_path_train, os.path.split(file)[-1])+'\n')

f_val.close()
f_train.close()

再将voc转换为v5

import glob
import os
import pickle
import shutil
import xml.etree.ElementTree as ET
from os import listdir, getcwd
from os.path import join

dirs = ['train', 'val']
classes = ['cn']

main_dir = r'E:\ocr识别\jiangsu\voc\VOC'
out_dir = r'E:\ocr识别\jiangsu\voc\VOC\yolov5'


def getImagesInDir(dir_path):
    image_list = []
    for filename in glob.glob(dir_path + '/*.jpg'):
        image_list.append(filename)

    return image_list

def convert(size, box):
    dw = 1./(size[0])
    dh = 1./(size[1])
    x = (box[0] + box[1])/2.0 - 1
    y = (box[2] + box[3])/2.0 - 1
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x*dw
    w = w*dw
    y = y*dh
    h = h*dh
    return (x,y,w,h)

def convert_annotation(dir_path, output_path, image_path):
    basename = os.path.basename(image_path)
    basename_no_ext = os.path.splitext(basename)[0]

    dir_path = fr'{main_dir}\Annotations'

    in_file = open(dir_path + '\\' + basename_no_ext + '.xml')
    out_label_path = os.path.join(output_path,'labels')
    if not os.path.exists(out_label_path):
        os.makedirs(out_label_path)
    out_file = open(out_label_path + '\\' + basename_no_ext + '.txt', 'w')
    tree = ET.parse(in_file)
    root = tree.getroot()
    size = root.find('size')
    w = int(size.find('width').text)
    h = int(size.find('height').text)

    for obj in root.iter('object'):
        difficult = obj.find('difficult').text
        # cls = obj.find('name').text
        cls = 'cn'
        if cls not in classes or int(difficult)==1:
            continue
        cls_id = classes.index(cls)
        xmlbox = obj.find('bndbox')
        b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))
        bb = convert((w,h), b)
        out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')

# cwd = getcwd()

for dir_path in dirs:
    # full_dir_path = cwd + '/' + dir_path
    # output_path = full_dir_path +'/yolo/'
    full_dir_path = os.path.join(main_dir, dir_path)
    output_path = os.path.join(out_dir, dir_path)
    if not os.path.exists(output_path):
        os.makedirs(output_path)

    image_paths = getImagesInDir(full_dir_path)
    list_file = open(full_dir_path + '.txt', 'w')

    yolo_img_path = os.path.join(output_path,'images')
    if not os.path.exists(yolo_img_path):
        os.makedirs(yolo_img_path)
    for image_path in image_paths:
        list_file.write(image_path + '\n')
        convert_annotation(full_dir_path, output_path, image_path)
        src_img_name = os.path.basename(image_path)
        shutil.copy(image_path,os.path.join(yolo_img_path,src_img_name))

    list_file.close()

    print("Finished processing: " + dir_path)

3.将转换后的数据放到F:\yolov5-master\data目录下

4.在F:\yolov5-master\data目录下增加jiangsu.yaml

文件内容

train: F:\yolov5-master\data\yolov5\train

val: F:\yolov5-master\data\yolov5\val

nc: 1

names: ['cn']

5.执行目标检测训练

python train.py --img 320 --batch 1 --epochs 100 --data jiangsu.yaml --weights yolov5s.pt

6.切割图片

将图片进行切割,每部分包含一个单字

7.使用单字识别代码进行训练

对单字进行训练,生成模型

8.编写服务,调用模型进行测试

服务中,先使用目标检测模型,获取到每个单字的位置,然后根据位置切割图片,再使用单字模型获取到单字的文本,这样每个单字的图片文本就有了,根据入参返回响应的单子位置组合即可。

主要是提供一个思路。

根据引用\[1\]和引用\[2\]的内容,YOLOv5在缺陷识别方面可能存在以下问题和改进空间: 1. 数据图像预处理问题:如果第一次训练识别结果比人眼识别的差得多,可能是在数据图像预处理方面存在问题。这可能需要对数据进行更好的预处理,以提高识别准确性。 2. 模型选择问题:YOLOv5有多种型号可选,如yolov5s、yolov5m、yolov5l、yolov5x。选择模型时应根据实际需求和数据集大小进行选择,避免盲目选择过大的模型可能导致过拟合问题。 3. 预测部分粗糙:YOLOv5的预测部分可能没有充分发挥其快速识别的特点,可以进一步改进预测部分的算法,提高识别精度和速度。 4. 结果后处理问题:YOLOv5的结果后处理可以进一步探索和改进,以提高识别结果的准确性和可靠性。 综上所述,YOLOv5在缺陷识别方面存在一些问题,但也有很大的改进空间。通过改进数据预处理、选择合适的模型、优化预测部分和结果后处理,可以提高YOLOv5在缺陷识别任务中的性能。引用\[1\]\[2\] #### 引用[.reference_title] - *1* [yolov5——基于yolov5的钢材表面缺陷识别](https://blog.csdn.net/weixin_56184890/article/details/116563828)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [yolov5的工业缺陷检测](https://blog.csdn.net/qq_35054151/article/details/124982986)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liberty888

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值