Series YOLOv4: #1Train model trên Google Colab – Object detection.

1. Tìm hiểu về một số định nghĩa liên quan.

  • ​​Object detection:

​Là công việc phát hiện và tìm vị trí của nhiều đối tượng có trong một bức hình. Nó là một công nghệ máy tính liên quan đến thị giác máy tính và xử lý hình ảnh liên quan đến việc phát hiện các trường hợp của các đối tượng ngữ nghĩa của một lớp nhất định trong hình ảnh và video kỹ thuật số. Bài toán này được ứng dụng nhiều trong thực tế, ví dụ: phân loại các loại lá, nhận dạng và phân loại người có đeo khẩu trang hay không,…

  • YOLOv4.

Yolo là một mô hình mạng CNN cho việc phát hiện, nhận dạng, phân loại đối tượng. Yolo được tạo ra từ việc kết hợp giữa các convolutional layers và connected layers.Trong đóp các convolutional layers sẽ trích xuất ra các feature của ảnh, còn full-connected layers sẽ dự đoán ra xác suất đó và tọa độ của đối tượng.

Cấu trúc của YOLOv4.

Bài này chúng ta chỉ đi sơ qua về các thuật ngữ và đi sâu vào các thực hiện các model nhé. Mình sẽ có bài tìm hiểu kỹ hơn về cấu trúc cũng như cách thức hoạt động của mô hình YOLOv4 ở phần sau.

  • Google Colab.

​Google Colab (Google Colaboratory) là một dịch vụ miễn phí của Google nhằm hỗ trợ nghiên cứu và học tập về AI. Colaboratory cung cấp môi trường Code như Jupyter Notebook và có thể sử dụng GPU và TPU miễn phí. … Mở Notebook từ Google Drive, Github, Upload. Thực thi lệnh Shell, cài đặt thư viện, thư mục hiện tại. Google Colab cung cấp cho chúng ta một cấu hình khá khủng đối với sinh viên cũng như các nhà nghiên cứu về AI tại thời điểm hiện tại:

Colab

Cấu hình của Colab cung cấp.

Cho nên việc tận dụng tài nguyên trên Google Colab là một điều hiển nhiên, hehe.

2. Các bước thực hiện.

  • ​​Bước 1: Lên ý tưởng cho mô hình cần đào tạo. Bước này các bạn phải tự nghĩ nhé, tùy theo ý muốn của các bạn hay là các đề tài ĐATN do các Thầy giao nhé. 😀 .

​Ở đây mình sẽ sử dụng mô hình nhận dạng cây Xà lách và cây cỏ. Mục đích là chăm sóc cho vườn cây xà lách ( tưới nước, bón phân, đo độ ẩm) và diệt cỏ.

  • Bước 2: Tìm kiếm dữ liệu.

​Các bạn có thể tìm dữ liệu phục vụ việc đào tạo model thông qua bác Google đối với các loại dữ liệu thông dụng (VD: dataset ký hiệu bàn tay, máy bay, ô tô, xe máy,…). Nhưng đối với những bài toán đặc thù(VD: xác định bạch cầu, hay các loại cây đặc biệt,…) thì mình khuyên các bạn nên tự tạo cho mình một bộ dataset riêng nhằm tránh việc nhầm lẫn data hoặc tránh tình trạng data không khớp với các thực thể cần nhận dạng. 

Việc chuẩn bị data cần kỹ lưỡng và thận trọng, tránh các trường hợp model đào tạo ra không đúng như yêu cầu- việc triển khai lại từ đầu sẽ tốn rất nhiều thời gian.

Đối với mình, thường sẽ quay video record lại đối tượng, sau đó về tách ra từng frame và gán nhãn trên từng frame đó 😀

dataset
Thu thập dataset.

Hướng dẫn tách frame tại đây.

  • Bước 3: Gán nhãn cho đối tượng

​Gán nhãn là quá trình tốn nhiều thời gian và khá nhàm chán, nhưng nó lại là phần tiên quyết ảnh hưởng tới đầu ra của mô hình cần đào tạo ( Ví dụ: các bạn gán những cây bị khuất một nửa ở góc các hình, thì mô hình sẽ có thể nhận dạng các cây bị khuất ở góc hình, hay khi các bạn kéo đường bao vật thể lớn hơn vật thể, thì mô hình sẽ không thể nào nhận dạng vừa khít với kích thước vật thể được). Nó như một đứa trẻ, chúng ta chỉ chúng học cái gì thì nó sẽ học theo y như vậy!

​Việc cài đặt và tìm hiểu các bước phục vụ công việc gán nhãn nó khá dài, nên mình đã tách riêng ra thành 1 bài nhé. Các bạn xem tại đây.

  • Bước 4: Cấu hình các files phục vụ quá trình train model trên Google Colab.
  • Bước 4.1: Việc đầu tiên là tạo một tài khoản trên Google Colab nhé :D. Bằng cách đăng nhập bằng tài khoản gmail ( miễn phí nhé)
Giao diện mở đầu.
  • Bước 4.2: Tiếp đó là chọn: Tệp => Mở sổ tay mới và đổi tên sổ tay.
  • Bước 4.3: Liên kết với drive phục vụ việc lưu trữ mọi thứ.
from google.colab import drive
drive.mount('/content/gdrive')
  • Bước 4.4: Cập nhật các packet.
!apt-get update
!apt-get upgrade
  • Bước 4.5: Tải model về drive.
!rm -rf darknet #Xóa thư mục darknet nếu có 
%cd /content/gdrive/My\ Drive # truy cập vào Drive 
!git clone https://github.com/AlexeyAB/darknet #Tải model về Drive 
!rm -rf data #Xóa thư mục data trong thư mục darknet 
!mkdir backup # tạo thư mục backup để lưu các file trọng số sau đào tạo 
  • Bước 4.6:  Nén toàn bộ ảnh và file txt thành data.zip và tải lên Drive, bỏ trong thư mục darknet.  
  • Bước 4.7: Giải nén file zip.
%cd /content/gdrive/MyDrive/darknet/
!unzip data.zip
  • Bước 4.8: Tạo file train.txt ( chứa địa chỉ của các file ảnh đưa vào quá trình train model) và file val.txt ( chứa địa chỉ của các file ảnh đưa vào quá trình test và đánh giá model). Sử dụng đoạn code sau( mình lấy từ trang miai.vn).
%cd /content/gdrive/My Drive/darknet/
import glob2
import math  
import os
import numpy as np
#import các thư viện

files = []
for ext in ["*.png", "*.jpeg", "*.jpg"]:
  image_files = glob2.glob(os.path.join("data/", ext))
  #tìm kiếm các file có đuôi dạng: png, jpeg, jpg trong thư mục data
  print(image_files)
  files += image_files
  #lưu tất cả các file vào biến files
  print(len(files))

nb_val = math.floor(len(files)*0.2)
#Biến nb_val được gán bằng 0.2 độ dài của biến files(chứa tất cả các tên anh)
rand_idx = np.random.randint(0, len(files), nb_val)
#Chọn ngẫu nhiên các ảnh trong biến files

# Tạo file train.txt
with open("/content/gdrive/My Drive/darknet/train.txt", "w") as f:
  for idx in np.arange(len(files)):
    if (os.path.exists(files[idx][:-3] + "txt")):
      f.write(files[idx]+'\n')


# Tạo file vali.txt
with open("/content/gdrive/My Drive/darknet/val.txt", "w") as f:
  for idx in np.arange(len(files)):
    if (idx in rand_idx) and (os.path.exists(files[idx][:-3] + "txt")):
      f.write(files[idx]+'\n')
  print('done2')

Sau khi thực hiện đoạn code này, các bạn sẽ có 2 file train.txt và val.txt ở trong thư mục darknet nha.Các bạn có thể xem các file bằng cách nhấn vào icon mình đã khoanh đỏ.

darknet
Thư mục darknet.
  • Bước 4.9: Tạo các file cấu hình cho model.

​Tiếp theo, chúng ta bấm vào dấu 3 chấm bên cạnh thư mục darknet => chọn Tệp mới  và đặt tên:

  • yolo.names

Chứa tên của các nhãn mà các bạn đã gán cho data của mình. Chúng ta có thể copy từ file classes.txt trong thư mục lưu các file txt tạo ra trong quá trình gán nhãn. Model của mình có 3 nhãn(classes):

Label Name
file yolo.names
  • yolo.data

File này có nhiệm vụ đưa một vài thông số đầu vào cho model, bao gồm: số lớp, dữ liệu train, dữ liệu test, tên nhãn và địa chỉ lưu file trọng số( kết quả cuối cùng của model)

data
file yolo.data
  • Bước 4.10: Bật GPU và cấu hình GPU.

Truy cập:Thời gian chạy (Run time)/ Thay đổi thời gian chạy( Change run time). Và chọn GPU ở phần Trình tăng tốc phần cứng.

runtime
Cấu hình GPU.

Sau đó: Truy cập darknet/makefile . Mở file makefile và sửa 4 dòng đầu tiên như hình ( sửa số 0 thành số 1):

makefile
Cấu hình GPU.
  • Bước 4.11: Cấu hình cho model YOLOv4. Các bạn truy cập: darknet/cfg, tìm và mở file yolo4-custom.cfg và chỉnh sửa các dòng:

Dòng 3: Batch = 64

Dòng 4: subdivisions=16

Dòng 20: max_batches = số nhãn*2000 ( ví dụ mình có 3 nhãn, thì sẽ sửa thành 6000. Hoặc có thể lớn hơn, tùy ý thích)

Dòng 22: step = 80%(của max_batches), 90% (của max_batches). ví dụ max_batches của mình là 6000, step sẽ sửa thành: step = 4800,5400.

Dòng 610, 696, 783: classes = số nhãn(classes của bạn). Model của mình sẽ sửa thành classes = 3

Dòng 603,689, 776: filters = (số nhãn +5)*3. Model của mình sẽ sửa thành (5+ 3)*3 = 24. filters =24. Lưu ý: các model có số nhãn là 1 thì để filters =18, số nhãn bằng 2 thì để filters = 21

Để dễ nhớ hơn nhé: sửa classes trong mục [yolo], sửa filters =255 trong mục [Convolution] nằm trước mục [yolo]. 

  • Bước 4.12: Tải pretrain. Các bạn chạy câu lệnh này nhé:
%cd /content/gdrive/My\ Drive/darknet
!wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.conv.137
  • Bước 4.13: Make darknet:
%cd /content/gdrive/My\ Drive/darknet
!make clean
!make
!chmod +x ./darknet

Nó chạy rất lâu và xuất màn hình rất dài, nhưng túm cái váy, cuối cùng nó xuất ra như này là đã xong nhé các bạn:

make
Make darknet.
  • Bước 5: Train model.

Cuối cùng cũng sắp xong, các bạn kiểm tra lại các bước xem đầy đủ chưa nhé. Mình sẽ hệ thống lại giúp các bạn:

1. Tạo file train.txt, val.txt.

2.Tạo file yolo.names, yolo.data.

3. Sửa makefile và bật GPU.

4. Sửa file cfg (tổng cộng sửa 10 dòng nhé)

5. Make darknet.

6.Tải pretrain.

Thấy mục nào là lạ thì xem lại nhé :D.

Rồi, sau khi hoàn thành thủ tục thì các bạn chạy câu lệnh này để train model:

%cd /content/gdrive/My\ Drive/darknet
!./darknet detector train yolo.data cfg/yolov4-custom.cfg yolov4.conv.137 -dont_show -map

Giải thích một xíu nha:

“!./darknet detector train” là truy cập vào thư mục darknet và thực hiện lệnh train.

yolo.data, cfg/yolov4-custom.cfg là các file ta đã tạo và sửa ở trên.

yolov4.conv.137 là file ta đã tải ở bước 4.11.

-dont_show để tạo ra biểu đồ của loss function phục vụ quá trình giám sát và đánh giá mô hình.

-map tạo ra biểu đồ mAP.

train
Output của quá trình train.

3. Source code:

Sau khi hoàn thành hướng dẫn nhưng chưa chạy được, các bạn có thể tham khảo code của mình ( nhớ copy sang 1 page Colab riêng của bạn nhé 😀 – để các bạn khác còn đọc). Link xem tại đây

4.Dừng train

Trong quá trình train, output được xuất liên tục. Chúng ta chỉ cần quan tâm tới một số vấn đề :1: 3619.999512, 3619.999512 avg loss​ :

1″ chính là số vòng train.

3619.999512 avg loss​: chính là loss.

Nếu tab không hoạt động thì Google Colab sẽ tự ngắt kết nối, nên các bạn tải autoclick về và xóa output liên tục nhé. Hướng dẫn sử dụng autoclick tại đây.

Khi nào có thể dừng quá trình train:

–  Các bạn có thể thấy như hình ở dưới, khi giá trị loss và mAP đạt được một giá trị nhất định và có vẻ không thể tăng thêm nữa. Thì đó là thời điểm chúng ta có thể dừng. ( quá trình train thường kéo dài >4000 vòng)

– Theo tác giả thì thời điểm có thể dừng quá trình train: là khi loss trung bình có giá trị 0.05 tới 1 đối với các mô hình nhỏ, các nhãn có đặc điểm khác xa hoàn toàn nhau. và loss trung bình có giá trị trong khoảng 1 tới 3 đối với mô hình lớn, nhiều nhãn và các nhãn có đặc điểm tương đồng (khó nhận dạng hơn).

Biểu đồ tạo ra khi thêm :-dont_show -map

  • Bước 6: Kiểm tra và đánh giá mô hình.

Xong quá trình train, thì việc tiếp theo là kiểm tra và đánh giá kết quả đào tạo của mô hình. Chúng ta sẽ có 3 cách đánh giá cơ bản:

  • Trực quan: tức là chúng ta sẽ đưa ảnh vào cho model nhận dạng. Hướng dẫn nhận dạng tại đây
  • Đánh giá bằng loss avg: chúng ta đã có biểu đồ như hình trên, nằm trong thư mục darknet với tên ; chart.png. Với loss avg, giá trị của nó càng nhỏ càng tốt.
  • Đánh giá bằng mAP(mean average precision): chúng ta cũng có đường biểu diễn mAP ở trong biểu đồ trên ( đường màu đỏ), giá trị của nó càng lớn càng tốt. Tìm hiểu mAP và cách xuất biểu đồ AP ( phù hợp để đánh giá mô hình cho Đồ án, luận văn tốt nghiệp)

Rồi, bài viết tới đây là hết. Vì bài quá dài nên mình phải trích dẫn thành nhiều phần nhỏ cho các bạn dễ đọc, hình dung và thực hiện một cách dễ dàng hơn. Chúc các bạn thành công.

Bài viết tham khảo từ các nguồn:

Github darknet của tác giả AlexeyAB: https://github.com/AlexeyAB/darknet

Seri hướng dẫn train YOLO của miai.vn:

https://www.miai.vn/2019/08/09/yolo-series-2-cach-train-yolo-de-detect-cac-object-dac-thu/

https://www.miai.vn/2019/08/15/yolo-series-cach-train-yolo-tren-google-colab/

4 thoughts on “Series YOLOv4: #1Train model trên Google Colab – Object detection.

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *