MMOCR之DBNET文字检测

2023-10-26

MMCV系列之MMOCR

注:大家觉得博客好的话,别忘了点赞收藏呀,本人每周都会更新关于人工智能和大数据相关的内容,内容多为原创,Python Java Scala SQL 代码,CV NLP 推荐系统等,Spark Flink Kafka Hbase Hive Flume等等~写的都是纯干货,各种顶会的论文解读,一起进步。
今天和大家分享一下MMOCR之DBNET文字检测
论文地址:https://arxiv.org/pdf/1911.08947.pdf
代码地址:https://github.com/open-mmlab/mmocr
#博学谷IT学习技术支持#



前言

MMCV系列我会一直更新的,是CV很火很实用的一套框架,非常推荐做CV模型的小伙伴实用。
今天和大家分享一下MMOCR之DBNET文字检测。
下一次是和大家分享MMOCR之文字识别。
最后是关键信息抽取。都是一个完整的系列。
先来看一下模型最终的输出效果。可以看到效果还是不错的,都框出来了。
在这里插入图片描述


一、如何使用MMCV?

1.首先先找到模型所在的位置
在这里插入图片描述
2.找到train.py,然后把之前模型所在的位置作为参数给配进去
在这里插入图片描述
3.运行train.py,这里虽然会报错,但是会在work_dirs里生成新的模型配置文件。
然后改个名字,再把新的配置文件地址写进train.py,就可以了
在这里插入图片描述

二、DBNET模型的整体架构是什么?

在这里插入图片描述

model = dict(
    type='DBNet',
    backbone=dict(
        type='mmdet.ResNet',
        depth=18,
        num_stages=4,
        out_indices=(0, 1, 2, 3),
        frozen_stages=-1,
        norm_cfg=dict(type='BN', requires_grad=True),
        init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet18'),
        norm_eval=False,
        style='caffe'),
    neck=dict(
        type='FPNC', in_channels=[64, 128, 256, 512], lateral_channels=256),
    bbox_head=dict(
        type='DBHead',
        in_channels=256,
        loss=dict(type='DBLoss', alpha=5.0, beta=10.0, bbce_loss=True),
        postprocessor=dict(type='DBPostprocessor', text_repr_type='quad')),
    train_cfg=None,
    test_cfg=None)

在新生成的配置文件里可以看到模型的整体架构非常的简单
backbone层用的是传统的ResNet
neck层用的是类似unet网络的FPNC
只有最后的head层稍有不同

三、模型详解

1.Backbone

这里非常简单就是一个ResNet提取特征,输出4种不同大小的特征图,没有任何新意。代码省略。

2.Neck

这里也非常简单,FPNC就是用ResNet的输出,分别做上采样,和前一层的输出纬度相同,最后做相加操作即可,和以前的unet结构差不多。
在这里插入图片描述

代码如下(示例):

    @auto_fp16()
    def forward(self, inputs):
        """
        Args:
            inputs (list[Tensor]): Each tensor has the shape of
                :math:`(N, C_i, H_i, W_i)`. It usually expects 4 tensors
                (C2-C5 features) from ResNet.

        Returns:
            Tensor: A tensor of shape :math:`(N, C_{out}, H_0, W_0)` where
            :math:`C_{out}` is ``out_channels``.
        """
        assert len(inputs) == len(self.in_channels)
        # build laterals
        laterals = [
            lateral_conv(inputs[i])
            for i, lateral_conv in enumerate(self.lateral_convs)
        ]
        used_backbone_levels = len(laterals)
        # build top-down path
        for i in range(used_backbone_levels - 1, 0, -1):
            prev_shape = laterals[i - 1].shape[2:]
            laterals[i - 1] += F.interpolate(
                laterals[i], size=prev_shape, mode='nearest')
        # build outputs
        # part 1: from original levels
        outs = [
            self.smooth_convs[i](laterals[i])
            for i in range(used_backbone_levels)
        ]

        for i, out in enumerate(outs):
            outs[i] = F.interpolate(
                outs[i], size=outs[0].shape[2:], mode='nearest')
        out = torch.cat(outs, dim=1)

        if self.conv_after_concat:
            out = self.out_conv(out)

        return out

最终得到tensor(16,256,160,160),其中16是batch_size,256是特征图的个数,160*160是每个特征图的大小。

3.Head

head层比较有新意,也是本文的亮点所在。
在这里插入图片描述

在这里插入图片描述
这里用了3种不同的标签,分别是概率图标签,阈值图标签,和二值图标签。
在训练的时候需要算3种损失,而在inference的时候只用概率图的最后输出即可。
也就是说阈值图标签,和二值图标签都是训练时候用,起到辅助作用。

    def forward(self, inputs):
        """
        Args:
            inputs (Tensor): Shape (batch_size, hidden_size, h, w).

        Returns:
            Tensor: A tensor of the same shape as input.
        """
        prob_map = self.binarize(inputs)
        thr_map = self.threshold(inputs)
        binary_map = self.diff_binarize(prob_map, thr_map, k=50)
        outputs = torch.cat((prob_map, thr_map, binary_map), dim=1)
        return outputs

概率图标签的ground_truth会比真实的标签小一圈,原因是为了更好的区分两个相连较近的检测目标。
阈值图标签是为了让模型学习的时候可以更好的学习到边框的信息。
二值图标签是用概率图标签减去阈值图标签的值,然后放到类似sigmoid函数中,其目的是为了让损失可倒。这样损失就可以传递。
在这里插入图片描述

4.损失函数

论文中概率图,和二值图用的都是BCE损失。而阈值图用的是L1损失,都是很普通的方法。
但是在代码中二值图用的DiceLoss,可能是为了考虑到样本不平衡的关系。

@LOSSES.register_module()
class DiceLoss(nn.Module):

    def __init__(self, eps=1e-6):
        super().__init__()
        assert isinstance(eps, float)
        self.eps = eps

    def forward(self, pred, target, mask=None):

        pred = pred.contiguous().view(pred.size()[0], -1)
        target = target.contiguous().view(target.size()[0], -1)

        if mask is not None:
            mask = mask.contiguous().view(mask.size()[0], -1)
            pred = pred * mask
            target = target * mask

        a = torch.sum(pred * target)
        b = torch.sum(pred)
        c = torch.sum(target)
        d = (2 * a) / (b + c + self.eps)

        return 1 - d


总结

今天和大家分享一下MMOCR之DBNET文字检测。DBNET文字检测是一篇非常经典的文字检测方法,主要是在head层和运用了3种不同的标签,如何标注标签相对麻烦,大家感兴趣可以看一下源码。主要是为了提升模型的效果。其实直接用概率图标签就行,但是效果肯定差一点。文章相对比较简单,容易理解。
下一次是和大家分享MMOCR之文字识别。最后是关键信息抽取,都是一个完成的系列。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MMOCR之DBNET文字检测 的相关文章

随机推荐

  • 荔枝派Zero(全志V3S)基于QT实现在LCD显示图片

    文章目录 前言 一 配置 buildroot 及编译 二 写 QT 代码 三 编译可执行文件 四 拷贝到 SD 卡 五 上板子测试 六 资源自取 前言 有这样一个需求 通过配置 QT 在 linux 下实现显示我所想要显示的图片 实现的方式
  • 首页生成静态的html,关于网站生成静态html文件的两种方案思考

    关于网站生成静态文件有利有弊 通常来讲交互性的站点不太适合静态化 如社交网站 论坛之类的站点等等 如果以资讯内容展示为主 生成静态文件能够很好的提高服务器吞吐量 下面提供两种生成静态文件的方案 分析下其中的利和弊 1 后台增加生成静态页面功
  • hexo博客配置

    title hexo博客配置 cover img 2 jpg categories HEXO博客 1 网站图标更换 themes hexo theme Annie layout partial head ejs 我中间这个hexo them
  • NUC980开源项目8-官方Uboot编译

    上面是我的微信和QQ群 欢迎新朋友的加入 项目码云地址 国内下载速度快 https gitee com jun626 nuc980 open source project 项目github地址 https github com Jun117
  • linux XFRM整体框架简单分析

    author jonathan 本文档的CopyRight归jonathan所有 可自由转载 转载时请保持文档的完整性 Linux 的 XFRM框架多简单阿 6年前整理过 到现在还记得基本原理 说明xfrm设计的是多么简单明了 不过网上都是
  • Selenium被禁止的解决方法

    selenium被禁止的解决方法 遇到问题 selenium做爬虫能解决很多反爬问题 但是selenium也有很多特征可以被识别 比如用selenium驱动浏览器后window navigator webdriver值是true 而正常运行
  • python print format_Python format()格式化输出方法详解

    前面章节介绍了如何使用 操作符对各种类型的数据进行格式化输出 这是早期 Python 提供的方法 自 Python 2 6 版本开始 字符串类型 str 提供了 format 方法对字符串进行格式化 本节就来学习此方法 format 方法的
  • canvas详解03-绘制图像和视频

    canvas 更有意思的一项特性就是图像操作能力 可以用于动态的图像合成或者作为图形的背景 以及游戏界面 Sprites 等等 浏览器支持的任意格式的外部图片都可以使用 比如 PNG GIF 或者 JPEG 你甚至可以将同一个页面中其他 c
  • Tensorflow和anaconda的历史版本镜像,清华源镜像下载地址

    清华源镜像下载地址 https pypi tuna tsinghua edu cn simple tensorflow gpu tensorflow和cuda版本对应关系见该博客https blog csdn net qq 27825451
  • HCIA综合实验(以华为eNSP为例)

    如有错误 敬请谅解 此文章仅为本人学习笔记 仅供参考 如有冒犯 请联系作者删除 基础知识简介 网络技能树技能树https edu csdn net skill network utm source AI act network catego
  • android 功能模块之通讯模块

    Android通讯录开发之实现全选 反选功能 2014年1月15日 实现全选 反选不是什么难的事情 就只是用另外一个数据结构来存储被选中的状态 通过刷新列表来更新列表的显示状态 下面是实现效果 定义一个散列表来存储选中状态 java vie
  • 电机PID调试

    电机PID调试 电机PID调试 一 直流电机原理与TB6612 1 1 电机原理 1 2 减速器作用 1 3 电机实物接线图 1 4 电机控制芯片 二 编码器使用以及测速原理 2 1 编码器原理 2 1 编码器接线 2 1 编码器软件四倍
  • Matlab——m_map指南(2)

    3 海岸线和深度测量 3 1 1 海岸线选项 m coast line optional line arguments m coast line optional line arguments m map 的海岸线数据可以使用m coast
  • 锦囊2—修改已经存在了的ES数据结构

    修改已经存在了的ES数据结构 问题背景 由于ElasticSearch没有像mysql一样可以直接字段数据类型的方法 因此需要通过创建中间索引 data index 1 备份数据到中间索引 data index 1 然后删除原索引 data
  • 华为OD题目: 快速开租建站

    华为OD题目 快速开租建站 知识点 BFSQ搜索拓扑排序 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 当前IT部门支撑了子公司颗粒化业务 该部门需要实现为子公司快速开租建站的能力 建站是指在一个全新的环境部署一套IT服务
  • An orientation marker must be set prior to enabling/disabling widget

    Set up the QVTK window viewer reset new pcl visualization PCLVisualizer viewer false viewer gt addCoordinateSystem 1000
  • 梦幻模拟战更新服务器正在维护,梦幻模拟战1月24日更新公告 新活动揭示的哲学开放[多图]...

    梦幻模拟战在1月24日对游戏进行了更新 开放了最新的活动揭示的哲学 并有丰厚的奖励等着玩家们获取 接下来安族小编就带大家来看看具体更新公告 服务器将在1月24日6 00进行更新维护 预计维护时长约90分钟 维护期间指挥官无法登陆服务器 给您
  • 【华为OD统一考试B卷

    文章目录 题目描述 输入描述 输出描述 用例 C java javascript python 题目描述 对一个数据a进行分类 分类方法为 此数据a 四个字节大小 的四个字节相加对一个给定的值b 取模 如果得到的结果小于一个给定的值c 则数
  • HDOJ 1827 - Summer Holiday 简单的tarjan求强联通分量+缩点

    题意 听说lcy帮大家预定了新马泰7日游 Wiskey真是高兴的夜不能寐啊 他想着得快点把这消息告诉大家 虽然他手上有所有人的联系方式 但是一个一个联系过去实在太耗时间和电话费了 他知道其他人也有一些别人的联系方式 这样他可以通知其他人 再
  • MMOCR之DBNET文字检测

    MMCV系列之MMOCR 注 大家觉得博客好的话 别忘了点赞收藏呀 本人每周都会更新关于人工智能和大数据相关的内容 内容多为原创 Python Java Scala SQL 代码 CV NLP 推荐系统等 Spark Flink Kafka