[FIRECLIP AI] ๊ฐ๋จํ ํด๋ฆฝ ์์ ํ์ฌ ํ์ง ์น ์๋น์ค ์ํ ๊ณํ์ (+์ค์ ์งํ) - ์์ฑ ์ค
์ฌํด 3์๋ถํฐ 5์๊น์ง ๋ฃ๋ ICT ์ด๋ ธ๋ฒ ์ด์ ์คํ์ด ์ธ๊ณต์ง๋ฅ ๋น์ ์ปดํจํ ๊ณผ์ ์์ ๋ง์ง๋ง 2์ฃผ๊ฐ ๊ฐ์ธ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ ์๊ฐ์ด ์๋ค
์ด๋ค๊ฑธ ํด๋ณด๋ฉด ์ข์๊น ๊ณ ๋ฏผํ๋ค๊ฐ ์ด์ ์ ๋ฌด์์ ๋งก์๋ ํ์ฌ ํ์ง๋ฅผ ์น์ ์ฌ๋ ค๋ณด๊ณ ์ ์ฒด์ ์ธ ํ๋ฆ์ ๊ฒฝํํด๋ณด๋ฉด ์ข๊ฒ ๋ค ์ถ์ด์ ์น์ ์งง์ ํ์ฌ ํด๋ฆฝ ์์์ ์ ๋ก๋ํ๋ฉด ํ์งํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์๋ ค์ฃผ๋ ๊ฐ๋จํ AI๋ฅผ ์ป์ ์น์ ๋ง๋ค์ด๋ณด๊ธฐ๋ก ํ์๋ค
์น, ํ๋ก ํธ์ ๋ฐฑ์๋ ๋ถ๋ถ์ ์ ํ ๋ค๋ค๋ณธ ์ ์ด ์์๊ธฐ์ ์ฝ์ง์ ๋ง์ด ํ๊ณ ์๋ค
ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด 2๊ฐ์ง ๋ฌธ์๊ฐ ๋์์ผ ํ๋ค. ๋ฐ๋ก ์ํ ๊ณํ์ (๊ธฐํ์) ๋ฐ ๊ฒฐ๊ณผ ๋ณด๊ณ ์
์ด๋ฒ ๊ธ์์ ๋จผ์ ์ ์ฒด์ ์ธ ๊ณํ์ ๋จผ์ ์ธ์๋ณด๊ณ ์ค์ ๋ก ๊ณํ๋๋ก ์งํ๋์๋์ง, ์งํํ๋ฉด์ ์ด๋ ๋ถ๋ถ์ด ๋งํ๊ณ ์ด๋ค ์ด์๋ค์ด ๋ฐ์ํ๋์ง, ๊ณํ์ ์กฐ์ ํ์ฌ ์ด๋๊น์ง ๊ตฌํํ๊ธฐ๋ก ํ๋์ง ๋ฑ ๊ณํ๊ณผ ์ค์ ์งํ ๋ด์ฉ์ ๋น๊ตํ ๋ด์ฉ์ ์ ๋ฆฌํด๋ณด์๋ค
์์ ๋ด์ฉ ๋ฐ ์๋ฃ๋ค์ ๋ฒ ์ด์ค๋ก ํ์ฌ ๊ธฐ์ค ์ผ๊ณ ์ํ๋ ๋ฐฉํฅ์ฑ์ ๋ง๊ฒ ์ปค์คํ ํ๋ ์์ผ๋ก ์งํํ์๋ค
์ด ๊ณํ์์ ์งํํ๋ฉด์ ๋จ๊ธด ๊ธฐ๋ก๋ค์ ๋ฐํ์ผ๋ก ๊ฒฐ๊ณผ ๋ณด๊ณ ์ (PPT ํํ์ ๋ฐํ์๋ฃ or docx ๋ฌธ์) ๋ฅผ ์ ๋ฆฌํด์ 2๋ฒ์งธ ๊ธ๋ก ์ฌ๋ฆด ์์ ์ด๋ค
์ง๊ธ ์ ์ ๊ณํ๋ค์ ๊ฑฐ์ฐฝํ์ผ๋..(๋ด ๊ธฐ์ค) ๋ง์ ํด๋ณด๋ ๋ชจ๋ฅด๋ ๋ถ๋ถ๋ค์ด ์ ๋ง ๋ง์๋ค
๐ ํ๋ก์ ํธ๋ช
FireClip AI: ํด๋ฆฝ ์์ ๊ธฐ๋ฐ ํ์ฌ ํ์ง ์น์๋น์ค
๐ฏ 1. ํ๋ก์ ํธ ๊ฐ์
ํญ๋ชฉ | ๋ด์ฉ |
๋ชฉํ | ์ฌ์ฉ์๊ฐ ์ ๋ก๋ํ ์ค๋ด CCTV ํด๋ฆฝ ์์์์ ์ฐ๊ธฐ ๋๋ ๋ถ๊ฝ์ ์๋ ํ์งํ๊ณ , ํ์ง๋ ๊ฒฐ๊ณผ(๋ฐ์ด๋ฉ๋ฐ์ค)๋ฅผ ๊ทธ๋ฆฐ ์์์ผ๋ก ์นํ์ด์ง์ ํ์ํ๋ ๊ฒฝ๋ ์น์๋น์ค ๊ตฌํ |
๊ธฐ์ ์คํ | GCP, Flask, MongoDB, YOLO, OpenCV |
๐งฑ 2. ๋ฐ์ดํฐ ๊ตฌ์ถ ๋ฐ ๋ชจ๋ธ ํ์ต
ํญ๋ชฉ | ๋ด์ฉ |
์ฌ์ฉ ๋ฐ์ดํฐ ํ์ | CCTV ํ์์ ํด๋ฆฝ ์์ ๋ฐ ์ด๋ฏธ์ง |
๋ผ๋ฒจ ํญ๋ชฉ ์ | ์ฐ๊ธฐ/๋ถ๊ฝ 2๊ฐ ํด๋์ค ํฌํจ |
๊ตฌ์ถ ์ ๋ต (์์ง ๊ฒฝ๋ก) | โ
๊ณต๊ฐ ํ์ฌ/์ฐ๊ธฐ ์ด๋ฏธ์ง ๋ฐ์ดํฐ์
ํ์ฉ (AIhub, kaggle, Roboflow) โ ํ์์ ํฌ๋กค๋ง ๋๋ YouTube ํด๋ฆฝ์ผ๋ก ๋ณด์ โ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ ๋ฐ YOLO ํฌ๋งท์ผ๋ก ๋ผ๋ฒจ๋ง |
์์ง๋ | ์ต์ 1000์ฅ ์ด๋ฏธ์ง (๋ผ๋ฒจ ํฌํจ) |
์ด๋ฏธ์ง ํด์๋ | 640×480 ~ 1920×1280 (1280x1080 ์ด์ ๊ถ์ฅ) |
๋ฐ์ดํฐ๋น ํ๊ท ์ฉ๋ | ์ฝ 500 ~ 1,000KB |
๋ผ๋ฒจ๋ง ๋๊ตฌ | Roboflow |
๋ชจ๋ธ ์ฌ์ฉ ์ ๋ต | ๐ ์ํฉ์ ๋ฐ๋ผ ์ ํ โ ์ฌ์ ํ์ต๋ YOLOv8 ๋ถ๊ฝ/์ฐ๊ธฐ ๋ชจ๋ธ ๊ทธ๋๋ก ์ฌ์ฉ โก ๊ฒฝ๋ ์ปค์คํ ๋ฐ์ดํฐ๋ก ํ์ธํ๋ |
๐งฑ 2-1. ๋ผ๋ฒจ๋ง ๊ธฐ์ค ๋ฐ ํ์ง ๊ด๋ฆฌ
ํญ๋ชฉ | ๊ธฐ์ค |
๋ฐ์ด๋ฉ ๋ฐ์ค | ์ต์ ํฌํจ ์์ญ, ํด๋์ค๋ช ํฌํจ |
๋ถ๋ฅ ๋ผ๋ฒจ | ๊ณ ์ ํด๋์ค ID + ์ค๋ช |
๊ฒ์ | ์ํ ๊ฒ์ 20% |
- ์ ์ฅ ๋ฐ ๊ด๋ฆฌ
- ํ์: YOLO TXT
- ์ ์ฅ์: Google Drive
- ๊ด๋ฆฌํด: Roboflow
- ๋ฐ์ดํฐ ์ฆ๊ฐ ๊ณํ
- Noise, saturation, hue, hori flip, brightness
๐ป ์ผ๋ฐํ ์ฑ๋ฅ ๊ฒํ
- ํ์ต๋ฐ์ดํฐ์ ํฌํจ๋์ง ์์ ํ์ง ๋์ ๋ฐ์ดํฐ 20์ฅ ์ด์์ ๋ํ ํ์ง๋ฅ๋ ฅ ํ๊ฐ
- mAP ์ฑ๋ฅ์ ์ฐ์ถํ์ฌ 0.7 ์ด์์ด ๋๋๋ก ํ์ต ๋ฐ์ดํฐ ์กฐ์
๐งฑ 2-2. ๋ฐ์ดํฐ ๊ตฌ์ถ ์งํ
์ฌ์ฉ ๋ฐ์ดํฐ | Roboflow, AIํ๋ธ, Kaggle |
๋ผ๋ฒจ๋ง ํด | Roboflow |
์ค์ CCTV์ ์ ์ฌํ 720p (1280 x 720) / 1080p(1920 x 1080 ) ํฌ๊ธฐ๋ฅผ ๊ฐ์ง ์ค๋ด์ ์ด๋ฏธ์ง๋ฅผ ๊ตฌํ๊ธฐ๋ ์ฝ์ง ์์
- ํนํ CCTV ํ์ฌ ์ด๋ฏธ์ง๋ ๋๋์ฑ ๊ตฌํ๊ธฐ ์ด๋ ต๋ค (๋ณด์ ๊ด๋ จ ์ด์ ๋ฑ ๊ณต์ ๋์ง ์๋ ๊ฒฝ์ฐ๊ฐ ๋๋ค์)
- Roboflow Kaggle ์์ ๊ตฌํ ์ด๋ฏธ์ง๋ค์ ํ์ง์ด ๋ฎ์ ์นด๋ฉ๋ผ๋ก ์ฐํ ์์๋ค์ 640x640 ํฌ๊ธฐ๋ก ๋ฆฌ์ฌ์ด์ฆํ๊ธฐ ๋๋ฌธ์ ๋๋ถ๋ถ ์ด๋ฏธ์ง์ ํ๋ฆฌํฐ๊ฐ ๋ง์ด ๋จ์ด์ง
- AIHub์ ๊ฒฝ์ฐ 1920x1080 ํฌ๊ธฐ์ ๊ณ ํ์ง ์ด๋ฏธ์ง์ด์ง๋ง ์ผ์ธ ์ดฌ์ ์ด๋ฏธ์ง
1์ฐจ ๋ฐ์ดํฐ์
730์ฅ ๋ผ๋ฒจ๋ง ๋ฐ ์ด๋ฏธ์ง ์ฆ๊ฐ ์ ์ฉ ํ ์ด 1810์ฅ
ํด๋์ค๋ณ ๊ฐ์ฒด ๊ฐ์
- fire : 894 ๊ฐ
- smoke : 250 ๊ฐ
Preprocessing
- Auto-Orient: Applied
- Resize: Stretch to 640x640
Augmentations
- Outputs per training example: 3
- 90° Rotate: Clockwise, Counter-Clockwise, Upside Down
- Saturation: Between -25% and +25%
- Brightness: Between -15% and +15%
- Blur: Up to 2.5px
- Noise: Up to 0.1% of pixels
๋ฐ์ดํฐ์ ๊ตฌ์ฑ
- Train Set : 90%, 1620 ์ฅ
- Valid Set : 8%, 146์ฅ
- Test Set : 2%, 44์ฅ
2์ฐจ ๋ฐ์ดํฐ์
280์ฅ ์ถ๊ฐ ๋ผ๋ฒจ๋ง ๋ฐ ์ด๋ฏธ์ง ์ฆ๊ฐ ์ ์ฉ ํ ์ด 2524์ฅ
ํด๋์ค๋ณ ๊ฐ์ฒด ๊ฐ์
- fire : 1,134 ๊ฐ
- smoke : 518 ๊ฐ
Preprocessing
- Auto-Orient: Applied
- Resize: Stretch to 640x640
Augmentations
- Outputs per training example: 3
- 90° Rotate: Clockwise, Counter-Clockwise, Upside Down
- Saturation: Between -25% and +25%
- Brightness: Between -15% and +15%
- Blur: Up to 2.5px
- Noise: Up to 0.1% of pixels
- Shear: ±10° Horizontal, ±10° Vertical
๋ฐ์ดํฐ์ ๊ตฌ์ฑ
- Train Set : 91%, 2286 ์ฅ
- Valid Set : 7%, 187์ฅ
- Test Set : 2%, 51์ฅ
๋ฐ์ดํฐ ์ถ์ฒ
- [Roboflow] Indoor Fire Detection Dataset
- [AI-Hub] ํ์ฌ ๋ฐ์ ์์ธก ์์ ์ํ ๋ฐ์ดํฐ
- [Kaggle] Fire Detection from CCTV
- [Roboflow] Fire-indoor Object Detection Dataset
๐งฑ 2-3. ๋ชจ๋ธ ํ์ต ๊ฒฐ๊ณผ
ํ์ต ์คํฌ๋ฆฝํธ ๋ฐ ๋ชจ๋ธ ํ๋
ํ๊ฒฝ : Colab
์ผ๋ฐ ํ์ต ์คํฌ๋ฆฝํธ
from ultralytics import YOLO
# ๋ชจ๋ธ ์ด๊ธฐํ (๊ฐ๋ณ๊ฒ ์์: yolov8n.pt)
model = YOLO('yolov8n.pt') # ๋๋ yolov8s.pt, yolov8m.pt ๋ฑ
# ํ์ต ์์
model.train(
data='/content/data/data.yaml',
epochs=50,
imgsz=640,
batch=16,
project='yolov8_fire_detection',
name='exp',
exist_ok=True
)
- 1,2์ฐจ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ํ์ต
- ๋ ๋ค์ํ ํ๋ผ๋ฏธํฐ ๊ฐ์ผ๋ก ์๋์ผ๋ก ์ต์ ์ ์กฐํฉ ์ฐพ๋๋ก wandb์ sweep ๊ธฐ๋ฅ ์ฌ์ฉ ์์
Wandb Sweep๋ก ๋ชจ๋ธ ์๋ ํ๋
!pip install -U ultralytics
!wandb login <api key>
!yolo settings wandb=True
import wandb
from wandb.integration.ultralytics import add_wandb_callback
from ultralytics import YOLO
# ํ๋ก์ ํธ๋ช
์ง์ (์๋ ์์ฑ๋ ๊ฐ๋ฅ)
wandb.init(project="fire_clip_project", job_type='training')
- wandb ์ฐ๊ฒฐ ๋ฐ sweep ์ค์
sweep_config = {
'method': 'random',
'metric': {'goal': 'maximize', 'name': 'metrics/mAP50-95(B)'},
'parameters': {
'batch_size': {'values': [16, 32, 64]},
'learning_rate': {
'distribution': 'uniform',
'min':0.0001,
'max':0.001
}
}
}
- ํ๋ํ ํ์ดํผํ๋ผ๋ฏธํฐ ์ง์
- mAP50-95๊ฐ ์ต๋ํ๋๋ ๊ฒ์ ๊ธฐ์ค์ผ๋ก ์ผ์
- ๋ฐฐ์น ์ฌ์ด์ฆ์ ํ์ต๋ฅ ์ ์ฌ๋ฌ ์กฐํฉ๋ณ๋ก ํ์ต ์งํ
- ์ด ์ธ์๋ ๋ ๋ง์ ํ๋ผ๋ฏธํฐ๋ค ์ถ๊ฐ ๊ฐ๋ฅ
- sweep config ์ค์ ํ ํ์ต ๋๋ฆฌ๋ฉด ์กฐํฉ๋ค์ ์๋์ผ๋ก ํ์ต ๋ฐ wandb์ ์ฑ๋ฅ ๋ก๊น
sweep_id = wandb.sweep(sweep=sweep_config, project='fire_clip_project')
def yolo_train():
with wandb.init() as run:
config = wandb.config
# ๋ชจ๋ธ ์ ์ ๋ฐ ํ์ดํผํ๋ผ๋ฏธํฐ ์ฌ์ฉ
model = YOLO('yolov8n.pt')
add_wandb_callback(model, enable_model_checkpointing=True)
results = model.train(
data='/content/data/data.yaml',
name='exp3',
plots=True,
batch=config.batch_size,
epochs=50,
imgsz=640,
cos_lr=True,
lrf=0.01,
lr0=config.learning_rate,
project='yolov8_fire_detection'
)
metrics = results.metrics
wandb.log({
'epoch': 50, # ๋๋ run.step ๋ฑ ์ฌ์ฉ ๊ฐ๋ฅ
'val_loss': results.loss, # ๋๋ ๋ค๋ฅธ ์ ์ ํ loss ์ฌ์ฉ
'metrics/mAP50': metrics.get('metrics/mAP50(B)', None),
'metrics/mAP50-95': metrics.get('metrics/mAP50-95(B)', None)
})
์ฑ๋ฅ ๋น๊ต
์ฑ๋ฅ์งํ | recall(B) | precision(B) | mAP50(B) | mAP50-95(B) |
1์ฐจ | ||||
2์ฐจ |
๐ ๏ธ 3. ๊ตฌํ ๋ฒ์ ๋ฐ ๊ธฐ๋ฅ ์ ์
๋ถ๋ฅ | ๊ธฐ๋ฅ | ์ค๋ช |
๐ฅ ์์ ์ ๋ ฅ | 10~30์ด ์์ ํด๋ฆฝ ์ ๋ก๋ (mp4) | ์น UI์์ ์ฌ์ฉ์๊ฐ ์ง์ ์ ๋ก๋ |
๐ง ํ์ฌ ํ์ง | YOLOv8 ๊ธฐ๋ฐ ์ฐ๊ธฐ/๋ถ๊ฝ ํ์ง | Flask API ๋ด๋ถ์์ ํ๋ ์ ์ถ์ถ ํ ํ์ง ์ํ |
๐ผ๏ธ ๊ฒฐ๊ณผ ํ์ | ํ์ง๋ ํ๋ ์ ์ธ๋ค์ผ + ์๊ฐ์ ๋ณด ํ์ | MongoDB์ ๊ฒฐ๊ณผ ์ ์ฅ, ์น์์ ๋ชฉ๋ก ์กฐํ |
๐ ๊ฒฐ๊ณผ ์ ์ฅ | ํ์ง ์ด๋ฏธ์ง์ ๋ฉํ๋ฐ์ดํฐ ์ ์ฅ | ์ด๋ฏธ์ง ํ์ผ : GCP Cloud Storag ๋ฉํ ๋ฐ์ดํฐ : MongoDB |
๐ ๏ธ 3-1. ์ฌ์ฉ ๊ธฐ์ ์คํ
ํํธ | ๊ธฐ์ |
์น ์๋ฒ | Flask (GCP Cloud Run ๋ฐฐํฌ) |
DB | MongoDB |
ํด๋ผ์ด์ธํธ | HTML (+CSS) |
์์ ์ฒ๋ฆฌ | OpenCV |
ํ์ง ๋ชจ๋ธ | YOLOv8s/n |
์คํ ๋ฆฌ์ง | GCP Cloud Storage |
๐ ๏ธ 3-2. ์ ์ฒด ๊ตฌ์กฐ
FireClip AI ํ๋ก์ ํธ ์ต์ข ๊ธฐํ์๋ฅผ ๊ธฐ์ค์ผ๋ก, ์น์๋น์ค์ ์ ์ฒด ํ๋ฆ์ ๊ณ ๋ คํ ๋ฐฑ์๋ ๋ฐ ์น ๊ตฌ์กฐ(์์คํ ์ํคํ ์ฒ)
GCP + Flask + MongoDB + YOLO ๊ธฐ๋ฐ์ผ๋ก ์๋
์ฌ์ฉ์(๋ธ๋ผ์ฐ์ )
โ
โผ
[Frontend] (HTML+CSS)
- ์์ ์
๋ก๋
- ํ์ง ๊ฒฐ๊ณผ ํ์ธ
โ
โผ
[Flask Backend API Server] (GCP Cloud Run)
- ์์ฒญ ์ฒ๋ฆฌ (REST API)
- YOLOv8 ์ถ๋ก ์ฐ๋
- Cloud Storage & MongoDB ์ฐ๋
โ
โโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโ
โผ โผ โผ
[YOLOv8 Inference] [GCS] [MongoDB]
(๋ก์ปฌ or Cloud) (์์ ์ ์ฅ) (๋ฉํ๋ฐ์ดํฐ ์ ์ฅ)
๐ ๋ฐฑ์๋ ๊ตฌ์กฐ (Flask)
๐น ์ฃผ์ ๊ตฌ์ฑ ์์
๊ธฐ๋ฅ | ์ค๋ช |
/upload | ์์/์ด๋ฏธ์ง ์ ๋ก๋ API |
/detect | YOLO ์ถ๋ก ์์ฒญ API (์ ๋ก๋ ํ ๋ด๋ถ ํธ์ถ or ์ฌ์ฉ์ ์์ฒญ) |
/results/<id> | ํ์ง ๊ฒฐ๊ณผ ๋ฉํ๋ฐ์ดํฐ ์กฐํ |
/list | ์ ๋ก๋ํ ์ด๋ ฅ ๋ฆฌ์คํธ ์กฐํ API |
๐น ์ฃผ์ ์ฒ๋ฆฌ ํ๋ฆ
- ์ฌ์ฉ์๊ฐ ์์ ์ ๋ก๋ (POST /upload)
- Flask ์๋ฒ์์ GCS์ ์์ ์ ์ฅ
- ์ ์ฅ๋ ์์ ๊ฒฝ๋ก๋ฅผ ๊ธฐ๋ฐ์ผ๋ก YOLO ์ถ๋ก ์คํ
- ์ถ๋ก ๊ฒฐ๊ณผ(ํ๋ ์ + ๋ฐ์ค ์ขํ + ํด๋์ค)๋ฅผ ์ด๋ฏธ์ง/์ธ๋ค์ผ๋ก ์ ์ฅ
- MongoDB์ ํด๋น ์์/๊ฒฐ๊ณผ ๋ฉํ๋ฐ์ดํฐ ๊ธฐ๋ก (ํ์ผ ๊ฒฝ๋ก, ํ์ง๊ฒฐ๊ณผ ๋ฑ)
- ํ๋ก ํธ์์ /list, /results/<id>๋ฅผ ํตํด ๊ฒฐ๊ณผ ์กฐํ
๐ ํ๋ก ํธ์๋ ๊ตฌ์กฐ (HTML + CSS)
๐น ํ์ด์ง ๊ตฌ์ฑ
ํ์ด์ง | ๊ธฐ๋ฅ |
/upload.html | ์์ ์ ๋ก๋ UI, ์ ๋ก๋ ์งํ ์ํ |
/results.html | ํ์ง ๊ฒฐ๊ณผ ์ธ๋ค์ผ ๋ฆฌ์คํธ |
/details.html?id=... | ์ ํ๋ ๊ฒฐ๊ณผ ์์ธ ๋ณด๊ธฐ (ํ์ง๋ ์ด๋ฏธ์ง, ๊ฒฐ๊ณผ ํ ์คํธ ๋ฑ) |
๐น ์ฐ๋ API
- POST /upload: ์์ ์ ๋ก๋
- GET /list: ๊ฒฐ๊ณผ ๋ชฉ๋ก ๋ถ๋ฌ์ค๊ธฐ
- GET /results/<id>: ๊ฒฐ๊ณผ ์์ธ ์กฐํ
โ๏ธ ํด๋ผ์ฐ๋ ๊ตฌ์ฑ (GCP ๊ธฐ๋ฐ)
๊ตฌ์ฑ ์์ | ์ญํ |
Cloud Run | Flask ๋ฐฑ์๋ ๋ฐฐํฌ์ฉ ์ปจํ ์ด๋ ์คํ |
Cloud Storage | ์๋ณธ ์์ ๋ฐ ์ธ๋ค์ผ ์ด๋ฏธ์ง ์ ์ฅ |
MongoDB Atlas | ๋ฉํ๋ฐ์ดํฐ ์ ์ฅ (์์ ID, ์๊ฐ, ํ์ง ํด๋์ค ๋ฑ) |
YOLOv8 | ๋ชจ๋ธ ์ถ๋ก ์ Cloud Run ๋ด๋ถ or ๋ถ๋ฆฌ๋ ์ธ์คํด์ค์์ ์คํ ๊ฐ๋ฅ (๋ฆฌ์์ค ๊ณ ๋ ค) |
โ ์ถ์ฒ ๋๋ ํฐ๋ฆฌ ๊ตฌ์กฐ (Flask ๊ธฐ์ค)
fireclip-backend/
โโโ app.py
โโโ routes/
โ โโโ upload.py
โ โโโ detect.py
โ โโโ results.py
โโโ services/
โ โโโ storage.py # GCS ์ ์ฅ ๊ด๋ จ
โ โโโ inference.py # YOLO ์ถ๋ก ํธ์ถ
โ โโโ database.py # MongoDB ์ฒ๋ฆฌ
โโโ static/ # ์ธ๋ค์ผ ๋ฑ ์ ์ ํ์ผ
โโโ templates/ # ํ๋ก ํธ HTML
โโโ requirements.txt
โโโ Dockerfile
๐งฉ ๊ธฐ๋ฅ ๊ตฌํ ์์ ์ ์
- ๊ธฐ๋ณธ Flask ๋ผ์ฐํฐ ๋ฐ API ๊ตฌ์กฐ ์ธํ
- ์์ ์ ๋ก๋ ์ฒ๋ฆฌ + GCS ์ ์ฅ ์ฐ๋
- YOLO ์ถ๋ก ์คํฌ๋ฆฝํธ ํ ์คํธ ๋ฐ Flask ์ฐ๋
- ๊ฒฐ๊ณผ ์ธ๋ค์ผ ์์ฑ ๋ฐ MongoDB ๋ฉํ๋ฐ์ดํฐ ์ ์ฅ
- /list, /results/<id> API ๊ตฌํ
- ํ๋ก ํธ UI ์ฐ๊ฒฐ
๐๏ธ 4. ๊ฐ๋ฐ ์ผ์
2025.04.25 ~ 2025.05.09
์ผ์ | ํด์ผ ํ ์ผ (To-Do) | ์ค๋ช |
4/25 (๊ธ) | โ ํ๋ก์ ํธ ๊ธฐํ ํ์ ๋ฐ ๊ธฐ์ ์คํ ์ ๋ฆฌ | ์ฃผ์ , ๋ฌธ์ ์ ์, ์๋ฃจ์ ํ๋ฆ ์ ๋ฆฌ ๋ฐ ์ฌ์ฉ ์คํ ํ์ |
4/26 (ํ ) | ๐ ๋ฐ์ดํฐ ์์ง ๋ฐ ํฌ๋กค๋ง ์ฝ๋ ์ ๋ฆฌ | ์ฐ๊ธฐ/๋ถ๊ฝ ๊ณต๊ฐ ๋ฐ์ดํฐ ์์ง ๋ฐ YOLO์ฉ ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ ๋ฆฌ |
4/28~29 (์ํ) | ๐งช YOLO ํ์ต์ฉ ๋ฐ์ดํฐ ํฌ๋งทํ
๋ฐ ๋ชจ๋ธ ํ์ต precision/recall ๋ฑ ์งํ ํ์ธํ๊ณ ๋ชจ๋ธ ํ๋ |
๐ฏ ๋ชจ๋ธ ์ฑ๋ฅ ๊ฐ์ ๋ฐ ๊ฒฐ๊ณผ ํ์ธ YOLOv8์ฉ ํ์ต ๋ฐ์ดํฐ ๋ผ๋ฒจ๋ง ๋ฐ ๋ชจ๋ธ ํ์ต |
4/30~ 5/1 (์๋ชฉ) | ๐งฑ Flask ์๋ฒ ๊ธฐ๋ณธ ๊ตฌ์กฐ ์ค๊ณ | ๊ธฐ๋ณธ ๋ผ์ฐํ , ์์ฒญ ๊ตฌ์กฐ, API ์คํ ์ค๊ณ ๋ฑ |
5/2 (๊ธ) | ๐ค ์์ ์ ๋ก๋ → ํ์ง ์ฐ๋ ๊ตฌํ | ์ ๋ก๋๋ ์์์ ํ๋ ์ ๋ถํ ํ๊ณ YOLO๋ก ํ์ง ์ํ |
5/3 (ํ ) | ๐ผ๏ธ ๊ฒฐ๊ณผ ์ด๋ฏธ์ง ํด๋ผ์ด์ธํธ ๋ ๋๋ง ๊ตฌํ | ํ์ง๋ ์ด๋ฏธ์ง(ํ๋ ์) ์น์์ ํ์ธํ ์ ์๋๋ก ๊ตฌํ |
5/4 (์ผ) | ๐พ MongoDB ์ฐ๋ ๋ฐ ํ์ง ๊ฒฐ๊ณผ ์ ์ฅ | ์ ๋ก๋ ์ ๋ณด ๋ฐ ํ์ง ๊ฒฐ๊ณผ DB์ ์ ์ฅํ๋ ๊ธฐ๋ฅ ๊ฐ๋ฐ |
5/5 (์) | โ๏ธ GCP Cloud Storage ์ฐ๋ ๋ฐ ์์ ์ ์ฅ | ์์ ํ์ผ์ Cloud Storage์ ์ ์ฅํ๊ณ ๊ฒฝ๋ก๋ฅผ DB์ ์ฐ๊ฒฐ |
5/6 (ํ) | ๐งช ์ ์ฒด ์ฐ๋ ํ ์คํธ ๋ฐ ์ค๋ฅ ์์ | end-to-end ํ ์คํธ ๋ฐ ์ค๋ฅ, ์์ธ ์ฒ๋ฆฌ ์งํ |
5/7 (์) | ๐งผ UX ๊ฐ์ ๋ฐ ๋ณด์ ์์ | ์ฌ์ฉ์ ์ ์ฅ์์ ์ ๋ก๋/๊ฒฐ๊ณผ ํ์ธ ํ๋ฆ ์ ๋น |
5/8 (๋ชฉ) | ๐ ๋ฐํ์๋ฃ ์ด์ ์์ฑ ๋ฐ ์ํคํ ์ฒ ๋ค์ด์ด๊ทธ๋จ ์ ์ | ์์คํ ๊ตฌ์กฐ ์๊ฐํ, ๊ธฐ์ ์์ฝ ํฌํจ |
5/9 (๊ธ) | โ ์ต์ข ๋ฐํ ๋ฐ ํ๋ก์ ํธ ๋ง๋ฌด๋ฆฌ | ๋ฐํ์ฉ ์๋๋ฆฌ์ค ์ ๋ฆฌ ๋ฐ ์ต์ข ์ ๋ |
๐ 5. ์ฐ์ถ๋ฌผ ๋ชฉ๋ก
- Flask ๊ธฐ๋ฐ ์๋ฒ ์ฝ๋
- YOLOv8 ํ์ง ์คํฌ๋ฆฝํธ (์ปค์คํ or ๊ธฐ์กด)
- MongoDB ๊ฒฐ๊ณผ ์คํค๋ง ๋ฐ ์ํ ๋ฐ์ดํฐ
- ํ์ง ๊ฒฐ๊ณผ ์ด๋ฏธ์ง ๋ฐ ๋ฉํ๋ฐ์ดํฐ ์ํ
- ๋ฐํ์ฉ ์ฌ๋ผ์ด๋ ๋ฐ ์์ฐ ์์