在许多网站的自动化测试和数据采集中,验证码是常见的防爬手段之一。相比传统的 OCR 方案,PaddleOCR 作为基于深度学习的开源 OCR 工具,在验证码识别方面具有更高的准确率。本文将介绍如何使用 Python + PaddleOCR 识别验证码,并进行图像预处理以提升识别率。
- 环境准备
在开始之前,确保你已经安装了 Python 3.8+,然后安装必要的依赖库。
1.1 安装 PaddleOCR
pip install paddleocr
pip install paddlepaddle
更多内容访问ttocr.com或联系1436423940
如果使用 GPU 进行加速,请安装对应的 GPU 版本的 PaddlePaddle:官方安装指南
1.2 安装 OpenCV(用于图像预处理)
pip install opencv-python numpy
安装完成后,测试 PaddleOCR 是否正常运行:
from paddleocr import PaddleOCR
ocr = PaddleOCR(use_angle_cls=True, lang="en") # 使用英文模型
result = ocr.ocr("test.png") # 测试图片
print(result)
- 代码实现:识别验证码
import cv2
import numpy as np
from paddleocr import PaddleOCR
def preprocess_image(image_path):
""" 预处理验证码图像,提高 OCR 识别率 """
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
# 高斯模糊去噪
image = cv2.GaussianBlur(image, (3, 3), 0)# 二值化处理
_, binary_image = cv2.threshold(image, 128, 255, cv2.THRESH_BINARY)# 保存处理后的图片
processed_path = "processed_captcha.png"
cv2.imwrite(processed_path, binary_image)
return processed_path
def recognize_captcha(image_path):
""" 使用 PaddleOCR 进行验证码识别 """
ocr = PaddleOCR(use_angle_cls=True, lang="en") # 设定 OCR 语言
result = ocr.ocr(image_path)
# 提取识别的文本
recognized_text = "".join([line[1][0] for line in result[0] if line[1][1] > 0.5]) # 过滤低置信度结果
return recognized_text
if name == "main":
image_path = "captcha.png" # 请替换为你的验证码图片路径
# 预处理验证码
processed_image = preprocess_image(image_path)# 进行 OCR 识别
text = recognize_captcha(processed_image)print(f"识别出的验证码: {text}")
- 代码解析
3.1 预处理验证码图像
验证码通常包含噪点、干扰线,甚至扭曲的字符。为提高识别率,我们对图像进行了以下优化:
灰度化:去除颜色信息,仅保留亮度,提高 OCR 识别效率。
高斯模糊:减少噪声,平滑图像,提高字符的清晰度。
二值化:将图像转换为黑白,使字符更清晰,便于 OCR 识别。
3.2 PaddleOCR 解析验证码
PaddleOCR 采用深度学习模型进行文字识别,相较传统 OCR(如 Tesseract)在复杂验证码上表现更好。
关键 API 解析:
PaddleOCR(use_angle_cls=True, lang="en")
use_angle_cls=True:启用文本方向检测(部分验证码可能旋转)。
lang="en":设定识别语言为英文,可改为 "ch" 识别中文。
ocr.ocr(image_path)
识别图像中的文字,返回 (文本, 置信度) 组成的列表。
line[1][0] 提取识别文本,line[1][1] 代表置信度。
- 运行程序
将 captcha.png 放入代码目录下,然后执行:
python captcha_recognizer.py
输出示例:
识别出的验证码: H7X3D
- 进一步优化 OCR 识别率
5.1 训练 PaddleOCR 识别特定验证码
如果验证码字符形态较特殊,可训练 PaddleOCR 自定义模型:
收集并标注 1000+ 张验证码样本。
使用 PaddleOCR 提供的 OCR 训练工具
进行训练。
训练完成后,使用 custom 语言模型进行识别:
ocr = PaddleOCR(det_model_dir="custom_model")
5.2 采用神经网络处理粘连字符
部分验证码字符可能连在一起,OCR 识别效果较差。可以使用 ctc-loss 训练 LSTM/Transformer OCR 模型,提高识别率。例如:
ocr = PaddleOCR(use_angle_cls=True, rec_algorithm="CRNN")
CRNN(卷积循环神经网络)专门用于序列化 OCR 任务,如验证码识别。