Generative Adversarial Network DL
1 개요
- Generative Adversarial Network(GAN) 알고리즘은 특정 범주나 클래스의 범주에서 이미지를 생성하는 작업을 수행하는 머신 러닝 알고리즘입니다. 주로 이미지 생성를 하는데 사용되며, 다양한 분야에서 활용이 가능합니다. 대표적으로 MNIST와 같은 손글씨 숫자를 생성할 때나 정상, 오류 이미지 등을을 생성할 때 Generative Adversarial Network를 사용할 수 있습니다.
- FLImaging®의 Generative Adversarial Network DL에서는 자체적으로 개발한 우수한 성능의 모델인 FLGenNet 이나 FLGenNet-Label을 제공하고 있으며, 그 밖에도 자체적으로 개량한 DCGAN, DCGAN-Label 등의 모델 또한 사용할 수 있습니다.
Result1 | Result2 | Result3 |
---|---|---|
![]() |
![]() |
![]() |
2 Generative Adversarial Network 사용 방법
1 데이터 셋 준비
-
MNIST와 같이 전체 이미지를 분류 범주로 나눌 경우는 학습 이미지로 들어온 파일 이름을 파싱하여 맨 앞의 숫자를 기준으로 labeling 하여 학습을 진행합니다.
- 해당 방식으로 라벨링을 하고 싶은 경우 동일한 카테고리의 이미지들이 담겨있는 폴더 이름만 설정하여 일괄적으로 처리가 가능합니다.
- 아래와 같이 폴더 이름을 앞에 카테고리 번호로 설정한 후 폴더를 이미지 뷰어에 로드하거나 폴더 경로를 학습 이미지로 설정하면 아래와 같이 번호를 label number로 인식하여 학습을 진행합니다.
- 아래의 예시에서 원래 파일 이름은 "241.jpg" 였지만, 해당 파일이 들어있는 폴더를 로드하면 폴더 앞의 번호가 1이기 때문에 1과 _이 삽입되어 "1_241.jpg"를 이름으로 뷰어에서 인식하게 됩니다.

Fig. 폴더 이름으로 카테고리 분류

Fig. 폴더 안에 있는 이미지들의 Page name
- 또 다른 방식은 아래와 같이 이미지 내에 분류하고 싶은 영역에 대해 ROI를 설정하면, Crop 없이 학습이 가능합니다.
- Labeling은 figure의 name을 설정하여 category 분류를 할 수 있습니다.
- 이때 figure name은 위와 같이 해당 항목의 번호 + (항목 이름)으로 저장하면 파싱하여 figure name 앞의 번호는 class number로 처리하고, 괄호 안의 이름은 class name으로 인식하여 아래와 같이 learned label이 처리된 것을 확인할 수 있습니다.

Fig. Figure을 사용한 Labeling

Fig. 학습 후 분류된 카테고리에 대한 정보 출력
- FLGenNet, DCGAN 모델 버전의 경우 하나의 모든 데이터셋을 동일한 클래스로 간주하여 학습을 진행하기 때문에 별도로 클래스 번호를 설정할 필요가 없습니다.
2 학습
2.2.1. 학습 이미지 설정
2.2.2. 검증 이미지 설정(선택)
2.2.3. 모델 설정
2.2.4. 옵티 마이저 설정
2.2.5. Augmentation 설정(선택)
1. Generative Adversarial Network는 Augmentation 유형 중에서 Mix Method(ObjectMix, CutMix, MixUp, Mosaic)은 지원하지 않습니다.
2.2.6. 학습 수행
2.2.7. 조건 식
- 종료 조건(Stop Condition) & 자동 저장(Auto Save)에서 사용 가능한 조건 식 입니다.
- Common Conditional Expression
- Generative Adversarial Network Expression Conditonal Expression
변수명 설명 Stop Condition 예시 Auto Save 예시 ssim, metric.ssim Validation 이미지와 연산 결과의 이미지간의 밝기, 대비, 구조 정보를 종합적으로 비교하여 사람의 시각 인식에 기반한 유사도를 평가하는 지표입니다. 0~1 범위를 가지며 1로 갈수록 좋은 결과입니다. cost <= 0.3 & ssim >= 1 epoch >= 10 & ssim >= max('ssim') & ssim > 0 pdv, metric.pdv Pixel Diversity Variance 의 약자로 생성된 이미지간의 국소적 분산값을 계산하여 다양성을 나타내는 지표입니다. 0 ~ 1 사이의 값을 가지며 1에 가까울수록 좋은 결과를 나타냅니다. cost <= 0 | pdv >= 1 epoch >= 10 & pdv >= max('pdv') & pdv > 0 metric `ssim`과 `pdv`가 metric으로 사용됩니다. cost <= 0 | metric >= 1 epoch >= 10 & metric >= max('metric') & metric > 0 validation `ssim`과 `pdv`가 validation으로 사용됩니다. cost <= 0 | validation >= 1 epoch >= 10 & validation >= max('validation') & validation > 0 - GUI 에서 설정 방법
- 종료 조건 식 설정
cost <= 0 | validation >= 1 | metric >= 1
Fig. GUI에서 종료 조건 설정 - 자동 저장 조건 식설정
epoch >= 10 & metric >= max('metric') & metric > 0
Fig. GUI에서 자동 저장 조건 설정
- 종료 조건 식 설정
3 추론
4 Save/Load
- Save/Load
- 모델파일을 저장하거나 불러옵니다.
- 확장자는 .flgan입니다.
3 필수 옵션
1 Learn 이미지 설정
2 모델 설정
1 모델/버전
- Generative Adversarial Network DL에서 사용할 모델 및 모델의 버전을 설정합니다.
- 모델의 크기도 결정됩니다.
- 지원 모델
- FLGenNet(V1 32/V1 64/V1 128/V1 256/V1 512/ V1 1024)
- 포스로직에서 자체적으로 개발한 FLNet 구조를 기반으로 하는 생성형 모델입니다. 별도의 라벨링을 필요로 하지 않습니다.
- FLGenNet-Label(V1 32/V1 64/V1 128/V1 256/V1 512/ V1 1024)
- 포스로직에서 자체적으로 개발한 FLNet 구조를 기반으로 하는 생성형 모델입니다. 학습 시 클래스 번호로 라벨링을 필요로 하며, 이미지 생성 시 각 클래스별 가중치를 설정할 수 있습니다.
- DCGAN(V1 32/V1 64/V1 128/V1 256/V1 512/ V1 1024)
- 별도의 라벨링을 필요로 하지 않습니다.
- DCGAN-Label(V1 32/V1 64/V1 128/V1 256/V1 512/ V1 1024)
- 학습 시 클래스 번호로 라벨링을 필요로 하며, 이미지 생성 시 각 클래스별 가중치를 설정할 수 있습니다.
- FLGenNet(V1 32/V1 64/V1 128/V1 256/V1 512/ V1 1024)
2 API
SetModel(EModel eModel = EModel_FLGenNet)
eModel
: 학습에 사용할 모델을 설정합니다.
SetModelVersion(EModelVersion eModelVersion = EModelVersion_FLGenNet_V1_128)
eModelVersion
: 학습에 사용할 모델의 버전을 설정합니다. 생성 이미지의 size 를 설정할 수 있습니다.
3 예제 코드
CGenerativeAdversarialNetworkDL generativeAdversarialNetworkDL;
generativeAdversarialNetworkDL.SetModel(CGenerativeAdversarialNetworkDL::EModel_FLGenNet_Label);
generativeAdversarialNetworkDL.SetModelVersion(CGenerativeAdversarialNetworkDL::EModelVersion_FLGenNet_Label_V1_128);
4 GUI에서 설정 방법

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

Fig. GUI에서 사용할 모델 버전을 설정하는 Dropdown List
5 추론 필수 옵션
4 선택 옵션
1 학습 선택 옵션
- 검증 이미지 설정
- 검증 이미지를 설정합니다. 검증 이미지는 라벨링이 되어있어야 합니다.
- 검증 옵션 설정
- 옵티 마이저 설정
- Augmentation 설정
- 이미지 전처리 설정
- 종료 조건 설정
- 자동 저장 조건 설정
- Class Equalization 설정
- Optimal Learning State Preservation 설정
2 생성 이미지 관련 설정
1 개요
- 생성 이미지 관련 가중치를를 설정합니다.
- 생성 이미지의 개수를 설정할 수 있습니다.
- 생성 이미지의 다양성을 위해 Input Noise 의 가중치를 설정 가능합니다.
- 각 클래스별 가중치를 설정할 수 있습니다.
2 API
SetInferenceResultCount(int32_t i32ResultCount = 1)
i32ResultCount
: 생성 이미지의 개수(Page Count) 를 설정합니다.
SetInferenceNoiseFactor(float f32NoiseFactor = 1.f)
f32NoiseFactor
: Input Noise 의 가중치를 설정합니다.
SetInferenceClassWeight(CFLArray<float> flaClassWeight)
flaClassWeight
: 클래스별 가중치를 설정합니다. 배열의 크기와 학습한 클래스 개수가 동일해야 합니다.
3 예제 코드
CGenerativeAdversarialNetworkDL generativeAdversarialNetworkDL;
CFLImage fliInferenceResultImage;
CFLArray<float> flaClassWeight;
flaClassWeight.PushBack(0.f);
flaClassWeight.PushBack(1.f);
generativeAdversarialNetworkDL.SetInferenceResultImage(fliInferenceResultImage);
generativeAdversarialNetworkDL.SetInferenceResultCount(10);
generativeAdversarialNetworkDL.SetInferenceNoiseFactor(.5f);
generativeAdversarialNetworkDL.SetInferenceClassWeight(flaClassWeight);
generativeAdversarialNetworkDL.Execute();
5 결과 출력
1 모델 정보
1 개요
- 학습에 사용된 모델 정보를 얻어옵니다.
2 API
GetModel()
: 사용된 학습 모델을 반환합니다.GetModelVersion()
: 사용된 학습 모델의 버전을 반환합니다.
3 예제 코드
CGenerativeAdversarialNetworkDL generativeAdversarialNetworkDL;
FLImaging::AI::CGenerativeAdversarialNetworkDL::EModel model;
FLImaging::AI::CGenerativeAdversarialNetworkDL::EModelVersion modelVersion;
model = generativeAdversarialNetworkDL.GetModel();
modelVersion = gagenerativeAdversarialNetworkDLn.GetModelVersion();
4 GUI에서 확인하는 방법
아래 이미지와 같이 학습을 시작한 후 나오는 dialog 창의 model 항목을 확인하거나, 로드한 학습 정보 파일은 Parameter – Learn – Model/Model Version 항목에서 현재 사용하는 모델 정보를 확인할 수 있습니다.

Fig. 학습 시 출력되는 Dialog 창에서 Model에 대한 정보가 출력되는 부분
2 학습 정보 출력
1 개요
- 학습 중 또는 학습이 완료된 마지막 결과를 얻어옵니다.
2 API
GetLearningResultLastSSIM()
: 학습 중인 상태에서 가장 마지막 SSIM 값을 가져옵니다.GetLearningResultLastPDV()
: 학습 중인 상태에서 가장 마지막 PDV(Pixel Diversity Variance) 값을 가져옵니다.GetLearningResultMaximumSSIM()
: 학습하면서 나온 가장 큰 SSIM 값을 가져옵니다.GetLearningResultMaximumPDV()
: 학습하면서 나온 가장 큰 PDV 값을 가져옵니다.GetLearningResultMaximumSSIMCumulativeEpoch()
: 학습하면서 나온 가장 큰 SSIM 값이 나온 epoch을 가져옵니다.GetLearningResultMaximumPDVCumulativeEpoch()
: 학습하면서 나온 가장 큰 PDV가 나온 epoch을 가져옵니다.GetLearningResultAllHistory(Base::CFLArray<float>& flaCostHistory, Base::CFLArray<float>& flaSSIMHistory, Base::CFLArray<float>& flaPDVHistory, Base::CFLArray<int32_t>& flaValidationEpochHistory)
: Generative Adversarial Network 학습을 하면서 생성된 모든 학습 기록들을 가져옵니다.(Parameter에 포인터 타입도 사용 가능)- Generative Adversarial Network 학습을 하면서 생성된 모든 학습 기록들을 가져옵니다.
flaCostHistory
: 각 epoch에서 나온 cost 기록을 CFLArray<float> 형태로 받아옵니다.flaSSIMHistory
: 각 epoch에서 나온 SSIM 기록을 CFLArray<float> 형태로 받아옵니다.flaPDVHistory
: 각 epoch에서 나온 PDV 기록을 CFLArray<float> 형태로 받아옵니다.flaValidationEpochHistory
: validation을 진행한 epoch들을 CFLArray<int32_t> 형태로 받아옵니다.
3 예제 코드
CGenerativeAdversarialNetworkDL generativeAdversarialNetworkDL;
///////////////////////////////////
// 필수 or 선택 옵션 설정
///////////////////////////////////
generativeAdversarialNetworkDL.Learn();
float f32LastSSIM;
float f32LastPDV;
float f32MaxSSIM;
float f32MaxPDV;
int32_t i32MaxAccEpoch;
int32_t i32MaxPDVEpoch;
//마지막 SSIM 값
f32LastSSIM = generativeAdversarialNetworkDL.GetLearningResultLastSSIM();
//마지막 PDV
f32LastPDV = generativeAdversarialNetworkDL.GetLearningResultLastPDV();
//학습 진행하면서 나온 Maximum SSIM 값
f32MaxSSIM = generativeAdversarialNetworkDL.GetLearningResultMaximumSSIM();
//학습 진행하면서 나온 Maximum PDV
f32MaxPDV = generativeAdversarialNetworkDL.GetLearningResultMaximumPDV();
//Maximum SSIM가 나온 epoch
i32MaxAccEpoch = generativeAdversarialNetworkDL.GetLearningResultMaximumSSIMCumulativeEpoch();
//Maximum PDV가 나온 epoch
i32MaxPDVEpoch = generativeAdversarialNetworkDL.GetLearningResultMaximumPDVCumulativeEpoch();
CFLArray<float> flaCostHistory;
CFLArray<float> flaSSIMHistory;
CFLArray<float> flaPDVHistory;
CFLArray<int32_t> flaValidationEpochHistory;
generativeAdversarialNetworkDL.GetLearningResultAllHistory(flaCostHistory, flaSSIMHistory, flaPDVHistory, flaValidationEpochHistory);
4 GUI에서 확인하는 방법
- 학습을 시작하면 나오는 Dialog의 Show info 버튼을 눌러 확장하여 아래와 같이 표시한 부분에서 관련된 데이터들을 확인할 수 있습니다.

Fig. Dialog 창에서 출력되는 학습 결과 정보
- property 창의 Learned Model Information의 Epoch과 Validation 항목의 표시된 부분에서 해당 함수와 관련된 데이터들을 확인할 수 있습니다.

Fig. Property 창에서 출력되는 학습 결과 정보
- All Histories의 경우 학습이 진행되면 프로그램 하단의 graph view에서 실시간으로 학습이 진행되면서 나온 cost 및 validation 등의 기록들을 확인할 수 있습니다.

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