Trong Object Dection, chúng ta thường phải phải huấn luyện mô hình với tập dữ liệu mới. May mắn cho chúng ta là việc huấn luyện mô hình trên tập dữ liệu mới càng ngày càng trở nên dễ dàng.

Hãy cùng tìm hiểu các bước huấn luyện một mô hình Object Detection cho một đối tượng mới, cụ thể là gấu trúc (panda detection) dựa trên YOLOv8 trong bài hôm nay. Các bước xây dựng mô hình hoàn toàn có thể áp dụng cho bất kỳ một đối tượng nào khác.
Sơ lược về YOLOv8
YOLO (You Only Look Once) là một trong những họ mô hình nổi tiếng nhất trong Object Detection. Tiếp nối thành công của YOLOv5, Ultralytics gần đây cho ra mắt mô hình YOLOv8 với chất lượng tốt hơn hẳn những mô hình trước đó.
Không những thế, YOLOv8 có hướng dẫn rất chi tiết và đầy đủ giúp cho việc tinh chỉnh và xây dựng mô hình nhẹ nhàng hơn rất nhiều.
Chuẩn bị dữ liệu
Trước hết chúng ta cần phải có dữ liệu ảnh và nhãn (images & labels). Dữ liệu đối với mô hình cũng giống những viên gạch cho việc xây nhà, không có dữ liệu thì không xây dựng được mô hình nào cả.
Tập hợp ảnh
Có vài cách để thu thập ảnh cho việc huấn luyện mô hình:
- Tìm trên Open Images Dataset, đây là tập hợp hơn 9 triệu ảnh với 6000 nhóm khác nhau.
- Tìm với công cụ tìm kiếm (Google, Bing, …) với lưu ý cần kiểm tra kỹ về bản quyền sử dụng ảnh.
- Trích xuất các khung hình từ Videos
- Tự chụp ảnh
Trong bài hôm nay, mình dùng thư viện fiftyone để tải ảnh từ Open Images Dataset.
1
2
3
4
5
6
7
dataset = fiftyone.zoo.load_zoo_dataset(
"open-images-v6",
split="train",
label_types=["detections"],
classes=["Panda"],
max_samples=250,
)
Dữ liệu tải về sẽ có 3 thư mục, mình chỉ lấy ảnh thư mục ảnh data
để thực hiện việc gán nhãn ở bước tiếp theo.
.
├── data
│ ├── 02a4749df3d7a0c9.jpg
│ ├── 0b5547d4aa16e365.jpg
│ ...
├── labels
│ └── detections.csv
└── metadata
├── classes.csv
├── hierarchy.json
└── image_ids.csv
Gán nhãn
Mình dùng thư viện labelImg cho việc gán nhãn và mất khoảng hơn 1h để gán nhãn cho khoảng 130 ảnh. (Bạn nào biết công cụ nào tiện hơn thì chia sẻ cho mình và mọi người biết nhé).
Bước gán nhãn này thường tốn nhiều thời gian và không thú vị lắm, nhưng tự nhủ không có gạch thì không xây được nhà nên đành cố gắng!

Các bạn lưu ý chọn định dạng YOLO khi xuất các files để đảm bảo định dạng đúng cho việc huấn luyện mô hình sau này.

Mỗi ảnh sẽ có một nhãn (file txt
) tương ứng để chứa thông tin về đường bao của đối tượng:
- Mỗi dòng chứa thông tin của một đối tượng
- Mỗi dòng có 5 giá trị chứa thông tin về đối tượng và toạ độ đường bao: đối tượng, toạ độ trung tâm x, toạ độ trung tâm y, chiều rộng, chiều dài.
- Lưu ý là toạ độ đường bao đã được chuẩn hoá về khoảng
(0, 1)
(đây là yêu cầu của mô hình YOLO)
Dưới đây là ví dụ về nhãn và file chứa thông tin về đối tượng:

Sắp xếp thư mục ảnh và nhãn
Sau khi đã có ảnh và nhãn, chúng ta có thể sắp xếp thư mục như sau:
datasets
├── custom_yolov8.yaml
└── images_and_labels
- File cấu hình của tập dữ liệu
custom_yolov8.yaml
chứa đường dẫn đến thư mục ảnh và thông tin đối tượng.## relative paths # datasets # ├── images_and_labels # └── custom_yolov8.yaml path: 'images_and_labels/images' train: train/ val: valid/ # number of classes nc: 1 # class names names: ['panda']
- Thư mục
image_and_labels
chứa ảnh và nhãn dùng cho việc huấn luyện mô hình.images_and_labels ├── images │ ├── train │ │ ├── train_001.jpg │ │ ├── train_002.jpg │ │ └── ... │ ├── valid │ │ ├── valid_001.jpg │ │ ├── valid_002.jpg │ │ └── ... │ └── test │ ├── test_001.jpg │ ├── test_002.jpg │ └── ... └── labels ├── train │ ├── train_001.txt │ ├── train_002.txt │ └── ... └── valid ├── valid_001.txt ├── valid_002.txt └── ...
- Thư mục
images
vàlabels
chứa ảnh và nhãn tương ứng. - Ảnh và nhãn được chia sẵn thành 2 thư mực
train
vàvalidation
(dùng để huấn luyện và kiểm định mô hình). - Thư mục
images
còn có 1 thư mục contest
chứa ảnh dùng để kiểm nghiệm chất lượng mô hình.
- Thư mục
Huấn luyện mô hình
Cài đặt thư viện liên quan
Tải ultralytics thông qua pip install
(pip là công cụ quản lý các thư viện python)
!pip install ultralytics==8.0.20
Khởi tạo mô hình YOLO
from ultralytics import YOLO
model = YOLO('yolov8n.pt')
Huấn luyện
Các bước chuẩn bị đã xong, giờ việc huấn luyện trở nên rất đơn giản
model.train(
data='datasets/custom_yolov8.yaml',
imgsz=416,
epochs=50,
batch=16,
name='custom_model',
)
imgsz
: kích thước ảnh (độ phân giải)batch
: số ảnh dùng để huấn luyện trong mỗi lượtepochs
: số lượt huấn luyện cho tất cả các ảnh trong tập dữ liệutrain
data
: đường dẫn đến file cấu hình của tập dữ liệuname
: tên thư mục để lưu mô hình
Kết quả
Các thông số của quá trình huấn luyện được lưu ở file results.png
trong thư mục lưu mô hình (ở đây là thư mục custom_model
).
from IPython.display import Image
# các thông số (metrics) của việc huấn luyện mô hình
Image(filename='runs/detect/custom_model/results.png', width=900)

ls runs/detect/custom_model/weights # 'custom_model' was set during training (tham số `name`)
# best.pt last.pt
Khi việc huấn luyện kết thúc, có 2 file weights mô hình được lưu lại:
- Mô hình tốt nhất:
best.pt
(tốt nhất dựa trên chỉ số Average Precision trên tập kiểm định) - Mô hình cuối cùng:
last.pt
Dự đoán với mô hình được huấn luyện
model.predict(
imgsz=416,
source='datasets/images_and_labels/images/test/',
name='test_custom_model',
save=True,
conf=0.5
)
imgsz
: kích thước ảnh (độ phân giải)source
: đường dẫn đến thư mục ảnhname
: tên thư mục con để lưu kết quả dự đoánsave
: cài đặt để lựu ảnh dự đoánconf
: độ tin cậy
Kết quả dự đoán được lưu tại thư mục /runs/detect/test_custom_model/
(hoặc test_custom_model1, 2, 3… tuỳ vào số lần chúng ta chạy dự đoán.

Google Colab và dữ liệu
Mình đã chuẩn bị một Google Colab Notebook để tiện cho việc tham khảo. Các bạn hoàn toàn có thể dùng dữ liệu của mình để dùng với notebook này (chỉ cần chuẩn bị đúng các file cấu hình là ổn).
Bên cạnh đó, mình lưu tập dữ liệu gấu trúc với nhãn ở Panda ML Blog Github để các bạn có thể thực hành làm quen với các bước xây dựng mô hình khi chưa có dữ liệu trong tay.
Tạm kết
Bài hôm nay đã giới thiệu đến các bạn các bước để huấn luyện một mô hình Object Detection dựa trên YOLOv8. Có lẽ bước tốn thời gian nhất là bước tìm ảnh phù hợp và gắn nhãn cho ảnh. Còn các bước huấn luyện và dự đoán thì khá dễ dàng. Trong thực tế cũng vậy, bước chuẩn bị dữ liệu (data preparation) thường cũng là bước tốn thời gian nhất.
Với tập dữ liệu hơn 100 ảnh, mình khá hài lòng với mô hình được huấn luyện khi mô hình này cho kết quả tương đốt ổn. Hy vọng là với bài hướng dẫn này, các bạn cũng sẽ huấn luyện được những mô hình thú vị cho riêng mình.
Leave a comment