From fcca863bafd5f33522bc14c23dde4540e264ec94 Mon Sep 17 00:00:00 2001 From: Richard Burton Date: Thu, 5 May 2022 17:23:43 +0100 Subject: MLECO-3171: Add flag to make VWW grayscale conversion optional Signed-off-by: Richard Burton Change-Id: I4ae40a60efc0c09f27b02f739769238e95bb112c --- .../use_case/vww/include/VisualWakeWordProcessing.hpp | 4 +++- source/use_case/vww/src/VisualWakeWordProcessing.cc | 18 +++++++++++------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/source/use_case/vww/include/VisualWakeWordProcessing.hpp b/source/use_case/vww/include/VisualWakeWordProcessing.hpp index bef161f..f9f9d72 100644 --- a/source/use_case/vww/include/VisualWakeWordProcessing.hpp +++ b/source/use_case/vww/include/VisualWakeWordProcessing.hpp @@ -35,8 +35,9 @@ namespace app { /** * @brief Constructor * @param[in] inputTensor Pointer to the TFLite Micro input Tensor. + * @param[in] rgb2Gray Convert image from 3 channel RGB to 1 channel grayscale. **/ - explicit VisualWakeWordPreProcess(TfLiteTensor* inputTensor); + explicit VisualWakeWordPreProcess(TfLiteTensor* inputTensor, bool rgb2Gray=true); /** * @brief Should perform pre-processing of 'raw' input image data and load it into @@ -49,6 +50,7 @@ namespace app { private: TfLiteTensor* m_inputTensor; + bool m_rgb2Gray; }; /** diff --git a/source/use_case/vww/src/VisualWakeWordProcessing.cc b/source/use_case/vww/src/VisualWakeWordProcessing.cc index a9863c0..4ae8a54 100644 --- a/source/use_case/vww/src/VisualWakeWordProcessing.cc +++ b/source/use_case/vww/src/VisualWakeWordProcessing.cc @@ -15,6 +15,7 @@ * limitations under the License. */ #include "VisualWakeWordProcessing.hpp" + #include "ImageUtils.hpp" #include "VisualWakeWordModel.hpp" #include "log_macros.h" @@ -22,8 +23,9 @@ namespace arm { namespace app { - VisualWakeWordPreProcess::VisualWakeWordPreProcess(TfLiteTensor* inputTensor) - :m_inputTensor{inputTensor} + VisualWakeWordPreProcess::VisualWakeWordPreProcess(TfLiteTensor* inputTensor, bool rgb2Gray) + :m_inputTensor{inputTensor}, + m_rgb2Gray{rgb2Gray} {} bool VisualWakeWordPreProcess::DoPreProcess(const void* data, size_t inputSize) @@ -34,17 +36,19 @@ namespace app { auto input = static_cast(data); - auto unsignedDstPtr = static_cast(this->m_inputTensor->data.data); + uint8_t* unsignedDstPtr = this->m_inputTensor->data.uint8; - /* VWW model has one channel input => Convert image to grayscale here. - * We expect images to always be RGB. */ - image::RgbToGrayscale(input, unsignedDstPtr, inputSize); + if (this->m_rgb2Gray) { + image::RgbToGrayscale(input, unsignedDstPtr, inputSize); + } else { + std::memcpy(unsignedDstPtr, input, inputSize); + } /* VWW model pre-processing is image conversion from uint8 to [0,1] float values, * then quantize them with input quantization info. */ QuantParams inQuantParams = GetTensorQuantParams(this->m_inputTensor); - auto signedDstPtr = static_cast(this->m_inputTensor->data.data); + int8_t* signedDstPtr = this->m_inputTensor->data.int8; for (size_t i = 0; i < this->m_inputTensor->bytes; i++) { auto i_data_int8 = static_cast( ((static_cast(unsignedDstPtr[i]) / 255.0f) / inQuantParams.scale) + inQuantParams.offset -- cgit v1.2.1