VC Features
기능 개요
VC의 pipeline
AI Contents의 pipeline은 기능 단위인 asset의 조합으로 이루어져 있습니다. VC은 총 4가지 asset의 조합으로 pipeline이 구성되어 있습니다.
Train pipeline
Input - Readiness - Train
Inference pipeline
Input - Readiness - Inference - Output
각 단계는 asset으로 구분됩니다.
input asset
Vision Classification는 학습할 때 Ground Truth 데이터라고 하는 이미지의 경로와 정답 라벨로 이루어진 tabular 형태의 데이터로 동작합니다. 따라서 input asset에서는 Ground Truth 데이터를 읽고 다음 asset으로 전달하는 역할을 수행합니다. 만약 inference 단계에서 이미지에 대한 정보가 담긴 파일이 없다면 이미지의 경로만 가지고 이를 생성하여 추론에 활용하기 위해 다음 asset으로 전달합니다. 위 도표에서 보듯 학습 파이프라인인 경우 train으로, 추론 파이프라인인 경우 inference asset으로 전달됩니다.
readiness asset
Gound Truth 데이터의 데이터 품질을 검사합니다.이미지 경로 항목이나 정답지 항목에 결측치가 있는 경우 warning을 띄우고 결측값을 제외하여 학습이 진행됩니다.
modeling(train) asset
Vision Classification에서 train asset은 많은 역할을 수행합니다. 우선 input에서 전달받은 Ground Truth 데이터를 읽고 데이터 내 존재하는 이미지 경로를 가지고 메모리에 이미지를 올리고 이를 tensorflow.Data.dataset object로 감싸줍니다. 이 object를 활용하면 tensorflow 기반의 효율적인 연산이 가능합니다. 그리고 실험계획서에 미리 작성한 모델명과 모델 파라미터에 맞게 모델을 생성하고 학습을 진행합니다. 학습이 완료되고 나면 성능과 학습 과정에서의 추론 결과를 저장합니다.
modeling(inference) asset
inference asset에서는 input asset에서 전달받은 inference 데이터의 경로를 기반으로 이미지를 읽고, 이전 학습 단계에서 저장한 최고의 모델을 불러와서 라벨을 추론하고 이를 저장합니다. 만약 운영이 아닌 실험을 하고 있는 단계이고 정답 라벨이 파일에 있다면 성능을 저장합니다. 운영을 위한 파일은 inference_summary.yaml도 저장합니다. 추론 시간은 SEH 기준 약 1초입니다.
output asset
각 과제마다 필요한 정보가 다를 수 있습니다. 현재는 inference 데이터가 단일 이미지에 대해 추론한 경우 result에는 추론 라벨, score는 모델의 확실성(1-shanon entropy)이 저장되고, 여러 이미지에 대한 추론을 한 경우 result에는 전체 유형 별 개수를, score에는 모델의 확실성에 대한 평균이 저장됩니다. result에 저장할 수 있는 글자 수 제한이 있기 때문에 현재는 32글자까지 저장됩니다.
사용 팁
Ground Truth 데이터 경로 선택하기
Ground Truth(GT) 데이터와 이미지를 같은 폴더에 넣어주세요. ALO에서 GT파일과 이미지를 한 번에 분석환경으로 복사합니다. GT 데이터는 이미지 경로(image_path
) 항목과 라벨(label
) 항목으로 이루어져야 합니다. GT 데이터 내에 다른 항목이 있어도 분석에 사용되지 않습니다. image_path
라는 항목명은 분석 시 변경할 수 있으나(이 때 실험계획서 내 path_column
명을 동일하게 바꿔주세요) 솔루션 개발 완료 후 운영 시 반영되지 않기 때문에 가능하면 image_path
로 작성해주세요. 이 때 이미지의 사이즈는 모든 데이터에 대해 일정한 것이 좋습니다. 만약 다른 사이즈의 이미지가 있는 경우 성능이 떨어질 수 있으며 가능하면 crop을 하거나 resize를 통해 미리 일정한 사이즈로 유지하는게 좋습니다.
모델 선택하기
현재 지원되는 모델은 mobilenetv1
과 high_resolution
의 두 가지 있습니다. mobilenetv1
은 기본 모델로 어떤 데이터에 대해서도 안정적으로 학습/추론이 가능합니다. 경량화 모델이기 때문에 resize_shape
은 224, 224, 3
형태가 권장됩니다. 더 높은 해상도를 원하는 경우 high_resolution
모델을 선택하고 resize_shape
parameter를 수정해주세요.
데이터 증강 기법 선택하기
데이터가 충분하지 않 은 경우(image 당 1000장 이하) rand_augmentation 기능을 True로 설정하면 증강기법을 통해 더 다양하고 많은 데이터로 학습할 수 있습니다. 이 때 과제의 유형과 증강 기법을 살펴보고 과제에 적합하지 않은 변환은 제외해주세요.(자세한 설정 방법은 하단의 Train pipeline: Add data augmentation을 참고해주세요.)
성능과 리소스 절감을 위한 설명
데이터의 양이 많고 복잡한 문제인 경우 epochs를 늘리면 성능이 향상됩니다. 만약 epochs를 너무 길게 설정하여 과최적화가 우려되더라도 checkpoint기능을 통해 학습 중 검증 데이터의 성능이 가장 좋은 모델을 사용하기 때문에 문제가 발생하지 않습니다. 학습 데이터 수가 많고 학습 리소스가 충분한 경우(메모리와 GPU 메모리), batch_size를 늘리면 빠르게 학습하고 좋은 성능의 모델이 생성됩니다. 만약 데이터 수가 아주 많지만 정형화되어 있어 소수만 학습하고 대부분을 검증 데이터로 활용하고 싶은 경우 train_ratio
를 낮추면 됩니다.
이미지 내 추론 근거 영역 확인하기(XAI 설명)
만약 추론 시 어떤 영역을 근거로 하여 해당 라벨을 예측했는지 알고 싶다면 do_xai 옵션을 True로 바꾸면 됩니다. OK/NG와 같이 binary로 학습하고 NG에 대한 근거만 확인하고 싶다면 xai_class를 NG로 작성하시면 됩니다. 만약 XAI 민감도가 지나치게 낮아 영역이 거의 표시되지 않은 경우 mask_threshold를 낮추면 더 넓은 영역이 표시됩니다. 더 깊은 층을 분석하여 정확한 결과를 알고 싶은 경우 layer_index를 늘리면 모델에서 더 깊은 층을 활용하여 XAI 결과를 도출하지만 추론 시 리소스가 많이 소요됩니다.
기능 상세
Vision Classification의 다양한 기능을 활용하기 위한 상세 설명입니다.
Train pipeline: Input asset
Read Ground Truth file
Ground Truth 파일을 읽고 이미지 경로와 라벨을 input asset
에서 파악합니다.
Train pipeline: readiness asset
Check data quality
Ground Truth 파일에 이미지 경로와 라벨 항목에 결측치가 있는지 확인합니다. 확인 후 결측치가 존재하면 warning을 띄우고 결측치가 존재하는 데이터를 삭제하여 학습 파이프라인이 진행됩니다.
Train pipeline: Train asset
Load image file and generate tensorflow.Data.dataset object
Ground True 파일에 기입된 이미지 경로를 바탕으로 이미지 파일을 읽어서 메모리에 올립니다. 이 때 dataset 데이터형을 이용하여 tensorflow api로 효율적인 변환과 학습이 가능하도록 진행됩니다. 이 과정에서 학습에 필요한 전처리인 scaling(1/255.)과 resize(실험게획서에 기입된 resize_shape
parameter)를 진행합니다.
Split train/validation data
dataset을 학습과 검증 데이터로 분리합니다. 전체 데이터 중 80% 데이터를 학습용, 20%의 데이터를 검증용으로 임의 샘플링합니다. 이를 통해 학습 과정에서 학습 데이터에 대해서만 성능이 우수하고 신규 데이터에 대해 성능이 저조해지는 과최적화 현상을 예방할 수 있습니다.
Add data augmentation
실험계획서에 기업된 방식으로 데이터 증강을 진행합니다. 현재 RandAugment(논문) 기법을 지원하고 있으며, 과제마다 적합하지 않은 변환은 제외하여 증강할 수 있습니다. RandAugment 기법에서 증강 강도와 한 이미지 당 변환 수를 바꾸고 싶은 분은 train step의 parameter인 aug_magnitude(강도, 010)와 num_aug(변환 수, 116)를 설정할 수 있습니다. 이 기능을 사용하기 위해서는 rand_augmentation을 True로 설정해주세요.
RandAugment 기법은 원본 이미지에 대해 총 16가지 변환에 대해 임의로 num_aug 수 만큼 변환을 적용하는 증강 방법입니다. AI 모델의 성능을 올리기 위해서는 다양한 환경에서 취득된 데이터가 필요하지만 이는 비용이 많이 필요한 작업이기 때문에 증강을 통해 학습 데이터의 다양성을 확보하고 신규 이미지에 대한 추론 성능을 올릴 수 있습니다. 이 때 증강 이미지에 대한 라벨은 원본 이미지의 라벨을 사용하게 됩니다. 특히 관리가 잘 되어있어 불량율이 적은 공정에서는 자연스럽게 불량 제품 데이터가 양품 제품 데이터보다 적은 경우가 많은데, 불량 제품 데이터에 대한 증강을 통해 모델의 불량 판정 능력을 향상시킬 수 있습니다.
하지만 제조업의 검사 공정과 같이 사진 품질이 일정한 경우 flip이나 rotation과 같은 변환이 유형에 영향을 끼쳐 성능이 하락할 수 있습니다. 예를 들어 불량 판정에 있어서 제품의 위아래가 중요한 경우 위아래 뒤집어진 불량 데이터에 대해 상하 flip 변환하여 해당 데이터를 학습하게 되면 이미지에서는 정상 데이터처럼 보이지만 학습할 때는 불량 라벨로 학습하게 됩니다. 이런 경우를 예방하기 위해 솔루션 개발자는 미리 유형에 대해 알아보고 특정 증강 변환이 유형을 바꾸지는 않은지 확인하고 해당 방법에 대해서는 임의 변환에서 제외해야 합니다.
만약 유형 별 데이터 수가 풍부한 경우에는 증강기법 자체를 사용하지 않은 것도 방법입니다. 이 경우 rand_augmentation
을 False로 두면 증강을 수행하지 않습니다.
다음 표는 rand augmentation을 수행할 경우 어떤 방식으로 변환이 진행되는지 예시입니다.
num_aug=2(default)인 경우
index | image_path | label | 1st. augmentation | 2nd augmentation |
---|---|---|---|---|
1 | OK_image1.jpg | OK | color | autocontrast |
2 | NG_image1.jpg | NG | invert | color |
3 | OK_image2.jpg | OK | sherX | posterize |
... | ... | ... | ... | ... |
Initialize model
실험계획서에 기입된 model_type
에 따라 mobilenetv1이나 high_resolution 모델을 생성합니다. mobilenetv1은 학습 안정성과 메모리와 추론 속도가 검증된 모델로 다양한 과제에 활용이 가능한 모델입니다. high_resolution 모델의 경우 고급데이터분석가가 CBAM(Convolutional Block Attention Module, 논문)과 을 개량하여 mobilenetV3-Small를 기반으로한 고해상도 모델입니다. 고해상도 이미지의 경우 이미지 해상도가 높아서 학습 시간이 오래걸리고 추론 시간도 다소 소요될 수 있어 학습/추론 비용이 많이 필요하지만, mobilenetV3-Small를 ECA layer(논문)로 개량하고 Spatial-Attention을 효과적으 로 적용하여 성능과 리소스 모두 확보했습니다.
Fit model on training data
학습/검증 데이터셋에 대해 정해진 횟수(epochs
)만큼 학습을 진행합니다. 과최적화를 막기 위해 학습 과정에서 checkpoint를 저장하여 validation data에 대한 loss가 가장 적은 모델이 저장되어, 추론에 사용됩니다.
Evaluate score and save outputs
검증 데이터셋에 대해 유형 별로 accuracy, precision, recall, f1-score를 계산하고 성능에 대한 요약정보(eval.json)가 저장됩니다. 학습한 모델을 이용하여 학습/검증 데이터셋에 대한 추론 결과(prediction.csv)가 저장되고 학습/검증 데이터셋에 대해 True class와 prediction class으로 구성된 confusion matrix(confusion.csv)도 저장됩니다. 마지막으로 Edge Application에서 확인할 수 있도록 inference_summary.yaml를 저장합니다.
다음과 같은 형태입니다.
Table 1. prediction.csv(라벨 구성이 OK, NG인 경우)
index | image_path | label | pred_label | prob_OK | prob_NG | uncertainty |
---|---|---|---|---|---|---|
1 | OK_image1.jpg | OK | OK | 0.9 | 0.1 | 0.5 |
2 | NG_image1.jpg | NG | NG | 0.15 | 0.85 | 1.0 |
3 | OK_image2.jpg0 | OK | OK | 0.6 | 0.4 | 0.2 |
... | ... | ... | ... | ... | ... | ... |
Table 2. confusion.csv
||OK|NG| |---|---| |OK|10|1| |NG|0|10|
Table 3. eval.json
precision | recall | f1-score | support | |
---|---|---|---|---|
OK | 0.50 | 1.00 | 0.67 | 1 |
NG | 1.00 | 0.67 | 0.80 | 4 |
accuracy | 0.60 | 5 | ||
macro avg | 0.50 | 0.56 | 0.49 | 5 |
weighted avg | 0.70 | 0.60 | 0.61 | 5 |
Table 4. inference_summary.yaml For single image,
{
result: 'OK', # predicted label
score: 0.8, # 1 - uncertainty
}
For multiple images,
{
result: 'OK: 12, NG: 3', # value counts of predicted label
score: 0.9, # 1 - mean of uncertainties of inference data
}
Inference pipeline: Input asset
Read Inference file or generate it
추론 데이터에 대한 정보가 파일로 있는 경우 추론 파일을 읽고, 만약 데이터 없이 이미지만 있는 경우 경로에서 추론 파일을 생성합니다.
Inference pipeline: Inference asset
Load image file
전달 받은 추론 파일 내 image_path에 있는 데이터로부터 이미지를 메모리에 올려 dataset object를 생성하여 추론합니다. 이 때 실험계획서의 do_xai를 True로 지정하는 경우 XAI 결과가 합성된 이미지가 원본 파일명_xai_class{유형명}.png형태로 저장됩니다. 만약 xai_class를 지정할 경우 특정 유형에 대한 XAI 이미지를 저장할 수 있습니다. do_xai가 False인 경우 원본 이미지를 학습에 적합한 형태로 resize하여 파일명.png형태로 저장됩니다.
Predict label
do_xai가 True인 경우 xai를 수행하기 위해 keras(h5) 모델이 로드되고 do_xai가 False인 경우 빠르게 추론하기 위해 tensorflow-lite(tflite) 모델이 로드됩니다. 현재 SEH에서 ALO에서 추론 시간이 1초정도 소요됩니다.
Save outputs
추론 파이프라인에서의 산출물은 학습과 마찬가지 구성입니다. 만약 label 정보가 없는 경우 eval.json과 confusion.csv결과는 저장되지 않습니다.
Inference pipeline: Output asset
infernece summary 수정
각 도메인의 Solution에 맞게 inference summary를 수정할 수 있습니다.
VC Version: 1.5.1