Scroll Top

Sam (default)

C++ (Windows, Linux, MacOS / CUDA and Metal accelerated) port of https://github.com/facebookresearch/segment-anything.

Example Input & Outputs

Inputs Outputs
Input
Image Input
Input
Matte

Demo Code

 1#include <opencv2/opencv.hpp>
 2
 3#include "blace_ai.h"
 4
 5// include the models you want to use
 6#include "sam_v4_default_v1_ALL_export_version_v17.h"
 7
 8int main() {
 9  // register model at server
10  blace::util::registerModel(sam_v4_default_v1_ALL_export_version_v17,
11                             blace::util::getPathToExe());
12
13  // load image into op
14  auto exe_path = blace::util::getPathToExe();
15  std::filesystem::path photo_path = exe_path / "baseball.jpg";
16  auto input_img =
17      CONSTRUCT_OP_GET(blace::ops::FromImageFileOp(photo_path.string()));
18
19  std::vector<int> points = {300, 350};
20  std::vector<int> labels = {1};
21  auto points_mem = std::make_shared<blace::RawMemoryObject>(
22      (void *)points.data(), blace::ml_core::DataTypeEnum::INT_32,
23      blace::ml_core::ColorFormatEnum::ARBITRARY_CHANNELS,
24      std::vector<int64_t>{1, 2}, blace::ml_core::UNKNOWN_ORDER,
25      blace::ml_core::UNKNOWN_VALUE_RANGE);
26  auto labels_mem = std::make_shared<blace::RawMemoryObject>(
27      (void *)labels.data(), blace::ml_core::DataTypeEnum::INT_32,
28      blace::ml_core::ColorFormatEnum::ARBITRARY_CHANNELS,
29      std::vector<int64_t>{1, 1}, blace::ml_core::UNKNOWN_ORDER,
30      blace::ml_core::UNKNOWN_VALUE_RANGE);
31
32  auto points_op = CONSTRUCT_OP_GET(blace::ops::FromRawMemoryOp(points_mem));
33  auto labels_op = CONSTRUCT_OP_GET(blace::ops::FromRawMemoryOp(labels_mem));
34  auto multimask_op = CONSTRUCT_OP_GET(blace::ops::FromBoolOp(0));
35
36  // construct model inference arguments
37  blace::ml_core::InferenceArgsCollection infer_args;
38  infer_args.inference_args.device = blace::util::get_accelerator().value();
39  infer_args.inference_args.use_half = true;
40
41  // construct inference operation
42  auto infer_op = CONSTRUCT_OP_GET(blace::ops::InferenceOp(
43      sam_v4_default_v1_ALL_export_version_v17_IDENT,
44      {points_op, labels_op, input_img, multimask_op}, infer_args, 0));
45
46  // we prepare the result for later copy to cv::Mat. The values set here are
47  // based on implicit knowledge of cv::Mat internal data storage.
48  blace::computation_graph::GraphEvaluator evaluator(infer_op);
49  auto cv_result = evaluator.evaluateToCVMat().value();
50
51  cv_result *= 255.;
52
53  // save to disk and return
54  auto out_file = exe_path / "sam_output_mask.png";
55  cv::imwrite(out_file.string(), cv_result);
56
57  // unload all models before program exits
58  blace::util::unloadModels();
59
60  return 0;
61}

Follow the 5 minute instructions to build and run the demo.

Tested on version v0.9.27 of blace.ai sdk. Might also work on newer or older releases (check if release notes of blace.ai state breaking changes).

Artifacts

Payload Demo Project Header

License