PaddleOCR 文字检测部分源码学习(1)
2021SC@SDUSC
代码位置:tools->infer->predict_det.py
class TextDetector(object):def __init__(self, args):self.args = argsself.det_algorithm = args.det_algorithmpre_process_list = [{'DetResizeForTest': {'limit_side_len': args.det_limit_side_len,'limit_type': args.det_limit_type,}}, {'NormalizeImage': {'std': [0.229, 0.224, 0.225],'mean': [0.485, 0.456, 0.406],'scale': '1./255.','order': 'hwc'}}, {'ToCHWImage': None}, {'KeepKeys': {'keep_keys': ['image', 'shape']}}]postprocess_params = {}
这里是一些参数的初始化。
if self.det_algorithm == "DB":postprocess_params['name'] = 'DBPostProcess'postprocess_params["thresh"] = args.det_db_threshpostprocess_params["box_thresh"] = args.det_db_box_threshpostprocess_params["max_candidates"] = 1000postprocess_params["unclip_ratio"] = args.det_db_unclip_ratiopostprocess_params["use_dilation"] = args.use_dilationpostprocess_params["score_mode"] = args.det_db_score_modeelif self.det_algorithm == "EAST":postprocess_params['name'] = 'EASTPostProcess'postprocess_params["score_thresh"] = args.det_east_score_threshpostprocess_params["cover_thresh"] = args.det_east_cover_threshpostprocess_params["nms_thresh"] = args.det_east_nms_threshelif self.det_algorithm == "SAST":pre_process_list[0] = {'DetResizeForTest': {'resize_long': args.det_limit_side_len}}postprocess_params['name'] = 'SASTPostProcess'postprocess_params["score_thresh"] = args.det_sast_score_threshpostprocess_params["nms_thresh"] = args.det_sast_nms_threshself.det_sast_polygon = args.det_sast_polygonif self.det_sast_polygon:postprocess_params["sample_pts_num"] = 6postprocess_params["expand_scale"] = 1.2postprocess_params["shrink_ratio_of_width"] = 0.2else:postprocess_params["sample_pts_num"] = 2postprocess_params["expand_scale"] = 1.0postprocess_params["shrink_ratio_of_width"] = 0.3else:logger.info("unknown det_algorithm:{}".format(self.det_algorithm))sys.exit(0)
这是对三大文字检测算法的选择,即EAST算法,SAST算法和DB算法。
EAST算法:
- 简单而强大的pipeLine,可以在自然场景中进行快速准确的文本检测。该Pipeline直接预测图像中任意方向和矩形形状的文本或文本行,通过单个神经网络消除不必要的中间步骤(例如候选聚合和单词分割)。
- 仅有两个阶段:一个阶段是基于全卷积网络(FCN)模型,直接产生文本框预测;第二个阶段是对生成的文本预测框(可以是旋转矩形或矩形)经过非极大值抑制以产生最终结果。该模型放弃了不必要的中间步骤,进行端到端的训练和优化。
3. 算法框架:首先,将图像送到FCN网络结构中并且生成单通道像素级的文本分数特征图和多通道几何图形特征图。文本区域采用了两种几何形状:旋转框(RBOX)和水平(QUAD),并为每个几何形状设计了不同的损失函数;然后,将阈值应用于每个预测区域,其中评分超过预定阈值的几何形状被认为是有效的,并且保存以用于随后的非极大抑制。NMS之后的结果被认为是pipeline的最终结果。
SAST算法:百度自研文字检测算法,一种基于分割的one-shot任意形状文本检测器
实际上就是EAST算法的扩展,一阶段,输出为multitask,各个分支相互校正。
它利用基于全卷积网络(FCN)的上下文多任务学习框架来学习文本区域的各种几何特征,从而构造文本区域的多边形表示。考虑到文本的连续性特征,通过引入Context Attention Block 捕捉像素的长范围相关性,一次来获得更加可靠的分割结果。在后处理过程中,提出一个点到边的对齐方法,来将像素聚类称为文本实力,这样就通过一次采样图片,把高级别的特征和低级别的特征结合在一起。此外,利用所提出的几何性质可以更有效地提取任意形状文本的多边形表示。
def order_points_clockwise(self, pts):xSorted = pts[np.argsort(pts[:, 0]), :]leftMost = xSorted[:2, :]rightMost = xSorted[2:, :]leftMost = leftMost[np.argsort(leftMost[:, 1]), :](tl, bl) = leftMostrightMost = rightMost[np.argsort(rightMost[:, 1]), :](tr, br) = rightMostrect = np.array([tl, tr, br, bl], dtype="float32")return rect
作用:顺时针对点进行排序,首先根据横坐标找到最左边和最右边的的点,然后针对最左边的数据根据他们的纵坐标进行排序,我们可以找到最上面和最下面的点
代码位置:deploy->hubserving->ocr_det->module.py
def predict(self, images=[], paths=[]):if images != [] and isinstance(images, list) and paths == []:predicted_data = imageselif images == [] and isinstance(paths, list) and paths != []:predicted_data = self.read_images(paths)else:raise TypeError("The input data is inconsistent with expectations.")assert predicted_data != [], "There is not any image to be predicted. Please check the input data."all_results = []for img in predicted_data:if img is None:logger.info("error in loading image")all_results.append([])continuedt_boxes, elapse = self.text_detector(img)logger.info("Predict time : {}".format(elapse))rec_res_final = []for dno in range(len(dt_boxes)):rec_res_final.append({'text_region': dt_boxes[dno].astype(np.int).tolist()})all_results.append(rec_res_final)return all_results
作用:获取预测图像中的文本框。
输入参数:def predict(self, images=[], paths=[])
- self:实例对象本身
- images:一个列表,且每个图像的形状为[H,W,C]
- paths: 图像的路径,文本检测框的结果和图像的保存路径。
for dno in range(len(dt_boxes)):rec_res_final.append({'text_region': dt_boxes[dno].astype(np.int).tolist()})
PaddleOCR 文字检测部分源码学习(1)相关推荐
- PaddleOCR 文字检测部分源码学习(8)-损失函数(4)
代码位置:ppocr->losser->det_sast_loss.py sast算法的loss函数 2021SC@SDUSC # copyright (c) 2019 PaddlePad ...
- python图片转文字_【收藏】图片转成文字的方法总结,python批量图片转文字信息参考源码...
在日常办公或者学习中,往往存在这样一个工作场景,比如,"老王,我这里有一张图片,你把里面的文字信息给我整理出来",都2021年了,你真的还在手敲图片文字信息么?那么还不赶紧收藏这篇 ...
- 【收藏】图片转成文字的方法总结,python批量图片转文字信息参考源码
在日常办公或者学习中,往往存在这样一个工作场景,比如,"老王,我这里有一张图片,你把里面的文字信息给我整理出来",都2021年了,你真的还在手敲图片文字信息么?那么还不赶紧收藏这篇 ...
- 求一个文章原创检测工具源码 C#的 谢谢 私我
求一个文章原创检测工具源码 C#的 谢谢 私我@TOC 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页.如果你想学习如何使用Markdown编辑器, ...
- ASP.NET Core 源码学习之 Options[2]:IOptions
在 上一篇 中,介绍了一下Options的注册,而使用时只需要注入 IOption 即可: public ValuesController(IOptions<MyOptions> opti ...
- Java多线程之JUC包:Semaphore源码学习笔记
若有不正之处请多多谅解,并欢迎批评指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/go2sea/p/5625536.html Semaphore是JUC ...
- RocketMQ源码学习
RocketMQ源码学习 文章目录 RocketMQ源码学习 Producer 是怎么将消息发送至 Broker 的? 同步发送 异步发送 队列选择器 事务消息 原理 Broker 是怎么处理客户端发 ...
- RocketMQ 源码学习笔记 Producer 是怎么将消息发送至 Broker 的?
RocketMQ 源码学习笔记 Producer 是怎么将消息发送至 Broker 的? 文章目录 RocketMQ 源码学习笔记 Producer 是怎么将消息发送至 Broker 的? 前言 项目 ...
- Laravel源码学习文章汇总
过去一年时间写了20多篇文章来探讨了我认为的Larave框架最核心部分的设计思路.代码实现.通过更新文章自己在软件设计.文字表达方面都有所提高,在刚开始决定写Laravel源码分析地文章的时候我地期望 ...
最新文章
- 使用LSTM进行情感分析
- windows Server 2003 尝试安装.NET Framework 4 失败
- Razor 也可说是一个asp.net模板引擎,用不着学习 T4 了
- elementui 弹窗 显示详细信息_ElementUI中el-table双击单元格事件并获取指定列的值和弹窗显示详细信息...
- 村土地利用规划和村庄规划的区别和联系
- git拉取请求_向需要的开源项目提供拉取请求的礼物
- 服务发现和注册和Eureka
- 万圣节主题海报设计,少不了的素材
- 【补】day3 table标签
- C语言代码实现最小二乘法线性拟合直线
- 2021年了,还有人认为视觉导航不如激光导航
- 《禅者的初心》读书笔记(1)
- 画板数据保存成文件的两种方法小结
- 数据服务器怎么进行日常维护
- Java经典300例-基础篇-004:整数类型最大值
- 解析华为OSPF协议
- 计算机网教答辩,计算机论文答辩老师一般问些什么问题?需要怎么回答?
- socket 编程基础
- 独立WAP交友网站趋势分析
- java分页展示_Java实现分页展示
热门文章
- [下载演讲稿]数字藏品与元宇宙存储—数字新世界的“土壤”
- 对 PO、BO、DTO、VO 的理解
- ios音频相关基础知识
- EPSON机械手跟相机搭配走tcp ip协议,及跟plc通讯将手动操作部分映射到触摸屏
- 独立产品灵感周刊 DecoHack #20 - 如何停止来自金钱的压力
- Excel导入数据库方式
- cpp map 获取所有 key_自动获取雷电模拟器窗口句柄
- Java 实现Grpc服务通信
- PHP storm安装教程
- html 最大输入长度,TextArea设置MaxLength属性最大输入值的js代码