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



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





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



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



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

FN : 양품이라고 예측했는데 실제 불량인 경우
y (파일이름) 를 보면 알고리즘이 잘 동작하고 있지 않음을 확인할 수 있다.
'파이썬 > 머신러닝,딥러닝' 카테고리의 다른 글
| 인공신경망에서 원-핫 인코딩 (0) | 2022.09.05 |
|---|---|
| [Project] 의류직물 불량검출을 위한 이미지 분석 - 프로그램 전달하기 (0) | 2022.08.18 |
| RNN 을 이용한 주식가격 예측 (0) | 2022.08.08 |
| keras evaluate () (0) | 2022.07.28 |
| 특성 추출을 위한 3 가지 방법 (0) | 2022.06.20 |