CRAFT文字检测算法解析和基于C++和TensorRT的推理实现

本文讲解了CVPR 2019的一篇文字检测算法《Character Region Awareness for Text Detection》的原理,并给出我使用C++和TensorRT重新实现的推理,速度比原版代码快12倍。
论文:https://arxiv.org/pdf/1904.01941.pdf

官方代码:https://github.com/clovaai/CRAFT-pytorch

基于C++和TensorRT的推理代码:https://github.com/yinnhao/CRAFTcpp

目录

  • 1. 文字检测数据集情况总结
  • 2. Introduction
  • 3. Method
    • 3.1 输入图片到Score Map的获取
    • 3.2. Score Map到检测框的获取
    • 3.3 训练
  • 4. 基于C++和TensorRT的推理实现

1. 文字检测数据集情况总结

  • 矩形框数据集
    ICDAR2013:英文;229训练样本+233测试样本;
    ICDAR2015:英文;1000训练样本+500测试样本;
    ICDAR2017:九种语言(包括中文);7200训练样本+9000测试样本;
    MSRA-TD500:英文+中文;300训练样本+200测试样本;
  • 多边形数据集
    TotalText:英文;1255训练样本+300测试样本;内含曲线文本
    CTW-1500:英文+中文;1000训练样本+500测试样本;内含曲线文本

2. Introduction

  • 文字检测的用途
    即时翻译、图像检索、场景解析、地理位置和盲导航

  • 基于Bouding Box的文字检测方法的局限性

    之前的文字检测方法的都是通过预测bouding box来解决,但是在一些难以处理的情况下,例如弯曲、变形或极长的文本,单个边界框的检测可能很难完成。

  • 本文的思路
    做到字符级别的感知,通过自下而上的连接相邻字符,可以处理上述难例;
    但是前提是需要解决问题:现存的数据集通常都是单词级别的label,不包括字符级别的label;

  • 方法简介

    • 我们的框架被称为Character Region Awareness for Text Detection(CRAFT),即字符区域感知文本检测
    • 模型输出两个score map:region score(区域分数) and affinity score(亲和力分数),区域分数用于定位单个字符,亲和力分数用于将单个字符组合成一个实例;
    • 为了弥补缺乏字符级别注释的问题,我们提出了一个弱监督的学习框架,该框架可以在现有的实际单词级别数据集中估算字符级别的地面真值

3. Method

3.1 输入图片到Score Map的获取

请添加图片描述

  1. 模型基于vgg-16-bn构建,编码+解码结构,类似于Unet

  2. 模型输出两个score map:region score(区域分数) and affinity score(亲和力分数)。其中region score代表了当前像素点是字符中心点的概率,而affinity score是当前像素点是相邻字符空白区域中心点的概率,一个例子如下图所示。
    在这里插入图片描述

  3. 输出的map的分辨率是输入图像的1/2,也就是说模型的输入尺寸(1,3,h,w),输出尺寸为(1,2,h//2,w//2)

3.2. Score Map到检测框的获取

根据需要可以得到下面的3种框。

  • 字符级框
    字符级的框可以直接根据region socre map使用分水岭算法得到

  • 四角点box

    1. 初始化一个和输入图像一样大的全0矩阵M,若位置p中的两个score值有一个大于对应的阈值,那么就将M§赋值为1;
      在这里插入图片描述
    2. cv2.connectedComponents 标记连通域
    3. cv2.minAreaRect 获取四角点坐标
  • 多边形框
    在这里插入图片描述

  1. 第一步是沿着扫描方向(x方向)找到字符区域的局部极大值线,在图中表示为在椭圆内部且垂直扫描方向的最长线。
  2. 连接局部极大值的所有中心点的线称为中心线,用黄色表示。
  3. 将局部极大值线旋转到垂直于中心线的位置,以反映字符的倾斜角,用红色箭头表示。局部极大值线的端点是文本多边形边缘控制点的候选点。
  4. 为了完全覆盖文本区域,将最倾斜的两条局部极大值线沿着局部极大值中心线向外移动,形成最终的控制点(绿色点)。移动的终止点为刚好左右椭圆相切的地方。

3.3 训练

训练的前提是需要解决数据问题:1.现存的数据集没有score map对应的真实值; 2. 通常也不包括字符级别的label;

  • 合成数据集上的label生成
    合成数据集上有单个字符的坐标数据,因此可以通过Warp 2D 高斯map的方式构建两个score的label:
    在这里插入图片描述
    区域分数的中心是对角线交点,亲和力分数的中心如上图左图所示,是上三角形中心的连接线;

  • 真实图像数据集使用Weakly-Supervised Learning
    只有单词级别的label,没有字符级别的坐标数据;
    在这里插入图片描述
    对于真实图像数据集,会先对文字部分进行crop,然后使用模型的能力获取score map,并根据字符可划分数量的比例,建立一个confidence map,加入到loss函数中:
    在这里插入图片描述

  • 训练过程

    1. 在合成数据上先训练50k次迭代,然后在真实数据集上进行微调;
    2. 微调时,将真实数据以1:5的比例投入使用;

4. 基于C++和TensorRT的推理实现

原版使用pytorch推理,并且在score map到文字框的过程是在cpu上基于opencv完成,效率较低,我基于cuda c++进行了重写,并使用tensorrt推理,目前不支持多边形框。代码在https://github.com/yinnhao/CRAFTcpp

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/637451.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

simple-jwt快速入门(包含自定制)

simple-jwt快速入门(包含自定制) 目录 simple-jwt快速入门(包含自定制)安装路由层视图层全局配置前端传入参数配置文件定制登录返回格式定制payload格式自定制签发-认证 安装 pip install djangorestframework-simplejwt路由层 from rest_framework_simplejwt.views import T…

SAP 销售业务中免费货物的会计核算

此博文主要介绍SAP销售业务中免费货物解决方案中,免费货物的会计核算。如果需要进一步了解SAP SD 销售与分销业务中,免费货物的标准解决方案概览,可先了解本博客博文:SAP销售与分销中的免费货物解决方案相关文章: htt…

SQLite R*Tree 模块(三十三)

返回:SQLite—系列文章目录 上一篇:SQLite FTS3 和 FTS4 扩展(三十二) 下一篇:SQLite轻量级会话扩展(三十四) 1. 概述 R-Tree 是一个特殊的 专为执行范围查询而设计的索引。R-树最常见的是 用于地理空间系统,其中…

【Interconnection Networks 互连网络】Dragonfly Topology 蜻蜓网络拓扑

蜻蜓拓扑 Dragonfly Topology 1. 拓扑参数2. Topology Description 拓扑描述3. Topology Variations 拓扑变体 蜻蜓拓扑 Dragonfly Topology 1. 拓扑参数 Dragonfly拓扑参数: N N N: 网络中终端(terminal)的总数量 p p p: 连接到每个路由器的终端数量 a a a: 每…

算法|最大堆、最小堆和堆排序的实现(JavaScript)

一些概念 堆&#xff1a;特殊的完全二叉树&#xff0c;具有特定性质的完全二叉树。大根堆&#xff1a;父节点 > 子节点小根堆&#xff1a;父节点 < 子节点 二叉堆也属于完全二叉树&#xff0c;所以可以用数组表示。 若下标从1开始&#xff0c;左节点为 2*i &#xff0…

数字谐振器设计

数字谐振器设计 电路里的谐振:当电路中激励的频率等于电路的固有频率时&#xff0c;电路电磁振荡的振幅也将达到峰值。 形式一 形式二 例子

Python程序设计 字典

教学案例十 字典 1. 判断出生地 sfz.txt文件中存储了地区编码和地区名称 身份证的前6位为地区编码&#xff0c;可以在sfz.txt文件中查询到地区编号对应的地区名称 编写程序&#xff0c;输入身份证号&#xff0c;查询并显示对应的地区名称 若该地区编码不在文件中&#xff0c;…

文本生成任务的评价方法BLEU 和 ROUGE

BLEU 是 2002 年提出的&#xff0c;而 ROUGE 是 2003 年提出的。这两种指标虽然存在着一些问题&#xff0c;但是仍然是比较主流的评价指标。 BLUE BLEU 的全称是 Bilingual evaluation understudy&#xff0c;BLEU 的分数取值范围是 0&#xff5e;1&#xff0c;分数越接近1&a…

【JavaWeb】Day51.Mybatis动态SQL

什么是动态SQL 在页面原型中&#xff0c;列表上方的条件是动态的&#xff0c;是可以不传递的&#xff0c;也可以只传递其中的1个或者2个或者全部。 而在我们刚才编写的SQL语句中&#xff0c;我们会看到&#xff0c;我们将三个条件直接写死了。 如果页面只传递了参数姓名name 字…

把idea的Java代码中的包打开,以层级的方式显示

我们在使用idea敲谢Java代码的时候&#xff0c;会注意到包显示在一起&#xff0c;这样对于有一些开发来说节省了空间&#xff0c;但是对于一些程序员来说看起来不舒服&#xff0c;而且不好操作。 针对这样的情况&#xff0c;我们需要取消一项勾选。 点击这三个... 取消这个按钮…

LeetCode 热题 100 题解:普通数组部分

文章目录 题目一&#xff1a;最大子数组和&#xff08;No. 53&#xff09;题解 题目二&#xff1a;合并区间&#xff08;No. 56&#xff09;题解 题目三&#xff1a;轮转数组&#xff08;No. 189&#xff09;题解 题目四&#xff1a;除自身以外数组的乘积&#xff08;No. 238&a…

深入剖析Spring框架:循环依赖的解决机制

你好&#xff0c;我是柳岸花开。 什么是循环依赖&#xff1f; 很简单&#xff0c;就是A对象依赖了B对象&#xff0c;B对象依赖了A对象。 在Spring中&#xff0c;一个对象并不是简单new出来了&#xff0c;而是会经过一系列的Bean的生命周期&#xff0c;就是因为Bean的生命周期所…