Super Resolution DL

목차

  1. 개요
  2. 사용 방법
  3. 필수 옵션
  4. 선택 옵션
  5. 결과 출력

1 개요

Source
Result
Source Result

2 Super Resolution DL 사용 방법

1 데이터 셋 준비

  1. Super Resolution은 정상 이미지만 가지고 학습을 진행합니다.

2.2 학습

2.2.1. 학습 이미지 설정
2.2.2. 검증 이미지 설정
2.2.3. 모델 설정
2.2.4. 배율 설정
2.2.5. 옵티 마이저 설정
2.2.6. Augmentation 설정(선택)
2.2.7. 학습 수행
  1. Super Resolution 의 경우 PSNR 이 높을수록 SSIM 이 1에 가까울수록 좋은 결과 입니다.
  2. Super Resolution 의 경우 종료 조건은 45 PSNR 이상과 SSIM 0.95 정도로 설정 하는 게 적절합니다.
  3. 추천 종료 조건
    1. SSIM >= 0.95 && PSNR >=45
2.2.8 조건 식
  1. 종료 조건(Stop Condition) & 자동 저장(Auto Save)에서 사용 가능한 조건 식 입니다.
  2. Common Conditional Expression
  3. Super Resolution DL Expression
    변수명 설명 Stop Condition 예시 Auto Save 예시
    accuracy 상관계수로 Validation 이미지와 연산 결과의 이미지와의 선형적 관계를 나타내는 정확도 지표입니다. 0~1 범위를 가지며 1로 갈수록 좋은 결과입니다. cost <= 0.3 & accuracy >= 1 epoch >= 10 & accuracy >= max('accuracy') & accuracy > 0
    psnr Validation 이미지와 연산 결과의 이미지와의 유사도를 평가하는 지표로 두 이미지 간의 픽셀 오차(Mean Squared Error)를 기반으로, 최대 픽셀값 대비 신호 대 잡음비를 로그 스케일로 측정하여 유사도를 평가하는 지표입니다. 0보다 큰 범위를 가지며 값이 클수록 좋은 결과입니다. cost <= 0.3 & psnr >= 45 epoch >= 10 & psnr >= max('psnr') & psnr > 0
    ssim Validation 이미지와 연산 결과의 이미지간의 밝기, 대비, 구조 정보를 종합적으로 비교하여 사람의 시각 인식에 기반한 유사도를 평가하는 지표입니다. 0~1 범위를 가지며 1로 갈수록 좋은 결과입니다. cost <= 0 | ssim >= 1 epoch >= 10 & ssim >= max('ssim') & ssim > 0
    metric `psnr`과 `ssim`이 metric 사용됩니다. cost <= 0 | metric >= 1 epoch >= 10 & metric >= max('metric') & metric > 0
    validation accuracy가 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. 추론 수행
    • 추론 결과는 설정한 배율에 맞게 Source 이미지가 고배율 확대됩니다.

2.4 Save/Load

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

3 필수 옵션

3.1 학습 필수 옵션

  1. Super Resolution 학습 이미지 설정

    1. Super Resolution 에 경우 저화질과 고화질 두 이미지를 설정해야 됩니다.
      1. 저화질 Learn Image 설정
        • SetLearningLowResolutionImage(const Base::CFLImage&)
        • SetLearningLowResolutionImage(const Base::CFLImage*)
      2. 고화질 Learn Image 설정
        • SetLearningHighResolutionImage(const Base::CFLImage&)
        • SetLearningHighResolutionImage(const Base::CFLImage*)
  2. Super Resolution 검증 이미지 설정(선택)

    1. Super Resolution 에 경우 저화질과 고화질 두 이미지를 설정해야 됩니다.
      1. 저화질 Validation Image 설정(선택)
        • SetLearningLowResolutionValidationImage(const Base::CFLImage&)
        • SetLearningLowResolutionValidationImage(const Base::CFLImage*)
      2. 고화질 Validation Image 설정(선택)
        • SetLearningHighResolutionValidationImage(const Base::CFLImage&)
        • SetLearningHighResolutionValidationImage(const Base::CFLImage*)
  3. 모델 설정

    • 지원 모델
      • SRCNN(V1 32/V1 64/V1 128/V1 256/V1 512/V1 1024)
        • super Resolution 분야에서 처음으로 CNN이 적용된 모델입니다.
    • API
      • SetModel(EModel eModel = EModel_SRCNN)
        • eModel : 학습에 사용할 모델을 설정합니다.
      • SetModelVersion(EModelVersion eModelVersion = EModelVersion_SRCNN_V1_512)
        • eModelVersion : 학습에 사용할 모델의 버전을 설정합니다.
  4. 배율 설정

    1. 저화질에서 고화질로 될 때 증가하는 크기를 배율로 설정할 수 있습니다.
      • 학습 이미지를 해당 배율에 맞는 크기의 배율로 맞춰야 됩니다.
        • Low Resolution Learning Image가 256일 경우 High Resolution Learning Image는 512를 입력해 줘야됩니다.
      • SetScaleRatio(int32_t i32ScaleRatio = 2)
    • 예제 코드
CSuperResolutionDL superResolutionDL;

CFLImage fliLearnLowResolutionImage;
SuperResolutionDL.SetLearningLowResolutionImage(&fliLearnLowResolutionImage);

CFLImage fliLearnHighResolutionImage;
SuperResolutionDL.SetLearningHighResolutionImage(&fliLearnHighResolutionImage);

CFLImage fliLowResolutionValidationImage;
SuperResolutionDL.SetLearningLowResolutionValidationImage(&fliLowResolutionValidationImage);

CFLImage fliHighResolutionValidationImage;
SuperResolutionDL.SetLearningHighResolutionValidationImage(&fliHighResolutionValidationImage);

superResolutionDL.SetScaleRatio(2);
superResolutionDL.SetModel(CSuperResolutionDL::EModel_FLDefNet);
superResolutionDL.SetModelVersion(CSuperResolutionDL::EModelVersion_SRCNN_V1_512);
CSuperResolutionDL superResolutionDL = new CSuperResolutionDL();

CFLImage fliLearnLowResolutionImage = new CFLImage();

if(SuperResolutionDL.SetLearningLowResolutionImage(ref fliLearnLowResolutionImage).IsFail())
            break;

CFLImage fliLearnHighResolutionImage = new CFLImage();

if(SuperResolutionDL.SetLearningHighResolutionImage(ref fliLearnHighResolutionImage).IsFail())
            break;

CFLImage fliLowResolutionValidationImage = new CFLImage();

if(SuperResolutionDL.SetLearningLowResolutionValidationImage(ref fliLowResolutionValidationImage).IsFail())
            break;

CFLImage fliHighResolutionValidationImage = new CFLImage();

if(SuperResolutionDL.SetLearningHighResolutionValidationImage(ref fliHighResolutionValidationImage).IsFail())
            break;

superResolutionDL.SetScaleRatio(2);
superResolutionDL.SetModel(CSuperResolutionDL.EModel.FLDefNet);
superResolutionDL.SetModelVersion(CSuperResolutionDL.EModelVersion.SRCNN_V1_256);
superResolutionDL = CSuperResolutionDL()
res = CResult()

fliLearnLowResolutionImage = CFLImage()

if(res := SuperResolutionDL.SetLearningLowResolutionImage(fliLearnLowResolutionImage).IsFail()):
            break

fliLearnHighResolutionImage = CFLImage()

if(res := SuperResolutionDL.SetLearningHighResolutionImage(ref fliLearnHighResolutionImage).IsFail()):
            break

fliLowResolutionValidationImage = CFLImage()

if(res := SuperResolutionDL.SetLearningLowResolutionValidationImage(ref fliLowResolutionValidationImage).IsFail()):
            break

fliHighResolutionValidationImage = CFLImage()

if(res := SuperResolutionDL.SetLearningHighResolutionValidationImage(ref fliHighResolutionValidationImage).IsFail()):
            break

superResolutionDL.SetScaleRatio(2)
superResolutionDL.SetModel(CSuperResolutionDL.EModel.FLDefNet)
superResolutionDL.SetModelVersion(CSuperResolutionDL.EModelVersion.SRCNN_V1_256)
GUI에서 사용할 이미지를  설정하는 Dropdown List

Fig. GUI에서 사용할 이미지를 설정하는 Dropdown List

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

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

GUI에서 사용할 배율을  설정하는 Dropdown List

Fig. GUI에서 사용할 배율을 설정하는 Dropdown List

3.2 추론 필수 옵션

  1. Inference & Inference Result Image 설정

4 선택 옵션

4.1 학습 선택 옵션

  1. 검증 이미지 설정
    • 검증 이미지를 설정합니다. 정상 이미지만을 입력합니다.
  2. 옵티 마이저 설정
  3. Augmentation 설정
  4. 이미지 전처리 설정
  5. 종료 조건 설정
  6. 자동 저장 조건 설정
  7. Optimal Learning State Preservation 설정
  8. 배치 프로세싱 설정

5 결과 출력

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

    • API

      • GetLearningResultLastAccuracy() : 학습 중인 상태에서 가장 마지막 accuracy 값을 가져옵니다.
      • GetLearningResultLastPSNR() : 학습 중인 상태에서 가장 마지막 PSNR 값을 가져옵니다.
      • GetLearningResultLastSSIM() : 학습 중인 상태에서 가장 마지막 SSIM 값을 가져옵니다.
      • GetLearningResultMaximumAccuracy() : 학습하면서 나온 가장 큰 accuracy 값을 가져옵니다.
      • GetLearningResultMaximumPSNR() : 학습하면서 나온 가장 큰 PSNR 값을 가져옵니다.
      • GetLearningResultMaximumSSIM() : 학습하면서 나온 가장 큰 SSIM 값을 가져옵니다.
      • GetLearningResultMaximumAccuracyCumulativeEpoch() : 학습하면서 나온 가장 큰 accuracy 값이 나온 epoch을 가져옵니다.
      • GetLearningResultMaximumPSNRCumulativeEpoch() : 학습하면서 나온 가장 큰 PSNR 값이 나온 epoch을 가져옵니다.
      • GetLearningResultMaximumSSIMCumulativeEpoch() : 학습하면서 나온 가장 큰 SSIM 값이 나온 epoch을 가져옵니다.
      • GetLearningResultAllHistory(Base::CFLArray<float>& flaCostHistory, Base::CFLArray<float>& flaValidationHistory, Base::CFLArray<float>& flaPSNRHistory, Base::CFLArray<float>& flaSSIMHistory, Base::CFLArray<int32_t>& flaValidationEpochHistory) : Super Resolution 학습을 하면서 생성된 모든 학습 기록을 가져옵니다.(Parameter에 포인터 타입도 사용 가능)
        • Super Resolution 학습을 하면서 생성된 모든 학습 기록들을 가져옵니다.
        • flaCostHistory : 각 epoch에서 나온 cost 기록을 CFLArray<float> 형태로 받아옵니다.
        • flaValidationHistory : 각 epoch에서 나온 validation 기록을 CFLArray<float> 형태로 받아옵니다.
        • flaPSNRHistory : 각 epoch에서 나온 PSNR 기록을 CFLArray<float> 형태로 받아옵니다.
        • flaSSIMHistory : 각 epoch에서 나온 SSIM 기록을 CFLArray<float> 형태로 받아옵니다.
        • flaValidationEpochHistory : validation을 진행한 epoch들을 CFLArray<int32_t> 형태로 받아옵니다.
    • 예제 코드

CSuperResolutionDL superResolutionDL;

///////////////////////////////////
// 필수 or 선택 옵션 설정
///////////////////////////////////

if(superResolutionDL.Learn().IsFail())
    break;

// thread로 실행 시 학습 진행 중인 상태의 정보
// 일반 실행 시 마지막 학습 결과 정보

float f32LastAccuracy;
float f32LastPSNR;
float f32LastSSIM;
float f32MaxAccuracy;
float f32MaxPSNR;
float f32MaxSSIM;
int32_t i32MaxAccEpoch;
int32_t i32MaxPSNREpoch;
int32_t i32MaxSSIMEpoch;

//마지막 accuracy 값
f32LastAccuracy = superResolutionDL.GetLearningResultLastAccuracy();
//마지막 PSNR 값
f32LastPSNR = superResolutionDL.GetLearningResultLastPSNR();
//마지막 SSIM 값
f32LastSSIM = superResolutionDL.GetLearningResultLastSSIM();

//학습 진행하면서 나온 Maximum accuracy 값
f32MaxAccuracy = superResolutionDL.GetLearningResultMaximumAccuracy();
//학습 진행하면서 나온 Maximum PSNR 값
f32MaxPSNR = superResolutionDL.GetLearningResultMaximumPSNR();
//학습 진행하면서 나온 Maximum SSIM 값
f32MaxSSIM = superResolutionDL.GetLearningResultMaximumSSIM();

//Maximum accuracy가 나온 epoch
i32MaxAccEpoch = superResolutionDL.GetLearningResultMaximumAccuracyCumulativeEpoch();  
//Maximum PSNR가 나온 epoch
i32MaxPSNREpoch = superResolutionDL.GetLearningResultMaximumPSNRCumulativeEpoch();  
//Maximum SSIM가 나온 epoch
i32MaxSSIMEpoch = superResolutionDL.GetLearningResultMaximumSSIMCumulativeEpoch();  

CFLArray<float> flaCostHistory;
CFLArray<float> flaValidationHistory;
CFLArray<float> flaPSNRHistory;
CFLArray<float> flaSSIMHistory;
CFLArray<int32_t> flaValidationEpochHistory;

superResolutionDL.GetLearningResultAllHistory(flaCostHistory, flaValidationHistory, flaPSNRHistory, flaSSIMHistory, flaValidationEpochHistory);
CSuperResolutionDL superResolutionDL = new CSuperResolutionDL();

///////////////////////////////////
// 필수 or 선택 옵션 설정
///////////////////////////////////

if(superResolutionDL.Learn().IsFail())
    break;

// thread로 실행 시 학습 진행 중인 상태의 정보
// 일반 실행 시 마지막 학습 결과 정보

float f32LastAccuracy;
float f32LastPSNR;
float f32LastSSIM;
float f32MaxAccuracy;
float f32MaxPSNR;
float f32MaxSSIM;
int i32MaxAccEpoch;
int i32MaxPSNREpoch;
int i32MaxSSIMEpoch;

//마지막 accuracy 값
f32LastAccuracy = superResolutionDL.GetLearningResultLastAccuracy();
//마지막 PSNR 값
f32LastPSNR = superResolutionDL.GetLearningResultLastPSNR();
//마지막 SSIM 값
f32LastSSIM = superResolutionDL.GetLearningResultLastSSIM();

//학습 진행하면서 나온 Maximum accuracy 값
f32MaxAccuracy = superResolutionDL.GetLearningResultMaximumAccuracy();
//학습 진행하면서 나온 Maximum PSNR 값
f32MaxPSNR = superResolutionDL.GetLearningResultMaximumPSNR();
//학습 진행하면서 나온 Maximum SSIM 값
f32MaxSSIM = superResolutionDL.GetLearningResultMaximumSSIM();

//Maximum accuracy가 나온 epoch
i32MaxAccEpoch = superResolutionDL.GetLearningResultMaximumAccuracyCumulativeEpoch();  
//Maximum PSNR가 나온 epoch
i32MaxPSNREpoch = superResolutionDL.GetLearningResultMaximumPSNRCumulativeEpoch();  
//Maximum SSIM가 나온 epoch
i32MaxSSIMEpoch = superResolutionDL.GetLearningResultMaximumSSIMCumulativeEpoch();  

List<float> flaCostHistory = new List<float>();
List<float> flaValidationHistory = new List<float>();
List<float> flaPSNRHistory = new List<float>();
List<float> flaSSIMHistory = new List<float>();
List<int> flaValidationEpochHistory = new List<int>();

superResolutionDL.GetLearningResultAllHistory(ref flaCostHistory, ref flaValidationHistory, ref flaPSNRHistory, ref flaSSIMHistory, ref flaValidationEpochHistory);
superResolutionDL = CSuperResolutionDL()

///////////////////////////////////
// 필수 or 선택 옵션 설정
///////////////////////////////////
res = CResult() 

if(res := superResolutionDL.Learn().IsFail()):
    break

// thread로 실행 시 학습 진행 중인 상태의 정보
// 일반 실행 시 마지막 학습 결과 정보

//마지막 accuracy 값
f32LastAccuracy = superResolutionDL.GetLearningResultLastAccuracy()
//마지막 PSNR 값
f32LastPSNR = superResolutionDL.GetLearningResultLastPSNR()
//마지막 SSIM 값
f32LastSSIM = superResolutionDL.GetLearningResultLastSSIM()

//학습 진행하면서 나온 Maximum accuracy 값
f32MaxAccuracy = superResolutionDL.GetLearningResultMaximumAccuracy()
//학습 진행하면서 나온 Maximum PSNR 값
f32MaxPSNR = superResolutionDL.GetLearningResultMaximumPSNR()
//학습 진행하면서 나온 Maximum SSIM 값
f32MaxSSIM = superResolutionDL.GetLearningResultMaximumSSIM()

//Maximum accuracy가 나온 epoch
i32MaxAccEpoch = superResolutionDL.GetLearningResultMaximumAccuracyCumulativeEpoch()
//Maximum PSNR가 나온 epoch
i32MaxPSNREpoch = superResolutionDL.GetLearningResultMaximumPSNRCumulativeEpoch()
//Maximum SSIM가 나온 epoch
i32MaxSSIMEpoch = superResolutionDL.GetLearningResultMaximumSSIMCumulativeEpoch() 

flaCostHistory = List[Single]()
flaValidationHistory = List[Single]()
flaPSNRHistory = List[Single]()
flaSSIMHistory = List[Single]()
flaValidationEpochHistory = List[int32]()

superResolutionDL.GetLearningResultAllHistory(flaCostHistory, flaValidationHistory, flaPSNRHistory, flaSSIMHistory, flaValidationEpochHistory)

4 GUI에서 확인하는 방법

  1. 학습을 시작하면 나오는 Dialog의 Show info 버튼을 눌러 확장하여 아래와 같이 표시한 부분에서 관련된 데이터들을 확인할 수 있습니다.
Dialog Result

Fig. Dialog 창에서 출력되는 학습 결과 정보


  1. property 창의 Learned Model Information의 Epoch과 Validation 항목의 표시된 부분에서 해당 함수와 관련된 데이터들을 확인할 수 있습니다.
Property Result

Fig. Property 창에서 출력되는 학습 결과 정보


  1. All Histories의 경우 학습이 진행되면 프로그램 하단의 graph view에서 실시간으로 학습이 진행되면서 나온 cost 및 validation 등의 기록을 확인할 수 있습니다.
Graph View Result

Fig. 학습 결과가 출력되는 Graph View