本仓库内代码是用于解决以下网站的图形验证码 https://lidapoly.haiqikeji.com/ https://lidapoly.leykeji.com/ https://lidapoly.zjxkeji.com/ 等yinghua推出的网课平台验证码 准确率如果粗略看待有百分之98左右
当前默认方案是固定尺寸验证码上的 CNN + 多个字符分类头:
- 输入尺寸固定为
90x40 - 标签从文件名前缀读取,例如
abcd_1775923311005.jpg - 默认字符集是
0-9和a-z - 当前公开训练集与验证集都是 4 位验证码
- 模型产物只保留 PyTorch checkpoint,即
.pt
github_python_captcha_ocr/
captcha_ocr/
__init__.py
checkpoint.py
config.py
data.py
decoding.py
losses.py
model.py
training.py
data/
train/
validation/
models/
best_4digit.pt
train_cnn_heads.py
validate_cnn_heads.py
requirements.txt
README.md
本目录内的数据已经按用途整理好:
data/train/:训练集,来源于原始目录中的img/data/validation/:验证集,来源于原始目录中的check/
文件命名规则:
<label>_<timestamp>.jpg
例如:
fanb_1775843643468.jpg
其中:
fanb是标签_后面的数字只是时间戳或样本标识
脚本默认只读取 .jpg 文件,并从文件名前缀提取标签。
建议先进入本目录,再安装依赖:
pip install -r requirements.txt依赖只包含训练和推理必须项:
torchnumpypillow
快速冒烟:
python train_cnn_heads.py --epochs 1 --max-samples 256 --batch-size 64默认行为:
- 训练集来自
data/train - 验证集来自
data/validation - 默认只保留 4 位标签样本
- 最优模型保存到
models/best_4digit.pt
python train_cnn_heads.py --epochs 20 --batch-size 64 --output models/best_4digit.pt如果你想启用轻量增强:
python train_cnn_heads.py --epochs 20 --batch-size 64 --augment训练日志中最重要的内容是:
Saved best checkpoint to ...- 最后打印的
Best val_exact=... from epoch ...
因为实际保存的是验证集指标最好的 checkpoint,不一定是最后一轮。
python validate_cnn_heads.py --weights models/best_4digit.pt --data-dir data/validation验证脚本会输出:
LossExact matchChar accuracyLength accuracy- 部分错误样例
如果只想做一次小规模检查:
python validate_cnn_heads.py --weights models/best_4digit.pt --data-dir data/validation --max-samples 64从验证集中选一张图片:
python train_cnn_heads.py --predict data/validation\\114j_1775919971174.jpg --weights models/best_4digit.pt输出格式:
Prediction: 114j
train_cnn_heads.py 里常用的参数如下:
--data-dir:训练集目录,默认data/train--val-data-dir:验证集目录,默认data/validation--epochs:训练轮数--batch-size:批大小--max-samples:只取部分训练样本做快速实验--augment:开启轻量增强--output:最优 checkpoint 输出路径--resume-from:从已有 checkpoint 恢复训练--device:强制指定cpu或cuda
当前实现保留了两个模式:
- 固定长度模式
- 默认开启
- 只训练长度等于
--max-length的样本 - 当前公开数据默认就是这个模式
- 可变长度模式
- 使用
--no-exact-length-only打开 - 会启用长度头和对齐感知损失
- 适合未来接入含 3 位或混合长度样本的数据
- 使用
模型内部使用 PAD 类来表示某些字符头位置上没有字符,这样同一个结构也能兼容较短标签。
No usable images found under ...
- 检查数据目录是否存在
- 检查目录中是否是
.jpg文件 - 检查文件名是否符合
<label>_<timestamp>.jpg - 检查标签字符是否只包含数字和小写字母
train_cnn_heads.py 训练时报显存不足
- 降低
--batch-size - 改用
--device cpu
验证指标比训练时低很多
- 先确认使用的是
models/best_4digit.pt - 再确认验证目录是否为
data/validation - 如果训练时开了增强,验证阶段属于关闭增强的正常行为