1

代码地址:https://github.com/dinglufe/segment-anything-cpp-wrapper

Segment AnythingMobileSAMHQ-SAM 创建了一个纯C++推理API,运行时不依赖Python。

视频演示

sam-cpp-demo.gif

示例程序用法:

在发布页面下载压缩文件,解压缩后直接运行sam_cpp_test或在命令行中运行:

# 显示帮助
./sam_cpp_test -h

# 示例(更改设备,预处理使用CPU,SAM使用CUDA)
# 如果有多个GPU,可以使用CUDA:1、CUDA:2等等。
# 也支持全部在CPU或全部在CUDA运行
./sam_cpp_test -pre_device="cpu" -sam_device="cuda:0"

# 示例(默认选项)
./sam_cpp_test -pre_model="models/sam_preprocess.onnx" -sam_model="models/sam_vit_h_4b8939.onnx" -image="images/input.jpg"

# 示例(使用MobileSAM)
./sam_cpp_test -pre_model="models/mobile_sam_preprocess.onnx" -sam_model="models/mobile_sam.onnx"

# 示例(更改图片)
./sam_cpp_test -image="images/input2.jpg"

C++库 - sam_cpp_lib

简单示例:

Sam::Parameter param("sam_preprocess.onnx", "sam_vit_h_4b8939.onnx", std::thread::hardware_concurrency());
param.providers[0].deviceType = 0; // 预处理使用CPU
param.providers[1].deviceType = 1; // SAM使用CUDA
Sam sam(param);

// 使用MobileSAM
Sam::Parameter param("mobile_sam_preprocess.onnx", "mobile_sam.onnx", std::thread::hardware_concurrency());
// Use HQ-SAM
Sam::Parameter param("sam_hq_preprocess.onnx", "sam_hq_vit_h.onnx", std::thread::hardware_concurrency());

auto inputSize = sam.getInputSize();
cv::Mat image = cv::imread("input.jpg", -1);
cv::resize(image, image, inputSize);
sam.loadImage(image); // 如果使用CPU,将需要6GB内存,如果使用CUDA,将需要16GB内存

// 使用带有提示的SAM(输入:x、y坐标)
cv::Mat mask = sam.getMask({200, 300});
cv::imwrite("output.png", mask);

// 使用带有多个提示的SAM(输入:points、negativePoints)
cv::Mat mask = sam.getMask(points, negativePoints); // 如果使用CPU,将需要1GB内存/显存
cv::imwrite("output-multi.png", mask);

// 使用带有框提示的SAM(输入:points、negativePoints、box)
// points和negativePoints可以为空(使用{}作为参数)
cv::Rect box{444, 296, 171, 397};
cv::Mat mask = sam.getMask(points, negativePoints, box);
cv::imwrite("output-box.png", mask);

// 自动生成掩码(输入:每边的点数)
// 由于在CPU上运行,速度较慢,而且结果不如官方演示好
cv::Mat maskAuto = sam.autoSegment({10, 10});
cv::imwrite("output-auto.png", maskAuto);

多模型对比

原版SAM和高精度HQ-SAM对比

sam-vs-hqsam.jpg


dinglufe
83 声望4 粉丝