Computer Science/DL, ML

CNN(VGG-16)을 활용한 불량품 검출(Defects Detection) 분류 모델

TwinParadox 2020. 1. 19. 21:59
728x90

CNN을 활용해서 어떤 제품의 이미지를 보고 불량인지 정상품인지 분류하는 모델을 만들어봤다.

 

활용 데이터셋

원래의 데이터셋(NEU Surface Defect DB)은 크랙, 기름때, 스크래치 같은 다양한 종류의 열연강판에 대한 불량품들만 모아놓은 데이터셋이다. 여기서 멀쩡한 부분들만 잘라서 분류해놓은 데이터셋을 활용했다. 총 1344장의 이미지가 있고, 정상은 952장 불량은 392장으로 이루어져 있다. 클래스 비율에 맞춰 8:1:1 비율로 train, validation, test를 나눴다.

https://github.com/kazenokizi/defect_classification/blob/master/data.rar

 

 

모델 구현

케라스를 활용했는데, 직접 레이어를 쌓지 않고 VGG16의 Weight를 가져오고 마지막의 classification을 위해서 Fully-Connected Layer만 수정해주는 작업을 거쳤다. 최초에 활용하던 책에 있던 내용 그대로 코드를 적용시키면서 Learning Rate를 2e-5로, Optimizer를 RMSprop로 두고 학습을 진행했는데 train set accuracy가 validation set accuracy보다 낮게 나오는 경향을 보였다.

 

 

Train, Validation Accuracy & Loss

보통의 경우 train에 대한 accuracy가 validation에 대한 accuracy보다 높다. 그런데 validation이 더 높게 나오는 상황은 validation에 문제가 있는 것일 수 있다. 원인을 찾아봤다. Data Augmenatation 부분이 문제였다. 초기에 train에 대해서만 Data Augmentation을 다양하게 넣어줬는데, 이것이 train의 분류 난이도를 높여 validation 문제가 상대적으로 쉬워져서 발생한 문제였다.

 

validation set이 train set보다 복잡하지 않으면 이런 역전 현상이 발생하는데 Data Augmentation을 train set에 대해서만 Augmentation을 진행해서 발생한 문제였다. 그래서 이 문제를 수정하고 Data Augmentation을 두 데이터셋에 모두 적용해서 train, validation 결과를 보니 이상적인 결과가 나왔다. 이후에, Optimizer를 Adam으로 바꾸고, Learning Rate도 조금 변경해봤다.

 

 

train, validation accuracy & loss

 

최종 결과

Test로 최종적으로 확인한 결과 100% 맞추는 가히 기적적인 결과가 나온다. validation loss가 지나치게 튀는 부분이나 이런 것들은 조금 더 파악을 해봐야 하겠지만, 일단 데이터 자체가 적은 편이었고 

 

Accuracy 1.0

 

 

수행 결과물 Repository

https://github.com/Twinparadox/Defects-Detection

 

 

회고

지금까지 딥러닝이라고 하면 CNN이나 GAN이나 이런저런 프로젝트들을 github에서 끌어와서 돌려본 것들이 전부여서 이렇다 할 문제 해결 과정을 거쳐본 적이 없었다. 이번 과제를 수행하면서, 다양한 오류와 문제점들을 마주할 수 있어 매우 좋았다. 문제를 해결한 것도 있고, 이렇다 할 해결 방법 없이 회피한 것도 있어서 해결해야 할 과제들이 남아 있긴 하지만, 꽤나 의미 있는 과제였다.

 

 

Reference

더보기
728x90