Skip to content

K-tuna/FarmSecurity

 
 

Repository files navigation

📘 프로젝트 소개

🔔 프로젝트 주제

🍎 AI를 이용한 농작물 피해 완화 시스템

🔰 개발 배경

img1

📁 [표 1] : 동물별 농작물 피해실태(환경부 생물다양성과/연도별 유해생물에 의한 피해현황(2014~2018)/2019)

✔️ [표 1]에서 확인할 수 있듯이 '18년 기준 피해 규모는 '14년 대비 8.1% 증가
✔️ 즉, 해마다 피해 규모가 전반적 증가 추세임을 알 수 있음
✔️ 동물 부분에서는 멧돼지, 고라니, 청설모 순으로 피해 규모가 큼
✔️ 새 부분에서는 꿩, 까치, 오리류 순으로 피해 규모가 큼

‼️ 새도 과학적으로 동물에 포함되나, 해당 프로젝트에서는 동물은 새가 아닌 동물로 지정하여, 동물과 새로 구분하였음

🔥 개발 목적

✔️ 개발 배경을 통해 확인할 수 있는 피해 규모 완화 위해 사람이 직접 유해야생동물 포획 시 인건비, 안전 등 고려요소가 많음
✔️ 이에 따라, 사람 이외의 피해 규모 완화 위한 무인 시스템 필요성을 느껴 해당 프로젝트 개발

💦 개발 설계

1️⃣ 객체 탐지를 위해 AI 활용
✔️ 객체는 [사람/동물/새/사물]로 구분
✔️ 객체 중 새 및 동물은 퇴치 대상에 해당

2️⃣ 차영상 및 YOLO를 활용한 객체 판별 & 객체 탐지
✔️ 탐지 측면에서 효율성을 높이기 위해 차영상을 활용
✔️ 차영상을 통해 기존 배경과 차이 발생 시 YOLO를 실행하여 객체 판별 및 탐지 과정 진행

3️⃣ 퇴치 동작 다양화
✔️ 퇴치 객체 탐지 시 : 1-4단계 순서대로 퇴치 진행

🚨 1단계 : 고강도 조명 출력
🔉 2단계 : 랜덤 퇴치 신호 출력
⚡ 3단계 : 고주파수 출력
😈 4단계 : 1~3단계 종합 출력

4️⃣ 애플리케이션을 통한 퇴치 알림 서비스
✔️ 퇴치 대상 식별 및 퇴치 단계, 퇴치 여부를 농장 주인에게 알림

🐟 H/W & S/W 구성도

#1 구성도



#2 상세 구성도



#3 구성도 설명
✔️ 라즈베리(카메라)는 실시간으로 영상 촬영 및 AI 모듈에 영상 제공
✔️ AI 모듈은 전달받은 영상에서 먼저 차영상을 구함. 탐지된 차영상 있을 시 YOLO로 객체 판별 진행
✔️ 판별 객체가 퇴치 객체(동물 또는 새)일 경우, AI 모듈은 퇴치 단계에 따라 라즈베리(빛) 또는 라즈베리(스피커) 제어
✔️ 라즈베리(빛) 또는 라즈베리(스피커)는 AI 모듈의 제어 신호에 따라 작동됨
✔️ AI 모듈은 동물 또는 새 탐지 시 [카메라 일련번호 / 탐지 객체 캡처 링크 / 퇴치 단계 / 탐지 시간] 정보를 서버(=Spring Boot)에 송신
✔️ 서버는 실시간으로 AI 모듈에서 보내는 정보를 감지. 감지된 정보가 있을 경우 해당 정보를 DB에 삽입. 또한 이 정보를 사용자에게 파이어베이스 알림을 통해 전송 {-> 탐지 객체 있을 경우 사용자가 알아야 하므로}
✔️ 사용자가 과거 기록 확인 요청할 경우 해당 요청 정보 확인 가능

👬 ERD

ERD

📈 순서도

img2

🎯 사용 Tool / 사이트 / 프레임워크

구분 사용 Tool / 사이트 / 프레임워크
Data collection AI Hub / Kaggle
Date train & test Goolge Colab Pro & Yolov4
Front End Android Studio
Back End Spring Boot
DB Maria DB
Notification Firebase
Hardware Raspberry Pi
Devops Github
Etc GCP, GCM, FCM

🚥 Yolo 설정

🎏 Yolo v4 vs v5 선택

img3

😃 참고 링크 : https://yong0810.tistory.com/30
✔️ v5로 선택할 시 좀 더 정확한 인식률 등을 기대할 수 있으나, 이것은 모델 성능 향상에 따른 인식률 등의 개선이지, 연구자 등의 노력으로 인한 개선이 아님
✔️ 이러한 점과 연구 목적에 맞는 v4가 좀 더 합당하다고 판단하여 v4로 최종적으로 선택하였음

🎫 yolov4의 Darknet을 활용한 객체 탐지

✔️ 객체 탐지 과정 설명 블로그
✔️ 정리 ipynb 파일 보기

🏭 YOLO를 활용한 객체 인식 과정(train&test 포함)

1️⃣ 학습 Dataset 개수 차이에 따른 비교

✔️ 학습을 진행할 때마다 weights 파일 생성. Iteration을 중점으로 1000단위마다 파일 생성

  • 예) yolov4-1000.weights / yolov4-3000.weights 등

✔️ 이 weights 파일을 통해 Avg Loss, mAP, IoU 등을 알 수 있음
✔️ 보통 6000 Itertaion으로 많이 채택하여 사용

1) 이미지 수 기준(150장 vs 750장)
✔️ 새 / 동물 / 사람 별 각 50장 씩 추출한 총 150장과, 각 150장 씩 추출한 총 750장 간 학습 및 실험에서 Iteration에 따른 Avg Loss 및 IoU 측정

#1 Avg Loss, IoU 측면

1. 150장

50_dataset_6000_train_chart

🌠 위 표에서 파란색 선은 Avg Loss, 빨간색 선은 IoU를 지칭
🌠 150장에서 Avg Loss는 Iteration이 커질수록 감소, IoU는 Itration이 커질수록 증가

2. 750장

250_dataset_6000_train_chart

🌠 각 선이 의미하는 바는 150장의 표와 동일
🌠 150장과 동일하게 750장에서도 Avg Loss는 Iteration이 커질수록 감소, IoU는 Itration이 커질수록 증가

3. 2250장

750_dataset_6000_train_chart

🌠 각 선이 의미하는 바는 150장 및 750장 표와 동일
🌠 150장 및 750장과 동일하게 2250장에서도 Avg Loss는 Iteration이 커질수록 감소, IoU는 Itration이 커질수록 증가

4. 공통점
🌠 이미지 수와 상관없이 Iteration이 증가할수록, 대부분 Avg Loss는 감소 / IoU는 증가한다는 점을 알 수 있음

#2 mAP 측면

1. 이미지 수 기준(총 150장 vs 총 750장)
✔️ 150장, 750장 훈련에서 발생한 각 6000.weights 파일 기준으로 test하여 mAP 측정 진행

250vs750_mAP_chart

🌠 150장의 mAP는 58.87%인 반면, 750장은 mAP가 70.97%로 약 12% 정도 차이를 보임
🌠 750장이 확실히 mAP가 높은 것을 알 수 있음
🌠 이를 통해 사진 수가 많을수록 mAP가 높다는 것을 알 수 있음

2) Iteration 기준(6000번 vs 9000번)
✔️ 동일한 이미지 수에서 Iteration이 차이날 경우 Avg Loss, IoU의 수치는 상호 간 약간의 차이가 있을 수 있으나 6000번과 9000번의 그래프 형상은 비슷한 모습이므로, Avg Loss와 IoU는 생략하였음

6000Iterationvs6000Iteration_mAP_chart

🌠 이미지 수가 차이났을 때의 mAP는 확연한 차이가 있었으나, 이미지 수가 동일한 상황 속에서 Iteration이 3000번 정도나 차이가 남에도 불구하고 두 mAP의 차이는 1.2정도밖에 나지 않음
🌠 즉, Iteration의 차이는 mAP에 큰 영향을 미치지 않는다는 것을 알 수 있음

3) 2250장 mAP

2250_mAP

🌠 위 사실을 토대로 2250장을 학습했을 경우 위 이미지와 같이 mAP가 88.12%를 기록
🌠 즉, Dataset이 많은 상태로 학습 할 경우 학습 효과가 높아진다는 것을 알 수 있음

2️⃣ 기법을 적용한 정확도 개선 확인

✔️ 1️⃣에서 확인할 수 있듯이 이미지 수를 늘릴수록, mAP 등 정확도가 높아진다는 것을 알 수 있음
✔️ 이미지 수만 늘려서 정확도를 높이기보다, 특정 기법을 적용해서 정확도를 높이기 위한 방식을 찾아보았음
✔️ sharpning 기법과 sobel 기법을 적용하여 test를 진행하였음

🔪 sharpning 기법

✔️ "sharpning"이란
✔️ sharpning 기법을 적용한 결과는 아래와 같음


🌠 750장 test시 사용했던 동일한 Dataset에 sharpning 기법을 적용 후 train하였고, 이 중 6000.weights 파일 기준으로 test하여 mAP 측정 진행한 것임
🌠 아무 기법 적용하지 않은 750장 mAP 결과보다, sharpning 기법을 적용한 mAP가 약 10% 정도 낮은 것을 확인할 수 있음

🔮 sobel 기법

✔️ "sobel"이란
✔️ sobel 기법을 적용한 결과는 아래와 같음


🌠 750장 test시 사용했던 동일한 Dataset에 sobel 기법을 적용 후 train하였고, 이 중 6000.weights 파일 기준으로 test하여 mAP 측정 진행한 것임
🌠 아무 기법 적용하지 않은 750장 mAP 결과보다, sobel 기법을 적용한 mAP가 약 13~14% 정도 낮은 것을 확인할 수 있음

3️⃣ 명확한 전처리를 통한 정확도 개선

✔️ 2️⃣ 에서 확인할 수 있듯이 sharpning, 차영상, sobel 기법을 통해 정확도가 개선되지 않음을 알 수 있음
✔️ 이에 특정 기법을 적용해서 정확도 개선을 기대하기 보다는, 더 명확한 전처리를 통해 개선을 기대하기로 함
✔️ 맨 처음 150장, 750장을 학습시키기 위한 전처리는 labeling과 각 이미지 속에 있는 객체 좌표값만 있었음
✔️ 이에 따라, 아래와 같은 방식으로 전처리를 진행하였음

🍑 이전 전처리 방식과 달라진 점

🌠 416*416으로 모든 데이터 크기 맞추기 및 좌표 재설정

  • 이전에는 각 이미지의 크기가 달랐고, cfg 파일에서 416*416 사이즈로 입력받도록 하였음
  • 하지만, 객체 좌표값은 기존 이미지 크기에 입각한 좌표값인데, 416*416 사이즈로 변경될 경우 이 좌표값과 matching이 안되는 경우가 발생
  • 이에 따라 cfg에서 resize를 진행하기 보다, 애초에 모든 이미지 size를 416*416으로 조정
  • 이후 이 사이즈 규격을 기반으로 객체 좌표값 산출

🌠 해상도 높이기(bilateralFilter)

🌠 cfg 파일도 재설정

  • cfg 파일 점검 재진행

🌠 animal, bird, human 클래스 데이터별로 train, test, valid 크기 맞추기

  • 예전 학습 때에는 한 Dataset 파일에 animal, bird, human 클래스 데이터를 넣고 train, test, valid를 임의로 6:2:2 비율로 나누었음
  • 이럴 경우, 각 클래스 데이터별로 6:2:2로 나누어지는 것이 아니기 때문에, 특정 클래스 데이터가 더 많은 학습 데이터에 사용될 수도 안될수도 있음
  • 이에 따라, 클래스 데이터별로 폴더로 나누어 train, test, valid를 6:2:2 비율로 정확히 나누었음
  • 이로 인해 모든 클래스 데이터가 공평한 이미지 수로 학습에 참여할 수 있게 되었음

🌠 yolov4 정확도 높이기(cfg 관련) 적용

🎸 달라진 결과 확인(mAP)


  • 학습 때 사용한 Dataset은 이전 전처리 방식의 750장 Dataset과 동일함
  • 이전 전처리 방식에서의 mAP는 약 71%였던 것에 비해, 이번 전처리 방식에서의 mAP는 약 77%로 6% 가량 오른 것을 확인할 수 있음
  • 이를 통해, 명확한 전처리 방식이 학습 효과 향상에 기여한다는 것을 확인할 수 있음

🌸 달라진 결과 확인(동영상)

✔️ README.md에 동영상(GIF)를 올리려 했으나, 동영상 용량 문제로 인해, 각 영상 별 대표 이미지와 각 영상 설명란에 유튜브 링크를 첨부하였습니다.
✔️ 확실한 차이는 각 영상 별 이미지보다 유튜브에 더 잘 보이기 때문에, 유튜브 링크를 통해 차이를 꼭 비교하시길 바랍니다.
✔️ 각 유튜브 영상에서 가운데를 기준으로 왼쪽이 old version, 오른쪽이 new version에 해당합니다.
✔️ old version은 명확한 전처리 이전의 학습 결과물로 동영상을 test한 것입니다.
✔️ new version은 명확한 전처리 이후의 학습 결과물로 동영상을 test한 것입니다.
✔️ 탐지 개체마다 Bounding Box가 존재하는데, Red Box는 animal, Blue Box는 bird, Green Box는 human으로 Yolo가 탐지했을 때 생깁니다.

#1 영상 1


🌠 영상 1 시청하러 가기
🌠 old version에서는 한 개체에 여러개의 Bounding Box가 생성
🌠 new version에서는 한 개체에 하나의 Bounding Box가 생성

#2 영상 2


🌠 영상 2 시청하러 가기
🌠 old version에서는 다람쥐가 나무 위에 있어서 다람쥐를 animal이 아닌 bird로 인식
🌠 new version에서는 다람쥐를 animal로도 인식함. 다만, 다람쥐를 animal, bird로 동시에 인식. 해당 문제는 지속적인 학습을 통해 해결해야 할 필요성이 있음

#3 영상 3


🌠 영상 3 시청하러 가기
🌠 old version에서는 새때 중 대부분 또는 일부 새를 인식하지 못하였음
🌠 new version에서는 새때 중 대부분의 새를 인식

#4 영상 4


🌠 영상 4 시청하러 가기
🌠 old version에서는 __사람을 사람이 아닌 새로 인__식
🌠 new version에서는 사람을 대부분 사람으로 인식. 일부는 아직 새로 인식하는데, 해당 문제는 지속적인 학습을 통해 해결해야 할 필요성이 있음

🎰 Number of objects per class (클래스별 탐지 객체 수)


  • True Positive(이하 TP) : 예측을 잘함
  • False Positive(이하 FP) : false 인데 positive로 판단
  • bird의 FP/TP+FP는 약 0.18을 기록
  • animal의 FP/TP+FP는 약 0.11을 기록
  • human의 FP/TP+FP는 약 0.19를 기록
  • 즉, bird와 human의 오탐율은 비교적 높고, animal의 오탐율은 비교적 낮음을 확인할 수 있음

4️⃣ 날씨 및 환경에 따른 학습 및 실험 영향 확인

✔️ 이전까지는 날씨 및 환경이 좋은 사진들로만 학습 및 실험을 진행하였음
✔️ 하지만 날씨 및 환경이 상대적으로 좋지 않을 경우(예 : 눈/비/일출/일몰), 이러한 것이 객체 인식에 영향을 줄 수 있음
✔️ 이에 따라, 본 연구팀은 날씨 및 환경이 좋았던 상황에서 77% mAP를 기록하기 위해 750장의 dataset이 필요한 것처럼, 날씨 및 환경이 좋지 않을 경우 약 77%를 기록하기 위해, 얼마나 많은 dataset이 필요한지 확인해보기로 했음
✔️ 이에 따라, 각 종류별 사진들을 눈/비/일출&일몰/밤 필터 총 4개와 합성하여 총 750장의 이미지를 생성
✔️ 각 필터 적용된 종류별 구성은 다음과 같음 > 일출&일몰(60장)+눈(60장)+비(65장)+밤(65장) > 한 종류당 250장

1. 이미지 생성
🌠 각 필터와, 동일한 동물 이미지에 대한 결과의 예시는 아래와 같음
🌠 결과 이미지는 흑백 처리까지 한 결과임

#1 이미지 필터

img-filters

#2 필터 적용 이미지

img-filters-results

#3 학습 이후 test한 이미지

img-filters-results

✔️ 해당 이미지는 비 필터가 적용된 동물(animal) 사진임
✔️ 필터가 적용돼도 잘 탐지하는 것을 확인할 수 있음

#4 필터 적용 mAP



#5 결과
✔️ 필터가 적용되지 않은 mAP와 적용된 mAP는 각각 약 77%와 74%로로, 3% 정도의 차이를 기록
✔️ 해당 과정을 실험하기 전에는 필터가 적용된 것이 안된 것보다 mAP 측면에서 10~15% 정도 낮을 것으로 예상
✔️ 그러나, 필터가 적용된 것의 mAP가 안된 것보다 약 3% 낮기는 하나, 필터가 적용된 것을 감안하였을 때 예상보다는 많이 좋은 mAP를 산출
✔️ 실제 상황에서는 적용된 필터보다 더 다양한 날씨 및 환경이 존재하겠으나, 특별한 경우가 아닐 경우 대부분 상황에서도 객체 인식을 정상적으로 수행할 것으로 기대 가능

#6 참고 자료

  1. 전·후처리를 이용한 딥러닝 기반의 주차여부인식
  2. 파이썬 코드를 이용한 파이카메라 제어



5️⃣ 차영상 이후 YOLO 실행

✔️ 실제 촬영되는 영상을 입력받을 경우, 계속 YOLO로 탐지를 진행하고 있으면 프로그램에 과부하가 높을 것으로 예상
✔️ 이에 따라, 먼저 입력된 영상 속에서 차영상이 나타날 경우에 YOLO를 가동시켜 해당 객체가 동물/새/사람인지 구분
✔️ 이를 통해 프로그램 상 주어질 수 있는 과부화 중 일부를 완화할 수 있을 것으로 기대
✔️ 더 나아가, 여러 프로젝트에서 대부분 객체 인식을 실시간 YOLO로만 구동시키는데, 본 연구팀은 차영상 이후 YOLO를 실행함으로써 실행 방식에서의 차이를 기대

차영상 적용 전후 비교

차영상-적용-전후-비교


🌠 차영상 적용 전이나 후나 먼저 영상에서 객체 탐지 진행 후 판별을 진행
🌠 판별 부분에서는 동일한 성능을 보여줌
🌠 탐지 부분에서는 차영상 적용 전과 후가 약 45초 정도 차이나는 것을 확인할 수 있음
🌠 차영상 이후 YOLO를 가용하는 것이 시스템 측면에서 유리한 것을 알 수 있음
🌠 본 시스템처럼, 특정 객체를 퇴치해야 하는 경우 더 효율적인 방안임을 알 수 있음

⏰ 알림을 위한 Firebase 채택 이유

✔️ 서버에서 앱으로 푸쉬 알림을 전송하는 기능을 구현하기 위해서는 파이어베이스와 브로드캐스트리시버 2종류의 선택지가 존재했음
✔️ 해당 프로젝트는 앱이 실행 중이지 않을 때(즉, 백그라운드에서 실행되고 있을 경우)에도 알림이 필요할 경우, 클라이언트에게 알림을 전송해야 함
✔️ 이에 따라, 앱이 실행 중이거나 특수한 이벤트 발생 시에 작동되는 브로드캐스트리시버는 부적절하다고 판단
✔️ 따라서, 필요 조건을 충족할 수 있는 파이어베이스를 선택

✉️ GCM(Google Cloud Messaging) 구성

GCM

📮 Firebase 클라우드 메시징(이하, FCM)의 동작 원리

Firebase

  1. 클라이언트 앱에서 Sender ID를 이용해 등록을 요청
  2. FCM은 클라이언트 앱에서 전달받은 SenderId를 토대로 Registration Token을 클라이언트 앱에서 발급
  3. 클라이언트 앱은 FCM에서 전달받은 Registration Token을 앱 서버에 전달하고, 이를 전달받은 앱 서버는 Registration Token을 저장
  4. 앱 서버는 Registration Token, API Key, 전송할 메시지를 이용하여 GCM에 메시지를 전송
  5. FCM은 앱 서버로부터 전달받은 메시지를 해당 클라이언트 앱에 메시지를 전송

🚀 성과 및 기대 효과

1️⃣ 농작물 재배 편의성 측면
✔️ 농경지 면적이 많은 전남, 경북 등의 농업 종사자에게 무인 시스템을 제공함으로써 농작물 피해 규모 완화

2️⃣ 지역 경제 활성화 측면
✔️ 질 좋은 농작물 재배 및 수출을 통해 지역 경제 활성화
✔️ 양질의 농작물 재배를 통한 해외 농작물 수입 억제

🏁 참여 대회

1️⃣ 2022 KOAT 아이디어 경진대회

🏃 제출 파일 다운로드하러 가기


2️⃣ 2022 청소년/청년 아이디어 경진대회

🏃 제출 파일 다운로드하러 가기


🏁 2022 한국정보기술학회 투고 논문

1️⃣ AI를 이용한 농작물 피해 완화 시스템

🏃 제출 파일 다운로드하러 가기


2️⃣ 영상인식에서 전처리 유무 및 환경변화에 따른 객체 인식률 비교

🏃 제출 파일 다운로드하러 가기


About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 64.9%
  • Jupyter Notebook 28.5%
  • Python 6.5%
  • Batchfile 0.1%