인턴/LPR(번호판 인식)

[Doubango/ultimateALPR/Docs] Improving the accuracy 번역

용성군 2021. 8. 25. 20:25
728x90
반응형

정확도 향상

Github에서 제공하는 코드는 모두가 거의 만족할 만한 기본 옵션과 함께 제공됩니다. 사용 사례에 맞게 정확도를 높이고 싶을 수 있습니다.

Detector

이 섹션에서는 detection 계층의 정확도를 높이는 방법에 대해 설명합니다.

 

멀리 떨어져 있거나 매우 작은 번호판

이 섹션에서는 매우 작거나 멀리 떨어진 플레이트에서 정확도를 향상시키는 방법을 설명합니다.

관심 영역(Region of Interest)

이전 섹션에서 설명한 대로 감지기는 300x300 이미지를 입력으로 예상합니다. 입력 크기에 관계없이 감지기는 항상 300x300으로 축소하고 RGB_888로 변환합니다.

번호판이 멀리 있거나 매우 작고 이미지가 너무 큰 경우 300x300으로 축소하면 이러한 번호판이 거의 사라집니다.

다음 1280x720 이미지를 살펴보겠습니다.

1280x720 image with far away plate

Renault 및 Mercedes-Benz의 번호판은 올바르게 감지되지만 폭스바겐(VW)의 번호판은 감지되지 않습니다. 문제는 폭스바겐의 번호판이 이미지 크기에 비해 멀거나 상대적으로 작다는 점이다. 이미지의 크기를 300x300으로 조정하고 CNN이 입력으로 무엇을 가지고 있는지 살펴보겠습니다.

1280x720 image with far away plate resized at 300x300


우리는 300x300 사이즈 이미지에서 VW의 번호판이 감지되지 않는다는 것을 분명히 알 수 있습니다. 실제로 문제는 플레이트가 픽셀 측면에서 작은 것이 아니라 이미지 크기에 대한 백분율과 관계되어진다는 것입니다. 이 문제를 해결하려면 관심 영역(ROI 정의 방법에 대한 configuration section 참조)을 선택하여 번호판 크기를 백분율로 높입니다. 1100x333 ROI를 가정해 보겠습니다.

1280x720 image with far away plate with 1100x300 ROI


1100x333 ROI는 번호판을 가지고 있고 다른 것(하늘, 건물...)은 무시할 것으로 예상되는 영역을 정의합니다. ROI(Region of Interest)로 잘라보도록하겠습니다.

 

1100x300 ROI cropped from 1280x720 image

 


자른 ROI의 크기를 300x300으로 조정해 보겠습니다.

 

1100x300 ROI cropped from 1280x720 image and resized at 300x300


이제 VW의 번호판이 깨끗하고 안정적으로 감지될 수 있음을 알 수 있습니다.

 


또 다른 솔루션은 전체 이미지 크기에 비해 크게 해서, 항상 동작하는 자동차를 먼저 감지하는 것입니다.

 


그런 다음 자동차 크기를 300x300으로 조정하고 번호판을 감지합니다.

Car detection resized at 300x300

이 섹션에 설명된 모든 단계는 ROI를 정의할 때 SDK에서 자동으로 수행됩니다. 입력 이미지를 자르거나 크기를 조정하기 위해 한 줄의 코드를 작성할 필요가 없습니다.

모든 크기의 번호판을 감지하는 또 다른 우아한 방법은 피라미드 검색을 활성화하는 것입니다. 자세한 내용은 다음 섹션을 참조하십시오.


피라미드 검색

이 기능은 버전 2.4에 추가되었으며 큰 이미지에서 작거나 멀리 떨어진 판을 감지하는 데 권장되는 방법입니다.

비디오 해상도가 720p 이상인 경우 피라미드 검색을 활성화하는 것이 좋습니다.

피라미드 검색에 대한 추가 정보는 여기에서 찾을 수 있습니다.

구성 항목(Configuration entry):pyramidal_search_enabled.

 

 

16:9 또는 4:3 해상도 선호

훈련 데이터에 있는 대부분의 이미지는 크기가 720p(1280 x 720)입니다. 이미 설명했듯이 입력 이미지는 신경망에 공급하기 전에 항상 300x300 크기로 변환됩니다. 너비가 높이보다 큰 이미지를 사용하는 것이 좋습니다. 예를 들어 세로 모드 대신 가로 모드를 선호합니다.

골든 넘버

피라미드 검색이 활성화되면 1.0과 같은 감도 값(sensitivity value)은 detection 정확도를 크게 향상시키기 위해 가능한 최상의 옵션을 선택하기 위해 일부 구성 값을 무시하므로 황금 숫자입니다.

버전 3.1.0까지 이 기능은 x86-64 CPU에서만 사용할 수 있었습니다. 3.2.0부터 이 기능은 모든 CPU에서 사용할 수 있습니다.

구성 항목:pyramidal_search_sensitivity.

탐지 점수 임계값

옵션 섹션(configuration section)에서는 최소 탐지 점수(minimum detection score)를 설정하는 방법을 설명합니다.

  • false-positive가 너무 많으면, 탐지 점수를 높여 정확도를 높이십시오.
  • false-negative가 너무 많으면, 회수율을 높이기위해서 탐지 점수를 낮추십시오.

훈련 데이터 매칭

탐지를 위한 훈련 데이터는 주로 자동차에 장착된 번호판을 포함합니다. 번호판만 있는 이미지는 거의 없습니다. 감지 정확도를 높이려면 번호판과 자동차를 모두 보여주는 이미지를 제공해야 합니다.

예를 들어 다음 이미지에서 번호판을 감지하는 것은 가능한 가장 높은 정확도(99.99%)로 수행됩니다.


다음 이미지에서 번호판을 감지하는 동안 정확도가 매우 낮거나 실패할 수도 있습니다.

plate alone


훈련 데이터에는 주로 번호판과 자동차를 모두 보여주는 이미지가 포함되어 있고 번호판만 가진 이미지는 거의 없다는 사실은 의도적으로 수행된 것입니다. 야외 장면을 촬영할 때 번호판(내부에 일반 텍스트가 있는 테두리)과 매우 유사한 교통 표지판이나 광고판이 많이 있습니다. 자동차를 전제 조건으로 추가하면 오탐을 방지하는 데 도움이 됩니다. SDK가 올바르게 구성되면 fase-positive는 거의 나타나지 않습니다.

 


야간 투시경(IENV)을 위한 이미지 향상 [감지]

IENV를 활성화하면 대비가 낮은 이미지의 정확도가 향상됩니다.

옵션 항목: ienv_enabled.


번호판 국가 식별(LPCI)

여기에는 비밀이 없습니다. 번호판이 비뚤어지거나 기울어지지 않고 충분히 큰지 확인하십시오.

번호판 국가 식별(LPCI)에 대한 자세한 정보는 여기에서 찾을 수 있습니다.


차량 색상 인식(VCR)

이 기능은 화질에 매우 민감합니다.
차량 색상 인식(VCR)에 대한 자세한 내용은 여기에서 확인할 수 있습니다.

퓨즈

SDK는 흰색, 은색, 회색 및 기타 여러 색상을 지원하지만 LightSilver 및 DarkSilver는 지원하지 않습니다.

상위 #1 결과에 대한 신뢰도 점수가 특정 임계값(80% 권장) 미만인 경우 상위 #2를 결합하여 새로운 색상을 형성할 수 있습니다.

  1. Top #2가 "White, Silver"이고 신뢰 점수의 합이 특정 임계값보다 높을 때 색상을 LightSilver로 가정할 수 있습니다.
  2. Top #2가 "Gray, Silver"이고 신뢰 점수의 합이 특정 임계값보다 높을 때 색상을 DarkSilver로 가정할 수 있습니다.


Java 코드는 다음과 같습니다.

final AlprUtils.Car.Color colorObj0 = car.getColors().get(0);
if (colorObj0.getConfidence() >= 80) {
    color = colorObj0.getName();
}
else if (car.getColors().size() >= 2) {
    final AlprUtils.Car.Color colorObj1 = car.getColors().get(1);
    final String colorMix = colorObj0.getName() + "/" + colorObj1.getName();
    float confidence = colorObj0.getConfidence();
    if ("white/silver,silver/white,gray/silver,silver/gray".indexOf(colorMix) != -1) {
        confidence += colorObj1.getConfidence();
    }
    if (confidence >= 80) {
        color = (colorMix.indexOf("white") == -1) ? "DarkSilver" : "LightSilver";
    }
}

 

감마 보정

감마 계수(1/G)는 VCR 분류를 적용하기 전에 차량 색상을 향상시키는 데 사용됩니다. 이 값은 JSON 구성 항목 klass_vcr_gamma를 사용하여 정의됩니다. 감마 보정에 대한 자세한 내용은 https://en.wikipedia.org/wiki/Gamma_correction에서 찾을 수 있습니다.

  • 1.0f보다 높은 값은 더 밝음을 의미하고 1.0f보다 낮은 값은 더 어두운 것을 의미합니다.
  • 1.0f와 같은 값은 바이패스 감마 보정 작업을 의미합니다.

기본값은 1.5f와 같습니다.

야간 투시경(IENV)을 위한 이미지 향상 [VCR]

IENV를 활성화하면 대비가 낮은 이미지의 정확도가 향상됩니다.

옵션 항목: ienv_enabled.

 

차량 제조사 모델 인식(VMMR)

VMMR 함수는 분류를 사용하고 상위 5개를 반환합니다. 데이터 세트에는 15,000개 이상의 모델이 포함되어 있습니다.

이미지에서 제조사, 모델 및 연도를 정확하게 아는 것은 두 모델이 비슷할 때 매우 어렵습니다. 예를 들어 Mercedes-Benz Class C Year 2013과 Mercedes-Benz Class C Year 2011 간의 차이점을 찾는 것은 매우 어렵습니다. 이 두 모델은 아마도 상위 5위 안에 들 것이며 어느 것이 맞는지 선택하기 어렵습니다. 올바른 모델을 선택하는 데 도움을 주기 위해 퓨즈 및 디퓨즈 기술을 사용합니다.

퓨즈 및 디퓨즈

퓨즈 및 디퓨즈 기술이 필요한 이유를 위에서 참조하십시오.

다음 이미지로 시도한다고 가정해 보겠습니다.


VCR 분류기의 다음 상위 5개 결과가 표시됩니다.



15,000개 이상의 모델을 지원하지만 상위 5개만 반환하며 모든 점수의 합은 항상 100%입니다.

상위 1위 결과("renault, clio, 2012")를 확인하면 신뢰도가 낮은(45.00%) 것을 알 수 있습니다. 그러나 상위 5개 결과를 확인하면 제조사가 분명히 "르노"이고 모델이 "클리오"라는 것을 알 수 있습니다. 따라서 상위 1위의 점수를 올리기 위해서는 퓨즈와 디퓨즈 기법이 필요하다.

b이 상위 5개 결과에 적용된 후 다음을 얻게 됩니다.


이제 우리는 제조사(82.94%)와 모델(81.80%)이 높은 점수로 예측되었음을 분명히 알 수 있습니다.  그 년도의 경우 상위 1위(2012)와 동일하다고 가정할 수 있습니다.

퓨즈 및 디퓨즈 기술 구현 방법에 대한 자세한 내용은 소스를 확인하십시오.

C++에서 코드는 다음과 같습니다.

std::map<std::string, float> makes;
std::map<std::string, int> occurrences;
// Fuse makes
for (const auto& it : resultsVMMR) {
        makes[it.make] += it.score;
        occurrences[it.make] += 1;
}
// Find make with highest confidence
auto bestMake = std::max_element(makes.begin(), makes.end(), [](const std::pair<std::string, float>& p1, const std::pair<std::string, float>& p2) {
        return p1.second < p2.second;
});
// Model fusion
if (bestMake->second >= VMMR_MIN_CONFIDENCE || (occurrences[bestMake->first] >= VMMR_FUSE_DEFUSE_MIN_OCCURRENCES && bestMake->second >= VMMR_FUSE_DEFUSE_MIN_CONFIDENCE)) {
        make = bestMake->first;

        // Fuse models
        std::map<std::string, float> models;
        for (const auto& it : resultsVMMR) {
                if (make == it.make) {
                        models[it.model] += it.score;
                }
        }
        // Find model with highest confidence
        auto bestModel = std::max_element(models.begin(), models.end(), [](const std::pair<std::string, float>& p1, const std::pair<std::string, float>& p2) {
                return p1.second < p2.second;
        });
        model = bestModel->first;
}

야간 투시경(IENV)을 위한 이미지 향상[VMMR]
IENV를 활성화하면 대비가 낮은 이미지의 정확도가 향상됩니다.

구성 항목: ienv_enabled.


번호판 인식(LPR)

이 섹션에서는 인식기 레이어의 정확도를 높이는 방법을 설명합니다.

수정층(rectification layer) 추가

번호판이 심하게 왜곡된 경우(비뚤어지거나 기울어진 경우) 왜곡을 제거하기 위해 수정 레이어(rectification layer)를 활성화해야 합니다. 구성 섹션에서는 수정 레이어를 활성화하는 방법을 설명합니다.

이 기능에 대한 자세한 내용은 rectification 섹션을 확인하세요.

인식 점수 임계값

configuration 섹션에서는 최소 인식 점수를 설정하는 방법을 설명합니다.

  • false-positive가 너무 많으면 탐지 점수를 높여 정확도를 높이십시오.
  • false-negative가 너무 많으면 회수율을 높이기위해 탐지 점수를 낮추십시오.

 

제한 점수 유형

configuration 섹션에서는 지원되는 다양한 점수 유형("min", "mean", "median", "max" 및 "minmax")에 대해 설명합니다.

  • "min" 점수 유형은 번호판의 모든 문자가 최소한 최소 목표 점수를 갖도록 하기 때문에 더 제한적입니다.
  • "max" 점수 유형은 번호판에 있는 문자 중 하나 이상이 최소 목표 점수를 갖도록 보장하므로 덜 제한적인 유형입니다.
  • "median" 점수 유형은 "min" 유형과 "max" 유형 간의 적절한 절충안입니다.


"min" 점수 유형을 사용하는 것이 좋습니다. 점수 유형을 설정하는 방법에 대한 자세한 내용은 configuration 섹션을 참조하세요.


야간 투시경(IENV)을 위한 이미지 향상 [LPR]

IENV를 활성화하면 대비가 낮은 이미지의 정확도가 향상됩니다.

구성 항목: ienv_enabled.

728x90
반응형