Triển Khai Mô Hình YOLOv5 với TensorRT trên Ubuntu
Giới thiệu YOLOv5
YOLOv5 mang đến nhiều cải tiến và tối ưu hóa so với các thuật toán phát hiện đối tượng trước đây. Đầu tiên, kiến trúc mạng sử dụng thiết kế nhẹ nhàng với CSPDarknet53 làm mạng xương sống, giảm lượng tính toán và tham số, nâng cao hiệu suất thời gian thực. Thứ hai, YOLOv5 áp dụng chiến lược học蒸馏, sử dụng mô hình hướng dẫn mô hình học sinh, cải thiện hiệu suất và khả năng tổng quát hóa của mô hình. Ngoài ra, YOLOv5 còn sử dụng chiến lược hợp nhất đặc trưng đa tỷ lệ, cho phép mô hình bắt tốt hơn các đặc trưng đối tượng ở các tỷ lệ khác nhau. YOLOv5 còn cải tiến thiết kế hàm mất mát, sử dụng các hàm như GIOU và COCO để tăng độ chính xác của mô hình.
Ưu điểm của YOLOv5
YOLOv5 có nhiều ưu điểm nổi bật. Đầu tiên, nó có tính hiệu suất cao, xử lý được lượng lớn hình ảnh và video trong thời gian ngắn. Thứ hai, YOLOv5 có độ chính xác cao, phát hiện chính xác các đối tượng và phân loại, định vị chúng. Ngoài ra, YOLOv5 còn có khả năng thời gian thực, đưa ra kết quả phát hiện và tốc độ xử lý ngay lập tức, phù hợp với nhiều ứng dụng thực tế. YôLOv5 cũng dễ sử dụng với giao diện đơn giản và tài liệu dễ hiểu, giúp nhà phát triển dễ dàng bắt đầu và phát triển các chương trình phát hiện đối tượng chất lượng cao.
Bài viết này cung cấp phương pháp tăng tốc cho Yolov5-TensorRT. Có sẵn mã nguồn để tham khảo!
Cấu hình môi trường Ubuntu 18.04
Nếu bạn không quen thuộc với TensorRT, hãy đảm bảo các phiên bản thư viện sau đây nhất quán. Lưu ý: Khi cài đặt các thư viện sau trên Linux, hãy vào BIOS và tắt Secure Boot (đặt secure boot thành disable).
1.1 Cài đặt công cụ và OpenCV
sudo apt-get update
sudo apt-get install build-essential
sudo apt-get install git
sudo apt-get install gdb
sudo apt-get install cmake
sudo apt-get install libopencv-dev
# pkg-config --modversion opencv
1.2 Cài đặt thư viện NVIDIA
Lưu ý: Cần đăng ký tài khoản trên trang web của NVIDIA.
1.2.1 Cài đặt driver NVIDIA
ubuntu-drivers devices
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
sudo apt install nvidia-driver-470-server # for ubuntu18.04
nvidia-smi
1.2.2 Cài đặt CUDA 11.3
- Truy cập: https://developer.nvidia.com/cuda-toolkit-archive
- Chọn: CUDA Toolkit 11.3.0(April 2021)
- Chọn: [Linux] -> [x86_64] -> [Ubuntu] -> [18.04] -> [runfile(local)]
Bạn sẽ thấy các lệnh cài đặt sau:
wget https://developer.download.nvidia.com/compute/cuda/11.3.0/local_installers/cuda_11.3.0_465.19.01_linux.run
sudo sh cuda_11.3.0_465.19.01_linux.run
Trong quá trình cài đặt CUDA, bạn cần đưa ra một số lựa chọn:
- Chọn: [continue] -> [accept] -> Nhấn Enter để bỏ qua tùy chọn Driver và 465.19.01 -> [Install]
Thông báo sau trong bash cho biết cài đặt hoàn tất:
#===========
#= Summary =
#===========
#Driver: Not Selected
#Toolkit: Installed in /usr/local/cuda-11.3/
#......
Thêm CUDA vào biến môi trường:
vim ~/.bashrc
Sao chép nội dung sau vào .bashrc:
# cuda v11.3
export PATH=/usr/local/cuda-11.3/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-11.3/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export CUDA_HOME=/usr/local/cuda-11.3
Làm mới biến môi trường và xác nhận:
source ~/.bashrc
nvcc -V
Thông báo sau trong bash cho biết CUDA 11.3 đã được cài đặt thành công:
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2021 NVIDIA Corporation
Built on Sun_Mar_21_19:15:46_PDT_2021
Cuda compilation tools, release 11.3, V11.3.58
Build cuda_11.3.r11.3/compiler.29745058_0
1.2.3 Cài đặt cuDNN 8.2
- Truy cập: https://developer.nvidia.com/rdp/cudnn-archive
- Chọn: Download cuDNN v8.2.0 (April 23rd, 2021), for CUDA 11.x
- Chọn: cuDNN Library for Linux (x86_64)
- Bạn sẽ tải về gói nén: "cudnn-11.3-linux-x64-v8.2.0.53.tgz"
# Giải nén
tar -zxvf cudnn-11.3-linux-x64-v8.2.0.53.tgz
Sao chép các tệp header và lib của cuDNN vào thư mục cài đặt CUDA 11.3:
sudo cp cuda/include/cudnn.h /usr/local/cuda/include/
sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64/
sudo chmod a+r /usr/local/cuda/include/cudnn.h
sudo chmod a+r /usr/local/cuda/lib64/libcudnn*
1.2.4 Tải xuống TensorRT 8.4.2.4
Trong hướng dẫn này, TensorRT chỉ cần tải xuống và giải nén, không cần cài đặt.
- Truy cập: https://developer.nvidia.com/nvidia-tensorrt-8x-download
- Đánh dấu: I Agree To the Terms of the NVIDIA TensorRT License Agreement
- Chọn: TensorRT 8.4 GA Update 1
- Chọn: TensorRT 8.4 GA Update 1 for Linux x86_64 and CUDA 11.0, 11.1, 11.2, 11.3, 11.4, 11.5, 11.6 and 11.7 TAR Package
- Bạn sẽ tải về gói nén: "TensorRT-8.4.2.4.Linux.x86_64-gnu.cuda-11.6.cudnn8.4.tar.gz"
# Giải nén
tar -zxvf TensorRT-8.4.2.4.Linux.x86_64-gnu.cuda-11.6.cudnn8.4.tar.gz
# Xác minh nhanh cài đặt tensorrt+cuda+cudnn
cd TensorRT-8.4.2.4/samples/sampleMNIST
make
cd ../../bin/
Xuất biến môi trường TensorRT (quan trọng!), lưu ý: Thay thế đường dẫn trong LD_LIBRARY_PATH bằng đường dẫn của bạn!
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/xxx/temp/TensorRT-8.4.2.4/lib
./sample_mnist
Thông báo hiển thị nhận dạng chữ số viết tay trong bash cho thấy CUDA+cuDNN+TensorRT đã được cài đặt thành công.
1.2.5 Tải xuống và thiết lập kho TensorRT-Alpha
git clone https://github.com/FeiYull/tensorrt-alpha
Thiết lập thư mục gốc TensorRT của riêng bạn:
git clone https://github.com/FeiYull/tensorrt-alpha
cd tensorrt-alpha/cmake
vim common.cmake
# Tại dòng 20 trong common.cmake, thiết lập thành thư mục của bạn
# set(TensorRT_ROOT /root/TensorRT-8.4.2.4)
Xuất tệp ONNX từ mã nguồn YOLOv5
Bạn có thể tải xuống tệp ONNX từ các liên kết chia sẻ hoặc tự mình xuất tệp ONNX theo hướng dẫn sau:
# Tải mã nguồn YOLOv5
git clone https://github.com/ultralytics/yolov5
Chuyển phiên bản sang YOLOv5.7.0
git checkout v7.0
Cài đặt môi trường YOLOv5
pip install -r requirements.txt
Sử dụng các lệnh sau để xuất tệp mô hình ONNX, 640 biểu thị độ phân giải đầu vào của mô hình là 640x640, 1280 tương ứng là 1280x1280. Nên sử dụng mô hình nhỏ với độ phân giải 640.
# 640
python export.py --weights=yolov5n.pt --dynamic --include=onnx
python export.py --weights=yolov5s.pt --dynamic --include=onnx
python export.py --weights=yolov5m.pt --dynamic --include=onnx
python export.py --weights=yolov5l.pt --dynamic --include=onnx
python export.py --weights=yolov5x.pt --dynamic --include=onnx
# 1280
python export.py --weights=yolov5n6.pt --dynamic --include=onnx
python export.py --weights=yolov5s6.pt --dynamic --include=onnx
python export.py --weights=yolov5m6.pt --dynamic --include=onnx
python export.py --weights=yolov5l6.pt --dynamic --include=onnx
python export.py --weights=yolov5x6.pt --dynamic --include=onnx
Biên dịch mô hình ONNX với TensorRT
Đặt tệp ONNX của bạn vào đường dẫn: tensorrt-alpha/data/yolov5
cd tensorrt-alpha/data/yolov5
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/TensorRT-8.4.2.4/lib
Lệnh biên dịch mô hình ONNX, 640 biểu thị độ phân giải đầu vào của mô hình là 640x640, 1280 tương ứng là 1280x1280. Lưu ý: Biên dịch mô hình định dạng ONNX sẽ tạo ra tệp xxxx.trt, sẽ được sử dụng trong phần suy luận sau.
# 640
../../../../TensorRT-8.4.2.4/bin/trtexec --onnx=yolov5n.onnx --saveEngine=yolov5n.trt --buildOnly --minShapes=images:1x3x640x640 --optShapes=images:4x3x640x640 --maxShapes=images:8x3x640x640
../../../../TensorRT-8.4.2.4/bin/trtexec --onnx=yolov5s.onnx --saveEngine=yolov5s.trt --buildOnly --minShapes=images:1x3x640x640 --optShapes=images:4x3x640x640 --maxShapes=images:8x3x640x640
../../../../TensorRT-8.4.2.4/bin/trtexec --onnx=yolov5m.onnx --saveEngine=yolov5m.trt --buildOnly --minShapes=images:1x3x640x640 --optShapes=images:4x3x640x640 --maxShapes=images:8x3x640x640
../../../../TensorRT-8.4.2.4/bin/trtexec --onnx=yolov5l.onnx --saveEngine=yolov5l.trt --buildOnly --minShapes=images:1x3x640x640 --optShapes=images:4x3x640x640 --maxShapes=images:8x3x640x640
../../../../TensorRT-8.4.2.4/bin/trtexec --onnx=yolov5x.onnx --saveEngine=yolov5x.trt --buildOnly --minShapes=images:1x3x640x640 --optShapes=images:4x3x640x640 --maxShapes=images:8x3x640x640
# 1280
../../../../TensorRT-8.4.2.4/bin/trtexec --onnx=yolov5n6.onnx --saveEngine=yolov5n6.trt --buildOnly --minShapes=images:1x3x1280x1280 --optShapes=images:4x3x1280x1280 --maxShapes=images:8x3x1280x1280
../../../../TensorRT-8.4.2.4/bin/trtexec --onnx=yolov5s6.onnx --saveEngine=yolov5s6.trt --buildOnly --minShapes=images:1x3x1280x1280 --optShapes=images:4x3x1280x1280 --maxShapes=images:8x3x1280x1280
Biên dịch và thực thi dự án YOLOv5-TensorRT
Sử dụng dòng lệnh để biên dịch mã nguồn:
git clone https://github.com/FeiYull/tensorrt-alpha
cd tensorrt-alpha/yolov5
mkdir build
cd build
cmake ..
make -j10
Thực hiện suy luận theo yêu cầu, hỗ trợ suy luận một hình ảnh, suy luận trực tiếp tệp video, hoặc lấy luồng video từ camera và suy luận trực tiếp.
# 640
# Suy luận hình ảnh
./app_yolov5 --version=v570 --model=../../data/yolov5/yolov5n.trt --size=640 --batch_size=1 --img=../../data/6406401.jpg --show --savePath=../
# Suy luận video
./app_yolov5 --version=v570 --model=../../data/yolov5/yolov5n.trt --size=640 --batch_size=8 --video=../../data/people.mp4 --show
# Suy luận camera web
./app_yolov5 --version=v570 --model=../../data/yolov5/yolov5n.trt --size=640 --batch_size=2 --show --cam_id=0
# 1280
./app_yolov5 --version=v570 --model=../../data/yolov5/yolov5s6.trt --size=1280 --batch_size=1 --img=../../data/6406401.jpg --show --savePath
Ví dụ: Dưới đây là hiệu quả suy luận luồng video của YOLOv5.