ecole42

leaffliction

leaffliction은 ecole42의 컴퓨터 비전 프로젝트로, 딥러닝을 활용하여 사과와 포도의 잎 이미지에서 질병을 자동으로 분류하는 시스템. CNN(Convolutional Neural Network) 모델을 사용하여 다양한 잎 질병을 인식하고 분류하며, 데이터 증강, 이미지 전처리, 모델 학습 및 평가 파이프라인을 구현한다. PyTorch를 사용하여 CNN 모델을 학습하고 TensorBoard로 학습 과정을 시각화한다

Python
PyTorch
CNN
Computer Vision
Deep Learning

개요

leaffliction은 식물 잎 이미지 분석을 통한 질병 인식을 위한 컴퓨터 비전 프로젝트다. 이 프로젝트는 딥러닝을 활용하여 사과와 포도의 잎 이미지에서 질병을 자동으로 분류하는 시스템이다. CNN(Convolutional Neural Network) 모델을 사용하여 다양한 잎 질병을 인식하고 분류한다.

주요 기능

  • 데이터셋 다운로드 및 분석: 잎 이미지 데이터셋을 다운로드하고 클래스별 분포를 시각화
  • 데이터 증강: 불균형한 데이터셋을 자동으로 증강하여 균형 잡힌 데이터셋 생성
  • 이미지 변환: 다양한 이미지 전처리 및 변환 기법 제공
  • 모델 학습: CNN 모델을 학습하여 잎 질병 분류
  • 예측: 학습된 모델을 사용하여 새로운 이미지의 질병 예측

지원하는 질병 클래스

  • 사과 (Apple): 건강한 잎, 검은 썩음병, 녹병, 겹무늬병
  • 포도 (Grape): 건강한 잎, 검은 썩음병, Esca, 반점병

설치 방법

요구사항

  • Python 3.x
  • PyTorch
  • 기타 의존성 패키지 (requirements.txt 참조)

설치 단계

  1. 저장소 클론:
git clone <repository-url>
cd leaffliction
  1. 가상환경 생성 및 활성화:
python -m venv venv
source venv/bin/activate  # Windows: venv\Scripts\activate
  1. 의존성 설치:
pip install -r requirements.txt

사용 방법

1. 데이터셋 다운로드 및 분포 확인

데이터셋을 다운로드하고 클래스별 이미지 분포를 시각화한다.

# 데이터셋 다운로드 및 분포 차트 생성
python 01.Distribution.py apple grape

이 명령은 다음을 수행한다:

  • 데이터셋이 없으면 자동으로 다운로드 및 압축 해제
  • 사과와 포도 클래스별 이미지 분포를 파이 차트와 막대 그래프로 시각화
  • apple_combined_chart.pnggrape_combined_chart.png 파일 생성

2. 데이터 증강

불균형한 데이터셋을 자동으로 증강하여 각 클래스의 이미지 수를 균형있게 맞춘다.

# 불균형한 이미지 데이터셋 자동 증강
python 02.Augmentation.py

증강 기법:

  • 수평 뒤집기 (Horizontal Flip)
  • 회전 (Rotation, 10-180도)
  • 원근 변환 (Perspective Transformation)
  • 밝기 조정 (Brightness Adjustment)
  • 대비 조정 (Contrast Adjustment)
  • 채도 조정 (Saturation Adjustment)

출력 예시:

Auto image augmentation...

Augmenting "Apple" images...
========================
Summary of augmentation:
========================
/Users/woolim/Documents/leaffliction/images/Apple_scab: 629 -> 1640
/Users/woolim/Documents/leaffliction/images/Apple_healthy: 1640 -> 1640
/Users/woolim/Documents/leaffliction/images/Apple_rust: 275 -> 1640
/Users/woolim/Documents/leaffliction/images/Apple_Black_rot: 620 -> 1640

Augmenting "Grape" images...
========================
Summary of augmentation:
========================
/Users/woolim/Documents/leaffliction/images/Grape_Esca: 1382 -> 1382
/Users/woolim/Documents/leaffliction/images/Grape_healthy: 422 -> 1382
/Users/woolim/Documents/leaffliction/images/Grape_Black_rot: 1178 -> 1382
/Users/woolim/Documents/leaffliction/images/Grape_spot: 1075 -> 1382

3. 증강 후 분포 확인

증강 후 데이터셋이 균형있게 분포되었는지 확인한다.

python 01.Distribution.py apple grape
apple beforeapple after
grape beforegrape after

4. 이미지 변환 시각화

이미지에 다양한 변환 기법을 적용하여 결과를 시각화한다.

# 단일 이미지 변환 시각화
python 03.Transformation.py -src [IMAGE_PATH]

# 디렉토리 내 모든 이미지에 변환 적용
python 03.Transformation.py -src [SRC_PATH] -dst [DST_PATH] -mask -gaussian

지원하는 변환 기법:

  • -gaussian / --gaussian_blur: 가우시안 블러
  • -mask: 마스크 변환 (잎 영역만 추출)
  • -roi / --roi_objects: ROI 객체 변환
  • -analyze / --analyze_object: 객체 분석 변환
  • -pseudo / --pseudolandmarks: 의사 랜드마크 변환
  • -hist / --color_histogram: 컬러 히스토그램 변환
image transformedimage transformed

5. 모델 학습

CNN 모델을 학습시킨다.

python train.py

하이퍼파라미터:

  • 학습률 (Learning Rate): 0.01
  • 배치 크기 (Batch Size): 256
  • 에포크 수 (Epochs): 10
  • 옵티마이저: Adam
  • 손실 함수: CrossEntropyLoss

학습 과정:

  • 데이터셋을 80% 학습용, 20% 검증용으로 분할
  • 각 에포크마다 학습 손실과 검증 손실 기록
  • 검증 손실이 개선될 때마다 모델 저장
  • TensorBoard를 통한 학습 과정 시각화

6. 이미지 예측

학습된 모델을 사용하여 단일 이미지의 질병을 예측한다.

python predict.py [image_path]

출력:

  • 원본 이미지와 변환된 이미지를 나란히 표시
  • 예측된 질병 클래스 표시

7. 모델 정확도 평가

검증 데이터셋에 대한 모델의 정확도를 평가한다.

python 04.Classification.py

출력 예시:

Validation Progress: 100%|███████████████████████████████████████████| 10/10 [01:10<00:00,  7.01s/it]
Accuracy of the model on the validation set: 92.31%

모델 아키텍처

LeafClassifier는 다음과 같은 CNN 구조를 사용한다:

Input: (256, 256, 3)
  ↓
Conv2d(3 → 32, kernel=3) + ReLU + MaxPool2d
  ↓
Conv2d(32 → 64, kernel=3) + ReLU + MaxPool2d
  ↓
Conv2d(64 → 128, kernel=3) + ReLU + MaxPool2d
  ↓
Conv2d(128 → 256, kernel=3) + ReLU + MaxPool2d
  ↓
Flatten: (256 * 14 * 14)
  ↓
Linear(256 * 14 * 14 → 512) + ReLU + Dropout(0.5)
  ↓
Linear(512 → NUM_CLASSES)
  ↓
Output: 질병 클래스 예측

TensorBoard 시각화

학습 과정을 TensorBoard로 시각화할 수 있다.

tensorboard --logdir runs

브라우저에서 http://localhost:6006으로 접속하여 학습 과정을 확인할 수 있다.

Train lossTrain vs Validation Loss

프로젝트 구조

leaffliction/
├── 00.init.sh              # 초기화 스크립트
├── 01.Distribution.py      # 데이터셋 다운로드 및 분포 분석
├── 02.Augmentation.py      # 데이터 증강
├── 03.Transformation.py    # 이미지 변환
├── 04.Classification.py    # 모델 정확도 평가
├── train.py                # 모델 학습
├── predict.py              # 이미지 예측
├── model.py                # 모델 정의
├── requirements.txt        # 의존성 패키지 목록
├── lib/
│   ├── images.py          # 이미지 처리 유틸리티
│   ├── transformation.py  # 이미지 변환 클래스
│   └── print.py           # 출력 유틸리티
├── demo/                   # 데모 이미지
├── test_images/            # 테스트 이미지
└── runs/                   # TensorBoard 로그

주요 파일 설명

model.py

  • LeafClassifier: CNN 모델 정의
  • 데이터셋 로딩 및 전처리 파이프라인

train.py

  • 모델 학습 로직
  • TensorBoard 로깅
  • 모델 체크포인트 저장

predict.py

  • 단일 이미지 예측
  • 결과 시각화

lib/images.py

  • 이미지 분석 및 증강 함수
  • 데이터셋 다운로드 URL 정의

lib/transformation.py

  • PlantCV를 사용한 고급 이미지 변환
  • 마스크 생성 및 객체 분석

테스트

프로젝트에는 테스트 이미지가 포함되어 있다:

# 단일 이미지 예측 테스트
python predict.py test_images/Unit_test1/Apple_healthy1.JPG

# 전체 검증 세트 정확도 평가
python 04.Classification.py

참고 자료

라이선스

이 프로젝트는 교육 목적으로 제작되었다.