File: ios_caffe.cc

package info (click to toggle)
pytorch 1.13.1%2Bdfsg-4
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 139,252 kB
  • sloc: cpp: 1,100,274; python: 706,454; ansic: 83,052; asm: 7,618; java: 3,273; sh: 2,841; javascript: 612; makefile: 323; xml: 269; ruby: 185; yacc: 144; objc: 68; lex: 44
file content (52 lines) | stat: -rw-r--r-- 2,032 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

#include "ios_caffe.h"
#include "caffe2/core/tensor.h"
#include "caffe2/mobile/contrib/ios/ios_caffe_predictor.h"
#include "caffe2/predictor/predictor.h"

Caffe2IOSPredictor* MakeCaffe2Predictor(const std::string& init_net_str,
                                        const std::string& predict_net_str,
                                        bool disableMultithreadProcessing,
                                        bool allowMetalOperators,
                                        std::string& errorMessage) {
  caffe2::NetDef init_net, predict_net;
  init_net.ParseFromString(init_net_str);
  predict_net.ParseFromString(predict_net_str);

  Caffe2IOSPredictor* predictor = NULL;
  try {
    predictor = Caffe2IOSPredictor::NewCaffe2IOSPredictor(
        init_net, predict_net, disableMultithreadProcessing, allowMetalOperators);
  } catch (const std::exception& e) {
    std::string error = e.what();
    errorMessage.swap(error);
    return NULL;
  }
  return predictor;
}

void GenerateStylizedImage(std::vector<float>& originalImage,
                           const std::string& init_net_str,
                           const std::string& predict_net_str,
                           int height,
                           int width,
                           std::vector<float>& dataOut) {
  caffe2::NetDef init_net, predict_net;
  init_net.ParseFromString(init_net_str);
  predict_net.ParseFromString(predict_net_str);
  caffe2::Predictor p(init_net, predict_net);

  std::vector<int> dims({1, 3, height, width});
  caffe2::Tensor input(caffe2::CPU);
  input.Resize(dims);
  input.ShareExternalPointer(originalImage.data());
  caffe2::Predictor::TensorList input_vec;
  input_vec.emplace_back(std::move(input));
  caffe2::Predictor::TensorList output_vec;
  p(input_vec, &output_vec);
  assert(output_vec.size() == 1);
  caffe2::TensorCPU* output = &output_vec.front();
  // output is our styled image
  float* outputArray = output->mutable_data<float>();
  dataOut.assign(outputArray, outputArray + output->size());
}