Ultralytics YOLO27: Tham gia danh sách chờ.
Get Started
Xây dựng Dataset YOLO Hiệu năng Cao·Huấn luyện và lặp lại·Bài học 8/10
Bài họcngười mới bắt đầu

Xác định khi nào dataset đã sẵn sàng

Chỉ bắt đầu lượt huấn luyện đầu tiên khi dataset vượt qua tám tiêu chí đạt/không đạt; tự động hóa ba tiêu chí mà script có thể kiểm tra và xác định cách khắc phục cho từng lỗi.

Dự án nào rồi cũng đến lúc cả nhóm muốn bắt đầu huấn luyện. Đôi khi dataset đã sẵn sàng; đôi khi dataset vẫn bị rò rỉ giữa các tập chia hoặc có class thiếu nhãn, gây lãng phí cả tuần chạy GPU và tạo ra một con số không đáng tin. Tám tiêu chí, mỗi tiêu chí được chấm đạt, không đạt hoặc có ngoại lệ được ghi nhận, giúp quyết định này khách quan thay vì tùy thuộc vào cảm tính.

Kết quả

Chấm dataset theo tám tiêu chí sẵn sàng, dùng script kiểm tra ba tiêu chí có thể đếm được, rồi đưa ra quyết định bắt đầu hoặc danh sách khắc phục được sắp xếp theo thứ tự ưu tiên.

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. Chấm cả tám tiêu chí: đạt, không đạt hoặc có ngoại lệ được ghi nhận.

  2. Để readiness.py chấm số lượng, rò rỉ dữ liệu, độ phủ của các tập chia và tỷ lệ ảnh nền.

  3. Khắc phục mọi tiêu chí không đạt trong dữ liệu, không phải bằng hyperparameter.

  4. Chỉ triển khai khi còn thiếu sót đã biết nếu tác động dự kiến của thiếu sót đó được ghi lại.

Thực hành

Tám tiêu chí#

#Bước kiểm traTiêu chí đạtNếu không đạt, quay lại
1Mục tiêu rõ ràngMục tiêu, tác vụ, các class và bài kiểm tra chấp nhận đã được ghi lại và thống nhấtBắt đầu từ mục tiêu kinh doanh
2Các class được định nghĩaMỗi class có định nghĩa và một đối tượng dễ nhầm lẫn được nêu rõ là loại trừMục tiêu và hướng dẫn gán nhãn
3Ảnh có tính đại diệnMỗi tình huống trong đặc tả đáp ứng chỉ tiêu, chủ yếu từ các nguồn dữ liệu sản xuấtThu thập dữ liệu chất lượng cao, có tính đại diện
4Số lượng đủ lớn≥ 1.500 ảnh và ≥ 10.000 instance cho mỗi class, hoặc có ngoại lệ được ghi nhậnĐặc tả và thu thập dữ liệu
5Nhãn nhất quánĐã soạn hướng dẫn, hoàn tất vòng hiệu chuẩn, mức độ nhất quán ≥ 90%Các phương pháp gán nhãn tốt nhất
6Đã hoàn tất QCScript kiểm tra không phát hiện lỗi, các trường hợp đáng ngờ đã được xem xét, ghi chú QC đã được soạnKiểm soát chất lượng dataset
7Các tập chia không bị nhiễm chéoChia theo nhóm, không nhóm nào xuất hiện trong hai tập chia, mọi class đều có mặt trong mỗi tập chiaChia dataset đúng cách
8Ảnh nền0–10% số ảnh là khung hình không có nhãn nàoĐặc tả và thu thập dữ liệu

Danh sách kiểm tra này đánh giá lần lượt những quyết định tương tự như hướng dẫn thu thập dữ liệu và gán nhãn; tại đây, các quyết định được gộp thành một lựa chọn duy nhất: tiếp tục hay dừng.

Tự động hóa các tiêu chí có thể đếm được#

Các tiêu chí 4, 7 và 8 là phép tính số học, vì vậy script sẽ chấm chúng theo cùng một cách mỗi lần. Script này đọc bộ dữ liệu thực hành và danh sách các tập chia do group_split.py tạo trong bài học trước:

from collections import Counter
from pathlib import Path

root = Path("datasets/practice")  # images/, labels/, and the train/val/test.txt lists from group_split.py
splits = {s: [Path(p).stem for p in (root / f"{s}.txt").read_text().split()] for s in ("train", "val", "test")}

def classes(stem):
    label = root / "labels" / f"{stem}.txt"
    return [int(r.split()[0]) for r in label.read_text().splitlines() if r.strip()] if label.exists() else []

stems = [s for split in splits.values() for s in split]
instances = Counter(c for s in stems for c in classes(s))
images = Counter(c for s in stems for c in set(classes(s)))
background = sum(not classes(s) for s in stems) / len(stems)
groups = {split: {s.rsplit("_", 1)[0] for s in names} for split, names in splits.items()}
per_split = {split: {c for s in names for c in classes(s)} for split, names in splits.items()}
shared = (groups["train"] & groups["val"]) | (groups["train"] & groups["test"]) | (groups["val"] & groups["test"])
weakest = min(instances, key=lambda c: (images[c], instances[c]))

checks = {
    "4 volume": (images[weakest] >= 1500 and instances[weakest] >= 10_000,
                 f"weakest class {weakest}: {images[weakest]} images, {instances[weakest]} instances"),
    "7 no shared groups": (not shared, f"{len(shared)} groups appear in more than one split"),
    "7 every class in every split": (all(per_split[s] == set(instances) for s in splits),
                                     ", ".join(f"{s} misses {len(set(instances) - per_split[s])}" for s in splits)),
    "8 background 0-10%": (background <= 0.10, f"{background:.1%} background images"),
}
for name, (ok, detail) in checks.items():
    print(f"{'PASS' if ok else 'FAIL'}  {name:<29} {detail}")
FAIL  4 volume                      weakest class 30: 1 images, 1 instances
PASS  7 no shared groups            0 groups appear in more than one split
FAIL  7 every class in every split  train misses 5, val misses 36, test misses 41
PASS  8 background 0-10%            1.6% background images

Việc chia theo nhóm đã khắc phục rò rỉ, nhưng bộ dữ liệu thực hành còn lâu mới sẵn sàng: class yếu nhất (30, skis) chỉ có một instance được gán nhãn, và val không thể chấm điểm một nửa số class. Đây là kết quả dự kiến với 128 ảnh demo, và cũng chính là kết luận mà tiêu chí này cần đưa ra trước khi bạn mất cả tuần huấn luyện.

Script gọn gàng không đồng nghĩa với checklist hoàn chỉnh

Script bao quát những gì có thể đếm được. Các mục kiểm tra 1, 2, 3, 5 và 6 cần có người thực hiện: mục tiêu đã thống nhất, định nghĩa bằng văn bản, độ bao phủ của đặc tả, điểm đồng thuận được đo lường và ghi chú QC. Hãy chấm thủ công, mỗi mục kèm một dòng bằng chứng.

Quyết định: huấn luyện, triển khai khi còn thiếu sót, hoặc khắc phục#

Khi một tiêu chí không đạt, bước tiếp theo hấp dẫn thường là làm việc gì đó khác thay vì khắc phục dữ liệu:

Lối tắt hấp dẫnVì sao không hiệu quả
"Thử model lớn hơn."Model lớn hơn cũng học nhiễu nhãn chính xác không kém.
"Điều chỉnh learning rate."Không thiết lập optimizer nào có thể bổ sung class hoặc tình huống còn thiếu.
"Huấn luyện thêm epoch."Huấn luyện thêm epoch trên dữ liệu hạn hẹp khiến model overfit nhanh hơn.
"Thêm phép tăng cường."Phép tăng cường không thể tạo ra những tình huống chưa từng có trong dữ liệu.

Ba tình huống gần đạt#

Tình huốngTiêu chí không đạtBiểu hiệnCách khắc phục
Nhiều dữ liệu nhưng ít biến thiên35.000 ảnh, một camera, không có trường hợp biênThu thập từ nhiều camera, địa điểm và thời điểm hơn trước khi huấn luyện
Nhiều biến thiên nhưng thiếu nhất quán5Người gán nhãn không thống nhất về phạm vi bbox và tình trạng che khuấtHoàn thiện hướng dẫn, hiệu chuẩn và gán nhãn lại các mẫu bị ảnh hưởng
Rò rỉ âm thầm7Chia ngẫu nhiên từng ảnh trên các khung hình videoChia lại theo clip, camera hoặc ngày; dự kiến mAP trên val sẽ giảm, vì mức giảm đó phản ánh thực tế

Triển khai dù đã biết còn thiếu sót#

Thường thì lựa chọn phù hợp là tạo một model đầu tiên tập trung trước khi mọi kiểm tra đều đạt: một dự án thí điểm, một prototype hoặc phiên bản v1 trên một nhóm camera con. Model trong môi trường production cho thấy vấn đề thực sự nhanh hơn việc âm thầm trau chuốt dataset. Khi triển khai dù còn thiếu sót, hãy ghi lại ba điều:

  • Kiểm tra nào không đạt.
  • Tác động dự kiến, ví dụ: "không có dữ liệu ban đêm; dự kiến recall thấp hơn sau khi trời tối".
  • Kế hoạch thu thập dữ liệu để khắc phục thiếu sót trong khi v1 đang chạy.
Ngoại lệ không kèm tác động chỉ là mục kiểm tra bị bỏ qua

"Khối lượng: ngoại lệ" không cung cấp thông tin gì cho người tiếp theo. "Khối lượng: pallet ở mức 700 đối tượng, dự kiến khả năng thu hồi pallet thấp hơn trong các khu vực đông đúc; gán nhãn thêm 2.000 đối tượng trước tháng Sáu" là một rủi ro được quản lý. Mọi ngoại lệ đều cần nêu tác động dự kiến lên kiểm thử nghiệm thu.

Chạy lại trước mỗi lần huấn luyện lại#

Chất lượng model theo thời gian: chất lượng được duy trì khi dữ liệu mới được gán nhãn bổ sung, sau đó suy giảm khi qua thời điểm suy giảm dự kiến, đặt ra câu hỏi liệu có nên huấn luyện lại ngay hay chờ thêm

Dataset đã sẵn sàng cho v1 không tự động sẵn sàng cho v3. Lớp mới, nguồn dữ liệu mới và người gán nhãn mới đều có thể khiến một kiểm tra từng đạt nay không còn đạt, còn dữ liệu production thì trôi dạt trong khi nhãn mới liên tục được bổ sung. Chạy lại readiness.py và chấm điểm lại các kiểm tra thủ công trước mỗi lần huấn luyện lại; việc này chỉ mất vài phút, còn bỏ qua có thể khiến bạn mất cả tuần huấn luyện trên một dataset lỗi.

Dùng thử

Chạy readiness.py trên dataset đã chia (hoặc tập thực hành), sau đó tự chấm điểm năm kiểm tra thủ công, mỗi kiểm tra kèm một dòng bằng chứng. Xếp hạng mọi kiểm tra không đạt theo mức độ ảnh hưởng đến bài kiểm tra nghiệm thu. Sản phẩm bàn giao: checklist tám hàng đã chấm điểm, kèm quyết định tiếp tục hoặc danh sách khắc phục có thứ tự ưu tiên, lưu cùng các ghi chú QC.

Đ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.
  • Cả tám kiểm tra đều có điểm số và một dòng bằng chứng; ba kiểm tra có thể đếm được lấy kết quả từ script.

  • Mỗi ngoại lệ đều nêu tác động dự kiến lên bài kiểm tra nghiệm thu và kế hoạch khắc phục.

  • Quyết định (huấn luyện, triển khai với thiếu sót đã ghi nhận hoặc khắc phục trước) được ghi lại cùng checklist.

Hiển thị lời giải

Checklist đã chấm điểm cho tập thực hành:

#Bước kiểm traĐiểmBằng chứng
1Mục tiêu rõ ràngcóobjective.md và acceptance_test.py trong bài học 1
2Các lớp được định nghĩakhông80 tên lớp của COCO chưa có định nghĩa bằng văn bản hoặc các trường hợp tương tự cần loại trừ
3Ảnh đại diệnkhôngcoverage.py: cam2–cam4 chưa đạt chỉ tiêu
4Số lượng đủ lớnkhôngreadiness.py: lớp yếu nhất chỉ có 1 ảnh
5Nhãn nhất quánkhôngMức độ đồng thuận 47% trong vòng hiệu chuẩn
6Đã hoàn tất QCmột phầnĐã chạy kiểm tra; các trường hợp nghi vấn trong 000000000438.jpg vẫn chưa được xử lý
7Các tập dữ liệu được chia tách sạchkhôngKhông có nhóm trùng lặp, nhưng val thiếu 36 trong số 71 lớp
8Ảnh nềncó1.6%

Quyết định: khắc phục trước. Xếp hạng theo rủi ro đối với bài kiểm tra nghiệm thu: (1) rút gọn danh sách lớp còn những lớp cần thiết cho mục tiêu, nhờ đó thu hẹp đồng thời các kiểm tra 2, 4 và 7; (2) thu thập thêm nhóm dữ liệu cho các lớp đó; (3) hoàn thiện quy tắc trong hướng dẫn về người ở xa và gán nhãn lại. Tập dữ liệu demo không đạt kiểm tra này, và đó là điều nên xảy ra.

Tiếp theo là gì

Khi checklist đạt yêu cầu, bài học tiếp theo sẽ chạy fine-tune baseline và biến kết quả thành bước khắc phục dataset tiếp theo.

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