Xác định bản đặc tả Dataset
Lập kế hoạch về kịch bản, chỉ tiêu số lượng, biến thiên, trường hợp đặc biệt và ảnh nền trước khi thu thập dữ liệu; xác định quy mô kế hoạch theo các mục tiêu số lượng của Ultralytics.
Các nhóm không có bản đặc tả thường kết thúc với 5.000 ảnh ban ngày đủ sáng từ một camera và một model thất bại ngay lúc chạng vạng trong ngày đầu triển khai. Bản đặc tả dataset là danh sách ảnh cần thu thập: mọi kịch bản model phải xử lý, số lượng ảnh cần cho mỗi kịch bản và những trường hợp hiếm cần lấy mẫu nhiều hơn. Viết bản đặc tả chỉ mất một giờ, nhưng nó quyết định công sức thu thập sẽ được phân bổ ở đâu.
Thực hành
Vị trí của bản đặc tả#
Bản đặc tả là cầu nối giữa mục tiêu và camera. Bản đặc tả định hướng việc thu thập dữ liệu, và đây là tài liệu bạn quay lại xem khi model đầu tiên không đạt mục tiêu:
Quy trình quay lại bản đặc tả, không phải các thiết lập huấn luyện: mục tiêu không đạt thường có nghĩa là bản đặc tả đã bỏ sót một kịch bản. Hướng dẫn về các bước của một dự án CV mô tả cùng vòng đời này.
Viết từng kịch bản thành một hàng#
Một kịch bản là một tổ hợp các điều kiện ghi hình mà model phải xử lý. Các hàng có chỉ tiêu số lượng giúp nhận ra khoảng trống trước khi có ai cầm camera lên:
| Tình huống | Camera | Địa điểm | Thời điểm trong ngày | Điều kiện | Chỉ tiêu | Ghi chú |
|---|---|---|---|---|---|---|
| ban-ngày-khu-bốc-dỡ | cam-1 đến cam-4 | các khu A–C | 08:00–17:00 | bất kỳ | 1,200 | giờ cao điểm |
| ban-đêm-khu-bốc-dỡ | cam-1 đến cam-4 | các khu A–C | 22:00–04:00 | bất kỳ | 400 | ánh sáng đèn natri, ít người hơn |
| bốc-hàng-trời-mưa | cam-2, cam-3 | khu B | bất kỳ | chỉ trời mưa | 200 | hiếm nhưng quan trọng |
| xếp chồng | bất kỳ | bất kỳ | bất kỳ | pallet cao hơn 2 tầng | 150 | che khuất người phía sau |
| nền | bất kỳ | bất kỳ | bất kỳ | khu bốc dỡ trống | 150 | không có đối tượng, không có nhãn |
Kịch bản nào không thể ghi thành văn bản thì model sẽ không thấy trong quá trình huấn luyện, và chính kịch bản đó sẽ khiến model thất bại khi đưa vào sản xuất.
Xác định quy mô bản đặc tả theo mục tiêu số lượng#
Các mẹo để đạt kết quả huấn luyện tốt nhất của Ultralytics đưa ra các quy tắc kinh nghiệm cho môi trường sản xuất:
| Mục tiêu | Khuyến nghị |
|---|---|
| Số ảnh cho mỗi class | ≥ 1,500 |
| Số instance được gán nhãn cho mỗi class | ≥ 10,000 |
| Ảnh nền (không có nhãn) | 0–10% dataset; COCO có khoảng 1% |
| Độ đa dạng | Các thời điểm, mùa, thời tiết, điều kiện ánh sáng, góc chụp, nguồn ảnh và camera khác nhau |
Đây là ngưỡng chuẩn cho một model dùng trong môi trường sản xuất. Vài trăm đối tượng được gán nhãn cho mỗi class là đủ để bắt đầu thử nghiệm, và model đầu tiên đó là cách nhanh nhất để tìm hiểu kịch bản nào cần thêm dữ liệu. Để biết dataset còn cách ngưỡng chuẩn bao xa, hãy đếm dữ liệu. Script này chạy trên COCO128, một phần gồm 128 ảnh của COCO được tự động tải xuống:
from collections import Counter
from pathlib import Path
from ultralytics.data.utils import IMG_FORMATS, check_det_dataset, img2label_paths
IMAGES_PER_CLASS, INSTANCES_PER_CLASS = 1500, 10_000 # Ultralytics production targets
data = check_det_dataset("coco128.yaml") # downloads COCO128 (~7 MB) on first run; swap in your data YAML
images = [p for p in Path(data["train"]).rglob("*.*") if p.suffix[1:].lower() in IMG_FORMATS]
image_count, instance_count, background = Counter(), Counter(), 0
for label in map(Path, img2label_paths([str(p) for p in images])):
classes = [int(r.split()[0]) for r in label.read_text().splitlines() if r.strip()] if label.exists() else []
instance_count.update(classes)
image_count.update(set(classes))
background += not classes
print(f"{len(images)} images, {background} background ({background / len(images):.0%}, target 0-10%)")
print(f"{'class':>12} {'images':>7} {'instances':>10} {'of target':>10}")
ranked = instance_count.most_common()
for cls, n in ranked[:3] + ranked[-3:]: # best and worst covered classes
coverage = min(image_count[cls] / IMAGES_PER_CLASS, n / INSTANCES_PER_CLASS)
print(f"{data['names'][cls]:>12} {image_count[cls]:>7} {n:>10} {coverage:>10.1%}")
never_labeled = [name for i, name in data["names"].items() if i not in instance_count]
print(f"{len(never_labeled)} classes in names with zero labels: {never_labeled[:4]} ...")128 images, 2 background (2%, target 0-10%)
class images instances of target
person 61 254 2.5%
car 12 46 0.5%
cup 10 36 0.4%
bear 1 1 0.0%
banana 1 1 0.0%
skis 1 1 0.0%
9 classes in names with zero labels: ['fire hydrant', 'parking meter', 'sheep', 'cow'] ...Cách đọc kết quả:
- Độ bao phủ là giá trị nhỏ hơn giữa tỷ lệ ảnh và tỷ lệ instance, vì một class cần đạt cả hai. Ngay cả
person, class có độ bao phủ tốt nhất, cũng chỉ đạt 2.5% ngưỡng chuẩn cho sản xuất. - Các class chỉ có một instance (
bear,banana,skis) không thể được học hoặc đánh giá. Trong dataset của bạn, hãy thu thập thêm dữ liệu cho các class này hoặc loại chúng khỏi v1. - Các class không có nhãn nào được liệt kê trong YAML nhưng không bao giờ được vẽ. Model vẫn dành năng lực để dự đoán chúng. Hãy xóa chúng khỏi
nameshoặc thu thập dữ liệu cho chúng trước khi huấn luyện.
Bao quát các chiều biến thiên#

Một khung hình đã có người ở gần và xa, xe đạp, một con chó và ô tô. Bản đặc tả thực tế cần chủ động lập kế hoạch cho phạm vi đó. Với mỗi chiều, hãy ghi rõ bản đặc tả có bao quát chiều đó hay không áp dụng vì lý do gì; các hàng còn trống là những kịch bản bạn sẽ chỉ phát hiện ra khi đưa vào sản xuất:
| Chiều | Ví dụ |
|---|---|
| Thời gian | Ngày, đêm, bình minh, hoàng hôn |
| Thời tiết | Nắng, nhiều mây, mưa, sương mù, tuyết |
| Ánh sáng | Sáng, tối, chói, bóng đổ gắt, nhiều nguồn sáng hỗn hợp |
| Camera | Model, ống kính, độ cao lắp đặt, trường nhìn |
| Địa lý | Địa điểm, thành phố, quốc gia |
| Con người và nhân viên vận hành | Ca làm, nhóm, đồng phục, thiết bị bảo hộ |
| Biến thể sản phẩm | SKU, phiên bản bao bì, màu sắc |
| Kích thước đối tượng | Gần và lớn, tầm trung, xa và nhỏ |
| Che khuất | Rõ, che khuất một phần, che khuất nhiều, phía sau kính |
| Tình trạng thiết bị | Ống kính bẩn hoặc bị mờ, pallet hư hỏng, vạch kẻ sàn bị mòn |
Mức độ đa dạng quan trọng hơn số lượng: 1.500 ảnh trải đều trên các hàng này có giá trị hơn 5.000 ảnh chụp từ một camera vào buổi trưa.
Lập kế hoạch cho ảnh nền và các trường hợp biên#
Ảnh nền là các khung hình không có đối tượng được gán nhãn, chẳng hạn như bến bốc dỡ trống. Chúng giúp model học rằng không có gì ở đó và giảm cảnh báo dương tính giả.
Trong định dạng Ultralytics YOLO, ảnh nền đơn giản là ảnh có file nhãn rỗng hoặc không có file nhãn. Quá trình huấn luyện tính cả hai loại trong dòng quét (… 1200 images, 90 backgrounds, 0 corrupt). Hãy kiểm tra con số đó so với mục tiêu 0–10% trước epoch đầu tiên.
Trường hợp biên gồm che khuất nhiều, đối tượng bị cắt ở mép khung hình, hướng bất thường, đối tượng xếp chồng và các vật thể trông giống nhau, chẳng hạn như cột nâng của xe nâng bên cạnh cột thép. Hãy dành riêng một hàng chỉ tiêu cho từng trường hợp.
Nếu cứ 200 khung hình mới có một khung hình cho thấy người đứng sau các pallet xếp chồng, dataset thu thập theo tần suất tự nhiên chỉ có khoảng 7 khung hình như vậy trong 1.500 khung hình — quá ít để học. Hãy chủ động lấy mẫu quá mức các trường hợp biên: số lượng mục tiêu của chúng cần lớn hơn nhiều so với tỷ lệ xuất hiện trong video thực tế.
Bạn sẽ không thể nghĩ ra mọi tình huống trên giấy. Hãy hoàn thiện phần lớn đặc tả, nhanh chóng huấn luyện model đầu tiên và để các lỗi của model cho thấy những tình huống bạn đã bỏ sót.
Hiển thị lời giải
Chỉ tiêu được tính dựa trên mục tiêu số instance, không chỉ dựa trên mục tiêu số ảnh. Giả sử hệ thống đếm xe trong bãi đỗ có hai lớp và video thử nghiệm trung bình có 3 ô tô và 0,5 xe tải mỗi ảnh:
| Lớp | Số instance trên mỗi ảnh | Số ảnh cần để đạt 10.000 instance | Số ảnh cần để đạt mức sàn 1.500 ảnh | Kế hoạch |
|---|---|---|---|---|
car | 3.0 | ≈ 3,300 | 1,500 | 3.300 ảnh |
truck | 0.5 | ≈ 20,000 | 1,500 | Thu thập có mục tiêu tại lối vào khu vực bốc dỡ, nơi xe tải xuất hiện phổ biến hơn 10 lần |
Video thông thường đã bao phủ ô tô. Để có đủ xe tải, cần 20.000 ảnh ngẫu nhiên, vì vậy bản đặc tả bổ sung một hàng kịch bản riêng (lối vào khu vực bốc dỡ, các ngày trong tuần từ 06:00–10:00) thay vì thu thập nhiều hơn gấp sáu lần mọi thứ. Thêm một hàng ảnh nền khoảng 5% (bãi trống vào ban đêm) và các hàng trường hợp biên cho tuyết phủ và xe tải bị cắt một phần khỏi khung hình.