Instance Segmentation DL

1 개요

Source
Result
Source Result

2 Instance Segmentation 사용 방법

1 데이터 셋 준비

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

    • 이미지에 Figure를 삽입하여 학습 이미지를 생성할 수 있습니다. Figure에는 반드시 이름이 들어가야 하며 "클래스 번호 (클래스 이름)" 형식이거나 "클래스 번호" 형식이여야 합니다.
    • FLImaging에서 지원하는 모든 형식의 Figure로 라벨링할 수 있습니다. (라벨링 방법)
    • 클래스 번호는 1번부터 시작해야 합니다.


    DataSet(With Figure)

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


    DataSet(With Figure)

    Fig. 좌측 : Instance Segmentation 라벨링 우측 : Semantic Segmetnation 라벨링, Instance Segmetnation의 경우 반드시 인스턴스 별로 라벨링 해야합니다.

  2. Group Labeling 을 이용한 Flif 형식의 학습 이미지

    • Instance Segmentaiton의 Rect영역과 Region영역을 임의로 설정하여 학습을 하고 싶을 때 Group Labeling을 이용합니다.
    • 두 개이상의 Figure를 드래그하여 Group(Ctrl+G)하여 라벨링을 적용 할 수 있으며 그룹 내의 Figure 중 "B"또는 "Box" 이름을 가진 피겨는 Boundary Rect를 지정하는데에만 사용됩니다.


    DataSet(With Figure)

    Fig. Group 처리된 Figure를 삽입하여 만든 학습 데이터 샘플입니다.


    DataSet(With Figure)

    Fig. 좌측 : 그룹 전 라벨링 우측 : 그룹된 라벨링, 그룹 되기전 Box로 지정할 피겨는 반드시 "B"또는 "Box" 이름으로 지정하여야 합니다.

2.2 학습

2.2.1. 학습 이미지 설정
2.2.2. 검증 이미지 설정(선택)
  1. 검증 지표
    1. mAP(mean Average precision)
      1. 정확도(precision)와 재현율(recall)을 이용하여 계산하는 지표입니다.
        1. 정확도(precision)
          1. 예측한 것 중에 진짜 정답인 비율입니다.
          2. Precision = TP / (TP + FP)
          3. TP = True Positive(정답도 Positive 예측도 Positive)
          4. FP = False Positive(정답은 Negative인데 예측은 Positive)
        2. 재현율(Recall)
          1. 정답 중에 예측에 성공한 비율입니다.
          2. Recall = TP / (TP + FN)
          3. FN = False Negative(정답은 Positive인데 예측은 Negative)
      2. 예측한 결과들을 Score로 정렬하여 각 Threshold마다 정확도와 재현율을 계산하여 PR곡선을만들고 PR곡선 아래 면적을 계산하여 AP를 구합니다.
        PR Curve
        Fig. PR Curve

      3. 각 클래스별 AP를 구하고 평균낸 것이 mAP입니다.
      4. 범위는 0~1이며 1로 갈수록 높은 성능을 나타냅니다.
2.2.3. 모델 설정
2.2.4. 옵티 마이저 설정
2.2.5. Augmentation 설정(선택)
2.2.6. 학습 수행
  1. Instance Segmentation 의 경우 종료 조건은 mAP 1이 나왔을 때 모두 맞췄다는 의미므로 1로 설정하는게 좋습니다.
  2. 추천 종료 조건
    1. mAP >= 1
2.2.7. 조건 식
  1. 종료 조건(Stop Condition) & 자동 저장(Auto Save)에서 사용 가능한 조건 식 입니다.
  2. Common Conditional Expression
  3. Instance Segmentation Expression
    변수명 설명 Stop Condition 예시 Auto Save 예시
    map 클래스 별로 정밀도(Precision)와 재현율(Recall)을 이용하여 여러 임계값에서 Precision-Recall 곡선을 그리고, 그 면적을 계산한 값의 평균입니다. 0 ~ 1 범위를 가지며 1로 갈수록 좋은 결과를 나타냅니다. cost <= 0.3 & map >= 1 epoch >= 10 & map >= max('map') & map > 0
    metric map가 metric 사용됩니다. cost <= 0 | metric >= 1 epoch >= 10 & metric >= max('metric') & metric > 0
    validation map가 validation으로 사용됩니다. cost <= 0 | validation >= 1 epoch >= 10 & validation >= max('validation') & validation > 0
  4. GUI 에서 설정 방법
    1. 종료 조건 식 설정
      1. cost <= 0 | validation >= 1 | metric >= 1
      Graph View Result

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

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

2.3 추론

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

2.4 Save/Load

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

3 필수 옵션

3.1 학습 필수 옵션

  1. Learn 이미지 설정

  2. 모델 설정

    • 지원 모델

      • R FL Seg Net(V1 128 / V1 256 / V1 512 / V1 1024)
        • 포스로직만의 효율적인 최신 AI 모델 설계 구조를 바탕으로 구현된 정밀한 결과를 도출하는 이미지 탐지 모델입니다.
        • 추천 버전은 V1 512입니다.
      • Mask R CNN(V1 128 / V1 256 / v1 512 / V1 1024)
    • API

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

      CResult res;
      CInstanceSegmentationDL instanceSegDL;
      
      if(IsFail(res = instanceSegDL.SetModel(CInstanceSegmentationDL::EModel_R_FLSegNet)))
      	break;
      if(IsFail(res = instanceSegDL.SetModelVersion(CInstanceSegmentationDL::EModelVersion_R_FLSegNet_V1_512)))
      	break;
      
      CResult res = new CResult();
      CInstanceSegmentationDL instanceSegDL = new CInstanceSegmentationDL();      
      
      if((res = instanceSegDL.SetModel(CInstanceSegmentationDL.EModel.R_FLSegNet)).IsFail())
      	break;
      if((res = instanceSegDL.SetModelVersion(CInstanceSegmentationDL.EModelVersion.R_FLSegNet_V1_512)).IsFail())
      	break;
      
      instanceSegDL = CInstanceSegmentationDL()
      
      instanceSegDL.SetModel(CInstanceSegmentationDL.EModel.R_FLSegNet)
      instanceSegDL.SetModelVersion(CInstanceSegmentationDL.EModelVersion.R_FLSegNet_V1_512)
      
    • GUI에서 설정 방법


    Seg_ModelSelect

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


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

3.2 추론 필수 옵션

  1. Inference & Inference Result Image 설정

4 선택 옵션

4.1 학습 선택 옵션

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

    • API

      • SetLearningValidationStep(int32_t i32ValidationStep = 1)
      • SetValidationObjectnessThreshold(float f32Threshold)
        • 검증에 사용할 객체 임계 값을 설정합니다.
      • SetValidationIoUThreshold(float f32Threshold)
        • 검증에 사용할 IoU Threshold 값을 설정합니다.
        • 검증 시 추론한 영역과 정답 영역의 IoU 임계 값입니다.
      • SetValidationNMSThreshold(float f32Threshold)
        • 검증에 사용할 NMS 임계값을 설정합니다. 추천 값 0.5f
      • SetValidationMaskThreshold(float f32Threshold)
        • 검증에 사용할 Mask 임계값을 설정합니다.
    • 예제 코드

      CInstanceSegmentationDL isDL;
      
      if(isDL.SetLearningValidationStep(5).IsFail())
      	break;
      
      if(isDL.SetValidationObjectnessThreshold(0.5).IsFail())
      	break;
      
      if(isDL.SetValidationIoUThreshold(0.5).IsFail())
      	break;
      
      if(isDL.SetValidationMaskThreshold(0.5).IsFail())
      	break;
      
      if(isDL.SetValidationNMSThreshold(0.5).IsFail())
      	break;
      
      CInstanceSegmentationDL isDL = new CInstanceSegmentationDL();
      
      if(isDL.SetLearningValidationStep(5).IsFail())
      	break;
      if(isDL.SetValidationObjectnessThreshold(0.5f).IsFail())
      	break;
      if(isDL.SetValidationIoUThreshold(0.5f).IsFail())
      	break;
      if(isDL.SetValidationMaskThreshold(0.5f).IsFail())
      	break;
      if(isDL.SetValidationNMSThreshold(0.5f).IsFail())
      	break;
      
      isDL = CInstanceSegmentationDL()
      
      isDL.SetLearningValidationStep(5)
      isDL.SetValidationObjectnessThreshold(0.5)
      isDL.SetValidationIoUThreshold(0.5)
      isDL.SetValidationMaskThreshold(0.5)
      isDL.SetValidationNMSThreshold(0.5)
      
      
    • GUI에서 사용 방법
      Seg_ModelSelect

      Fig. GUI에서 검증 옵션 설정

  3. 옵티 마이저 설정
  4. Augmentation 설정
  5. 타일링 설정
  6. 이미지 전처리 설정
  7. 종료 조건 설정
  8. 자동 저장 조건 설정
  9. Class Equalization 설정
  10. Optimal Learning State Preservation 설정
  11. Pretrained Model 사용
  12. 이미지 당 최대 인스턴스 개수 설정
    • 학습 시 이미지당 최대 인스턴스 개수를 설정합니다.
    • API
      • SetLearningMaximumInstanceCount(int64_t i64MaximumInstanceCount = 128)
    • GUI에서 설정 방법
      Seg_ModelSelect
      Fig. GUI에서 학습 시 최대 인스턴스 개수 설정

4.2 추론 선택 옵션

  1. 추론 결과 옵션 설정

    • 추론 결과 옵션을 설정합니다. Contour 혹은 Boundary Rect로 받을 수 있으며 클래스 번호, 클래스 이름, 스코어를 포함여부를 정할 수 있습니다.

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

    • API

      • SetInferenceResultItemSettings(CInstanceSegmentationDL::EInferenceResultItemSettings eSetting)
        • 출력 정보를 선택 합니다. IncludingRegionFigures flag가 true인 경우에만 표시됩니다.
        • 출력 정보로는 Class Num, Class Name, Confidence Score를 선택할 수 있습니다.
        • 기본 값으로 세 항목 모두 출력합니다.
          • 기본 값 CInstanceSegmentationDL::EInferenceResultItemSettings_ClassNum_ClassName_Objectness_BoundaryRect_Contour
      • SetInferenceResultObjectnessThreshold(float f32Threshold)
        • 추론 시 결과의 객체 확신 값에 대한 임계 값을 설정합니다.
      • SetInferenceResultMaskThreshold(float f32Threshold)
        • 추론 시 결과 마스크 영역의 값들에 대한 임계 값을 설정합니다.
      • SetInferenceResultNMSThreshold(float f32Threshold)
        • 추론 시 NMS 임계 값을 설정합니다.
    • 예제 코드

      CInstanceSegmentationDL isDL;
      
      // 클래스 번호, 클래스 이름, 객체 확신 값, 바운더리 박스, 영역으로 출력되도록 설정
      if(isDL.SetInferenceResultItemSettings(CInstanceSegmentationDL::EInferenceResultItemSettings_ClassNum_ClassName_Objectness_BoundaryRect_Contour).IsFail())
      	break;
      // Objectness Threshold 설정 
      if(isDL.SetInferenceResultObjectnessThreshold(0.5f).IsFail())
      	break;
      // Mask Threshold 설정 
      if(isDL.SetInferenceResultMaskThreshold(0.5f).IsFail())
      	break;
      // NMS Threshold 설정 
      if(isDL.SetInferenceResultNMSThreshold(0.5f).IsFail())
      	break;
      
      CInstanceSegmentationDL isDL = new CInstanceSegmentationDL();
      
      // 클래스 번호, 클래스 이름, 객체 확신 값, 바운더리 박스, 영역으로 출력되도록 설정
      if(isDL.SetInferenceResultItemSettings(CInstanceSegmentationDL.EInferenceResultItemSettings.ClassNum_ClassName_Objectness_BoundaryRect_Contour).IsFail())
      	break;
      // Objectness Threshold 설정 
      if(isDL.SetInferenceResultObjectnessThreshold(0.5f).IsFail())
      	break;
      // Mask Threshold 설정 
      if(isDL.SetInferenceResultMaskThreshold(0.5f).IsFail())
      	break;
      // NMS Threshold 설정 
      if(isDL.SetInferenceResultNMSThreshold(0.5f).IsFail())
      	break;
      
      isDL = CInstanceSegmentationDL()
      
      # 클래스 번호, 클래스 이름, 객체 확신 값, 바운더리 박스, 영역으로 출력되도록 설정
      isDL.SetInferenceResultItemSettings(CInstanceSegmentationDL.EInferenceResultItemSettings.ClassNum_ClassName_Objectness_BoundaryRect_Contour)
      
      # Objectness Threshold 설정 
      isDL.SetInferenceResultObjectnessThreshold(0.5)
      # Mask Threshold 설정 
      isDL.SetInferenceResultMaskThreshold(0.5)
      # NMS Threshold 설정 
      isDL.SetInferenceResultNMSThreshold(0.5)
      
    • GUI에서 사용 방법
      Seg_ModelSelect

      Fig. GUI에서 추론 옵션 설정

  2. 배치 프로세싱 설정

  3. 이미지 당 최대 인스턴스 개수 설정

    • 추론 시 이미지당 최대 인스턴스 개수를 설정합니다.
    • API
      • SetInferenceMaximumInstanceCount(int64_t i64MaximumInstanceCount = 128)
    • GUI에서 설정 방법
      Seg_ModelSelect
      Fig. GUI에서 추론 시 최대 인스턴스 개수 설정

5 결과 출력

  1. Inference 결과 출력
    • Inference & Inference Result Image 설정을 통해 설정한 Result Image에 추론 결과가 출력되어집니다.
    • 옵션에 따라 라벨 값으로 이루어진 이미지 또는 찾은 영역의 Figure가 포함되게 됩니다.
  2. 학습 정보
    • 학습 중 또는 학습이 완료된 마지막 결과를 얻어옵니다.

    • API

      • GetLearningResultLastMeanAP()
        • 마지막 mAP(검증 Metric) 결과를 가져옵니다.
      • GetLearningResultMaxMeanAP()
        • 최대 mAP(검증 Metric) 결과를 가져옵니다.
      • GetLearningResultMaxMeanAPCumulativeEpoch()
        • 최대 학습 검증 MeanAP 결과의 에폭 수를 가져옵니다.
      • GetLearningResultAllHistory(Base::CFLArray<float>& flaCostHistory, Base::CFLArray<float>& flaValidationHistory, Base::CFLArray<int32_t>& flaValidationEpochHistory)
        • 마지막 학습의 모든 결과를 가져옵니다.
        • Cost, Accuracy, mIoU, ZE Accuracy, ZE mIoU, Validation Epoch
    • 예제 코드

      CInstanceSegmentationDL InstanceSegmentation;		
      float f32ResultLastMeanAP;
      float f32ResultMaxMeanAP;
      int32_t i32ResultMaxMeanAPCumulativeEpoch;
      
      Base::CFLArray<float> flaCostHistory;
      Base::CFLArray<float> flaValidationHistory;
      Base::CFLArray<int32_t> flaValidationEpochHistory;
      
      f32ResultLastMeanAP = InstanceSegmentation.GetLearningResultLastMeanAP();
      f32ResultMaxMeanAP = InstanceSegmentation.GetLearningResultMaxMeanAP();
      i32ResultMaxMeanAPCumulativeEpoch = InstanceSegmentation.GetLearningResultMaxMeanAPCumulativeEpoch();
      
      if(InstanceSegmentation.GetLearningResultAllHistory(flaCostHistory, flaValidationHistory, flaValidationEpochHistory).IsFail())
      	break;
      
      CInstanceSegmentationDL InstanceSegmentation = new CInstanceSegmentationDL();
      float f32ResultLastMeanAP;
      float f32ResultMaxMeanAP;
      int i32ResultMaxMeanAPCumulativeEpoch;
      
      List<float> flaCostHistory = new List<float>();
      List<float> flaValidationHistory = new List<float>();
      List<int> flaValidationEpochHistory = new List<int>();
      
      f32ResultLastMeanAP = InstanceSegmentation.GetLearningResultLastMeanAP();
      f32ResultMaxMeanAP = InstanceSegmentation.GetLearningResultMaxMeanAP();
      i32ResultMaxMeanAPCumulativeEpoch = InstanceSegmentation.GetLearningResultMaxMeanAPCumulativeEpoch();
      
      if(InstanceSegmentation.GetLearningResultAllHistory(ref flaCostHistory, ref flaValidationHistory, ref flaValidationEpochHistory).IsFail())
      	break;
      
      instanceSegmentation = CInstanceSegmentationDL()
      flaCostHistory = List[Single]()
      flaValidationHistory = List[Single]()
      flaValidationEpochHistory = List[int]()
      
      f32ResultLastMeanAP = instanceSegmentation.GetLearningResultLastMeanAP()
      f32ResultMaxMeanAP = instanceSegmentation.GetLearningResultMaxMeanAP()
      i32ResultMaxMeanAPCumulativeEpoch = instanceSegmentation.GetLearningResultMaxMeanAPCumulativeEpoch()
      
      instanceSegmentation.GetLearningResultAllHistory(flaCostHistory, flaValidationHistory, flaValidationEpochHistory)
      	
      
    • GUI에서 확인 방법
      Seg_ModelSelect

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


      Seg_ModelSelect

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


      Seg_ModelSelect

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