프로젝트명 - Muk Pic(먹는 순간을 사진으로 담고, 찍는 순간을 추억으로 남기다.
팀명 - I4U
프로젝트 소개
제안 배경
한류 콘텐츠의 인기로 한식에 대한 관심과 인기가 높아지고 있다. 하지만 한국 음식의 다양성과 아시아권의 음식들과 혼동으로 인해 외국인들이 한국 음식을 이해하고 접근하는데 어려움을 겪고 있다. 이에 AI를 활용해 외국인들에게 한국 음식을 쉽게 소개하고 이해를 높이는 어플리케이션(이름: Muk Pic)을 개발하고자 한다. Muk Pic의 주요 기능은 다음과 같다.
- 음식 사진 인식을 통한 음식 정보 제공
- 인식한 음식 사진 보관
- 커뮤니티
- 음식 검색
Muk Pic은 AI를 이용해 400가지의 음식에 대해 음식 사진으로 해당 음식의 정보(음식 설명, 음식 조합, 레시피, ...)를 쉽게 파악하고 이해할 수 있도록 돕는 기능을 주기능으로 한다. 또한, 인식한 음식 사진을 포함한 추가 사진을 커뮤니티에 게시할 수 있으며, 게시하지 않을 경우 보관 기능 통해 필요시 확인할 수 있다. 커뮤니티의 경우 사진, 게시글을 올리는 것으로 좋아요 기능을 통해 인기순과 최신순으로 글을 확인할 수 있다. 마지막으로 검색 기능은 커뮤니티의 게시글 검색과 400가지 음식에 대한 검색 기능을 통해 사진 인식뿐만 아니라 단순 검색으로도 음식의 정보를 확인할 수 있다.
실행 기간
2024.12.16-2025.02.07 (8주)
팀원 및 주요 역할
역할 | 이름 | 주요 역할 |
팀장 | 장태훈 | 프로젝트 총괄, AI, 기획 |
팀원 | 윤현석 | Front-End, Back-End, 기획 |
팀원 | 정동아 | Back-End, 기획, 데이터베이스 구축 |
팀원 | 최평안 | Back-End, 기획, 데이터베이스 구축 |
필요 역량
프로그래밍 능력 - Python, mysql, java, spring, aws, docker, git
문서 작성 능력 - MS office
기대 효과 및 활용 분야
기대 효과
- 한국 음식의 글로벌 홍보: 외국인들에게 한국 음식의 다양성을 쉽게 소개
- 개인화된 음식 정보 제공: 사용자가 관심 있는 음식을 보다 쉽게 이해하고 활용
- 커뮤니티를 통한 사용자 경험 확대: 사진과 글을 게시하여 음식과 관련된 다양한 경험 공유
활용 분야
- 한식 홍보 및 관광 산업: 관광지에서 한식 정보 제공 및 지역 음식 탐방 지원
- 식문화 교육: 학교, 외국인 문화 센터 등에서 교육 자료로 활용, 한국의 전통 음식과 현대 음식에 대한 정보를 제공해 문화적 이해 증대
- 외식 산업: 외식 브랜드와 협업하여 특정 음식 또는 레스토랑 정보 제공
예상 결과물
이용 데이터셋
AI-Hub
샘플 데이터 ? ※샘플데이터는 데이터의 이해를 돕기 위해 별도로 가공하여 제공하는 정보로써 원본 데이터와 차이가 있을 수 있으며, 데이터에 따라서 민감한 정보는 일부 마스킹(*) 처리가 되
www.aihub.or.kr
출처: [에이아이더, "음식 이미지 및 영양정보 텍스트", Aihub, 2022년 10월 12일 수정, 2024년 12월 접속, https://www.aihub.or.kr/aihubdata/data/view.do?currMenu=&topMenu=&aihubDataSe=data&dataSetSn=74]
밥류 | 면, 만두류 | 한과류 | |||||||
쌀밥 | 기타잡곡밥 | 콩밥 | ... | 간자장 | 굴짬뽕 | 기스면 | ... | 매작과 | ... |
'음식 이미지 및 영양정보 텍스트'는 위의 표와 같이 400개 음식 종류별 1500~1600장의 이미지를 제공 총 약 620,000장의 이미지를 제공한다. 해당 데이터셋은 음식 영양정보에 관한 것으로 '토마토 스파게티', '크림 스파게티', '함박스테이그'와 같이 불필요한 종류의 음식을 제거했다. 음식 종류를 설정하는 데 이용한 기준은 AI-Hub에서 제공하는 '한국 이미지(음식)' 데이터셋을 기준으로 했다. '한국 이미지(음식)' 데이터셋은 150 종류의 한국 음식을 제공하며, 이를 기준으로 '음식 이미지 및 영양정보 텍스트' 데이터셋의 400 종류의 음식 중 데이터셋에 없는 식혜, 수정과 를 제외하 148 종류의 음식에 순대국밥, 콩나물국밥, 뼈해장국, 닭칼국수, 콩국수, 찜닭과 같은 주 메뉴 22 종류 음식을 추가했다. 따라서 총 170 종류의 음식 데이터셋을 이용했다.
AI-Hub
샘플 데이터 ? ※샘플데이터는 데이터의 이해를 돕기 위해 별도로 가공하여 제공하는 정보로써 원본 데이터와 차이가 있을 수 있으며, 데이터에 따라서 민감한 정보는 일부 마스킹(*) 처리가 되
www.aihub.or.kr
출처: [한국과학기술연구원, "한국 이미지(음식)", Aihub, 2019년 12월 31일 수정, 2024년 12월 접속, https://www.aihub.or.kr/aihubdata/data/view.do?currMenu=&topMenu=&aihubDataSe=data&dataSetSn=79]
모델 테스트
1500~1600장 VS 1000장: Ultralytics YOLOv3, Ultralytics YOLOv3 (8개 음식)
8개 음식을 대상으로 Ultralytics YOLOv3를 이용해 학습했다. 테스트를 진행한 목적은 다음과 같다.
- 모델의 전반적인 성능 확인: 선택된 8개 카테고리에 대해 모델이 얼마나 효과적으로 학습하고 정확한 예측을 하는지 평가
- 데이터셋 크기 축소 가능성 확인: 음식 사진이 500만 화소 이상으로 고화질 데이터이며, 전체 데이터셋의 크기가 약 1TB에 달하기 때문에, 데이터셋의 크기를 줄였을 때 모델 성능이 얼마나 유지되는지를 확인
따라서 다음과 같은 방식으로 진행했다.
- 8개 음식을 각각 1500~1600장의 이미지를 유지한 상태에서 모델을 학습.
- 동일한 8개 음식을 1000장으로 축소하여 다시 학습.
- 두 모델의 성능을 비교하여 데이터셋 크기 축소가 모델 성능에 미치는 영향을 분석.
- 이미지 삭제 전(각각 1500~1600장)
image size - 416
batch size - 32
epochs - 10
weights - yolov3.pt(전체 계층 미세 조정)
Class Images Instances P R mAP50 map50-90
all 1113 2226 0.88 0.833 0.887 0.735
접시 1113 1113 0.932 0.872 0.973 0.756
쌀밥 1113 120 0.807 0.933 0.878 0.782
기타잡곡밥 1113 124 0.821 0.403 0.669 0.6
콩밥 1113 117 0.89 0.872 0.921 0.8
보리밥 1113 117 0.711 0.795 0.75 0.623
돌솥밥 1113 144 0.953 0.965 0.979 0.871
현미밥 1113 180 0.92 0.833 0.908 0.627
흑미밥 1113 158 0.925 0.899 0.938 0.775
감자밥 1113 153 0.962 0.922 0.968 0.778
- 이미지 삭제 후(각각 1000장)
image size - 608
batch size = 32
epochs - 20
weights - yolov3.pt(전체 계층 미세 조정)
Class Images Instances P R mAP50 map50-90
all 1635 3270 0.844 0.838 0.895 0.752
접시 1635 1635 0.849 0.945 0.967 0.749
쌀밥 1635 197 0.882 0.812 0.895 0.811
기타잡곡밥 1635 220 0.718 0.555 0.696 0.611
콩밥 1635 205 0.857 0.898 0.935 0.839
보리밥 1635 216 0.774 0.796 0.83 0.69
돌솥밥 1635 204 0.917 0.907 0.958 0.842
현미밥 1635 198 0.758 0.84 0.881 0.638
흑미밥 1635 181 0.887 0.862 0.919 0.791
감자밥 1635 214 0.949 0.93 0.974 0.794
- 테스트 결과
mAP50 (전체 평균 정확도) - 약간의 성능 향상
mAP50이 유지되거나 소폭 상승, 이미지 해상도 증가와 에포크 수 증가가 효과적으로 작용했음을 보여준다.
mAP50-90 (더 엄격한 기준) - 약간의 성능 향상
다양한 IoU 기준에서 성능이 조금 더 좋아졌다.
Precision (P) - 소폭 감소
모델이 잘못된 예측(오탐지)이 약간 증가했다.
Recall (R) - 약간 상승
모델이 더 많은 실제 객체를 올바르게 탐지했다.
- 종합
대부분의 클래스에서 mAP50과 Recall이 안정적으로 유지되거나 향상되었다. 하지만 기타잡곡밥은 데이터 감소 후 성능(특히, Recall)이 상대적으로 낮다. 하지만 기타잡곡밥은 데이터 감소 전에도 성능이 상대적으로 낮았던 카테고리로 데이터가 충분하지 않거나, 다른 클래스와의 구별이 어려울 가능성있다고 본다.
- 이미지 크기 증가 (416 → 608)
- 에포크 수 증가 (10 → 20)
이미지 수를 줄였음에도 성능이 유지되거나 소폭 향상되었지만 Precision이 약간 감소한 것은 데이터 감소로 인해 일부 세부적인 정보를 잃었을 가능성을 있다. 그럼에도 데이터셋 크기를 줄이면서도 성능을 유지하는 데 성공했다고 보고있다. 약간의 Precision 감소는 추가 실험과 개선을 통해 보완 가능할 것이며, 개별 클래스의 성능(기타잡곡밥과 같이 성능이 낮은 카테고리)을 집중적으로 개선하면 더 높은 수준의 모델 성능을 달성하고자 한다.
- 1500~1600장 VS 1100장: Ultralytics YOLOv5, v8(40개 음식)
앞선 테스트를 토대로 데이터셋의 크기를 줄인 대신 학습에 사용하는 이미지의 크기를 640으로(기존 608) 크게 키우고 AI 모델을 Ultralytics YOLOv3 에서 Ultralytics YOLOv5로 교체했다. 아래는 Ultralytics YOLOv3, Ultralytics YOLOv5와 Ultralytics YOLOv8을 비교한 것이다.
(https://github.com/ultralytics/yolov3/releases, https://github.com/ultralytics/yolov5, https://docs.ultralytics.com/ko/models/yolov8/#performance-metrics참고)
mAP50 | mAP50-95 | |
YOLOv3(size: 608) | 58.2 | 33.1 |
YOLOv5m(size: 640) | 64.1 | 45.4 |
YOLOv5l(size: 640) | 67.3 | 49.0 |
YOLOv8m(size: 640) | 52.9 |
위와 같이 YOLOv5는 YOLOv8는 YOLOv3보다 더 좋은 성능을 보여주고 있다. 따라서 다음과 같이 테스트를 진행했다.
- 데이터셋의 크기를 줄이고 더 좋은 성능을 보여주는 모델로 변경 - Ultralytics YOLOv5, Ultralytics YOLOv8
- 이미지 크기 확대 - 608 -> 640
- 각 음식(카테고리) 데이터 증가 - 1000장 -> 1100장
- epoch 증가 - 10 -> 20
위 조건으로 데이터를 축소하더라도 성능을 유지하거나 더 높은 성능을 달성할 가능성을 검증하기 위해 기존 8개 음식을 대상으로한 테스트에서 40개 음식을 대상으로 아래와 같이 테스트를 진행했다.
- 이미지 삭제 전(각각 1500~1600장): Ultralytics YOLOv5
image size - 640
batch size - 16
epochs - 12
weights - yolov5m.pt(전체 계층 미세 조정)
음식 - 40개
- 이미지 삭제 전(각각 1500~1600장): Ultralytics YOLOv8
image size - 640
batch size - 16
epochs - 10
weights - yolov8m.pt(전체 계층 미세 조정)
음식 - 40개
- 이미지 삭제 후(각각 1100장): Ultralytics YOLOv5
image size - 640
batch size - 16
epochs - 20
weights - yolov5m.pt(전체 계층 미세 조정)
음식 - 40개
- 테스트 결과(이미지 삭제 후 비교)
mAP50 (전체 평균 정확도) - 성능 감소
이미지 삭제 후 이미지 크기가 더 크고 에포크 수가 더 많음에도 mAP50이 더 낮게 나왔다.
mAP50-90 (더 엄격한 기준) - 성능 감소
이미지 삭제 후 이미지 크기가 더 크고 에포크 수가 더 많음에도 다양한 IoU 기준에서 성능이 더 낮게 나왔다.
Precision (P) - 소폭 상승
이미지를 삭제한 데이터셋이 더 높게 나왔지만 에포크 수를 고려했을 때 좋은 성능을 보여주지 못 하고 있다.
Recall (R) - 소폭 상승
이미지를 삭제한 데이터셋이 더 높게 나왔지만 에포크 수를 고려했을 때 좋은 성능을 보여주지 못 하고 있다.
- 종합
이미지를 삭제한 후 Precision, Recall에서 더 좋은 성능을 보여주고 있다. 하지만 에포크 수와 이미지 크기를 비교했을 때 좋은 성능을 보여주고 있다고 보기에 어렵다. 또한, mAP50, mAP50-90에서의 성능은 이미지를 줄인 것 보다 더 낮은 성능을 보여주고 있다.
- epochs 증가: 12 -> 20
- 이미지 크기 증가 (608 → 640)
- 최종 결과
데이터셋을 줄이기 위해 음식 이미지를 삭제하는 대신 epochs 수 증가, image size 증(416->608, 608->640)가 그리고 더 좋은 성능을 보여주는 모델로 교채하는 방법은 작은 데이터셋에서는 효과적인 방법이었다. 하지만 큰 데이터셋에서는 Object Detection의 성능을 떨어트린다는 것을 확인할 수 있었다. 따라서 이번 프로젝트에서는 음식 이미지를 삭제해 데이터셋의 크기를 줄이는 방법을 사용하지 않고 400 종류의 음식 중에서 AI-Hub에서 제공하는 '한국 이미지(음식)'를 기준으로 선택한 148 종류의 음식과 22 종류의 음식을 추가한 170 종류의 음식 데이터셋을 이용해 학습을 하고자 한다. 또한, 가장 뛰어난 성능을 보여주는 YOLOv8을 이용해 학습을 진행할 것이다.