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

news2025/1/16 13:52:28

本文讲解了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.coloradmin.cn/o/1623067.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

echarts地图记录

小记录: 如果调整地图大小不管用的时候,看一下map的值是否为china 当值为china的时候,地图会加上“南海诸岛”部分,尝试修改map的值

Netfilter漏洞提权利用(CVE-2023-35001)

前言 Netfilter是一个用于Linux操作系统的网络数据包过滤框架,它提供了一种灵活的方式来管理网络数据包的流动。Netfilter允许系统管理员和开发人员控制数据包在Linux内核中的处理方式,以实现网络安全、网络地址转换(Network Address Transl…

centos7搭建maven私服nexus

1.nexus Nexus Repository Manager(通常简称 Nexus 或 Nexus RM)是由Sonatype公司开发的一款开源的、强大的软件仓库管理工具,主要用于企业级的二进制组件(如Java库、Node.js模块、Python包等)存储、管理和分发。 官方…

定序器导出fbx到max里对位k动作

可以把场景移动到原点去k动作,然后可以恢复到ue4的位置 -- 定义全局变量 global CenterPoint undefined global averageCenter [0,0,0]-- 定义对话框 rollout restoreRollout "定序器>FBX>MAX" (button CreateButton "建立中心点" wid…

使用JS代理 实现大对象的功能拆解

序言 在Android开发中,可以通过webView的addJavascriptInterface方法注入一个对象到网页中。但是随着开发的需求越来越多。这个对象身上的方法也越来越多。这个对象对应的java类,体积越来越大,不利于维护。为了在不影响之前代码的基础上。把…

操作系统安全:Windows与Linux的安全标识符,身份鉴别和访问控制

「作者简介」:2022年北京冬奥会中国代表队,CSDN Top100,学习更多干货,请关注专栏《网络安全自学教程》 操作系统有4个安全目标,也就是说想要保证操作系统的安全,就必须实现这4个需求: 标识系统…

网络协议安全:OSI七层模型分层及作用,数据封装与解封过程,数据传输过程。

「作者简介」:2022年北京冬奥会中国代表队,CSDN Top100,学习更多干货,请关注专栏《网络安全自学教程》 这一章节我们需要知道OSI分哪七层,每层的作用,知道数据在七层模型中是怎样传输的,封包和解…

数据结构练习:链表扩容

大致步骤: 一:创建一个新链表,遍历原链表的同时,将原链表的值复制给新链表 二:将新链表插入到原链表中(大致如下) 注: 1.头结点是不存有数据的 2.记得malloc后要free 3.*&是…

男士休闲裤比较好的品牌有哪些?高品质休闲男装推荐

穿衣服最重要的并不是要求多好看多时尚,相信绝大部分年纪在23岁以上的男同胞们更希望穿一些简约好搭配的款式,更重要的其实就是要求质量耐穿,以及有足够好的舒适性。 但是现在市面上的品牌实在是太多了,而且质量也参差不齐&#x…

SpringBoot 3.x + Swagger3 踩坑实录

问题描述 维护的SpringBoot版本是3.0版本,翻教程的时候发现很多SpringBoot2.x版本用的都是springfox,但问题是在SpringBoot3.x版本后,逐渐不支持springfox,强行启动会导致异常,现阶段使用的Springdoc进行替换。 参考…

设计模式-六大原则

设计模式的六大原则是软件工程中的基本概念,使得构建可维护、可扩展和可重用的代码。 1.单一职责原则(Single Responsibility Principle):一个类或方法应该只有一个引起变化的原因,确保类或模块的功能高度内聚。 案例&…

力扣数据库题库学习(4.22日)

577. 员工奖金 问题链接 思路分析 Employee表与Bonus表通过empId字段可以连接,需求是查出奖金少于1000的员工名和奖金值。 这里奖金少于1000的情况就是没有奖金有奖金但少于1000 这里我给出的解决方案就是使用左连接,将Employee表作为左表&#xff…

c++二叉树的进阶--二叉搜索树

1. 二叉搜索树的概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值 它的左…

企业为什么要选择通配符SSL证书使用?

企业选择使用通配符SSL证书主要是出于以下几个重要原因: 1. 经济性: - 节省成本:相较于为每一个子域名单独购买并维护单独的SSL证书,通配符证书能够以一张证书覆盖同一主域名下的所有同级子域名,无需为新增或已有的子域…

SpringBoot框架——8.MybatisPlus常见用法(常用注解+内置方法+分页查询)

1.MybatisPlus常用注解: 1.1 当数据库、表名和字段名和实体类完全一致时无需加注解,不一致时: TableName指定库名 TableId指定表名 TableField指定字段名 1.2 自增主键: TableId(typeIdType.AUTO) private Long id; 1.3 实体类中属…

【JAVA】java 中的Stream 常用函数

java 中的Stream 常用函数 一、简介1.1、什么是Stream?1.2、创建Stream1.3、Stream的特性 二、Stream的操作2.1、中间操作:2.2、终端操作:2.3、Stream的并行处理 三、Stream 常用函数四、使用示例4.1、计算集合中偶数的平方和:4.2…

新手也能学会的甘特图制作教程

甘特图是什么? 甘特图(Gantt Chart)是一种以图表形式直观展示项目计划的工具,由20世纪初的管理学家亨利甘特(Henry Gantt)发明并命名。它具有以下几个主要特点: 水平时间轴 甘特图的横轴是一条时间轴,通常按天、周或月来刻度,直观展示了项目从开始到结束的整个时间…

【信息收集】端口扫描masscan负载均衡识别lbd

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与学习之用,读者将信息做其他用途,由Ta承担全部法律及连带责任,文章作者不承担任何法律及连带责任。 1、什么是masscan masscan在kali系统上是自带的端口扫描…

回归预测 | Matlab实现BO-RF贝叶斯优化随机森林多变量回归预测

回归预测 | Matlab实现BO-RF贝叶斯优化随机森林多变量回归预测 目录 回归预测 | Matlab实现BO-RF贝叶斯优化随机森林多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现BO-RF贝叶斯优化随机森林多变量回归预测; 2.输入7个特征&#xf…

考研日常记录(upd 24.4.24)

由于实在太无聊了 , 所以记录以下考研备考日常 , 增加一点成就感 , 获得一点前进动力。 文章目录 2024.4.18 周四课程情况:时间规划: 2024.4.19 周五课程情况:时间规划: 2024.4.20 周六2024.4.2…