diff --git a/modules/dnn/src/layers/detection_output_layer.cpp b/modules/dnn/src/layers/detection_output_layer.cpp index 665f338590..4bf05b5969 100644 --- a/modules/dnn/src/layers/detection_output_layer.cpp +++ b/modules/dnn/src/layers/detection_output_layer.cpp @@ -219,7 +219,7 @@ public: _shareLocation, &allLocationPredictions); // Retrieve all confidences. - std::vector > > allConfidenceScores; + std::vector > > allConfidenceScores; GetConfidenceScores(confidenceData, num, numPriors, _numClasses, &allConfidenceScores); @@ -241,7 +241,7 @@ public: for (int i = 0; i < num; ++i) { const LabelBBox& decodeBBoxes = allDecodedBBoxes[i]; - const std::map >& confidenceScores = + const std::vector >& confidenceScores = allConfidenceScores[i]; std::map > indices; int numDetections = 0; @@ -252,13 +252,13 @@ public: // Ignore background class. continue; } - if (confidenceScores.find(c) == confidenceScores.end()) + if (confidenceScores.size() <= c) { // Something bad happened if there are no predictions for current label. util::make_error("Could not find confidence predictions for label ", c); } - const std::vector& scores = confidenceScores.find(c)->second; + const std::vector& scores = confidenceScores[c]; int label = _shareLocation ? -1 : c; if (decodeBBoxes.find(label) == decodeBBoxes.end()) { @@ -280,13 +280,13 @@ public: { int label = it->first; const std::vector& labelIndices = it->second; - if (confidenceScores.find(label) == confidenceScores.end()) + if (confidenceScores.size() <= label) { // Something bad happened for current label. util::make_error("Could not find location predictions for label ", label); continue; } - const std::vector& scores = confidenceScores.find(label)->second; + const std::vector& scores = confidenceScores[label]; for (size_t j = 0; j < labelIndices.size(); ++j) { size_t idx = labelIndices[j]; @@ -329,20 +329,20 @@ public: int count = 0; for (int i = 0; i < num; ++i) { - const std::map >& confidenceScores = + const std::vector >& confidenceScores = allConfidenceScores[i]; const LabelBBox& decodeBBoxes = allDecodedBBoxes[i]; for (std::map >::iterator it = allIndices[i].begin(); it != allIndices[i].end(); ++it) { int label = it->first; - if (confidenceScores.find(label) == confidenceScores.end()) + if (confidenceScores.size() <= label) { // Something bad happened if there are no predictions for current label. util::make_error("Could not find confidence predictions for label ", label); continue; } - const std::vector& scores = confidenceScores.find(label)->second; + const std::vector& scores = confidenceScores[label]; int locLabel = _shareLocation ? -1 : label; if (decodeBBoxes.find(locLabel) == decodeBBoxes.end()) { @@ -642,13 +642,14 @@ public: // confidence prediction for an image. void GetConfidenceScores(const float* confData, const int num, const int numPredsPerClass, const int numClasses, - std::vector > >* confPreds) + std::vector > >* confPreds) { confPreds->clear(); confPreds->resize(num); for (int i = 0; i < num; ++i) { - std::map >& labelScores = (*confPreds)[i]; + std::vector >& labelScores = (*confPreds)[i]; + labelScores.resize(numClasses); for (int p = 0; p < numPredsPerClass; ++p) { int startIdx = p * numClasses; diff --git a/modules/dnn/src/layers/softmax_layer.cpp b/modules/dnn/src/layers/softmax_layer.cpp index 473e31a55e..cc933956c4 100644 --- a/modules/dnn/src/layers/softmax_layer.cpp +++ b/modules/dnn/src/layers/softmax_layer.cpp @@ -124,8 +124,9 @@ public: for (size_t cnDim = 0; cnDim < channels; cnDim++) { + const int offset = srcOffset + cnDim * cnStep; for (size_t i = 0; i < innerSize; i++) - dstPtr[srcOffset + cnDim * cnStep + i] = srcPtr[srcOffset + cnDim * cnStep + i] - bufPtr[bufOffset + i]; + dstPtr[offset + i] = srcPtr[offset + i] - bufPtr[bufOffset + i]; } } @@ -142,22 +143,25 @@ public: for (size_t cnDim = 0; cnDim < channels; cnDim++) { + const int offset = srcOffset + cnDim * cnStep; for (size_t i = 0; i < innerSize; i++) - bufPtr[bufOffset + i] += dstPtr[srcOffset + cnDim * cnStep + i]; + bufPtr[bufOffset + i] += dstPtr[offset + i]; } //divide by computed sum for (size_t cnDim = 0; cnDim < channels; cnDim++) { + const int offset = srcOffset + cnDim * cnStep; for (size_t i = 0; i < innerSize; i++) - dstPtr[srcOffset + cnDim * cnStep + i] /= bufPtr[bufOffset + i]; + dstPtr[offset + i] /= bufPtr[bufOffset + i]; } if (logSoftMax) { for (size_t cnDim = 0; cnDim < channels; cnDim++) { + const int offset = srcOffset + cnDim * cnStep; for (size_t i = 0; i < innerSize; i++) - dstPtr[srcOffset + cnDim * cnStep + i] = log(dstPtr[srcOffset + cnDim * cnStep + i]); + dstPtr[offset + i] = log(dstPtr[offset + i]); } } }