---
title: dbnet
canonical_url: "https://www.modelscope.cn/models/AIBSECO/dbnet"
md_url: "https://www.modelscope.cn/models/AIBSECO/dbnet.md"
repository: AIBSECO/dbnet
last_updated: 2025-11-19
pipeline_tag: ocr-detection
tasks:
  - ocr-detection
library_name:
  - onnx
  - pytorch
frameworks:
  - Pytorch
downloads: 18
stars: 0
---

# dbnet

> dbnet - AIBSECO 在 ModelScope 开源的模型。年份 : 2020 来源 : Liao M, Wan Z, Yao C, et al., 2019. Real-time Scene Text Detection with Differentiable Binarization[A/OL]. arXiv[2025-06-22]. http://arxiv.org/abs/1911.08947. DOI:10.48550/arXiv.1911.08947. 问题背景 :…

- **Repository**: AIBSECO/dbnet
- **Tasks**: ocr-detection
- **Downloads**: 18
- **Stars**: 0
- **Last updated**: 2025-11-19

Source: https://www.modelscope.cn/models/AIBSECO/dbnet

---

DBnet

## 2. 方案简介

### 2.1  算法流程介绍

#### 2.1.1. 算法背景

> - **年份** : 2020
> - **来源** : Liao M, Wan Z, Yao C, et al., 2019. Real-time Scene Text Detection with Differentiable Binarization[A/OL]. arXiv[2025-06-22]. http://arxiv.org/abs/1911.08947. DOI:10.48550/arXiv.1911.08947.
> - **问题背景** :
> 在自然场景下进行文本检测是一项具有挑战性的任务，因为文本区域形状多样、尺寸不一，且常常与复杂背景混杂。传统方法通常依赖固定阈值或繁琐的后处理操作来从概率图中提取文本边界，难以实现准确且高效的端到端训练。尤其是在检测任意形状文本（如弯曲、旋转文字）时，常规方法在边界拟合和泛化能力方面存在明显不足。为了解决这些问题，``DBNet``提出了可微分的二值化机制，在网络中端到端学习文本区域与其边界，从而显著提高了检测精度和速度。
> ![效果展示](./assets/xiaoguo.jpg)


#### 2.1.2. 算法流程
> <img src="./assets/算法流程图.jpg"  width="1500">

#### 2.1.3. 模型结构上的创新与意义

> DBNet主要贡献在于提出了可微分的DB模块，解决了传统二值化操作不可微分故无法进行端到端训练优化的缺点，同时显著简化了后处理流程。具体而言，DB模块使用如下公式替换了传统的二值化操作：
> $$
> \hat{B}_{i,j} = \frac{1}{1 + e^{-k(P_{i,j} - T_{i,j})}}
> $$
> 其中$/hat{B}_{i,j}$是输出的近似二值图，$T_{i,j}$是网络学习到的自适应阈值，$k$是放大因子，经验值为50。
> ![网络结构图](./assets/wangluo.jpg)

#### 2.1.4. 前后处理，或一些其他机制介绍（最好使用流程图）
> - 前处理包括保持长宽比时重采样至长边为480，RGB转换到BGR以及归一化到{0, 1}区间；
> - 后处理：先对概率图进行阈值筛选生成二值图，提取二值图轮廓获取多边形。对每个提取到的多边形，首先获取其最小外接四边形（非矩形），四边形短边如果低于阈值则抛弃；接着取这个四边形在概率图中所有像素值的均值作为置信度，置信度低于阈值则抛弃；再对四边形进行膨胀，各点偏移方向取该点外角平分线，偏移量由四边形周长$L$与面积$A$计算得到，公式为$D=/frac{A /times r}{L}$，$r$是一个膨胀系数，与训练数据预处理时的收缩系数相对应，对于本项目，检测文字时取1.5，检测条形码时取3.0。对膨胀后图形短边再次进行阈值筛选，此时阈值取初次筛选时+2。

#### 2.1.5. 精度与耗时
> ![sandiantu](./assets/sandiantu.jpg)

### 2.2  硬件资源分配
> <img src="./assets/资源划分图.jpg"  width="1500">
> 前处理中图像输入与重采样由ImageMake Session处理，BGR->RGB通道转换以及归一化做在FPGA数据流上；网络前向由NPU计算；后处理中对概率图进行阈值筛选可以设计FPGA模块计算，其余由PS端CPU处理。

## 3. 模型导出说明
### 3.1 ``NPU``加速部分
> 网络算子全部在NPU上计算。

### 3.2. 导出过程修改点
> 无修改，直接导出到onnx

### 3.3. 1_scripts中的脚本运行说明

> ``0_infer.py``:  ``python 0_infer.py``使用源码进行推理。结果放在 ``1_scripts/output/0_infer``
> ``1_save.py``:   ``python 1_save.py``torchscript导出模型，导出输入为``480x480``大小的onnx。
> ``2_save_infer.py``:   ``python 2_save_infer.py``使用导出后模型进行推理。结果放在 ``1_scripts/output/2_save_infer``

## 4. cpu处理部分c++工程移植说明
> - Psin工程中CPU环节负责前后处理，Plin工程拟采用FPGA进行图像输入预处理。
> - 仅定性判断图像生成结果。
> - 各环节耗时，取 ``适配阶段仿真``耗时结果，一次运行取两张图像耗时平均
>
> | 前处理 | 模型推理   | 后处理 |
> | ------ | ---------- | ------ |
> | 17.55ms | 2001.15ms | 6.45ms |

## 5. ICRAFT编译
**编译通过**
- ### 使用运行时仿真得到的仿真效果
> 全部结果均基本正确，不过在仿真时存在检测框略小于框架推理情况，是因为框架推理时的后处理使用pyclipper库进行膨胀操作，而C++仿真时则自己实现膨胀操作，两者在方法上一致，都使用论文中的膨胀算法，但对于相同的unclip_ratio膨胀参数，结果上存在一定差异，可通过python仿真时略微调大unclip_ratio参数解决问题。

> 表格中针对文字检测情况，unclip_ratio取1.5；针对条形码检测情况，unclip_ratio取3.0。


| 原图                                          | 框架动态图推理                                 | 导出静态模型推理                                    | 解析组件仿真                             | 量化组件仿真                             | 指令组件仿真                             |
| --------------------------------------------- | ---------------------------------------------- | --------------------------------------------------- | ---------------------------------------- | ---------------------------------------- | ---------------------------------------- |
| <img src="./assets/origin_1.jpg" width="200"> | <img src="./assets/0_infer_1.jpg" width="200"> | <img src="assets/2_save_infer_1.jpg" width="200"> | <img src="assets/p_1.jpg" width="200"> | <img src="assets/q_1.jpg" width="200"> | <img src="assets/g_1.jpg" width="200"> |
| <img src="assets/origin_2.jpg" width="200"> | <img src="assets/0_infer_2.jpg" width="200"> | <img src="assets/2_save_infer_2.jpg" width="200"> | <img src="assets/p_2.jpg" width="200"> | <img src="assets/q_2.jpg" width="200"> | <img src="assets/g_2.jpg" width="200"> |
| <img src="assets/origin_1.jpg" width="200"> | <img src="assets/0_infer_b1.jpg" width="200"> | <img src="assets/2_save_infer_b1.jpg" width="200"> | <img src="assets/p_b1.jpg" width="200"> | <img src="assets/q_b1.jpg" width="200"> | <img src="assets/g_b1.jpg" width="200"> |
| <img src="assets/origin_2.jpg" width="200"> | <img src="assets/0_infer_b2.jpg" width="200"> | <img src="assets/2_save_infer_b2.jpg" width="200"> | <img src="assets/p_b2.jpg" width="200"> | <img src="assets/q_b2.jpg" width="200"> | <img src="assets/g_b2.jpg" width="200"> |

- ### 8bit，16bit，混合精度的精度测试结果
> 以下是不同量化策略下量化组件仿真结果。可以看到，在saturation=ems时的混合精度量化下，运行结果最优！

| Saturation | 8bit                                          | 16bit                                         | MixPrecision                                          |
| ---------- | --------------------------------------------- | --------------------------------------------- | ----------------------------------------------------- |
| kld        | <img src="assets/8bit_kld.jpg" width="200">   | <img src="assets/16bit_kld.jpg" width="200">  | <img src="assets/mix_precision_kld.jpg" width="200">  |
| ems        | `<img src="assets/8bit_ems.jpg" width="200">  | <img src="assets/16bit_ems.jpg" width="200">  | <img src="assets/mix_precision_ems.jpg" width="200">  |
| null       | `<img src="assets/8bit_null.jpg" width="200"> | <img src="assets/16bit_null.jpg" width="200"> | <img src="assets/mix_precision_null.jpg" width="200"> |
- ### auto下结果已经完善，无需混合精度量化调优
