본문 바로가기
인공지능(AI)

딥러닝으로 병든 농작물 분류하는 웹앱 만들어보기

by 친절한에릭 2023. 3. 6.

 

 

딥러닝 케라스 framework를 이용하여 병든 농작물을 분류해 내는 딥러닝 모델을 만들어 보고 이를 응용하여 웹 앱 제작까지 해보겠습니다.

 

아래는 미리 만들어둔 후추 잎의 감염 여부를 판정하는 웹 어플리케이션입니다. gradio 라는 툴을 이용하면 편리하게  아래와 같은 web application 제작이 가능합니다.

 

 

모델 생성을 위한 개발 환경은 코랩에서 진행하도록 할게요.

 

Colab 은 브라우저 내에서 Python 스크립트를 작성하고 실행할 수 있습니다. 무료 GPU 를 통해  간편하게 딥러닝 코드를 실행해 볼  수 있습니다.  아래 사이트에서 실행이 가능합니다.

https://colab.research.google.com/

 

Google Colaboratory

 

colab.research.google.com

 

 

미리 준비해 놓은 데이터셋을 로드합니다. dataset은 kaggle PlantVillage Dataset 을 이용했습니다.

 

https://www.kaggle.com/datasets/emmarex/plantdisease

 

PlantVillage Dataset

Dataset of diseased plant leaf images and corresponding labels

www.kaggle.com

 

이번 프로젝트에서는 정상 후추잎과 감염된 후추잎을 분류하는 모델을 학습 시켜 생성해 보도록 하겠습니다.

 

구글드라이브에 미리 데이터를 미리 복사해 놓습니다.

 

  • 정상 샘플 데이터셋 : "Pepper__bell___healthy"  ==> "drive/MyDrive/dataset/pepper/dataset/train/healthy/"
  • 감염된 샘플 데이터셋 : "Pepper__bell___Bacterial_spot"  ==> "drive/MyDrive/dataset/pepper/dataset/train/infected/"

분류할 class 명은 아래와 같습니다.

 

('healthy', 'infected')

 

딥러닝 코드를 실행하기 위한  라이브러리를 import 합니다.

import gradio as gr
import tensorflow as tf
import numpy as np
from PIL import Image
import requests
from io import BytesIO
from tensorflow import keras
from tensorflow.keras import layers

 

dataset 을 포함하고 있는 google driver를  mount 합니다.

from google.colab import drive
drive.mount('/content/drive')

 

우선 학습에 방해가 되는 데이터셋 중에 corrupt 되어 있는 이미지들을 제거합니다.

import os

num_skipped = 0
for folder_name in ("healthy", "infected"):
    folder_path = os.path.join("drive/MyDrive/dataset/pepper/dataset/train/", folder_name)
    for fname in os.listdir(folder_path):
        fpath = os.path.join(folder_path, fname)
        try:
            fobj = open(fpath, "rb")
            is_jfif = tf.compat.as_bytes("JFIF") in fobj.peek(10)
        finally:
            fobj.close()

        if not is_jfif:
            num_skipped += 1
            # Delete corrupted image
            os.remove(fpath)

print("Deleted %d images" % num_skipped)

 

이미지 사이즈와 배치 사이즈를 지정해 주고 저장소에서  학습 데이터셋과 검증 데이터셋을 각각  로드합니다.

 

배치 사이즈를 지나치게 크게 잡아줄 경우 GPU 메모리 full 에러가 발생할 수 있으니 적절한 사이즈를 설정해주세요.

 

image_size = (256, 256)
batch_size = 64

train_ds, val_ds = tf.keras.utils.image_dataset_from_directory(
    "drive/MyDrive/dataset/pepper/dataset/train/",
    validation_split=0.2,
    subset="both",
    seed=1337,
    image_size=image_size,
    batch_size=batch_size,
)

 

To be continued

댓글