Streamlit과 YOLOv5를 기반으로 사용자가 업로드한 음식 이미지를 자동 인식하고, 탐지된 음식에 대해 사전 구축된 데이터셋을 활용해 영양 성분 및 당뇨 위험도를 분석하는 웹 서비스
- 고령화의 가속으로 인해 만성질환자, 특히 당뇨 환자의 수가 지속적으로 증가하고 있음.
- 질병관리청의 ‘2024 만성질환 현황과 이슈’에 따르면 우리나라 질병 부담에 가장 큰 영향을 미치는 위험 요인은 ‘영양’으로, 건강하지 못한 식습관은 당뇨, 암, 심혈관 질환 등 주요 만성질환의 주요 원인이 되고 있음.
- 이를 해결 또는 해소하기 위해 만성질환 환자, 특히 당뇨 환자의 건강한 식생활 유도를 위한 정밀한 음식 영양 분석 기술이 중요한 대안으로 작용할 수 있음.
- 만성질환을 가진 사람들의 식습관 개선을 위한 개인 맞춤형 음식 영양 분석 기술 개발을 목표로 함.
- 음식을 자동 인식하고 영양 정보를 분석하여, 당뇨 환자에게 적합한 식단인지 실시간 판단할 수 있는 AI 기반 분석 시스템 구축.
- 사용자 상태를 반영한 동적 피드백 기능 탑재로 식생활 관리 효율 극대화.
- 사회적 약자인 만성질환 환자의 자기관리 능력 향상을 통한 올바른 식습관 형성 및 심리적 자율감 고취.
- 공공 의료비 절감, 예방 중심 건강관리 전환 등 국가 보건 정책 방향과 부합하며, 고령사회 대응 역량 강화.
- YOLOv5 기반 음식 탐지
- 업로드한 음식 이미지에 대해 바운딩 박스 표시
- 탐지된 음식의 영양 성분 조회
- 탄수화물, 당류, 지방, 콜레스테롤, 나트륨 기준 초과 여부 판단 및 경고 표시
- 연구 개발 내용
그림 1. 음식 이미지 분류를 위한 딥러닝 모델 구성도
본 프로젝트에서는 [그림 1]과 같이 음식 이미지 분류와 영양 정보 분석 시스템을 개발하고자 하며 이를 위해 Food Recognition Module (음식 인식 모듈)과 Nutrition Analysis Module (영양정보 추론 모듈) 2개의 모듈을 구현함.
- 총 3개의 음식 분류 모델 ('food_1_best.pt', 'food_2_best.pt', 'food_3_best.pt')을 구성
- 각각 약 13~14개의 음식 클래스를 Roboflow 기반 dataset에서 labeling 및 augmentation 진행
- 클래스 목록은 각각 'classes_food1.txt', 'classes_food2.txt', 'classes_food3.txt'에 저장됨
- 탐지된 음식명을 기반으로 영양 정보를 자동 조회·분석하는 모듈 개발 및 구현
그림 3. pandas 기반 데이터 분석 로직
- Pandas 라이브러리를 활용하여 전국통합식품영양성분정보(음식) 표준 데이터셋 (https://www.data.go.kr/data/15100070/standard.do) 에서 필요한 항목만 선별하여 재구성한 CSV 파일을 불러와 표 형식의 데이터를 로딩
- 엑셀 내부에는 항목 이름(예: 김밥, 비빔밥 등)과 관련 수치 정보가 테이블 형태로 저장되어있으며, 이를 자동 인식 및 매핑할 수 있도록 설계
project-root/ ├── app.py ├── yolov5/ ├── food_1_best.pt ├── food_2_best.pt ├── food_3_best.pt ├── classes_food1.txt ├── classes_food2.txt ├── classes_food3.txt ├── input.jpg ├── 음식별 영양 성분 정보.csv └── runs/
git clone https://github.com/ultralytics/yolov5.git
cd yolov5
pip install -r requirements.txt
pip install streamlit Pillow pandas torch>=1.7 opencv-python matplotlib pyyaml- Python 3.8+
- YOLOv5
- Streamlit
- Pandas
- OpenCV, Pillow
- 한식 이미지 데이터셋 (AI Hub 제공)을 기반으로 구성됨
- 총 150종의 한식 음식 클래스가 포함되어 있으며, 각 클래스당 1000장의 이미지 제공
- 학습 성능 개선을 위해 총 40종의 클래스, 각 클래스 당 30장의 이미지를 학습에 선정하여 사용
- Roboflow를 통해 학습에 적합하도록 라벨링 및 증강 처리 후 YOLOv5 학습용 데이터셋으로 변환됨
그림 5-1. 'food_1_best.pt' YOLOv5 탐지 결과
그림 5-2. 'food_2_best.pt' YOLOv5 탐지 결과
그림 5-3. 'food_3_best.pt' YOLOv5 탐지 결과
cd "프로젝트_디렉토리"
streamlit run app.py사용자가 음식 사진을 업로드하면, 아래와 같은 결과가 출력됨. 이미지는 YOLOv5 탐지 결과와 Streamlit 분석 결과로 구성됨.
- 인식된 클래스명: 콩자반
- 신뢰도: 89%
- 영양 성분 정보:
- 에너지: 281kcal
- 탄수화물: 34.83g
- 당류: 3.53g
- 나트륨: 868mg
- 경고 메시지 출력: 탄수화물 30g 이상/ 나트륨 500mg 이상
- 인식된 클래스명: 감자채볶음
- 신뢰도: 55%
- 영양 성분 정보:
- 에너지: 52kcal
- 탄수화물: 8.95g
- 당류: 0.19g
- 나트륨: 164mg
- 당뇨 기준에 모두 적합한 음식입니다. 출력
- 인식된 클래스명: 식혜
- 신뢰도: 34%
- 실제 음식과 무관한 정보가 표시됨 (고기만두)
- 잘못된 분석 결과로 인해 주의가 필요함
- 인식된 클래스명: 감자채볶음 (오탐지)
- 신뢰도: 80%
- 유사 외형 클래스 혼동으로 인한 오류 발생
- 실제 음식과 다른 영양 정보가 연결됨 (두부김치)
- 2412496 나이현 : ehyunna
- 2414801 김하영 : rlagk0
- 2416987 장은주 : ej3131
- All original code in this repository is licensed under the MIT License.
- This project also includes code from YOLOv5, which is licensed under the GNU General Public License v3.0 (GPL-3.0).
- YOLOv5: https://github.com/ultralytics/yolov5
- 식품의약품안전처: https://www.foodsafetykorea.go.kr
- 질병관리청: https://www.kdca.go.kr/












