์ค๋ ๋จน์ ์์์ ๊ฐ๋จํ ๊ธฐ๋กํ๊ณ ์ถ๋์?
eatfolio๋ ์์ ์ฌ์ง ํ ์ฅ์ผ๋ก ๋๋ง์ ์๋จ ๋ค์ด์ด๋ฆฌ๋ฅผ ๋ง๋ค์ด์ค๋๋ค.
- ์ฌ์ง์ ์ฐ์ด ์ฌ๋ฆฌ๋ฉด ์๋์ผ๋ก ํผ๋์ ์ ์ฅ ๐ธ
- ๋ ์ง๋ณ๋ก ๋ด๊ฐ ๋จน์ ์์๋ค์ ํ๋์ ํ์ธ ๐
- AI๊ฐ ์์์๋ฅผ ๋ถ์ํด ์๋จ ๊ด๋ฆฌ๊น์ง ๋์์ค๋๋ค ๐ฅ
eatfolio๋ ๋จ์ํ ๊ฑด๊ฐ ๊ด๋ฆฌ์ฉ ์ฑ์ด ์๋๋ผ,
์์์ ํตํด ์ถ์ต์ ๊ธฐ๋กํ๊ณ ๋๋ง์ ์ด์ผ๊ธฐ๋ฅผ ๋จ๊ธธ ์ ์๋ ์๋น์ค์
๋๋ค.
- ์ด์ค AI ๋ถ์ ์์คํ : YOLOv3 + ResNet ๊ธฐ๋ฐ ์์ ๋ถ์ + Gemini API ํด๋ฐฑ
- ์ค์๊ฐ ์์ ๋ถ์: ์นผ๋ก๋ฆฌ, ๋จ๋ฐฑ์ง, ์ง๋ฐฉ ๋ฑ ์์ธ ์์์ฑ๋ถ ์ ๊ณต
- ํฌ๋ก์ค ํ๋ซํผ: Flutter ๊ธฐ๋ฐ iOS/Android ์ฑ
- ์ค์๊ฐ ๋๊ธฐํ: Firebase ๊ธฐ๋ฐ ํด๋ผ์ฐ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค
- ์ฃผ๊ฐ ์๋จ ๋ถ์: AI ๊ธฐ๋ฐ ๊ฐ์ธ ๋ง์ถคํ ํผ๋๋ฐฑ ๋ฐ ์ถ์ฒ
eatfolio/
โโโ ๐ฑ eatfolio/ # Flutter ๋ชจ๋ฐ์ผ ์ฑ
โ โโโ lib/ # Dart ์์ค ์ฝ๋ (UI, ๋น์ฆ๋์ค ๋ก์ง)
โ โโโ android/ # Android ๋ค์ดํฐ๋ธ ์ค์
โ โโโ ios/ # iOS ๋ค์ดํฐ๋ธ ์ค์
โ โโโ assets/ # ์ด๋ฏธ์ง, ํฐํธ, ์์ด์ฝ
โ โโโ functions/ # Firebase Cloud Functions (Node.js 22, 2nd Gen)
โ โ โโโ index.js # Firestore ํธ๋ฆฌ๊ฑฐ, ํต๊ณ ๊ณ์ฐ
โ โ โโโ backfill.js # ๊ธฐ์กด ๋ฐ์ดํฐ ๋ฐฑํ ์คํฌ๋ฆฝํธ
โ โ โโโ package.json # Node.js ์์กด์ฑ
โ โโโ pubspec.yaml # Flutter ์์กด์ฑ
โโโ ๐ฅ๏ธ backend/ # Python FastAPI ๋ฐฑ์๋ (AI ๋ถ์ ์๋ฒ)
โ โโโ main.py # FastAPI ์๋ฒ ๋ฉ์ธ ํ์ผ
โ โโโ prompts/ # AI ํ๋กฌํํธ ํ
ํ๋ฆฟ
โ โโโ requirements.txt # Python ์์กด์ฑ
โ โโโ env.example # ํ๊ฒฝ๋ณ์ ์์
โโโ README.md # ํ๋ก์ ํธ ์ค๋ช
์
์คํ๋์ & ๋ก๊ทธ์ธ
ํ & ์์ฌ ๋ฑ๋ก
์บ๋ฆฐ๋ & ์์ฌ ์์ธ
์์ ์์ธ & ๋ฆฌํฌํธ
ํ๋กํ
![]() |
| ์ด ์ญ์ทจ ์นผ๋ก๋ฆฌ, ํ๊ท ์นผ๋ก๋ฆฌ, ๋จ๋ฐฑ์ง/ํ์ํ๋ฌผ/์ง๋ฐฉ ๋ฑ ๋์ ์์ ์ฑ๋ถ ๋ฐ์ดํฐ๋ฅผ ํ๋์ ๋ณผ ์ ์์ต๋๋ค. |
Eatfolio๋ 2๋จ๊ณ AI ๋ถ์ ์์คํ ์ ํตํด ๋์ ์ ํ๋์ ์์ ๋ถ์์ ์ ๊ณตํฉ๋๋ค.
flowchart LR
U[User] --> I[Food Image]
subgraph P["Eatfolio AI ๋ถ์ ์์คํ
(2๋จ๊ณ)"]
direction TB
subgraph M1["1์ฐจ AI ๋ชจ๋ธ (์ฐ์ ์ฌ์ฉ)"]
Y["YOLOv3<br/>๊ฐ์ฒด ํ์งยท๋ถ๋ฅ"]
R["ResNet<br/>portion ์ถ์ ยท์นผ๋ก๋ฆฌ ๊ณ์ฐ"]
Y --> R
end
subgraph F["2์ฐจ AI ๋ชจ๋ธ (ํด๋ฐฑ)"]
G["Google Gemini 2.5 Flash<br/>1์ฐจ ์คํจ ์ ์ฌ์ฉ"]
end
I --> S{"1์ฐจ ๋ถ์ ์ฑ๊ณต?"}
S -->|Yes| Y
S -->|No| G
end
R --> O[๋ถ์ ๊ฒฐ๊ณผ]
G --> O
- YOLOv3: ์์ ๊ฐ์ฒด ํ์ง ๋ฐ ๋ถ๋ฅ
- ResNet: ์(portion) ์ถ์ ๋ฐ ์นผ๋ก๋ฆฌ ๊ณ์ฐ
- Google Gemini 2.5 Flash: 1์ฐจ ๋ชจ๋ธ ์คํจ ์ ์ฌ์ฉ
๋ถ์ ์ํฉ: YOLOv3 ์ฑ๊ณต์ ์ผ๋ก "์์ฐ์ด๋ฐฅ" ๋ถ๋ฅ + ResNet์ผ๋ก ์ ์ถ์
YOLOv3 ๊ฐ์ฒด ํ์ง ๊ฒฐ๊ณผ:
- ํด๋์ค 1: 00000000 - ๋ณด๋ผ์ ๋ฐ์ด๋ฉ ๋ฐ์ค
- ํด๋์ค 2: 01016004 - ๋ น์ ๋ฐ์ด๋ฉ ๋ฐ์ค
ResNet ์ ์ถ์ ๊ฒฐ๊ณผ:
- ์์ธก: Q4 (ํ๋ฅ : 0.6451)
- ์ฒ๋ฆฌ ์๊ฐ: 0.004์ด
๋ถ์ ์ํฉ: YOLOv3๊ฐ "00000000"์ผ๋ก ์ธ์ ์คํจ โ Gemini API๋ก ํด๋ฐฑ
- Flutter 3.16+: ํฌ๋ก์ค ํ๋ซํผ ๋ชจ๋ฐ์ผ ์ฑ ๊ฐ๋ฐ
- Dart: ํ๋ก๊ทธ๋๋ฐ ์ธ์ด
- Provider/Riverpod: ์ํ ๊ด๋ฆฌ
- HTTP: ๋ฐฑ์๋ API ํต์
- FastAPI: ๊ณ ์ฑ๋ฅ Python ์น ํ๋ ์์ํฌ
- Uvicorn: ASGI ์๋ฒ
- Pydantic: ๋ฐ์ดํฐ ๊ฒ์ฆ
- Firebase Admin SDK: ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๋
- YOLOv3: ์ค์๊ฐ ๊ฐ์ฒด ํ์ง ๋ฐ ๋ถ๋ฅ
- ResNet: ์ด๋ฏธ์ง ๋ถ๋ฅ ๋ฐ ์ ์ถ์
- Google Gemini API: ์์ฐ์ด ๊ธฐ๋ฐ ์์ ๋ถ์
- CUDA: GPU ๊ฐ์ ์ฒ๋ฆฌ
- Firebase Firestore: ์ค์๊ฐ NoSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค
- Firebase Authentication: ์ฌ์ฉ์ ์ธ์ฆ
- Docker: ์ปจํ ์ด๋ํ
- GitHub Actions: CI/CD
- ์ฌ์ง ์ดฌ์: ์์ ์ฌ์ง์ ์ดฌ์ํ์ฌ ์ ๋ก๋
- ์๋ ๋ถ์: AI๊ฐ ์์ ์ข ๋ฅ์ ์์ ์๋ ์ธ์
- ์์ ์ ๋ณด: ์์ธํ ์์์ฑ๋ถ ๋ฐ ์นผ๋ก๋ฆฌ ์ ๊ณต
- ์ผ์ผ ๊ธฐ๋ก: ๋งค์ผ์ ์์ฌ ๊ธฐ๋ก ๊ด๋ฆฌ
- ์ฃผ๊ฐ ๋ถ์: 7์ผ๊ฐ์ ์๋จ ํจํด ๋ถ์
- ๋ชฉํ ์ค์ : ๊ฐ์ธ ๋ง์ถคํ ์์ ๋ชฉํ ์ค์
- ๊ฐ์ธ ๋ง์ถค ์กฐ์ธ: AI ๊ธฐ๋ฐ ์๋จ ๊ฐ์ ์ ์
- ์ถ์ฒ ์์ฌ: ๊ท ํ ์กํ ์๋จ ๊ตฌ์ฑ ์ถ์ฒ
- ์์ ์ ์: ์ข ํฉ์ ์ธ ์์ ๊ท ํ ์ ์
- ํด๋ผ์ฐ๋ ์ ์ฅ: ๋ชจ๋ ๋ฐ์ดํฐ ์๋ ๋๊ธฐํ
- ๋ณด์: Firebase ๋ณด์ ๊ท์น์ผ๋ก ๋ฐ์ดํฐ ๋ณดํธ
๋ณธ ํ๋ก์ ํธ์ AI ๋ชจ๋ธ์ AI Hub์ ์์ ์ด๋ฏธ์ง ๋ฐ ์์์ ๋ณด ํ ์คํธ ๋ฐ์ดํฐ์ ์ ์ฐธ๊ณ ํ์ฌ ์ค๊ณ๋์์ต๋๋ค.
์ฐธ๊ณ ๋ฐ์ดํฐ์ ํน์ง:
- ํ๊ตญ์ธ ๋ค๋น๋ ์ญ์ทจ ์ธ์๋ฉ๋ด์ ํ์๋ฉ๋ด 400์ข
- 84.5๋ง์ฅ์ ๊ณ ํ์ง ์ด๋ฏธ์ง (500๋ง ํ์ ์ด์)
- ์นผ๋ก๋ฆฌ, ์ผ๋ถ, ๋น๋ ๋ฑ ์์ธ ์์์ฑ๋ถ
- 100๊ฑด ์ด์์ ์ ๋ฐ ์ด๋ ธํ ์ด์










