DBNet详解及训练ICDAR2015数据集

论文地址:https://arxiv.org/pdf/1911.08947.pdf

开源代码pytorch版本:GitHub - WenmuZhou/DBNet.pytorch: A pytorch re-implementation of Real-time Scene Text Detection with Differentiable Binarization

前言

在这篇论文之前,文字检测算法主要分为两类:基于回归的方法和基于分割的方法。基于分割的方法通常涉及以下流程,如下图蓝色箭头所示:首先,通过网络输出图像的文本分割结果,即概率图,其中每个像素表示是否属于正样本的概率。然后,通过使用预设的阈值将分割结果图转换为二值图。最后,通过一些聚合操作,例如连通域分析,将像素级的结果转换为最终的文本检测结果。然而,由于涉及使用阈值来判定前景和背景的不可微分操作,因此这一部分流程无法被直接放入网络中进行训练。所以本文引入了一种新的方法。具体而言,通过学习阈值映射(threshmap)并采用可微分的操作,将阈值的转换过程嵌入到网络中进行训练。这一创新的流程如下图中红色箭头所示,通过可微分的操作来处理阈值的学习,使得整个流程可以在神经网络的训练中进行端到端的优化。通过这种方式,文本检测模型能够自适应地学习阈值,更有效地捕捉文本的分割信息,提高了检测性能。这一方法有助于简化原有基于分割方法的后处理流程,同时使整个模型更具可训练性。

网络结构

其实从下图的网络结构中不难看出,相比较于PSENet,多了一条threshold map分支罢了,该分支的主要目的是和分割图联合得到更接近二值化的二值图,属于辅助分支。

整个网络结构流程:

图像输入特征提取主干: 使用图像输入,经过一个特征提取的主干网络,该网络负责从输入图像中提取高层次的语义特征。这可以是一个卷积神经网络(CNN)的主要部分,如ResNet或其他先进的架构。

特征金字塔上采样和级联: 从特征提取主干获得的特征被送入特征金字塔。在特征金字塔中,通过上采样将不同尺寸的特征图调整到相同的尺寸,并将它们级联在一起,形成一个具有丰富多尺度信息的特征F。这有助于模型对不同大小和尺度的目标进行有效的检测和分割。

预测概率图和阈值图: 利用级联的特征F,进行概率图(probability map P)和阈值图(threshold map T)的预测。概率图通常表示每个像素属于某个类别(在这里可能是目标文本与非文本的概率),而阈值图则用于指导后续的二值化操作。这一步的目的是产生用于后续计算的中间结果。

计算近似二值图: 利用概率图P和阈值图T,通过一定的计算过程(可能是使用阈值或其他运算),得到一个近似的二值图B。这个近似二值图用于最终的文本检测,其中文本区域被二值化为前景,而非文本区域为背景。

在训练过程中,该模型通过使用相同的监督信号对概率图 P 和近似二值图 B 进行监督训练,其中概率图表示文本区域的概率,而近似二值图是文本二值化结果。在推理阶段,只需使用概率图 P 或者近似二值图B 中的任一即可获取文本检测结果,无需依赖额外的阈值图。这种设计简化了推理流程,提高了模型的实际应用效率。

模型的输出

Probability Map(概率图): 这是一个大小为w×h×1 的张量,其中 w 和 ℎ分别表示图像的宽度和高度。概率图的每个像素表示相应位置是否为文本的概率。对于二进制文本检测任务,概率图的值通常在 0 到 1 之间,表示每个像素点属于文本的概率,1 表示高置信度是文本,0 表示低置信度是文本。

Threshold Map(阈值图): 阈值图也是一个大小为 w×h×1 的张量,其中每个像素点包含一个阈值。这些阈值用于二值化概率图,将其转换为最终的二值图。阈值图的每个值表示相应位置的二值化操作的阈值。

Binary Map(二值图): 由概率图和阈值图计算得到,也是一个大小为 w×h×1 的张量。它表示最终的文本检测结果,其中每个像素点被二值化为前景(文本)或背景(非文本)。这里提到使用了 "DB 公式" 来计算二值图,而 DB(Differentiable Binarization)通常是一个近似二值化的函数,通过可微分的操作来实现对阈值的学习和调整。

DB公式

标准二值化

一般使用分割网络(segmentation network)产生的概率图(probability map P),将P转化为一个二值图P,当像素为1的时候,认定其为有效的文本区域。i和j代表了坐标点的坐标,t是预定义的阈值

可微二值化(differentiable Binarization)

可微二值化的公式如下,其实就是带一个系数的sigmoid,其中其中T是阈值图,k取50

从图像上不难看出,二值化和标准二值化很相似,且可微分,因此可以和分割网络一起联合优化

从(b)(c)图我们不难看出通过增加参数 K,可以在模型的训练过程中加速对正确预测区域和错误预测区域的学习,以更快地收敛到最优解。这样的调整可以在某些情况下提高模型的训练效率和性能。原图,gt图,threshold map图如下所示

模型训练

自动下载的预训练模型下载地址:/home/xuzhen/.cache/torch/hub/checkpoints/resnet18-5c106cde.pth(我看了代码,他是判断有没有预训练模型没有的话才下载)

这个源代码在配置文件中加载的是train.txt和test.txt,所以我写了一个脚本,根据img文件夹和gt文件夹自动生成这两个文件的脚本

import os

def create_gt_file(img_dir, gt_dir, output_file_path):
    # 检查文件夹是否存在
    if not os.path.exists(img_dir) or not os.path.exists(gt_dir):
        print("Error: One or both folders do not exist.")
        return

    img_paths = []  
    gt_paths = []   

    # 循环读取文件夹1中的文件名
    for filename in os.listdir(img_dir):
        img_path = os.path.join(img_dir,filename)
        img_paths.append(img_path)
        # 去掉后缀并在前面加上 "gt_"
        gt_path = os.path.join(gt_dir, "gt_" + os.path.splitext(filename)[0] + ".txt")
        gt_paths.append(gt_path)
        # 写入文件
    with open(output_file_path, 'w') as output_file:
        # 将 img_paths 和 gt_paths 写入文件
        for img_path, gt_path in zip(img_paths, gt_paths):
            output_file.write(f"{img_path}\t{gt_path}\n")
            print(f"{img_path}\t{gt_path}Strings written to {output_file_path}")

# 主函数
def main():
    img_dir = "/data2/xuzhen8/yzh/datasets/ICDAR2015/test_images"
    gt_dir = "/data2/xuzhen8/yzh/datasets/ICDAR2015/testing_localization_transcription_gt"
    output_file_path = "/data2/xuzhen8/yzh/projects/DBNet.pytorch/datasets/test.txt"

    create_gt_file(img_dir, gt_dir, output_file_path)

if __name__ == "__main__":
    main()

每一轮训练都会打印信息,我想对这个打印信息说明一下,以便后面复习

FPS(Frames Per Second): 99.37

表示每秒处理的图像帧数。在这个上下文中,表示模型在测试阶段的推断速度。这是通过测量模型在测试集上处理图像的速度来得到的,其单位是帧数/秒。

test: recall: 0.031477, precision: 0.596330, f1: 0.059798

提供了模型在测试集上的性能指标。在这里,包括了召回率(recall)、精确度(precision)和 F1 分数(f1-score)。这些指标用于衡量模型在检测任务中的性能,其中:

召回率表示正确检测到的正类别样本占所有实际正类别样本的比例。

精确度表示模型正确检测的正类别样本占所有模型检测为正类别的样本的比例。

F1 分数是召回率和精确度的调和平均数,综合考虑了这两个指标。

current best, recall: 0.101695, precision: 0.726644, hmean: 0.178420, train_loss: 1.706732, best_model_epoch: 5.000000

提供了模型在测试集上的当前最佳性能以及训练期间的一些指标。其中:

recall、precision、hmean 是测试集上的召回率、精确度和 F1 分数。

train_loss 表示模型在训练集上的损失值,用于衡量训练过程中模型的拟合情况。

best_model_epoch 表示在训练过程中取得最佳性能的模型所对应的训练轮次。

Saving checkpoint:DBNet.pytorch/output/DBNet_resnet18_FPN_DBHead/checkpoint/

model_latest.pth

表示当前训练轮次的模型参数被保存到了指定路径下的 model_latest.pth 文件中。这通常发生在模型在测试集上取得了更好性能后,保存了当前状态的模型参数,以备将来使用或继续训练。

 

小辉问:能不能举个例子说明一下召回率、精确度、F1 分数。以便更好的理解

小G答:假设有一个二分类任务,目标是检测患有某种疾病的患者。我们的模型对每个样本都进行预测,可以分为以下四种情况:

True Positive (TP): 模型正确地预测了患有疾病的患者。

True Negative (TN): 模型正确地预测了没有患疾病的健康人。

False Positive (FP): 模型错误地预测了没有患疾病的健康人为患病。

False Negative (FN): 模型错误地预测了患有疾病的患者为健康人。

现在,我们可以使用这些概念来解释这些指标:

召回率(Recall):

召回率衡量了模型在所有实际患有疾病的样本中,有多少被成功地检测到。计算公式:

例如,如果总共有 100 名患有疾病的患者,而模型成功地检测到其中的 80 人,则召回率为 80/80+20 =0.8 或 80%。

精确度(Precision):

精确度衡量了模型在所有预测为患有疾病的样本中,有多少实际上是真正患有疾病的人。计算公式:

例如,如果模型预测了 90 个人患有疾病,而其中有 80 人确实是患有疾病的,则精确度为 80/80+10=0.888 或 88.8%。

F1 分数:

F1 分数是召回率和精确度的调和平均数,它综合考虑了两者的性能。计算公式:

F1 分数的取值范围在 [0,1],越接近 1 表示模型在召回率和精确度之间取得了更好的平衡。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

07.你还在手动部署代码吗

如今的项目或者个人项目中,大家的代码怎么部署呢?公司一般都有完整的持续集成以及持续交付平台,对于小公司可能也有各自搭建了一些,比如jenkins,以及gitlab集成的gitlab-ci等等,这些都可以完成我们部署的工作甚至是测试集成等等一系列流水化工作。 但是,即使如此,我依…

R语言学习case12:ggplot 置信区间(多线型)

接上文:多条曲线 R语言学习case11:ggplot 置信区间(包含多子图) 在ggplot2中,每个geom函数都接受一个映射参数。然而,并非每个美学属性都适用于每个geom。你可以设置点的形状,但不能设置线的“…

从雪花到分形几何

目录 前言雪花曲线分形几何雪花曲线工程化参考文献前言 新一股寒潮来袭,河南,安徽,重庆,湖北,湖南北部等地都飘起了大雪,一夜的功夫,世界银装素裹,雪白雪白的,好不美丽迷人。 雪花曲线 物理学上,雪花是一种晶体,是天空中的水汽经凝华而来的固态降水,结构随温度…

Go语言深度解析:探索 crypto/md5 标准库的强大功能

Go语言深度解析:探索 crypto/md5 标准库的强大功能 引言Go语言和MD5的基础知识MD5算法简介Go语言概述Go中的MD5实现 crypto/md5 库的使用方法基本用法处理大型数据安全注意事项 实际案例分析示例1:文件的MD5校验示例2:网络数据的MD5哈希示例3…

BZOJ0481. 树的重心之砍树Link Cut Centroids

题目 思路 分类讨论。 首先当树只有一个重心的时候,我们删掉最小的边再加上原边即可. 再看有两个重心的情况. 显然这棵树必定是类似这样的: 即删掉 A 后,以B 为根的子树是剩下的最大连通块,反之亦然. 那就可以得到一个结论: 删掉边 (A,B) 后,两棵树的大小相等. 那我们只…

【机器学习】某闯关类手游用户流失预测

Final Project: 某闯关类手游用户流失预测 1 案例简介 手游在当下的日常娱乐中占据着主导性地位,成为人们生活中放松身心的一种有效途径。近年来,各种类型的手游,尤其是闯关类的休闲手游,由于其对碎片化时间的利用取得了非常广泛…

HomeAssistant系统添加HACS插件商店与远程控制家中智能家居

文章目录 基本条件一、下载HACS源码二、添加HACS集成三、绑定米家设备 ​ 上文介绍了如何实现群晖Docker部署HomeAssistant,通过内网穿透在户外控制家庭中枢。本文将介绍如何安装HACS插件商店,将米家,果家设备接入 Home Assistant。 基本条件…

国图公考:公务员面试资格复审需要准备什么?

参加国考面试的考生在资格审核阶段需要准备以下材料: 1、本人身份证、学生证或工作证复印件。 2、公共科目笔试准考证复印件。 3、考试报名登记表。 4、本(专)科、研究生各阶段学历、学位证书(应届毕业生没有可以暂时不提供)。 5、报名资料上填写的各类证书材料…

YoloV8改进策略:Neck改进:HAM混合注意力机制改进YoloV8|多种改进,多种姿势涨点|代码注释详解

摘要 HAM通过快速一维卷积来缓解通道注意机制的负担,并引入通道分离技术自适应强调重要特征。HAM作为通用模块,在CIFAR-10、CIFAR-100和STL-10数据集上实现了SOTA级别的分类性能。 论文链接:https://www.sciencedirect.com/science/article/abs/pii/S0031320322002667?vi…

网工内推 | 网络工程师,需持有HCIE,最高16K,午餐补贴

01 科电数据 招聘岗位:网络工程师 职责描述: 1、负责网络及相关安全产品和技术,熟悉相关主流设备(路由器、交换机、防火墙、IPS/IDS、WAF、VPN、负载均衡、网闸)实施维护、安全加固及优化配置技术; 2、负责…

linux中的gdb调试

gdb是在程序运行的结果与预期不符合时,可以使用gdb进行调试 注意:使用gdb调试时要在编译上加-g参数 gcc -g -c hello.c 启动gdb调试: gdb file 对gdb进行调试 设置运行参数: set args 可指定运行参数 show args 可以查…

Spring5系列学习文章分享---第六篇(框架新功能系列+整合日志+ @Nullable注解 + JUnit5整合)

目录 **Spring5** 框架新功能系列一Spring 5.0 框架自带了通用的日志封装Spring5 **框架核心容器**支持Nullable **注解****Spring5** **核心容器支持函数式风格** GenericApplicationContext**Spring5** **支持整合** JUnit5感谢阅读 开篇: 欢迎再次来到 Spring 5 学习系列&am…

Windows如何安装Node.js环境并制作贪吃蛇小游戏分享好友远程访问

文章目录 前言1.安装Node.js环境2.创建node.js服务3. 访问node.js 服务4.内网穿透4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5.固定公网地址 前言 Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation&#xff0…

ICC2:polygon命令与复杂power plan

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 往期文章链接: ICC2&#x

全面解析:船运物流管理系统背后的技术

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

CSS:水平垂直居中

水平垂直居中效果如下&#xff1a; HTML: <div class"parent"><div class"child"></div> </div>公共的 CSS&#xff1a; .parent {width: 300px;height: 300px;background-color:#d0e4fe; }.child {width: 100px;height: 100px…

零基础如何入门渗透测试2024年最新版,保姆级教程,小白必看!

转眼间&#xff0c;从大三开始学安全&#xff0c;到现在也有五年了&#xff0c;也算是对渗透测试有一定理解&#xff0c;今天也是出一篇入门教程&#xff0c;以实操为主&#xff0c;希望可以帮助到想入门渗透测试的小白。如果觉得有用&#xff0c;可以给我点个赞和收藏&#xf…

[C语言] 代码调试, 快捷键说明,assert函数,const函数

一、Debug 和 Release 区别 1.Debug 为调试版本 包含调试信息,不做任何优化,便于程序员调试程序,产生Debug.exe 可以调试,因为文件中包含了调试信息,文件比release大 2.Release 为发布版本 进行了各种优化,是程序在代码大小和运行速度是最优,产生Release.exe 不能调试,可以以…

下载已编译的 OpenCV 包在 Visual Studio 下实现快速配置

自己编译 OpenCV 挺麻烦的&#xff0c;配置需要耗费很长时间&#xff0c;编译也需要很长时间&#xff0c;而且无法保证能全部编译通过。利用 OpenCV 官网提供的已编译的 OpenCV 库可以节省很多时间。下面介绍安装配置方法。 1. OpenCV 官网 地址是&#xff1a;https://opencv…

IT行业证书的获取与价值:提升职业竞争力的关键

目录 IT行业证书的价值和作用 1. Cisco&#xff08;思科&#xff09;认证&#xff08;如CCNA、CCNP、CCIE&#xff09;&#xff1a; 2. 微软认证&#xff08;如MCSA、MCSE、MCSD&#xff09;&#xff1a; 3. 计算机网络技术&#xff08;CompTIA Network、CompTIA Security&a…