CTPN源码解析1-数据预处理split_label.py

2024-03-03 18:32

本文主要是介绍CTPN源码解析1-数据预处理split_label.py,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文本检测算法一:CTPN

CTPN源码解析1-数据预处理split_label.py

CTPN源码解析2-代码整体结构和框架

CTPN源码解析3.1-model()函数解析

CTPN源码解析3.2-loss()函数解析

CTPN源码解析4-损失函数

CTPN源码解析5-文本线构造算法构造文本行

CTPN训练自己的数据集

 

由于解析的这个CTPN代码是被banjin-xjyeragonruan大神重新封装过的,所以代码整体结构非常的清晰,简洁!不像上次解析FasterRCNN的代码那样跳来跳去,没跳几步脑子就被跳乱了[捂脸],向大神致敬!PS:里面肯定会有理解和注释错误的,欢迎批评指正!

解析源码地址:https://github.com/eragonruan/text-detection-ctpn

知乎:从代码实现的角度理解CTPN:https://zhuanlan.zhihu.com/p/49588885

知乎:理解文本检测网络CTPN:https://zhuanlan.zhihu.com/p/77883736

知乎:场景文字检测—CTPN原理与实现:https://zhuanlan.zhihu.com/p/34757009

 

自己先标注的数据集格式如下:

每一行表示一个文本标记框,顺序为(x1,y1,x2,y2,x3,y3,x4,y4) ,分别是矩形框的左上点(x1,y1),右上点(x2,y2),右下点(x3,y3)左下点(x4,y4)

split_label.py-》这玩意要干嘛呢?

  1. 就是将上面的每一个标记框都给拆分成宽为16的矩形框(两头的可以不为16)。
  2. 同时将图像缩放成指定大小,并保证宽和高都是16的整数倍。

拆分完后的矩形框变成这个样子:

 将这些框画在图上是下面这个样子:

(可以看出,两边的框,宽度不必严格等于16)

108行代码如下,没啥好说的:

import os
import sysimport cv2 as cv
import numpy as np
from tqdm import tqdmsys.path.append(os.getcwd())
from utils.prepare.utils import orderConvex, shrink_polyDATA_FOLDER = "/CTPN/My_text-detection-ctpn-banjin-dev/MyGenData/imgtxt/"
OUTPUT = "/CTPN/My_text-detection-ctpn-banjin-dev/data/dataset/mlt/"
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.shape  #获取图像的[h,w,c]im_size_min = np.min(img_size[0:2]) #获取h,w中较小的im_size_max = np.max(img_size[0:2]) #获取h,w中较大的# 保持宽高比不变,且短边不大于600,长边不大于1200im_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)# 使得图像的w,h都是16的整数倍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.imshow("demo",re_im)# cv.waitKey(0)if(len(res_polys)>0):  #不为空的情况下再保存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 + "\r\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))

多说一句,94行的判断语句是我加上的,因为我的数据集在转化过程中,会出现保存的txt为空的情况,训练时会出错,所以加了一个判断。

if(len(res_polys)>0):  #不为空的情况下再保存

最终整理好的数据集:

 

这篇关于CTPN源码解析1-数据预处理split_label.py的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/770514

相关文章

解析 XML 和 INI

XML 1.TinyXML库 TinyXML是一个C++的XML解析库  使用介绍: https://www.cnblogs.com/mythou/archive/2011/11/27/2265169.html    使用的时候,只要把 tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.

【服务器运维】MySQL数据存储至数据盘

查看磁盘及分区 [root@MySQL tmp]# fdisk -lDisk /dev/sda: 21.5 GB, 21474836480 bytes255 heads, 63 sectors/track, 2610 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytesSector size (logical/physical)

CK_Label_V31

CK_Label_v31(电池供电版) 产品型号 CK_Label_v31 尺寸 68.8*30*13.3mm 按键 1 指示灯 1 RGB灯 外观颜色 白色 供电方式 纽扣电池组2200mAh(CR2477*2),可更换电池 通信方式 无线通信 合规认证 CE, RoHS 工作温度 0-50℃ 工作频段 8

springboot家政服务管理平台 LW +PPT+源码+讲解

3系统的可行性研究及需求分析 3.1可行性研究 3.1.1技术可行性分析 经过大学四年的学习,已经掌握了JAVA、Mysql数据库等方面的编程技巧和方法,对于这些技术该有的软硬件配置也是齐全的,能够满足开发的需要。 本家政服务管理平台采用的是Mysql作为数据库,可以绝对地保证用户数据的安全;可以与Mysql数据库进行无缝连接。 所以,家政服务管理平台在技术上是可以实施的。 3.1

SQL Server中,查询数据库中有多少个表,以及数据库其余类型数据统计查询

sqlserver查询数据库中有多少个表 sql server 数表:select count(1) from sysobjects where xtype='U'数视图:select count(1) from sysobjects where xtype='V'数存储过程select count(1) from sysobjects where xtype='P' SE

高仿精仿愤怒的小鸟android版游戏源码

这是一款很完美的高仿精仿愤怒的小鸟android版游戏源码,大家可以研究一下吧、 为了报复偷走鸟蛋的肥猪们,鸟儿以自己的身体为武器,仿佛炮弹一样去攻击肥猪们的堡垒。游戏是十分卡通的2D画面,看着愤怒的红色小鸟,奋不顾身的往绿色的肥猪的堡垒砸去,那种奇妙的感觉还真是令人感到很欢乐。而游戏的配乐同样充满了欢乐的感觉,轻松的节奏,欢快的风格。 源码下载

tf.split()函数解析

API原型(TensorFlow 1.8.0): tf.split(     value,     num_or_size_splits,     axis=0,     num=None,     name='split' ) 这个函数是用来切割张量的。输入切割的张量和参数,返回切割的结果。  value传入的就是需要切割的张量。  这个函数有两种切割的方式: 以三个维度的张量为例,比如说一

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

转发来源:https://swift.ctolib.com/ooooverflow-chinese-ocr.html chinese-ocr 基于CTPN(tensorflow)+CRNN(pytorch)+CTC的不定长文本检测和识别 环境部署 sh setup.sh 使用环境: python 3.6 + tensorflow 1.10 +pytorch 0.4.1 注:CPU环境

数据时代的数字企业

1.写在前面 讨论数据治理在数字企业中的影响和必要性,并介绍数据治理的核心内容和实践方法。作者强调了数据质量、数据安全、数据隐私和数据合规等方面是数据治理的核心内容,并介绍了具体的实践措施和案例分析。企业需要重视这些方面以实现数字化转型和业务增长。 数字化转型行业小伙伴可以加入我的星球,初衷成为各位数字化转型参考库,星球内容每周更新 个人工作经验资料全部放在这里,包含数据治理、数据要

如何在Java中处理JSON数据?

如何在Java中处理JSON数据? 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨在Java中如何处理JSON数据。JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,在现代应用程序中被广泛使用。Java通过多种库和API提供了处理JSON的能力,我们将深入了解其用法和最佳