使用X-AnyLabeling进行ai模型标注遇到的问题
时间:2024-04-11 09:10:35 来源:网络cs 作者:亙句 栏目:卖家故事 阅读:
X-AnyLabeling是一款基于AI推理引擎和丰富功能特性于一体的强大辅助标注工具,其专注于实际应用,致力于为图像数据工程师提供工业级的一站式解决方案,可自动快速进行各种复杂任务的标定。
1. 模型文件转换
首先需要将.pt的模型文件转化为.onnx。我采用的是yolov8-seg模型,在yolo框架下就可以直接转换。
yolo mode=export model=best.pt format=onnx simplify=True
Ultralytics 提供了足够详细的文档对export进行介绍,转换完成后可以在netron网站上可视化查看模型详细信息。
然后是配置文件,X-AnyLabeling导入自己模型的时候不能够直接读取.onnx文件,需要加载.yaml文件,格式如下:
type: yolov8_segname: display_name: my_segmentationmodel_path: best.onnxinput_width: 256input_height: 256stride: 32nms_threshold: 0.45confidence_threshold: 0.25classes: - ...
- `type`: 用于定义网络类型的标识符,以唯一标识每个模型。该标识符用户不可更改。
- `name`: 用于定义当前内置模型对应的配置文件索引标记,如果是加载用户自定义模型,此字段可不用设置。更多详情可参见 [models.yaml](../../anylabeling/configs/auto_labeling/models.yaml) 文件。
- `display_name`: 用于在界面上展示的名称,可根据自定义任务进行命名,例如 `Fruits (YOLOv5s)`。
`model_path`: 用于指定加载模型权重的路径。请注意,该路径是相对于当前配置文件的相对路径。如果需要,也可以直接填写绝对路径。同时,确保文件格式为 `*.onnx`。
- `nms_threshold`、`confidence_threshold`、`classes`字段可根据实际情况自行设置。
/../docs/zh_cn/custom_model.md 有详细教程
2. 安装X-AnyLabeling
一开始我直接下载X-AnyLabeling-GPU.exe,但是加载模型时总是闪退,又找不到原因,于是还是选择拉源码,直接win+r,打开cmd,用conda新建一个环境,切换当前目录为向想要保存的地址,拉取项目源码。
git clone https://github.com/CVHub520/X-AnyLabeling.git
安装依赖。
pip install -r requirements-gpu.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
项目提供了多个版本的依赖,可以根据需要选择,我这里选择的是gpu版。一定要使用清华源,否则会下载特别慢。同时,将../../anylabeling/app_info.py配置文件中的`__preferred_device__`字段设置为`GPU`。
运行。
python ./anylabeling/app.py
这时候加载模型的时候才发现,是我的yaml文件格式出了问题,修改之后能够正常加载模型。
3. onnxruntime与cuda、cudnn兼容问题
加载完模型之后,尝试使用ai标注,但是命令行报错
[E:onnxruntime:Default, provider_bridge_ort.cc:1480 onnxruntime::TryGetProviderInfo_CUDA] D:\a\_work\1\s\onnxruntime\core\session\provider_bridge_ort.cc:1193 onnxruntime::ProviderLibrary::Get [ONNXRuntimeError] : 1 : FAIL : LoadLibrary failed with error 126 "" when trying to load "D:\Anaconda\envs\x-labeling\lib\site-packages\onnxruntime\capi\onnxruntime_providers_cuda.dll"
应该是cuda版本问题,项目使用的onnxruntime是1.16.3,对应的cuda版本是11.8.0,cuDNN为8.5.0.96。下载对应版本的cuda与cuDNN即可解决。
4. 提示Error in predict_shapes: axes don't match array
运行模型一直无法给出结果,命令行提示Error in predict_shapes: axes don't match array。到处找解决方案无果,于是选择看源码,不断debug,终于发现是在yolo.py的postprocess函数中process_mask将mask重新upsample到原图大小的操作,cv2.resize函数遇到输入矩阵最后一个维度是1的会将这个维度去掉,也就是说如果输入是[h,w,1],resize之后就变成了[nh, nw],以致矩阵维度不匹配,遂在判断后加上一句np.expand_dims升维即可。
图中红框部分为添加代码,至此可以正常使用,一键ai生成所有label。
这个问题应该比较普遍,因为我在测试中发现最后一个维度表示的是最后生成的mask个数,如果只有一个mask就会被cv2.resize函数吞掉,多个就可以正常生成。
PS:定位这个问题花了我超长时间,源码只会提示矩阵不匹配,但是不知道是哪一步代码出问题,我是从异常捕获代码块一步一步追溯,再慢慢打断点测试才找到,最终解决。
本文链接:https://www.kjpai.cn/gushi/2024-04-11/156885.html,文章来源:网络cs,作者:亙句,版权归作者所有,如需转载请注明来源和作者,否则将追究法律责任!