代码地址:https://github.com/dinglufe/segment-anything-cpp-wrapper
为 Segment Anything,MobileSAM和HQ-SAM 创建了一个纯C++推理API,运行时不依赖Python。
视频演示
示例程序用法:
在发布页面下载压缩文件,解压缩后直接运行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);
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。