@@ -244,7 +244,7 @@ bool Segmentation::mergeLabels(image::Image<ScoredLabel>& labels, image::Image<S
244244 return true ;
245245}
246246
247- bool Segmentation::labelsFromModelOutput (image::Image<ScoredLabel>& labels, const std::vector< float > & modelOutput)
247+ bool Segmentation::labelsFromOutputTensor (image::Image<ScoredLabel>& labels, Ort::Value & modelOutput)
248248{
249249 for (int outputY = 0 ; outputY < _parameters.modelHeight ; outputY++)
250250 {
@@ -255,10 +255,8 @@ bool Segmentation::labelsFromModelOutput(image::Image<ScoredLabel>& labels, cons
255255
256256 for (int classe = 0 ; classe < _parameters.classes .size (); classe++)
257257 {
258- int classPos = classe * _parameters.modelWidth * _parameters.modelHeight ;
259- int pos = classPos + outputY * _parameters.modelWidth + outputX;
260-
261- float val = modelOutput[pos];
258+ const std::vector<int64_t > coords = {0 ,classe,outputY,outputX};
259+ const float val = modelOutput.At <float >(coords);
262260 if (val > maxVal)
263261 {
264262 maxVal = val;
@@ -281,29 +279,40 @@ bool Segmentation::processTile(image::Image<ScoredLabel>& labels, const image::I
281279 std::vector<const char *> inputNames{" input" };
282280 std::vector<const char *> outputNames{" output" };
283281 std::vector<int64_t > inputDimensions = {1 , 3 , _parameters.modelHeight , _parameters.modelWidth };
284- std::vector<int64_t > outputDimensions = {1 , static_cast <int64_t >(_parameters.classes .size ()), _parameters.modelHeight , _parameters.modelWidth };
285-
286- std::vector<float > output (_parameters.classes .size () * _parameters.modelHeight * _parameters.modelWidth );
287- Ort::Value outputTensors =
288- Ort::Value::CreateTensor<float >(memInfo, output.data (), output.size (), outputDimensions.data (), outputDimensions.size ());
289282
290283 std::vector<float > transformedInput;
291284 imageToPlanes (transformedInput, source);
292285
293286 Ort::Value inputTensors =
294287 Ort::Value::CreateTensor<float >(memInfo, transformedInput.data (), transformedInput.size (), inputDimensions.data (), inputDimensions.size ());
295288
289+ std::vector<Ort::Value> outTensor;
290+
296291 try
297292 {
298- _ortSession->Run (Ort::RunOptions{nullptr }, inputNames.data (), &inputTensors, 1 , outputNames.data (), &outputTensors , 1 );
293+ outTensor = _ortSession->Run (Ort::RunOptions{nullptr }, inputNames.data (), &inputTensors, 1 , outputNames.data (), 1 );
299294 }
300295 catch (const Ort::Exception& exception)
301296 {
302297 ALICEVISION_LOG_ERROR (" ERROR running model inference: " << exception.what ());
303298 return false ;
304299 }
305300
306- if (!labelsFromModelOutput (labels, output))
301+ std::vector<float > output (_parameters.classes .size () * _parameters.modelHeight * _parameters.modelWidth );
302+ int idx = 0 ;
303+ for (int ch = 0 ; ch < _parameters.classes .size (); ch++)
304+ {
305+ for (int i = 0 ; i < _parameters.modelHeight ; i++)
306+ {
307+ for (int j = 0 ; j < _parameters.modelWidth ; j++)
308+ {
309+ const std::vector<int64_t > coords = {0 , ch, i, j};
310+ output[idx++] = outTensor[0 ].At <float >(coords);
311+ }
312+ }
313+ }
314+
315+ if (!labelsFromOutputTensor (labels, outTensor[0 ]))
307316 {
308317 return false ;
309318 }
@@ -321,10 +330,6 @@ bool Segmentation::processTileGPU(image::Image<ScoredLabel>& labels, const image
321330 std::vector<const char *> inputNames{" input" };
322331 std::vector<const char *> outputNames{" output" };
323332 std::vector<int64_t > inputDimensions = {1 , 3 , _parameters.modelHeight , _parameters.modelWidth };
324- std::vector<int64_t > outputDimensions = {1 , static_cast <int64_t >(_parameters.classes .size ()), _parameters.modelHeight , _parameters.modelWidth };
325-
326- Ort::Value outputTensors = Ort::Value::CreateTensor<float >(
327- mem_info_cuda, reinterpret_cast <float *>(_cudaOutput), _output.size (), outputDimensions.data (), outputDimensions.size ());
328333
329334 std::vector<float > transformedInput;
330335 imageToPlanes (transformedInput, source);
@@ -334,19 +339,32 @@ bool Segmentation::processTileGPU(image::Image<ScoredLabel>& labels, const image
334339 Ort::Value inputTensors = Ort::Value::CreateTensor<float >(
335340 mem_info_cuda, reinterpret_cast <float *>(_cudaInput), transformedInput.size (), inputDimensions.data (), inputDimensions.size ());
336341
342+ std::vector<Ort::Value> outTensor;
343+
337344 try
338345 {
339- _ortSession->Run (Ort::RunOptions{nullptr }, inputNames.data (), &inputTensors, 1 , outputNames.data (), &outputTensors , 1 );
346+ outTensor = _ortSession->Run (Ort::RunOptions{nullptr }, inputNames.data (), &inputTensors, 1 , outputNames.data (), 1 );
340347 }
341348 catch (const Ort::Exception& exception)
342349 {
343350 ALICEVISION_LOG_ERROR (" ERROR running model inference: " << exception.what ());
344351 return false ;
345352 }
346353
347- cudaMemcpy (_output.data (), _cudaOutput, sizeof (float ) * _output.size (), cudaMemcpyDeviceToHost);
354+ int idx = 0 ;
355+ for (int ch = 0 ; ch < _parameters.classes .size (); ch++)
356+ {
357+ for (int i = 0 ; i < _parameters.modelHeight ; i++)
358+ {
359+ for (int j = 0 ; j < _parameters.modelWidth ; j++)
360+ {
361+ const std::vector<int64_t > coords = {0 , ch, i, j};
362+ _output[idx++] = outTensor[0 ].At <float >(coords);
363+ }
364+ }
365+ }
348366
349- if (!labelsFromModelOutput (labels, _output ))
367+ if (!labelsFromOutputTensor (labels, outTensor[ 0 ] ))
350368 {
351369 return false ;
352370 }
0 commit comments