论文连接:https://arxiv.org/pdf/1911.08947.pdf

github链接:github.com

网络结构

  • 首先,图像输入特征提取主干,提取特征;
  • 其次,特征金字塔上采样到相同的尺寸,并进行特征级联得到特征F;
  • 然后,特征F用于预测概率图(probability map P)和阈值图(threshold map T)
  • 最后,通过P和F计算近似二值图(approximate binary map B)

在训练期间对P,T,B进行监督训练,P和B是用的相同的监督信号(label)。在推理时,只需要P或B就可以得到文本框。

网络输出:

1、probability map, wh1 , 代表像素点是文本的概率

2、threshhold map, wh1, 每个像素点的阈值

3、binary map, wh1, 由1,2计算得到,计算公式为DB公式

如下图:

下载代码

从WenmuZhou/DBNet.pytorch: A pytorch re-implementation of Real-time Scene Text Detection with Differentiable Binarization (github.com)获取代码,然后解压。然后安装缺少的安装包

pip install Polygon3 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install addict
pip install imgaug

根据自己的环境,环境不同,安装的包也不相同。

在pycharm的Terminal下面执行:

python tools/train.py --config_file "config/icdar2015_resnet18_FPN_DBhead_polyLR.yaml"

如果缺少包就会包错误,如果看不到错误,说明都安装了。

数据集

数据集使用icdar2015,网页链接:Downloads - Incidental Scene Text - Robust Reading Competition (uab.es),需要注册。

选择Task4.1:Text Localization

数据的详细介绍:Tasks - Incidental Scene Text - Robust Reading Competition (uab.es)

任务 4.1:文本本地化 对于文本本地化任务,我们将为每个图像提供单词边界框。 基本事实作为单独的文本文件(每个图像一个)给出,其中每一行指定一个单词边界框的坐标及其以逗号分隔格式的转录(参见图 1)。

对于文本本地化任务,地面实况数据以单词边界框的形式提供。 与挑战 1 和 2 不同,边界框在挑战 4 中不是轴定向的,它们由四个角的坐标以顺时针方式指定。 对于训练集中的每个图像,将按照命名约定提供一个单独的 UTF-8 文本文件:

gt_[image name].txt

​ 文本文件是逗号分隔的文件,其中每一行将对应于图像中的一个单词,并给出其边界框坐标(四个角,顺时针)及其格式的转录:

x1, y1, x2, y2, x3, y3, x4, y4, transcription

请注意,第八个逗号后面的任何内容都是转录的一部分,并且不使用转义字符。 “不关心”区域在基本事实中以“###”的转录表示。 作者将被要求自动定位图像中的文本并返回边界框。 结果必须在每个图像的单独文本文件中提交,每行对应于上述格式的边界框(逗号分隔值)。 应提交包含所有结果文件的单个压缩(zip 或 rar)文件。 如果您的方法无法为图像生成任何结果,您可以包含一个空的结果文件或根本不包含任何文件。 与挑战 1 和 2 不同,结果的评估将基于单一的 Intersection-over-Union 标准,阈值为 50%,类似于对象识别和 Pascal VOC 挑战 [1] 中的标准做法。

数据集下载完成后可以得到四个文件,如下图:

将ch4_training_images.zip解压到./datasets\train\img下面。

将ch4_training_localization_transcription_gt.zip解压到./datasets\train\gt下面。

将ch4_test_images.zip解压到./datasets\test\img下面。

将Challenge4_Test_Task1_GT.zip解压到./datasets\test\gt下面。

接下来对数据集做预处理,作者写Ubuntu系统下的处理脚本generate_lists.sh,所以如果用的系统是UBuntu,则执行脚本即可

bash generate_lists.sh

如果是Win10平台则需要写python脚本。新建getdata.py,插入代码:

import os
def get_images(img_path):'''find image files in data path:return: list of files found'''files = []exts = ['jpg', 'png', 'jpeg', 'JPG', 'PNG']for parent, dirnames, filenames in os.walk(img_path):for filename in filenames:for ext in exts:if filename.endswith(ext):files.append(os.path.join(parent, filename))breakprint('Find {} images'.format(len(files)))return sorted(files)def get_txts(txt_path):'''find gt files in data path:return: list of files found'''files = []exts = ['txt']for parent, dirnames, filenames in os.walk(txt_path):for filename in filenames:for ext in exts:if filename.endswith(ext):files.append(os.path.join(parent, filename))breakprint('Find {} txts'.format(len(files)))return sorted(files)if __name__ == '__main__':import jsonimg_train_path = './datasets/train/img'img_test_path = './datasets/test/img'train_files = get_images(img_train_path)test_files = get_images(img_test_path)txt_train_path = './datasets/train/gt'txt_test_path = './datasets/test/gt'train_txts = get_txts(txt_train_path)test_txts = get_txts(txt_test_path)n_train = len(train_files)n_test = len(test_files)assert len(train_files) == len(train_txts) and len(test_files) == len(test_txts)# with open('train.txt', 'w') as f:with open('./datasets/train.txt', 'w') as f:for i in range(n_train):line = train_files[i] + '\t' + train_txts[i] + '\n'f.write(line)with open('./datasets/test.txt', 'w') as f:for i in range(n_test):line = test_files[i] + '\t' + test_txts[i] + '\n'f.write(line)

逻辑不复杂,分别将train和test的img文件列表和gt文件列表对应起来保存到train.txt和test.txt中。

完成上面数据的处理就可以开始训练了

训练

到这里已经完成大部分的工作了,只需要对config文件参数做适当的修改就可以开始训练了。

本次训练使用的config文件是./config/icdar2015_resnet18_FPN_DBhead_polyLR.yaml,修改学习率、优化器、BatchSize等参数,如下图:

上面用红框标注的参数,大家根据实际的情况做修改,我的卡是3090,BatchSize设置32.

参数设置完成后,就开启训练,在pycharm的Terminal下面执行:

CUDA_VISIBLE_DEVICES=0 python tools/train.py --config_file "config/icdar2015_resnet18_FPN_DBhead_polyLR.yaml"

测试

打开./tools/predict.py,查看参数:

def init_args():import argparseparser = argparse.ArgumentParser(description='DBNet.pytorch')parser.add_argument('--model_path', default=r'model_best.pth', type=str)parser.add_argument('--input_folder', default='./test/input', type=str, help='img path for predict')parser.add_argument('--output_folder', default='./test/output', type=str, help='img path for output')parser.add_argument('--thre', default=0.3,type=float, help='the thresh of post_processing')parser.add_argument('--polygon', action='store_true', help='output polygon or box')parser.add_argument('--show', default=True,action='store_true', help='show result')parser.add_argument('--save_resut', default=True, action='store_true', help='save box and score to txt file')args = parser.parse_args()return args

model_path:模型的路径。

input_folder:待测试图片的路径。

output_folder:输出结果的路径。

thre:最低置信度。

polygon:多边形还是框,True为多边形,False为box。建议设置为False。

show:是否展示。

save_resut:是否保存结果。

新建input文件夹,放入测试图片,在pycharm的Terminal执行如下命令:

python tools/predict.py --model_path output/DBNet_resnet18_FPN_DBHead/checkpoint/model_best.pth --input_folder ./input --output_folder ./output --thre 0.7

执行完成后就可以在output文件夹中查看结果了:

总结

今天,我们演示了如果使用DBNet训练和测试。总体看起来不是很难。欢迎大家试用。
完整的代码:https://download.csdn.net/download/hhhhhhhhhhwwwwwwwwww/85065029

DBNet实战:详解DBNet训练与测试(pytorch)相关推荐

  1. 3000门徒内部训练绝密视频(泄密版)第8课:彻底实战详解使用IDE开发Spark程序

    彻底实战详解使用IDE开发Spark程序 使用IDE开发Spark分析 使用IDE开发Spark实战 使用IDE开发Spark的Local和Cluster 开发两种选择:IDEA.Eclipse 下载 ...

  2. SENet实战详解:使用SE-ReSNet50实现对植物幼苗的分类

    摘要 1.SENet概述 ​ Squeeze-and-Excitation Networks(简称 SENet)是 Momenta 胡杰团队(WMW)提出的新的网络结构,利用SENet,一举取得最后一 ...

  3. flutter 获取android 还是ios_Flutter完整开发实战详解(二十、 Android PlatformView 和键盘问题)...

    作为系列文章的第二十篇,本篇将结合官方的技术文档科普 Android 上 PlatformView 的实现逻辑,并且解释为什么在 Android 上 PlatformView 的键盘总是有问题. 为什 ...

  4. Flutter完整开发实战详解(二、 快速开发实战篇) | 掘金技术征文

     作为系列文章的第二篇,继<Flutter完整开发实战详解(一.Dart语言和Flutter基础)>之后,本篇将为你着重展示:如何搭建一个通用的Flutter App 常用功能脚手架,快速 ...

  5. 第8课:彻底实战详解使用IDE开发Spark程序

    第8课:彻底实战详解使用IDE开发Spark程序 1.下载安装windows下的scala-2.10.4. 2.打开eclipse,新建scala project: WordCount 3.修改依赖的 ...

  6. 憨批的语义分割4——pspnet模型详解以及训练自己的pspnet模型(划分斑马线)

    憨批的语义分割4--pspnet模型详解以及训练自己的pspnet模型(划分斑马线) 注意事项 学习前言 模型部分 什么是pspnet模型 pspnet模型的代码实现 1.主干模型Mobilenet. ...

  7. 《Unity 4 3D开发实战详解》一6.7 物理引擎综合案例

    本节书摘来异步社区<Unity 4 3D开发实战详解>一书中的第6章,第6.7节,作者: 吴亚峰 , 杜化美 , 张月霞 , 索依娜 责编: 张涛,更多章节内容可以访问云栖社区" ...

  8. R语言基于forestplot包可视化森林图实战详解:美化的森林图:自定义字体设置、置信区间、坐标轴(刻度、标签、范围)、无效线去除、水平线、辅助线、box形状、色彩等

    R语言基于forestplot包可视化森林图实战详解:美化的森林图:自定义字体设置.置信区间.坐标轴(刻度.标签.范围).无效线去除.水平线.辅助线.box形状.色彩等 目录

  9. R语言使用survminer包生存分析及可视化(ggsurvplot)实战详解:从数据集导入、生存对象生成、ggsurvplot可视化参数配置、设置、可视化对比

    R语言使用survminer包生存分析及可视化(ggsurvplot)实战详解:从数据集导入.生存对象生成.ggsurvplot可视化参数配置.设置.可视化对比 目录 R语言使用survminer包生 ...

  10. R语言tidyr包gather()函数实战详解:数据收缩、从宽表到窄表

    R语言tidyr包gather()函数实战详解:数据收缩.从宽表到窄表 目录 R语言tidyr包gather()函数实战详解:数据收缩.从宽表到窄表 收缩两列数据

最新文章

  1. 【Python】函数图像绘制:二维图像、三维图像、散点图、心形图
  2. JZOJ 5461 购物 —— 贪心
  3. linux下如何查看驱动?(CH341)
  4. Freescale 基于IMX536处理器的Dialog DA9053电源管理参考设计
  5. 云原生生态周报 Vol. 19 | Helm 推荐用户转向 V3
  6. hadoop初始化(hdfs格式化)+简单测试(转载+自己整理)
  7. phpexcel导出大量数据合并单元格_php 数据导出到excel 2种带有合并单元格的导出...
  8. SpringMVC(笔记)
  9. web api教程Java_WebApi项目创建CURD
  10. vim 复制一行并且粘贴_Vim常用命令2之文本操作
  11. Android 图片异步加载的体会,SoftReference已经不再适用
  12. java命令行执行编译好的类_Java命令行编译并执行Java程序
  13. pe如何自动加载外置工具_[分享] PE自动检测安装驱动 外置组件[01-17更新]
  14. stm32采集交流电压信号_基于STM32的交流电压检测
  15. oss 私有云访问 获取临时图片地址
  16. nvivo三天写论文!可视化操作实战
  17. delphi控件切图界面闪烁_「这个控件叫什么」系列之加载占位图+页面指示器
  18. 网络设计:搭建校园网(组网工程课设)【译】
  19. ts类型声明declare
  20. DM10分区图文教程

热门文章

  1. 两级交流放大电路实验仿真
  2. [iPhone中级] iPhone团购信息客户端的开发 (三)
  3. CTF练题(2) png图片修改宽高典型例题
  4. 域名解析后主机记录和记录值怎么填写?都是什么意思?
  5. 频域滤波matlab代码_频域的弦,时域的箭(1)
  6. 订阅发布(PubSub)模式的实现以及使用价值
  7. Python字典中items()和iteritems()区别
  8. 2023全国特种作业操作证熔化焊接与热切割模拟试卷一[安考星]
  9. 分布式两阶段提交和三阶段提交
  10. Milo源码解析(四)