Cách tinh chỉnh YOLO trên một tập dữ liệu tùy chỉnh
Tinh chỉnh (fine-tuning) điều chỉnh mô hình đã được huấn luyện trước để nhận dạng các lớp mới bằng cách bắt đầu từ các 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, 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 trong một khoảng thời gian ngắn hơn nhiều.
Hướng dẫn này bao gồm việc 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 lớp và huấn luyện hai giai đoạn .
Tinh chỉnh so với đào tạo từ đầu
Một mô hình được huấn luyện trước đã học được các đặc điểm hình ảnh tổng quát - phát hiện cạnh, nhận dạng 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 cho mô hình nhận biết các lớp mới trông như thế nào, đó là lý do tại sao nó hội tụ nhanh hơn và yêu cầu ít dữ liệu hơn. Huấn luyện từ đầu loại bỏ tất cả những điều đó và buộc mô hình phải học mọi thứ từ các mẫu ở cấp độ pixel trở lên, điều này đòi hỏi nhiều tài nguyên hơn đáng kể.
| Tinh chỉnh | Đào tạo từ đầu | |
|---|---|---|
| Trọng lượng ban đầu | Được đào tạo trước trên COCO (80 lớp) | Khởi tạo ngẫu nhiên |
| Yêu cầu | YOLO("yolo26n.pt") | YOLO("yolo26n.yaml") |
| Sự hội tụ | Nhanh hơn - hệ thống xương sống đã được huấn luyện | Chậm hơn - tất cả các lớp đều học từ đầu. |
| Yêu cầu dữ liệu | Thấp hơn - các tính năng được huấn luyện trước bù đắp cho lượng dữ liệu ít hơn. | Mô hình cấp cao hơn phải tự học tất cả các đặc điểm từ tập dữ liệu. |
| Khi nào nên sử dụng | Các lớp học tùy chỉnh với hình ảnh tự nhiên | Các lĩnh vực hoàn toàn khác biệt so với COCO (y tế, vệ tinh, radar) |
Việc tinh chỉnh không yêu cầu thêm mã lệnh nào.
Khi một .pt Tệp được tải với YOLO("yolo26n.pt")Các trọng số đã được huấn luyện trước được lưu trữ trong mô hình. Gọi .train(data="custom.yaml") Sau đó, hệ thống tự động chuyển tất cả các trọng số tương thích sang kiến trúc mô hình mới, khởi tạo lại bất kỳ lớp nào không khớp (chẳng hạn như lớp đầu phát hiện khi số lượng lớp khác nhau) và bắt đầu huấn luyện. Không cần tải trọng số thủ công, thao tác lớp hoặc mã chuyển giao học tập tùy chỉnh.
Cơ chế chuyển trọng lượng được huấn luyện trước hoạt động như thế nào?
Khi một mô hình được huấn luyện trước được tinh chỉnh trên một tập dữ liệu có số lượng lớp khác nhau (ví dụ: COCO (từ 80 lớp học thành 5 lớp học tùy chỉnh), Ultralytics Thực hiện chuyển trọng lượng dựa trên hình dạng:
- Phần xương sống và cổ được chuyển giao hoàn toàn - các lớp này trích xuất các đặc điểm 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ượng lớp.
- Đầu dò được khởi tạo lại một phần. - các lớp đầu ra phân loại (
cv3,one2one_cv3) có hình dạng gắn liền với số lượng lớp (80 so với 5), do đó chúng không thể chuyển giao và được khởi tạo ngẫu nhiên. Các lớp hồi quy hộp (cv2,one2one_cv2) trong đầu có hình dạng cố định bất kể số lượng lớp, vì vậy chúng chuyển giao bình thường. - Phần lớn các trọng số được chuyển đổi khi thay đổi số lượng lớp. Chỉ các lớp chuyên biệt cho việc phân loại trong phần đầu phát hiện mới được khởi tạo lại - các nhánh xương sống, cổ và hồi quy hộp vẫn giữ nguyên.
Đối với các tập dữ liệu có cùng số lượng lớp với mô hình được huấn luyện trước (ví dụ: tinh chỉnh) COCO -Trọng số được huấn luyện trước trên một tập dữ liệu 80 lớp khác), 100% trọng số được chuyển giao, bao gồm cả đầu phát hiện.
Ví dụ tinh chỉnh cơ bản
Ví dụ
from ultralytics import YOLO
model = YOLO("yolo26n.pt") # load pretrained model
model.train(data="path/to/data.yaml", epochs=50, imgsz=640)
yolo detect train model=yolo26n.pt data=path/to/data.yaml epochs=50 imgsz=640
Lựa chọn Kích thước Mô hình
Các mô hình lớn hơn có dung lượng lớn 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ơ quá khớp khi dữ liệu huấn luyện bị hạn chế. Bắt đầu với một mô hình nhỏ hơn (YOLO26n hoặc YOLO26s) và chỉ mở rộng quy mô khi các chỉ số đánh giá đạt đến mức ổn định là một cách tiếp cận thực tế. Kích thước mô hình tối ưu phụ thuộc vào độ phức tạp của nhiệm vụ, số lượng lớp, sự đa dạng của tập dữ liệu và phần cứng có sẵn để triển khai. Xem trang mô hình YOLO26 đầy đủ để biết các kích thước có sẵn và các tiêu chuẩn hiệu năng.
Lựa chọn trình tối ưu hóa và tốc độ học
Mặc định optimizer=auto Thiết lập này chọn trình tối ưu hóa và tốc độ học dựa trên tổng số lần lặp huấn luyện:
- < 10,000 iterations (small datasets or few epochs): AdamW with a low, auto-calculated learning rate
- > 10.000 lần lặp (tập dữ liệu lớn): MuSGD (một thuật toán lai Muon+) SGD trình tối ưu hóa) với lr=0.01
Đối với hầu hết các tác vụ tinh chỉnh, cài đặt mặc định hoạt động tốt mà không cần tinh chỉnh thủ công. Hãy cân nhắc thiết lập trình tối ưu hóa một cách rõ ràng khi:
- Quá trình huấn luyện không ổn định (lỗ đột biến hoặc phân kỳ): thử
optimizer=AdamW, lr0=0.001để hội tụ ổn định hơn - Tinh chỉnh một mô hình lớn trên một tập dữ liệu nhỏ.: tốc độ học tập thấp hơn như
lr0=0.001giúp bảo tồn các tính năng đã được huấn luyện trước
Trình tối ưu hóa tự động sẽ ghi đè lên cài đặt lr0 thủ công.
Khi optimizer=auto, hàm lr0 và momentum Các giá trị bị bỏ qua. Để kiểm soát tốc độ học theo cách thủ công, hãy thiết lập trình tối ưu hóa một cách rõ ràng: optimizer=SGD, lr0=0.005.
Các lớp đóng băng
Việc đóng băng ngăn chặn việc cập nhật các lớp cụ thể trong quá trình huấn luyện. Điều này giúp tăng tốc độ huấn luyện và giảm hiện tượng quá khớp khi tập dữ liệu nhỏ so với khả năng của mô hình.
Hàm freeze Tham số chấp nhận một số nguyên hoặc một danh sách. Một số nguyên freeze=10 Đóng băng 10 lớp đầu tiên (từ 0 đến 9, tương ứng với phần xương sống trong YOLO26). Một danh sách có thể chứa các chỉ số lớp như sau: freeze=[0, 3, 5] để đóng băng một phần cấu trúc xương sống hoặc các chuỗi tên mô-đun như freeze=["23.cv2"] Để kiểm soát chi tiết từng nhánh cụ thể trong một lớp.
Ví dụ
model.train(data="custom.yaml", epochs=50, freeze=10)
model.train(data="custom.yaml", epochs=50, freeze=[0, 1, 2, 3, 4])
# Freeze the box regression branch of the detection head
model.train(data="custom.yaml", epochs=50, freeze=["23.cv2"])
Độ sâu đóng băng phù hợp phụ thuộc vào mức độ tương đồng giữa miền mục tiêu và dữ liệu được huấn luyện trước đó, cũng như lượng dữ liệu huấn luyện hiện có:
| Kịch bản | Khuyến Nghị | Lý do |
|---|---|---|
| Tập dữ liệu lớn, lĩnh vực tương tự | freeze=None (mặc định) | Đủ dữ liệu để điều chỉnh tất cả các lớp mà không bị quá khớp. |
| Tập dữ liệu nhỏ, miền tương tự | freeze=10 | Bảo toàn các đặc điểm cốt lõi, giảm số lượng tham số có thể huấn luyện. |
| Tập dữ liệu rất nhỏ | freeze=23 | Chỉ có đầu dò được huấn luyện, giảm thiểu rủi ro quá khớp. |
| Miền xa COCO | freeze=None | Các tính năng cốt lõi có thể không được chuyển giao tốt và cần được đào tạo lại. |
Độ sâu đóng băng cũng có thể được coi là một siêu tham số - thử một vài giá trị (0, 5, 10) và so sánh với kết quả kiểm chứng. mAP Đây là một cách thực tế để tìm ra thiết lập tốt nhất cho một tập dữ liệu cụ thể.
Các siêu tham số quan trọng để tinh chỉnh
Việc tinh chỉnh thường yêu cầu ít điều chỉnh siêu tham số hơn so với việc huấn luyện từ đầu. Các tham số quan trọng nhất là:
epochsTinh chỉnh cho kết quả hội tụ nhanh hơn so với huấn luyện từ đầu. Hãy bắt đầu với một giá trị vừa phải và sử dụng...patienceDừng sớm khi các chỉ số xác thực đạt đến mức ổn định.patienceGiá trị mặc định 100 được thiết kế cho các lần chạy huấn luyện dài. Giảm giá trị này xuống còn 10-20 sẽ tránh lãng phí thời gian vào những lần chạy đã đạt đến điểm hội tụ.warmup_epochsChế độ khởi động mặc định (3 epoch) tăng dần tốc độ học từ 0, giúp ngăn chặn các cập nhật gradient lớn làm hỏng các đặc trưng đã được huấn luyện trước trong các lần lặp đầu tiên. Nên giữ nguyên cài đặt mặc định ngay cả khi tinh chỉnh.
Để xem danh sách đầy đủ các tham số huấn luyện, vui lòng tham khảo tài liệu cấu hình huấn luyện .
Điều chỉnh tinh chỉnh hai giai đoạn
Quá trình tinh chỉnh hai giai đoạn chia quá trình huấn luyện thành hai pha. Giai đoạn đầu tiên đóng băng phần xương sống và chỉ huấn luyện phần cổ và đầu, cho phép các lớp phát hiện thích ứng với các lớp mới mà không làm gián đoạn các đặc trưng đã được huấn luyện trước đó. Giai đoạn thứ hai bỏ đóng băng tất cả các lớp và huấn luyện toàn bộ mô hình với tốc độ học thấp hơn để tinh chỉnh phần xương sống cho miền mục tiêu.
Phương pháp này đặc biệt hữu ích khi miền mục tiêu khác biệt đáng kể so với miền mặc định. COCO (hình ảnh y tế, hình ảnh trên không, kính hiển vi), trong đó hệ thống xương sống có thể cần điều chỉnh nhưng việc huấn luyện mọi thứ cùng một lúc sẽ gây ra sự không ổn định. Để tự động bỏ đóng băng bằng phương pháp dựa trên hàm gọi lại, hãy xem Đóng băng và Bỏ đóng băng hệ thống xương sống .
Điều chỉnh tinh chỉnh hai giai đoạn
from ultralytics import YOLO
# Stage 1: freeze backbone, train head and neck
model = YOLO("yolo26n.pt")
model.train(data="custom.yaml", epochs=20, freeze=10, name="stage1", exist_ok=True)
# Stage 2: unfreeze all, fine-tune with lower lr
model = YOLO("runs/detect/stage1/weights/best.pt")
model.train(data="custom.yaml", epochs=30, lr0=0.001, name="stage2", exist_ok=True)
Những lỗi thường gặp
Mô hình không đưa ra dự đoán nào.
- Thiếu 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 - mô hình không thể học hoặc khái quát hóa từ quá ít dữ liệu. Hãy đảm bảo có đủ ví dụ đa dạng cho mỗi lớp trước khi xem xét các nguyên nhân khác.
- Kiểm tra đường dẫn tập dữ liệu: đường dẫn không chính xác trong
data.yamlKhông tạo ra bất kỳ nhãn nào một cách im lặng. Chạyyolo detect val model=yolo26n.pt data=your_data.yamlTrước khi huấn luyện, cần xác nhận các nhãn được tải đúng cách. - Ngưỡng tin cậy thấp hơnNếu có dự đoán nhưng đã bị lọc bỏ, hãy thử
conf=0.1trong quá trình suy luận. - Kiểm tra số lượng học sinh trong lớp.: đảm bảo
nctrongdata.yamlPhù hợp với số lượng lớp thực tế trong các tệp nhãn.
Xác thực mAP cao nguyên sớm
- Thêm dữ liệu : Việc tinh chỉnh sẽ mang lại lợi ích đáng kể nhờ dữ liệu huấn luyện bổ sung, đặc biệt là các ví dụ đa dạng với góc độ, ánh sáng và phông nền khác nhau.
- Kiểm tra số dư lớp họcCác nhóm thiểu số sẽ có mức độ ưu tiên thấp. AP . Sử dụng
cls_pwđể áp dụng trọng số lớp tần số nghịch đảo (bắt đầu với)cls_pw=0.25Đối với tình trạng mất cân bằng ở mức độ vừa phải, hãy tăng lên.1.0(đối với tình trạng mất cân bằng nghiêm trọng). - Giảm sự gia tăngĐối với các tập dữ liệu rất nhỏ, việc tăng cường dữ liệu quá mức có thể gây hại nhiều hơn là có lợi. Hãy thử
mosaic=0.5hoặcmosaic=0.0. - Tăng độ phân giải: Đối với các tập dữ liệu có các đối tượng nhỏ, hãy thử
imgsz=1280Để bảo toàn chi tiết.
Hiệu năng giảm sút trên các lớp ban đầu sau khi tinh chỉnh.
Hiện tượng này được gọi là quên thảm khốc - mô hình mất đi kiến thức đã học trước đó khi được tinh chỉnh hoàn toàn trên dữ liệu mới. Việc quên hầu như không thể tránh khỏi nếu không bao gồm cả hình ảnh từ bộ dữ liệu gốc cùng với dữ liệu mới. Để giảm thiểu điều này:
- Kết hợp các tập dữ liệu : bao gồm các ví dụ về các lớp ban đầu cùng với các lớp mới trong quá trình tinh chỉnh. Đây là cách duy nhất đáng tin cậy để ngăn ngừa hiện tượng quên.
- Đóng băng phần thân và cổ : việc đóng băng cả phần thân và cổ để chỉ có đầu phát hiện được huấn luyện sẽ giúp ích cho các lần tinh chỉnh ngắn với tốc độ học rất thấp.
- Huấn luyện với số lượng epoch ít hơn : thời gian huấn luyện mô hình chỉ trên dữ liệu mới càng lâu, khả năng quên càng tăng lên.
Câu hỏi thường gặp
Tôi cần tinh chỉnh bao nhiêu hình ảnh? YOLO ?
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 nhiệm vụ, số lượng lớp và mức độ tương đồng giữa miền dữ liệu và miền khác biệt so với miền ban đầu. COCO Hình ảnh đa dạng hơn (ánh sáng, góc chụp, phông nền khác nhau) quan trọng hơn số lượng đơn thuần. Hãy bắt đầu với những gì bạn có và mở rộng quy mô nếu các chỉ số đánh giá không đủ.
Làm thế nào để tinh chỉnh YOLO26 trên một tập dữ liệu tùy chỉnh?
Tải một mô hình đã được huấn luyện trước .pt nộp và gọi .train() với đường dẫn đến một tùy chỉnh data.yaml. Ultralytics tự động xử lý chuyển trọng lượng, khởi tạo lại đầu dò và lựa chọn trình tối ưu hóa. Xem thêm Điều chỉnh cơ bản Xem phần này để biết ví dụ mã đầy đủ.
Tại sao tôi lại tinh chỉnh mọi thứ đến vậy? YOLO Mô hình không phát hiện ra gì?
Nguyên nhân phổ biến nhất là do đường dẫn không chính xác trong data.yaml (điều này âm thầm tạo ra không có nhãn nào), một sự không khớp giữa nc trong tệp YAML và tệp nhãn thực tế, hoặc ngưỡng độ tin cậy quá cao. Xem Những lỗi thường gặp Để xem danh sách kiểm tra khắc phục sự cố đầy đủ.
Cái mà YOLO Tôi nên đóng băng những lớp nào để tinh chỉnh?
Điều này phụ thuộc vào kích thước tập dữ liệu và độ tương đồng về miền. Đối với các tập dữ liệu nhỏ có miền tương tự như... COCO , đóng băng xương sống (freeze=10) ngăn ngừa hiện tượng quá khớp. Đối với các miền rất khác biệt so với COCO , để lại tất cả các lớp không bị đóng băng (freeze=None) cho phép hệ thống xương sống thích nghi. Xem Các lớp đóng băng Để biết thêm chi tiết về các đề xuất.
Làm thế nào để tránh tình trạng quên lãng nghiêm trọng khi tinh chỉnh? YOLO Về các lớp học mới?
Bao gồm các ví dụ về các lớp gốc trong dữ liệu huấn luyện cùng với các lớp mới. Nếu điều đó không thể thực hiện được, hãy đóng băng thêm các lớp (freeze=10 hoặc cao hơn) và sử dụng tốc độ học thấp hơn giúp bảo toàn kiến thức đã được huấn luyện trước đó. Xem Hiệu năng giảm sút trên các lớp gốc để biết thêm chi tiết.