본문 바로가기

파이썬/머신러닝,딥러닝

[Project] 의류직물 불량검출을 위한 이미지 분석 - 실행 가능성 확인


제조공정 분야

01. 공정 검사의 현재
02. 공정 검사와 딥러닝
03. 딥러닝 실무 개요
04. 실습 환경 준비
05. 문제 정의하기
06. 스펙 결정하기
07. 실행 가능성 확인하기 - 1
08. 실행 가능성 확인하기 - 2
09. 알고리즘 설계하기
10. 데이터 정리하기
11. 모델 학습 및 검증하기 - 1
12. 모델 학습 및 검증하기 - 2
13. 프로그램 전달하기 - 1
14. 프로그램 전달하기 - 2

 


02. 공정 검사와 딥러닝

 

 

03. 딥러닝 실무 개요

 

 

04. 실습 환경 준비

 

 

DataSet 불러오기

random.seed(0)

defect_list = glob.glob(PATH_DEFECT + '*.png')     # PATH 폴더에 png 파일들의 이름만 defect_list에 리스트에 저장된다.
mask_list = glob.glob(PATH_MASK + '*.png')
pass_list = glob.glob(PATH_NODEFECT + '**/*.png')

# Match defect-mask pairs
new_defect_list = list()
new_mask_list = list()
for defect in defect_list:
    num = defect.split('/')[-1].split('_')[0]
    for mask in mask_list:
        num_mask = mask.split('/')[-1].split('_')[0]
        if num == num_mask:
            new_defect_list.append(defect)
            new_mask_list.append(mask)
            break
defect_list = new_defect_list
mask_list = new_mask_list​

 

 

 

05. 문제 정의하기

 

 

06. 스펙 결정하기

 

 

06.스펙 결정하기

 

 

06. 스펙 결정하기

 

 

06. 스펙 결정하기

 

 

이 때의 positive 는 불량품을 의미 한다 !!

 

 

 

06. 스펙 결정하기

 

 

07.실행 가능성 확인하기 - 1

 

07.실행 가능성 확인하기 - 1

 

glob 함수에 대해

ok_list = glob.glob(DATASET_OK_PATTERN)
print(ok_list)   # list 형태로 파일을 이름 저장해준다.

 

 

OK, FAIL 데이터셋 생성하기

# ok 데이터셋 생성하기

ok_list = glob.glob(DATASET_OK_PATTERN)
ds_ok = tf.data.Dataset.list_files(ok_list)   # ok 에 대한 데이터셋 만들기
ds_ok_label = tf.data.Dataset.from_tensor_slices([0] * len(ok_list))     # 데이터셋에 레이블 추가하기 
# ok 레이블을 0 으로 지정
# ok 길이만큼 0 을 반복한다.

ds_ok = ds_ok.map(preprocess)  # preprocess 함수를 매핑시키기
# ok_list 파일 이름들을 하나씩 출력으로 바뀌어서 나오게끔

ds_ok = tf.data.Dataset.zip((ds_ok, ds_ok_label))  # label 데이터셋과 함께 zip을 해준다. 
# 원래 데이터셋은 이미지만 출력이지만 zip 함수를 통해 label 도 같이 출력되도록 한다.



# fail 데이터셋 생성하기
fail_list = glob.glob(DATASET_FAIL_PATTERN)
ds_fail = tf.data.Dataset.list_files(fail_list)
ds_fail_label = tf.data.Dataset.from_tensor_slices([1] * len(fail_list))  # fail 레이블을 1 으로 지정

ds_fail = ds_fail.map(preprocess)
ds_fail = tf.data.Dataset.zip((ds_fail, ds_fail_label))

ds = tf.data.Dataset.concatenate(ds_ok, ds_fail)  # concatenate 을 사용하여 ok 와 fail 을 붙여준다.​

 

단순한 모델 설정

def Model():
    return Sequential([Conv2D(32, (3, 3), activation='relu', input_shape=(256, 256, 1)), #tensorflow 버전업으로 코드 변경
                       MaxPool2D(),
                       Conv2D(64, (3, 3), activation='relu'),
                       MaxPool2D(),
                       Conv2D(128, (3, 3), activation='relu'),
                       MaxPool2D(),
                       Conv2D(256, (3, 3), activation='relu'),
                       MaxPool2D(),
                       Flatten(),
                       Dense(1, activation='sigmoid')])  # 이진 분류이므로 시그모이드 함수 사용

 

모델 생성 및 학습

model = Model()
model.compile(optimizer='adam',
              loss='binary_crossentropy',
              metrics=['accuracy'])
model.fit(ds_train, validation_data=ds_valid, epochs=EPOCHS)

 

 

결과를 이미지로 저장

 

  • Ok 레이블을 0 으로 지정
  • Fail 레이블을 1 으로 지정

 

def mkdir(path):
    if os.path.exists(path) is False:  
        os.mkdir(path)   

mkdir(RESULT_SAVE_PATH)   # 폴더 생성
mkdir(RESULT_SAVE_PATH + '/TP')   # True Positive
mkdir(RESULT_SAVE_PATH + '/TN')
mkdir(RESULT_SAVE_PATH + '/FP')
mkdir(RESULT_SAVE_PATH + '/FN')

index = 0
for imgs, labels in ds_valid:  # valid 데이터셋을 순회한다.
    preds = model.predict(imgs)  # predict 함수를 이용하여 모델 결과를 뽑아준다.
    for idx in range(imgs.shape[0]):  # 배치 사이즈
        gt = labels[idx].numpy()   
        y = preds[idx]  # y 출력
        
        if gt == 1 and y > 0.5:    # 1 이면 True Positive
            path = RESULT_SAVE_PATH + '/TP'
        elif gt == 1 and y <= 0.5:    
            path = RESULT_SAVE_PATH + '/FN'
        elif gt == 0 and y > 0.5:  # 정답이 0 인데 y 가 0.5 보다 크면 FP
            path = RESULT_SAVE_PATH + '/FP'
        else:
            path = RESULT_SAVE_PATH + '/TN'
            
        cv2.imwrite(path + '/%.4f_%04d.png' % (y, index), imgs[idx].numpy() * 255)  # y : 점수 와 인덱스를 파일 이름으로 지정
        index +=1

 

 

12. 모델 학습 및 검증하기 - 2

 

12. 모델 학습 및 검증하기 - 2

 

12. 모델 학습 및 검증하기 - 2

TN : 양품이라고 예측했는데 실제 양품인 경우

 

 

12. 모델 학습 및 검증하기 - 2

FN : 양품이라고 예측했는데 실제 불량인 경우

 

 

 

y (파일이름) 를 보면 알고리즘이 잘 동작하고 있지 않음을 확인할 수 있다.