43 const std::map<std::string, std::vector<int>> &shapes) {
45 device_type_ = torch::kCUDA;
48 device_type_ = torch::kCPU;
51 for (
const auto &name : output_names_) {
52 auto iter = shapes.find(name);
53 if (iter != shapes.end()) {
54 auto blob = std::make_shared<Blob<float>>(iter->second);
55 blobs_.emplace(name, blob);
59 for (
const auto &name : input_names_) {
60 auto iter = shapes.find(name);
61 if (iter != shapes.end()) {
62 auto blob = std::make_shared<Blob<float>>(iter->second);
63 blobs_.emplace(name, blob);
70 torch::Device
device(device_type_, device_id_);
75 int height_ = blobs_[input_names_[0]]->shape(1);
76 int width_ = blobs_[input_names_[0]]->shape(2);
77 torch::Tensor input_feature_tensor = torch::zeros({1, 3, height_, width_});
78 std::array<float, 2> down_ratio{8.0f, 8.0f};
79 torch::Tensor tensor_downratio = torch::from_blob(down_ratio.data(), {1, 2});
80 std::array<float, 9> K{1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f};
81 torch::Tensor tensor_K = torch::from_blob(K.data(), {1, 3, 3});
83 std::vector<torch::jit::IValue> torch_inputs;
84 torch_inputs.push_back(input_feature_tensor.to(
device));
85 torch_inputs.push_back(
86 std::make_tuple(tensor_K.to(
device), tensor_downratio.to(
device)));
87 auto torch_output_tensor =
net_.forward(torch_inputs).toTuple()->elements();
88 if (torch_output_tensor[0].toTensor().requires_grad()) {
89 AWARN <<
"Require grad";
116 torch::Device
device(device_type_, device_id_);
117 auto blob = blobs_[input_names_[0]];
118 auto input_K = blobs_[input_names_[1]];
119 auto input_ratio = blobs_[input_names_[2]];
121 torch::Tensor tensor_image = torch::from_blob(
122 blob->data()->mutable_gpu_data(),
123 {blob->shape(0), blob->shape(1), blob->shape(2), blob->shape(3)},
125 torch::Tensor tensor_K = torch::from_blob(
126 input_K->data()->mutable_cpu_data(),
127 {input_K->shape(0), input_K->shape(1), input_K->shape(2)},
129 torch::Tensor tensor_ratio = torch::from_blob(
130 input_ratio->data()->mutable_cpu_data(),
131 {input_ratio->shape(0), input_ratio->shape(1)}, torch::kFloat32);
133 std::vector<torch::jit::IValue> torch_inputs;
134 torch_inputs.push_back(tensor_image.to(
device));
135 torch_inputs.push_back(
136 std::make_tuple(tensor_K.to(
device), tensor_ratio.to(
device)));
138 AINFO <<
"Start to do inference";
139 auto outputs =
net_.forward(torch_inputs).toTuple()->elements();
140 AINFO <<
"Finished inference";
142 for (
size_t i = 0; i < output_names_.size(); ++i) {
143 auto blob =
get_blob(output_names_[i]);
144 if (blob !=
nullptr) {
145 torch::Tensor output_tensor = outputs[i].toTensor();
146 std::vector<int64_t> output_size_ = output_tensor.sizes().vec();
147 std::vector<int> output_size(begin(output_size_), end(output_size_));
148 blob->Reshape(output_size);
149 blob->set_gpu_data(output_tensor.data_ptr<
float>());