Ultralytics YOLO27: Tham gia danh sách chờ.
Get Started
Bài họcngười mới bắt đầu

Huấn luyện model đầu tiên của bạn

Fine-tune YOLO26 trên bộ dữ liệu của bạn chỉ bằng một lệnh gọi, đọc log huấn luyện trực tiếp từng dòng và tìm best.pt cùng các biểu đồ quan trọng trong thư mục run.

Huấn luyện detector từ đầu mất nhiều ngày và cần bộ dữ liệu khổng lồ. Fine-tune YOLO26 pretrained trên khoảng một trăm ảnh chỉ mất khoảng một phút trên CPU laptop, vì transfer learning tái sử dụng toàn bộ kiến thức model đã học về cạnh, hình dạng và đối tượng.

Trong bài học này, bạn sẽ huấn luyện trên bộ dữ liệu viên thuốc, theo dõi mAP50-95 tăng từ mức cơ sở gần bằng 0 lên 0.66 sau mười epoch và học cách sớm nhận biết qua log liệu một lượt chạy có ổn hay đang lãng phí thời gian.

Kết quả

Bạn có thể khởi chạy lượt fine-tune YOLO26, đánh giá độ ổn định qua log từng epoch và tìm checkpoint cùng các biểu đồ cần thiết trong thư mục run.

Lộ trình cấp tốc
Nếu bạn đã nắm rõ cách thực hiện, đây là phiên bản tóm tắt.
  1. YOLO('yolo26n.pt').train(data='my_dataset/data.yaml', epochs=10, imgsz=320, name='pills_v1') trên CPU.

  2. Trên GPU, hãy dùng các giá trị mặc định: epochs=100, imgsz=640.

  3. Log ổn định: loss giảm, mAP50-95 tăng, precision và recall duy trì cân bằng.

  4. Trước tiên, mở train_batch0.jpg; dùng weights/best.pt cho mọi thao tác tiếp theo.

Thực hành

Ví dụ thực hành: Huấn luyện detector viên thuốc#

Hộp thoại huấn luyện của Ultralytics Platform, tab Cloud, với các tùy chọn model, bộ dữ liệu, epoch và GPU cho lượt huấn luyện trên cloud

Hộp thoại Train New Model của Ultralytics Platform yêu cầu các lựa chọn giống như đoạn code bên dưới — model cơ sở, bộ dữ liệu, epoch, kích thước ảnh — rồi chạy trên GPU cloud hoặc tạo lệnh tương ứng để chạy cục bộ. Các thiết lập này hoàn tất trong khoảng một phút trên CPU laptop:

from ultralytics import YOLO

model = YOLO("yolo26n.pt")  # được pretrained trên COCO
results = model.train(data="my_dataset/data.yaml", epochs=10, imgsz=320, name="pills_v1")
print(results.save_dir)

CLI và Python là tương đương. epochs=10 và imgsz=320 giúp các lượt chạy trên CPU ngắn hơn; nếu dùng GPU, hãy bỏ cả hai và chấp nhận giá trị mặc định (epochs=100, imgsz=640), vì nhiều epoch và pixel hơn hầu như luôn có lợi. Chế độ Train tự chạy vòng lặp này cho bạn:

Đọc log từng dòng#

Đầu ra thực tế, rút gọn còn hai epoch đầu và hai epoch cuối:

optimizer: AdamW(lr=0.002, momentum=0.9) with parameter groups ...
Using 92 train, 23 val images for fraction=1.0 at imgsz=320
      Epoch    GPU_mem   box_loss   cls_loss    l1_loss  Instances       Size
       1/10         0G      1.818      3.899   0.008805        206        320: 100% 6/6 3.3s
                   all         23        399      0.957      0.805      0.927      0.548
       2/10         0G      1.434      3.291   0.006285        208        320: 100% 6/6 4.4s
                   all         23        399      0.953      0.911      0.964      0.592
       ...
       9/10         0G      1.121      1.103   0.005143        194        320: 100% 6/6 5.0s
                   all         23        399      0.949      0.957      0.975      0.656
      10/10         0G      1.174      1.125   0.005068        212        320: 100% 6/6 5.1s
                   all         23        399       0.97      0.957      0.977      0.659
10 epochs completed in 0.015 hours.
  • optimizer: AdamW(lr=0.002 ...): optimizer=auto mặc định đã chọn optimizer và learning rate cho bạn.
  • Using 92 train, 23 val images: xác nhận các giá trị này khớp với bộ dữ liệu của bạn. Số nhỏ hơn nghĩa là có ảnh bị bỏ qua.
  • GPU_mem 0G: đang huấn luyện trên CPU. Nếu dùng GPU, tại đây bạn sẽ thấy mức sử dụng bộ nhớ; 0G trên máy có GPU nghĩa là GPU chưa được sử dụng.
  • Dòng đầu tiên của mỗi epoch: ba loss trên tập huấn luyện, cùng số lượng đối tượng được gán nhãn trong batch cuối (Instances) và kích thước ảnh.
  • Dòng all của mỗi epoch: precision, recall, mAP50 và mAP50-95 trên tập validation. Đây là dòng cần theo dõi.
CộtÝ nghĩaXu hướng ổn định
box_lossMức chênh lệch giữa các box dự đoán và box được gán nhãnGiảm rồi chững lại
cls_lossMức sai lệch của điểm số lớpGiảm rồi chững lại
l1_lossSai số trực tiếp về tọa độ box của YOLO26Giảm
P, RPrecision và recall trên tập valTăng và duy trì cân bằng
mAP50, mAP50-95Chất lượng phát hiện; mAP50-95 cũng đánh giá cao các box khítTăng rồi chững lại

Ở đây, mAP50-95 tăng từ mức cơ sở 0.0002 lên 0.548 sau một epoch và 0.659 sau mười epoch. Precision giảm xuống 0.80 ở epoch 4 rồi phục hồi: kết quả từng epoch có thể dao động trên 23 ảnh validation, vì vậy hãy đánh giá xu hướng thay vì một dòng đơn lẻ. Các nguyên tắc ra quyết định khi lượt chạy đang diễn ra:

  • Loss giảm và mAP tăng: để lượt chạy tiếp tục.
  • Loss đi ngang từ epoch 1: dừng bằng Ctrl+C rồi kiểm tra nhãn và YAML.
  • Precision cao hơn recall đáng kể: model thận trọng và bỏ sót đối tượng. Recall cao hơn precision đáng kể: model phát hiện cả những thứ không tồn tại.
  • mAP đi ngang trong nhiều epoch: tăng số epoch sẽ không giúp ích; hãy thay đổi dữ liệu hoặc imgsz.

Ba loss là các thành phần trong hàm loss của YOLO26; hướng dẫn về metric hiệu năng giải thích chi tiết từng metric.

Tìm các tệp đầu ra của lượt chạy#

Mọi thứ được lưu vào runs/detect/pills_v1/:

FileMục đích
weights/best.ptCheckpoint có fitness validation tốt nhất qua các epoch; dùng cho inference và export
weights/last.ptCheckpoint mới nhất; dùng để tiếp tục lượt chạy bị gián đoạn
args.yamlMọi đối số đã dùng trong lượt chạy để tái lập kết quả
results.csv, results.pngLoss và metric theo từng epoch, dưới dạng dữ liệu và biểu đồ
labels.jpgSố lượng lớp và biểu đồ phân bố kích thước, vị trí của box
train_batch*.jpgCác batch huấn luyện đã augmentation, có vẽ nhãn
val_batch*_labels.jpg, val_batch*_pred.jpgGround truth và dự đoán trên ảnh validation
confusion_matrix*.png, Box*_curve.pngMa trận nhầm lẫn cùng các đường cong precision, recall, F1 và PR

Trước tiên, mở train_batch0.jpg. Nếu các box không khớp với đối tượng thì nhãn bị sai, và tăng số epoch cũng không thể khắc phục.

Ưu tiên thay đổi các đối số này#

Đối sốMặc địnhThay đổi khi nào
epochs100Các thử nghiệm ngắn trên CPU hoặc bộ dữ liệu rất nhỏ bắt đầu overfit (giảm); bộ dữ liệu lớn vẫn đang cải thiện (tăng lên 200–300)
imgsz640Đối tượng nhỏ (tăng lên 1024 hoặc 1280) hoặc thử nghiệm trên CPU (giảm)
batch16Batch size: giảm khi hết bộ nhớ, hoặc dùng -1 để tự động đặt kích thước bằng khoảng 60% bộ nhớ GPU
patience100Dừng sớm khi fitness validation không cải thiện trong N epoch, ví dụ patience=20
devicetự độngBuộc dùng cpu, mps, chỉ số GPU như 0 hoặc nhiều GPU như [0, 1]
nametrainLuôn đặt tên lượt chạy theo nội dung đã thay đổi
model.train(data="my_dataset/data.yaml", epochs=200, imgsz=1024, batch=-1, patience=20, name="pills_v1_1024")

Early stopping: lỗi validation chạm đáy và độ chính xác validation đạt đỉnh trong khi lỗi huấn luyện tiếp tục giảm, đánh dấu thời điểm nên dừng

Giá trị mặc định 100 của patience có nghĩa là lượt chạy 100 epoch sẽ không bao giờ dừng sớm. Giá trị nhỏ hơn sẽ kết thúc lượt chạy bị đình trệ tại thời điểm các đường cong phía trên cho thấy nên dừng; dù thế nào thì best.pt vẫn được giữ lại.

Khi dùng nhiều GPU, hãy truyền một danh sách như device=[0, 1, 2, 3]: Ultralytics tự khởi chạy huấn luyện song song dữ liệu phân tán (DDP), batch là tổng số trên các GPU và theo mặc định, quá trình huấn luyện sử dụng mixed precision (amp=True). Khi lượt chạy vượt quá khả năng của laptop, cùng bộ dữ liệu và các đối số đó có thể chạy trên GPU cloud của Ultralytics Platform, như trình bày trong Huấn luyện, đọc và fine-tune các lượt chạy.

Tránh những lỗi này#

Vô tình huấn luyện từ đầu

Triệu chứng: mAP gần bằng 0 sau nhiều epoch trên dataset nhỏ. Nguyên nhân: model xuất phát từ yolo26n.yaml (trọng số ngẫu nhiên) thay vì yolo26n.pt. Cách khắc phục: luôn bắt đầu bằng .pt đã pretrained. Huấn luyện từ đầu chỉ đáng làm trong nghiên cứu backbone hoặc với dataset rất lớn.

Hết bộ nhớ GPU

Triệu chứng: CUDA out of memory ngay trong epoch đầu tiên. Cách khắc phục: giảm một nửa batch hoặc đặt batch=-1 để AutoBatch chọn kích thước phù hợp với bộ nhớ. Giảm imgsz cũng hữu ích, nhưng làm thay đổi những gì model có thể nhìn thấy.

Triển khai best.pt, không phải last.pt

last.pt là epoch cuối cùng, có thể kém hơn một epoch trước đó. best.pt là epoch có độ phù hợp validation tốt nhất; đây là epoch cần dùng để validation, export và triển khai.

Hướng dẫn mẹo huấn luyện model trình bày các đối số còn lại; hướng dẫn tinh chỉnh hyperparameter trình bày các lần thử learning rate và genetic tuner. Hướng dẫn fine-tune trình bày cách đóng băng layer.

Dùng thử

Huấn luyện yolo26n.pt trên my_dataset/data.yaml với epochs=10, imgsz=320, name='pills_v1' (hoặc dùng giá trị mặc định trên GPU). Nộp báo cáo ngắn về lượt chạy: mAP50 và mAP50-95 cuối cùng đặt cạnh giá trị cơ sở từ bài học trước, epoch mà mAP50-95 gần như ngừng cải thiện và câu trả lời có hoặc không cho biết các box trong train_batch0.jpg có khớp với viên thuốc hay không.

Commit
git add -A && git commit -m "feat(model): trained first pill detector"
Điều kiện hoàn thành
Bạn đã hoàn thành bài học khi tất cả các điều kiện sau đều đúng.
  • runs/detect/pills_v1/weights/best.pt tồn tại.

  • Báo cáo của bạn cho thấy mAP50-95 cuối cùng cao hơn rõ rệt so với giá trị cơ sở của model pretrained.

  • Bạn đã kiểm tra train_batch0.jpg và results.png, đồng thời ghi lại thời điểm mAP chững lại.

Hiển thị lời giải
from ultralytics import YOLO

model = YOLO("yolo26n.pt")
results = model.train(data="my_dataset/data.yaml", epochs=10, imgsz=320, name="pills_v1")
print(results.save_dir)  # runs/detect/pills_v1
Baseline (yolo26n.pt, no pill class): mAP50 0.001, mAP50-95 0.0002
pills_v1 (10 epochs, imgsz 320, CPU, ~1 min): mAP50 0.977, mAP50-95 0.659
Plateau: mAP50-95 gains shrink after epoch 8 (0.649 -> 0.656 -> 0.659)
train_batch0.jpg: yes, boxes sit on the pills

Các con số chính xác có thể chênh lệch đôi chút tùy phần cứng và phiên bản package.

Tiếp theo là gì

Bạn đã có model được huấn luyện và một con số tổng quan. Tiếp theo, hãy validation đúng cách và tìm hiểu model thất bại ở đâu.

Đăng nhập để lưu tiến độ