안녕하세요!
오늘은 국비과정 중간프로젝트 "Meat-A-Eye" 프로젝트를 발표까지 성공적으로 마무리를 하여 정리 블로그를 작성합니다.
1. 프로젝트 개요 및 기획 배경
온라인 육류 소비가 증가하고 1인 가구 및 자취생이 많아지면서, 소분해둔 고기의 부위(등심, 채끝, 목심 등)를 육안으로 구분하기 어려운 문제가 빈번하게 발생하고 있습니다. 이력 번호를 통해 조회할 수 있지만, 라벨의 작은 숫자를 일일이 입력하는 것은 사용자 경험 측면에서 매우 불편합니다. 또한 부위별 시세를 비교하기 위해 여러 사이트를 전전해야 하는 번거로움도 존재합니다.
이러한 일상적인 불편함을 사진 한 장으로 해결하고자 MeatHub 팀(총 5명)은 "고기를 찍으면 부위가 보인다"는 의미를 담아 Meat-A-Eye 프로젝트를 시작했습니다. AI 모델 개발 및 파인튜닝, FastAPI 백엔드, Next.js 프론트엔드, 그리고 데이터 엔지니어링까지 팀원들과 역할을 분담하여 풀스택으로 구현했습니다.
핵심 목표 (3가지 축)
- AI 정확도: 통제된 연구 환경이 아닌, 실제 마트 조명이나 실내 환경에서 촬영된 현실적인 사진에서도 높은 정확도를 보장할 것.
- 실사용 가능성: 유튜브 정육 영상, 마트 현장 촬영, 실제 온라인 구매 리뷰 이미지 등 철저하게 현장 중심의 데이터를 수집하여 파이프라인 설계.
- 원스톱 사용자 경험: 부위 분석, 영양 정보, 시세, 이력 추적, 맞춤 레시피까지 한 화면에서 즉시 제공. 이를 위해 백엔드에서 3개의 외부 API를 병렬 호출하여 응답 속도 최적화.
2. 기술 스택 및 시스템 아키텍처
안정적인 서비스 제공과 비동기 처리를 위해 시스템을 크게 3개의 서버로 분리했습니다.
- Frontend: Next.js 16, shadcn/ui. 대시보드 내부는 Query Parameter 기반 클라이언트 라우팅을 적용한 SPA(Single Page Application) 구조로 설계하여 동적인 화면 갱신을 구현했습니다.
- Backend: FastAPI. 비동기 처리에 최적화하기 위해 데이터베이스는 MySQL과 aio-mysql 조합을 채택했습니다.
- AI Server: 백엔드와 별도의 프로세스(Port 8001)로 완전히 분리했습니다. 이곳에서 비전 모델과 OCR 모델이 동작합니다.
- LLM 연동: Gemini 2.5 Flash 모델을 API로 연동하여, 인식된 고기 부위에 맞는 맞춤형 레시피를 동적으로 생성합니다.
3. 핵심 로직 1: AI 부위 인식 모델 (Computer Vision)
3-1 모델 선정: EfficientNet-B2
다양한 비전 모델 중 EfficientNet-B2(ImageNet 사전학습 가중치 적용)를 선택한 이유는 다음과 같습니다.
- 경량화: 파라미터가 약 9M(9백만) 수준으로 매우 가벼워 실시간 웹 서비스에 적합합니다.
- 과적합 방지: 부위당 약 400장 수준의 소규모 데이터셋을 다루기 때문에, 무거운 대형 모델보다 과적합(Overfitting) 위험이 현저히 낮습니다.
- 특징 추출 능력: 네트워크 내부의 SE Block(Squeeze-and-Excitation)이 채널 어텐션을 수행하여, 고기의 핵심 식별 포인트인 '마블링'과 '질감' 특징을 훌륭하게 잡아냅니다. 이는 Grad-CAM을 통해 모델이 고기 영역을 정확히 활성화하는 것을 직접 확인 후 결정했습니다.

3-2 데이터 수집 및 정제 (Data Engineering)
AI의 성능은 양보다 질에 좌우된다는 철학 아래 강도 높은 데이터 엔지니어링을 수행했습니다.
- 데이터 소스: 유튜브 정육 영상 프레임 캡처, 대형 마트 및 정육점 현장 직접 촬영, 온라인 쇼핑몰 실 구매자 리뷰 이미지.
- 2단계 정제 파이프라인: 1. 자동 정제: 형식 및 크기 필터링, 중복 이미지 제거. 2. 수동 검수: 오분류 및 품질 불량 제거, 경계 케이스 판별, 레이블 수정. 결과적으로 약 1만 장의 고품질 데이터셋 확보.
- 데이터 증강(Augmentation): 고기 분류에 특화된 기법 적용. 마트 진열대의 조명을 시뮬레이션하기 위한 밝기 및 회전 변화, 신선도나 숙성도 차이를 반영하기 위한 색상 변화, 포장지 스티커나 손가락 가림에 대응하기 위한 CoarseDropout 적용.
3-3 학습 위기 극복 및 성능 최적화
1차 수집 데이터로 76%의 정확도를 달성했으나, 성능 향상을 위해 2차 데이터를 추가 수집한 후 오히려 정확도가 50% 이하로 급락하는 심각한 위기를 겪었습니다.
- 원인 분석: 2차 데이터의 품질 문제와 더불어, 데이터 수집 과정에서 특정 부위에 이미지가 편중되는 데이터 불균형(Class Imbalance)이 발생했습니다.
- 해결책 1 (Dataset Balancer): 부위별 데이터를 균등하게 분배하는 Dataset Balancer 로직을 직접 설계했습니다. 소고기는 부위당 100장, 돼지고기는 50장으로 고정하고 Train/Val/Test 비율을 70:15:15로 맞췄습니다.
- 해결책 2 (클래스 병합): Confusion Matrix 분석 결과, '설도'와 '우둔'처럼 해부학적으로 인접하여 경량 모델로는 시각적 구분이 불가능에 가까운 부위들의 오분류율이 30%를 넘었습니다. 과감하게 유사 부위를 하나의 클래스로 병합하여 모델의 혼동을 줄였습니다.
- 결과: Warmup, Label Smoothing, Mixup 등의 정규화 기법을 강화하여 v1부터 v4까지 반복 파인튜닝을 거친 끝에 최종 소고기 90.0%, 돼지고기 94.2%의 분류 정확도를 달성했습니다.

4. 핵심 로직 2: 이력번호 인식 OCR (Hybrid Approach)
단일 OCR 모델의 한계를 뼈저리게 느끼고 하이브리드 아키텍처를 도입했습니다.
4-1 왜 하이브리드인가?
초기 단일 모델 테스트 시 정확도가 50% 수준에 머물렀습니다.
- EasyOCR: 한글 및 영문 텍스트 영역 탐지(Detection) 능력이 우수하나, 정작 중요한 이력번호 숫자 인식(Recognition) 정확도가 떨어졌습니다.
- PaddleOCR: 숫자 인식 능력은 매우 뛰어나지만, 텍스트 영역을 찾아내는 탐지 능력이 부족했습니다.
- 결론: 탐지(Detection)는 EasyOCR에, 인식(Recognition)은 PaddleOCR에 맡기는 하이브리드 파이프라인을 구축했습니다.

4-2 OCR 트러블슈팅의 연속
가장 고통스러웠던 부분은 데이터 라벨링(어노테이션) 및 정제 과정이었습니다.
- 어노테이션 불일치 문제: 확보한 300건의 매장 이력번호 이미지에서, 원본 어노테이션의 크기 정보와 실제 해상도가 다르고 회전된 이미지가 섞여 있어 Bounding Box(BBOX) 좌표가 완전히 어긋나는 현상이 발생했습니다. 학습 정확도가 0%가 나오는 등 큰 차질이 빚어졌습니다.
- EasyOCR 사선 탐지 한계: 영역 탐지 시각화 결과, EasyOCR이 축 정렬된 정사각형 형태의 BBOX만 그리기 때문에 라벨이 조금만 기울어져 있어도 엉뚱한 영역을 탐지하는 것을 발견했습니다.
- 해결책: 발표를 앞두고 300장의 이미지를 모두 수평이 되도록 일일이 이미지 툴로 편집하고 좌표를 다시 라벨링하는 강수를 두었습니다. 또한 PaddleOCR에서 발생한 딕셔너리 차원 불일치(중국어 모델 인식 오류) 문제를 해결하기 위해, 95자 딕셔너리를 포함한 영어 사전학습 모델(en_PP-OCRv4)로 교체하고 가중치를 최대한 활용했습니다.
- 결과: 최종 54장 테스트셋 기준 88.9%의 인식 정확도와 4초 미만의 처리 속도를 달성했습니다.

5. 부가 및 핵심 기능 요약
- AI 부위 분석: 소고기 9부위, 돼지고기 7부위 등 총 16종을 4초 미만으로 인식.
- OCR 이력 추적: 4초 미만의 속도로 국내산/수입산 이력번호 추출. 국내산은 MTRACE 웹페이지로 직결, 수입산은 meatwatch API를 통해 자체 UI 내에서 결과 렌더링.
- 실시간 시세 대시보드: KAMIS API를 활용하여 전국 29개 지역의 소매 가격 및 주간 추이 차트 제공. 영양 정보는 식품안전나라 API 활용.
- LLM 맞춤 레시피: Gemini 2.5 Flash를 통해 인식된 부위에 최적화된 레시피를 자동 생성 및 북마크 지원.
- 스마트 냉장고 관리: D-day 기반 유통기한 관리 및 커스텀 육류 데이터 수정 기능.
- 게스트 마이그레이션: UUID를 활용해 비회원 체험을 제공하고, 회원가입 시 기존 데이터를 자동으로 이관.
6. 향후 계획 및 프로젝트 총평

[향후 고도화 계획]
- 데이터 플라이휠 구축: AWS S3 버킷을 활용하여 실사용자들이 업로드하는 이미지를 수집, 부위당 400장 수준인 현재의 데이터 규모를 확장하여 모델을 지속 학습시킬 예정입니다.
- 인식 범위 세분화: 현재 대분류 수준의 고기 덩어리 위주인 인식 범위를, 찌개용이나 구이용으로 잘게 썰린 소분할 고기까지 확장하는 것이 목표입니다.
- 수입산 OCR 개선: 자릿수가 길고 복잡한 수입산 이력번호의 인식률을 더욱 튜닝하여 전체 OCR 정확도를 90% 이상으로 끌어올릴 것입니다.
[팀 리더로서의 총평] 이번 프로젝트를 관통하는 가장 큰 배움은 "데이터는 단순히 많이 모으는 것보다, 노이즈 없이 균일하고 깨끗하게 모으는 것이 AI 성능의 절대적인 기준이 된다"는 점입니다. 수동으로 정제한 100장의 깔끔한 이미지가 무작위로 긁어모은 1,000장의 이미지보다 모델 학습에 훨씬 유용했습니다.
또한, 성능의 한계에 부딪혔을 때 단일 기술에 고집하지 않고 하이브리드 접근법(EasyOCR + PaddleOCR)을 시도한 점, 그리고 시각적으로 구분 불가능한 클래스를 과감히 병합하는 모델링 전략이 실무적으로 어떻게 문제를 해결하는지 직접 체감할 수 있었던 소중한 경험이었습니다.
어려운 기술적 난제들을 포기하지 않고 끝까지 함께 해결해 준 MeatHub 팀원들 모두 고생 많으셨습니다.
마무리
https://pak1010pak.tistory.com/121
[Meat-A-Eye] 파인튜닝을 통한 정확도 70% → 90% 개선 정리
[Project] 고기 부위 분류 AI: 파인튜닝을 통한 정확도 70% → 90% 개선 전략요약: EfficientNet-B2 기반 고기 부위 분류 모델을 점진적 파인튜닝과 체계적 테스트를 통해 정확도 70% → 80% → 90%로 개선한
pak1010pak.tistory.com
https://pak1010pak.tistory.com/123
[OCR] PaddleOCR 축산물 이력번호 인식 모델 학습 성공 과정
PaddleOCR 축산물 이력번호 인식 모델 학습 과정MeatHub 프로젝트 — AI 서버 OCR 엔진 파인튜닝 전체 과정 문서 안녕하세요!오늘은 오랜 앙숙이였던 PaddleOCR에 학습을 성공한 내용 정리와 학습을 통해
pak1010pak.tistory.com
저희와 비슷한 프로젝트를 진행하거나 어려움이 있으신 분들은 제가 작성한 블로그를 참고하시면 확실한 도움이 될 것 입니다.
이번 프로젝트를 통해 저는 AI학습에 대해서는 두려움이 없어질 정도로 자신감이 생겼습니다. 비전AI를 학습을 시키기 위해 없는 데이터셋을 직접 수집, 정제 작업을 거쳤고 목표했던 성능지표까지 도달했습니다. 또 PaddleOCR의 학습을 성공시켜 성능을 끌어올린 경험은 정말 짜릿했습니다. 이 성공적인 결과로 프로젝트 발표를 마치고 동기들의 칭찬과 호응을 많이 받을 수 있었습니다.
이번 프로젝트는 저에게 엄청난 성장을 안겨주었습니다. 목표에 광적으로 다가간다면 안 되는건 없는 거 같습니다. 시간이 지나도 Meat-A-Eye프로젝트의 경험은 잊지 못 할 거 같습니다. 이상 Meat-A-Eye 프로젝트를 마무리 하겠습니다.
'4. [팀] 프로젝트 및 공모전 > 4-2 Meat-A-Eye' 카테고리의 다른 글
| [Meat-A-Eye] 성능 개선 프로세스 상세 메모 블로그 (0) | 2026.02.06 |
|---|---|
| [Meat_A_Eye] 소고기 부위 분류 모델 성능 개량 (0) | 2026.02.03 |
| [개발 기록] 대시보드 가격 API 응답 시간 줄이기 - 병렬 호출과 캐시 사용 (0) | 2026.02.02 |
| [개발 기록] KAMIS API 연동 개선 및 대시보드 필터링 로직 최적화 (0) | 2026.02.01 |
| [Meat-A-Eye] 데이터 수집 과정 정리 (0) | 2026.01.24 |
