使用X-AnyLabeling进行ai模型标注遇到的问题

Lam Taam 2024-06-14 16:01:05 阅读 74

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:定位这个问题花了我超长时间,源码只会提示矩阵不匹配,但是不知道是哪一步代码出问题,我是从异常捕获代码块一步一步追溯,再慢慢打断点测试才找到,最终解决。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。