链接: https://pan.do1e.cn/南京大学/NJU-captcha-dataset.7z,解压密码:@Do1e
包含了 100,000 张验证码图片,文件名称为{验证码文本}_{图片md5}.jpg。验证码文本标注为全小写。
基于 ddddocr 和 NJUlogin 进行识别与正确性验证,识别错误的为手动标注。
build_dataset 目录下包含了南大统一身份认证验证码的数据集构建代码。
需要先配置下述环境变量:
NJU_USERNAME:南大统一身份认证用户名NJU_PASSWORD:南大统一身份认证密码DOWNLOAD_DIR:验证码图片下载目录NUM_REQUIRE:需要下载的验证码图片数量,默认为 100,000
之后运行脚本 build_dataset/download.py,会将验证码图片下载到指定目录,其中正确的验证码放在 right 文件夹中,错误的验证码放在 wrong 文件夹中,需要手动重命名并移动到 right 文件夹中。
完成后还需运行脚本 build_dataset/post_processing.py,分配训练、验证和测试集并生成数据集信息,需要指定环境变量 DOWNLOAD_DIR 和 TRAIN_RATIO(训练集比例,默认为 0.8)。
model 目录下包含了南大统一身份认证验证码的识别模型及其训练代码。
设计了一个 轻量化的CNN模型
参数量 588,424
模型尺寸 2.24MiB
训练脚本: model/train.py
或者直接使用导出的 onnx。
service 目录下包含了南大统一身份认证验证码的识别服务代码。
也可以使用我在 vercel 上部署的服务。
docker build -t nju-captcha-service . docker run -d --name nju-captcha-service -p 8000:8000 nju-captcha-servicenginx 配置示例:
server { listen 80; listen [::]:80; listen 443 ssl; listen [::]:443 ssl; server_name example.com; if ($scheme = http) { return 301 https://$host$request_uri; } location / { proxy_pass http://127.0.0.1:8000$request_uri; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Real-PORT $remote_port; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }npm install -g vercel vercel login vercel --prodcaptcha_b64=$(base64 -i captcha.jpg | tr -d '\n') curl -X POST 'https://njucaptcha.vercel.app' \ -H 'Content-Type: application/x-www-form-urlencoded' \ -d "captcha=$(echo "$captcha_b64" | jq -s -R -r @uri)"vercel api 版本:很慢,推荐自建服务。我的解决方案是在校内搭一个服务并用 frp 映射到公网,如果想要登录 p.nju 则走校内网:
const url_pub = 'https://example.com/'; const url_nju = 'https://nju.example.com/'; const currentUrl = window.location.href; const serverUrl = currentUrl.includes('//p.nju.edu.cn') ? url_nju : url_pub;NJU server api 版本:上述介绍的最佳实践,我毕业后将无法使用。
本地 onnx 推理版本:第一次需要科学上网缓存 wasm 相关文件,后续就不用了,也比较快(能在页面加载完成瞬间填充上验证码)。
