[YOLO Series] Train YOLO v4 train trên COLAB chi tiết và đẩy đủ (A-Z)

Xin chào tuần mới toàn thể anh em Mì! Hôm nay chúng ta sẽ train YOLO v4 trên COLAB theo cách cực chi tiết và đẩy đủ, ai cũng train được Yolov4 Colab 😀

Chắc hẳn anh em đã quen với series về YOLO v3 trên Mì Ai:

Tuy nhiên thì chắc anh em cũng đã nghe tin rằng các thánh Alexey BochkovskiyChien-Yao WangHong-Yuan Mark Liao đã cho ra mắt bản YOLO v4 với nhiều tính năng ưu việt như: tốc độ nhanh hơn nhưng độ chính xác thì cũng được nâng lên ở mức bá đạo luôn.

Nguồn: Tại đây

Do vậy, hôm nay chúng ta sẽ cùng nhau thử train YOLO trên COLAB xem YOLO v4 có gì khác và trong bài sau chúng ta cũng sẽ tìm cách để làm sao khi test có thể chạy trên GPU nhằm tăng tốc độ nhận diện nhé.

Phần 1 – Nói lại về lý do train YOLO v4 trên COLAB

Phần này mình xin viết lại cách train từng bước ( như đã từng làm với YOLO v3). Lý do vì mình vừa tìm ra 1 cách train mới, nhanh hơn, dễ hơn cho anh em Mì kaka 😀 Bắt đầu từng bước nhé. Ah nói luôn là mình cần các bạn tập trung và làm từng bước, không bỏ bước nào để tránh thiếu nhé.

Có bạn bảo sao không train trên máy PC, lý do vì máy PC chậm, train tốn điện, nóng máy và nhanh hỏng. Trong khi COLAB train khỏe, nhanh, có GPU khủng và lại miễn phí.

Nói thêm là Google Colab là một dịch vụ đám mây nghĩa là nó ở “trên mây” (thực ra trên Internet) chứ không phải trong máy PC của bạn, bạn sẽ phải upload ảnh, source, ….. lên đó để train.

Nhược điểm duy nhất của COLAB: vì là đồ miễn phí nên sau 1 thời gian 10 -12 tiếng nó sẽ clear, xóa hết file và restart runtime. Nhưng anh em đừng lo, với Mì AI sẽ ngon lành, kệ nó clear =))

Tóm tắt lại phần này: Colab train nhanh, sướng, miễn phí và…nó ở trên mây.

Phần 2 – Chuẩn bị dữ liệu train YOLO v4 trên Colab

Chuẩn bị dữ liệu

“Trứng rán cần mỡ, bắp cần bơ” còn Deep Learning thì cần dữ liệu. Không có dữ liệu thì chả làm được gì. Bài này ta cần train model YOLO để phát hiện đám cháy thì suy ra cần dữ liệu là lửa.

Các bạn hãy collect thật nhiều ảnh lửa, lưu vào 1 thư mục có tên data trên máy tính. Sau đó sử dụng phần mềm gán nhãn lblImage để gán nhãn cho ảnh theo bài này [Yolo Series] #2 – Cách train Yolo để detect các object đặc thù.

Tuy nhiên đôi lời chú ý, các bạn đọc kỹ, ko đọc train lỗi mình không chịu trách nhiệm nhá 😀

  • Với bài trước ta để ảnh trong thư mục images, còn nhãn để trong thư mục labels.
  • Với bài này ta để chung hết trong 1 thư mục data thôi, vì tác giả Yolov4 thích thế! Haha.
  • Chú ý trước khi gãn nhán vào thư mục labelImg/data/ và xóa trắng file predefined_classes.txt đi nhé.

Tóm lại sau khi gán nhãn xong ta sẽ có 1 thư mục data chứa dữ liệu ảnh. Mỗi ảnh sẽ có 2 file:

  • File có đuôi jpg, png…: Là file ảnh đầu vào
  • File có đuôi txt: Là file nhãn của ảnh tương ứng
  • Hai file này có tên y hệt nhau, khác nhau mỗi phần đuôi nhé.

Ví dụ như thư mục của mình này:

yolo v4 image

Bây giờ các bạn zip cho mình cái thư mục data này lại thành file data.zip nào!

yolo v4 image data

Xong việc số 1. Mình có để sẵn vài bộ dữ liệu về súng, lửa… trong thư viện Mì AI để bạn nào cần train thì vào lấy nhé: https://www.miai.vn/thu-vien-mi-ai/ (nhớ xem video trong link để biết cách tải)

Chuẩn bị file config

Để tiếp tục train Yolov4 trên Colab, các bạn tải cho mình file yolov4-custom.cfg tại đây về máy tính của các bạn. Mở ra và sửa theo đúng những gì bên dưới nhé:

  • Đầu tiên cần xác định bạn train mấy class? Chính là bao nhiêu loại đối tượng. Ví dụ mình train mỗi lửa thôi -> 1 class, train cả lửa, cả nước thì 2 class.
  • Tìm đến dòng 20, sửa max_batches = max(<số class>*2000,6000). Nghĩa là nếu <số class>*2 mà nhỏ hơn 6000 thì lấy 6000 và ngược lại. Ở đây mình lấy 6000 vì 1*2000 < 6000 rồi. Sửa max_batches=6000.
  • Đến dòng 22 sửa thành steps=80%, 90% của max_batches. Ví dụ ở đây là steps=4800,5400.
  • Replace toàn bộ các dòng có “classes=80” thành “classes=<số class>”. Ví dụ với bài này thì là sửa thành “classes=1”. Món này có thể dùng Find/Search and Replace cho nhanh, còn nếu không thì nó ở các dòng 970, 1058 và 1146 nhé.
  • Replace toàn bộ các dòng có “filters=255” thành “filters=<(số class+5)*3>”. Ví dụ với bài này số class = 1 thì sẽ sửa thành (1+5)*3 = 18, có nghĩa là filters=18. Vẫn như trên nghĩa là có thể dùng Search and Replace còn cụ thể nó ở các dòng: 963, 1051 và 1139 nhé nếu bạn thích sửa tay.
  • Nếu bạn bị out memory, hãy chuyển subdivisions (dòng 7) thành 32 (hoặc 64) hoặc các bạn giảm size ảnh xuống còn width=416, height=416 (dòng 8,9).

Xong, save lại là đã có thêm file yolov4-custom.cfg nhé. Save vào cùng chỗ với file data.zip bên trên. Chờ sẵn đó!

Chuẩn bị Makefile

Bây giờ tải tiếp Makefile về tại đây . Mở ra và sửa như sau:

  • Dòng 1, sửa thành GPU=1
  • Dòng 2, sửa thành CUDNN=1
  • Dòng 4, sửa thành OPENCV=1

Save lại và có thêm file Makefile. Save cùng chỗ với data.zip.

Tóm lại: Sau phần này ta có 3 file: data.zip, Makefile và yolov4-custom.cfg. Bạn nào chưa có đủ 3 file thì đọc lại trước khi sang phần tiếp theo nha!

Phần 3 – Bắt đầu lên mây cùng Google Colab

Bây giờ các bạn vào địa chỉ chính thức của colab https://colab.research.google.com/ và chọn New Notebook để tạo một Notebook làm việc với bài này.

yolo v4 colab

Sau đó ngay lập tức vào Runtime > Change runtime type để bật GPU lên cho nhanh nhé (để CPU chậm như rùa luôn)

yolov4 colab
yolo colab

Xong con ong! Sang phần sau để viết code được rồi đấy!

Phần 4 – Train YOLOv4 trên COLAB

Bước 1. Kết nối Google Drive

Như đã nói ở trên, sau 10 tiếng Colab sẽ kill sạch, clear sạch nên nếu như ta để file trên nó thì sẽ “toang” ngay. Nên các bạn cần chuẩn bị 1 tài khoản Google Drive cho mình. Ai chưa có thì tạo, miễn phí mà!

Còn bây giờ, để bắt đầu Yolov4 trên Colab, hãy tạo 1 Code Block mới bằng cách. nhấn vào + Code

yolov4 colab

Tiếp theo paste đoạn code sau vào Code Block vừa sinh ra:

Sau đó nhấn nút mũi tên để chạy code, Colab sẽ hiện ra 1 link URL, các bạn bấm vào đó, chọn tài khoản Google Drive, copy mã code hiển thị trên màn hình và paste vào ô Enter your authorization code. Colab báo mounted là okie nhé.

Train YOLO trên Colab

Bây giờ các bạn đã có thể lưu dữ liệu của bạn vào thư mục /content/gdrive/My Drive/ thoải mái nhé. Nó sẽ tự đồng bộ sang Google Drive.

Bước 2. Tải mã nguồn YOLOv4 về Drive

Ở bước này ta sẽ tải mã nguồn về thẳng Drive (tất nhiên tải bằng lệnh trên Colab) để sau này thích train lúc nào thì train, đếch sợ thằng Colab kill nữa. Nào, tạo code block mới và paste đoạn này vào:

Sau đó chạy bằng cách nhấn mũi tên run!

Bạn nào tò mò thì sang Gdrive mà xem sẽ thấy source về ầm ầm luôn.

Nếu chạy bị lỗi các bạn cứ chụp màn hình và post lên Group trao đổi, chia sẻ: https://facebook.com/groups/miaigroup để cùng chia sẻ, giao lưu nhé!

Bước 3. Upload file từ dưới máy tính lên Google Drive

Ở trên các bạn nhớ lại mình đã có 3 file: data.zip, Makefile và yolov4-custom.cfg đúng ko nhỉ? Bây giờ ta up 3 thằng này lên nào.

Tìm đến thư mục darknet trên Google Drive và thực hiện:

colab yolov4
  • Upload file data.zip vào trong thư mục data
  • Upload file yolov4-custom.cfg vào thư mục cfg (có hỏi ghi đè cứ vô tư nhé)
  • Upload file Makefile vào thư mục darknet, đè lên file hiện tại, kệ nó.

Đợi xíu cho upload lên rồi đi tiếp!

Bước 4. Giải nén file data.zip để lấy dữ liệu train

Lại tạo một code block mới và paste đoạn lệnh sau (nhớ chạy sau khi paste)

Chú ý đoạn lệnh trên có thể báo lỗi ở dòng mkdir thì kệ nó nhé. Mình làm thế đề phòng bị thiếu thư mục. Chỉ cần file data.zip được giải nén thành công không báo lỗi là okie.

Nếu chạy bị lỗi các bạn cứ chụp màn hình và post lên Group trao đổi, chia sẻ: https://facebook.com/groups/miaigroup để cùng chia sẻ, giao lưu nhé!

Nếu không lỗi thì sang bước tiếp.

Bước 5. Tạo file yolo.names chứa tên các class

Tạo thêm 1 code block mới và gõ lệnh sau (nhớ chạy):

Chúng ta sẽ tạo được một file yolo.names có chứa 1 dòng fire mà thôi. Còn nếu bạn train 2 class, 3 class thì sao? Thì thêm các dòng như sau (ví dụ train 2 class là fire và water nhá):

Để ý là từ dòng thứ 2 trở đi là >> chứ ko phải > như dòng đầu là được.

Bước 6. Tạo hai file train.txt và val.txt chứa danh sách các file ảnh

Ý nghĩa của 2 file này như sau:

  • Chúng ta đã chứa toàn bộ ảnh trong thư mục data. Ta cần chỉ cho YOLO biết thế ảnh nào ông định train? ảnh nào ông định val?
  • File train.txt chứa danh sách các file sẽ dùng để train
  • File val.txt thì tất nhiên là danh sách các file dùng để val
  • Danh sách cần chọn ngẫu nhiên đảm bảo tính phân phối dữ liệu.

Okie, tạo code block mới nào và paste & run:

Chạy xong sẽ thấy thư mục darknet xuất hiện 2 file train.txt và val.txt là ô kê con dê, không thấy thì từ từ kiểm tra lại trước khi đi tiếp nhá!

Nếu chạy bị lỗi các bạn cứ chụp màn hình và post lên Group trao đổi, chia sẻ: https://facebook.com/groups/miaigroup để cùng chia sẻ, giao lưu nhé!

Bước 7. Tạo file yolo.data chứa tham số train

Đến bước này có thể nói là chúng ta đã gần như xong rồi, ta sẽ tạo nốt một file chứa tham số train để ông YOLO đọc. Tạo codeblock & run:

Gõ chuẩn luôn nhé các bạn! Chú ý ở dòng số 4 bên trên nhớ sửa số 1 thành số class của bạn (ví dụ: 2,3,4…. tùy bài toán)

Sau khi chạy xong sẽ thêm một file yolo.data trong thư mục darknet.

Bước 8. Biên dịch mã nguồn darknet

Tạo code block và gõ lệnh & run:

Đợi lúc cho nó dừng lại và không báo lỗi gì có chữ error thì là okie, có thì chụp ảnh màn hình up lên group xem nhá!

Bước 9. Tải pretrain weights

Chúng ta sẽ tận dụng weights của phần Convolution đã được train ngon lành của Darknet bằng cách tải file yolov4.conv.137 về bằng codeblock :

Bước 10. Train train train!!!

Well, tất cả các bước chuẩn bị đã xong, bây giờ là train thôi. Tạo một codeblock mới và paste đoạn sau vào:

Mọi thứ sẽ chạy êm ru, các bạn ngồi theo dõi nó chạy và sẽ có cảm giác train Yolov4 trên Colab “pro” cực kỳ, như hacker trong film!

yolov4

Trong quá trình train, bạn sẽ thấy thư mục darknet/backup sẽ sinh ra các file sau:

  • File yolov4-custom_last.weights là file weights cuối cùng các bạn có được.
  • File yolov4-custom_1000.weights, yolov4-custom_2000.weights… là các file weight tại 1000,2000 vòng…

Tùy tình hình dữ liệu, bài toán, bạn dùng weights nào thì lấy file đó.

Phần 5 – Theo dõi tham số của quá trình train

Thông số quá trình train

Trong quá trình train các bạn để ý sẽ thấy 1 số dòng có dạng như này:

Ta cùng phân tích mấy cái chính sau:

  • 1249: Số vòng train đến hiện tại, ở đây là 1249 kaka.
  • 2.061428, 2.191828 avg loss : cái này nghĩa là loss của vòng hiện tại là 2.061428 còn loss trung bình cho đến vòng hiện tại là 2.191828

Thế bây giờ câu hỏi là “Khi nào dừng train?”. Ta sẽ dừng trong 3 trường hợp

  • Nó tự dừng khi train xong max_batches mà ta định nghĩa bên trên.
  • Khi ta quan sát một thời gian thấy loss bão hòa, không giảm quá nhiều sau một khoảng tầm 100 vòng.
  • Khi Colab kill sau một khoảng thời gian nhất định.

Vậy lại hỏi tiếp “Vậy với Trường hợp 2 và 3 thì train tiếp như nào?”

Chúng ta sẽ train tiếp bằng cách chạy lệnh train ở Bước 10 bên trên nhưng trong câu lệnh sẽ thay yolov4.conv.137 bằng file weight mới nhất mà chúng ta có được, chính là yolov4-custom_last.weights

OK! Bài Yolov4 trên Colab đã dài nên mình xin tạm dừng. Trong bài tiếp theo chúng ta sẽ cùng tìm hiểu cách visualize loss ra đồ thị và cách sử dụng keras để inference trên GPU nhằm tăng tốc độ nhận diện nhé.

Ps: Mình có link sẵn 1 Notebook Yolov4 trên Colab cho các bạn thực hành nhá https://colab.research.google.com/drive/1gsC8gtFazwkikBvDJ3OwKbeY__-lmpma?usp=sharing

Hẹn gặp lại các bạn! Chào tạm biệt và chúc các bạn thành công!

Hãy join cùng cộng đồng Mì AI nhé!

Fanpage: http://facebook.com/miaiblog
Group trao đổi, chia sẻ: https://www.facebook.com/groups/miaigroup
Website: https://miai.vn
Youtube: http://bit.ly/miaiyoutube

Related Post

21 Replies to “[YOLO Series] Train YOLO v4 train trên COLAB chi tiết và đẩy đủ (A-Z)”

  1. anh Thắng ở bước 6 thì đường dẫn đang thừa nhé. Anh sửa lại như bên dưới nhé.

    # Step 6. Tạo file train.txt và val.txt
    “data/images/” -> “data/”

  2. Anh Thắng ơi cho em hỏi chổ thông số quá trình train thì 2 cái giá trị loss đó là của tập val hay tập train vậy ạ ?

  3. Anh ơi e đã giảm size ảnh xuống 416, tăng subdivisions lên 64 rồi nhưng vẫn bị out memory thì sao ạ.

      1. Em làm theo a thì fix được lỗi out memory rồi, nhưng mà nó lại bị lỗi load image, e đang dùng dataset GTSRB, e train trên Colab. E nghĩ có thể là do kích thước của ảnh trong tập dataset này nhỏ quá nên phát sinh lỗi.

  4. [yolo] params: iou loss: ciou (4), iou_norm: 0.07, cls_norm: 1.00, scale_x_y: 1.20
    nms_kind: greedynms (1), beta = 0.600000
    140 route 136 -> 76 x 76 x 128
    141 conv 256 3 x 3/ 2 76 x 76 x 128 -> 38 x 38 x 256 0.852 BF
    142 route 141 126 -> 38 x 38 x 512
    143 conv 256 1 x 1/ 1 38 x 38 x 512 -> 38 x 38 x 256 0.379 BF
    144 conv 512 3 x 3/ 1 38 x 38 x 256 -> 38 x 38 x 512 3.407 BF
    145 conv 256 1 x 1/ 1 38 x 38 x 512 -> 38 x 38 x 256 0.379 BF
    146 conv 512 3 x 3/ 1 38 x 38 x 256 -> 38 x 38 x 512 3.407 BF
    147 conv 256 1 x 1/ 1 38 x 38 x 512 -> 38 x 38 x 256 0.379 BF
    148 conv 512 3 x 3/ 1 38 x 38 x 256 -> 38 x 38 x 512 3.407 BF
    149 conv 18 1 x 1/ 1 38 x 38 x 512 -> 38 x 38 x 18 0.027 BF
    150 yolo
    [yolo] params: iou loss: ciou (4), iou_norm: 0.07, cls_norm: 1.00, scale_x_y: 1.10
    nms_kind: greedynms (1), beta = 0.600000
    151 route 147 -> 38 x 38 x 256
    152 conv 512 3 x 3/ 2 38 x 38 x 256 -> 19 x 19 x 512 0.852 BF
    153 route 152 116 -> 19 x 19 x1024
    154 conv 512 1 x 1/ 1 19 x 19 x1024 -> 19 x 19 x 512 0.379 BF
    155 conv 1024 3 x 3/ 1 19 x 19 x 512 -> 19 x 19 x1024 3.407 BF
    156 conv 512 1 x 1/ 1 19 x 19 x1024 -> 19 x 19 x 512 0.379 BF
    157 conv 1024 3 x 3/ 1 19 x 19 x 512 -> 19 x 19 x1024 3.407 BF
    158 conv 512 1 x 1/ 1 19 x 19 x1024 -> 19 x 19 x 512 0.379 BF
    159 conv 1024 3 x 3/ 1 19 x 19 x 512 -> 19 x 19 x1024 3.407 BF
    160 conv 1 1 x 1/ 1 19 x 19 x1024 -> 19 x 19 x 1 0.001 BF
    161 yolo
    Error: l.outputs == params.inputs
    filters= in the [convolutional]-layer doesn’t correspond to classes= or mask= in [yolo]-layer

    cho e hỏi lỗi này thế nào ạ?

  5. Khi giải nén file data mọi người thêm : để thôi là file train chả có gì
    image_files = glob2.glob(os.path.join(“data/data/”, ext))
    # Step 6. Tạo file train.txt và val.txt
    %cd /content/gdrive/My\ Drive/darknet

    import glob2
    import math
    import os
    import numpy as np

    files = []
    for ext in [“*.png”, “*.jpeg”, “*.jpg”]:
    image_files = glob2.glob(os.path.join(“data/data/”, ext))
    files += image_files

    nb_val = math.floor(len(files)*0.2)
    rand_idx = np.random.randint(0, len(files), nb_val)

    # Tạo file train.txt
    with open(“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(“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’)

  6. # Step 4. Giải nén file data
    !unzip data.zip -d data

    đoạn code thêm “-d data” nữa ae nhé

  7. Mình có thể bỏ thêm dữ liệu mới mà mình thu thập được để train tiếp được không ạ? Hay phải train lại từ đầu ạ?
    Em cảm ơn

  8. Chào anh,
    Anh cho em hỏi nếu mình train 2 class thì thư mục data mình tổ chức như thế nào vậy anh? Có phải thế này không anh?
    darknet
    — data
    —-fire
    —-water
    Ngoài ra nếu train 2 class thì ở bước 6 lúc tạo file train.txt và val.txt thì biến image_files có còn giống như trong bài viết không anh:
    image_files = glob2.glob(os.path.join(“data/data/”, ext))

    Cảm ơn anh, chúc anh sức khỏe dồi dào để nấu thêm mì AI 🙂

  9. Tìm đến dòng 20, sửa max_batches = max(*2000,6000). Nghĩa là nếu *2 mà nhỏ hơn 6000 thì lấy 6000 và ngược lại. Ở đây mình lấy 6000 vì 1*2000 < 6000 rồi. Sửa max_batches=6000.

    Đoạn anh hình như anh ghi sai nè a: "Nghĩa là nếu *2″, *2000 mới đúng chứ ạ

Leave a Reply

Your email address will not be published. Required fields are marked *