AI分割一切模型SAM(Segment Anything Model)的C++部署

2023年最火爆的分割模型莫过于SAM,截止今天2024年1月19日,github上的star已经达到了41.7k的惊人数量。下面我们来体会一下如何运行这个模型,以及如何用C++部署这个模型。

检查cuda环境

我的Cuda版本是12.0.1,如下,

Cudnn是在官网下载的版本,

cudnn-windows-x86_64-8.9.2.26_cuda12-archive.zip

如果没有cuda也没关系,测试嘛,运行cpu版本就行。有cuda后面要注意版本问题。

下载SAM

SAM的官网地址是:https://github.com/facebookresearch/segment-anything

(base) D:\aiSeg> git clone --recursive https://github.com/facebookresearch/segment-anything

(base) D:\aiSeg>cd segment-anything;

(base) D:\aiSeg\segment-anything>

配置anaconda环境

(base) D:\aiSeg\segment-anything> conda ctreate -n seg

(base) D:\aiSeg\segment-anything> conda activate seg

(seg) D:\aiSeg\segment-anything>

然后,按照pytorch上的说明安装,详情可以参考:

PyTorch

(seg) D:\aiSeg\segment-anything> conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia

这里选pytorch-cuda=12.1,反正后面也没碰到啥问题,就酱。

再然后安装cudatools,默认安装了11.8,

(seg) D:\aiSeg\segment-anything> conda install cudatoolkit

The following NEW packages will be INSTALLED:

  cudatoolkit        pkgs/main/win-64::cudatoolkit-11.8.0-hd77b12b_0

再安装segment-anything,

(seg) D:\aiSeg\segment-anything>pip install -e .

Obtaining file:///D:/aiSeg/segment-anything

  Preparing metadata (setup.py) ... done

Installing collected packages: segment-anything

  Running setup.py develop for segment-anything

Successfully installed segment-anything-1.0

还有OpenCV等等等等要安装。。。。

(seg) D:\aiSeg\segment-anything>conda install opencv

The following NEW packages will be INSTALLED:

  opencv             pkgs/main/win-64::opencv-4.6.0-py311h5d08a89_5

(seg) D:\aiSeg\segment-anything>

测试SAM

安装完毕后,用vscode直接打开segment-anything文件夹,选择要测试运行的amg.py文件,

然后配置launch.json中的参数,内容如下,

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Current File",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal",
            "justMyCode": false,
            "args": [
                "--input=D:/aiImages/SoderbergLenna/Lenna.png",
                "--output=D:/aiImages/SoderbergLenna/",
                "--model-type=“vit_b",
                "--checkpoint=D:/aiDataset/sam/sam_vit_b_01ec64.pth"
            ]
        }
    ]
}

这时候,就可以点击Starting Debug(F5)直接开跑了,一路顺利的话会得到下面的结果,

原图,

生成的mask,

导出ONNX文件

然后我们导出onnx文件,这一步是为后面的c++部署做准备的。

python scripts/export_onnx_model.py --checkpoint D:/aiDataset/sam/sam_vit_h_4b8939.pth --model-type vit_h --output sam_vit_h_4b8939.onnx

这样,我们就生成了sam_vit_h_4b8939.onnx文件。

下载cpp部署

项目地址在:https://github.com/dinglufe/segment-anything-cpp-wrapper

老办法,

> git clone --recursive https://github.com/dinglufe/segment-anything-cpp-wrapper

然后发现作者用的onnxruntime,因此我们也安装一下,

> conda install onnx

> conda install onnxruntime

另外,还要到 https://github.com/microsoft/onnxruntime

去下载windows上的动态库,我这里的本机地址是,

D:\aiEngine\onnxruntime-win-x64-gpu-1.16.2

生成所需要的辅助文件

项目中有一个export_pre_model.py文件,我略改了一下,因为我没有用hq-sam,直接用的segment-anything,改后内容如下,

# Code formatter may move "import segment_anything as SAM" and "import mobile_sam as SAM" to the top
# But this may bring errors after switching models
import torch
import numpy as np
import os

from segment_anything.utils.transforms import ResizeLongestSide

from onnxruntime.quantization import QuantType
from onnxruntime.quantization.quantize import quantize_dynamic

output_names = ['output']

# Generate preprocessing model of Segment-anything in onnx format
# Use original segment-anything, Mobile-SAM or HQ-SAM model
# Each in a separate Python virtual environment

# Uncomment the following lines to generate preprocessing model of Segment-anything
import segment_anything as SAM
# # Download Segment-anything model "sam_vit_h_4b8939.pth" from https://github.com/facebookresearch/segment-anything#model-checkpoints
# # and change the path below
checkpoint = 'sam_vit_h_4b8939.pth'
model_type = 'vit_h'
output_path = 'models/sam_preprocess.onnx'
quantize = True


# 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 done
    output_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_size

    def 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,
    )

生成的这一堆文件如下,

然后cmake生成项目,就可以把项目跑起来了,最后的视频效果如下所示。

segment-anything-cpp-wrapper

注意事项

  1. 注意配置路径,让项目能找到相应的dll文件。
  2. 注意如果要使用HQ-sam,要另外再建一个conda的环境,不然生成onnx文件时会有冲突报错。

本文结束。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

03.Elasticsearch应用(三)

Elasticsearch应用(三) 1.核心概念介绍 注意:类型(Type) 6.0之前的版本有Type概念,type相当于关系型数据库的表,ES官方将在ES9版本中彻底删除Type。7里面Type为ES默认的类型_doc 2.Cat API 介…

Matlab|基于改进遗传算法的储能选址定容(可任意设定储能数量)

目录 主要内容 部分代码 结果一览(以3个储能为例) 下载链接 主要内容 该模型采用改进遗传算法优化配电网系统中储能选址位置和容量,程序以IEEE33节点系统为分析对象,以网损最小为目标,采用matpower实现系…

diffusion入门

1. diffusion model 概念 https://zhuanlan.zhihu.com/p/638442430 这篇博客写得很好,顺便做一点笔记记录一下。 原博客附带的代码也很清晰易懂。 1.1 前向过程 后一个过程等于前一个结果的均值乘上sqrt(1-beta_t), 再加上方差beta_t的噪声。 这样下去可以得到 x…

每日一道算法题 16(2023-12-29)

package com.tarena.test.B20; import java.util.Arrays; import java.util.Scanner; /** * * 题目描述: 输入一个由n个大小写字母组成的字符串,按照Ascii码从小到大的排序规则,查找字符串中第k个最小ascii码值的字母(k>…

023-安全开发-PHP应用后台模SessionCookieToken身份验证唯一性

023-安全开发-PHP应用&后台模&Session&Cookie&Token&身份验证&唯一性 #知识点: 1、PHP后台身份验证模块实现 2、Cookie&Session技术&差异 3、Token数据包唯一性应用场景 项目1:用cookie做后台身份验证 项目2&#xff1a…

git bash右键菜单失效解决方法

git bash右键菜单失效解决方法 这几天重新更新了git,直接安装新版本后,右键菜单失效找不到了。找了好几个博客,发现都不全面,最后总结一下解决方法: (1)按winr,输入regedit打开注册…

解决git管理GitHub连接问题

前言 git提交文档到GitHub老是出问题,记录下 报错 首先是常规操作更新文档,命令如下 $ git add . $ git commit -m "add" $ git push origin main后面老是报这种错误,如下图 To github.com:zhenxijiabei/yuque.git! [rejected…

mysql-进阶篇

文章目录 存储引擎MySQL体系结构相关操作 存储引擎特点InnoDBInnoDB 逻辑存储结构 MyISAMMemory三个存储引擎之间的区别存储引擎的选择 索引1. 索引结构B-TreeB-Tree (多路平衡查找树)B-Tree演变过程 BTree与 B-Tree 的区别BTree演变过程 Hash 2.索引分类3.索引语法演示 4.SQL性…

react18介绍

改进已有属性,如自动批量处理【setState】、改进Suspense、组件返回undefined不再报错等 支持Concurrent模式,带来新的API,如useTransition、useDeferredValue等 如何升级React 18 npm install reactlatest react-domlatestnpm install ty…

5分钟做自己的微信红包封面

文章目录 怎么制作自己的红包封面?开通红包封面的要求如下:收费情况制作具体网站:https://chatapi.onechat.fun/register?affYoU6 提交审核logo封面、挂件、气泡证明材料 发放红包封面其他 怎么制作自己的红包封面? 开通红包封面…

OpenCV书签 #结构相似性SSIM算法的原理与图片相似性实验

1. 介绍 结构相似性(Structural Similarity,简称SSIM算法),主要用于检测两张相同尺寸的图像的相似度、或者检测图像的失真程度,是一种衡量两幅图像相似度的指标。 定义 给定两个图像 x 和 y,两张图像的结…

第十三讲_ArkUI栅格布局(GridRow/GrowCol)

ArkUI栅格布局(GridRow/GrowCol) 1. 栅格布局概述2. GridRow的使用2.1 设置栅格布局的总列数2.2 设置栅格布局的排列方向2.3 设置栅格布局中子组件间距 3. GridCol的使用3.1 设置一个GridCol占栅格布局的列数3.2 设置GridCol在栅格布局中偏移列数3.3 设置…

xshell可以远程登录服务器但是vscode一直显示让输入密码的解决方案

vscode报错 但是xshell可以登录 原因:可能因为我上一次没有恰当的退出远程链接导致的,我每次退出远程都是直接强制关闭VScode。 解决方法:打开VScode的 view (查看) palette(命令面板)然后输…

读懂比特币—bitcoin代码分析(二)

我们从比特币的客户端启动顺序作为入口来分析代码&#xff0c;先看下面这个函数&#xff1a;AppInitBasicSetup&#xff0c;初始化应用基础设置 bool AppInitBasicSetup(const ArgsManager& args, std::atomic<int>& exit_status) {// ************************…

【Maven】-- 打包添加时间戳的两种方法

一、需求 在执行 mvn clean package -Dmaven.test.skiptrue 后&#xff0c;生成的 jar 包带有自定义系统时间。 二、实现 方法一&#xff1a;使用自带属性&#xff08;不推荐&#xff09; 使用系统时间戳&#xff0c;但有一个问题&#xff0c;就是默认使用 UTC0 的时区。举例…

西瓜书学习笔记——Boosting(公式推导+举例应用)

文章目录 引言AdaBoost算法AdaBoost算法正确性说明AdaBoost算法如何解决权重更新问题&#xff1f;AdaBoost算法如何解决调整下一轮基学习器样本分布问题&#xff1f;AdaBoost算法总结实验分析 引言 Boosting是一种集成学习方法&#xff0c;旨在通过整合多个弱学习器来构建一个…

2024区块链应用趋势,RWA实物资产化

作者 张群&#xff08;赛联区块链教育首席讲师&#xff0c;工信部赛迪特聘资深专家&#xff0c;CSDN认证业界专家&#xff0c;微软认证专家&#xff0c;多家企业区块链产品顾问&#xff09;关注张群&#xff0c;为您提供一站式区块链技术和方案咨询。 实物资产通证化&#xff0…

【开源】基于JAVA语言的智慧社区业务综合平台

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 业务类型模块2.2 基础业务模块2.3 预约业务模块2.4 反馈管理模块2.5 社区新闻模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 业务类型表3.2.2 基础业务表3.2.3 预约业务表3.2.4 反馈表3.2.5 社区新闻表 四、系统展…

状态空间模型(SSM)是近来一种备受关注的 Transformer 替代技术

状态空间模型&#xff08;SSM&#xff09;是近来一种备受关注的 Transformer 替代技术&#xff0c;其优势是能在长上下文任务上实现线性时间的推理、并行化训练和强大的性能。而基于选择性 SSM 和硬件感知型设计的 Mamba 更是表现出色&#xff0c;成为了基于注意力的 Transform…

VUE+Vis.js鼠标悬浮title提前显示BUG解决方法

在使用VUEVis.js做拓扑图&#xff0c;利用鼠标悬浮放在图标展示设备信息时&#xff0c;发现鼠标一放在图标上面时&#xff0c;标题表会提前在放置的元素下显示&#xff0c;鼠标再放到图标上去元素才会隐藏变成悬浮状态 解决方法&#xff1a; 添加一个div元素&#xff0c;设置v…