MY BEST PROJECTS
ํ์ต ๊ด๋ฆฌ ์์คํ (eLearning Management System) ๊ฐ๋ฐ. ๊ฐ์ ๊ด๋ฆฌ, ์๊ฐ์ ๊ด๋ฆฌ, ๊ณผ์ ์ ์ถ ๋ฐ ํ๊ฐ ์์คํ ์ ํตํฉํ ์จ๋ผ์ธ ๊ต์ก ํ๋ซํผ์ ๋๋ค.
๐๏ธ 2024.08 | ๐ AI Vision
๐ ํ๋ก์ ํธ ์๋ฃ: K-Digital Training ์ฃผ์ฐจ์ฅ AI ๋ถ์
์ฃผ์ฐจ์ฅ์ ์ค๋นํ๋ ์ฃผ์ฐจ๊ณต๊ฐ์ ์๋ฅผ ํ์ ํ๊ธฐ ์ํด ํ๋ก์ ํธ ์ ์
์ฃผ์ฐจ ๊ณต๊ฐ์ ์ด์ฉ ์ํฉ์ ํ๋์ ํ์ ํ ์ ์๋๋ก AI๊ฐ ์๋์ ์๋์ผ๋ก ์ธ์ํด ์ถ๋ ฅ ๋ฐ ์ ์ ์ํ๋ฅผ ๊ณ์ฐํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฒด ์ฃผ์ฐจ์ฅ ํํฉ๊ณผ ํจ๊ป ์์ ๋ฐ์ค๋ก ์ง๊ด์ ์ผ๋ก ํํ
์ฌ์ฉ ์ง์๊ฒ ํธ์ ๋จ์ ์ฃผ์ฐจ ๋์์ ํผ์ก๋ ๋ฑ์ ์ค์๊ฐ์ผ๋ก ์๋ดํ๋ค.
์ค์๊ฐ ์ ๋ณด ์ ๊ณต์ผ๋ก ๋ฐ์ง์ ํ์ ์๊ฐ์ ์ค์ฌ, ์ด์ฉ ํธ์์ฑ๊ณผ ์๋น์ค ๋ง์กฑ๋๋ฅผ ๋์ผ ์ ์๋ค.
์ฃผ์ฐจ ๊ณต๊ฐ ํ์ฉ๋๋ฅผ ๊ทน๋ํํ๊ณ ๊ด๋ฆฌ ํจ์จ์ ํฅ์์ํฌ ์ ์๋ค.
Start โ Environment Setup (๊ฐ๋ฐ ํ๊ฒฝ ์ค๋น ๋จ๊ณ) โ Miniconda ์ค์น โ VS Code ์ค์น โ conda activate walk (ํ๊ฒฝํ์ฑํ) โ Python ๋ฒ์ ํ์ธ โ YOLOv8 ์ค์น โ MySQL ์ค์น โ FastAPI + Uvicorn ์ค์น โ End
์ผ์ชฝ: ์ฃผ์ฐจ์ฅ CCTV ์์ ์ฒ๋ฆฌ ํ๋ฆ
์ค๋ฅธ์ชฝ: ๋ถ์ ๋จ๊ณ ๋ฐ ์ถ๋ ฅ ํ๋ฆ
์์ ๋ถ์ ๋ฒํผ์ ํด๋ฆญํ์ฌ ์ฃผ์ฐจ์ฅ ์์ ์ ๋ก๋ ๋ฐ ์ค์๊ฐ ๋ถ์
โก ์ฌ์ ์๋: ๋ณดํต (์กฐ์ ๊ฐ๋ฅ)
๐ ์ฃผ์ฐจ์ฅ ๊ณต๊ฐ ํํฉ
๐ ํ์ฌ ์ฐจ๋ ์: 42๋
์ค์๊ฐ ์ฃผ์ฐจ์ฅ ์์ ๋ถ์ ( ์์ ์ ๋ก๋ โ ์ฐจ๋ ๊ฐ์ง โ ์ฌ๋กฏ ์ํ ํํฉ / ์ ์ (๋นจ๊ฐ์) ๋ฐ ๋น์๋ฆฌํ์(์ด๋ก์) )
1. ์ฌ๋กฏ ์ขํ ํ์ผ ์์ฑ
์ฃผ์ฐจ์ฅ ๊ฐ ์ฐจ๋ฆฌ์ 4๊ฐ ๋ชจ์๋ฆฌ ์ขํ๋ฅผ ๋ง์ฐ์ค๋ก ๋๋๊ทธํ์ฌ ์์์ ์ผ๋ก ์ง์ (slots.csv ํ์ผ๋ก ์ ์ฅ)
2. ์ฌ๋กฏ ์ขํ๋ ๊ณ ์
์ฃผ์ฐจ์ฅ ์ฐจ๋ฆฌ ๊ตฌ์กฐ๋ ๋ณํ์ง ์์ผ๋ฏ๋ก, ์ขํ๋ ๊ณ ์ ๋ ๊ฐ์ผ๋ก ์ฌ์ฉ
3. ์ฌ๋กฏ ์ ๋ณด์ ์ฐจ๋ ๋ถ์ ์์ ๊ฒฐํฉ โ ,โก
CSV ํ์ผ์์ ์ฌ๋กฏ ์ขํ๋ฅผ ์ฝ์ด์ ์ฐจ๋ ๊ฐ์ง ์ฝ๋์ ๊ฒฐํฉ, ์ฐจ๋ ์ค์ฌ์ ์ด ์ฌ๋กฏ ํด๋ฆฌ๊ณค ์์ ์๋์ง ํ์ธ
4. ์ ์ ํ๋จ
์ฐจ๋ ์ค์ฌ์ ์ด ์ฌ๋กฏ ํด๋ฆฌ๊ณค ๋ด๋ถ์ ์์ผ๋ฉด ์ ์ , ์ ์ โ ๋นจ๊ฐ์, ๋น์๋ฆฌ โ ์ด๋ก์
์ค์ ๋ถ์ ์ด๋ฏธ์ง:
โ ์ฐจ๋ ์ธ์ ์ฌ์ง - ๋ชจ๋ ์ฐจ๋์ ๋ น์ ๋ฐ์ด๋ฉ ๋ฐ์ค ํ์
โก ๋ง์ฐ์ค ๋๋๊ทธ๋ก ์ฌ๋กฏ ์ง์ ํ ์ฌ์ง - ๋ชจ๋ ์ฃผ์ฐจ ๊ณต๊ฐ์ ๋นจ๊ฐ์ ๋ฐ์ค๋ก ํ์
โข ์ต์ข ๋ถ์ ๊ฒฐ๊ณผ - Total Shots: 47, Occupied: 30, Empty: 17
๋นจ๊ฐ์(์ ์ ), ๋ น์(๋น์๋ฆฌ), ์ฃผํฉ์(์ผ๋ถ ์ ์ )
์ฃผ์ฐจ์ฅ ์์ ๋ฐ์ดํฐ์ ๊ตฌ์ฑ
YOLOv8 ์ ๋ฐ์ดํฐ ํ์ต (Google Colab)
๐ฆ YOLOv8 ์ค์น
!pip install ultralytics
from ultralytics import YOLO
๐ค ์ฌ์์ ์ฝ๋ฉ ํ์
from google.colab import files
uploaded = files.upload()
๐ ์ฌ์์ ์ฝ๋ฉ ํ์
!unzip dataset.zip -d dataset
๐ฏ ๋ชจ๋ธ ํ์ต
model = YOLO('yolov8s.pt')
ํ์ต ๊ฒฐ๊ณผ (best.pt ํ์ผ ์์ฑ)
์ง๋๊ฐ๊ฑฐ๋ ์ฃผ์ฐจํ ๊ฐ ์ฐจ๋๋ง๋ค ๋ณด๋ผ์ ๋ฐ์ด๋ฉ ๋ฐ์ค ์์ ๊ฐ์ฒด ์์น์ ํฌ๊ธฐ ์ง์
์ผ์ชฝ: Annotations (์ฃผ์) - Classes (ํด๋์ค) car1 ํ์, Unused Classes, Tags - No Tags Applied, Find Objects with AI
์ค์: ์ฃผ์ฐจ์ฅ CCTV ์์์ ๊ฐ ์ฐจ๋๋ง๋ค ๋ณด๋ผ์ ๋ฐ์ด๋ฉ ๋ฐ์ค๋ก ๋ผ๋ฒจ๋ง
์ฐ์ธก ํ๋จ: ํ์ตํ ํด๋์ค(์ฐจ๋) ํ์
1. ์ฒซ ํ์ต์ ์ด ์ค์ ๊ฐ (์ด 120์ฅ ์ฌ์ฉ)
model = YOLO('yolov8s.pt')
results = model.train(
data="/content/dataset/data.yaml",
imgsz=640,
epochs=150,
batch=16, # GPU VRAM ๋ณด๊ณ ์ ์ฆ ์กฐ์
patience=25, # Early Stop ์ฌ์ ์ค๊ฒ
lr0=0.01, # ์ด๊ธฐ ํ์ต๋ฅ
optimizer="AdamW", # ๋ด๋ถ ๋ฐ์ดํฐ์ ์ฑ๋ฅ ์์ ์
mosaic=1.0, # ๋ฐ์ดํฐ ์ฆ๊ฐ ๊ฐํ (๋ฌ๋ฌด์ฅ ์ ๋ฆฌ)
augment=True
)
2. ์ถ๊ฐํ์ต์ ์ด ์ค์ ๊ฐ
from ultralytics import YOLO
model = YOLO('/content/drive/MyDrive/Yolo_train/best.pt') # ๊ธฐ์กด ํ์ต ๋ชจ๋ธ ๊ฒฝ๋ก
model.train(
data='/content/drive/MyDrive/Yolo_train/data.yaml', # ์ + ๊ธฐ์กด dataset ๊ฒฝ๋ก
epochs=50, # ํ์ํ ๋ง๋ค ๋ณ๊ฒฝ ๊ธฐ๋ฅ
imgsz=640, #
batch=4, # GPU ์ด์ ์์ผ๋ฉด 32๊น์ง ๊ฐ๋ฅ
lr0=0.0005, # ์ธ๋ ํ์ต๋ณด๋ค ๋ฎ๊ฒ (Fine-Tuning ๊ธฐ๋ณธ ์ ๋ต)
optimizer="Adam",
patience=15,
amp=True,
device=0,
cache=False,
pretrained=True # ๊ธฐ์กด weight ์ฌ์ฉ
)
์ํ ๋ฐ์ดํฐ ์ถ๊ฐํ์ฌ ์ด 400๊ฐ ์ฌ์ฉ
๐ง YOLO ๋ชจ๋ธ ๋ก๋
from ultralytics import YOLO
import cv2
import os
from tkinter import Tk
from tkinter.filedialog import askopenfilename
# ๐ฅ ์ฐฝ์ ์ ํ
Tk().withdraw()
video_path = askopenfilename(
title="์์ ํ์ผ ์ ํ",
filetypes=[("Video files", "*.mp4;*.avi;*.mov;*.mkv"), ("All files", "*.*")]
)
if not video_path:
print("โ ํ์ผ์ ์ ํํด์ผ ํฉ๋๋ค.")
exit()
print(f"โ
์ ํ๋ ํ์ผ: {video_path}")
# ๐ yolo ๋ชจ๋ธ ๋ก๋
model_path = "model/best.pt"
if not os.path.exists(model_path):
raise FileNotFoundError(f"โ ๏ธ ๋ชจ๋ธ ํ์ผ์ด ์์ต๋๋ค: {model_path}")
print(f"๐ฆ ๋ชจ๋ธ ๋ก๋ ์ค: {model_path}")
model = YOLO(model_path)
tracker_path = r"C:\Users\gage03\miniconda3\envs\walk\Lib\site-packages\ultralytics\cfg\trackers\bytetrack.yaml"
๐น Tracking ๋ชจ๋ ์ ์ฉ (๊ฐ๋ ๋ ์์ธก)
results = model.track(
source=video_path,
conf=0.15, # ์ ๋ขฐ๋ ๊ธฐ์ค ์ค์
iou=0.50, # ๋ฐ์ค ๊ฒน์นจ ๊ธฐ์ค
imgsz=1280, # ๊ณ ํด์๋ ๋ถ์
project="runs/detect",
name="predict",
exist_ok=True,
stream=True,
tracker=tracker_path, # ์ธ์ ์ ์ถ์
persist=True # ID ์ ์ง-> ๊ฐ์ชฝ์ธ ์ต์ ํ
)
# ๐จ ํจ๊ณผ๊ฐ: ์ฐจ์ ๋ฐ์ค ์ ๊ฑฐ + ID ๋ผ๋ฒจ ํ์
output_video_path = f"videos/optimized_{os.path.basename(video_path)}"
cap = cv2.VideoCapture(video_path)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv2.CAP_PROP_FPS)
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter(output_video_path, fourcc, fps, (width, height))
# ์์ ๋ฐ์ค ๊ธฐ์ค ๊ฐํ (์์ ํฌ๊ธฐ 0.66% ์ด์)
min_size = max(width, height) // 200
# โค Windows ์ฌ์ฉ ์คํ
if os.name == "nt":
os.startfile(output_video_path)
๐๏ธ 2024 | โ๏ธ AWS Cloud Infrastructure
๐ www.codesk01.shop
๊ฐ์ธ ํฌํธํด๋ฆฌ์ค ์น์ฌ์ดํธ๋ฅผ AWS ํด๋ผ์ฐ๋ ์ธํ๋ผ์ ๋ฐฐํฌํ์ฌ ์์ ์ ์ด๊ณ ํ์ฅ ๊ฐ๋ฅํ ์๋น์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. HTTPS ๋ณด์ ํต์ ๊ณผ ๋๋ฉ์ธ ์ฐ๊ฒฐ์ ํตํด ์ ๋ฌธ์ ์ธ ์น ์๋น์ค๋ฅผ ๊ตฌ์ถํ์ต๋๋ค.
๐๏ธ 2024 | ๐จ User Experience Design
User-centered design focused on improving usability and creating intuitive interfaces.
ํ๋ฆฌ๋ฏธ์ ํจ์ ๋ฐ ๋ทฐํฐ ์ ํ์ ํ๋งคํ๋ ํ์คํ E-commerce ํ๋ซํผ์ ๋๋ค. ๊ฒฐ์ ์์คํ ํตํฉ, ์ฌ๊ณ ๊ด๋ฆฌ, ์ฅ๋ฐ๊ตฌ๋ ๊ธฐ๋ฅ์ ํฌํจํ ์์ ํ ์จ๋ผ์ธ ์ผํ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
๐๏ธ 2024 | ๐ฑ iOS & Android
Cross-platform mobile application with native performance and seamless user experience.