Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
| 1 |
import os
|
| 2 |
import tempfile
|
| 3 |
import cv2
|
|
@@ -10,7 +13,7 @@ from ultralytics import YOLO
|
|
| 10 |
DEFAULT_MAX_FRAME_SIZE = 640 # Giới hạn kích thước khung hình đưa vào YOLO
|
| 11 |
DEFAULT_DETECT_EVERY_N_FRAMES = 2 # Chỉ detect mỗi N frame để giảm tải CPU
|
| 12 |
|
| 13 |
-
# Load model
|
| 14 |
model = YOLO("yolov8n.pt")
|
| 15 |
CLASS_NAMES_DICT = model.model.names
|
| 16 |
|
|
@@ -263,42 +266,67 @@ def process_video(
|
|
| 263 |
|
| 264 |
|
| 265 |
# Gradio UI
|
| 266 |
-
with gr.Blocks(title="Đếm xe qua line", theme=gr.themes.Soft()) as demo:
|
| 267 |
-
|
| 268 |
-
gr.
|
| 269 |
-
|
| 270 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 271 |
|
| 272 |
with gr.Row():
|
| 273 |
-
|
| 274 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 275 |
|
| 276 |
# Tùy chọn cấu hình
|
| 277 |
with gr.Accordion("⚙️ Tùy chọn nâng cao", open=False):
|
| 278 |
-
|
| 279 |
-
|
| 280 |
-
|
| 281 |
-
|
| 282 |
-
|
| 283 |
-
|
| 284 |
-
|
| 285 |
-
|
| 286 |
-
|
| 287 |
-
)
|
| 288 |
-
|
| 289 |
-
|
| 290 |
-
|
| 291 |
-
|
| 292 |
-
|
| 293 |
-
|
| 294 |
-
|
| 295 |
-
|
| 296 |
-
|
| 297 |
-
|
| 298 |
-
|
| 299 |
-
|
|
|
|
|
|
|
| 300 |
|
| 301 |
-
btn = gr.Button("▶️ Xử lý video")
|
| 302 |
btn.click(
|
| 303 |
fn=process_video,
|
| 304 |
inputs=[video_input, use_resize, max_frame_size, detect_every_n, line_orientation],
|
|
@@ -307,11 +335,14 @@ with gr.Blocks(title="Đếm xe qua line", theme=gr.themes.Soft()) as demo:
|
|
| 307 |
|
| 308 |
gr.Markdown(
|
| 309 |
"""
|
| 310 |
-
|
| 311 |
-
|
| 312 |
-
-
|
| 313 |
-
-
|
| 314 |
-
-
|
|
|
|
|
|
|
|
|
|
| 315 |
"""
|
| 316 |
)
|
| 317 |
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
Đếm xe qua line - Deploy lên Hugging Face Spaces với Gradio
|
| 3 |
+
"""
|
| 4 |
import os
|
| 5 |
import tempfile
|
| 6 |
import cv2
|
|
|
|
| 13 |
DEFAULT_MAX_FRAME_SIZE = 640 # Giới hạn kích thước khung hình đưa vào YOLO
|
| 14 |
DEFAULT_DETECT_EVERY_N_FRAMES = 2 # Chỉ detect mỗi N frame để giảm tải CPU
|
| 15 |
|
| 16 |
+
# Load model (yolov8n nhẹ cho CPU miễn phí)
|
| 17 |
model = YOLO("yolov8n.pt")
|
| 18 |
CLASS_NAMES_DICT = model.model.names
|
| 19 |
|
|
|
|
| 266 |
|
| 267 |
|
| 268 |
# Gradio UI
|
| 269 |
+
with gr.Blocks(title="Đếm xe qua line", theme=gr.themes.Soft(primary_hue="blue", secondary_hue="gray")) as demo:
|
| 270 |
+
# Header đẹp hơn + thông tin sinh viên
|
| 271 |
+
with gr.Row():
|
| 272 |
+
gr.Markdown(
|
| 273 |
+
"""
|
| 274 |
+
<div style="display:flex;flex-direction:column;gap:4px;">
|
| 275 |
+
<h1 style="margin-bottom:4px;">🚗 Đếm xe qua line (YOLOv8 + ByteTrack)</h1>
|
| 276 |
+
<p style="margin:0;font-size:16px;color:#4b5563;">
|
| 277 |
+
Dự án: Đếm đối tượng qua line (Horizonal / Vertical) dùng YOLOv8 + ByteTrack.
|
| 278 |
+
</p>
|
| 279 |
+
<p style="margin:0;font-size:14px;color:#6b7280;">
|
| 280 |
+
Thực hiện: <strong>Trần Hải Nam - 223332840</strong>
|
| 281 |
+
</p>
|
| 282 |
+
</div>
|
| 283 |
+
""",
|
| 284 |
+
elem_id="header",
|
| 285 |
+
)
|
| 286 |
|
| 287 |
with gr.Row():
|
| 288 |
+
with gr.Column(scale=1):
|
| 289 |
+
gr.Markdown(
|
| 290 |
+
"### 🎥 Video đầu vào\n"
|
| 291 |
+
"Upload video ngắn (ưu tiên < 30s để xử lý nhanh hơn)."
|
| 292 |
+
)
|
| 293 |
+
video_input = gr.Video(label="Video đầu vào")
|
| 294 |
+
|
| 295 |
+
with gr.Column(scale=1):
|
| 296 |
+
gr.Markdown(
|
| 297 |
+
"### ✅ Kết quả đã xử lý\n"
|
| 298 |
+
"Hiển thị tracking, line đếm và thống kê số lượng theo lớp."
|
| 299 |
+
)
|
| 300 |
+
video_output = gr.Video(label="Video đã xử lý")
|
| 301 |
|
| 302 |
# Tùy chọn cấu hình
|
| 303 |
with gr.Accordion("⚙️ Tùy chọn nâng cao", open=False):
|
| 304 |
+
with gr.Row():
|
| 305 |
+
use_resize = gr.Checkbox(
|
| 306 |
+
value=True, label="Giảm kích thước khung hình trước khi detect"
|
| 307 |
+
)
|
| 308 |
+
line_orientation = gr.Radio(
|
| 309 |
+
choices=["Ngang", "Dọc"],
|
| 310 |
+
value="Ngang",
|
| 311 |
+
label="Hướng line đếm",
|
| 312 |
+
)
|
| 313 |
+
with gr.Row():
|
| 314 |
+
max_frame_size = gr.Slider(
|
| 315 |
+
minimum=320,
|
| 316 |
+
maximum=1280,
|
| 317 |
+
value=DEFAULT_MAX_FRAME_SIZE,
|
| 318 |
+
step=64,
|
| 319 |
+
label="Kích thước tối đa (px)",
|
| 320 |
+
)
|
| 321 |
+
detect_every_n = gr.Slider(
|
| 322 |
+
minimum=1,
|
| 323 |
+
maximum=5,
|
| 324 |
+
value=DEFAULT_DETECT_EVERY_N_FRAMES,
|
| 325 |
+
step=1,
|
| 326 |
+
label="Detect mỗi N frame (1 = mọi frame)",
|
| 327 |
+
)
|
| 328 |
|
| 329 |
+
btn = gr.Button("▶️ Xử lý video", variant="primary")
|
| 330 |
btn.click(
|
| 331 |
fn=process_video,
|
| 332 |
inputs=[video_input, use_resize, max_frame_size, detect_every_n, line_orientation],
|
|
|
|
| 335 |
|
| 336 |
gr.Markdown(
|
| 337 |
"""
|
| 338 |
+
---
|
| 339 |
+
### ℹ️ Gợi ý sử dụng
|
| 340 |
+
- Mặc định line đếm nằm **ngang** ở giữa khung hình (50% chiều cao).
|
| 341 |
+
- Có thể chuyển sang line **dọc** trong phần _"Tùy chọn nâng cao"_.
|
| 342 |
+
- Với CPU miễn phí (Hugging Face Spaces), nên:
|
| 343 |
+
- Dùng video **ngắn** (< 30 giây).
|
| 344 |
+
- Tăng `Detect mỗi N frame` nếu muốn xử lý nhanh hơn.
|
| 345 |
+
- Model sử dụng: **YOLOv8n** (phiên bản nhẹ, phù hợp CPU).
|
| 346 |
"""
|
| 347 |
)
|
| 348 |
|