Faster Character Based OCR DL

1 개요

Faster Character Based OCR은 문자 단위로 문자열을 인식하는 딥러닝 알고리즘입니다. Semantic Segmenation 기반 모델로 Character Based OCR 보다 더 빠른 속도로 문자를 추론합니다.

Source Image Result Image
Source Result

문자 단위로 라벨링을 하여 학습합니다. 다른 딥러닝 모델과는 달리 라벨에 클래스 번호를 추가하지 않고 문자를 클래스이름으로 사용합니다.

2 Faster Character Based OCR 사용 방법

1 데이터 셋 준비

  1. Figure를 이용하여 라벨링이 된 Flif 형식의 학습 이미지

    • 이미지에 Figure를 삽입하여 학습 이미지를 생성할 수 있습니다. Figure에는 반드시 이름이 들어가야 하며 "문자 이름" 형식이여야 합니다.
    • FLImaging에서 지원하는 모든 형식의 Figure로 라벨링할 수 있습니다. (라벨링 방법)


    DataSet(With Figure)

    Fig. 이미지의 이름이 있는 Figure를 삽입하여 만든 학습 데이터 샘플입니다.

2.2 학습

2.2.1. 학습 이미지 설정
2.2.2. 검증 이미지 설정(선택)
  1. 검증 지표
    1. Pixel Accuracy
      1. 픽셀 정확도입니다. 각 픽셀별로 클래스의 정답 유무로 계산합니다.
      2. 계산 수식
        1. 맞춘 픽셀 개수 / 총 픽셀 개수
      3. 범위는 0~1이며 1로 갈수록 높은 성능을 의미합니다.
    2. Pixel Accuracy(Zero Exeception)
      1. 0번 클래스를 제외하고 Pixel Accuracy를 계산한 지표 값입니다. 0번은 배경에 대한 클래스 번호입니다.
    3. mean IoU
      1. IoU의 평균입니다. Semgentation에서 주로 사용되는 지표입니다. 클래스 별로 IoU를 구하고 평균을 구합니다.
      2. 예측 영역 ∩ 실제 영역 / 예측 영역 ∪ 실제 영역
        IoU
      3. 범위는 0~1이며 1로 갈수록 높은 성능을 의미합니다.
    4. mean IoU(ZE)
      1. 0번 클래스를 제외하고 mIoU를 계산한 지표 값입니다. 0번은 배경에 대한 클래스 번호입니다.
2.2.3. 모델 설정
2.2.4. 옵티 마이저 설정
2.2.5. Augmentation 설정(선택)
2.2.6. 학습 수행
  1. Faster Character Based OCR 의 경우 의 경우 모든 픽셀에 대해 맞춰야 하므로 mIoU(ZE)가 1이 나오기는 어렵습니다.
  2. Faster Character Based OCR 의 경우 종료 조건은 mIoU(ZE) 0.95 정도로 설정 하는 게 적절합니다.
  3. 추천 종료 조건
    1. mIoU(ZE) >= 0.95
2.2.7. 조건 식
  1. 종료 조건(Stop Condition) & 자동 저장(Auto Save)에서 사용 가능한 조건 식 입니다.
  2. Common Conditional Expression
  3. Faster Character Based OCR Conditonal Expression
    변수명 설명 Stop Condition 예시 Auto Save 예시
    mIoU 클래스별 IoU의 평균 지표입니다. 0 ~ 1 범위를 가지며 1로 갈수록 좋은 결과를 나타냅니다. cost <= 0.3 & mIoU >= 1 epoch >= 10 & mIoU >= max('mIoU') & mIoU > 0
    mIoU.ZE 클래스별 IoU의 평균 지표입니다. 0 ~ 1 범위를 가지며 1로 갈수록 좋은 결과를 나타냅니다. ZE는 Zero Exception의 약자로 배경클래스인 0번을 제외하고 계산합니다. 배경이 중요하지 않은 경우 사용합니다. cost <= 0.3 & mIoU.ZE >= 1 epoch >= 10 & mIoU.ZE >= max('mIoU.ZE') & mIoU.ZE > 0
    accuracy 정확도입니다. 맞춘 픽셀 개수 / 총 픽셀 개수로 계산 되어집니다. 0 ~ 1 범위를 가지며 1로 갈수록 좋은 결과를 나타냅니다. cost <= 0.3 & accuracy >= 1 epoch >= 10 & accuracy >= max('accuracy') & accuracy > 0
    accuracy.ze 정확도입니다. 맞춘 픽셀 개수 / 총 픽셀 개수로 계산 되어집니다. 0 ~ 1 범위를 가지며 1로 갈수록 좋은 결과를 나타냅니다. ZE는 Zero Exception의 약자로 배경클래스인 0번을 제외하고 계산합니다. 배경이 중요하지 않은 경우 사용합니다. cost <= 0.3 & accuracy.ze >= 1 epoch >= 10 & accuracy.ze >= max('accuracy.ze') & accuracy.ze > 0
    metric miou가 metric 사용됩니다. cost <= 0 | metric >= 1 epoch >= 10 & metric >= max('metric') & metric > 0
    metric.ze miou.ze가 metric.ze으로 사용됩니다. cost <= 0 | metric.ze >= 1 epoch >= 10 & metric.ze >= max('metric.ze') & metric.ze > 0
    validation accuracy가 validation으로 사용됩니다. cost <= 0 | validation >= 1 epoch >= 10 & validation >= max('validation') & validation > 0
    validation.ze accuracy.ze가 validation.ze으로 사용됩니다. cost <= 0 | validation.ze >= 1 epoch >= 10 & validation.ze >= max('validation.ze') & validation.ze > 0
  4. GUI 에서 설정 방법
    1. 종료 조건 식 설정
      1. cost <= 0 | validation >= 1 | metric >= 1 | validation.ze >= 1 | metric.ze >= 1
        Graph View Result

        Fig. GUI에서 종료 조건 설정
    2. 자동 저장 조건 식설정
      1. epoch >= 10 && (metric > max('metric') || metric.ze > max('metric.ze'))
        Graph View Result

        Fig. GUI에서 자동 저장 조건 설정

2.3 추론

  1. 추론 이미지 & 결과 이미지 설정
  2. 추론 수행
  3. 추론 결과 옵션 설정

2.4 Save/Load

  1. Save/Load
    • 모델파일을 저장하거나 불러옵니다.
    • 확장자는 .flfocrdl입니다.

3 필수 옵션

3.1 학습 필수 옵션

  1. Learn 이미지 설정

  2. 모델 설정

    • 지원 모델

      • FL Seg Net(V1 128 B1~B4/V1 256 B1~B4/V1 512 B1~B4/V1 512 B1~B4)
        • 포스로직만의 효율적인 최신 AI 모델 설계 구조를 바탕으로 구현된 빠른 속도, 정밀한 결과 및 낮은 메모리 사용을 갖춘 최고의 이미지 탐지 모델입니다.
        • 추천 버전은 V1 512 B3입니다.
    • API

      • SetModelVersion(EModelVersion eModelVersion = EModelVersion_FLSegNet_V1_512_B3)
        • eModelVersion : 학습에 사용할 모델의 버전을 설정합니다.
    • 예제 코드

      CResult res;
      CFasterCharacterBasedOCRDL ocrDL;
      
      if((res = ocrDL.SetModelVersion(CFasterCharacterBasedOCRDL::EModelVersion_FLSegNet_V1_512_B3)).IsFail())
          return;
      
      CResult res = new CResult();
      CFasterCharacterBasedOCRDL ocrDL = new CFasterCharacterBasedOCRDL();
      
      if((res = ocrDL.SetModelVersion(CFasterCharacterBasedOCRDL.EModelVersion.FLSegNet_V1_512_B3)).IsFail())
          return;
      
      res = CResult()
      ocrDL = CFasterCharacterBasedOCRDL()
      
      if (res := ocrDL.SetModelVersion(CFasterCharacterBasedOCRDL.EModelVersion.FLSegNet_V1_512_B3)).IsFail():
          return
      
    • GUI에서 설정 방법


    Seg_ModelSelect

    Fig. GUI에서 사용할 모델을 설정하는 Dropdown List


    Seg_ModelSelect
    Fig. GUI에서 사용한 모델 확인(학습 현황 다이얼로그)

3.2 추론 필수 옵션

  1. Inference & Inference Result Image 설정

4 선택 옵션

4.1 학습 선택 옵션

  1. 검증 이미지 설정
    • 검증 이미지를 설정합니다. 검증 이미지는 라벨링이 되어있어야 합니다. 검증지표는 mIoU.ze입니다.
  2. 검증 옵션 설정
    • 검증 옵션을 설정합니다.

    • API

    • 예제 코드

      CFasterCharacterBasedOCRDL ocrDL;
      
      if(ocrDL.SetLearningValidationStep(5).IsFail())
          return;
      
      CFasterCharacterBasedOCRDL ocrDL = new CFasterCharacterBasedOCRDL();
      
      if(ocrDL.SetLearningValidationStep(5).IsFail())
          return;
      
      ocrDL = CFasterCharacterBasedOCRDL()
      
      if ocrDL.SetLearningValidationStep(5).IsFail():
          return
      
  3. 옵티 마이저 설정
  4. Augmentation 설정
  5. 타일링 설정
  6. 이미지 전처리 설정
  7. 종료 조건 설정
  8. 자동 저장 조건 설정
  9. Class Equalization 설정
  10. Optimal Learning State Preservation 설정
  11. Pretrained Model 사용

4.2 추론 선택 옵션

  1. 추론 결과 옵션 설정

    • 추론 결과 옵션을 설정합니다. Contour로 받을 수 있으며 스코어 포함여부를 정할 수 있습니다.

    • 추론 결과는 설정 된 Result Image에 Figure로 출력 되게됩니다.

    • API

      • EnableInferenceResultStringMode(bool bEnable)
        • 기본값은 true이며 출력 결과를 String단위로 얻어옵니다.
        • false로 설정 시 문자 단위로 얻어옵니다.
      • SetInferenceResultItemSettings(CSemanticSegmentationDL::EInferenceResultItemSettings eSetting)
        • 출력 정보로는 Confidence Score, Contour를 선택할 수 있습니다.
      • SetInferenceMinimumConfidenceScore(double f64MinConfidenceScore = .5)
        • 추론 결과를 출력할 최소 점수를 설정합니다.
        • ConfidenceMapCreated가 활성화 되어있어야 합니다.
    • 예제 코드

      CFasterCharacterBasedOCRDL ocrDL;
      
      // 출력 결과를 String으로 출력하도록 설정
      if(ocrDL.EnableInferenceResultStringMode(true).IsFail())
          return;
      
      // Score, 영역으로 출력되도록 설정
      if(ocrDL.SetInferenceResultItemSettings(CSemanticSegmentationDL::EInferenceResultItemSettings_ConfidenceScore_RegionType_Contour).IsFail())
          return;
      
      // Minimum Confidence Score 설정 
      if(ocrDL.SetInferenceMinimumConfidenceScore(.5).IsFail())
          break;
      
      CFasterCharacterBasedOCRDL ocrDL = new CFasterCharacterBasedOCRDL();
      
      // 출력 결과를 String으로 출력하도록 설정
      if(ocrDL.EnableInferenceResultStringMode(true).IsFail())
          return;
      
      // Score, 영역으로 출력되도록 설정
      if(ocrDL.SetInferenceResultItemSettings(CSemanticSegmentationDL.EInferenceResultItemSettings.ConfidenceScore_RegionType_Contour).IsFail())
          return;
      
      // Minimum Confidence Score 설정 
      if(ocrDL.SetInferenceMinimumConfidenceScore(0.5).IsFail())
          return;
      
      ocrDL = CFasterCharacterBasedOCRDL()
      
      # 출력 결과를 String으로 출력하도록 설정
      if ocrDL.EnableInferenceResultStringMode(True).IsFail():
          return
      
      # Score, 영역으로 출력되도록 설정
      if ocrDL.SetInferenceResultItemSettings(CSemanticSegmentationDL.EInferenceResultItemSettings.ConfidenceScore_RegionType_Contour).IsFail():
          return
      
      # Minimum Confidence Score 설정 
      if ocrDL.SetInferenceMinimumConfidenceScore(0.5).IsFail():
          return
      
  2. 배치 프로세싱 설정

5 결과 출력

  1. Inference 결과 출력
  2. 학습 정보
    • 학습 중 또는 학습이 완료된 마지막 결과를 얻어옵니다.

    • API

      • GetLearningResultLastAccuracy()
        • 마지막 픽셀 정확도 결과
      • GetLearningResultLastMeanIoU()
        • 마지막 mIoU(검증 Metric) 결과
      • GetLearningResultLastMeanIoUZE()
        • 배경을 제외한 마지막 mIoU 결과
      • GetLearningResultMaximumAccuracy()
        • 마지막 최대 픽셀 정확도 결과
      • GetLearningResultMaximumMeanIoU()
        • 마지막 최대 mIoU 결과
      • GetLearningResultMaximumAccuracyCumulativeEpoch()
        • 마지막 최대 정확도의 Epoch
      • GetLearningResultMaximumMeanIoUCumulativeEpoch()
        • 마지막 최대 mIoU의 Epoch
      • GetLearningResultMaximumMeanIoUCumulativeEpochZE()
        • 배경을 제외한 마지막 최대 mIoU의 Epoch
      • GetLearningResultAllHistory(Base::CFLArray<float>&, Base::CFLArray<float>&, Base::CFLArray<float>&, Base::CFLArray<float>&, Base::CFLArray<float>&, Base::CFLArray<int32_t>&)
        • 마지막 학습의 모든 결과
        • Cost, Accuracy, mIoU, ZE Accuracy, ZE mIoU, Validation Epoch
    • 예제 코드

      CFasterCharacterBasedOCRDL ocrDL;
      int32_t i32ResultClassCount;
      Base::CFLArray<Base::CFLString<wchar_t>> flaClassNames;
      float f32ResultLastAccuracy;
      float f32ResultLastAccuracyZE;
      float f32ResultLastMeanIOU;
      float f32ResultLastMeanIOUZE;
      float f32ResultMaximumAccuracy;
      float f32ResultMaximumAccuracyZE;
      float f32ResultMaximumMeanIoU;
      float f32ResultMaximumMeanIoUZE;
      int32_t i32ResultMaximumAccuracyCumulativeEpoch;
      int32_t i32ResultMaximumMeanIoUCumulativeEpochZE;
      Base::CFLArray<float> flaMeanIoUHistory;
      Base::CFLArray<float> flaMeanIoUZEHistory;
      Base::CFLArray<float> flaCostHistory;
      Base::CFLArray<float> flaValidationHistory;
      Base::CFLArray<float> flaValidationZEHistory;
      Base::CFLArray<int32_t> flaValidationEpochHistory;
      
      if(ocrDL.GetLearningResultClassNames(0, flaClassNames).IsFail())
      	break;
      
      i32ResultClassCount = ocrDL.GetLearningResultClassCount();
      
      f32ResultLastAccuracy = ocrDL.GetLearningResultLastAccuracy();
      f32ResultLastAccuracyZE = ocrDL.GetLearningResultLastAccuracyZE();
      
      f32ResultLastMeanIOU = ocrDL.GetLearningResultLastMeanIoU();
      f32ResultLastMeanIOUZE = ocrDL.GetLearningResultLastMeanIoUZE();
      
      f32ResultMaximumAccuracy = ocrDL.GetLearningResultMaximumAccuracy();
      f32ResultMaximumAccuracyZE = ocrDL.GetLearningResultMaximumAccuracy();
      
      f32ResultMaximumMeanIoU = ocrDL.GetLearningResultMaximumMeanIoU();
      f32ResultMaximumMeanIoUZE = ocrDL.GetLearningResultMaximumMeanIoUZE();
      
      i32ResultMaximumAccuracyCumulativeEpoch = ocrDL.GetLearningResultMaximumAccuracyCumulativeEpoch();
      
      i32ResultMaximumMeanIoUCumulativeEpochZE = ocrDL.GetLearningResultMaximumMeanIoUCumulativeEpochZE();
      
      if(ocrDL.GetLearningResultMeanIoUHistory(flaMeanIoUHistory).IsFail())
      	break;
      
      if(ocrDL.GetLearningResultMeanIoUZEHistory(flaMeanIoUZEHistory).IsFail())
      	break;
      
      if(ocrDL.GetLearningResultAllHistory(flaCostHistory, flaValidationHistory, flaMeanIoUHistory, flaValidationZEHistory, flaMeanIoUZEHistory, flaValidationEpochHistory).IsFail())
      	break;
      
      CFasterCharacterBasedOCRDL ocrDL = new CFasterCharacterBasedOCRDL();
      int i32ResultClassCount;
      List<String> flaClassNames = new List<String>();
      float f32ResultLastAccuracy;
      float f32ResultLastAccuracyZE;
      float f32ResultLastMeanIOU;
      float f32ResultLastMeanIOUZE;
      float f32ResultMaximumAccuracy;
      float f32ResultMaximumAccuracyZE;
      float f32ResultMaximumMeanIoU;
      float f32ResultMaximumMeanIoUZE;
      int i32ResultMaximumAccuracyCumulativeEpoch;
      int i32ResultMaximumMeanIoUCumulativeEpochZE;
      List<float> flaMeanIoUHistory = new List<float>();
      List<float> flaMeanIoUZEHistory = new List<float>();
      List<float> flaCostHistory = new List<float>();
      List<float> flaValidationHistory = new List<float>();
      List<float> flaValidationZEHistory = new List<float>();
      List<int> flaValidationEpochHistory = new List<int>();
      
      if(ocrDL.GetLearningResultClassNames(0, ref flaClassNames).IsFail())
          break;
      
      i32ResultClassCount = ocrDL.GetLearningResultClassCount();
      
      f32ResultLastAccuracy = ocrDL.GetLearningResultLastAccuracy();
      f32ResultLastAccuracyZE = ocrDL.GetLearningResultLastAccuracyZE();
      
      f32ResultLastMeanIOU = ocrDL.GetLearningResultLastMeanIoU();
      f32ResultLastMeanIOUZE = ocrDL.GetLearningResultLastMeanIoUZE();
      
      f32ResultMaximumAccuracy = ocrDL.GetLearningResultMaximumAccuracy();
      f32ResultMaximumAccuracyZE = ocrDL.GetLearningResultMaximumAccuracy();
      
      f32ResultMaximumMeanIoU = ocrDL.GetLearningResultMaximumMeanIoU();
      f32ResultMaximumMeanIoUZE = ocrDL.GetLearningResultMaximumMeanIoUZE();
      
      i32ResultMaximumAccuracyCumulativeEpoch = ocrDL.GetLearningResultMaximumAccuracyCumulativeEpoch();
      
      i32ResultMaximumMeanIoUCumulativeEpochZE = ocrDL.GetLearningResultMaximumMeanIoUCumulativeEpochZE();
      
      if(ocrDL.GetLearningResultMeanIoUHistory(ref flaMeanIoUHistory).IsFail())
          break;
      
      if(ocrDL.GetLearningResultMeanIoUZEHistory(ref flaMeanIoUZEHistory).IsFail())
          break;
      
      if(ocrDL.GetLearningResultAllHistory(ref flaCostHistory, ref flaValidationHistory, ref flaMeanIoUHistory, ref flaValidationZEHistory, ref flaMeanIoUZEHistory, ref flaValidationEpochHistory).IsFail())
          break;
      
      ocrDL = CFasterCharacterBasedOCRDL()
      
      flaClassNames = List[String]()
      flaMeanIoUHistory = List[Single]()
      flaMeanIoUZEHistory = List[Single]()
      flaCostHistory = List[Single]()
      flaValidationHistory = List[Single]()
      flaValidationZEHistory = List[Single]()
      flaValidationEpochHistory = List[int]()
      
      ocrDL.GetLearningResultClassNames(0, flaClassNames)
      
      i32ResultClassCount = ocrDL.GetLearningResultClassCount()
      
      f32ResultLastAccuracy = ocrDL.GetLearningResultLastAccuracy()
      f32ResultLastAccuracyZE = ocrDL.GetLearningResultLastAccuracyZE()
      
      f32ResultLastMeanIOU = ocrDL.GetLearningResultLastMeanIoU()
      f32ResultLastMeanIOUZE = ocrDL.GetLearningResultLastMeanIoUZE()
      
      f32ResultMaximumAccuracy = ocrDL.GetLearningResultMaximumAccuracy()
      f32ResultMaximumAccuracyZE = ocrDL.GetLearningResultMaximumAccuracy()
      
      f32ResultMaximumMeanIoU = ocrDL.GetLearningResultMaximumMeanIoU()
      f32ResultMaximumMeanIoUZE = ocrDL.GetLearningResultMaximumMeanIoUZE()
      
      i32ResultMaximumAccuracyCumulativeEpoch = ocrDL.GetLearningResultMaximumAccuracyCumulativeEpoch()
      
      i32ResultMaximumMeanIoUCumulativeEpochZE = ocrDL.GetLearningResultMaximumMeanIoUCumulativeEpochZE()
      
      ocrDL.GetLearningResultMeanIoUHistory(flaMeanIoUHistory)
      ocrDL.GetLearningResultMeanIoUZEHistory(flaMeanIoUZEHistory)
      ocrDL.GetLearningResultAllHistory(flaCostHistory, flaValidationHistory, flaMeanIoUHistory, flaValidationZEHistory, flaMeanIoUZEHistory, flaValidationEpochHistory)
      
    • GUI에서 확인 방법
      Seg_ModelSelect

      Fig. GUI 프로퍼티에서 결과 확인(Epoch, Cost, Validation)


      Seg_ModelSelect

      Fig. 학습 다이얼로그에서 현황 확인(Epoch, Cost, Validation)


      Seg_ModelSelect

      Fig. 그래프 뷰에서 현황 확인(Cost, Validation)