Xây dựng Hệ thống Phát hiện Mũ Bảo hộ Dựa trên Học sâu
1. Giới thiệu
Trong các môi trường làm việc nguy hiểm như công trường xây dựng, việc đội mũ bảo hộ là một biện pháp an toàn cơ bản. Tuy nhiên, người lao động đôi khi quên hoặc đội mũ không đúng quy cách. Để nâng cao hiệu quả quản lý an toàn tại hiện trường, chúng ta có thể xây dựng một hệ thống phát hiện mũ bảo hộ dựa trên học sâu, có khả năng giám sát thời gian thực xem người lao động có đội mũ hay không.
2. Thiết kế Hệ thống và Kiến trúc
Hệ thống của chúng ta được cấu thành từ ba thành phần chính: giao diện người dùng (UI) phía trước, máy chủ phía sau (backend) và mô hình YOLO. Người dùng sẽ tải lên hình ảnh từ hiện trường thông qua giao diện UI, máy chủ sẽ gọi mô hình YOLO để thực hiện phát hiện, và sau đó trả về kết quả cho người dùng.
2.1. Kiến trúc Hệ thống
+------------------+ +--------------+ +-----------------+ | Giao diện UI | <----> | API Phía Sau | <----> | Mô hình YOLO | +------------------+ +--------------+ +-----------------+
2.2. Thiết kế Phía trước (Frontend)
Giao diện người dùng sẽ bao gồm các màn hình: đăng nhập/đăng ký, tải lên hình ảnh, và hiển thị kết quả.
2.2.1. Công cụ và Framework
- HTML, CSS, JavaScript
- React.js
2.2.2. Mã nguồn React
**Giao diện đăng nhập**
// GiaoDienDangNhap.js
import React from 'react';
const GiaoDienDangNhap = () => {
const xuLyDangNhap = (suKien) => {
suKien.preventDefault();
const tenDangNhap = suKien.target.tenDangNhap.value;
const matKhau = suKien.target.matKhau.value;
console.log(`Đăng nhập với: ${tenDangNhap}`);
// Logic đăng nhập sẽ được triển khai ở đây
};
return (
<form onSubmit={xuLyDangNhap}>
<div>
<label>Tên đăng nhập:</label>
<input type="text" name="tenDangNhap" required />
</div>
<div>
<label>Mật khẩu:</label>
<input type="password" name="matKhau" required />
</div>
<button type="submit">Đăng nhập</button>
</form>
);
};
export default GiaoDienDangNhap;
2.3. Thiết kế Phía sau (Backend)
Máy chủ sẽ được xây dựng bằng Flask (Python) và sử dụng MySQL để lưu trữ thông tin người dùng.
2.3.1. Mã nguồn Flask
**Cài đặt Flask**
pip install Flask Flask-SQLAlchemy
**Máy chủ Flask**
# may_chu.py
from flask import Flask, request, jsonify
from flask_sqlalchemy import SQLAlchemy
ung_dung = Flask(__name__)
ung_dung.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:matkhau@localhost/hethong_mu_bao_ho'
db = SQLAlchemy(ung_dung)
class NguoiDung(db.Model):
id = db.Column(db.Integer, primary_key=True)
tenDangNhap = db.Column(db.String(80), unique=True, nullable=False)
matKhau = db.Column(db.String(80), nullable=False)
@ung_dung.route('/dang-nhap', methods=['POST'])
def dangNhap():
duLieu = request.get_json()
nguoiDung = NguoiDung.query.filter_by(tenDangNhap=duLieu['tenDangNhap'], matKhau=duLieu['matKhau']).first()
if nguoiDung:
return jsonify({'thongBao': 'Đăng nhập thành công'}), 200
else:
return jsonify({'thongBao': 'Thông tin không hợp lệ'}), 401
if __name__ == '__main__':
db.create_all()
ung_dung.run(debug=True)
3. Chuẩn bị Dữ liệu
Chất lượng dữ liệu là yếu tố then chốt để huấn luyện một mô hình hiệu quả.
3.1. Thu thập Dữ liệu
Các bộ dữ liệu về mũ bảo hộ có thể được tìm thấy trên các nền tảng như Kaggle. Lệnh sau có thể được sử dụng để tải xuống một bộ dữ liệu mẫu.
kaggle datasets download -d ten-du-an/mu-bao-ho
3.2. Tiền xử lý Dữ liệu
Sau khi thu thập, dữ liệu cần được gán nhãn (annotation) và chuyển đổi sang định dạng mà YOLO có thể hiểu.
**Chuyển đổi sang định dạng YOLO**
import os
import xml.etree.ElementTree as ET
def chuyenDoiXMLSangYOLO(duongDanThuMuc, duongDanXuat):
for tenTep in os.listdir(duongDanThuMuc):
if tenTep.endswith(".xml"):
cay = ET.parse(os.path.join(duongDanThuMuc, tenTep))
goc = cay.getroot()
for doiTuong in goc.findall('object'):
tenDoiTuong = doiTuong.find('name').text
# Logic chuyển đổi tọa độ bounding box
# ...
chuyenDoiXMLSangYOLO("duong/dan/labelimg/xuat", "duong/dan/yolo/dinh-dang")
4. Lựa chọn và Huấn luyện Mô hình
YOLO (You Only Look Once) là một kiến trúc phát hiện đối tượng hiệu quả và nhanh chóng, rất phù hợp cho các ứng dụng thời gian thực.
4.1. Cài đặt Môi trường
Cần cài đặt CUDA, cuDNN, PyTorch và các thư viện liên quan.
pip install torch torchvision git clone https://github.com/ultralytics/yolov5.git cd yolov5 pip install -r requirements.txt
4.2. Huấn luyện Mô hình
**Phân chia bộ dữ liệu**
import os
import shutil
from sklearn.model_selection import train_test_split
def phanChiaBoDuLieu(duongDanVao, duongDanXuat):
hinhAnh = [f for f in os.listdir(duongDanVao) if f.endswith(".jpg")]
tapHuan, tapKiemThu = train_test_split(hinhAnh, test_size=0.2, random_state=42)
tapHuan, tapXacThuc = train_test_split(tapHuan, test_size=0.1, random_state=42)
for thuMuc in ['tap_huan', 'tap_xac_thuc', 'tap_kiem_thu']:
os.makedirs(os.path.join(duongDanXuat, thuMuc), exist_ok=True)
for hinh in tapHuan:
shutil.copy(os.path.join(duongDanVao, hinh), os.path.join(duongDanXuat, 'tap_huan', hinh))
for hinh in tapXacThuc:
shutil.copy(os.path.join(duongDanVao, hinh), os.path.join(duongDanXuat, 'tap_xac_thuc', hinh))
for hinh in tapKiemThu:
shutil.copy(os.path.join(duongDanVao, hinh), os.path.join(duongDanXuat, 'tap_kiem_thu', hinh))
phanChiaBoDuLieu("duong/dan/bo-du-lieu", "duong/dan/da-phan-chia")
**Lệnh huấn luyện**
python train.py --img 640 --batch 16 --epochs 50 --data duong/dan/du_lieu.yaml --cfg duong/dan/yolov5.yaml --weights yolov5s.pt --name phat_hien_mu_bao_ho
5. Triển khai Mô hình
Sau khi huấn luyện, mô hình cần được triển khai để có thể sử dụng trong hệ thống.
5.1. Xuất Mô hình
Mô hình PyTorch có thể được xuất sang định dạng ONNX để dễ dàng triển khai.
import torch
model = torch.load('duong/dan/mo-hinh.pt')
model.eval()
torch.onnx.export(model, duongDanVao, 'mo-hinh.onnx', opset_version=11)
5.2. Triển khai bằng TensorFlow Serving
docker pull tensorflow/serving docker run -p 8501:8501 --name phuc-vu_mu_bao_ho -v "$(pwd)/mo-hinh:/models/mu_bao_ho" -e MODEL_NAME=mu_bao_ho -t tensorflow/serving
6. Triển khai Phía trước
Giao diện người dùng cần có khả năng tải lên hình ảnh và hiển thị kết quả.
6.1. Giao diện Tải lên Hình ảnh
// GiaoDienTaiLenHinhAnh.js
import React, { useState } from 'react';
const GiaoDienTaiLenHinhAnh = () => {
const [hinhAnh, setHinhAnh] = useState(null);
const xuLyThayDoiHinhAnh = (suKien) => {
setHinhAnh(suKien.target.files[0]);
};
const xuLyTaiLen = (suKien) => {
suKien.preventDefault();
const duLieuHinhAnh = new FormData();
duLieuHinhAnh.append('hinhAnh', hinhAnh);
fetch('http://localhost:5000/tai-len', {
method: 'POST',
body: duLieuHinhAnh,
})
.then(response => response.json())
.then(ketQua => {
console.log('Kết quả:', ketQua);
// Hiển thị kết quả
});
};
return (
<form onSubmit={xuLyTaiLen}>
<input type="file" onChange={xuLyThayDoiHinhAnh} />
<button type="submit">Tải lên</button>
</form>
);
};
export default GiaoDienTaiLenHinhAnh;
7. Kiểm thử Hệ thống
Kiểm thử là bước quan trọng để đảm bảo hệ thống hoạt động ổn định và chính xác.
7.1. Kiểm thử Chức năng
Các bài kiểm thử đơn vị và tích hợp có thể được viết bằng các framework như Pytest.
# test_dang_nhap.py
def test_dang_nhap_khong_hop_le():
response = client.post('/dang-nhap', json={'tenDangNhap': 'test', 'matKhau': 'sai_mat_khau'})
assert response.status_code == 401
def test_tai_len_hinh_anh():
with open('duong/dan/hinh_anh_kiem_thu.jpg', 'rb') as img:
response = client.post('/tai-len', data={'hinhAnh': img})
assert response.status_code == 200
7.2. Kiểm thử Hiệu năng
Các công cụ như JMeter có thể được sử dụng để kiểm tra thời gian phản hồi và khả năng xử lý đồng thời của hệ thống.