์์ ์ด๋ฏธ์ง์์ ์์ ๊ฐ์ฒด ๋ถ๋ฆฌ + LLM ๊ธฐ๋ฐ ์ค๋ช ๋ฐ ์นผ๋ก๋ฆฌ ์์ธก ์์คํ
์์ ์ฌ์ง ์ ๊ฐ์ฒด๋ฅผ ๋ถํ (Segmentation)ํ๊ณ , ๊ฐ ๊ฐ์ฒด์ ๋ํ ์์ฐ์ด ์ค๋ช ๊ณผ ์นผ๋ก๋ฆฌ ์์ธก์ ์ํํฉ๋๋ค.

๐ ๋ฐ๋ชจ ์์ ๋ณด๊ธฐ (YouTube)
Segmentation์ ์ด๋ฏธ์ง ์ ๊ฐ ๊ฐ์ฒด๋ฅผ ํฝ์ ๋จ์๋ก ๊ตฌ๋ถํด, ๊ฐ์ฒด๋ณ๋ก ์์ญ์ ๋๋๋ ์์ ์ ๋๋ค.
๋จ์ํ ๊ฒฝ๊ณ๋ง ์ถ์ ํด ์ฌ๊ฐํ์ผ๋ก ๊ฐ์ธ๋ Object Detection๊ณผ ๋ฌ๋ฆฌ, Segmentation์ ํจ์ฌ ๋ ์ ๋ฐํ๊ฒ **ํฝ์ ๋จ์ ๋ง์คํฌ(mask)**๋ฅผ ์์ฑํฉ๋๋ค.
์ด ํ๋ก์ ํธ์์ ์ฌ์ฉํ Semantic Segmentation์ ์ด๋ฏธ์ง ๋ด ๊ฐ์ฒด๋ค์ ์๋ฏธ ์๋ ๋ผ๋ฒจ ๋จ์๋ก ๊ตฌ๋ถํ์ฌ, ๊ฐ์ ์ข ๋ฅ์ ๊ฐ์ฒด๋ ๊ฐ์ ๋ผ๋ฒจ๋ก ํ์ํฉ๋๋ค.
๋ณธ ํ๋ก์ ํธ์์๋ Mask2Former๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ ๋ถํ (Semantic Segmentation)์ ์ํํฉ๋๋ค.
์ด๋ฆ: FoodSeg103 (HuggingFace์์ ์ฌ์ฉ ๊ฐ๋ฅ)
Train ๋ฐ์ดํฐ ์: ์ฝ 6,000์ฅ
Validation ๋ฐ์ดํฐ ์: ์ฝ 1,600์ฅ
์ด ํด๋์ค ์: 104๊ฐ (์์ ์ข ๋ฅ๋ณ ๊ณ ์ ๋ผ๋ฒจ ํฌํจ)
FoodSeg103 ๋ฐ์ดํฐ์ ์ ๋ค์๊ณผ ๊ฐ์ ํ์์ ๋ผ๋ฒจ์ ํฌํจํฉ๋๋ค:
0: background
1: apple
2: banana
3: fried rice
...
๊ฐ ์ด๋ฏธ์ง์ ํฝ์
์ ์ด ๋ผ๋ฒจ ID์ ํด๋นํ๋ ๊ฐ์ ๊ฐ์ง๋ฉฐ, .json ํ์์ผ๋ก ์ ๊ณต๋๋ ๋ผ๋ฒจ ๋งคํ ํ์ผ(id2label.json)์ ํตํด ์ฌ๋์ด ์ฝ์ ์ ์๋ ๋ผ๋ฒจ๋ช
์ผ๋ก ๋ณํ๋ฉ๋๋ค.
์:
id2label[3]โ"fried rice"
Mask2Former๋ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค:

๋ณธ ํ๋ก์ ํธ๋ ์์ ์ด๋ฏธ์ง๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฐ์, ๊ฐ์ฒด ๋ถํ , ๋ผ๋ฒจ ์ถ์ถ, LLM ๊ธฐ๋ฐ ์ค๋ช ๋ฐ ์นผ๋ก๋ฆฌ ์์ธก๊น์ง ์ํํ๋ ๊ตฌ์กฐ์ ๋๋ค.
predict_masks() ํจ์๋ก ์ ๋ฌ๋จalbumentations ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด Resize(512x512), Normalize ์ํsegmentation mask + segments_info + label_idsegments_info์์ ๊ณ ์ label_id๋ฅผ ์ถ์ถํ์ฌ ์ค๋ณต ์ ๊ฑฐid2label์ ํตํด ์ต์ข
๋ผ๋ฒจ ์ด๋ฆ ๋ฆฌ์คํธ ๊ตฌ์ฑ[Input Image]
โ
[Preprocessing]
โ
[Mask2Former Inference]
โ
[Segmentation Mask + Label Extraction]
โ
[LLM Prompt (Gemini)]
โ
[Food Name + Estimated Calorie]
โ
[Gradio UI Output]
FoodSeg/
โโโ gradio_app/
โ โโโ app.py # Gradio UI
โ โโโ model_inference.py # mask ์์ธก ํจ์
โโโ scripts/
โ โโโ train.py # SegmentationTrainer ์ ์ (ํ์ต ๋ก์ง)
โ โโโ run_training.py # ๋ชจ๋ธ ํ์ต ์คํฌ๋ฆฝํธ
โโโ config.yaml # ํ์ต ์ค์
โโโ foodseg_result/ # (ํ์ต๋ ๋ชจ๋ธ ์ ์ฅ ๊ฒฝ๋ก)
โโโ README.md
python -m scripts.run_training --config configs/semantic/pipeline.yaml
Checkpoint๋
foodseg_result/ํ์์.pthํ์ผ๋ก ์ ์ฅ๋จ
python gradio_app/app.py
Gradio UI๋ฅผ ํตํด ์ด๋ฏธ์ง ์ ๋ ฅ ์ ๋ง์คํฌ ๊ฒฐ๊ณผ + ์์ฐ์ด ์ค๋ช + ์นผ๋ก๋ฆฌ ์์ธก๊น์ง ํ์ธ ๊ฐ๋ฅ
gradio_app/model_inference.pyload_model_and_processor(): ๊ฐ์ฅ ์ต์ checkpoint ๋ถ๋ฌ์ค๊ธฐpredict_masks(): ์ด๋ฏธ์ง ์ ์ฒ๋ฆฌ, ๋ชจ๋ธ ์ถ๋ก , ๋ง์คํฌ ์๊ฐํ ์ํgenerate_caption_from_labels_with_calories(): ์ธ์๋ ๋ผ๋ฒจ์ ๊ธฐ๋ฐ์ผ๋ก Gemini API ํธ์ถํ์ฌ ํ
์คํธ ์์ฑscripts/run_training.pyconfig.yaml์ ๋ถ๋ฌ์ FoodSeg103 ๋ฐ์ดํฐ์
์ผ๋ก Mask2Former ๋ชจ๋ธ ํ์ต ์ํload_config(): yaml ๋ก๋ถํฐ ์ค์ ๋ก๋ฉid2label ๋ฐ train/val dataset ๋ค์ด๋ก๋SegmentationTrainer ์ธ์คํด์ค ์์ฑ ๋ฐ ํ์ต ์์scripts/train.pySegmentationTrainer ๊ตฌํ| ๊ธฐ๋ฅ | ์ค๋ช |
|---|---|
| ๋ฐ์ดํฐ ๋ก๋ฉ ๋ฐ ์ ์ฒ๋ฆฌ | Albumentations ์ด์ฉํด Resize, Normalize, Flip ๋ฑ ์ ์ฉ |
| ๋ชจ๋ธ ์ด๊ธฐํ | ์ฌ์ ํ์ต๋ mask2former-swin-small-ade-semantic ๋ถ๋ฌ์ด |
| ํ์ต ๋ฃจํ | Epoch๋ณ ํ์ต, Loss ๊ธฐ๋ก, Validation ํฌํจ |
| ํ๊ฐ ์งํ | mean IoU(evaluate ๋ผ์ด๋ธ๋ฌ๋ฆฌ) ์ฌ์ฉ |
| ๋ชจ๋ธ ์ ์ฅ | save_pretrained() + .pth ๋ก ์ ์ฅ |
| ์๊ฐํ | tensorboard ์ฐ๋ ๋ก๊ทธ ์ ์ฅ |
| Epoch | Avg Training Loss | Validation Loss | Mean IoU |
|---|---|---|---|
| 1 | 45.7836 | 36.5247 | 0.1157 |
| 2 | 31.0042 | 29.8534 | 0.1727 |
| 3 | 24.7041 | 26.1080 | 0.2254 |
| 4 | 21.2724 | 24.2801 | 0.2612 |
| 5 | 19.0046 | 24.1669 | 0.2853 |
| 6 | 17.4488 | 23.8930 | 0.3119 |
| 7 | 15.7188 | 23.6258 | 0.3249 |
| 8 | 14.4083 | 23.0735 | 0.3544 |
| 9 | 13.5278 | 24.0761 | 0.3561 |
| 10 | 12.6420 | 23.8619 | 0.3682 |
| 11 | 11.8512 | 24.0698 | 0.3666 |
| 12 | 11.0688 | 25.3515 | 0.3584 |
| 13 | 9.5226 | 24.1838 | 0.3879 |
| 14 | 9.0237 | 24.4087 | 0.3961 |
23.0735 with high IoU 0.3544
13 commits
Python
100.0%
์์ ์ด๋ฏธ์ง์์ ์์ ๊ฐ์ฒด ๋ถ๋ฆฌ + LLM ๊ธฐ๋ฐ ์ค๋ช ๋ฐ ์นผ๋ก๋ฆฌ ์์ธก ์์คํ
์์ ์ฌ์ง ์ ๊ฐ์ฒด๋ฅผ ๋ถํ (Segmentation)ํ๊ณ , ๊ฐ ๊ฐ์ฒด์ ๋ํ ์์ฐ์ด ์ค๋ช ๊ณผ ์นผ๋ก๋ฆฌ ์์ธก์ ์ํํฉ๋๋ค.

๐ ๋ฐ๋ชจ ์์ ๋ณด๊ธฐ (YouTube)
Segmentation์ ์ด๋ฏธ์ง ์ ๊ฐ ๊ฐ์ฒด๋ฅผ ํฝ์ ๋จ์๋ก ๊ตฌ๋ถํด, ๊ฐ์ฒด๋ณ๋ก ์์ญ์ ๋๋๋ ์์ ์ ๋๋ค.
๋จ์ํ ๊ฒฝ๊ณ๋ง ์ถ์ ํด ์ฌ๊ฐํ์ผ๋ก ๊ฐ์ธ๋ Object Detection๊ณผ ๋ฌ๋ฆฌ, Segmentation์ ํจ์ฌ ๋ ์ ๋ฐํ๊ฒ **ํฝ์ ๋จ์ ๋ง์คํฌ(mask)**๋ฅผ ์์ฑํฉ๋๋ค.
์ด ํ๋ก์ ํธ์์ ์ฌ์ฉํ Semantic Segmentation์ ์ด๋ฏธ์ง ๋ด ๊ฐ์ฒด๋ค์ ์๋ฏธ ์๋ ๋ผ๋ฒจ ๋จ์๋ก ๊ตฌ๋ถํ์ฌ, ๊ฐ์ ์ข ๋ฅ์ ๊ฐ์ฒด๋ ๊ฐ์ ๋ผ๋ฒจ๋ก ํ์ํฉ๋๋ค.
๋ณธ ํ๋ก์ ํธ์์๋ Mask2Former๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ ๋ถํ (Semantic Segmentation)์ ์ํํฉ๋๋ค.
์ด๋ฆ: FoodSeg103 (HuggingFace์์ ์ฌ์ฉ ๊ฐ๋ฅ)
Train ๋ฐ์ดํฐ ์: ์ฝ 6,000์ฅ
Validation ๋ฐ์ดํฐ ์: ์ฝ 1,600์ฅ
์ด ํด๋์ค ์: 104๊ฐ (์์ ์ข ๋ฅ๋ณ ๊ณ ์ ๋ผ๋ฒจ ํฌํจ)
FoodSeg103 ๋ฐ์ดํฐ์ ์ ๋ค์๊ณผ ๊ฐ์ ํ์์ ๋ผ๋ฒจ์ ํฌํจํฉ๋๋ค:
0: background
1: apple
2: banana
3: fried rice
...
๊ฐ ์ด๋ฏธ์ง์ ํฝ์
์ ์ด ๋ผ๋ฒจ ID์ ํด๋นํ๋ ๊ฐ์ ๊ฐ์ง๋ฉฐ, .json ํ์์ผ๋ก ์ ๊ณต๋๋ ๋ผ๋ฒจ ๋งคํ ํ์ผ(id2label.json)์ ํตํด ์ฌ๋์ด ์ฝ์ ์ ์๋ ๋ผ๋ฒจ๋ช
์ผ๋ก ๋ณํ๋ฉ๋๋ค.
์:
id2label[3]โ"fried rice"
Mask2Former๋ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค:

๋ณธ ํ๋ก์ ํธ๋ ์์ ์ด๋ฏธ์ง๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฐ์, ๊ฐ์ฒด ๋ถํ , ๋ผ๋ฒจ ์ถ์ถ, LLM ๊ธฐ๋ฐ ์ค๋ช ๋ฐ ์นผ๋ก๋ฆฌ ์์ธก๊น์ง ์ํํ๋ ๊ตฌ์กฐ์ ๋๋ค.
predict_masks() ํจ์๋ก ์ ๋ฌ๋จalbumentations ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด Resize(512x512), Normalize ์ํsegmentation mask + segments_info + label_idsegments_info์์ ๊ณ ์ label_id๋ฅผ ์ถ์ถํ์ฌ ์ค๋ณต ์ ๊ฑฐid2label์ ํตํด ์ต์ข
๋ผ๋ฒจ ์ด๋ฆ ๋ฆฌ์คํธ ๊ตฌ์ฑ[Input Image]
โ
[Preprocessing]
โ
[Mask2Former Inference]
โ
[Segmentation Mask + Label Extraction]
โ
[LLM Prompt (Gemini)]
โ
[Food Name + Estimated Calorie]
โ
[Gradio UI Output]
FoodSeg/
โโโ gradio_app/
โ โโโ app.py # Gradio UI
โ โโโ model_inference.py # mask ์์ธก ํจ์
โโโ scripts/
โ โโโ train.py # SegmentationTrainer ์ ์ (ํ์ต ๋ก์ง)
โ โโโ run_training.py # ๋ชจ๋ธ ํ์ต ์คํฌ๋ฆฝํธ
โโโ config.yaml # ํ์ต ์ค์
โโโ foodseg_result/ # (ํ์ต๋ ๋ชจ๋ธ ์ ์ฅ ๊ฒฝ๋ก)
โโโ README.md
python -m scripts.run_training --config configs/semantic/pipeline.yaml
Checkpoint๋
foodseg_result/ํ์์.pthํ์ผ๋ก ์ ์ฅ๋จ
python gradio_app/app.py
Gradio UI๋ฅผ ํตํด ์ด๋ฏธ์ง ์ ๋ ฅ ์ ๋ง์คํฌ ๊ฒฐ๊ณผ + ์์ฐ์ด ์ค๋ช + ์นผ๋ก๋ฆฌ ์์ธก๊น์ง ํ์ธ ๊ฐ๋ฅ
gradio_app/model_inference.pyload_model_and_processor(): ๊ฐ์ฅ ์ต์ checkpoint ๋ถ๋ฌ์ค๊ธฐpredict_masks(): ์ด๋ฏธ์ง ์ ์ฒ๋ฆฌ, ๋ชจ๋ธ ์ถ๋ก , ๋ง์คํฌ ์๊ฐํ ์ํgenerate_caption_from_labels_with_calories(): ์ธ์๋ ๋ผ๋ฒจ์ ๊ธฐ๋ฐ์ผ๋ก Gemini API ํธ์ถํ์ฌ ํ
์คํธ ์์ฑscripts/run_training.pyconfig.yaml์ ๋ถ๋ฌ์ FoodSeg103 ๋ฐ์ดํฐ์
์ผ๋ก Mask2Former ๋ชจ๋ธ ํ์ต ์ํload_config(): yaml ๋ก๋ถํฐ ์ค์ ๋ก๋ฉid2label ๋ฐ train/val dataset ๋ค์ด๋ก๋SegmentationTrainer ์ธ์คํด์ค ์์ฑ ๋ฐ ํ์ต ์์scripts/train.pySegmentationTrainer ๊ตฌํ| ๊ธฐ๋ฅ | ์ค๋ช |
|---|---|
| ๋ฐ์ดํฐ ๋ก๋ฉ ๋ฐ ์ ์ฒ๋ฆฌ | Albumentations ์ด์ฉํด Resize, Normalize, Flip ๋ฑ ์ ์ฉ |
| ๋ชจ๋ธ ์ด๊ธฐํ | ์ฌ์ ํ์ต๋ mask2former-swin-small-ade-semantic ๋ถ๋ฌ์ด |
| ํ์ต ๋ฃจํ | Epoch๋ณ ํ์ต, Loss ๊ธฐ๋ก, Validation ํฌํจ |
| ํ๊ฐ ์งํ | mean IoU(evaluate ๋ผ์ด๋ธ๋ฌ๋ฆฌ) ์ฌ์ฉ |
| ๋ชจ๋ธ ์ ์ฅ | save_pretrained() + .pth ๋ก ์ ์ฅ |
| ์๊ฐํ | tensorboard ์ฐ๋ ๋ก๊ทธ ์ ์ฅ |
| Epoch | Avg Training Loss | Validation Loss | Mean IoU |
|---|---|---|---|
| 1 | 45.7836 | 36.5247 | 0.1157 |
| 2 | 31.0042 | 29.8534 | 0.1727 |
| 3 | 24.7041 | 26.1080 | 0.2254 |
| 4 | 21.2724 | 24.2801 | 0.2612 |
| 5 | 19.0046 | 24.1669 | 0.2853 |
| 6 | 17.4488 | 23.8930 | 0.3119 |
| 7 | 15.7188 | 23.6258 | 0.3249 |
| 8 | 14.4083 | 23.0735 | 0.3544 |
| 9 | 13.5278 | 24.0761 | 0.3561 |
| 10 | 12.6420 | 23.8619 | 0.3682 |
| 11 | 11.8512 | 24.0698 | 0.3666 |
| 12 | 11.0688 | 25.3515 | 0.3584 |
| 13 | 9.5226 | 24.1838 | 0.3879 |
| 14 | 9.0237 | 24.4087 | 0.3961 |
23.0735 with high IoU 0.3544
13 commits
Python
100.0%