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!

Gán nhãn với LabelImg

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.

Toạ độ đường bao theo định dạng của YOLO (Ultralytics)

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:

Nhãn và file chứa tên các nhóm đố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 imageslabels chứa ảnh và nhãn tương ứng.
    • Ảnh và nhãn được chia sẵn thành 2 thư mực trainvalidation (dùng để huấn luyện và kiểm định mô hình).
    • Thư mục images còn có 1 thư mục con test chứa ảnh dùng để kiểm nghiệm chất lượng mô hình.

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ượt
  • epochs: số lượt huấn luyện cho tất cả các ảnh trong tập dữ liệu train
  • data: đường dẫn đến file cấu hình của tập dữ liệu
  • name: 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 ảnh
  • name: tên thư mục con để lưu kết quả dự đoán
  • save: cài đặt để lựu ảnh dự đoán
  • conf: độ 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.

Kết quả dự đoán trên ảnh mới từ tập test

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.

Tham khảo

Leave a comment