spaceduck
What a Spatial Day
spaceduck
  • 분류 전체보기 (14)
    • 프로젝트 (6)
    • 빅데이터 (0)
      • 기초통계 (0)
      • 데이터분석 (0)
      • 영상딥러닝 (0)
      • R (0)
    • 공간정보 (2)
      • GIS (2)
      • 원격탐사 (0)
      • 사진측량 (0)
      • GNSS (0)
    • 데이터베이스 (3)
      • SQL (3)
      • 공간DB (0)
    • 프로그래밍 언어 (0)
      • Python (0)
      • C# (0)
      • Java (0)
    • 앱개발 (1)
      • API (1)
      • UX (0)
    • 알고리즘 (0)
      • 공간알고리즘 (0)
    • 칼럼 (2)
      • 공간적사고 (2)
      • 기타 (0)

블로그 메뉴

  • 깃허브
  • 홈
  • 태그
  • 방명록

인기 글

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
spaceduck

What a Spatial Day

딥러닝을 활용한 애호박 선별기
프로젝트

딥러닝을 활용한 애호박 선별기

2022. 1. 4. 15:58

애호박 선별기

2020년도 여름방학, 창업동아리를 통해 알게 된 친한 형에게 연락이 왔었다. 방학 동안 딥러닝 프로젝트를 하나 진행해보고 싶은데 어떤 프로젝트를 하는 게 좋을지에 대한 이야기였다.

 

당시, 형이 가장 관심 있어하던 분야가 화훼와 농산물 산업이었고, 내가 관심을 가지고 있었던 분야는 영상 딥러닝과 지도 산업 쪽이었다. 그 결과, 농산물의 등급을 분류할 수 있는 영상 딥러닝을 개발하는 건 어떤지에 대한 이야기가 나왔고, 긴 논의 끝에 가능성이 보이자 곧바로 실행에 옮겨 팀원을 모집하였다.

 

실행 가능성을 확신한 이유는 단순했다. 관련된 선행연구가 있다는 것을 알고 있었기 때문이었다. 영상 딥러닝에 호기심을 갖기 시작했을 때쯤, 우연히 유튜브에서 텐서플로우를 이용해 개발한 오이 선별기를 본 적이 있었다.

 

그 영상의 주인공은 일본의 임베디드 개발자인 코이케 마코토씨였고, 부모님의 농가의 일을 돕고자 만들었던 기계가 바로 아래 링크에 있는 '오이 선별기'였다.

 

http://www.techholic.co.kr/news/articleView.html?idxno=59801 

 

인공지능 오이 판별기 “제 점수는요…” - 테크홀릭

인공지능이 오이를 가려낸다? 기존에는 사람이 직접 눈으로 보고 손으로 처리하던 작업을 기계가 자동으로 처리한다면 어떨까. 영상은 카메라 여러 대...

www.techholic.co.kr

 

이미 선행된 케이스가 있다는 것은 시간이 걸리더라도 가능하다는 것을 의미했고, 공부만 제대로 한다면 문제를 해결할 수 있을거라 생각했다. 또한, 운이 좋은 경우에는 선행연구에 대한 자료를 찾아 참고할 수 있을거라 생각했다.

 

그래서 딥러닝을 활용한 농산물 선별기 개발 프로젝트를 기획하였고, 작물 중에서도 물리적인 선별이 어려운 애호박을 선택하여 선별기를 개발하기로 하였다. 

 

그렇게 우리를 포함한 총 6명의 팀원이 마음이 맞아, 여름방학 동안 함께 '애호박 선별기'를 개발하게 되었다.

 

데이터셋의 확보

프로젝트를 진행하면서 가장 컸던 어려움은 무엇보다 데이터셋의 확보였다. 많은 사이트를 돌아다니면서 데이터를 확보하고자 노력했지만, 그 어떤 사이트에서도 애호박 데이터는 존재하지 않았다. 특히, 해외에서는 애호박을 잘 안먹기에 데이터셋이 있을 확률이 더욱 적었다. 

 

결국 답은 직접 확보하는 것이었는데, 창업동아리의 형의 뛰어난 기지로 한 선별장과 연락이 닿아 사진을 촬영하는 것을 허락받을 수 있었다. (대단하다 우리형!!)

 

그래서 날을 잡아, 4명의 팀원이 함께 남양주에 있는 선별장을 방문했고 그토록 원했던 애호박들을 만날 수 있었다. 그리고 담당자님의 친절한 설명을 통해 애호박의 등급이 총 4가지로 분류된다는 것을 배울 수 있었다. 분류는 '특', '1특', '2특', '불량'으로, 불량을 제외한 나머지 제품만이 출하된다고 하셨다.

 

하지만 모든 애호박이 숙련된 선별자의 손과 눈을 통해 선별되었기에, 늘 마트에서 선별된 완제품을 봐왔던 우리의 눈에는 모두 똑같은 애호박으로 보였고 단시간에 그 차이를 인지하는 것은 쉽지 않았다. 그래서 점심시간을 빌려, 선별장의 직원분들께 몇 가지 질문을 부탁드렸고, 노력하는 모습이 기특하다는 칭찬과 함께 애호박을 분류하는 기준을 상세히 알아볼 수 있었다.

크기, 길이, 휘어짐, 색상 등에 따라 나뉜다.

 

그 기준은 크기, 길이, 휘어짐, 색상 등에 따라 달랐다. 가장 높은 등급인 '특'은 적당한 길이와 두께에 휘어짐이 없었다. 그다음 등급인 '1특'은 굴곡이 조금 있었지만, 대체로 '특'과 비슷한 특성을 가지고 있었다. '2특'은 길이가 짧거나 휘어짐이 좀 더 심한 경우에 해당하였다. 마지막으로 '불량'은 멍이 있거나 무르게 되어 색상이 변색된 경우가 대부분이었다.

 

그렇게 점심시간이 끝난 후, 정말 감사하게도 담당자님께서 빈 창고와 분류된 제품들을 제공해주셔서 직접 제품을 선별하는 어려움 없이 곧바로 촬영에 들어갈 수 있었다. (제품은 최대한 손상이 가지 않게 촬영하였다.)

 

촬영은 비슷한 조도와 흰색 배경 아래에서 진행되었고, 최대한 모든 면을 담을 수 있게 촬영하였다. 그리고 날이 어두워질 때쯤, 총 3623장의 사진을 확보하여 촬영을 마무리할 수 있었다.

 

데이터 라벨링 및 축소

데이터 라벨링은 촬영을 진행할 때 미리 폴더를 나눠서 촬영해두었기에 큰 어려움 없이 진행할 수 있었다. 총 3623장 중 300장 정도가 흔들리거나 중복된 사진이어서 이를 제거하고 전처리를 진행하였다. 

불량재고들은 주로 가운데에 멍든 흔적이 있다

데이터 전처리가 제대로 되는지 확인하기 위해, 우선은 불량 제품을 중점으로 시각화와 전처리를 진행하였다. 이를 확인한 뒤, 원활한 학습을 진행하기 위해 데이터를 256x256 픽셀로 축소하였다.

 

https://www.tensorflow.org/api_docs/python/tf/image/resize

 

tf.image.resize  |  TensorFlow Core v2.9.1

Resize images to size using the specified method.

www.tensorflow.org

 

데이터 변환

이후 부족한 데이터를 증강시키기 위해 색조, 채도, 명도, 각도 등을 변환하는 과정을 거쳤다. 텐서플로우의 예제를 참고하여 변환을 진행하였다. 애호박 사이즈가 선별 요소 중 하나였기에 cropping 기능은 사용하지 않았다.

 

HSV 및 회전 변환

 

변환과정을 거치면서 3300장의 5배인 16500장(기존 데이터 포함)의 데이터가 생성되었고, 이를 80대 20으로 학습 세트(train set)과 검증 세트(validation set)로 나눠서 .npz파일(numpy에서 지원하는 바이너리 파일로 여러 개의 배열을 저장할 때 사용됨)로 저장해 전처리를 하였다. 

 

 

https://www.tensorflow.org/tutorials/images/data_augmentation

 

데이터 증강  |  TensorFlow Core

데이터 증강 개요 이 튜토리얼에서는 이미지 회전과 같은 무작위(그러나 사실적인) 변환을 적용하여 훈련 세트의 다양성을 증가시키는 기술인 데이터 증강의 예를 보여줍니다. 두 가지 방법으

www.tensorflow.org

 

Keras의 CNN 모델 적용

모델은 Keras의 CNN 모델을 적용하였다. 손글씨 데이터셋인 MNIST를 학습할 때 사용한 모델이다. 앞서 오이 선별기를 개발했던 코이케 마코토씨도 같은 모델을 사용했다고 한다. 

 

우선 .npz파일을 불러와서 utils 라이브러리의 to_categorical() 함수를 이용해 one-hot encoding을 먼저 하였다. 그리고 가장 좋은 하이퍼 파라미터를 찾기 위해서 튜닝 과정을 거쳤다.

 

3x3 커널과 Relu 활성화 함수를 사용한 Conv2D와 2x2 풀의 MaxPooling2D를 반복해 노이즈를 제거하였고, Flatten과 Dense 과정을 거쳐 적합한 하이퍼 파라미터를 찾을 수 있었다. (과적합을 방지하기 위해 Dropout도 사용하였다.)

 

그리고 튜닝 과정에서 얻은 하이퍼 파라미터를 이용해 epoch = 100, batch size = 200, learning rate = 0.00014로 train set을 학습시켰고, validation set으로 모델이 잘 분류되는지 확인하였다.

검증 세트가 95.94의 정확도를 보였다

그 결과, train set에서 99.49%와 validation set에서 95.94%의 정확도를 확인할 수 있었다. 더 나아가, 그래프의 모양을 봤을 때 과적합은 발생하지 않은 것으로 보였다.

 

YOLOv3를 이용한 대상 인식

이후, 개발한 모델을 시간과 공간에 상관없이 실시간으로 인지하여 분류하는 모델을 만들기 위해 YOLOv3를 이용하였다. Inflearn 노마드크리에터님의 '[OpenCV] 파이썬 딥러닝 영상처리 프로젝트2 - 불량사과를 찾아라!' 강의를 참고하여 개발이 진행되었다.

 

GPU를 사용하기 위해 CUDA를 설치하고, DarkNet에서 weight를 불러왔다. 그 이후에는 강의에서 진행한 것과 동일하게 Labellmg라는 툴을 이용해 애호박 사진을 하나씩 직접 라벨링해서 학습 데이터를 제작하였다.

 

나머지 과정은 다른 팀원들이 담당했는데, 여러 시행착오 끝에 애호박을 인식하는 모델을 개발하는데 성공하였다.

이것이 한 번만 봐도 아는 YOLOv3의 힘인가

GUI 적용

마지막으로 GUI를 적용해 YOLO모델이 웹캠의 애호박을 인식하면, 해당 이미지를 받아와서 Keras CNN 분류 모델을 통해 등급 분류를 실시간으로 진행할 수 있게 하였다.

왼쪽 아래쪽에 검정줄이 있기 때문에 불량 제품이다
굵기가 균일하지 않기 때문에 2특 제품이다

 

창업콘테스트

그리고 'AI 선별기를 활용한 농산물 직거래 서비스'라는 사업을 구상해 노원그린창업캠퍼스에서 진행한 공모전에 참가해 제작한 프로토타입을 선보일 수 있었다. BM은 AI 선별기를 이용함에 따라 발생하는 데이터를 수집해 맞춤형 농산물을 제공하는 것이었는데, 나름 좋은 평가를 받아 괜찮은 성과를 얻을 수 있었다.

gmmpg의 BM

마무리하며

애호박 선별기를 개발하면서 나름 고생도 하고 여러 시행착오도 겪어야 했는데, 그럼에도 불구하고 해당 프로젝트는 나에게 기억에 남는 프로젝트가 되었던 것 같다. 그 이유는 직접 구상한 아이디어를 기획에서 멈추지 않고 도전하여 성과를 내었기 때문이라고 생각한다. 

 

'데이터셋이 없으면 만들면 되지'라는 마인드로 문제에 부딪혀 보았기에 가능했던 프로젝트였다고 생각한다. 그리고 해당 프로젝트를 통해 앞으로도 많은 한계에 맞써 싸울 수 있는 힘을 얻을 수 있었다고 본다. 

 

앞으로도 다양한 도전에 주저하지 않고 도전하는 내가 되길 바라며 글을 마친다.

 

https://github.com/gmmpg/zucchini

 

GitHub - gmmpg/zucchini

Contribute to gmmpg/zucchini development by creating an account on GitHub.

github.com

 

'프로젝트' 카테고리의 다른 글

공항 온실가스 감축 프로젝트  (0) 2022.02.03
스마트 버스정류장 입지선정 - LH COMPAS 공모전  (1) 2022.01.13
우리동네 키움센터 입지선정 - 서울시 빅데이터캠퍼스 공모전  (0) 2022.01.06
소셜메트릭스 - 진로 소주 분석  (0) 2021.12.27
마스크 재고 알림 앱 - COMA(COrona Mask Alarm)  (0) 2021.12.27
    spaceduck
    spaceduck
    Spatial is Special.

    티스토리툴바