Files
test_nine/README.md
2025-11-04 18:30:34 +08:00

142 lines
8.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 九宫格+点选测试代码
## **本项目仅供学习交流使用,请勿用于商业用途,否则后果自负。**
## **本项目仅供学习交流使用,请勿用于商业用途,否则后果自负。**
## **本项目仅供学习交流使用,请勿用于商业用途,否则后果自负。**
## 参考项目
resnet模型及V4数据集https://github.com/taisuii/ClassificationCaptchaOcr
点选检测模型https://github.com/Peterande/D-FINE
另一个点选检测模型https://github.com/facebookresearch/dinov3
另一个点选的检测模型https://github.com/ultralytics/ultralytics
apihttps://github.com/ravizhan/geetest-v3-click-crack
感谢 @kissnavel 提供的关于我没玩的那两款的api
## 运行步骤
### 1.安装依赖本地必选使用docker跳至[5-b](#docker)
可选a-0. 如果要训练paddle的话还得安装paddlex及图像分类模块安装看项目[https://github.com/PaddlePaddle/PaddleX](https://github.com/PaddlePaddle/PaddleX)
可选a-1. d-fine训练看项目[https://github.com/Peterande/D-FINE](https://github.com/Peterande/D-FINE)
可选a-2. dinov3使用看项目[https://github.com/Peterande/D-FINE](https://github.com/facebookresearch/dinov3) 具体分类基于patch token
可选a-3. yolo训练看项目[https://github.com/Peterande/D-FINE](https://github.com/ultralytics/ultralytics)
可选a-4. 基于dinov3的分类架构极其简陋从一组图片中抽取所有已定位的图片的特征图而后在一组中以下侧作为锚点设置1正面样本其余均做负面样本学习dinov3提取特征中影响相似度比对的维度
* 必选b.模型需要在项目目录下新建一个model文件夹然后把模型文件放进去具体命名可以是resnet18.onnx或者PP-HGNetV2-B4.onnx默认使用PP-HGNetV2-B4模型如果用resnet则use_v3_model设置为False因为模型的输入输出不一样可以自行修改d-fine的模型同样放置此路径用于通过点选另外的dinov3和yolo1n和我自己做的任务头整体组合为一个流水线作业全都要放进去
```
pip install -r requirements.txt
```
仅推理
```
pip install -r requirements_without_train.txt
```
### 2.自行准备数据集V3和V4有区别可选点选可以自己生成要有旋转、重叠、换色
##### a. 训练resnet18可选
- 数据集详情参考上面标注的项目但是上面项目是V4数据集V3没有demo自行发挥吧用V4练V3不改代码正确率有点感人
- 主要是V4的尺寸和V3有差别V4的api直接给两张图一张是目标图一张是九宫格V3放在一起要切目标且V3目标图清晰度很低V4九宫格切了之后是100 * 86的图去掉黑边但是V3九宫格切的是112 * 112不确定V4九宫格内容在V3基础上做了什么变换反正改预处理就完事了
##### a-0. 训练PP-HGNetV2-B4可选
在paddle上随便找的数据集格式如下如果拿V4练V3建议是多整点变换
```
dataset
├─images #所有图片存放路径
├─label.txt #标签路径,每一行数据格式为 <序号>+<空格>+<类别>如15 地球仪
├─train.txt #训练图片,每一行数据格式为 <图片路径>+<空格>+<类别>如images/001.jpg 0
└─验证集和测试集同上
```
##### a-1. 训练d-fine可选
数据集格式如d-fine中标识如果不修改源码则num_classes需+1采用coco格式即可我用的320*320dataloader注释掉了RandomZoomOut、RandomHorizontalFlip、RandomIoUCrop这些我全写在数据集生成中了
##### a-2. 训练基于dinov3和yolo的流水线可选
数据集格式我自己拟定的因为一次加载使用一个锚点一个正面多个负面所以我先组织了格式当然原始标注时还是用的coco将每个image上的所有标注全组合在两个列表根据y轴划分top和bottom以bottom为锚点实际上没差但是实际使用不涉及top组内比对就跳过了节省资源top中1✅多❌
##### b. 如果要切V3的九宫格图用crop_image.py的crop_image_v3切V4则使用crop_image自行编写切图脚本
### 3.训练模型(可选)
- 训练resnet18运行 `python train.py`
- 如果训练PP-HGNetV2-B4运行`python train_paddle.py`
- 训练d-fine参照原项目一个模型拿下比ddddocr+相似性检测资源开销小点
- 训练代码极其简单可以基于我提出的思路即数据集组织使用llm直接生成yolo训练参考其仓库即可dinov3没训练也没拿来做定位因为定位头的规模大于yolo11n不划算
### 4-a.PP-HGNetV2-B4模型和resnet模型转换为onnx可选
- 运行 `python convert.py`自行进去修改需要转换的模型一般是选loss小的
- paddle模型转换要装paddle2onnx详情参见https://www.paddlepaddle.org.cn/documentation/docs/guides/advanced/model_to_onnx_cn.html
### 4-b.d-fine转换为onnx可选
- 依原项目转换
- 推理时图像预处理应于训练时一致d-fine仓库中onnx推理的预处理和训练不一致……
### 4-c. 复合模型转onnx可选
- yolo依原项目转换
- dinov3直接使用官方即可只是拿来提取特征
- 分类的导出也是pytorch和onnx内置函数由于太小所以没必要做什么操作
- 之所以不组合为一个模型主要还是考虑到未来如果更新可以复用dinov3提取的特征实际上可以完成上述所有任务虽然定位的模型会大一点但一个几百kb大小的头可以替代九宫格的分类模型点选定位如果只划分上下的部分或许也能用更小的模型
### 5-a.启动fastapi服务必须要有训练完成的onnx格式模型
基于环境变量可以自定义加载哪些模型目前支持use_pdluse_dfineuse_multi日志也有环境变量改LOG_LEVEL
运行 `python main.py`九宫格默认用的paddle的onnx模型如果要用resnet18可以自己改注释或者`uvicorn main:app --host 0.0.0.0 --port 9645 --reload`
由于轨迹问题可能会出现验证正确但是结果失败所以建议增加retry次数训练后的paddle模型正确率在99.9%以上,
由于dinov3的onnx和pth不完全一致导致基于pth训练的头精度低了一点4613张图里面错了1张如果采用量化的dinov3会多错几张当然可以使用onnx量化提取的特征训练但是速度比pth慢得多就是了再说吧
### 5-b.使用docker启动服务
镜像地址为<span id="docker">luguoyixiazi/test_nine:25.7.2</span> 此版本特供只需要九宫格和便笺的
镜像地址为<span id="docker">luguoyixiazi/test_nine:25.11.2</span> 此版本在上述基础上支持🛤和3z
运行时只需指定绑定的port和两个环境变量`use_pdl``use_dfine``use_multi`1为启用模型0为不启用默认均启用api端口为/pass_uni必填参数gt、challenge单独的pass_nine和pass_icon也写了有更多可选参数
### 6.api调用
python调用如
```python
import httpx
def game_captcha(gt: str, challenge: str):
res = httpx.get("http://127.0.0.1:9645/pass_uni",params={'gt':gt,'challenge':challenge},timeout=10)
# 或者依旧使用pass_nine路径
# res = httpx.get("http://127.0.0.1:9645/pass_nine",params={'gt':gt,'challenge':challenge,'use_v3_model':True,"save_result":False},timeout=10)
datas = res.json()['data']
if datas['result'] == 'success':
return datas['validate']
return None # 失败返回None 成功返回validate
```
在snap hutao中的服务端口为/pass_hutao,返回值已做对齐填写api如`(http://127.0.0.1:9645/pass_hutao?gt={0}&challenge={1})`即可
添加了辅助api加载卸载模型和查看模型以及更改日志等级
具体调用代码看使用项目此处示例仅为API url和参数示例
#### --宣传--
欢迎大家支持我的其他项目(搭配使用)喵~~~~~~~~