CTPN训练集准备

article/2025/11/1 23:00:46
  1. 去down vgg_16.ckpt预训练模型
  2. 准备一堆你需要训练的图片,使用labelme进行标注,得到一堆json文件
    json文件大致如下:
{"flags": {},"shapes": [{"label": "str","line_color": null,"fill_color": null,"points": [[91,183],[178,183],[178,231],[91,231]]}],"lineColor": [0,255,0,128],"fillColor": [255,0,0,128],"imagePath": "..\\img\\000_004.jpg","imageData": "/9..."}
  1. 使用如下代码将上一步生成的json文件转换成split_label.py所需要的格式
def json2txt():json_dir = r''output_dir = r''for json_name in os.listdir(json_dir):point_list = []json_file = os.path.join(json_dir, json_name)with open(json_file, 'r') as rf:info = json.load(rf)for item in info['shapes']:for point in item['points']:point_list.append(point)point_arry = np.array(point_list)point_arry = point_arry.reshape((-1, 8))output_path = os.path.join(output_dir, 'gt_' + json_name.split('.')[0] + '.txt')np.savetxt(output_path, point_arry, fmt='%s', delimiter=',')

转换后的格式:
每一行为一个矩形框的4个点

91,183,178,183,178,231,91,231
191,183,401,183,401,232,191,232
503,185,605,185,605,234,503,234
616,192,747,192,747,232,616,232
769,196,832,196,832,232,769,232
847,194,925,194,925,242,847,242
936,194,1071,194,1071,240,936,240
92,234,274,234,274,272,92,272
96,287,412,287,412,327,96,327
94,338,454,338,454,391,94,391
96,400,416,400,416,443,96,443
94,452,345,452,345,498,94,498
92,511,325,511,325,563,92,563
87,569,341,569,341,616,87,616
92,627,372,627,372,676,92,676
94,691,431,691,431,731,94,731
87,751,312,751,312,776,87,776
87,776,798,776,798,834,87,834
  1. 修改split_label.py中的目录路径,DATA_FOLDER路径下有包含你的图片文件夹"image"和上一步生成的标签文件夹"label",OUTPUT为你的输出目录。
    PS: split_label.py和utils.py主要来自于 https://github.com/eragonruan/text-detection-ctpn
# split_label.py
import os
import sysimport cv2 as cv
import numpy as np
from tqdm import tqdmsys.path.append(os.getcwd())
from utils import orderConvex, shrink_polyDATA_FOLDER = r"E:\code\OCR\data"
OUTPUT = r"E:\code\OCR\data\output"
MAX_LEN = 1200
MIN_LEN = 600im_fns = os.listdir(os.path.join(DATA_FOLDER, "image"))
im_fns.sort()if not os.path.exists(os.path.join(OUTPUT, "image")):os.makedirs(os.path.join(OUTPUT, "image"))
if not os.path.exists(os.path.join(OUTPUT, "label")):os.makedirs(os.path.join(OUTPUT, "label"))for im_fn in tqdm(im_fns):try:_, fn = os.path.split(im_fn)bfn, ext = os.path.splitext(fn)if ext.lower() not in ['.jpg', '.png']:continuegt_path = os.path.join(DATA_FOLDER, "label", 'gt_' + bfn + '.txt')img_path = os.path.join(DATA_FOLDER, "image", im_fn)img = cv.imread(img_path)img_size = img.shapeim_size_min = np.min(img_size[0:2])im_size_max = np.max(img_size[0:2])im_scale = float(600) / float(im_size_min)if np.round(im_scale * im_size_max) > 1200:im_scale = float(1200) / float(im_size_max)new_h = int(img_size[0] * im_scale)new_w = int(img_size[1] * im_scale)new_h = new_h if new_h // 16 == 0 else (new_h // 16 + 1) * 16new_w = new_w if new_w // 16 == 0 else (new_w // 16 + 1) * 16re_im = cv.resize(img, (new_w, new_h), interpolation=cv.INTER_LINEAR)re_size = re_im.shapepolys = []with open(gt_path, 'r') as f:lines = f.readlines()for line in lines:splitted_line = line.strip().lower().split(',')x1, y1, x2, y2, x3, y3, x4, y4 = map(float, splitted_line[:8])poly = np.array([x1, y1, x2, y2, x3, y3, x4, y4]).reshape([4, 2])poly[:, 0] = poly[:, 0] / img_size[1] * re_size[1]poly[:, 1] = poly[:, 1] / img_size[0] * re_size[0]poly = orderConvex(poly)polys.append(poly)# cv.polylines(re_im, [poly.astype(np.int32).reshape((-1, 1, 2))], True,color=(0, 255, 0), thickness=2)res_polys = []for poly in polys:# delete polys with width less than 10 pixelif np.linalg.norm(poly[0] - poly[1]) < 10 or np.linalg.norm(poly[3] - poly[0]) < 10:continueres = shrink_poly(poly)# for p in res:#    cv.polylines(re_im, [p.astype(np.int32).reshape((-1, 1, 2))], True, color=(0, 255, 0), thickness=1)res = res.reshape([-1, 4, 2])for r in res:x_min = np.min(r[:, 0])y_min = np.min(r[:, 1])x_max = np.max(r[:, 0])y_max = np.max(r[:, 1])res_polys.append([x_min, y_min, x_max, y_max])cv.imwrite(os.path.join(OUTPUT, "image", fn), re_im)with open(os.path.join(OUTPUT, "label", bfn) + ".txt", "w") as f:for p in res_polys:line = ",".join(str(p[i]) for i in range(4))f.writelines(line + '\n')# for p in res_polys:#    cv.rectangle(re_im,(p[0],p[1]),(p[2],p[3]),color=(0,0,255),thickness=1)# cv.imshow("demo",re_im)# cv.waitKey(0)except:print("Error processing {}".format(im_fn))

里面用到了utils.py里的功能函数,这里需要安装一个shapely的包,直接去https://www.lfd.uci.edu/~gohlke/pythonlibs/#shapely 下对应的版本安装即可

# utils.py
import numpy as np
from shapely.geometry import Polygondef pickTopLeft(poly):idx = np.argsort(poly[:, 0])if poly[idx[0], 1] < poly[idx[1], 1]:s = idx[0]else:s = idx[1]return poly[(s, (s + 1) % 4, (s + 2) % 4, (s + 3) % 4), :]def orderConvex(p):points = Polygon(p).convex_hullpoints = np.array(points.exterior.coords)[:4]points = points[::-1]points = pickTopLeft(points)points = np.array(points).reshape([4, 2])return pointsdef shrink_poly(poly, r=16):# y = kx + bx_min = int(np.min(poly[:, 0]))x_max = int(np.max(poly[:, 0]))k1 = (poly[1][1] - poly[0][1]) / (poly[1][0] - poly[0][0])b1 = poly[0][1] - k1 * poly[0][0]k2 = (poly[2][1] - poly[3][1]) / (poly[2][0] - poly[3][0])b2 = poly[3][1] - k2 * poly[3][0]res = []start = int((x_min // 16 + 1) * 16)end = int((x_max // 16) * 16)p = x_minres.append([p, int(k1 * p + b1),start - 1, int(k1 * (p + 15) + b1),start - 1, int(k2 * (p + 15) + b2),p, int(k2 * p + b2)])for p in range(start, end + 1, r):res.append([p, int(k1 * p + b1),(p + 15), int(k1 * (p + 15) + b1),(p + 15), int(k2 * (p + 15) + b2),p, int(k2 * p + b2)])return np.array(res, dtype=np.int).reshape([-1, 8])

这里会把图片resize到608*864,然后生成对应的文本框。都在你指定的OUTPUT文件夹下。
如果把生成的文本框画到相应的图片上就长这样:

在这里插入图片描述
labelme中标注的是这样:
在这里插入图片描述
然后就可以使用OUTPUT下的image和label两个文件夹去训练咯~


http://chatgpt.dhexx.cn/article/Y1pDVIw5.shtml

相关文章

【项目实践】中英文文字检测与识别项目(CTPN+CRNN+CTC Loss原理讲解)

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶” 重磅干货&#xff0c;第一时间送达本文转自&#xff1a;opencv学堂 OCR——简介 文字识别也是图像领域一个常见问题。然而&#xff0c;对于自然场景图像&#xff0c;首先要定位图像中的文字位置&#xff0…

『工程项目实践』银行卡识别(CTPN+CRNN)

银行卡识别 前言一、数据预处理1.1 数据准备1.2 数据增强 二、训练&#xff08;CRNN&#xff09;三、需要修改的内容3.1 数据增强3.2 训练 四、CRNN 结构说明4.1 CNN4.2 BiLSTM4.3 CTC 五、卡号检测六、BIN码校验参考链接 前言 对各种银行卡进行卡号识别&#xff0c;CTPN 进行文…

【深度学习】YOLOv5 中使用的 CSPNet 是怎么回事

论文&#xff1a;https://arxiv.org/pdf/1911.11929.pdf CSPNet全称是Cross Stage Partial Network&#xff0c;主要从一个比较特殊的角度切入&#xff0c;能够在降低20%计算量的情况下保持甚至提高CNN的能力。 跨阶段局部网络&#xff08;CSPNet&#xff09;是 Wang 等人于 20…

Opencv多语言自然场景文本识别系统(源码&教程)

1. 研究背景 人类在自然场景中可以快速定位并识别看到的文字信息&#xff0c;但是想要计算机做到和人类一样是比较困难的。开发人员一直想要让机器也能识别图像中的文字信息。当然,对于自然场景来说,图像中的信息复杂甚至是低效的,文字旁的物体﹑光影,以及字体颜色、大小、书写…

深度学习CTPN+CRNN模型实现图片内文字的定位与识别(OCR)

1:样本获取 **算法论文:** Synthetic Data for Text Localisation in Natural Images Github: https://github.com/ankush-me/SynthText **词库:** https://pan.baidu.com/s/10anmu 英文词汇 经过处理后得到大约500兆 6000万词组 **字体:** ubntu系统下支持中文的字体&…

ctpn、east阅读要点记录

最近要做一些ocr的事情&#xff0c;阅读了文字定位的相关论文&#xff0c;主要是ctpn和east.下面对这两篇论文的药店进行一个记录。 CTPN ctpn结合了卷积神经网络和循环神经网络。卷机神经网络用于提取图片特征&#xff0c;循环神经网络能够帮助提升对文字的定位和分类的准确…

基于CTPN(tensorflow)+CRNN(pytorch)+CTC的不定长文本检测和识别

文章主要是为了说明在windows平台下调试遇到的问题。 代码地址&#xff1a;https://github.com/Aurora11111/chinese-ocr-pytorch 按照相关说明&#xff0c;安装相关的pytorch和tensorflow&#xff0c;我使用的是python3.7 下载代码后&#xff0c;需要进行修改才能在windows…

OCR文字识别项目(原理)

参考视频&#xff1a; OCR文字识别原理 OCR光学字符识别&#xff1a;提取图像中的文字&#xff0c;并转换为文本形式&#xff0c;供后续NLP使用。 一、CTPN算法&#xff1a;文字检测 二、CRNN算法&#xff1a;文字识别 池化此时为12。才能把特征变为适用于输入到RNN中。

CTPN+CRNN算法端到端实现文字识别的实战开发

本文分享自华为云社区《CTPNCRNN 算法端到端实现文字识别》&#xff0c;作者&#xff1a;HWCloudAI。 OCR介绍 光学字符识别&#xff08;英语&#xff1a;Optical Character Recognition&#xff0c;OCR&#xff09;是指对文本资料的图像文件进行分析识别处理&#xff0c;获取…

OCR入门教程系列(五):OCR实战代码解析

👨‍💻作者简介: CSDN、阿里云人工智能领域博客专家,新星计划计算机视觉导师,百度飞桨PPDE,专注大数据与AI知识分享。✨公众号:GoAI的学习小屋 ,免费分享书籍、简历、导图等,更有交流群分享宝藏资料,关注公众号回复“加群”或➡️链接 加群。 🎉专栏推荐: ➡️ …

制作自己的ctpn数据集

制作自己的ctpn数据集 1、利用label-image标注自己的数据集&#xff0c;保存为.txt文件&#xff0c;结果如下&#xff1a; 上图第一列 0&#xff1a;标签 后面的小数是label—image标注的坐标框位置&#xff08;归一化后的结果&#xff09; 2、ctpn数据集的格式&#xff1a;…

CTPN文本检测与tensorflow实现

1. 引言 近年来&#xff0c;随着人工智能的发展&#xff0c;文本检测在很多任务中都是一项基本任务&#xff0c;比如广告牌中文字识别、智能驾驶路牌的检测、身份证识别、快递地址识别等。这些任务中首先的一项就是文本检测&#xff0c;即检测出文本在图像中的位置&#xff0c;…

制作自己的CTPN训练集

制作自己的CTPN训练集 使用labelimg工具制作YOLO格式再将其转为CTPN中需要的8个坐标 1.标注框 2.代码生成坐标并保存 import cv2 import os def change_labelimage_to_cptn_data(pictures_file_path, txt_file_path, cptn_data_labels_path):list os.listdir(txt_file_pat…

【文本检测与识别-白皮书-3.1】第四节:算法模型 2

CTPN CTPN&#xff0c;全称是“Detecting Text in Natural Image with Connectionist Text Proposal Network”&#xff08;基于连接预选框网络的文本检测&#xff09;。CTPN直接在卷积特征映射中检测一系列精细比例的文本建议中的文本行。CTPN开发了一个垂直锚定机制&#xf…

CPTN代码运行报错

Windows10 系统运行 github上给的是linux操作系统指令 因为我是Windows10 的系统&#xff0c;不能通过setup的指令得到所需文件&#xff0c;后面根据https://github.com/eragonruan/text-detection-ctpn/issues/359的方法到第4步报错 错误1&#xff1a; 找不到cl.exe&#x…

JAVA项目实战开发电商项目案例(十)订单与支付模块

文章目录 1项目架构2项目采用技术3订单与支付模块功能演示4如何开发支付宝的支付模块以及订单模块4.1首先需要编写前端页面以及JS文件4.2其次需要编写JAVA后台接口4.3支付模块分析4.4订单模块分析5代码分析6个人说明7 [我的个人网站](http://www.liph.fun)8获取源码 此次电商系…

Java 项目实战 坦克大战 (0)--前言

做了有一个星期了&#xff0c;java语言太强大了&#xff0c;也算是学得最认真的一门语言了&#xff0c;本次课设花的心思也就比较多了。关键总是追求完美总是想原创&#xff0c;最终做出来效果不错&#xff0c;但感觉代码逻辑很乱&#xff0c;今天开始就好好整理一番&#xff0…

Java项目实战第11天:搜索功能的实现

目录 一、sql语句动态拼接二、前后台代码编写三、搜索框数据回填最后 今天是刘小爱自学Java的第110天。 感谢你的观看&#xff0c;谢谢你。 话不多说&#xff0c;开始今天的学习&#xff1a; 事先说明&#xff1a;关于今天的搜索功能实现。 并没有使用到倒排索引这样的主流搜…

【CSDN最全java项目实战500篇】练手/项目经验/毕设刚需

免费精选&#xff01;强烈建议收藏&#xff01;学完这一套直接进大厂&#xff08;附配套源码&资料&#xff09; C站&#xff08;CSDN&#xff09;软件工程师能力认证&#xff0c;已上线70天&#xff0c;下图300所高校的小伙伴们都已经预约、完成C认证&#xff0c;就等你来啦…

Java项目开发实战入门 PDF 扫描完整版

内容介绍 《Java项目开发实战入门》以一起来画画、通讯录系统、明日彩票预测系统、小小五子棋、企业进销存管理系统、企业QQ&#xff08;局域网版&#xff09;、九宫格记忆网和铭成在线考试系统8个精选项目为案例&#xff0c;从趣味性和实际应用角度出发&#xff0c;采用了当前…