Tạo Ứng Dụng A.I Phát Hiện Người Xâm Nhập (P2)
Trong phần 1 mình đã giới thiệu cho các bạn một phương pháp đơn giản để phát hiện đối tượng di chuyên trong ảnh. Nhưng nếu hệ thông hay ứng dụng của bạn yêu cầu độ chính xác cao hơn thì thì việc ứng dụng AI để phát hiện đối tượng là việc rất cần thiết. Một số mô hình AI, Deep learning có thể được sử dụng để phát hiện đối tượng như YOLO, SSD, Faster RCNN, Retinanet ...
Phần 2: Sử dụng mô hình YOLO để phát hiện đối tượng
YOLO (You only look once) là một mô hình học sâu dựa trên CNN để phát hiện đối tượng. YOLO là một mô hình cân bằng được giữa tốc độ dự đoán và độ chính xác so với các mô hình phát hiện đối tượng hiện đại như Faster RCNN, SSD, … YOLO có thể chạy tốt trên các thiết bị cấu hình thấp như Raspberry Pi, NUC, … YOLO đã có nhiều phiên bản khác nhau như YOLO v1,v2,v3,v4. Trong phần này mình sẽ giới thiệu các bạn ý tưởng cơ bản của YOLO và ứng dụng YOLOv3 vào việc phát hiện người xâm nhập sử dụng thư viện OpenCV.
Khác với phương pháp mình đã giới thiệu trong phần 1, mô hình YOLO không chỉ phát hiện được đối tượng trong ảnh mà còn phân loại được đối tượng đó là gì người hay xe.
Hình 1: Tổng quan mô hình phát hiện đối tượng
Ý tưởng cơ bản của YOLO là chia ảnh thành nhiều box, mỗi box sẽ chịu trách nhiệm xác định đối tượng có trong box đó. YOLO sử dụng toàn bộ thông tin của bức ảnh và dự đoán toàn bộ các box chứa đối tượng. Như trong hình 2 ảnh sẽ được chia thành ma trận có kích thước 7x7, mỗi ô (cell) sẽ chứa thông tin về tọa độ và kích thước của box, khả năng xuất hiện đối tượng của box và xác suất của các lớp có thể xuất hiện trong box đó.
Hình 2: Các bước dự đoán của mô hình YOLO
Hiện nay kiến trúc của mô hình YOLOv3 đã có nhiều cải tiến nhằm cải thiện độ chính xác dự đoán giúp cân bằng được tốc độ và độ chính xác. Trong phiên bản YOLOv3 cũng sử dụng ý tưởng đã giới thiệu ở trên nhưng được thực hiện với nhiều tỉ lệ khác nhau giúp mô hình có thể phát hiện được các đối tượng có nhiều kích thước khác nhau.
Hình 3: Kiến trúc của mô hình YOLOv3
Tại mỗi tỉ lệ mô hình sẽ cùng dự đoán các thông tin giống nhau sau đó sử dụng thuật toán Non-Maximum Suppression(NMS) để xác kết quả cuối cùng.
Hình 4: Kết quả dự đoán của mô hình YOLOv3 với B là số box mà mỗi ô (cell) chịu trách nhiệm dự đoán
Để triển khai mô hình chúng ta có thể sử dụng thư viện OpenCV với CPU. Nếu bạn muốn sử dụng GPU để tăng tốc độ dự đoán các bạn có thể sử dụng thư viện Darknet hoặc một số cài đặt sử dụng Tensorflow hay Keras. Trong phạm vi bài chia sẻ này mình sẽ sử dụng module deep learning của OpenCV để thực hiện.
Các bạn có thể tải source code tại đây.
Để chạy chương trình các bạn có thể thực hiện các bước sau:
Bước 1: Tạo môi trường và thực hiện cài đặt các thư viện cần thiết
git clone https://github.com/tienbt93/detector.git
cd detector
pip install -r requirements.txt
Bước 2: Thiết lập các tham số, ngưỡng cho chương trình
#detector/yolo.py
...........
self.root_dir = '../models'
self.model_type = '' # model bạn muốn khơi chạy (yolov3, yolov3-tiny) mặc định yolov3
self.label_file = '{}/config/coco.names'.format(self.root_dir)
self.weights_path = '{}/weights/yolov3{}.weights'.format(self.root_dir, self.model_type)
self.config_path = '{}/config/yolov3{}.cfg'.format(self.root_dir, self.model_type)
self.confidence = 0.5 # ngưỡng cho độ tin tưởng
self.threshold = 0.5 # ngưỡng cho thuật toán NMS
...........
Bước 3: Tải pretrained model và cấu trúc mô hình YOLO bạn muốn chạy.
Để tải các pretrained model của YOLO các bạn có thể vào đây để tải file .weights và file .cfg tương ứng. Các bạn thực hiện copy weights và file config vào thư mục tương ứng.
.
├── _models
│ ├──_config -> chứa file .cfg
│ └──_weights -> chứa file .weights
Bước 4: Thực hiện chạy chương trình
python main.py -v "Path video của bạn"
Kết quả
Rõ ràng kết quả đã chính xác hơn và không bị nhiễu bởi các vật thể khác không phải người. Nhưng chúng ta cũng thấy răng tốc độ xử lý của hệ thống đã chậm đi đáng kể.
Kết luận
Qua việc thực hiện và sử dụng hai phương pháp tiếp cận cho bài toán phát hiện người xâm nhập chúng ta có thể rút ra một số kinh nghiệm nhỏ sau: Với những hệ thống nhỏ không sử dụng GPU cho quá trình dự đoán các bạn có thể sử dụng thuật toán trừ nền hoặc dùng các phiên bản thu nhỏ (tiny hay mobilenet) để thực hiện. Nếu bạn có GPU và muốn độ chính xác cao hơn thì bạn hoàn toàn có thể sử dụng các mô hình sâu hơn để dự đoán như YOLOv3, v4, Faster RCNN hoặc Retinanet.