DBNet详解及训练ICDAR2015数据集

news2024/9/23 1:21:06

论文地址: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 表示模型在召回率和精确度之间取得了更好的平衡。

模型测试 

我测试的图片是没有类似的数据集去训练,但是效果还不错,所以说泛化能力挺强的

    

 

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

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

相关文章

【龙年大礼】| 2023中国开源年度报告!

【中国开源年度报告】由开源社从 2015 年发起,是国内首个结合多个开源社区、高校、媒体、风投、企业与个人,以纯志愿、非营利的理念和开源社区协作的模式,携手共创完成的开源研究报告。后来由于一些因素暂停,在 2018 年重启了这个…

香港倾斜模型3DTiles数据漫游

谷歌地球全香港地区倾斜摄影数据,通过工具转换成3DTiles格式,将这份数据完美加载到三维数字地球Cesium上进行完美呈现,打造香港地区三维倾斜数据覆盖,完美呈现香港城市壮美以及维多利亚港繁荣景象。再由12.5米高分辨率地形数据&am…

Java完整版宿舍管理

项目技术: springboot layui idea mysql5.7 jdk1.8 maven3 有需要该项目的小伙伴可以私信我你的Q。 功能描述: (1)基本信息管理 基本信息分为学生信息和宿舍信息两部分,其功能是负责维护这些信息&#xff0c…

Ubuntu22.04 gnome-builder gnome C 应用程序习练笔记(二)

gnome-builder创建的程序,在工程树中有三个重要程序:main主程序、application应用程序和window主窗口程序。main整个程序的起始,它会操作application生产应用环境,application会操作window生成主窗口,于是就有了 appli…

【前端模板】bootstrap5披萨餐厅网站Pizza King平台(电商适用,附源码)

一、需求分析 披萨餐厅网站是指由披萨餐厅创建和维护的在线平台,旨在提供与该餐厅相关的信息和服务。以下是一些常见的功能和内容,可以在披萨餐厅网站上找到: 餐厅介绍:网站通常会提供有关餐厅的背景信息,包括其历史、…

VMwawre配置静态ip

1、查看当前虚拟机网关(记住这个网关,后面使用) 2、进入目录命令:cd /etc/sysconfig/network-scripts/ 3、编辑网卡配置文件命令:vim ifcfg-ens33 4、配置静态IP,修改和增加如下信息: 修改的内…

Vue3编写简单的App组件(二)

一、Vue3页面渲染基本流程 1、入口文件 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><link rel"icon" href"/favicon.ico"><meta name"viewport" content"widthde…

vivo发布2023 年度科技创新;阿里全新AI代理,可模拟人类操作手机

vivo 发布 2023 年度十大产品技术创新 近日&#xff0c;vivo 发布了「2023 年度科技创新」十大产品技术创新榜单&#xff0c;并将这些技术分为了 4 个板块。 「四大蓝科技」为 vivo 在去年推出的全新技术品牌&#xff0c;涵盖蓝晶芯片技术栈、蓝海续航系统、蓝心大模型、蓝河操…

【Linux】Shell编程

Shell编程 目录 Shell编程1.shell基础1.输入重定向 & 输出重定向2.管道3.特殊字符(3.1)通配符(3.2)引号(3.3)注释符(#) 4.别名5.命令历史history 2.Shell脚本Shell脚本的执行方式(1)为脚本文件加上可执行权限,然后在命令行直接输入shell脚本文件名执行。(2)sh shell脚本名(…

redis之布隆过滤

目录 1、redis之布隆过滤 2、布隆过滤器原理 3、布隆过滤器使用步骤 初始化bitmap 添加占坑位 判断是否存在圜 1、redis之布隆过滤 布隆过滤&#xff1a;有一个初值都为0的bit数组和多个哈希函数构成&#xff0c;用来快速判断集合中是否存在某个元素。目的&#xff1a;减…

【深度学习】pytorch 与 PyG 安装(pip安装)

【深度学习】pytorch 与 PyG 安装&#xff08;pip安装&#xff09; 一、PyTorch安装和配置&#xff08;一&#xff09;、安装 CUDA&#xff08;二&#xff09;、安装torch、torchvision、torchaudio三个组件&#xff08;1&#xff09;下载镜像文件&#xff08;2&#xff09;创建…

华为第二批难题五:AI技术提升六面体网格生成自动化问题

有CAE开发商问及OCCT几何内核的网格方面的技术问题。其实&#xff0c;OCCT几何内核的现有网格生成能力比较弱。 HybridOctree_Hex的源代码&#xff0c;还没有仔细去学习。 “HybridOctree_Hex”的开发者说&#xff1a;六面体网格主要是用在数值模拟领域的&#xff0c;比如汽车…

智慧自助餐饮系统(SpringBoot+MP+Vue+微信小程序+JNI+ncnn+YOLOX-Nano)

一、项目简介 本项目是配合智慧自助餐厅下的一套综合系统&#xff0c;该系统分为安卓端、微信小程序用户端以及后台管理系统。安卓端利用图像识别技术进行识别多种不同菜品&#xff0c;识别成功后安卓端显示该订单菜品以及价格并且生成进入小程序的二维码&#xff0c;用户扫描…

Kubernetes基础(十五)-k8s网络通信

1 k8s网络类型 2 Pod网络 2.1 同一pod内不同容器通信 Pod是Kubernetes中最小的可部署单元&#xff0c;它是一个或多个紧密关联的容器的组合&#xff0c;这些容器共享同一个网络命名空间和存储卷&#xff0c;因此Pod中的所有容器都共享相同的网络命名空间和IP地址——PodIP&a…

JavaScript实现轮播图方法

效果图 先来看下效果图&#xff0c;嫌麻烦就不用具体图片来实现了&#xff0c;主要是理清思路。&#xff08;自动轮播&#xff0c;左右按钮切换图片&#xff0c;小圆点切换图片&#xff0c;鼠标移入暂停轮播&#xff0c;鼠标移出继续轮播&#xff09; HTML 首先是html内容&am…

获取视频帧图片

在实现了minio文件上传的基础上进行操作 一、编写pom <dependency><groupId>org.jcodec</groupId><artifactId>jcodec</artifactId><version>0.2.5</version> </dependency> <dependency><groupId>org.jcodec<…

Modern C++ 内存篇1 - allocator

1. 前言 从今天起我们开始内存相关的话题&#xff0c;内存是个很大的话题&#xff0c;一时不知从何说起。内存离不开allocator&#xff0c;我们就从allocator开始吧。allocator目前有两种&#xff1a;std::allocator, std::pmr::polymorphic_allocator&#xff0c;各有优缺点。…

中小型网络系统总体规划与设计方法

目录 1.基于网络的信息系统基本结构 2.网络需求调研与系统设计原则 3.网络用户调查 4.网络节点地理位置分布情况 5.网络需求详细分析 6.应用概要分析 7.网络工程设计总体目标与设计原则 8.网络结构与拓扑构型设计方法 9.核心层网络结构设计 10.接入核心路由器 11.汇聚…

寒假作业2024.2.8

1.现有文件test.c\test1.c\main.c,请编写Makefile Makefile文件&#xff1a; CCgcc EXEfile OBJS$(patsubst %.c,%.o,$(wildcard *.c)) CFLAGS-c -o all:$(EXE)file:test.o test1.o main.o$(CC) $^ -o $%.o:%.c$(CC) $(CFLAGS) $ $^.PHONY:clean clean:rm $(OBJS)main.c文件:…

Codeforces Round 260 (Div. 1)A. Boredom(dp)

最开始写了一发贪心wa了&#xff0c;然后这种选和不选的组合优化问题&#xff0c;一般是考虑动态规划 d p [ i ] [ 0 ] &#xff1a; dp[i][0]&#xff1a; dp[i][0]&#xff1a;表示第i个数不选的最大值 d p [ i ] [ 1 ] &#xff1a; dp[i][1]&#xff1a; dp[i][1]&#xf…