From 7a78d4a21467b3042ab98e2b5d4c4246983c480c Mon Sep 17 00:00:00 2001 From: Matt Hill Date: Sat, 4 Jul 2015 19:30:29 -0400 Subject: [PATCH] Removed unused confidence values and replaced with a disqualify boolean The disqualify reason is purely for debugging. This should help make it obvious why a plate candidate was rejected --- src/misc_utilities/benchmarks/benchmark.cpp | 2 +- src/openalpr/alpr_impl.cpp | 2 +- src/openalpr/edges/edgefinder.cpp | 2 -- src/openalpr/edges/edgefinder.h | 1 - src/openalpr/edges/platecorners.cpp | 13 +++++++---- src/openalpr/edges/platecorners.h | 2 -- src/openalpr/licenseplatecandidate.cpp | 6 ++--- src/openalpr/pipeline_data.cpp | 2 ++ src/openalpr/pipeline_data.h | 7 ++++-- .../textdetection/characteranalysis.cpp | 23 +++++++++++++++---- .../textdetection/characteranalysis.h | 2 -- 11 files changed, 38 insertions(+), 24 deletions(-) diff --git a/src/misc_utilities/benchmarks/benchmark.cpp b/src/misc_utilities/benchmarks/benchmark.cpp index 12fe6d5..94ff6e8 100644 --- a/src/misc_utilities/benchmarks/benchmark.cpp +++ b/src/misc_utilities/benchmarks/benchmark.cpp @@ -224,7 +224,7 @@ int main( int argc, const char** argv ) double analysisTime = diffclock(startTime, endTime); cout << "\tRegion " << z << ": Analysis time: " << analysisTime << "ms." << endl; - if (pipeline_data.plate_area_confidence > 10) + if (!pipeline_data.disqualified) { lpAnalysisPositiveTimes.push_back(analysisTime); diff --git a/src/openalpr/alpr_impl.cpp b/src/openalpr/alpr_impl.cpp index 6834dc0..0d334b6 100644 --- a/src/openalpr/alpr_impl.cpp +++ b/src/openalpr/alpr_impl.cpp @@ -152,7 +152,7 @@ namespace alpr lp.recognize(); bool plateDetected = false; - if (pipeline_data.plate_area_confidence > 10) + if (!pipeline_data.disqualified) { AlprPlateResult plateResult; plateResult.region = defaultRegion; diff --git a/src/openalpr/edges/edgefinder.cpp b/src/openalpr/edges/edgefinder.cpp index 8d5a70c..34b256a 100644 --- a/src/openalpr/edges/edgefinder.cpp +++ b/src/openalpr/edges/edgefinder.cpp @@ -31,7 +31,6 @@ namespace alpr this->pipeline_data = pipeline_data; // First re-crop the area from the original picture knowing the text position - this->confidence = 0; } @@ -128,7 +127,6 @@ namespace alpr PlateCorners cornerFinder(newCrop, &plateLines, pipeline_data, newLines); vector smallPlateCorners = cornerFinder.findPlateCorners(); - confidence = cornerFinder.confidence; // Transform the best corner points back to the original image std::vector imgArea; diff --git a/src/openalpr/edges/edgefinder.h b/src/openalpr/edges/edgefinder.h index 584b824..f832e8b 100644 --- a/src/openalpr/edges/edgefinder.h +++ b/src/openalpr/edges/edgefinder.h @@ -36,7 +36,6 @@ namespace alpr std::vector findEdgeCorners(); - float confidence; private: PipelineData* pipeline_data; diff --git a/src/openalpr/edges/platecorners.cpp b/src/openalpr/edges/platecorners.cpp index 7f6a6d0..24d50de 100644 --- a/src/openalpr/edges/platecorners.cpp +++ b/src/openalpr/edges/platecorners.cpp @@ -103,11 +103,16 @@ namespace alpr // Check if a left/right edge has been established. if (bestLeft.p1.x == 0 && bestLeft.p1.y == 0 && bestLeft.p2.x == 0 && bestLeft.p2.y == 0) - confidence = 0; + { + pipelineData->disqualified = true; + pipelineData->disqualify_reason = "platecorners did not find a left/right edge"; + } else if (bestTop.p1.x == 0 && bestTop.p1.y == 0 && bestTop.p2.x == 0 && bestTop.p2.y == 0) - confidence = 0; - else - confidence = 100; + { + pipelineData->disqualified = true; + pipelineData->disqualify_reason = "platecorners did not find a top/bottom edge"; + } + vector corners; corners.push_back(bestTop.intersection(bestLeft)); diff --git a/src/openalpr/edges/platecorners.h b/src/openalpr/edges/platecorners.h index 41a4c87..fe4d060 100644 --- a/src/openalpr/edges/platecorners.h +++ b/src/openalpr/edges/platecorners.h @@ -53,8 +53,6 @@ namespace alpr std::vector findPlateCorners(); - float confidence; - private: PipelineData* pipelineData; diff --git a/src/openalpr/licenseplatecandidate.cpp b/src/openalpr/licenseplatecandidate.cpp index eba4fe5..661f06b 100644 --- a/src/openalpr/licenseplatecandidate.cpp +++ b/src/openalpr/licenseplatecandidate.cpp @@ -46,7 +46,6 @@ namespace alpr { charSegmenter = NULL; - pipeline_data->plate_area_confidence = 0; pipeline_data->isMultiline = config->multiline; @@ -58,14 +57,14 @@ namespace alpr CharacterAnalysis textAnalysis(pipeline_data); - if (textAnalysis.confidence > 10) + if (!pipeline_data->disqualified) { EdgeFinder edgeFinder(pipeline_data); pipeline_data->plate_corners = edgeFinder.findEdgeCorners(); - if (edgeFinder.confidence > 0) + if (!pipeline_data->disqualified) { timespec startTime; @@ -120,7 +119,6 @@ namespace alpr charSegmenter = new CharacterSegmenter(pipeline_data); - pipeline_data->plate_area_confidence = 100; } } diff --git a/src/openalpr/pipeline_data.cpp b/src/openalpr/pipeline_data.cpp index 7d328c2..31d181e 100644 --- a/src/openalpr/pipeline_data.cpp +++ b/src/openalpr/pipeline_data.cpp @@ -48,5 +48,7 @@ namespace alpr this->config = config; this->region_confidence = 0; this->plate_inverted = false; + this->disqualified = false; + this->disqualify_reason = ""; } } diff --git a/src/openalpr/pipeline_data.h b/src/openalpr/pipeline_data.h index f8ca04a..9a42947 100644 --- a/src/openalpr/pipeline_data.h +++ b/src/openalpr/pipeline_data.h @@ -6,6 +6,7 @@ #include "utility.h" #include "config.h" #include "textdetection/textline.h" +#include "edges/scorekeeper.h" namespace alpr { @@ -47,8 +48,10 @@ namespace alpr std::string region_code; float region_confidence; - - float plate_area_confidence; + bool disqualified; + std::string disqualify_reason; + + ScoreKeeper confidence_weights; std::vector charRegions; diff --git a/src/openalpr/textdetection/characteranalysis.cpp b/src/openalpr/textdetection/characteranalysis.cpp index 06b0dfd..653ebb0 100644 --- a/src/openalpr/textdetection/characteranalysis.cpp +++ b/src/openalpr/textdetection/characteranalysis.cpp @@ -35,8 +35,6 @@ namespace alpr this->pipeline_data = pipeline_data; this->config = pipeline_data->config; - this->confidence = 0; - if (this->config->debugCharAnalysis) cout << "Starting CharacterAnalysis identification" << endl; @@ -129,7 +127,11 @@ namespace alpr cout << "Best fit score: " << bestFitScore << " Index: " << bestFitIndex << endl; if (bestFitScore <= 1) + { + pipeline_data->disqualified = true; + pipeline_data->disqualify_reason = "Low best fit score in characteranalysis"; return; + } //getColorMask(img, allContours, allHierarchy, charSegments); @@ -202,10 +204,21 @@ namespace alpr confidenceDrainers += 95; } - if (confidenceDrainers >= 100) - this->confidence=1; + if (confidenceDrainers >= 90) + { + pipeline_data->disqualified = true; + pipeline_data->disqualify_reason = "Low confidence in characteranalysis"; + } else - this->confidence = 100 - confidenceDrainers; + { + float confidence = 100 - confidenceDrainers; + pipeline_data->confidence_weights.setScore("CHARACTER_ANALYSIS_SCORE", confidence, 1.0); + } + } + else + { + pipeline_data->disqualified = true; + pipeline_data->disqualify_reason = "No text lines found in characteranalysis"; } if (config->debugTiming) diff --git a/src/openalpr/textdetection/characteranalysis.h b/src/openalpr/textdetection/characteranalysis.h index 146770e..043d5b8 100644 --- a/src/openalpr/textdetection/characteranalysis.h +++ b/src/openalpr/textdetection/characteranalysis.h @@ -39,8 +39,6 @@ namespace alpr CharacterAnalysis(PipelineData* pipeline_data); virtual ~CharacterAnalysis(); - int confidence; - cv::Mat bestThreshold; TextContours bestContours;