머신러닝

스마트폰 촬영 데이터를 사용한 식물 Fresh/Wilt 판별 Keras 학습 코드 작성

coding art 2021. 9. 17. 17:41
728x90

http://blog.daum.net/ejleep1/1034 :Keras에 디펜바키아 Fresh/Wilt 학습 판정 블로그를 참조 후 읽어 보도록 하자.

Keras에 의한 공기정화식물의 건강상태 이미지 학습 코드를 작성하기 위해서 건강 상태 별로 사진 이미지를 저장하기 위한 폴더들의 경로를 정확하게 설정하자. 현재 Dataset 폴더에는 공기정화식물의 두 종류의 대비되는 상태 즉 싱싱한(Fresh) 상태와 시들시들(Wilt)한 상태의 이미지를 각각 10개씩 포함하는 폴더들이 들어 있다.

이 이미지들은 VGA 해상도 기준 즉 640X480 기준으로 비슷비슷하지만 같지는 않다. 하지만 Keras에서 입력하는 과정에서 자동적으로 (224, 224)로 처리하게 된다. 아래와 같은 해상도라면 입력 데이터로 포함해도 무방하다. 스마트폰 기본 해상도인 4,128X2,322 수준의 해상도 의 이미지가 얻어지는데 그대로 사용해도 문제가 되지는 않으나 특정 비율로 해상도를 강제로 바꾸는 경우 학습하고자 하는 데이터의 특징을 제대로 반영하지 못할 수도 있음에 유의하자. 그래도 예전 MNIST 예제에서 사용하는 (28,28) 해상도와 비교하면 상당히 고해상도이다. 물론 고해상도가 좋긴 하나 수많은 이미지들을 대상으로 CNN 처리를 위해서는 컴퓨팅 시간 부담이 급증할 수 있으므로 image classification에서 보편적으로 많이 사용되는 (224, 224) 해상도면 충분하다. 그림판에서 아래처럼 디펜바키아 이미지의 해상도를 조사해보자.

실제 640X360 이미지를 224X224 해상도로 처리한 아래 이미지에서 보듯이 가급적이면 처음부터 가로 세로 비율을 거의 1:1로 조정해 두는 것이 최선으로 볼 수 있을 것이다.

이미지 데이터 폴더의 위치를 나타내는 data_root str() 함수를 사용하여 문자열로 변환해 둔다. 아울러 학습 처리를 위한 데이터 생성을 위한 kew word arguments들로서 축척과 모델의 테스를 위한 샘플 수와의 비율을 설정한다.

축척은 이미지 데이터의 픽셀 값들이 0~255 사이의 값을 취하므로 255 로 나누어서 0.0~1.0 사이의 값으로 만들도록 하자.

간단한 파이선 코드를 사용하면 jpg 확장자 이미지 파일의 List 데이터 구조의 픽셀 값을 읽어 볼 수 있다. 만약 이미지 파일이 png 파일이라면 List 데이터 구조의 픽셀 값이 jpg 3개와 달리 하나가 추가된 4개의 요소로 구성된다. 4번째 요소는 투명도(opacity)를 나타낸다.

validation_split = 0.2 는 주어진 샘플 수의 80%는 학습에 20%는 테스트용으로 처리함을 뜻한다.

 

Keras 라이브러리 루틴 tf.keras.preprocessing.image.Image.DataGenerator를 사용하도록 하자. 참고로 사용자가 준비한 arguments들에 대해서 사용자가 정의한 함수나 메소드라면 *args를 사용하면 되겠지만 이 루틴이 텐서플로우 측에서 제공하는 공식 라이브러리 루틴이므로 key word arguments 들을 dict() 명령을 사용하여 설정한 후 **datagen_kwargs를 사용하도록 한다. 현재의 코드에서 kew word arguments 로서는 축척과 학습 대비 테스트 샘플 수와의 비율만이 사용되었고 나머지는 모조리 Default 처리 된다.

루틴 tf.keras.preprocessing.image.Image.DataGenerator(**datagen_kwargs)와 접목되는 flow_from_directory() 루틴은 data_root에서 지정된 경로 속에 포함된 2종류의 이미지 데이터 폴더들을 대상으로 (여기서는 Fresh Wilt 가 대상) 랜덤 셔플링 후(shuffle=True) 앞서 지정된 해상도 즉 IMAGE_SHAPE을 사용하여 학습용 데이터와 테스트용 데이터를 준비하게 된다. 폴더 속에 준비된 이미지 파일들의 해상도 크기가 제각각인 점을 고려하면 일정한 크기의 해상도로 잘라서 만든다고 보면 될 것이다. 이러한 점을 잘 이해해야 이미지 데이터를 준비함에 있어 특징(feature)을 잃지 않도록 주의해야 할 것이다.

 

텐서플로우 2.0 버전 사용이 이루어진 2020년 이전의 텐서플로우에서 MNIST 예제를 처리하기 위한 과정에서 살펴보면 머신 러닝에서 중요한 업적을 남긴 LeCUN 의 인터넷 홈페이지에 60,000개의 이미지 데이터를 그대로 가져다 쓸 수 있도록 준비가 잘되어 있었으나 지금은 사용자 스스로가 준비하는 임의 사이즈 크기의 이미지 데이터를 처리할 수 있도록 적절한 텐서플로우의 Keras 명령들이 제공되고 있다.

 

Blog Reference

How to do Image Classification on custom Dataset using TensorFlow

https://medium.com/analytics-vidhya/how-to-do-image-classification-on-custom-dataset-using-tensorflow-52309666498e

 

Keras 코드

https://github.com/aryan109/medium/blob/master/Custom_Image_Classification/Custom_image_clasification.ipynb