【Python】ddddocr实战:用深度学习OCR轻松搞定验证码与文档自动化

张开发
2026/4/10 6:47:48 15 分钟阅读

分享文章

【Python】ddddocr实战:用深度学习OCR轻松搞定验证码与文档自动化
1. 为什么选择ddddocr处理验证码和文档第一次遇到验证码识别需求时我试过至少5种方案。pytesseract要配置环境变量easyocr体积大到离谱商业API又贵又慢。直到发现这个国产开源库——ddddocr实测识别率比传统方案高30%以上安装只要一行命令从此再没换过其他工具。这个基于深度学习的OCR工具特别适合三类场景自动化测试爬虫遇到图形验证码时自动识别文档数字化批量提取扫描件/图片中的文字票据处理识别发票、快递单等结构化数据相比传统方案它的优势非常明显零配置不用装Tesseract等底层引擎轻量化安装包仅15MB左右高精度对扭曲、噪点验证码效果拔群上周我用它处理了2000多张历史票据扫描件原本需要3天的手工录入现在喝杯咖啡的时间就搞定了。下面具体说说怎么用这个神器。2. 5分钟快速上手ddddocr2.1 安装避坑指南安装虽然简单但有些细节要注意# 基础安装默认源可能较慢 pip install ddddocr # 国内用户推荐清华源 pip install ddddocr -i https://pypi.tuna.tsinghua.edu.cn/simple/常见问题处理报错Microsoft Visual C 14.0 required去微软官网下载Build Tools内存不足添加--no-cache-dir参数版本冲突先卸载旧版pip uninstall ddddocr2.2 第一个识别程序用这个代码识别验证码图片import ddddocr ocr ddddocr.DdddOcr() with open(captcha.png, rb) as f: res ocr.classification(f.read()) print(识别结果, res)实测一个复杂验证码的识别过程原始图片带干扰线的5位字母数字混合预处理自动完成去噪、二值化识别耗时平均80ms/张准确率测试集达到92%3. 高级应用场景实战3.1 批量处理文档图片这是我处理扫描件档案的代码模板from pathlib import Path ocr ddddocr.DdddOcr() output [] for img_file in Path(./scans).glob(*.jpg): text ocr.classification(img_file.read_bytes()) output.append(f{img_file.stem}|{text}) with open(result.csv, w) as f: f.write(\n.join(output))关键参数说明show_adFalse关闭广告检测文档场景不需要oldTrue启用传统算法兼容模式img_rotateTrue自动矫正倾斜文本3.2 点选验证码破解遇到这种需要点击图中文字的验证码时det ddddocr.DdddOcr(detTrue) with open(click_captcha.jpg, rb) as f: poses det.detection(f.read()) print(需要点击的坐标, poses)输出结果示例[(125, 56), (78, 112), (203, 89)]配合selenium自动点击这些坐标即可完成验证。4. 性能优化技巧4.1 多进程加速处理上万张图片时这样优化from multiprocessing import Pool def worker(img_path): return ocr.classification(img_path.read_bytes()) with Pool(8) as p: results p.map(worker, Path(images).iterdir())在我的Ryzen机器上单线程约15张/秒8进程达到85张/秒4.2 内存管理技巧长期运行的服务要注意# 错误示范反复创建实例 def handle_request(img): ocr ddddocr.DdddOcr() # 每次新建对象 return ocr.classification(img) # 正确做法全局单例 global_ocr ddddocr.DdddOcr() def handle_request(img): return global_ocr.classification(img)内存占用对比错误方式每次调用增加20MB正确方式稳定在150MB左右5. 常见问题解决方案最近帮同事排查的几个典型问题案例1识别结果乱码现象输出类似燇燇燇的乱码原因图片分辨率过低解决先用Pillow调整DPIfrom PIL import Image img Image.open(lowres.png).save(highres.png, dpi(300,300))案例2数字8和字母B混淆现象验证码中的8总被识别为B解决方法启用字符集限制ocr ddddocr.DdddOcr(char_set0123456789)案例3表格识别错位技巧先用OpenCV提取单元格再单独识别import cv2 cells cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for x,y,w,h in cells: cell_img img[y:yh, x:xw] text ocr.classification(cell_img)

更多文章