Cách tinh chỉnh YOLO trên tập dữ liệu tùy chỉnh#
Tinh chỉnh điều chỉnh một model đã được huấn luyện trước để nhận diện các lớp mới bằng cách bắt đầu từ trọng số đã học thay vì khởi tạo ngẫu nhiên. Thay vì huấn luyện từ đầu trong hàng trăm epoch, quá trình tinh chỉnh tận dụng các đặc trưng COCO đã được huấn luyện trước và hội tụ trên dữ liệu tùy chỉnh chỉ trong một phần nhỏ thời gian.
Hướng dẫn này trình bày cách tinh chỉnh YOLO26 trên các tập dữ liệu tùy chỉnh, từ cách sử dụng cơ bản đến các kỹ thuật nâng cao như đóng băng layer và huấn luyện hai giai đoạn.
Tinh chỉnh so với huấn luyện từ đầu#
Model được huấn luyện trước đã học các đặc trưng hình ảnh tổng quát — phát hiện cạnh, nhận diện kết cấu, hiểu hình dạng — từ hàng triệu hình ảnh. Học chuyển giao thông qua tinh chỉnh tái sử dụng kiến thức đó và chỉ dạy model nhận biết các lớp mới trông như thế nào, nhờ vậy model hội tụ nhanh hơn và cần ít dữ liệu hơn. Huấn luyện từ đầu loại bỏ toàn bộ kiến thức đó và buộc model học mọi thứ từ các mẫu ở cấp độ pixel, đòi hỏi nhiều tài nguyên hơn đáng kể. Xem Hướng dẫn cấu hình YAML của model để tìm hiểu sự khác nhau giữa các tệp .yaml chỉ chứa kiến trúc và các checkpoint.
| Fine-tuning | Huấn luyện từ đầu | |
|---|---|---|
| Trọng số khởi tạo | Được huấn luyện trước trên COCO (80 lớp) | Khởi tạo ngẫu nhiên |
| Lệnh | YOLO("yolo26n.pt") | YOLO("yolo26n.yaml") |
| Hội tụ | Nhanh hơn — backbone đã được huấn luyện | Chậm hơn — mọi layer đều học từ đầu |
| Yêu cầu về dữ liệu | Thấp hơn — các đặc trưng được huấn luyện trước bù đắp cho lượng dữ liệu ít hơn | Cao hơn — model phải tự học mọi đặc trưng chỉ từ tập dữ liệu |
| Khi nào nên dùng | Các lớp tùy chỉnh với hình ảnh tự nhiên | Các miền khác biệt căn bản với COCO (y tế, vệ tinh, radar) |
Khi tệp .pt được tải bằng YOLO("yolo26n.pt"), trọng số đã huấn luyện trước được lưu trong model. Sau đó, khi gọi .train(data="custom.yaml"), tất cả trọng số tương thích sẽ tự động được chuyển sang kiến trúc model mới, mọi layer không khớp sẽ được khởi tạo lại (chẳng hạn như detection head khi số lớp khác nhau), rồi quá trình huấn luyện bắt đầu. Không cần tải trọng số thủ công, thao tác layer hay viết code học chuyển giao tùy chỉnh.
Cách thức chuyển trọng số đã huấn luyện trước#
Khi tinh chỉnh một model đã được huấn luyện trước trên tập dữ liệu có số lớp khác (ví dụ: chuyển từ 80 lớp của COCO sang 5 lớp tùy chỉnh), Ultralytics thực hiện chuyển trọng số dựa trên hình dạng:
- Backbone và neck được chuyển đầy đủ — các layer này trích xuất đặc trưng hình ảnh tổng quát và hình dạng của chúng không phụ thuộc vào số lớp.
- Detection head được khởi tạo lại một phần — hình dạng của các layer đầu ra phân loại (
cv3,one2one_cv3) phụ thuộc vào số lớp (80 so với 5). Các hàng tương thích có tên lớp khớp sẽ được ánh xạ lại trước khi khởi tạo các hàng không khớp. Các layer hồi quy bounding box (cv2,one2one_cv2) trong head có hình dạng cố định bất kể số lớp, vì vậy chúng được chuyển bình thường. - Phần lớn áp đảo các trọng số được chuyển khi thay đổi số lớp. Ví dụ, tinh chỉnh YOLO26n từ COCO (80 lớp) sang tập dữ liệu 5 lớp sẽ chuyển 606 trong số 708 tensor trọng số, cùng với mọi hàng phân loại tương thích được khớp theo tên.
Với các tập dữ liệu có cùng số lớp với model được huấn luyện trước (ví dụ: tinh chỉnh trọng số đã huấn luyện trước trên COCO bằng một tập dữ liệu 80 lớp khác), 100% trọng số được chuyển, bao gồm cả detection head.
Chuyển lớp bằng bí danh tên#
Ultralytics chuyển các hàng tương ứng trong classification head giữa các tập dữ liệu dựa trên tên lớp, không phân biệt chữ hoa chữ thường và bỏ qua khoảng trắng ở đầu hoặc cuối. Khi các lớp tương đương có tên khác nhau, hãy đổi tên các lớp của checkpoint nguồn trong bộ nhớ trước khi tải. Cách này giữ lại trọng số phân loại đã huấn luyện trước cho các khái niệm dùng chung, vốn nếu không sẽ bị coi là không khớp và được khởi tạo ngẫu nhiên.
Ví dụ chuyển từ Objects365 v2 sang COCO này đổi tên các lớp nguồn trong checkpoint đã tải; sau đó train() chuyển tiếp chúng dưới dạng trọng số đã huấn luyện trước:
from ultralytics import YOLO
# Tên lớp nguồn Objects365 v2 (chữ thường) -> tên lớp COCO đích
ALIASES = {
"wild bird": "bird",
"handbag/satchel": "handbag",
"luggage": "suitcase",
"bowl/basin": "bowl",
"orange/tangerine": "orange",
"monitor/tv": "tv",
"stuffed toy": "teddy bear",
"hair dryer": "hair drier",
}
model = YOLO("path/to/yolo26s-objects365.pt")
# Tên lớp Objects365 được viết hoa chữ cái đầu mỗi từ, nên khớp dựa trên tên đã chuyển thành chữ thường
model.model.names = {i: ALIASES.get(name.lower(), name) for i, name in model.model.names.items()}
model.train(data="coco.yaml", epochs=100, imgsz=640)Thiết lập cls_remap bật tính năng chuyển dựa trên tên theo mặc định. Trong quá trình huấn luyện, Remapped N/M cls head rows from pretrained weights by class name được in ra khi các hàng tương thích được sao chép; đặt cls_remap=False để tắt tính năng này.
Ví dụ tinh chỉnh cơ bản#
from ultralytics import YOLO
model = YOLO("yolo26n.pt") # tải model đã huấn luyện trước
model.train(data="custom.yaml", epochs=50, imgsz=640)Chọn kích thước model#
Model lớn hơn có năng lực cao hơn nhưng cũng có nhiều tham số cần cập nhật hơn, điều này có thể làm tăng nguy cơ overfitting khi dữ liệu huấn luyện hạn chế. Bắt đầu bằng model nhỏ hơn (YOLO26n hoặc YOLO26s) và chỉ tăng kích thước nếu các chỉ số validation chững lại là một cách tiếp cận thực tế. Kích thước model tối ưu phụ thuộc vào độ phức tạp của tác vụ, số lớp, mức độ đa dạng của tập dữ liệu và phần cứng có sẵn để triển khai. Xem toàn bộ trang model YOLO26 để biết các kích thước hiện có và benchmark hiệu năng.
Lựa chọn optimizer và learning rate#
Thiết lập mặc định optimizer=auto chọn optimizer và learning rate dựa trên tổng số iteration huấn luyện:
- 10.000 iteration trở xuống (tập dữ liệu nhỏ hoặc ít epoch): AdamW với learning rate thấp, được tự động tính toán
- Trên 10.000 iteration (tập dữ liệu lớn): MuSGD (optimizer kết hợp Muon+SGD) với lr=0.01
Với hầu hết tác vụ tinh chỉnh, thiết lập mặc định hoạt động tốt mà không cần điều chỉnh thủ công. Cân nhắc chỉ định rõ optimizer khi:
- Huấn luyện không ổn định (loss tăng đột biến hoặc phân kỳ): thử
optimizer=AdamW, lr0=0.001để hội tụ ổn định hơn - Tinh chỉnh model lớn trên tập dữ liệu nhỏ: optimizer được chỉ định rõ với learning rate thấp hơn, chẳng hạn
optimizer=AdamW, lr0=0.001, có thể giúp bảo toàn các đặc trưng đã huấn luyện trước
Khi dùng optimizer=auto, các giá trị lr0 và momentum sẽ bị bỏ qua. Để tự kiểm soát learning rate, hãy chỉ định rõ optimizer: optimizer=SGD, lr0=0.005.
Đóng băng layer#
Đóng băng ngăn các layer cụ thể được cập nhật trong quá trình huấn luyện. Cách này giúp tăng tốc huấn luyện và giảm overfitting khi tập dữ liệu nhỏ so với năng lực của model.
Tham số freeze chấp nhận số nguyên hoặc danh sách. Số nguyên freeze=10 đóng băng 10 layer đầu tiên (chỉ số 0-9), bao gồm phần lớn backbone của YOLO26. Backbone trải dài từ layer 0-10, nên freeze=10 vẫn để block C2PSA cuối cùng (layer 10) có thể huấn luyện; dùng freeze=11 để đóng băng toàn bộ backbone. Danh sách có thể chứa các chỉ số layer như freeze=[0, 3, 5] để đóng băng một phần backbone, hoặc các chuỗi tên module như freeze=["23.cv2", "23.one2one_cv2"] để kiểm soát chi tiết từng nhánh cụ thể trong một layer (ở đây là cả hai nhánh hồi quy box của detection head).
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
model.train(data="custom.yaml", epochs=50, freeze=10)Mức độ đóng băng phù hợp phụ thuộc vào độ tương đồng giữa miền đích và dữ liệu huấn luyện trước, cũng như lượng dữ liệu huấn luyện hiện có:
| Tình huống | Đề xuất | Cơ sở lý giải |
|---|---|---|
| Tập dữ liệu lớn, miền tương tự | freeze=None (mặc định) | Đủ dữ liệu để điều chỉnh mọi layer mà không bị overfitting |
| Tập dữ liệu nhỏ, miền tương tự | freeze=10 | Bảo toàn đặc trưng backbone, giảm số tham số có thể huấn luyện |
| Tập dữ liệu rất nhỏ | freeze=23 | Chỉ detection head được huấn luyện, giảm thiểu nguy cơ overfitting |
| Miền khác xa COCO | freeze=None | Đặc trưng backbone có thể không chuyển giao tốt và cần được huấn luyện lại |
Mức độ đóng băng cũng có thể được xem như một siêu tham số — thử một vài giá trị (0, 5, 10) và so sánh mAP trên tập validation là cách thực tế để tìm thiết lập phù hợp nhất cho một tập dữ liệu cụ thể.
Các siêu tham số quan trọng khi tinh chỉnh#
Nhìn chung, tinh chỉnh cần ít điều chỉnh siêu tham số hơn so với huấn luyện từ đầu. Các tham số quan trọng nhất là:
epochs: Tinh chỉnh hội tụ nhanh hơn huấn luyện từ đầu. Bắt đầu với giá trị vừa phải và dùngpatienceđể dừng sớm khi các chỉ số validation chững lại.patience: Giá trị mặc định 100 được thiết kế cho các lượt huấn luyện dài. Giảm xuống 10-20 để tránh lãng phí thời gian cho những lượt chạy đã hội tụ.warmup_epochs: Warmup đưa learning rate dần đến giá trị theo lịch trong những epoch đầu, giúp các batch ban đầu ít có khả năng làm xáo trộn các đặc trưng đã huấn luyện trước. Hãy giữ giá trị này khác 0 khi tinh chỉnh, nhưng không nhất thiết phải dùng đầy đủ giá trị mặc định 3 epoch: quá trình tìm kiếm tiến hóa đằng sau lượt tinh chỉnh YOLO26 COCO chính thức — một quá trình huấn luyện tiếp nối nhiều epoch từ trọng số Objects365 — đã chọn khoảng một epoch cho mỗi kích thước model.
Để xem danh sách đầy đủ các tham số huấn luyện, tham khảo tài liệu tham chiếu cấu hình huấn luyện. Đối với các hành vi không được tham số hỗ trợ — learning rate theo từng layer, gradient clipping hoặc chỉ số validation tùy chỉnh — hãy tạo lớp con từ trainer.
Tinh chỉnh hai giai đoạn#
Tinh chỉnh hai giai đoạn chia quá trình huấn luyện thành hai pha. Ở giai đoạn đầu, backbone được đóng băng và chỉ neck cùng head được huấn luyện, cho phép các layer phát hiện thích ứng với lớp mới mà không làm xáo trộn các đặc trưng đã huấn luyện trước. Giai đoạn thứ hai mở khóa mọi layer và huấn luyện toàn bộ model với learning rate thấp hơn để tinh chỉnh backbone cho miền đích.
Phương pháp này đặc biệt hữu ích khi miền đích khác biệt đáng kể so với COCO (ảnh y tế, ảnh chụp từ trên không, ảnh hiển vi), nơi backbone có thể cần được điều chỉnh nhưng huấn luyện mọi thành phần cùng lúc lại gây mất ổn định. Để tự động mở khóa bằng phương pháp dựa trên callback, xem Đóng băng và mở khóa backbone.
from ultralytics import YOLO
# Giai đoạn 1: đóng băng backbone, huấn luyện head và neck
model = YOLO("yolo26n.pt")
model.train(data="custom.yaml", epochs=20, freeze=10, name="stage1", exist_ok=True)
# Giai đoạn 2: mở khóa tất cả, tinh chỉnh với lr thấp hơn
model = YOLO("runs/detect/stage1/weights/best.pt")
model.train(data="custom.yaml", epochs=30, optimizer="AdamW", lr0=0.001, name="stage2", exist_ok=True)Các vấn đề thường gặp#
Model không tạo ra dự đoán nào#
-
Không đủ dữ liệu huấn luyện: huấn luyện với rất ít mẫu là nguyên nhân phổ biến nhất — model không thể học hoặc khái quát hóa từ lượng dữ liệu quá ít. Hãy đảm bảo có đủ ví dụ đa dạng cho mỗi lớp trước khi tìm hiểu các nguyên nhân khác.
-
Kiểm tra đường dẫn tập dữ liệu: đường dẫn hình ảnh không hợp lệ sẽ gây ra lỗi tập dữ liệu. Các tệp nhãn riêng lẻ bị thiếu hoặc rỗng được xem là hình ảnh nền và được báo cáo trong quá trình quét; split huấn luyện không có nhãn sẽ gây lỗi. Xác thực tập dữ liệu trước khi huấn luyện:
yolo detect val model=yolo26n.pt data=custom.yaml -
Giảm ngưỡng confidence: nếu có dự đoán nhưng bị lọc bỏ, hãy thử
conf=0.1trong quá trình inference. -
Xác minh số lớp: đảm bảo
nctrongdata.yamlkhớp với số lớp thực tế trong các tệp nhãn.
mAP trên tập validation chững lại sớm#
- Bổ sung dữ liệu: tinh chỉnh được cải thiện đáng kể khi có thêm dữ liệu huấn luyện, đặc biệt là các ví dụ đa dạng với góc chụp, điều kiện chiếu sáng và phông nền khác nhau.
- Kiểm tra cân bằng lớp: các lớp ít đại diện sẽ có AP thấp. Bổ sung thêm ví dụ hoặc điều chỉnh
cls_pwtrên tập validation. - Giảm augmentation: với tập dữ liệu rất nhỏ, augmentation mạnh có thể gây hại nhiều hơn lợi. Hãy thử
mosaic=0.5hoặcmosaic=0.0. - Tăng độ phân giải: với các tập dữ liệu có vật thể nhỏ, hãy thử
imgsz=1280để giữ lại chi tiết.
Hiệu năng trên các lớp ban đầu giảm sau khi tinh chỉnh#
Hiện tượng này được gọi là quên thảm họa — model mất đi kiến thức đã học trước đó khi chỉ được tinh chỉnh trên dữ liệu mới. Hầu như không thể tránh khỏi hiện tượng quên nếu không đưa hình ảnh từ tập dữ liệu ban đầu vào cùng với dữ liệu mới. Để giảm thiểu hiện tượng này:
- Hợp nhất tập dữ liệu: đưa các ví dụ thuộc lớp ban đầu vào cùng các lớp mới trong quá trình tinh chỉnh. Đây là cách đáng tin cậy duy nhất để ngăn hiện tượng quên.
- Đóng băng backbone và neck: đóng băng cả backbone lẫn neck để chỉ huấn luyện detection head sẽ hữu ích cho các lượt tinh chỉnh ngắn với learning rate rất thấp.
- Giảm số epoch huấn luyện: model chỉ huấn luyện trên dữ liệu mới càng lâu thì mức độ quên càng tăng.
Câu hỏi thường gặp#
Không có mức tối thiểu cố định — kết quả phụ thuộc vào độ phức tạp của tác vụ, số lớp và mức độ tương đồng giữa miền dữ liệu với COCO. Hình ảnh đa dạng hơn (khác nhau về điều kiện chiếu sáng, góc chụp, phông nền) quan trọng hơn số lượng thuần túy. Hãy bắt đầu với dữ liệu hiện có và tăng thêm nếu các chỉ số validation chưa đạt yêu cầu.
Tải tệp
.ptđã được huấn luyện trước và gọi.train()với đường dẫn đếndata.yamltùy chỉnh. Ultralytics tự động xử lý chuyển trọng số, khởi tạo lại detection head và chọn optimizer. Xem phần Tinh chỉnh cơ bản để biết ví dụ code đầy đủ.Các nguyên nhân phổ biến nhất là đường dẫn hình ảnh không hợp lệ, tệp nhãn bị thiếu hoặc rỗng,
nctrong YAML không khớp với các tệp nhãn thực tế hoặc ngưỡng confidence quá cao. Xem Các vấn đề thường gặp để biết danh sách kiểm tra khắc phục sự cố đầy đủ.Điều này phụ thuộc vào kích thước dataset và mức độ tương đồng của lĩnh vực. Với dataset nhỏ thuộc lĩnh vực tương tự COCO, đóng băng backbone (
freeze=10) giúp ngăn overfitting. Với các lĩnh vực khác biệt nhiều so với COCO, không đóng băng lớp nào (freeze=None) cho phép backbone thích nghi. Xem Đóng băng các lớp để biết các khuyến nghị chi tiết.Đưa các ví dụ thuộc những lớp ban đầu vào dữ liệu huấn luyện cùng với các lớp mới. Nếu không thể, đóng băng nhiều lớp hơn (
freeze=10trở lên) và sử dụng learning rate thấp hơn sẽ giúp bảo toàn kiến thức đã được pretrained. Xem Hiệu suất trên các lớp ban đầu suy giảm để biết thêm chi tiết.