1. Giới thiệu
Loạt bài viết này hướng dẫn sử dụng phiên bản YOLOv5-6.1 của Ultralytics cho các tác vụ phát hiện đối tượng. Nội dung bao gồm chạy thử với trọng số có sẵn, huấn luyện trên tập dữ liệu riêng, và triển khai mô hình. Người đọc cần nắm cơ bản về PyTorch và kiến trúc YOLOv5.
2. Môi trường phát triển
Yêu cầu môi trường cơ bản:
Python 3.6.5
Pytorch 1.71
OpenCV-Python 4.5.5
OpenVINO 2022 Python
onnxruntime-gpu 1.10.0
Khởi tạo môi trường ảo với conda:
conda create -n yolov5 python=3.6.5
conda activate yolov5
Các lệnh cài đặt gói:
pip install opencv-python==4.5.5.64
pip install opencv-contrib-python==4.5.5.64
pip install openvino-dev==2022.3.1
pip install onnxruntime-gpu==1.10.0
conda install pytorch==1.7.1 torchvision==0.8.2 torchaudio==0.7.2 cudatoolkit=11.0 -c pytorch
Nếu gặp lỗi phiên bản, thử giảm số hiệu phụ. Việc tải PyTorch có thể chậm, bạn có thể tải file .whl từ danh sách PyTorch và dùng IDM hoặc XunLei để tăng tốc. Ví dụ với Windows, CUDA 12.0, Python 3.6.5, cần torch 1.7.0, tải các file .whl tương ứng, kiểm tra phiên bản khớp với lệnh trên.
3. Tải mã nguồn từ GitHub
YOLOv5 có nhiều nhánh, chúng tôi chọn bản chính thức từ ultralytics. Không dùng lệnh git clone ngay mà chọn bản phát hành ổn định. Trên trang GitHub, nhấp vào tab "Tags" và chọn v6.1 (không nên dùng v7.0 vì thêm tính năng phân đoạn).
Kéo xuống phần Assets, chọn "Source code (zip)" để tải xuống. Giải nén để có thư mục dự án.
4. Cài đặt bổ sung và chạy thử nghiệm
4.1 Cài đặt các gói phụ thuộc
Mở terminal tại thư mục dự án, kích hoạt môi trường ảo và chạy:
pip install -r requirements.txt
File requirements.txt bao gồm tất cả các thư viện cần thiết, trong đó có nhóm # Export sẽ dùng sau.
4.2 Kiểm tra phát hiện đối tượng
Mở file tutorial.ipynb trong Jupyter Notebook, đảm bảo kernel là môi trường yolov5. Nếu không thấy, chạy:
python -m ipykernel install --user --name yolov5
Chạy lệnh phát hiện với ảnh mẫu:
python detect.py --source data/images/zidane.jpg
Lần chạy đầu sẽ tải font Arial và trọng số yolov5s.pt. Nếu tải chậm, có thể tải thủ công từ link bằng XunLei, đặt vào thư mục dự án. Chạy lại lệnh, kết quả hiển thị các bước: tải mô hình, fuse layers, tiền xử lý, suy luận, NMS và đường dẫn lưu kết quả. Mở ảnh kết quả trong thư mục runs/detect/exp để xem các box phát hiện.
Để dùng webcam, chạy:
python detect.py --source 0
Nhấn Q hai lần để thoát.
5. Xuất và sử dụng các định dạng suy luận khác
5.1 Xuất mô hình
YOLOv5-6.1 hỗ trợ xuất nhiều định dạng. Chúng tôi sẽ xuất ONNX và OpenVINO IR. Trong file tutorial.ipynb có hướng dẫn, chạy lệnh:
python export.py --weights yolov5s.pt --include onnx openvino
Nếu lỗi thiếu thư viện export, cài đặt:
pip install onnx
Chạy lại lệnh export. Kết quả tạo file yolov5s.onnx và thư mục yolov5s_openvino_model chứa file IR.
5.2 Chạy suy luận với các định dạng đã xuất
Dùng ONNX (gọi onnxruntime):
python detect.py --weights yolov5s.onnx --source data/images/zidane.jpg
Kết quả hiển thị: 2 người, 2 cà vạt, thời gian suy luận 182.1ms (tiền xử lý 4.4ms, NMS 3.5ms).
Dùng OpenVINO IR:
python detect.py --weights yolov5s_openvino_model --source data/images/zidane.jpg
So sánh, OpenVINO cho tốc độ nhanh hơn onnxruntime trong môi trường hiện tại.
5.3 Trực quan hóa cấu trúc mô hình
Dùng Netron để xem cấu trúc. Cách nhanh: vào netron.app và mở file .onnx (không khuyến khích vì upload file). Cách an toàn: cài đặt local:
pip install netron
netron
Mở trình duyệt tại http://localhost:8080, chọn "Open Model..." và tìm yolov5s.onnx. Nhấp vào nút "images" ở đầu để xem thông tin đầu vào/ra. Đầu vào là float32[1,3,640,640]. Đầu ra gồm 4 phần: output (float32[1,25200,85]) tổng hợp từ 3 detection heads (float32[1,3,80,80,85], float32[1,3,40,40,85], float32[1,3,20,20,85]). Chỉ cần dùng output. Việc giữ 3 heads là để tương thích ngược.
Để tìm hiểu sâu về kiến trúc YOLOv5, tham khảo các bài viết của "江大白" trên Zhihu, bắt đầu từ YOLOv3.
6. Biến thể yolov5s6
YOLOv5-6.1 có biến thể yolov5s6 với kiến trúc mạnh hơn. Tải trọng số yolov5s6.pt từ GitHub và xuất ONNX:
python export.py --weights yolov5s6.pt --include onnx
Xem bằng Netron, đầu ra gồm 4 phần, trong đó có thêm detection head float32[1,3,10,10,85]. Điều này cho thấy mô hình kết hợp đặc trưng từ 4 giai đoạn, thay vì 3 như bản thường.