【从零开始部署SAM(Segment Anything Model )大模型 3 Ubuntu20 离线部署 C++】

这里是目录

  • 总览
  • 环境配置
  • 模型准备
    • Moble SAM onnx模型获取
    • Moble SAM pre onnx模型获取
  • 运行
    • cmakelist
  • 运行结果

总览

相比于使用python离线部署SAM大模型,C++要麻烦的多,本篇的部署过程主要基于项目:https://github.com/dinglufe/segment-anything-cpp-wrapper

环境配置

模型准备

通过C++进行部署的主要原因就是希望能够有效的提升运行效率减少推理耗时,SAM大模型的官方网站中提供了vit_h,vit_l,vit_b三种大小不同的模型参数,在我们的实际运行中发现,以vit_h参数为例,对于一帧图像的整体运算时间高达6000ms(读取图像+推理+获得掩膜并显示),因此我们认为SAM的三种参数都不适用于C++的部署工作,我们最终选择了MobileSAM作为C++的实际部署模型

在项目中需要处理模型mobilesam.onnx和预处理模型mobilesam_process.onnx
在当前以有项目和博客指导这两种模型应该如何获取,但是都太过于笼统对初学者并不友好,在当初运行时走了很多弯路,在此给出详细步骤过程

Moble SAM onnx模型获取

懒彦祖传送门:

https://download.csdn.net/download/qq_43649786/89380411
这部分在mobilesam的官方项目中给出了方法https://github.com/ChaoningZhang/MobileSAM#onnx-export
非常详细,需要注意的是需要安装onnx=1.12.0 && onnxruntime=1.13.1

  1. 创建conda环境并激活
conda create --name mobilesam python=3.8
conda activate mobilesam
  1. 下载源码并配置环境(在此默认已安装pytorch和torchvision)
pip install git+https://github.com/ChaoningZhang/MobileSAM.git
#如果不准备跑app.py下述可以不用
pip install gradio
#安装完后可能会出现打不开spyder的情况,运行以下指令
pip install Spyder
  1. 运行onnx生成文件
    注意此时系统的路径是在下载的源码内
python scripts/export_onnx_model.py --checkpoint ./weights/mobile_sam.pt --model-type vit_t --output ./mobile_sam.onnx

这么详细还搞不定我就真没办法了,彦祖

Moble SAM pre onnx模型获取

懒彦祖传送门:
https://download.csdn.net/download/qq_43649786/89380451

预训练的部分在部署项目中给出了代码
https://github.com/dinglufe/segment-anything-cpp-wrapper/blob/main/export_pre_model.py
但是同样有一些需要注意的点,首先在头文件的引用中需要将import segment_anything as SAM更改为import mobile_sam as SAM
需要注意的是如果没有在conda环境中配置mobileSAM环境和会出现问题,同时将SAM和mobileSAM同时安装在一个conda环境也有可能报错,在此建议分别安装

# import segment_anything as SAM
import mobile_sam as SAM

此处还需要一个mobileSAM 的.pt模型文件,在官方的项目中可自行下载:
https://github.com/ChaoningZhang/MobileSAM#onnx-export

完整代码

import torch
import numpy as np
import osfrom segment_anything.utils.transforms import ResizeLongestSidefrom onnxruntime.quantization import QuantType
from onnxruntime.quantization.quantize import quantize_dynamicoutput_names = ['output']# Gener
# Mobile-SAM
# # Download Mobile-SAM model "mobile_sam.pt" from https://github.com/ChaoningZhang/MobileSAM/blob/master/weights/mobile_sam.pt
import mobile_sam as SAM
checkpoint = 'mobile_sam.pt'
model_type = 'vit_t'
output_path = 'models/mobile_sam_preprocess.onnx'
quantize = False# Target image size is 1024x720
image_size = (1024, 720)output_raw_path = output_path
if quantize:# The raw directory can be deleted after the quantization is doneoutput_name = os.path.basename(output_path).split('.')[0]output_raw_path = '{}/{}_raw/{}.onnx'.format(os.path.dirname(output_path), output_name, output_name)
os.makedirs(os.path.dirname(output_raw_path), exist_ok=True)sam = SAM.sam_model_registry[model_type](checkpoint=checkpoint)
sam.to(device='cpu')
transform = ResizeLongestSide(sam.image_encoder.img_size)image = np.zeros((image_size[1], image_size[0], 3), dtype=np.uint8)
input_image = transform.apply_image(image)
input_image_torch = torch.as_tensor(input_image, device='cpu')
input_image_torch = input_image_torch.permute(2, 0, 1).contiguous()[None, :, :, :]class Model(torch.nn.Module):def __init__(self, image_size, checkpoint, model_type):super().__init__()self.sam = SAM.sam_model_registry[model_type](checkpoint=checkpoint)self.sam.to(device='cpu')self.predictor = SAM.SamPredictor(self.sam)self.image_size = image_sizedef forward(self, x):self.predictor.set_torch_image(x, (self.image_size))if 'interm_embeddings' not in output_names:return self.predictor.get_image_embedding()else:return self.predictor.get_image_embedding(), torch.stack(self.predictor.interm_features, dim=0)model = Model(image_size, checkpoint, model_type)
model_trace = torch.jit.trace(model, input_image_torch)
torch.onnx.export(model_trace, input_image_torch, output_raw_path,input_names=['input'], output_names=output_names)if quantize:quantize_dynamic(model_input=output_raw_path,model_output=output_path,per_channel=False,reduce_range=False,weight_type=QuantType.QUInt8,)

运行

cmakelist

cmake_minimum_required(VERSION 3.21)
set(CMAKE_CXX_STANDARD 17)project(SamCPP)find_package(OpenCV CONFIG REQUIRED)
find_package(gflags CONFIG REQUIRED)set(ONNXRUNTIME_ROOT_DIR /home/ubuntu/onnxruntime-linux-x64-gpu-1.14.1)add_library(sam_cpp_lib SHARED sam.h sam.cpp click_sample.cpp)
set(onnxruntime_lib ${ONNXRUNTIME_ROOT_DIR}/lib/libonnxruntime.so)
target_include_directories(sam_cpp_lib PRIVATE ${ONNXRUNTIME_ROOT_DIR}/include)
target_link_libraries(sam_cpp_lib PRIVATE${onnxruntime_lib}${OpenCV_LIBS}
)add_executable(sam_cpp_test test.cpp)
target_link_libraries(sam_cpp_test PRIVATEsam_cpp_lib${OpenCV_LIBS}gflags
)

缺啥安啥

更改test.cpp中的路径:

DEFINE_string(pre_model, "models/mobile_sam_preprocess.onnx", "Path to the preprocessing model");
DEFINE_string(sam_model, "models/mobile_sam.onnx", "Path to the sam model");
DEFINE_string(image, "images/input.jpg", "Path to the image to segment");
DEFINE_string(pre_device, "cpu", "cpu or cuda:0(1,2,3...)");
DEFINE_string(sam_device, "cpu", "cpu or cuda:0(1,2,3...)");

确保以上路径都正确且可以访问到文件
在项目主文件夹内打开终端

编译

mkdir build
cd build
cmake ..
make -j2
cd ..
./build/sam_cpp_test

运行结果

在这里插入图片描述
在这里插入图片描述

都看到这了,点个赞再走吧彦祖

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/22156.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

今日增长工具精选 | 三款你不知道但很实用的运营工具

PartnerShare作为一款分销裂变系统,受到国内多数工具类saas企业的青睐,旗下还有产品分享社区,介绍多种实用的工具,林叔从它那里获得灵感,新开了增长工具集合分享!希望能帮助更多saas企业增长。 一、Charac…

kettle学习总结(3)

书接上回&#xff0c;数据同步核心流程1&#xff0c;同步aav库表 <?xml version"1.0" encoding"UTF-8"?> <transformation><info><name>sync_aav</name><description /><extended_description /><trans_v…

计算机基础(3)——计算机系统组成

&#x1f497;计算机基础系列文章&#x1f497; &#x1f449;&#x1f340;计算机基础&#xff08;1&#xff09;——计算机的发展史&#x1f340;&#x1f449;&#x1f340;计算机基础&#xff08;2&#xff09;——冯诺依曼体系结构&#x1f340;&#x1f449;&#x1f34…

C++基础 auto 和 decltype的区别

auto关键字 auto 关键字允许编译器根据初始化表达式自动推导出变量的类型。这意味着你不需要显式写出变量的类型&#xff0c;编译器会根据你赋予的初始值来确定类型。这对于复杂类型、模板编程或是避免重复冗长的类型名称尤其有用&#xff0c;可以提高代码的可读性和编写效率。…

sensor曝光时间

一、基本概念 1.曝光时间Te (Time exposure) 曝光时间指一个像素感光的时间&#xff0c;会影响势井中电子的数量&#xff0c;从而影响像素的亮度&#xff0c;通常的单位为ms。 2. 帧率 fps&#xff08;frame per second&#xff09; 帧率值单位时间完全读出图像的帧数&…

【编译原理】LL(1)分析法:C/C++实现

&#x1f516;墨香寄清辞&#xff1a;空谷幽篁风动&#xff0c;梦中仙鹤月明。 辗转千秋豪情在&#xff0c;乘风翱翔志不移。 目录 1. 编译原理之LL(1)分析法概念 1.1 编译原理 1.2 LL(1)分析法 2. LL(1)分析法 2.1 实验目的 2.2 实验要求 2.3 实验内容 2.3.1 实验解决…

Python筑基之旅-字符串(一)

目录 一、字符串 1、字符串的定义 1-1、使用单引号() 1-2、使用双引号(") 1-3、使用三引号(或""") 1-4、原始字符串(rstr或Rstr) 2、字符串的语法 3、获取字符串的属性和方法 4、获取字符串的帮助信息 5、字符串的用法 5-1、capitalize()方法…

通信技术信号源硬件实验

定义 1.RZ码&#xff08;归零码&#xff09; RZ编码也成为归零码&#xff0c;归零码的特性就是在一个周期内&#xff0c;用二进制传输数据位&#xff0c;在数据位脉冲结束后&#xff0c;需要维持一段时间的低电平。 2.NRZ码&#xff08;不归零编码&#xff09; NRZ编码也成为…

哈希表与离散化(题目)

A. 子串判重 题目描述&#xff1a; 给定一个含有 26 个小写英文字母的字符串。有 m 次询问&#xff0c;每次给出 2 个区间&#xff0c;请问这两个区间里的子字符串是否一样&#xff1f; 输入&#xff1a; 第一行输入一个字符串 S 。 第二行一个数字 m&#xff0c;表示 m 次…

000-基于Sklearn的机器学习入门:工作环境搭建与配置

本专栏将介绍基于Scikit-learn(简称Sklearn)的机器学习入门知识。包括但不一定限于&#xff0c;机器学习基本知识、Sklearn库简介&#xff0c;基于Sklearn库的机器学习实践。 这是本专栏的第000篇&#xff0c;将介绍如何安装和配置Sklearn环境&#xff0c;不仅包括Sklearn库的…

超级详细!如何正确使用JMeter性能测试?紧扣面试实际要求

前段时间专门挑了一段时间在准备面试。经过两次面试后&#xff0c;有一些比较深刻的认识。对于企业要求来说&#xff0c;除了对专业理论知识考究之外&#xff0c;对测试工具这块也是看重的。 一、使用JMeter测试快速入门 1、线程组是什么 进程&#xff1a; 一个正在执行的程序…

【springboot整合mybatis】xml文件映射不到

# spring框架中整合Mybatis时&#xff0c;指定该属性一边spring容器能够加载和解析mybatis的Mapper XML文件 mybatis.mapper-locationsclasspath:mapper/*.xml这条配置是MyBatis框架中用来指定Mapper XML文件位置的配置项。在Spring框架中整合MyBatis时&#xff0c;通常会在配置…

Arduino ESP8266模块TFT液晶屏

ESP8266模块 模块实物图&#xff1a; 模块引脚定义&#xff1a; 工作模式选择&#xff1a; FlashBoot启动模式&#xff1a; GPIO15接GND UART固件下载模式: GPIO15接GND&#xff0c; GPIO0接GND 调试串口&#xff1a; URXD/UTXD 可用来下载固件和调试信息输出 模块使能&…

WebService的配置

如果提示”对操作“XXX”的回复消息正文进行反序列化时出错 那么多半是因为字符长度不够 调整参数 maxStringContentLength"10485760" maxReceivedMessageSize"2147483647" maxBufferSize"2147483647" 示例&#xff1a; messageVersion&qu…

VMware虚拟机与MobaXterm建立远程连接失败

VMware虚拟机与MobaXterm建立远程连接失败 首先可以检查一下是不是虚拟机的ssh服务并不存在 解决方法&#xff1a; 1.更新镜像源 yum -y update 这个过程会有点久&#xff0c;请耐心等待 2.安装ssh yum install openssh-server 3.启动ssh systemctl restart sshd 4.查…

K8s存储对象的使用

背景和概念 容器中的文件在磁盘上是临时存放的&#xff0c;这给在容器中运行较重要的应用带来一些问题&#xff1a; 当容器崩溃或停止时&#xff0c;此时容器状态未保存&#xff0c; 因此在容器生命周期内创建或修改的所有文件都将丢失。另外 在崩溃期间&#xff0c;kubelet 会…

git命令行分支(增删改查)

文章目录 一、创建分支并推送到远程仓库二、拉取指定分支代码三、删除分支 一、创建分支并推送到远程仓库 初始化git git init如果有远程仓库就进行克隆远程仓库 origin 表示远程仓库地址 git clone origin# 如果没有远程仓库 就进行创建一个远程仓库 git remote add origin ht…

MySQL经典练习50题(下)(解析版)

所有笔记、生活分享首发于个人博客 想要获得最佳的阅读体验&#xff08;无广告且清爽&#xff09;&#xff0c;请访问本篇笔记 书接上回&#xff08;1-25&#xff09; 经典50题&#xff08;26-50&#xff09; 查询每门课被选修的学生数 SELECT c.c_name,COUNT(DISTINCT sc.s_…

Flink的简单学习(kafka)三

一 Kafka的介绍 1.kafka是一个高吞吐的分布式消息系统&#xff0c;是一个消息队列。 2.生产者负责生产数据 &#xff0c;消费者负责消费数据 3.特点&#xff1a; 生存者消费者模型&#xff0c;FIFO 高性能&#xff1a;单节点支持上千个客户端&#xff0c;百MB/s吞吐 持久…

【Spring Cloud Alibaba】开源组件Sentinel

目录 什么是Sentinel发展历史与Hystrix的异同 Sentinel可以做什么&#xff1f;Sentinel的功能Sentinel的开源生态Sentinel的用户安装Sentinel控制台预备环境准备Sentinel 分为两个部分:下载地址 项目集成Sentinel创建项目修改依赖信息添加启动注解添加配置信息在控制器类中新增…