chineseocr_lite文字检测算法DbNet源码逐行解读

chineseocr_lite文字检测算法DbNet源码逐行解读

【免费下载链接】chineseocr_lite 超轻量级中文ocr,支持竖排文字识别, 支持ncnn、mnn、tnn推理 ( dbnet(1.8M) + crnn(2.5M) + anglenet(378KB)) 总模型仅4.7M 【免费下载链接】chineseocr_lite 项目地址: https://gitcode.com/gh_mirrors/ch/chineseocr_lite

DbNet是chineseocr_lite项目中的核心文字检测算法,负责从图像中定位文字区域。本文将通过分析dbnet/dbnet_infer.pydbnet/decode.py源码,详解其实现原理与关键步骤。

DBNET类初始化与模型加载

DBNET类采用单例模式实现,确保模型仅加载一次。在初始化阶段,代码加载ONNX格式的DbNet模型并创建推理会话:

class DBNET(metaclass=SingletonType):
    def __init__(self, MODEL_PATH):
        self.sess = rt.InferenceSession(MODEL_PATH)  # 创建ONNX推理会话
        self.decode_handel = SegDetectorRepresenter()  # 创建解码处理器

模型文件位于项目models/dbnet.onnx,采用轻量级设计,文件大小仅1.8M,符合项目"超轻量级"定位。

图像预处理流程

process方法实现了完整的图像预处理逻辑,包括色彩空间转换、尺度调整和归一化:

def process(self, img, short_size):
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # BGR转RGB
    h, w = img.shape[:2]
    
    # 短边缩放算法,确保长边按比例缩放后为32的倍数
    if h < w:
        scale_h = short_size / h
        tar_w = w * scale_h
        tar_w = tar_w - tar_w % 32  # 确保宽度是32的倍数
        tar_w = max(32, tar_w)
        scale_w = tar_w / w
    else:
        # 高度缩放逻辑(略)
        
    img = cv2.resize(img, None, fx=scale_w, fy=scale_h)  # 尺寸调整
    img = img.astype(np.float32) / 255.0  # 归一化到[0,1]
    img -= mean  # 减均值 (0.485, 0.456, 0.406)
    img /= std   # 除标准差 (0.229, 0.224, 0.225)
    img = img.transpose(2, 0, 1)  # 转为CHW格式
    transformed_image = np.expand_dims(img, axis=0)  # 添加批次维度

预处理后的图像将输入模型进行推理,输出特征图:out = self.sess.run(["out1"], {"input0": transformed_image.astype(np.float32)})

特征图解码与后处理

SegDetectorRepresenter类实现了从模型输出到文字框的转换,核心逻辑在boxes_from_bitmap方法中:

  1. 二值化处理return pred > self.thresh使用阈值(默认0.3)将特征图转为二值图像
  2. 轮廓检测cv2.findContours从二值图中提取文字区域轮廓
  3. 最小外接矩形get_mini_boxes计算轮廓的最小外接矩形,得到初始文字框
  4. 非极大值抑制:过滤面积过小或置信度过低的候选框
  5. 边框膨胀unclip方法使用pyclipper库对边框进行膨胀处理,恢复文字区域完整形状

关键的边框膨胀算法实现如下:

def unclip(self, box, unclip_ratio=1.5):
    poly = Polygon(box)
    distance = poly.area * unclip_ratio / poly.length  # 计算膨胀距离
    offset = pyclipper.PyclipperOffset()
    offset.AddPath(box, pyclipper.JT_ROUND, pyclipper.ET_CLOSEDPOLYGON)
    expanded = np.array(offset.Execute(distance))  # 执行膨胀操作
    return expanded

检测效果可视化

draw_bbox函数实现了检测结果的可视化,在原图上绘制文字边框:

def draw_bbox(img_path, result, color=(255, 0, 0), thickness=2):
    if isinstance(img_path, str):
        img_path = cv2.imread(img_path)
    img_path = img_path.copy()
    for point in result:
        point = point.astype(int)
        cv2.polylines(img_path, [point], True, color, thickness)  # 绘制多边形边框
    return img_path

项目测试图像展示了DbNet的实际检测效果,如身份证识别场景:

身份证检测效果

多平台实现与优化

DbNet算法在项目中提供了多平台实现版本:

不同实现版本针对特定平台进行了优化,如NCNN版本使用GPU加速,ONNX版本支持多框架部署。

算法性能调优参数

DbNet检测性能可通过以下参数调整:

参数作用默认值调整建议
thresh二值化阈值0.3降低阈值可提高召回率
box_thresh框置信度阈值0.5提高阈值可减少误检
unclip_ratio边框膨胀系数2.0复杂背景建议增大该值
max_candidates最大候选框数1000小图可减小以提高速度

参数配置位于config.py,可根据实际应用场景进行优化。

总结与扩展阅读

DbNet作为轻量级文字检测算法,在保持1.8M超小模型体积的同时,实现了较高的检测精度。其核心优势在于:

  1. 基于分割的检测方式,能更好处理弯曲文本
  2. 后处理算法鲁棒性强,适应不同字体和背景
  3. 支持端到端部署,适合移动设备应用

完整的算法实现可参考官方提供的测试用例性能基准测试脚本。对于需要进一步优化性能的场景,可研究项目中的模型量化和多线程推理方案。

【免费下载链接】chineseocr_lite 超轻量级中文ocr,支持竖排文字识别, 支持ncnn、mnn、tnn推理 ( dbnet(1.8M) + crnn(2.5M) + anglenet(378KB)) 总模型仅4.7M 【免费下载链接】chineseocr_lite 项目地址: https://gitcode.com/gh_mirrors/ch/chineseocr_lite

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值