1*89c4ff92SAndroid Build Coastguard Worker // 2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2021 Arm Ltd and Contributors. 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 "Decoder.hpp" 7*89c4ff92SAndroid Build Coastguard Worker decodeOutput(std::vector<int8_t> & modelOutput)8*89c4ff92SAndroid Build Coastguard Workerstd::pair<int, float> kws::Decoder::decodeOutput(std::vector<int8_t>& modelOutput) 9*89c4ff92SAndroid Build Coastguard Worker { 10*89c4ff92SAndroid Build Coastguard Worker 11*89c4ff92SAndroid Build Coastguard Worker std::vector<float> dequantisedOutput; 12*89c4ff92SAndroid Build Coastguard Worker //Normalise vector values into new vector 13*89c4ff92SAndroid Build Coastguard Worker for (auto& value : modelOutput) 14*89c4ff92SAndroid Build Coastguard Worker { 15*89c4ff92SAndroid Build Coastguard Worker float normalisedModelOutput = this->quantisationScale * (static_cast<float >(value) - 16*89c4ff92SAndroid Build Coastguard Worker static_cast<float >(this->quantisationOffset)); 17*89c4ff92SAndroid Build Coastguard Worker dequantisedOutput.push_back(normalisedModelOutput); 18*89c4ff92SAndroid Build Coastguard Worker } 19*89c4ff92SAndroid Build Coastguard Worker 20*89c4ff92SAndroid Build Coastguard Worker //Get largest value in modelOutput 21*89c4ff92SAndroid Build Coastguard Worker const std::vector<float>::iterator& maxElementIterator = std::max_element(dequantisedOutput.begin(), 22*89c4ff92SAndroid Build Coastguard Worker dequantisedOutput.end()); 23*89c4ff92SAndroid Build Coastguard Worker //Find the labelMapIndex of the largest value which corresponds to a key in a label map 24*89c4ff92SAndroid Build Coastguard Worker int labelMapIndex = static_cast<int>(std::distance(dequantisedOutput.begin(), maxElementIterator)); 25*89c4ff92SAndroid Build Coastguard Worker 26*89c4ff92SAndroid Build Coastguard Worker //Round to two DP 27*89c4ff92SAndroid Build Coastguard Worker float maxModelOutputProbability = std::roundf((*maxElementIterator) * 100) / 100; 28*89c4ff92SAndroid Build Coastguard Worker 29*89c4ff92SAndroid Build Coastguard Worker return std::make_pair(labelMapIndex, maxModelOutputProbability); 30*89c4ff92SAndroid Build Coastguard Worker 31*89c4ff92SAndroid Build Coastguard Worker } 32*89c4ff92SAndroid Build Coastguard Worker 33*89c4ff92SAndroid Build Coastguard Worker 34*89c4ff92SAndroid Build Coastguard Worker 35*89c4ff92SAndroid Build Coastguard Worker 36