Xác thực chéo K-Fold với Ultralytics
Giới thiệu
Hướng dẫn toàn diện này minh họa việc triển khai K-Fold Cross Validation cho các tập dữ liệu phát hiện đối tượng trong Ultralytics hệ sinh thái. Chúng tôi sẽ tận dụng YOLO định dạng phát hiện và khóa Python các thư viện như sklearn, pandas và PyYaml hướng dẫn bạn thiết lập cần thiết, quy trình tạo vectơ đặc trưng và thực hiện phân chia tập dữ liệu K-Fold.
Cho dù dự án của bạn liên quan đến tập dữ liệu Fruit Detection hay nguồn dữ liệu tùy chỉnh, hướng dẫn này nhằm mục đích giúp bạn hiểu và áp dụng K-Fold Cross Validation để tăng cường độ tin cậy và tính mạnh mẽ của dữ liệu của bạn. học máy mô hình. Trong khi chúng tôi đang áp dụng k=5
Nếp gấp Đối với hướng dẫn này, hãy nhớ rằng số lần gấp tối ưu có thể thay đổi tùy thuộc vào tập dữ liệu của bạn và chi tiết cụ thể của dự án của bạn.
Không cần quảng cáo thêm, chúng ta hãy đi sâu vào!
Thiết lập
Chú thích của bạn phải nằm trong YOLO định dạng phát hiện.
Hướng dẫn này giả định rằng các tệp chú thích có sẵn cục bộ.
Để trình diễn, chúng tôi sử dụng bộ dữ liệu Phát hiện trái cây .
- Tập dữ liệu này chứa tổng cộng 8479 hình ảnh.
- Nó bao gồm 6 nhãn lớp, mỗi nhãn có tổng số phiên bản được liệt kê bên dưới.
Nhãn lớp học | Số lượng phiên bản |
---|---|
Quả táo | 7049 |
Nho | 7202 |
Dứa | 1613 |
Cam | 15549 |
Chuối | 3536 |
Dưa hấu | 1976 |
Cần thiết Python Các gói bao gồm:
ultralytics
sklearn
pandas
pyyaml
Hướng dẫn này hoạt động với
k=5
Gấp. Tuy nhiên, bạn nên xác định số lần gấp tốt nhất cho tập dữ liệu cụ thể của mình.Bắt đầu một cái mới Python môi trường ảo (
venv
) cho dự án của bạn và kích hoạt nó. Dùngpip
(hoặc trình quản lý gói ưa thích của bạn) để cài đặt:- Các Ultralytics thư viện:
pip install -U ultralytics
. Ngoài ra, bạn có thể sao chép chính thức Repo. - Scikit-learn, gấu trúc và PyYAML:
pip install -U scikit-learn pandas pyyaml
.
- Các Ultralytics thư viện:
Xác minh rằng chú thích của bạn nằm trong YOLO định dạng phát hiện.
- Đối với hướng dẫn này, tất cả các tệp chú thích được tìm thấy trong
Fruit-Detection/labels
thư mục.
- Đối với hướng dẫn này, tất cả các tệp chú thích được tìm thấy trong
Tạo vectơ tính năng cho tập dữ liệu phát hiện đối tượng
Bắt đầu bằng cách tạo mới
example.py
Python tập tin cho các bước dưới đây.Tiến hành truy xuất tất cả các tệp nhãn cho tập dữ liệu của bạn.
Bây giờ, hãy đọc nội dung của tệp YAML tập dữ liệu và trích xuất các chỉ số của nhãn lớp.
Khởi tạo một trống
pandas
Khung dữ liệu.Đếm các trường hợp của mỗi nhãn lớp có trong các tệp chú thích.
from collections import Counter for label in labels: lbl_counter = Counter() with open(label, "r") as lf: lines = lf.readlines() for line in lines: # classes for YOLO label uses integer at first position of each line lbl_counter[int(line.split(" ")[0])] += 1 labels_df.loc[label.stem] = lbl_counter labels_df = labels_df.fillna(0.0) # replace `nan` values with `0.0`
Sau đây là dạng xem mẫu của DataFrame được điền:
0 1 2 3 4 5 '0000a16e4b057580_jpg.rf.00ab48988370f64f5ca8ea4...' 0.0 0.0 0.0 0.0 0.0 7.0 '0000a16e4b057580_jpg.rf.7e6dce029fb67f01eb19aa7...' 0.0 0.0 0.0 0.0 0.0 7.0 '0000a16e4b057580_jpg.rf.bc4d31cdcbe229dd022957a...' 0.0 0.0 0.0 0.0 0.0 7.0 '00020ebf74c4881c_jpg.rf.508192a0a97aa6c4a3b6882...' 0.0 0.0 0.0 1.0 0.0 0.0 '00020ebf74c4881c_jpg.rf.5af192a2254c8ecc4188a25...' 0.0 0.0 0.0 1.0 0.0 0.0 ... ... ... ... ... ... ... 'ff4cd45896de38be_jpg.rf.c4b5e967ca10c7ced3b9e97...' 0.0 0.0 0.0 0.0 0.0 2.0 'ff4cd45896de38be_jpg.rf.ea4c1d37d2884b3e3cbce08...' 0.0 0.0 0.0 0.0 0.0 2.0 'ff5fd9c3c624b7dc_jpg.rf.bb519feaa36fc4bf630a033...' 1.0 0.0 0.0 0.0 0.0 0.0 'ff5fd9c3c624b7dc_jpg.rf.f0751c9c3aa4519ea3c9d6a...' 1.0 0.0 0.0 0.0 0.0 0.0 'fffe28b31f2a70d4_jpg.rf.7ea16bd637ba0711c53b540...' 0.0 6.0 0.0 0.0 0.0 0.0
Các hàng lập chỉ mục các tệp nhãn, mỗi tệp tương ứng với một hình ảnh trong tập dữ liệu của bạn và các cột tương ứng với các chỉ mục nhãn lớp của bạn. Mỗi hàng đại diện cho một vectơ tính năng giả, với số lượng của mỗi nhãn lớp có trong tập dữ liệu của bạn. Cấu trúc dữ liệu này cho phép áp dụng Xác thực chéo K-Fold cho tập dữ liệu phát hiện đối tượng.
Phân tách tập dữ liệu K-Fold
Bây giờ chúng ta sẽ sử dụng
KFold
lớp học từsklearn.model_selection
để tạok
phân tách tập dữ liệu.- Quan trọng:
- Khung cảnh
shuffle=True
Đảm bảo phân phối ngẫu nhiên các lớp trong phần tách của bạn. - Bằng cách cài đặt
random_state=M
đâuM
là một số nguyên đã chọn, bạn có thể thu được kết quả lặp lại.
- Khung cảnh
- Quan trọng:
Tập dữ liệu hiện đã được chia thành
k
nếp gấp, mỗi nếp gấp có một danh sáchtrain
vàval
chỉ số. Chúng ta sẽ xây dựng một DataFrame để hiển thị các kết quả này rõ ràng hơn.Bây giờ chúng ta sẽ tính toán phân bố nhãn lớp cho mỗi lần gấp theo tỷ lệ của các lớp có trong
val
cho những người có mặt trongtrain
.fold_lbl_distrb = pd.DataFrame(index=folds, columns=cls_idx) for n, (train_indices, val_indices) in enumerate(kfolds, start=1): train_totals = labels_df.iloc[train_indices].sum() val_totals = labels_df.iloc[val_indices].sum() # To avoid division by zero, we add a small value (1E-7) to the denominator ratio = val_totals / (train_totals + 1e-7) fold_lbl_distrb.loc[f"split_{n}"] = ratio
Kịch bản lý tưởng là tất cả các tỷ lệ lớp học phải giống nhau một cách hợp lý cho mỗi lần phân chia và giữa các lớp. Tuy nhiên, điều này sẽ phụ thuộc vào các chi tiết cụ thể của tập dữ liệu của bạn.
Tiếp theo, chúng tôi tạo các thư mục và tệp YAML tập dữ liệu cho mỗi lần tách.
import datetime supported_extensions = [".jpg", ".jpeg", ".png"] # Initialize an empty list to store image file paths images = [] # Loop through supported extensions and gather image files for ext in supported_extensions: images.extend(sorted((dataset_path / "images").rglob(f"*{ext}"))) # Create the necessary directories and dataset YAML files (unchanged) save_path = Path(dataset_path / f"{datetime.date.today().isoformat()}_{ksplit}-Fold_Cross-val") save_path.mkdir(parents=True, exist_ok=True) ds_yamls = [] for split in folds_df.columns: # Create directories split_dir = save_path / split split_dir.mkdir(parents=True, exist_ok=True) (split_dir / "train" / "images").mkdir(parents=True, exist_ok=True) (split_dir / "train" / "labels").mkdir(parents=True, exist_ok=True) (split_dir / "val" / "images").mkdir(parents=True, exist_ok=True) (split_dir / "val" / "labels").mkdir(parents=True, exist_ok=True) # Create dataset YAML files dataset_yaml = split_dir / f"{split}_dataset.yaml" ds_yamls.append(dataset_yaml) with open(dataset_yaml, "w") as ds_y: yaml.safe_dump( { "path": split_dir.as_posix(), "train": "train", "val": "val", "names": classes, }, ds_y, )
Cuối cùng, sao chép hình ảnh và nhãn vào thư mục tương ứng ('train' hoặc 'val') cho mỗi lần tách.
- GHI: Thời gian cần thiết cho phần mã này sẽ thay đổi dựa trên kích thước tập dữ liệu và phần cứng hệ thống của bạn.
import shutil for image, label in zip(images, labels): for split, k_split in folds_df.loc[image.stem].items(): # Destination directory img_to_path = save_path / split / k_split / "images" lbl_to_path = save_path / split / k_split / "labels" # Copy image and label files to new directory (SamefileError if file already exists) shutil.copy(image, img_to_path / image.name) shutil.copy(label, lbl_to_path / label.name)
Lưu bản ghi (Tùy chọn)
Theo tùy chọn, bạn có thể lưu các bản ghi của DataFrames phân tách và phân phối nhãn K-Fold dưới dạng tệp CSV để tham khảo trong tương lai.
folds_df.to_csv(save_path / "kfold_datasplit.csv")
fold_lbl_distrb.to_csv(save_path / "kfold_label_distribution.csv")
Xe lửa YOLO sử dụng Chia tách dữ liệu K-Fold
Đầu tiên, tải YOLO mẫu.
Tiếp theo, lặp lại các tệp YAML tập dữ liệu để chạy đào tạo. Kết quả sẽ được lưu vào một thư mục được chỉ định bởi
project
vàname
lập luận. Theo mặc định, thư mục này là 'exp/runs#' trong đó # là chỉ mục số nguyên.results = {} # Define your additional arguments here batch = 16 project = "kfold_demo" epochs = 100 for k in range(ksplit): dataset_yaml = ds_yamls[k] model = YOLO(weights_path, task="detect") model.train(data=dataset_yaml, epochs=epochs, batch=batch, project=project) # include any train arguments results[k] = model.metrics # save output metrics for further analysis
Kết thúc
Trong hướng dẫn này, chúng tôi đã khám phá quá trình sử dụng xác thực chéo K-Fold để đào tạo YOLO Mô hình phát hiện đối tượng. Chúng tôi đã học cách chia tập dữ liệu của mình thành các phân vùng K, đảm bảo phân phối lớp cân bằng trên các nếp gấp khác nhau.
Chúng tôi cũng đã khám phá quy trình tạo DataFrames báo cáo để trực quan hóa việc phân tách dữ liệu và phân phối nhãn trên các phần tách này, cung cấp cho chúng tôi cái nhìn sâu sắc rõ ràng về cấu trúc của các bộ đào tạo và xác thực của chúng tôi.
Theo tùy chọn, chúng tôi đã lưu các bản ghi của mình để tham khảo trong tương lai, điều này có thể đặc biệt hữu ích trong các dự án quy mô lớn hoặc khi khắc phục sự cố hiệu suất mô hình.
Cuối cùng, chúng tôi đã thực hiện đào tạo mô hình thực tế bằng cách sử dụng mỗi lần chia trong một vòng lặp, lưu kết quả đào tạo của chúng tôi để phân tích và so sánh thêm.
Kỹ thuật xác thực chéo K-Fold này là một cách mạnh mẽ để tận dụng tối đa dữ liệu có sẵn của bạn và nó giúp đảm bảo rằng hiệu suất mô hình của bạn đáng tin cậy và nhất quán trên các tập hợp con dữ liệu khác nhau. Điều này dẫn đến một mô hình tổng quát và đáng tin cậy hơn, ít có khả năng phù hợp với các mẫu dữ liệu cụ thể.
Hãy nhớ rằng mặc dù chúng tôi đã sử dụng YOLO Trong hướng dẫn này, các bước này hầu hết có thể chuyển sang các mô hình học máy khác. Hiểu các bước này cho phép bạn áp dụng xác thực chéo một cách hiệu quả trong các dự án học máy của riêng bạn. Mã hóa vui vẻ!
FAQ
Xác thực chéo K-Fold là gì và tại sao nó lại hữu ích trong việc phát hiện đối tượng?
Xác thực chéo K-Fold là một kỹ thuật trong đó tập dữ liệu được chia thành các tập con 'k' (fold) để đánh giá hiệu suất mô hình đáng tin cậy hơn. Mỗi fold đóng vai trò là dữ liệu đào tạo và xác thực . Trong bối cảnh phát hiện đối tượng, sử dụng Xác thực chéo K-Fold giúp đảm bảo Ultralytics YOLO hiệu suất của mô hình mạnh mẽ và có thể khái quát hóa trên các phân chia dữ liệu khác nhau, nâng cao độ tin cậy của nó. Để biết hướng dẫn chi tiết về cách thiết lập Xác thực chéo K-Fold với Ultralytics YOLO , tham khảo Xác thực chéo K-Fold với Ultralytics .
Làm cách nào để triển khai Xác thực chéo K-Fold bằng cách sử dụng Ultralytics YOLO?
Để triển khai Xác thực chéo K-Fold với Ultralytics YOLO, bạn cần làm theo các bước sau:
- Xác minh chú thích nằm trong YOLO định dạng phát hiện.
- Dùng Python Các thư viện như
sklearn
,pandas
vàpyyaml
. - Tạo vectơ tính năng từ tập dữ liệu của bạn.
- Chia nhỏ tập dữ liệu của bạn bằng cách sử dụng
KFold
từsklearn.model_selection
. - Đào tạo YOLO mô hình trên mỗi lần tách.
Để có hướng dẫn toàn diện, hãy xem phần Phân tách tập dữ liệu K-Fold trong tài liệu của chúng tôi.
Tại sao tôi nên sử dụng Ultralytics YOLO để phát hiện đối tượng?
Ultralytics YOLO cung cấp khả năng phát hiện đối tượng theo thời gian thực, hiện đại với độ chính xác và hiệu quả cao. Nó linh hoạt, hỗ trợ nhiều tác vụ thị giác máy tính như phát hiện, phân đoạn và phân loại. Ngoài ra, nó tích hợp liền mạch với các công cụ như Ultralytics HUB cho đào tạo và triển khai mô hình không cần mã. Để biết thêm chi tiết, hãy khám phá các lợi ích và tính năng trên trang Ultralytics YOLO của chúng tôi.
Làm cách nào để đảm bảo chú thích của tôi ở định dạng chính xác cho Ultralytics YOLO?
Chú thích của bạn phải tuân theo YOLO định dạng phát hiện. Mỗi tệp chú thích phải liệt kê lớp đối tượng, cùng với tọa độ hộp giới hạn của nó trong hình ảnh. YOLO định dạng đảm bảo xử lý dữ liệu hợp lý và chuẩn hóa để đào tạo các mô hình phát hiện đối tượng. Để biết thêm thông tin về định dạng chú thích phù hợp, hãy truy cập hướng dẫn định dạng phát hiện YOLO .
Tôi có thể sử dụng Xác thực chéo K-Fold với các bộ dữ liệu tùy chỉnh khác ngoài Phát hiện trái cây không?
Có, bạn có thể sử dụng Xác thực chéo K-Fold với bất kỳ tập dữ liệu tùy chỉnh nào miễn là các chú thích nằm trong YOLO định dạng phát hiện. Thay thế đường dẫn tập dữ liệu và nhãn lớp bằng những đường dẫn cụ thể cho tập dữ liệu tùy chỉnh của bạn. Tính linh hoạt này đảm bảo rằng bất kỳ dự án phát hiện đối tượng nào cũng có thể hưởng lợi từ việc đánh giá mô hình mạnh mẽ bằng cách sử dụng Xác thực chéo K-Fold. Để có ví dụ thực tế, hãy xem lại phần Tạo vectơ tính năng của chúng tôi.