当前位置: 首页 > news >正文

cnocr配置及训练测试

cnocr配置及训练测试

  • 1,相关链接
  • 2,已有模型调用测试
    • (1)下载相关模型
    • (2)Cnstd文本检测模型
    • (3)模型调用解析脚本
  • 3,自定义数据集训练测试
    • (1)标签转换
      • (1-1)标签转换脚本labelme2cnocr.py
      • (1-2)转换为cnocr数据集
    • (2)训练
      • (2-1)训练命令
      • (2-2)训练结果
      • (2-3)训练日志可视化(可略过)
    • (3)测试
      • (3-1)测试脚本
      • (3-2)测试结果

1,相关链接

https://gitee.com/cyahua/cnocr/
cyahua / cnocr

https://github.com/breezedeus/CnOCR#%E5%8F%AF%E4%BD%BF%E7%94%A8%E7%9A%84%E8%AF%86%E5%88%AB%E6%A8%A1%E5%9E%8B
使用英文和数字的模型

https://zhuanlan.zhihu.com/p/660022852
CnOCR 纯数字识别新模型(里面包含博主自定义训练的硬币数据集)

纯英文模型检测精度更高,适用于检测字符相关

2,已有模型调用测试

(1)下载相关模型

https://zhuanlan.zhihu.com/p/660022852
在这里插入图片描述

https://pan.baidu.com/s/1wvIjbjw95akE-h_o1HQd9w?pwd=nocr&at=1703123910772#list/path=%2F
在这里插入图片描述

(2)Cnstd文本检测模型

https://github.com/breezedeus/cnstd

由此可知cnocr其内部文本检测使用的就是cnstd工具包,而进行cnocr训练的只有识别模型
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

(3)模型调用解析脚本

手写解析功能用于测试

from cnocr import CnOcr
import cv2#https://gitee.com/cyahua/cnocr?_from=gitee_search
#专用英文的模型#img_fp = './docs/examples/huochepiao.jpeg'
img_fp = 'E:/tupian/ocr2/O16.bmp'ocr = CnOcr(det_model_name='en_PP-OCRv3_det', rec_model_name='en_PP-OCRv3')  # 所
out = ocr.ocr(img_fp)print(out)# 结果处理
#绘制矩形框到图像
# img2 = img_fp.copy()
img_fp2 = cv2.imread(img_fp)
results = ''
for output in out:result_text = output['text']result_position = output['position']# #数组转换成列表list_position = result_position.tolist()print(list_position)print(type(list_position))p0 = (int(list_position[0][0]),int(list_position[0][1]))p1 = (int(list_position[1][0]),int(list_position[1][1]))p2 = (int(list_position[2][0]),int(list_position[2][1]))p3 = (int(list_position[3][0]),int(list_position[3][1]))print(p0)print(p1)print(p2)print(p3)color_l = (0, 200, 0)thickness_l = 2cv2.line(img_fp2, p0, p1, color_l, thickness_l)cv2.line(img_fp2, p1, p2, color_l, thickness_l)cv2.line(img_fp2, p2, p3, color_l, thickness_l)cv2.line(img_fp2, p3, p0, color_l, thickness_l)font = cv2.FONT_HERSHEY_SIMPLEXfontScale = 1color = (255, 0, 0)thickness = 2cv2.putText(img_fp2, result_text, p0, font, fontScale, color, thickness, cv2.LINE_AA)cv2.imshow('demo',img_fp2)
cv2.waitKey(0)

相关测试结果
在这里插入图片描述

3,自定义数据集训练测试

(1)标签转换

(1-1)标签转换脚本labelme2cnocr.py

import cv2
import os
import csvinput_path = "E:/tupian/ocr2/ocr_data"
output_path = "./data"
ratio = 0.1#拆分列表
def split_list(lst, ratios, num_splits):"""将列表按照指定比例和数量拆分成子列表:param lst: 待拆分列表:param ratios: 每个子列表的元素占比,由小数表示的列表:param num_splits: 子列表的数量:return: 拆分后的子列表组成的列表"""if len(ratios) != num_splits:raise ValueError("The length of ratios must equal to num_splits.")total_ratio = sum(ratios)if total_ratio != 1:raise ValueError("The sum of ratios must be equal to 1.")n = len(lst)result = []start = 0for i in range(num_splits):end = start + int(n * ratios[i])result.append(lst[start:end])start = endreturn resultdef read_path(input_path,output_path,ratio):#遍历该目录下的所有图片文件train_list = []for filename in os.listdir(input_path):if '.jpg' in filename:img_filename = filenameimg_path = input_path +'/' + filenametxt_path = input_path +'/' + filename.replace('.jpg','.txt')img_output_path = output_path + "/images/" + img_filenameif not os.path.exists(output_path + "/images"):os.makedirs(output_path + "/images")print(img_path)print(txt_path)#读取保存图像img = cv2.imread(img_path)cv2.imwrite(img_output_path, img)#读取txt文件并保存到tsv#中间用tab隔开(字符空格隔开,使用space表示空格)label = ''with open(txt_path, "r", encoding='utf-8') as f:# read():读取文件全部内容,以字符串形式返回结果data = f.read()for char in data:if char == ' ':char = '<space>'label = label + char + ' 'label = label.replace(' \n ','')print(label)name_label_list =[]name_label_list.append(img_filename)name_label_list.append(label)print(name_label_list)train_list.append(name_label_list)#按照比例分割开ratios = [1-ratio, ratio]num_splits = 2result = split_list(train_list, ratios, num_splits)#其中,train.tsv是待创建的文件名或项目文件夹中已有的文件名,‘w’代表写入,指定newline=’‘是为了避免每写出一行数据就会有一个空行,delimiter代表分隔符,tsv的分隔符为’\t’,csv的分隔符为’,’。with open(output_path + '/train.tsv', 'w', newline='') as tsvfile:writer = csv.writer(tsvfile, delimiter='\t')writer.writerows(result[0])with open(output_path + '/dev.tsv', 'w', newline='') as tsvfile:writer = csv.writer(tsvfile, delimiter='\t')writer.writerows(result[1])#注意*处如果包含家目录(home)不能写成~符号代替
#必须要写成"/home"的格式,否则会报错说找不到对应的目录
#读取的目录
read_path(input_path, output_path, ratio)
#print(os.getcwd())

(1-2)转换为cnocr数据集

在这里插入图片描述

会生成三个文件,images是图像,dev.tsv是测试集,train.tsv是训练集

在这里插入图片描述

在这里插入图片描述

(2)训练

(2-1)训练命令

在这里插入图片描述

使用cpu进行的训练

(venv) PS G:\pyproject\CnOCR-master> cnocr train -m densenet_lite_136-fc -p data/densenet_lite_136-fc/cnocr-v2.2-densenet_lite_136-fc-epoch=039-complete_match_epoch=0.8597-model.ckpt --index-dir data --train-config-fp data/train_con
fig.json

在这里插入图片描述

(2-2)训练结果

在这里插入图片描述
在这里插入图片描述

(2-3)训练日志可视化(可略过)

https://blog.csdn.net/qq_44864833/article/details/131295460
wandb快速上手、使用心得(超好用的Tensorboard高替品)
在这里插入图片描述

离线训练完成后,可以通过wandb sync将相关日志文件上传,然后在线查看

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

https://wandb.ai/authorize
登录上方创建账号和key

在这里插入图片描述
在这里插入图片描述

(3)测试

(3-1)测试脚本

from cnocr import CnOcr
import cv2
import os#https://gitee.com/cyahua/cnocr?_from=gitee_search
#专用英文的模型def detect_imgs(input_path,output_path):for filename in os.listdir(input_path):if ('.jpg' in filename) or ('.png' in filename) or ('.bmp' in filename):img_filename = filenameimg_fp = input_path + '/' + filenametxt_path = input_path + '/' + filename.replace('.jpg', '.txt')img_output_path = output_path + "/outimgs/" + img_filenameif not os.path.exists(output_path + "/outimgs"):os.makedirs(output_path + "/outimgs")#img_fp = './docs/examples/huochepiao.jpeg'# img_fp = 'E:/tupian/ocr2/O7.bmp'# #使用已有的模型# ocr = CnOcr(det_model_name='en_PP-OCRv3_det', rec_model_name='en_PP-OCRv3')  # 所en_PP-OCRv3 , en_number_mobile_v2.0, number-densenet_lite_136-fc# out = ocr.ocr(img_fp)# print(out)training_model_fp = "G:/pyproject/CnOCR-master/runs/CnOCR-Rec/5b5uka01/checkpoints/last.ckpt"# #调用自训练的识别模型,对原数据集进行验证(验证使用单行不要使用检测模型)ocr = CnOcr(rec_model_fp=training_model_fp, rec_model_backend='pytorch')  # 调用训练好的识别模型(使用单行的进行)#ocr = CnOcr(rec_model_name='en_PP-OCRv3')out = ocr.ocr_for_single_line(img_fp)# print(out)# results = '--' + out['text']# img_fp2 = cv2.imread(img_fp)# cv2.imwrite(img_output_path, img_fp2)#调用配置好的模型(使用已有的检测模型en_PP-OCRv3_det,效果并不是很好,在原数据集上)#####################################################################ocr = CnOcr(det_model_name = 'en_PP-OCRv3_det', rec_model_name = 'densenet_lite_136-fc', rec_model_fp = training_model_fp, rec_model_backend = 'pytorch')  # 所en_PP-OCRv3 , en_number_mobile_v2.0ocr = CnOcr(det_model_name='en_PP-OCRv3_det', rec_model_fp=training_model_fp, rec_model_backend = 'pytorch') #调用训练好的模型out = ocr.ocr(img_fp)#结果处理#绘制矩形框到图像img_fp2 = cv2.imread(img_fp)results = ''for output in out:result_text = output['text']result_position = output['position']# #数组转换成列表list_position = result_position.tolist()print(list_position)print(type(list_position))p0 = (int(list_position[0][0]),int(list_position[0][1]))p1 = (int(list_position[1][0]),int(list_position[1][1]))p2 = (int(list_position[2][0]),int(list_position[2][1]))p3 = (int(list_position[3][0]),int(list_position[3][1]))print(p0)print(p1)print(p2)print(p3)color_l = (0, 200, 0)thickness_l = 2cv2.line(img_fp2, p0, p1, color_l, thickness_l)cv2.line(img_fp2, p1, p2, color_l, thickness_l)cv2.line(img_fp2, p2, p3, color_l, thickness_l)cv2.line(img_fp2, p3, p0, color_l, thickness_l)font = cv2.FONT_HERSHEY_SIMPLEXfontScale = 1color = (255, 0, 0)thickness = 2cv2.putText(img_fp2, result_text, p0, font, fontScale, color, thickness, cv2.LINE_AA)results = results + '--' + result_text#cv2.imshow('demo',img_fp2)cv2.imwrite(img_output_path,img_fp2)#cv2.waitKey(0)############################################################################################################string_txt = img_output_path.replace('.jpg','') + '_'+ results + '.txt'print(string_txt)with open(string_txt, 'w') as tsvfile:tsvfile.write(results)#input_path = 'G:/pyproject/CnOCR-master/data/images'
input_path = 'E:/tupian/ocr2'
output_path = 'G:/pyproject/CnOCR-master/data'detect_imgs(input_path,output_path)

(3-2)测试结果

使用预训练模型训练300轮次左右得到的测试效果如下,被遮挡的文字识别也是比较准确的。

在这里插入图片描述

相关文章:

cnocr配置及训练测试

cnocr配置及训练测试 1&#xff0c;相关链接2&#xff0c;已有模型调用测试&#xff08;1&#xff09;下载相关模型&#xff08;2&#xff09;Cnstd文本检测模型&#xff08;3&#xff09;模型调用解析脚本 3&#xff0c;自定义数据集训练测试&#xff08;1&#xff09;标签转换…...

解决 Flutter 在 Mac 上的编译错误

解决 Flutter 在 Mac 上的编译错误 在使用 Flutter 进行项目开发并尝试在 Mac 设备上进行编译时&#xff0c;遇到了一系列的错误信息&#xff0c;这些错误信息给项目的构建与部署带来了阻碍。 一、错误详情 在编译过程中&#xff0c;Xcode 输出了大量的信息&#xff0c;其中…...

MR30分布式IO在新能源领域加氢站的应用

导读 氢能被誉为21世纪最具发展潜力的清洁能源&#xff0c;氢能科技创新和产业发展持续得到各国青睐。氢能低碳环保&#xff0c;燃烧的产物只有水&#xff0c;是用能终端实现绿色低碳转型的重要载体。氢能产业链分别为上游制氢、中游储运以及下游用氢。上游制氢工艺目前大部分…...

wxPython中wx.ListCtrl用法(二)

wx.ListCtrl是一个列表组件&#xff0c;可以以列表视图&#xff08;list view&#xff09;、报表视图&#xff08;report view&#xff09;、图标视图&#xff08;icon view&#xff09;和小图标视图&#xff08;small icon view&#xff09;等多种模式显示列表。 一、方法 __…...

kubernetes 资源汇总

kubernetes 资源汇总 官网 英文文档 官方英文文档 中文文档 官方中文文档 github github源码地址 培训认证 也就是linux基金会的认证&#xff0c;上面也提供培训课程 下载资源 官网下载资源&#xff0c;国内的话k8s镜像下载不了&#xff0c;要去镜像站 在线练习 killer…...

每日一题(对标gesp三级答案将在第二天公布)

编程题 题目描述&#xff1a; 小杨为数字4,5,6和7设计了一款表示形式&#xff0c;每个数字占用了66的网格。数字4,5,6和7的表示形式如下&#xff08;此处自行设计复杂一些的表示形式示例&#xff09;&#xff1a; 数字4&#xff1a; …. …. …. …. *… 数字5&#xff1a; …...

让 Win10 上网本 Debug 模式 QUDPSocket 信号槽 收发不丢包的方法总结

在前两篇文章里&#xff0c;我们探讨了不少UDP丢包的解决方案。经过几年的摸索测试&#xff0c;其实方法非常简单, 无需修改代码。 1. Windows 下设置UDP缓存 这个方法可以一劳永逸解决UDP的收发丢包问题&#xff0c;只要添加注册表项目并重启即可。即使用Qt的信号与槽&#…...

Python爬虫之使用BeautifulSoup进行HTML Document文档的解析

BeautifulSoup 是一个用于解析 HTML 和 XML 文档的 Python 库&#xff0c;它为开发者提供了一种简单的方式来查找、遍历和修改文档树。BeautifulSoup 特别擅长处理不规则或格式不佳的标记语言&#xff0c;可以自动更正无效的 HTML&#xff0c;因此在网页抓取&#xff08;Web Sc…...

vue.config.js配置参数说明新手教程

这篇文章主要是对vue.config.js配置文件的主要参数进行一下说明&#xff0c;方便使用时的查询&#xff0c; 下面进行介绍 1、vue.config.js vue.config.js 是一个可选的配置文件&#xff0c;如果项目的 (和 package.json 同级的) 根目录中存在这个文件&#xff0c;那么它会被…...

C# 关于加密技术以及应用(二)

AES&#xff08;Advanced Encryption Standard&#xff09;和 RSA&#xff08;Rivest-Shamir-Adleman&#xff09;是两种不同的加密算法&#xff0c;它们各自有特定的使用场景和优势。下面是它们的主要区别和适用场景&#xff1a; AES&#xff08;高级加密标准&#xff09; 特…...

视频中的某些片段如何制作GIF表情包?

动态表情包&#xff08;GIF&#xff09;已经成为我们日常沟通中不可或缺的一部分。GIF&#xff08;Graphics Interchange Format&#xff09;&#xff0c;即图形交换格式&#xff0c;是一种支持多帧图像和透明度的位图文件格式。它最初由 CompuServe 公司在 1987 年推出&#x…...

图像识别 | Matlab基于卷积神经网络(CNN)的宝可梦识别源程序,GUI界面。附详细的运行说明。

图像识别 | Matlab基于卷积神经网络(CNN)的宝可梦识别源程序&#xff0c;GUI界面。附详细的运行说明。 目录 图像识别 | Matlab基于卷积神经网络(CNN)的宝可梦识别源程序&#xff0c;GUI界面。附详细的运行说明。预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab基…...

String【Redis对象篇】

&#x1f3c6; 作者简介&#xff1a;席万里 ⚡ 个人网站&#xff1a;https://dahua.bloggo.chat/ ✍️ 一名后端开发小趴菜&#xff0c;同时略懂Vue与React前端技术&#xff0c;也了解一点微信小程序开发。 &#x1f37b; 对计算机充满兴趣&#xff0c;愿意并且希望学习更多的技…...

top命令和系统负载

1 top中的字段说明 top是一个实时系统监视工具&#xff0c;可以动态展现出 CPU 使用率、内存使用情况、进程状态等信息&#xff0c;注意这些显示的文本不能直接使用 > 追加到文件中。 [rootvv~]# top -bn 1 | head top - 20:08:28 up 138 days, 10:29, 4 users, load av…...

ES6 混合 ES5学习记录

基础 数组 let arr [数据1&#xff0c;数据2&#xff0c;...数组n] 使用数组 数组名[索引] 数组长度 arr.length 操作数组 arr.push() 尾部添加一个,返回新长度 arr.unshift() 头部添加一个,返回新长度 arr.pop() 删除最后一个,并返回该元素的值 shift 删除第一个单元…...

HTTP 状态码大全

常见状态码 200 OK # 客户端请求成功 400 Bad Request # 客户端请求有语法错误 不能被服务器所理解 401 Unauthorized # 请求未经授权 这个状态代码必须和WWW- Authenticate 报头域一起使用 403 Forbidden # 服务器收到请求但是拒绝提供服务 404 Not Found # 请求资源不存…...

Redis学习(13)| Redisson 看门狗机制深度解析

文章目录 摘要1. 引言2. 看门狗的工作原理2.1 自动续期2.2 防止意外释放2.3 合理配置 3. 应用场景4. 最佳实践4.1 设置合理的lockWatchdogTimeout4.2 避免死锁4.3 监控和日志 5. 实现方式6. 使用示例7. 结论 摘要 Redisson 是一个用于 Redis 的 Java 客户端&#xff0c;它提供…...

【开源大屏】玩转开源积木BI,从0到1设计一个大屏

积木 BI 重磅推出免费大屏设计器&#xff01;功能超强大&#xff0c;操作超流畅&#xff0c;体验超酷炫。快来体验一下吧。 让我们一起来看一下如何从0到1设计一个大屏。 一、积木BI大屏介绍 积木BI可视化数据大屏 是一站式数据可视化展示平台&#xff0c;旨在帮助用户快速通…...

基于PCRLB的CMIMO雷达资源调度方法(MATLAB实现)

集中式多输入多输出CMIMO雷达作为一种新体制雷达&#xff0c;能够实现对多个目标的同时多波束探测&#xff0c;在多目标跟踪领域得到了广泛运用。自从2006年学者Haykin提出认知雷达理论&#xff0c;雷达资源分配问题就成为一个有实际应用价值的热点研究内容。本文基于目标跟踪的…...

PAT--1035 插入与归并

题目描述 根据维基百科的定义&#xff1a; 插入排序是迭代算法&#xff0c;逐一获得输入数据&#xff0c;逐步产生有序的输出序列。每步迭代中&#xff0c;算法从输入序列中取出一元素&#xff0c;将之插入有序序列中正确的位置。如此迭代直到全部元素有序。 归并排序进行如…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error

在前端开发中&#xff0c;JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作&#xff08;如 Promise、async/await 等&#xff09;&#xff0c;开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝&#xff08;r…...

【Veristand】Veristand环境安装教程-Linux RT / Windows

首先声明&#xff0c;此教程是针对Simulink编译模型并导入Veristand中编写的&#xff0c;同时需要注意的是老用户编译可能用的是Veristand Model Framework&#xff0c;那个是历史版本&#xff0c;且NI不会再维护&#xff0c;新版本编译支持为VeriStand Model Generation Suppo…...