MLECO-1868: Code static analyzer warnings fixes
Signed-off-by: alexander <alexander.efremov@arm.com>
Change-Id: Ie423e9cad3fabec6ab077ded7236813fe4933dea
diff --git a/source/application/main/Classifier.cc b/source/application/main/Classifier.cc
index bc2c378..9a47f3d 100644
--- a/source/application/main/Classifier.cc
+++ b/source/application/main/Classifier.cc
@@ -28,10 +28,46 @@
namespace app {
template<typename T>
- bool Classifier::_GetTopNResults(TfLiteTensor* tensor,
- std::vector<ClassificationResult>& vecResults,
- uint32_t topNCount,
- const std::vector <std::string>& labels)
+ void SetVectorResults(std::set<std::pair<T, uint32_t>>& topNSet,
+ std::vector<ClassificationResult>& vecResults,
+ TfLiteTensor* tensor,
+ const std::vector <std::string>& labels) {
+
+ /* For getting the floating point values, we need quantization parameters. */
+ QuantParams quantParams = GetTensorQuantParams(tensor);
+
+ /* Reset the iterator to the largest element - use reverse iterator. */
+ auto topNIter = topNSet.rbegin();
+ for (size_t i = 0; i < vecResults.size() && topNIter != topNSet.rend(); ++i, ++topNIter) {
+ T score = topNIter->first;
+ vecResults[i].m_normalisedVal = quantParams.scale * (score - quantParams.offset);
+ vecResults[i].m_label = labels[topNIter->second];
+ vecResults[i].m_labelIdx = topNIter->second;
+ }
+
+ }
+
+ template<>
+ void SetVectorResults<float>(std::set<std::pair<float, uint32_t>>& topNSet,
+ std::vector<ClassificationResult>& vecResults,
+ TfLiteTensor* tensor,
+ const std::vector <std::string>& labels) {
+ UNUSED(tensor);
+ /* Reset the iterator to the largest element - use reverse iterator. */
+ auto topNIter = topNSet.rbegin();
+ for (size_t i = 0; i < vecResults.size() && topNIter != topNSet.rend(); ++i, ++topNIter) {
+ vecResults[i].m_normalisedVal = topNIter->first;
+ vecResults[i].m_label = labels[topNIter->second];
+ vecResults[i].m_labelIdx = topNIter->second;
+ }
+
+ }
+
+ template<typename T>
+ bool Classifier::GetTopNResults(TfLiteTensor* tensor,
+ std::vector<ClassificationResult>& vecResults,
+ uint32_t topNCount,
+ const std::vector <std::string>& labels)
{
std::set<std::pair<T, uint32_t>> sortedSet;
@@ -59,82 +95,18 @@
/* Final results' container. */
vecResults = std::vector<ClassificationResult>(topNCount);
- /* For getting the floating point values, we need quantization parameters. */
- QuantParams quantParams = GetTensorQuantParams(tensor);
-
- /* Reset the iterator to the largest element - use reverse iterator. */
- auto setRevIter = sortedSet.rbegin();
-
- /* Populate results
- * Note: we could combine this loop with the loop above, but that
- * would, involve more multiplications and other operations.
- **/
- for (size_t i = 0; i < vecResults.size(); ++i, ++setRevIter) {
- double score = static_cast<int> (setRevIter->first);
- vecResults[i].m_normalisedVal = quantParams.scale *
- (score - quantParams.offset);
- vecResults[i].m_label = labels[setRevIter->second];
- vecResults[i].m_labelIdx = setRevIter->second;
- }
+ SetVectorResults<T>(sortedSet, vecResults, tensor, labels);
return true;
}
- template<>
- bool Classifier::_GetTopNResults<float>(TfLiteTensor* tensor,
- std::vector<ClassificationResult>& vecResults,
- uint32_t topNCount,
- const std::vector <std::string>& labels)
- {
- std::set<std::pair<float, uint32_t>> sortedSet;
+ template bool Classifier::GetTopNResults<uint8_t>(TfLiteTensor* tensor,
+ std::vector<ClassificationResult>& vecResults,
+ uint32_t topNCount, const std::vector <std::string>& labels);
- /* NOTE: inputVec's size verification against labels should be
- * checked by the calling/public function. */
- float* tensorData = tflite::GetTensorData<float>(tensor);
-
- /* Set initial elements. */
- for (uint32_t i = 0; i < topNCount; ++i) {
- sortedSet.insert({tensorData[i], i});
- }
-
- /* Initialise iterator. */
- auto setFwdIter = sortedSet.begin();
-
- /* Scan through the rest of elements with compare operations. */
- for (uint32_t i = topNCount; i < labels.size(); ++i) {
- if (setFwdIter->first < tensorData[i]) {
- sortedSet.erase(*setFwdIter);
- sortedSet.insert({tensorData[i], i});
- setFwdIter = sortedSet.begin();
- }
- }
-
- /* Final results' container. */
- vecResults = std::vector<ClassificationResult>(topNCount);
-
- /* Reset the iterator to the largest element - use reverse iterator. */
- auto setRevIter = sortedSet.rbegin();
-
- /* Populate results
- * Note: we could combine this loop with the loop above, but that
- * would, involve more multiplications and other operations.
- **/
- for (size_t i = 0; i < vecResults.size(); ++i, ++setRevIter) {
- vecResults[i].m_normalisedVal = setRevIter->first;
- vecResults[i].m_label = labels[setRevIter->second];
- vecResults[i].m_labelIdx = setRevIter->second;
- }
-
- return true;
- }
-
- template bool Classifier::_GetTopNResults<uint8_t>(TfLiteTensor* tensor,
- std::vector<ClassificationResult>& vecResults,
- uint32_t topNCount, const std::vector <std::string>& labels);
-
- template bool Classifier::_GetTopNResults<int8_t>(TfLiteTensor* tensor,
- std::vector<ClassificationResult>& vecResults,
- uint32_t topNCount, const std::vector <std::string>& labels);
+ template bool Classifier::GetTopNResults<int8_t>(TfLiteTensor* tensor,
+ std::vector<ClassificationResult>& vecResults,
+ uint32_t topNCount, const std::vector <std::string>& labels);
bool Classifier::GetClassificationResults(
TfLiteTensor* outputTensor,
@@ -158,6 +130,9 @@
} else if (totalOutputSize != labels.size()) {
printf_err("Output size doesn't match the labels' size\n");
return false;
+ } else if (topNCount == 0) {
+ printf_err("Top N results cannot be zero\n");
+ return false;
}
bool resultState;
@@ -166,13 +141,13 @@
/* Get the top N results. */
switch (outputTensor->type) {
case kTfLiteUInt8:
- resultState = _GetTopNResults<uint8_t>(outputTensor, vecResults, topNCount, labels);
+ resultState = GetTopNResults<uint8_t>(outputTensor, vecResults, topNCount, labels);
break;
case kTfLiteInt8:
- resultState = _GetTopNResults<int8_t>(outputTensor, vecResults, topNCount, labels);
+ resultState = GetTopNResults<int8_t>(outputTensor, vecResults, topNCount, labels);
break;
case kTfLiteFloat32:
- resultState = _GetTopNResults<float>(outputTensor, vecResults, topNCount, labels);
+ resultState = GetTopNResults<float>(outputTensor, vecResults, topNCount, labels);
break;
default:
printf_err("Tensor type %s not supported by classifier\n", TfLiteTypeGetName(outputTensor->type));
@@ -180,7 +155,7 @@
}
if (!resultState) {
- printf_err("Failed to get sorted set\n");
+ printf_err("Failed to get top N results set\n");
return false;
}