trannam1084 commited on
Commit
bf1f29f
·
verified ·
1 Parent(s): 21c73fa

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +67 -36
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
- gr.Markdown("# 🚗 Đếm xe qua line (YOLOv8 + ByteTrack)")
268
- gr.Markdown(
269
- "Upload video, hệ thống sẽ đếm person, car, bus, truck, motorcycle khi qua đường line giữa khung hình."
270
- )
 
 
 
 
 
 
 
 
 
 
 
 
271
 
272
  with gr.Row():
273
- video_input = gr.Video(label="Video đầu vào")
274
- video_output = gr.Video(label="Video đã xử lý")
 
 
 
 
 
 
 
 
 
 
 
275
 
276
  # Tùy chọn cấu hình
277
  with gr.Accordion("⚙️ Tùy chọn nâng cao", open=False):
278
- use_resize = gr.Checkbox(
279
- value=True, label="Giảm kích thước khung hình trước khi detect"
280
- )
281
- max_frame_size = gr.Slider(
282
- minimum=320,
283
- maximum=1280,
284
- value=DEFAULT_MAX_FRAME_SIZE,
285
- step=64,
286
- label="Kích thước tối đa (px)",
287
- )
288
- detect_every_n = gr.Slider(
289
- minimum=1,
290
- maximum=5,
291
- value=DEFAULT_DETECT_EVERY_N_FRAMES,
292
- step=1,
293
- label="Detect mỗi N frame (1 = mọi frame)",
294
- )
295
- line_orientation = gr.Radio(
296
- choices=["Ngang", "Dọc"],
297
- value="Ngang",
298
- label="Hướng line đếm",
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
- ### Lưu ý
311
- - Mặc định line đếm nằm **ngang** ở giữa khung hình (50% chiều cao)
312
- - thể chọn lại line **dọc** trong phần "Tùy chọn nâng cao"
313
- - Chạy trên CPU miễn phí → nên dùng video **ngắn** (< 30 giây) để tránh chờ lâu
314
- - Model: YOLOv8n (nhẹ cho CPU)
 
 
 
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 &lt; 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
+ - 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** (&lt; 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