Hệ thống giám sát thông minh tích hợp khả năng nhận diện vật nguy hiểm cần xử lý sáu lớp đối tượng: thẻ căn cước, điện thoại thông minh, súng ngắn, ví tiền, tiền mặt và dao. Dữ liệu huấn luyện yêu cầu xử lý đặc thù do sự tương đồng về kích thước giữa các vật dụng cá nhân và sự biến thiên góc quay của vũ khí.
Kiểm tra chất lượng nhãn dữ liệu bằng công cụ trực quan giúp phát hiện lỗi định vị. Đoạn mã sau hiển thị ảnh kèm hộp bao và thông tin nhãn tương ứng:
import matplotlib.pyplot as plt
import numpy as np
def kiem_tra_nhan(anh):
duong_dan_anh = f'data/train/images/{anh}.jpg'
duong_dan_nhan = duong_dan_anh.replace('images', 'labels').replace('.jpg', '.txt')
hinh = plt.imread(duong_dan_anh)
plt.imshow(hinh)
try:
with open(duong_dan_nhan, 'r') as f:
for dong in f:
lop, x_tt, y_tt, rong, cao = map(float, dong.split())
x1 = int((x_tt - rong/2) * hinh.shape[1])
y1 = int((y_tt - cao/2) * hinh.shape[0])
w = int(rong * hinh.shape[1])
h = int(cao * hinh.shape[0])
plt.gca().add_patch(plt.Rectangle((x1,y1), w, h, fill=False, edgecolor='red'))
except FileNotFoundError:
pass
plt.show()
Quá trình huấn luyện tối ưu cho vật thể kích thước đa dạng bằng cách điều chỉnh tham số tăng cường dữ liệu. Sử dụng phiên bản YOLOv8n cân bằng tốc độ và độ chính xác với cấu hình đặc biệt cho tập dữ liệu nhỏ:
from ultralytics import YOLO
model = YOLO('yolov8n.pt')
model.train(
data='config_du_lieu.yaml',
epochs=120,
imgsz=640,
batch=24,
optimizer='SGD',
lr0=0.01,
mosaic=0.7,
hsv_h=0.015
)
Triển khai phát hiện thời gian thực cần xử lý ngưỡng độ tin cậy khác biệt cho từng lớp. Đoạn mã sau phân biệt vật nguy hiểm (súng/dao) với vật dụng thông thường bằng màu sắc cảnh báo:
import cv2
detector = YOLO('weights/best.pt')
cap = cv2.VideoCapture(0)
while cap.isOpened():
_, khung_hinh = cap.read()
ket_qua = detector(khung_hinh, conf=0.55, iou=0.45)
for box in ket_qua[0].boxes:
toa_do = box.xyxy[0].cpu().numpy().astype(int)
lop = int(box.cls)
mau_ve = (0,0,255) if lop in [2,5] else (0,255,0)
cv2.rectangle(khung_hinh, (toa_do[0], toa_do[1]), (toa_do[2], toa_do[3]), mau_ve, 2)
cv2.imshow('Kiem soat an ninh', cv2.cvtColor(khung_hinh, cv2.COLOR_BGR2RGB))
if cv2.waitKey(1) == ord('q'):
break
Giao diện người dùng được xây dựng bằng PyQt6 với cơ chế đa luồng ngăn chặn treo ứng dụng. Lớp xử lý hình ảnh kế thừa QThread và xử lý chuyển đổi không gian màu:
from PyQt6.QtCore import QThread, pyqtSignal
import cv2
class XuLyAnh(QThread):
hien_thi_tin_hieu = pyqtSignal(object)
def __init__(self):
super().__init__()
self.detector = YOLO('weights/best.pt')
self.chay = True
def run(self):
cap = cv2.VideoCapture(0)
while self.chay and cap.isOpened():
ret, frame = cap.read()
if ret:
ket_qua = self.detector(frame)[0]
anh_ve = ket_qua.plot()
anh_rgb = cv2.cvtColor(anh_ve, cv2.COLOR_BGR2RGB)
self.hien_thi_tin_hieu.emit(anh_rgb)
cap.release()
Khi triển khai thực tế, cần xử lý hai vấn đề chính: chuyển đổi không gian màu giữa OpenCV và PyQt, đồng bộ hóa vòng đời luồng xử lý. Hệ thống bổ sung cảnh báo âm thanh khi phát hiện vật nguy hiểm bằng cách tích hợp QAudioOutput với cơ chế phát không chặn luồng chính:
from PyQt6.QtMultimedia import QAudioOutput, QMediaPlayer
from PyQt6.QtCore import QUrl
class HeThongCanhBao:
def __init__(self):
self.player = QMediaPlayer()
self.audio = QAudioOutput()
self.player.setAudioOutput(self.audio)
self.player.setSource(QUrl.fromLocalFile("canh_bao.wav"))
def kich_hoat(self, ket_qua):
if any(box.cls in [2,5] for box in ket_qua.boxes):
self.player.play()
Để đảm bảo đóng gói thành ứng dụng độc lập, cần cấu hình hook đặc biệt cho PyInstaller xử lý thư viện OpenCV và plugin đồ họa của PyQt6. Quá trình tối ưu hóa tiếp theo tập trung vào việc bổ sung mẫu dữ liệu góc nghiêng cho lớp dao và điều chỉnh tham số mixup lên 0.65 để giảm nhầm lẫn giữa điện thoại và ví tiền.