Skip to content

Commit fba5883

Browse files
committed
Update model output processing
1 parent 5716cee commit fba5883

File tree

2 files changed

+45
-20
lines changed

2 files changed

+45
-20
lines changed

src/aliceVision/segmentation/segmentation.cpp

Lines changed: 37 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

src/aliceVision/segmentation/segmentation.hpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,11 +86,18 @@ class Segmentation
8686

8787
/**
8888
* Transform model output to a label image
89-
* @param labels the output labels imaage
89+
* @param labels the output labels image
9090
* @param modeloutput the model output vector
9191
*/
9292
bool labelsFromModelOutput(image::Image<ScoredLabel>& labels, const std::vector<float>& modelOutput);
9393

94+
/**
95+
* Transform model output to a label image
96+
* @param labels the output labels image
97+
* @param modeloutput the model output tensor
98+
*/
99+
bool labelsFromOutputTensor(image::Image<ScoredLabel>& labels, Ort::Value& modelOutput);
100+
94101
/**
95102
* Process effectively a buffer of the model input size
96103
* param labels the output labels

0 commit comments

Comments
 (0)