首页 > 其他分享 >X-anylabeling如何手动加载(自定义)模型 : 以Segment Anything 为例

X-anylabeling如何手动加载(自定义)模型 : 以Segment Anything 为例

时间:2024-08-21 10:25:17浏览次数:12  
标签:自定义 Anything 为例 -- onnx 模型 encoder decoder model

提示:

文章目录


在这里插入图片描述

前言

手动加载模型的需求,主要分为三种情况,

  • 情况一 :因各种网络原因无法加载,软件内置的模型加载方法无法使用
  • 情况二 :内置模型在你的应用场景效果不好,你已微调了这个模型(没有修改结构),想加载进去帮助标注
  • 情况三 :想添加软件暂不支持的自定义模型进入软件

前两种对应的解决方案

  1. 手动下载模型文件至软件默认读取位置, 或者以自定义模型形式加入,或者让你的标注软件走你的代理
  2. 以自定义模型形式加入

第三种需求,本文暂不涉及,后续会更新。

手动加载模型时因参数配置等情况可能出错,可执行文件版本的X-anylabeling在遇到问题时一般会直接闪退,无法提示错误原因或者Debug排查。这里我建议源码安装X-anylabeling(后简称**“标注软件”**),安装教程可见附录。

1 手动下载模型至软件默认读取路径

标注软件默认的模型下载、存放和读取根目录地址在

# ubntu
~/xanylabeling_data/models

# window
C:\Users\[你的用户名]\anylabeling_data\models

不同的模型存放在不同名字的文件夹中,手动下载的话需要确定文件夹名(及程序内定义的模型名)。如果你在软件中尝试过下载,通常这个模型文件夹是已经建立好了的,只是模型未能成功下载。

当然你也可以通过下述方法,手动查看模型文件夹名字,

首先,打开软件支持模型地址目录,找到你想要使用的模型。本次案例中以SAM ViT-base 模型为例,
在这里插入图片描述
打开模型对应的配置文件,name字段即模型在该软件中定义的名字,这也是你需要创建的文件夹名,display_name是在软件GUI中显示给用户的名字

type: segment_anything
name: segment_anything_vit_b-r20230810
display_name: Segment Anything (ViT-Base)
encoder_model_path: https://github.com/CVHub520/X-AnyLabeling/releases/download/v0.2.0/sam_vit_b_01ec64.encoder.onnx
decoder_model_path: https://github.com/CVHub520/X-AnyLabeling/releases/download/v0.2.0/sam_vit_b_01ec64.decoder.onnx
input_size: 1024
max_width: 1024
max_height: 682

待文件夹创造完成后,将两个模型文件下载进去(即图里的 encoder和decoder.onnx)

~/xanylabeling_data/models/segment_anything_vit_b-r20230810
|---- sam_vit_b_01ec64.encoder.onnx
|---- sam_vit_b_01ec64.decoder.onnx

即可完成手动下载文件,这个时候就可以在软件内使用该模型了。
这里面的注意事项就是路径不要输错, 程序版本-模型版本-文件都要做对应。

2 加载自定义模型

官方给这种方式的精确描述是Loading Adapted Custom Models

Adapted models are those that have already been integrated into X-AnyLabeling, so you don’t need to write any code. Refer to the Model List for more details.
已经适配的模型已经集成到 X-AnyLabeling 中,所以你不需要编写任何代码。详情请参见模型列表。软件支持模型地址目录

换句话说,只要你的网络结构和他的一样,就可以加载并辅助标注。

本案例中以Segment Anything模型为例,官方推荐使用
SAM论文仓库地址:的模型

https://github.com/facebookresearch/segment-anything.git

推荐工具仓库:进行模型导出

https://github.com/vietanhdev/samexporter.gi

假设你已有模型(.pth),如何进行导出

X-anylabeling要求模型导出为两个部分 一个 encoder 一个decoder,这样通常只有第一次加载图片时需要编码计算,后续在图上的操作只需要解码,会有不错的实时性提升。

安装导出工具

我建议源码安装,方便查看报错信息和调试
我还建议你新开一个虚拟环境去装这个工具,或者用你微调的sam模型的环境去做。不要使用X-anylabeling的虚拟环境,有不少难以兼容的依赖

# 创建新环境略 python版本要求 3.10+
pip install torch==2.4.0 torchvision --index-url https://download.pytorch.org/whl/cpu
git clone https://github.com/vietanhdev/samexporter
cd samexporter
pip install -e .

导出你的模型,

可以参考我的脚本, export.sh

echo "Start to export encoder..."

python -m samexporter.export_encoder --checkpoint finetune_model/best_model_0813_6704.pth \
    --output output_models/best_model_0813_6704.encoder.onnx \
    --model-type vit_b \
    --quantize-out output_models/best_model_0813_6704.encoder.quant.onnx \
    --use-preprocess

echo "Export encoder finished"
echo "=========================="

echo "Start to export decoder..."

python -m samexporter.export_decoder --checkpoint finetune_model/best_model_0813_6704.pth \
    --output output_models/best_model_0813_6704.decoder.onnx \
    --model-type vit_b \
    --quantize-out output_models/best_model_0813_6704.decoder.quant.onnx \
    --return-single-mask

echo "Export encoder decoder"

以下是encoder导出和decoder导出的相关参数的解析。

python -m samexporter.export_encoder \
    --checkpoint finetune_model/best_model_0813_6704.pth \ # 指定要导出的模型检查点文件路径
    --output output_models/best_model_0813_6704.encoder.onnx \ # 指定导出后的 ONNX 模型文件路径,没有这个文件夹的话会报错,请手动创建
    --model-type vit_b \ # 指定模型类型(例如 vit_b, vit_l 请参考SAM官方工程)
    --quantize-out output_models/best_model_0813_6704.encoder.quant.onnx \ # 指定量化后模型的输出路径
    --use-preprocess # 使用预处理步骤

python -m samexporter.export_decoder \
    --checkpoint finetune_model/best_model_0813_6704.pth \ # 指定要导出的模型检查点文件路径
    --output output_models/best_model_0813_6704.decoder.onnx \ # 指定导出后的 ONNX 模型文件路径
    --model-type vit_b \ # 指定模型类型(例如 vit_b)
    --quantize-out output_models/best_model_0813_6704.decoder.quant.onnx \ # 指定量化后模型的输出路径
    --return-single-mask # 返回单一的掩码,如果希望返回多个掩码则不要加这一行

在标注软件中加载模型

把你导出的 encoder decoder 和对应的模型配置文件(.yaml) 放在程序模型目录中

# ubntu
~/xanylabeling_data/models

# window
C:\Users\[你的用户名]\anylabeling_data\models

例如我的模型放在在这个目录下的一个新建文件夹custom_model

~/xanylabeling_data/models/custom_model
|---- best_model_0813_6704.encoder.onnx
|---- best_model_0813_6704.decoder.onnx
|---- segment_anything_vit_b.yaml    #配置文件

提示:虽然你可以把模型放在任何位置。但是我强烈建议你按本文档操作: 将这三个文件放在软件模型存放地址下的同级目录,避免出现一些路径中转义字符的错误。如果你用的是可执行文件的软件版本,模型加载错误时进程闪退,不会给你任何提示,让你摸不着头脑。

修改 segment_anything_vit_b.yaml 文件,将编码器encoder_model_path 解码器 decoder_model_path地址重新指向 模型位置。display_name改成自己喜欢的 其余的不要动。

type: segment_anything
name: segment_anything_vit_b_quant-r20230520
display_name: Segment Anything (ViT-Base Quant Custom)
encoder_model_path: best_model_0813_6704.encoder.quant.onnx
decoder_model_path: best_model_0813_6704.decoder.quant.onnx
input_size: 1024
max_width: 1024
max_height: 682

这是官方文档翻译的字段解释

FieldDescriptionModifiable
type模型类型标识符,不可定制。
name模型配置文件的索引名称,请保持默认值。
display_name模型下拉列表中显示的名称,可以自定义。✔️
model_path加载模型的路径,支持相对和绝对路径。✔️

打开软件,加载‘自定义’模型。并选择 上面提到的配置文件

在这里插入图片描述
应该到这就大功告成了,如果出现闪退一般是模型有问题,
即模型路径是对的,但模型文件有问题,请排查你导出时是否存在问题。
更多信息,你可看官方教程


X-anylabeling 源码安装

官方教程, 本案例中需要配一个 ubuntu GPU Cuda 11.1 可二次开发的环境
克隆工程

git clone https://github.com/CVHub520/X-AnyLabeling.git -b v2.4.0

环境配置, 建议不要修改python版本,否则pyqt可能存在不兼容

conda create --name xany python=3.9 -y
conda activate xany

安装依赖

# Install ONNX Runtime CPU
pip install onnxruntime

# Install ONNX Runtime GPU , 官方文档中建议至少版本为1.16.0
pip install onnxruntime-gpu==1.16.0

cd X-AnyLabeling/

# 安装GPU 开发版环境
pip install -r requirements-gpu-dev.txt

#生成资源
pyrcc5 -o anylabeling/resources/resources.py anylabeling/resources/resources.qrc

设置相关路径

sudo gedit ~/.bashrc

# 打开 ~/.bashrc 后写入环境变量,改成你文件夹路径
export PYTHONPATH=/path/to/X-AnyLabeling

# 写完后更新
source ~/.bashrc

启动程序

python anylabeling/app.py

过程中遇到的问题

GPU环境问题

[W:onnxruntime:Default, onnxruntime_pybind_state.cc:541 CreateExecutionProviderInstance] Failed to create CUDAExecutionProvider. Please reference https://onnxruntime.ai/docs/reference/execution-providers/CUDA-ExecutionProvider.html#requirements to ensure all dependencies are met.

# or

[E:onnxruntime:Default, provider_bridge_ort.cc:1480 TryGetProviderInfo_CUDA] /onnxruntime_src/onnxruntime/core/session/provider_bridge_ort.cc:1193 onnxruntime::Provider& onnxruntime::ProviderLibrary::Get() [ONNXRuntimeError] : 1 : FAIL : Failed to load library libonnxruntime_providers_cuda.so with error: libcudnn.so.8: 无法打开共享对象文件: 没有那个文件或目录

前者,onnxruntime-gpu环境有误,可以参考,

https://blog.csdn.net/qq_40541102/article/details/130086491

后者,缺cudnn库

opencv

cv2.error: OpenCV(4.10.0) /io/opencv/modules/highgui/src/window.cpp:1301: error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvShowImage'

https://blog.csdn.net/beautifulback/article/details/125504940

软件提示模型加载错误

X-anylabling提示

Error in loading model: exceptions must derive from BaseException

在我这是模型路径有问题,产生了这个报错。yaml文件中修改为正确的模型路径后成功

运行模型时程序闪退

我的模型地址写错了 写成了两个decoder,所以不会提示模型不存在,但是加载和运行肯定会报错

标签:自定义,Anything,为例,--,onnx,模型,encoder,decoder,model
From: https://blog.csdn.net/m0_46396537/article/details/141322943

相关文章

  • 机器学习框架推理流程简述(以一项部署在windows上的MNN框架大模型部署过程为例子)
    一、写在前面公司正好有这个需求,故我这边简单接受进行模型的部署和demo程序的编写,顺便学习了解整个大模型的部署全流程。这篇博客会简单提到大模型部署的全流程,侧重点在推理这里。并且这篇博客也是结合之前的MNN部署流程来编写的,最好连下来一起看。MNN框架在WIN10上的部署MNN框......
  • Windows 上使用 PowerShell 设置防火墙规则和端口转发; Windows 上配置端口转发,将 3389
    在PowerShell中配置Windows防火墙的端口转发涉及几个步骤。首先,你需要确保你有足够的权限来进行这些操作(通常需要管理员权限)。以下是如何在PowerShell中配置端口转发的示例步骤:1. 打开PowerShell以管理员身份运行PowerShell。你可以右键点击PowerShell图标,选择“以管......
  • QTabWidget自定义样式(仿DotNetBar)
    QSS如下,若需要tab栏背景色需要添加ui->tabWidget->setAttribute(Qt::WA_StyledBackground);语句使background-color生效,这个时候qtdesigner中仍然看不到背景色,但是不要担心它是生效的,只需在属性中勾上autofillbackground即可在designer中预览(该属性在QWidget属性组中,实际上勾不勾......
  • Swift中的强大构建块:自定义运算符全解析
    标题:Swift中的强大构建块:自定义运算符全解析在Swift编程语言中,运算符是执行操作的一种快捷方式,它们可以用于简单的数学计算,也可以用于复杂的逻辑处理。Swift不仅提供了丰富的内置运算符,还允许开发者定义自己的运算符,以适应特定的编程需求。本文将深入探讨如何在Swift中实现......
  • .net core 自定义异常信息
    思路:在startup.cs的configservice中配置一下,异常实现 ExceptionFilterAttribute接口 1publicclassExceptionConfig2{3publicstaticvoidConfigureServices(IServiceCollectionservices)4{5//自定义捕捉异常6services.AddCont......
  • IOS 12 自定义用户协议对话框
    实现效果实现逻辑本文使用QMUI里面提供的控制器+自定义控件实现。添加依赖#腾讯开源的UI框架,提供了很多功能,例如:圆角按钮,空心按钮,TextView支持placeholder#https://github.com/QMUI/QMUIDemo_iOS#https://qmuiteam.com/ios/get-startedpod"QMUIKit"还不了解如何使......
  • 文心快码 Baidu Comate 前端工程师观点分享:以文心快码 Baidu Comate为例,智能代码助手
    本系列视频来自百度工程效能部的前端研发经理杨经纬,她在由开源中国主办的“AI编程革新研发效能”OSC源创会·杭州站·105期线下沙龙活动上,从一款文心快码(BaiduComate)前端工程师的角度,分享了关于智能研发工具本身的研发历程和理念。以下视频是关于【智能代码助手需要什么】的......
  • 5章1节:用R语言进行定量数据的统计描述,文末有众数的自定义函数
    在科研中,很多资料经过整理之后,常常需要进行一系列的统计分析,以说明资料的特征。这种分析方法中,统计描述是最基础且最重要的部分之一。统计描述主要通过统计指标和统计图表来描述数据的分布规律及其数量特征,从而为后续的统计推断提供基础。统计描述不仅在医学科研中应用广泛,在......
  • ansible自动化之playbook剧本【nginx安装为例】
    一、简介roles则是ansible中,playbooks的目录组织结构。将代码或者文件进行模块化,成为roles的文件目录组织结构,易管理,易理解,代码可重用,层次清晰。二、准备目录结构创建所需目录:mkdir-proles/nginx/{files,handlers,tasks,templates,vars}创建所需文件:touchroles/......
  • Vue 自定义指令
    除了核心功能默认内置的指令v-model和v-showvue也允许注册自定义指令。注意,在Vue2.0中,代码复用和抽象的主要形式是组件。然而,有的情况下,你仍然需要对普通Dom元素进行底层操作,这时候就会用到自定义指令。有两种方式定义自定义指令,一:局部定义自定义指令1、局部自定......