Instance Segmentation 3D DL

1 개요

Texture Depth Map AI Result 3D Result
Texture Depth Result 3DResult

2 Instance Segmentation 3D 사용 방법

2.1 데이터 셋 준비

  1. 각 객체의 라벨링 방식은 Instance Segmentation 의 방식과 동일합니다. Depth Map 이미지에서는 별도의 라벨링을 필요로 하지 않습니다.[학습 이미지 설정]

  2. 추가적으로 3D Model 학습을 위한 각 클래스 번호별 대표 객체를 선정해야합니다.

    • "@M" 이름으로 특정 영역을 라벨링하여 결정할 수 있습니다. 해당 영역과 겹치는 부분이 존재하는 객체들이 대표 객체가 되어 3D Model 로 학습됩니다.
    • 대표 객체의 개수가 전체 클래스의 개수와 같지 않거나, 대표 객체가 2개 이상인 클래스가 존재할 경우 학습을 진행할 수 없습니다.


    MasterLabel

    Fig. 대표 객체 지정 예시

2.2 학습

2.2.1. 학습 이미지 설정
  1. Depth Map 이미지 설정
    • SetLearningDepthMap(const Base::CFLImage&)
    • SetLearningDepthMap(const Base::CFLImage*)
2.2.2. 검증 이미지 설정(선택)
  1. Instance Segmentation 검증 지표
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

2.3 추론

  1. 추론 이미지 & 결과 이미지 설정
    1. Depth Map 이미지 설정
      • SetInferenceDepthMap(const Base::CFLImage&)
      • SetInferenceDepthMap(const Base::CFLImage*)
  2. 추론 수행
  3. 추론 결과 옵션 설정

2.4 Save/Load

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

3 필수 옵션

3.1 학습 필수 옵션

  1. Learn 이미지 설정
    1. 추가적으로 학습 이미지(Texture)와 쌍이 되는 Depth Map 이미지 설정이 필요합니다. 학습 이미지와 Page 수가 같지 않을 경우 학습을 수행할 수 없습니다.
      • SetLearningDepthMap(const Base::CFLImage&)
      • SetLearningDepthMap(const Base::CFLImage*)
  2. Instance Segmentation 모델 설정

3.2 추론 필수 옵션

  1. Inference & Inference Result Image 설정
    1. 추가적으로 추론 이미지(Texture)와 쌍이 되는 Depth Map 이미지 설정이 필요합니다. 추론 이미지와 Page 수가 같지 않을 경우 추론을 수행할 수 없습니다.
      • SetInferenceDepthMap(const Base::CFLImage&)
      • SetInferenceDepthMap(const Base::CFLImage*)

4 선택 옵션

4.1 학습 선택 옵션

  1. Instance Segmentation 옵션 설정
  2. 3D Match 알고리즘을 선택할 수 있습니다.
    • SetMatch3DMode(EMatch3DMode eMatch3DMode = EMatch3DMode_Vertex)
      • EMatch3DMode_Vertex : Vertex Match 3D
      • EMatch3DMode_Surface : Surface Match 3D
  3. 3D Match 관련 파라미터를 설정합니다.
    • SetLearningMatch3DParameters(double f64SamplingDistance = 0.03, double f64AngleThreshold = 30.0)
      • 학습 시의 Match 3D 파라미터를 설정합니다.
      • f64SamplingDistance : 샘플링 거리
      • f64AngleThreshold : 각도 임계 값
    • GUI에서 설정 방법
      CameraCalibrator
      Fig. Learning Match 3D 파라미터 설정

  4. Depth Map 이미지를 Point Cloud 3D Object 로 변환하기 위한 Camera Calibrator 파라미터를 설정합니다.
    • SetLearningCameraCalibrator(const Foundation::CFLPoint<float>& flpFocalLength, const Foundation::CFLPoint<float>& flpPrincipalPoint, float f32DepthScale, const Base::CFLArray<double>& flaDistortionCoefficient, ThreeDim::EDirectionType eDirectionType)
      • Camera Calibrator 정보를 설정합니다.
      • flpFocalLength, flpPrincipalPoint : 카메라의 초점 거리 및 주점
      • flaDistortionCoeff : 카메라 왜곡 계수
      • eDirectionType : z축의 방향
    • GUI에서 설정 방법
      CameraCalibrator
      Fig. Learning Camera Calibrator 설정

4.2 추론 선택 옵션

  1. Instance Segmentation 옵션 설정
  2. 3D Match 관련 파라미터를 설정합니다.
    • SetInferenceMatch3DParameters(Foundation::EEulerSequence eEulerSequence = Foundation::EEulerSequence_Extrinsic_XYZ, double f64SamplingDistance = 0.03, double f64KeypointRatio = 0.5, double f64MinScore = 0.5, double f64InitialScore = 0.3)
      • 추론 시의 Match 3D 파라미터를 설정합니다.
      • eEulerSequence : 회전 순서
      • f64SamplingDistance : 샘플링 거리
      • f64KeypointRatio : 키포인트 비율
      • f64MinScore : 최소 점수
      • f64InitialScore : 초기 점수 임계 값
    • GUI에서 설정 방법
      CameraCalibrator
      Fig. Inference Match 3D 파라미터 설정

  3. Depth Map 이미지를 Point Cloud 3D Object 로 변환하기 위한 Camera Calibrator 파라미터를 설정합니다.
    • SetInferenceCameraCalibrator(const Foundation::CFLPoint<float>& flpFocalLength, const Foundation::CFLPoint<float>& flpPrincipalPoint, float f32DepthScale, const Base::CFLArray<double>& flaDistortionCoefficient, ThreeDim::EDirectionType eDirectionType)
      • Camera Calibrator 정보를 설정합니다.
      • flpFocalLength, flpPrincipalPoint : 카메라의 초점 거리 및 주점
      • flaDistortionCoeff : 카메라 왜곡 계수
      • eDirectionType : z축의 방향
    • GUI에서 설정 방법
      CameraCalibrator
      Fig. Inference Camera Calibrator 설정

5 결과 출력

  1. Inference 결과 출력
    • Instance Segmentation 결과 출력
    • 3D Match 결과 출력
      • API

        • GetInferenceResultObjectGroupCount()
          • 3D Match 결과인 오브젝트 그룹의 개수를 가져옵니다. 사용된 Depth Map 이미지의 페이지 개수와 동일합니다.
        • GetInferenceResultObjectGroup(int64_t i64PageIndex, Foundation::CFL3DObjectGroup& floResult)
          • 입력한 페이지 인덱스의 3D 오브젝트 그룹을 가져옵니다.
        • GetInferenceResultObjectGroup(int64_t i64PageIndex, Foundation::CFL3DObjectGroup* pFloResult)
          • 입력한 페이지 인덱스의 3D 오브젝트 그룹을 가져옵니다.
        • IsInferenceResultPoseMatrixEnabled(int64_t i64PageIndex, int64_t i64ObjectIndex)
          • 입력한 페이지 인덱스와 오브젝트 인덱스의 객체가 매칭되었는지 여부를 반환합니다.
        • GetInferenceResultPoseMatrix(int64_t i64PageIndex, int64_t i64ObjectIndex, ThreeDim::SPoseMatrixParametersMulti& sResult)
          • 입력한 페이지 인덱스와 오브젝트 인덱스의 결과 포즈 행렬 파라미터를 가져옵니다.
      • 예제 코드

        CInstanceSegmentation3DDL instanceSegmentation3DDL;	
        
        int64_t i64PageCount = instanceSegmentation3DDL.GetInferenceResultObjectGroupCount();
        
        for(int64_t i = 0; i < i64PageCount; i++)
        {
            CFL3DObjectGroup flogResult;
        
            instanceSegmentation3DDL.GetInferenceResultObjectGroup(i, flogResult);
        
            int64_t i64ResultCount = flogResult.GetObjectCount();
        
            for(int64_t j = 0; j < i64ResultCount; j++)
            {
                const CFL3DObject* pFloResult = flogResult.GetObjectByIndex(j);
        
                SPoseMatrixParametersMulti sResult;
        
                instanceSegmentation3DDL.GetInferenceResultPoseMatrix(i, j, sResult);
            }
        }
        
        CInstanceSegmentation3DDL instanceSegmentation3DDL = new CInstanceSegmentation3DDL();	
        
        long i64PageCount = instanceSegmentation3DDL.GetInferenceResultObjectGroupCount();
        
        for(long i = 0; i < i64PageCount; i++)
        {
            CFL3DObjectGroup flogResult = new CFL3DObjectGroup();
        
            instanceSegmentation3DDL.GetInferenceResultObjectGroup(i, ref flogResult);
        
            long i64ResultCount = flogResult.GetObjectCount();
        
            for(long j = 0; j < i64ResultCount; j++)
            {
                CFL3DObject floResult = flogResult.GetObjectByIndex(j);
        
                SPoseMatrixParametersMulti sResult = new SPoseMatrixParametersMulti();
        
                instanceSegmentation3DDL.GetInferenceResultPoseMatrix(i, j, ref sResult);
            }
        }
        
        instanceSegmentation3DDL = CInstanceSegmentation3DDL()
        
        i64PageCount = instanceSegmentation3DDL.GetInferenceResultObjectGroupCount()
        
        for i in range(i64PageCount):
            flogResult = CFL3DObjectGroup()
        
            instanceSegmentation3DDL.GetInferenceResultObjectGroup(i, flogResult)
        
            i64ResultCount = flogResult.GetObjectCount()
        
            for j in range(i64ResultCount):
                floResult = flogResult.GetObjectByIndex(j)
        
                sResult = SPoseMatrixParametersMulti()
        
                instanceSegmentation3DDL.GetInferenceResultPoseMatrix(i, j, sResult)
        
  2. 학습 정보
    • Instance Segmentation 학습 정보 출력
    • 3D Model 정보 출력
      • API

        • GetLearned3DModelCount()
          • 3D Model 개수를 가져옵니다.
        • GetLearned3DModelClassName(Base::CFLString<wchar_t>& strClassName, int64_t i64Index = 0)
          • 입력한 인덱스의 3D model 클래스 이름을 가져옵니다. 학습한 각 대표 객체의 클래스 번호와 동일합니다.
        • GetLearned3DModelSampleObject(const Base::CFLString<wchar_t>& strClassName, Foundation::CFL3DObject* pFloSampledLearn)
          • 입력한 클래스 이름의 3D 오브젝트를 가져옵니다.
      • 예제 코드

        CInstanceSegmentation3DDL instanceSegmentation3DDL;	
        
        int64_t i64ModelCount = instanceSegmentation3DDL.GetLearned3DModelCount();
        
        for(int64_t i = 0; i < i64ModelCount; i++)
        {
            CFLString<wchar_t> flsClassName;
            CFL3DObject floLearned;
        
            instanceSegmentation3DDL.GetLearned3DModelClassName(flsClassName, i);
            instanceSegmentation3DDL.GetLearned3DModelSampleObject(flsClassName, &floLearned);
        }
        
        CInstanceSegmentation3DDL instanceSegmentation3DDL = new CInstanceSegmentation3DDL();	
        
        long i64ModelCount = instanceSegmentation3DDL.GetLearned3DModelCount();
        
        for(long i = 0; i < i64ModelCount; i++)
        {
            StringBuilder strClassName = new StringBuilder();
            CFL3DObject floLearned = new CFL3DObject();
        
            instanceSegmentation3DDL.GetLearned3DModelClassName(strClassName, i);
            instanceSegmentation3DDL.GetLearned3DModelSampleObject(strClassName.ToString(), floLearned);
        }
        
        instanceSegmentation3DDL = CInstanceSegmentation3DDL()
        
        i64ModelCount = instanceSegmentation3DDL.GetLearned3DModelCount()
        
        for i in range(i64ModelCount):
            strClassName = StringBuilder()
            floLearned = CFL3DObject()
        
            instanceSegmentation3DDL.GetLearned3DModelClassName(strClassName, i)
            instanceSegmentation3DDL.GetLearned3DModelSampleObject(strClassName.ToString(), floLearned)
        
      • GUI에서 확인 방법
        Learned3DObject

        Fig. Learned Sample Object 확인

6 추론 결과 검증