double calculatePixelAccuracy(const LabelImage& prediction, const LabelImage& groundTruth, const bool includeVoid, ConfusionMatrix* confusionMatrix) { size_t correct = 0; size_t wrong = 0; if (confusionMatrix) { LabelType numClasses = 0; for (int y = 0; y < groundTruth.getHeight(); ++y) { for (int x = 0; x < groundTruth.getWidth(); ++x) { numClasses = std::max(numClasses, groundTruth.getLabel(x, y)); } } numClasses++; if (confusionMatrix->getNumClasses() < numClasses) { confusionMatrix->resize(numClasses); confusionMatrix->reset(); } } for (int y = 0; y < prediction.getHeight(); ++y) { for (int x = 0; x < prediction.getWidth(); ++x) { const LabelType label = groundTruth.getLabel(x, y); if (!includeVoid && label == 0) { // skip void continue; } const LabelType predictedClass = prediction.getLabel(x, y); if (predictedClass == label) { correct++; } else { wrong++; } if (confusionMatrix) { confusionMatrix->increment(label, predictedClass); } } } size_t numPixels; if (includeVoid) { numPixels = prediction.getWidth() * prediction.getHeight(); } else { numPixels = correct + wrong; } return static_cast<double>(correct) / numPixels; }
double calculatePixelAccuracy(const LabelImage& prediction, const LabelImage& groundTruth, const bool includeVoid, const std::vector<LabelType>* ignoredLabels, ConfusionMatrix* confusionMatrix) { size_t correct = 0; size_t wrong = 0; if (confusionMatrix) { LabelType numClasses = 0; for (int y = 0; y < groundTruth.getHeight(); ++y) { for (int x = 0; x < groundTruth.getWidth(); ++x) { numClasses = std::max(numClasses, groundTruth.getLabel(x, y)); } } numClasses++; if (confusionMatrix->getNumClasses() < numClasses) { confusionMatrix->resize(numClasses); confusionMatrix->reset(); } } for (int y = 0; y < prediction.getHeight(); ++y) { for (int x = 0; x < prediction.getWidth(); ++x) { const LabelType label = groundTruth.getLabel(x, y); bool ignore = false; // assert(!includeVoid && ignoredLabels); if (!includeVoid && !ignoredLabels->empty()) for (LabelType ID: *ignoredLabels) if (ID == label) { ignore = true; break; } if (ignore) continue; const LabelType predictedClass = prediction.getLabel(x, y); if (predictedClass == label) { correct++; } else { wrong++; } if (confusionMatrix) { confusionMatrix->increment(label, predictedClass); } } } size_t numPixels; if (includeVoid) { numPixels = prediction.getWidth() * prediction.getHeight(); } else { numPixels = correct + wrong; } return static_cast<double>(correct) / numPixels; }