[CNN] Tạo models ùy chỉnh cho YOLO v3 | Detect custom object with Yolo v3

1. Yolo là gì?

You only look once(Yolo) là một trong những thuật toán nhận diện vật thể nhanh nhất thời điểm hiện tại. Mặc dù không phải là phương pháp chính có độ xác cao nhất tuy nhiên Yolo vẫn là được ứng dụng rất nhiều trong những dự án thực tế khi mà độ chính xác không phải là ưu tiên hàng đầu.

Cho đến thời điểm hiện tại, Yolo đã có 3 phiên bản và trong bài viết này sẽ hướng dẫn bạn đào tạo model yolov3 để detect một vật thể bất kì. Bài viết sẽ không giải thích cách mà yolo này hoạt động và mặc định bạn đã có hiểu biết về yolo. Nếu bạn vẫn còn chưa biết yolo là gì, hãy dành ra một chút thời gian để tìm hiểu qua các bài luận của Joseph Redmon và cộng sự để hiểu được cách mà yolo hoạt động.

2. Xử lý dữ liệu

Tạo yolo bounding box annotation Ta sẽ tạo một .txt file ứng với mỗi ảnh .jpg cùng tên và đặt trong cùng 1 thư mục. Thông tin trong mỗi file .txt gồm có số lượng object và toạ độ của object ở trong ảnh, ứng với mỗi object là một dòng: <object-class> <x> <y> <width> <height>

Trong đó:

  • <object-class> - là số thứ tự của class xuất phát từ 0 đến (số_class-1)
  • <x_center> <y_center> <width> <height> - là các số thực chỉ vị trí tương ứng của object so với ảnh, nằm trong khoảng từ 0 đến 1
  • Ví dụ:<x> = <absolute_x> / <image_width> hoặc<height> = <absolute_height> / <image_height>
  • Chú ý: <x_center> <y_center> là tâm của bounding box.

Ví dụ ảnh img1.jpg sẽ có img1.txt:

1 0.716797 0.395833 0.216406 0.147222
0 0.687109 0.379167 0.255469 0.158333
1 0.420312 0.395833 0.140625 0.166667

Có khá nhiều tool để giúp tạo bbox annotation cho yolo tuy nhiên bạn có thể tham khảo 1 tool mình dùng link , nó khá là tối giản và dễ sử dụng. Có 3 điều cần chú ý. Thứ nhất là tạo file class_list.txt gồm tên các class object, mỗi tên nằm trên 1 dòng. Thứ 2 là ở dòng 31: bb_dir = “data/” trỏ đến folder lưu các file .txt. Thứ 3 là ở dòng 313: img_dir = “img/” trỏ đến folder chứa ảnh.(hiện vẫn cần ảnh và anno ở 2 folder khác nhau)

3.Download Darknet

Darknet là một open source Neural network được viết bằng C và CUDA. Darknet đã có khá nhiều ứng dụng khác nhau(tham khảo tại đây). Tuy nhiên trong nội dung bài viết ngày hôm nay chúng ta chỉ đi vào Yolo nên mình khuyên các bạn nên clone mạng darknet đã được implement lại riêng cho Yolo của AlexeyAB: https://github.com/AlexeyAB/darknet.

Yêu cầu hệ thống:

Sau khi đã clone Darknet và cài các tài nguyên yêu cầu. Vào thư mục gốc của darknet sửa file Makefile :

GPU=1
OPENCV=1

Sau đó chạy lệnh make trên terminal trỏ đến folder darknet. Vậy là bạn đã cài xong darknet.

4. Chuẩn bị các file cấu hình

1.Tạo file yolo-obj.cfg có cùng nội dung với yolov3.cfg (đơn giản chỉ là copy) và:

  1. Tạo file obj.names với tên của mỗi class được đặt vào 1 dòng(giống với file class_list.txtbên trên)
  2. Tạo file obj.data chứa:
 classes= 2
 train  = data/train.txt
 valid  = data/test.txt
 names = data/obj.names
 backup = backup/

Trong đó:

  • File train.txt và test.txt chứa danh sách tên các ảnh, mỗi ảnh một dòng cùng với đường dẫn đến ảnh đó. Ví dụ:
data/obj/img1.jpg
data/obj/img2.jpg
data/obj/img3.jpg

Bạn có thể tham khảo đoạn code ngắn để tạo file train.txt tại đây.

Sau khi đã tạo xong file train.txt hãy chuyển file img và anno về cùng folder data/obj

Chú ý: tất cả những đường dẫn trên đều phải ở trong thư mục darknet.

  1. Tải pre-trained weights của convolution layers: https://pjreddie.com/media/files/darknet53.conv.74

5. Huấn luyện trên mạng Darknet

Bắt đầu huấn luyện mạng bằng dòng lệnh: darknet.exe detector train data/obj.data yolo-obj.cfg darknet53.conv.74trên window hoặc ./darknet detector train data/obj.data yolo-obj.cfg darknet53.conv.74 trên linux.

  • (file yolo-obj_last.weights sẽ được lưu vào folder backup với mỗi 100 iterations)
  • (file yolo-obj_xxxx.weights sẽ được lưu vào folder backup với mỗi 1000 iterations)
  • Sau mỗi 100 iterations bạn có thể dừng train và tiếp tục training bằng dòng lệnh: darknet.exe detector train data/obj.data yolo-obj.cfg backup/yolo-obj_last.weights

6. Tổng kết và cảm ơn

Vậy là qua bài viết vừa rồi bạn đã biết cách training một model để detect một object tuỳ ý. Tuy nhiên bài viết mới chỉ đề cập đến một phần nhỏ của mạng darknet của AlexeyAB để hiểu rõ hơn bạn có thể tiếp tục đọc (https://github.com/AlexeyAB/darknet#how-to-train-to-detect-your-custom-objects). Cảm ơn đã theo dõi.