Hi anh em, hôm nay chúng ta tiếp tục tìm hiểu về YOLO v5 với màn train model và triển khai model lên web nhé.
Mình đã có bài số 1 tại đây, bạn nào chưa đọc thì nên đọc trước khi bắt đầu bài này : Thử làm bác sĩ chuẩn đoán X-Quang cùng YOLO v5 (Phần 1/2).
Trong bài trước, ta đã xử lý dữ liệu xong, bây giờ tiếp tục ta sẽ train model YOLO v5 trên Colab, trên máy chủ GPU thuê của iRender và sau đó là triển khai model thử.
Let’s go!
Phần 1 – Chuẩn bị mã nguồn và file cấu hình YOLO v5
Chú ý: Phần này thao tác trên máy tính PC của bạn!
Đầu tiên bạn tạo một project trên PyCharm và thực hiện git clone YOLO v5 bằng lệnh:
git clone https://github.com/ultralytics/yolov5
Code language: PHP (php)
Sau khi git xong bạn sẽ thấy xuất hiện thư mục yolov5, hãy chuyển vào trong thư mục models trong đó.
Bây giờ có 2 viêc cần làm là: chỉnh sửa số class trong file cấu hình mạng và tạo file mô tả dữ liệu train của bạn. Chúng ta sẽ cùng nhau làm lần lượt!
Chỉnh sửa cố class trong file cấu hình mạng
Bây giờ việc đầu tiên là bạn phải quyết định bạn dùng mô hình mạng nào (trong 4 mô hình mạng mà mình đã nêu ở Phần 1). Chọn mạng nào thì bạn mở file yaml tương ứng (trong thư mục models).
Ví dụ ở đây mình chọn mạng to nhất (x-large) nên mở file yolo5x.yaml. Các bạn sẽ thấy một file như sau:
Nhiệm vụ của bạn chỉ cần sửa dòng “nc: 80” (số class ấy mà) thành số class của bạn mà thôi (các hạng mục khác dành cho bạn nào chuyên sâu về YOLO nha).
Với bài này ta có 14 class (là 14 bệnh từ 0-13) nên ta sẽ sửa thành “nc: 14” thế là xong.
Tạo file mô tả dữ liệu train
Rồi, chúng ta đã có dữ liệu đặt trong thư mục train, val (đã nói trong Phần 1). Bây giờ bạn hãy tạo một file có tên data.yml trong thư mục models và gõ vào nội dung sau:
train: yolo_data/images/train # path to train folder
val: yolo_data/images/val # path to val folder
# number of classes
nc: 14
# class names
names: ["Aortic enlargement","Atelectasis","Calcification","Cardiomegaly","Consolidation","ILD",
"Infiltration","Lung Opacity","Nodule/Mass","Other lesion","Pleural effusion","Pleural thickening","Pneumothorax","Pulmonary fibrosis"]
Code language: PHP (php)
Tóm lại là như sau:
- Dòng train: là đường dẫn đến thư mục ảnh train. Chú ý là thư mục ảnh, ko cần dẫn đường đến thư mục labels.
- Dòng val: là đường dẫn đến thư mục ảnh val. Chú ý là thư mục ảnh, ko cần dẫn đường đến thư mục labels.
- Dòng nc: 14 thì chính là số class ( như đã sửa ở file yolo5x.yaml ấy).
- Dòng names: Bạn liệt kê danh sách tên các class theo đúng thứ tự từ 0 đến 13.
Bây giờ các bạn copy 2 thư mục images và labels (tạo ra trong Phần 1) vào thư mục data trong yolov5 (đè lên các file trong đó cũng không sao).
Vậy là xong rồi đấy, việc chỉnh sửa trong YOLO v5 có vẻ đơn giản hơn rất nhiều các phiên bản trước.
Phần 2 – Train model YOLO v5 trên COLAB
Bây giờ bạn zip thư mục yolov5 thành file yolov5.zip và upload file zip đó vào thư mục gốc của Google Drive của bạn (đừng để trong thư mục nào).
Tiếp theo bạn vào Google Colab để train từng bước!
Bật môi trường GPU
Vào menu Runtime > Change runtime type và chọn tiếp GPU. Sau đó nhấn Connect để kết nối đến môi trường GPU!
Kết nối Google Colab sang Google Drive
Tạo một Code block và gõ đoạn này và làm theo hướng dẫn trên màn hình. Nếu bạn chưa thạo Colab, có thể xem thêm tại đây.
from google.colab import drive
drive.mount('/content/gdrive')
Code language: JavaScript (javascript)
Giải nén mã nguồn và train
Các bạn tạo một code block mới, chạy lệnh sau để giải nén mã nguồn:
%cd /content/gdrive/MyDrive
!unzip yolov5.zip
Sau đó sẽ thấy thư mục yolov5 trên Google Drive (và Colab), các bạn tạo một code block mới và chạy tiếp
%cd /content/gdrive/MyDrive/yolov5
!pip install -r requirements.txt
Và cuối cùng là train thôi, các bạn tạo một code block mới và chạy:
%cd /content/gdrive/MyDrive/yolov5
!python train.py --img 640 --batch 16 --epochs 5 --data models/data.yaml --weights yolov5x.pt
Với lệnh này, bạn chú ý:
- –img 640: kích thước ảnh đầu vào, tạm thời để mặc định.
- –batch 16: batch_size. nếu bạn chạy và bị hết bộ nhớ thì change về 8 nhé.
- –epochs 5: Số lượng epoch, bạn điều chỉnh tăng/giảm tùy ý sao cho model có mAP hội tụ là okie (mình sẽ nói sau).
- –data models/data.yaml: chính là trỏ đến cái file data.yaml mà chúng ta đã tạo đó.
- –weights yolo5x.pt: Đây, đoạn này thì là weight pretrain của YOLO v5. Do mình chọn model X-Large nên ở đây là 5x nhé, bạn chọn model khác thì để weights khác.
Nếu bạn setup thành công, thì sẽ thấy màn hình train sau (không có 3 cái ô vuông xanh đỏ đâu nhé, cái đó mình khoanh vào cho các bạn dễ theo dõi thôi :D) :
Train đến khi nào dừng? Xem gì để biết model tốt?
Rồi khi train bạn theo dõi 3 tham số P – Precision (khung màu xanh lá cây), R – Recall (màu đỏ) và mAP@.5 (màu xanh nước biển) để biết khi nào cần dừng nhé. Nếu sau nhiều vòng train (100 chẳng hạn) mà mAP@.5 không giảm nữa mà quanh quẩn 1 giá trị (hội tụ) thì dừng được rồi. Tất nhiên mAP này càng cao càng tốt rồi. Bạn nào chưa rõ về Precision, Recall và mAP thì đọc link này nhé.
Lúc này bạn để ý có 2 dòng dưới cùng sẽ cho bạn vị trí lưu file weights của model (chú ý 2 file này lưu sau mỗi epoch nhé) :
Optimizer stripped from runs/train/exp2/weights/last.pt, 175.2MB # Weights cuối cùng
Optimizer stripped from runs/train/exp2/weights/best.pt, 175.2MB # Weights tốt nhất
Code language: PHP (php)
Bạn tạm ghi nhớ ở đó và chúng ta đi tiếp nào! Ô thế nếu muốn train tiếp từ cái weights trên thì làm sao nhỉ?
Ta sẽ dùng lệnh này:
%cd /content/gdrive/MyDrive/yolov5
!python train.py --img 640 --batch 16 --epochs 5 --data models/data.yaml --weights runs/train/exp2/weights/best.pt
Chú ý đoạn cuối lệnh có thể dùng best.pt hoặc last.pt tuỳ nhu cầu và sở thích của các bạn nha!
Kiểm thử model cái nhỉ?
Bạn tạo một code block và chạy đoạn code sau:
%cd /content/gdrive/MyDrive/yolov5
from IPython.display import Image, clear_output
!python detect.py --weights runs/train/exp2/weights/best.pt --img 640 --conf 0.25 --source data/images/train/000d68e42b71d3eac10ccc077aba07c1.jpg
Image(filename='runs/detect/exp/000d68e42b71d3eac10ccc077aba07c1.jpg', width=600)
Code language: JavaScript (javascript)
Chúng ta cùng xem câu lệnh:
- –weights runs/train/exp2/weights/best.pt: trỏ đến cái weights mà bạn vừa kì công train được đó.
- –conf 0.25: ngưỡng dự đoán. Ở đây mình giảm xuống vì mới train model được 5 epochs nên phải giảm may ra mới detect được.
- –source: trỏ đến file ảnh cần dự đoán. Sau khi dự đoán xong nó sẽ lưu kết quả vào thư mục runs/detect/exp/000d68e42b71d3eac10ccc077aba07c1.jpg và ta dùng lệnh Image để hiện nó lên Colab.
Kết quả đây, chắc chắn nhiều sai số do mới train 5 epochs nhưng đã có những kết quả đáng mừng:
Phần 3 – Train YOLO v5 trên máy chủ GPU thuê của iRender.vn
Tương tự như train trên COLAB, các bạn cũng có thể up lên các máy chủ GPU bạn thuê để train. Ở đây mình sử dụng dịch vụ của iRender.vn và thuê tạm một máy chủ 1GPU với cấu hình như sau:
Tốc độ train nhanh hơn Colab rõ rệt. Nếu như COLAB mất tầm 30 phút /epochs lúc đông và 6 phút lúc vắng (do share GPU) thì trên GPU Server thuê chỉ mât 3 phút (và luôn ổn định ở mức này do mình thuê riêng GPU). Mình sẽ thuê thêm 1 con Multi GPU để thử cho anh em review chơi 😀 và có clip sau trên Youtube nhé!
Phần 4 – Triển khai model lên web
Phần này mình sẽ làm nhanh vì cách làm tương tự với nội dung 2 clip về xem bói khuôn mặt:
- Clip 1: Hướng dẫn xây dựng website Xem bói mặt (P1.BackEnd) – Mì AI
- Clip 2: Hướng dẫn xây dựng website Xem bói mặt (P2.FrontEnd) – Mì AI
Đây sẽ là đoạn code load model YOLOv5 đã train và chuyển thành BackEnd API đồng thời với việc làm một giao diện đơn giản để hiển thị.
Chúng ta sẽ chế từ source file detect.py trong project YOLOv5 ra thành file svr_model.py và kết quả như sau!
Chú ý: Mình chưa thực hiện các bước sau:
- Check dung lượng file gửi lên. Các bạn nên thêm code check ở cả client và server
- Check xem file gửi lên có phải là X-Quang hay không?
- Check xem file gửi lên có virus, mã độc hay không 😀
- Check xem client có liên tục gửi file để phá server hay không?
Thử so sánh vài mẫu!
Mã nguồn đầy đủ các bạn tham khảo trong github của mình tại đây nhé!
Rồi, vậy đó, xong bài này thì ai cũng có thể triển khai một giải pháp AI đơn giản trên web rồi. Các bạn đừng quá hoảng sợ, lo lắng khi gặp một bài toán mới nhé, hãy breakdown nó ra và xử lý từng phần!
Chúc các bạn thành công!
#MìAI
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
Em bị lỗi ngay dây – a giúp em cái hé.
Thanks anh,
WARNING: Dataset not found, nonexistent paths: [‘/content/gdrive/My Drive/yolov5/yolov5/images/val’]
Traceback (most recent call last):
File “train.py”, line 539, in
train(hyp, opt, device, tb_writer)
File “train.py”, line 97, in train
check_dataset(data_dict) # check
File “/content/gdrive/MyDrive/yolov5/utils/general.py”, line 167, in check_dataset
raise Exception(‘Dataset not found.’)
Exception: Dataset not found.
Em post lên Group trao đổi, chia sẻ: https://facebook.com/groups/miaigroup cho tiện trao đổi nhé!
Bạn ơi, mình cũng gặp lỗi tương tự như bạn mà vẫn chưa sửa được, không biết bạn đã sửa được lỗi này chưa? Có thể giúp mình với được không?
Bác kiểm tra thư mục data xem có data chưa, kiểm tra lại đường dẫn nữa? Nếu giải nén rồi chia dữ liệu trên colab thì hay bị vậy vì data chưa kịp load về driver, em nghĩ nên xử lí data các thứ ok hết rồi up lên colab chỉ việc train thôi.
a ơi em bị lỗi
Enter your authorization code:
là nhập như nào vậy a.
Cụ thể như nào? Em chụp màn hình post lên Group trao đổi, chia sẻ: https://facebook.com/groups/miaigroup cho tiện nhé!
Anh cho em xin file index.html được không ạ
Anh up lên github hết đó em! Em vào miai.vn vào link github nhé!
a ơi mình tạo clip hướng dẫn build thành trang web đc không ạ, mình train bằng colab thì tạo web như thế nào ạ
chỗ đoạn ‘TẠO FILE MÔ TẢ DỮ LIỆU TRAIN’ anh bảo tại file data.yml nhưng dưới chạy là data.yaml á anh.
Yeah. Chắc lỗi typing. Thanks em!
Anh check lại giúp em với ạ trong file github không có file index.html giao diện web ạ, em cảm ơn anh !
File này giống với bài toán bói mặt. Em tìm bài đó trên Mì AI nha!
dạ b ơi, b có sửa lại file index bên bài bói mặt ch ạ? B có thể cho mình xin với đc kh?
Anh có thể share file weight được train khi thuê bên IRender không ạ ?
Được chứ em. Em save vào ổ cứng ấy.
a Thắng ơi. trong file model có 4 cái yaml của 4 mạng yolov5. em thấy a sửa nc=1 trong yolo5x.yaml để train. vậy lệnh –weights yolo5x.pt trong lệnh train mode là để download pretrain về mà a. nên a cho e hỏi 4 file yaml trong file model có tác dụng gì khi mà mình đã download pretain thế ạ?
%cd /content/gdrive/MyDrive/yolov5
!python train.py –img 640 –batch 16 –epochs 5 –data models/data.yaml –weights yolov5x.pt
Theo anh thấy 4 file yaml chỉ là chỉ dẫn train thôi. Weight vẫn cần tải về nhé.
Cần thêm gì em post lên Group trao đổi, chia sẻ: https://facebook.com/groups/miaigroup để trao đổi cho tiện nhé!
Anh có thể cho em xin file index bài này đc kh ạ? Em xem bên bài bói mặt r nhìn lại với file svr_model mà rối hết a ạ :(((((. Mong a rep huhu
Em post lên Group trao đổi, chia sẻ: https://facebook.com/groups/miaigroup trao đổi cho tiện nha!