AI/TensorFlow 학습

26. TensorFlow 2.x - Surface Crack Detection 예제

된다잘된다 2024. 8. 30. 13:11

참고: https://youtu.be/p_3iJ035Q_Q?si=oXCT9hZFbViAjLVz

 

 

이번 예제는 Kaggle에서 제공하는 콘크리트가 갈라진 사진들을 이용해서 이를 deep learning 모델에 훈련시켜 알아서 인식하도록 하는 예제이다. 

dataset은 https://www.kaggle.com/datasets/arunrk7/surface-crack-detection 에서 다운받을 수 있고,

파일 이름이 archive.zip인데 인식하기 편하게 content폴더 아래 surface_crack.zip으로 변경하여 사용하였다.

 

content 폴더 아래 surface_crack.zip을 저장하고, 코드로 압축을 풀면 surface_crack 폴더가 위 처럼 생성된다.그렇지만 좀더 학습을 쉽게하기 위해서 negative와 positive 아래 있는 이미지들을 학습용(train)과 시험용(test)으로 나누어 폴더를 만들고 저장하려고 한다.

 

 

위 코드를 실행하면, test, train 폴더가 생성되고 그 하위에 Negative, Positive 폴더가 각각 생성되며,

test에는 전체 이미지의 80%, train에는 20%가 저장된다.

 

ImageDataGenerator()를 이용하여 이미지들을 정규화하고 학습용 이미지를 검증용으로 또 나눈다.

여기서, 원본이미지가 224x224 이미지이지만 128x128로 변환한 것은 컴퓨팅 자원이 부족하게 될 경우를 대비한 것이다. 

 

학습용 이미지들을 일부 읽어서 그림을 확인하면 위와 같다. Positive가 갈라짐이 있는 이미지들이고, Negative가 갈라짐이 없는 이미지들이다.

 

위 슬라이드와 같이 일반적인 CNN 구조를 가진 모델을 구성하였다.

출력층에서 Dense layer를 2개, 그 사이에 Dropout을 overfitting을 줄이기 위해서 사용하였다.

 

컴파일에서 최적화 함수 Adam의 인수를 보면 default 값인 1e-3보다 1/10인 1e-4를 사용하여 학습된 결과를 천천히 반영하도록 하였다.  학습 초기 정확도 자체가 97%로 상당히 높고, 끝에서는 99.7%까지 나왔다.

 

시험용 데이터를 사용했을때도 99.6%의 정확도를 보였다.

 

차트로 나타내보면 아래와 같다.

 

overfitting도 별로 없고, 잘 된 학습으로 보인다.

 

다음 글에서는 역시 Kaggle에서 제공하는 뇌종양 사진을 보고 판독을 추론하는 예제를 해보도록 하자.