xref: /aosp_15_r20/external/armnn/tests/ImagePreprocessor.cpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1*89c4ff92SAndroid Build Coastguard Worker //
2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2017 Arm Ltd. All rights reserved.
3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT
4*89c4ff92SAndroid Build Coastguard Worker //
5*89c4ff92SAndroid Build Coastguard Worker 
6*89c4ff92SAndroid Build Coastguard Worker #include "InferenceTestImage.hpp"
7*89c4ff92SAndroid Build Coastguard Worker #include "ImagePreprocessor.hpp"
8*89c4ff92SAndroid Build Coastguard Worker 
9*89c4ff92SAndroid Build Coastguard Worker #include <armnn/TypesUtils.hpp>
10*89c4ff92SAndroid Build Coastguard Worker 
11*89c4ff92SAndroid Build Coastguard Worker #include <armnnUtils/Permute.hpp>
12*89c4ff92SAndroid Build Coastguard Worker #include <armnn/utility/NumericCast.hpp>
13*89c4ff92SAndroid Build Coastguard Worker 
14*89c4ff92SAndroid Build Coastguard Worker #include <iostream>
15*89c4ff92SAndroid Build Coastguard Worker #include <fcntl.h>
16*89c4ff92SAndroid Build Coastguard Worker #include <array>
17*89c4ff92SAndroid Build Coastguard Worker 
18*89c4ff92SAndroid Build Coastguard Worker template <typename TDataType>
GetLabelAndResizedImageAsFloat(unsigned int testCaseId,std::vector<float> & result)19*89c4ff92SAndroid Build Coastguard Worker unsigned int ImagePreprocessor<TDataType>::GetLabelAndResizedImageAsFloat(unsigned int testCaseId,
20*89c4ff92SAndroid Build Coastguard Worker                                                                           std::vector<float> & result)
21*89c4ff92SAndroid Build Coastguard Worker {
22*89c4ff92SAndroid Build Coastguard Worker     testCaseId = testCaseId % armnn::numeric_cast<unsigned int>(m_ImageSet.size());
23*89c4ff92SAndroid Build Coastguard Worker     const ImageSet& imageSet = m_ImageSet[testCaseId];
24*89c4ff92SAndroid Build Coastguard Worker     const std::string fullPath = m_BinaryDirectory + imageSet.first;
25*89c4ff92SAndroid Build Coastguard Worker 
26*89c4ff92SAndroid Build Coastguard Worker     InferenceTestImage image(fullPath.c_str());
27*89c4ff92SAndroid Build Coastguard Worker 
28*89c4ff92SAndroid Build Coastguard Worker     // this ResizeBilinear result is closer to the tensorflow one than STB.
29*89c4ff92SAndroid Build Coastguard Worker     // there is still some difference though, but the inference results are
30*89c4ff92SAndroid Build Coastguard Worker     // similar to tensorflow for MobileNet
31*89c4ff92SAndroid Build Coastguard Worker 
32*89c4ff92SAndroid Build Coastguard Worker     result = image.Resize(m_Width, m_Height, CHECK_LOCATION(),
33*89c4ff92SAndroid Build Coastguard Worker                           InferenceTestImage::ResizingMethods::BilinearAndNormalized,
34*89c4ff92SAndroid Build Coastguard Worker                           m_Mean, m_Stddev, m_Scale);
35*89c4ff92SAndroid Build Coastguard Worker 
36*89c4ff92SAndroid Build Coastguard Worker     // duplicate data across the batch
37*89c4ff92SAndroid Build Coastguard Worker     for (unsigned int i = 1; i < m_BatchSize; i++)
38*89c4ff92SAndroid Build Coastguard Worker     {
39*89c4ff92SAndroid Build Coastguard Worker         result.insert(result.end(), result.begin(), result.begin() + armnn::numeric_cast<int>(GetNumImageElements()));
40*89c4ff92SAndroid Build Coastguard Worker     }
41*89c4ff92SAndroid Build Coastguard Worker 
42*89c4ff92SAndroid Build Coastguard Worker     if (m_DataFormat == DataFormat::NCHW)
43*89c4ff92SAndroid Build Coastguard Worker     {
44*89c4ff92SAndroid Build Coastguard Worker         const armnn::PermutationVector NHWCToArmNN = { 0, 2, 3, 1 };
45*89c4ff92SAndroid Build Coastguard Worker         armnn::TensorShape dstShape({m_BatchSize, 3, m_Height, m_Width});
46*89c4ff92SAndroid Build Coastguard Worker         std::vector<float> tempImage(result.size());
47*89c4ff92SAndroid Build Coastguard Worker         armnnUtils::Permute(dstShape, NHWCToArmNN, result.data(), tempImage.data(), sizeof(float));
48*89c4ff92SAndroid Build Coastguard Worker         result.swap(tempImage);
49*89c4ff92SAndroid Build Coastguard Worker     }
50*89c4ff92SAndroid Build Coastguard Worker 
51*89c4ff92SAndroid Build Coastguard Worker     return imageSet.second;
52*89c4ff92SAndroid Build Coastguard Worker }
53*89c4ff92SAndroid Build Coastguard Worker 
54*89c4ff92SAndroid Build Coastguard Worker template <>
55*89c4ff92SAndroid Build Coastguard Worker std::unique_ptr<ImagePreprocessor<float>::TTestCaseData>
GetTestCaseData(unsigned int testCaseId)56*89c4ff92SAndroid Build Coastguard Worker ImagePreprocessor<float>::GetTestCaseData(unsigned int testCaseId)
57*89c4ff92SAndroid Build Coastguard Worker {
58*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> resized;
59*89c4ff92SAndroid Build Coastguard Worker     auto label = GetLabelAndResizedImageAsFloat(testCaseId, resized);
60*89c4ff92SAndroid Build Coastguard Worker     return std::make_unique<TTestCaseData>(label, std::move(resized));
61*89c4ff92SAndroid Build Coastguard Worker }
62*89c4ff92SAndroid Build Coastguard Worker 
63*89c4ff92SAndroid Build Coastguard Worker template <>
64*89c4ff92SAndroid Build Coastguard Worker std::unique_ptr<ImagePreprocessor<uint8_t>::TTestCaseData>
GetTestCaseData(unsigned int testCaseId)65*89c4ff92SAndroid Build Coastguard Worker ImagePreprocessor<uint8_t>::GetTestCaseData(unsigned int testCaseId)
66*89c4ff92SAndroid Build Coastguard Worker {
67*89c4ff92SAndroid Build Coastguard Worker     std::vector<float> resized;
68*89c4ff92SAndroid Build Coastguard Worker     auto label = GetLabelAndResizedImageAsFloat(testCaseId, resized);
69*89c4ff92SAndroid Build Coastguard Worker 
70*89c4ff92SAndroid Build Coastguard Worker     size_t resizedSize = resized.size();
71*89c4ff92SAndroid Build Coastguard Worker     std::vector<uint8_t> quantized(resized.size());
72*89c4ff92SAndroid Build Coastguard Worker 
73*89c4ff92SAndroid Build Coastguard Worker     for (size_t i=0; i<resizedSize; ++i)
74*89c4ff92SAndroid Build Coastguard Worker     {
75*89c4ff92SAndroid Build Coastguard Worker         quantized[i] = static_cast<uint8_t>(resized[i]);
76*89c4ff92SAndroid Build Coastguard Worker     }
77*89c4ff92SAndroid Build Coastguard Worker 
78*89c4ff92SAndroid Build Coastguard Worker     return std::make_unique<TTestCaseData>(label, std::move(quantized));
79*89c4ff92SAndroid Build Coastguard Worker }
80