В области машинного обучения и компьютерного зрения крайне важно разделить наш набор данных на отдельные обучающие и тестовые подмножества для оценки модели. При работе с данными изображений, хранящимися в папке, нам необходимо использовать определенные методы, чтобы обеспечить правильное разделение данных. В этой статье мы рассмотрим несколько методов и предоставим примеры кода для выполнения разделения поезда и теста на папку с изображениями. Давайте погрузимся!
Метод 1: разделение вручную с использованием Python
Самый простой подход — вручную разделить файлы изображений на отдельные каталоги обучения и тестирования с помощью Python. Мы можем добиться этого с помощью модуля os
. Вот пример:
import os
import shutil
def train_test_split_manual(image_folder, train_ratio):
# Create train and test directories
os.makedirs('train', exist_ok=True)
os.makedirs('test', exist_ok=True)
# Get image file names
image_files = os.listdir(image_folder)
# Calculate the number of images for each set
num_train = int(len(image_files) * train_ratio)
num_test = len(image_files) - num_train
# Move images to train directory
for image_file in image_files[:num_train]:
shutil.move(os.path.join(image_folder, image_file), 'train')
# Move remaining images to test directory
for image_file in image_files[num_train:]:
shutil.move(os.path.join(image_folder, image_file), 'test')
# Usage
train_test_split_manual('image_folder', train_ratio=0.8)
Метод 2: случайное разделение с использованием scikit-learn
Другой метод — случайное разделение файлов изображений с использованием библиотеки scikit-learn, которая предоставляет удобную функцию для этой цели. Вот пример:
import os
import shutil
from sklearn.model_selection import train_test_split
def train_test_split_random(image_folder, train_ratio):
# Create train and test directories
os.makedirs('train', exist_ok=True)
os.makedirs('test', exist_ok=True)
# Get image file names
image_files = os.listdir(image_folder)
# Split the image files randomly
train_files, test_files = train_test_split(image_files, train_size=train_ratio, random_state=42)
# Move images to train directory
for image_file in train_files:
shutil.move(os.path.join(image_folder, image_file), 'train')
# Move images to test directory
for image_file in test_files:
shutil.move(os.path.join(image_folder, image_file), 'test')
# Usage
train_test_split_random('image_folder', train_ratio=0.8)
Метод 3: стратифицированное разделение для сбалансированных по классам наборов данных
При решении задач классификации важно поддерживать баланс классов как в обучающем, так и в тестовом наборах. В следующем примере показано, как этого добиться с помощью послойного разделения:
import os
import shutil
from sklearn.model_selection import train_test_split
def train_test_split_stratified(image_folder, train_ratio):
# Create train and test directories
os.makedirs('train', exist_ok=True)
os.makedirs('test', exist_ok=True)
# Get image file names and labels
image_files = os.listdir(image_folder)
labels = [get_label(image_file) for image_file in image_files] # Implement your label extraction logic
# Split the image files while maintaining class balance
train_files, test_files, train_labels, test_labels = train_test_split(
image_files, labels, train_size=train_ratio, stratify=labels, random_state=42
)
# Move images to train directory
for image_file in train_files:
shutil.move(os.path.join(image_folder, image_file), 'train')
# Move images to test directory
for image_file in test_files:
shutil.move(os.path.join(image_folder, image_file), 'test')
# Usage
train_test_split_stratified('image_folder', train_ratio=0.8)
В этой статье мы рассмотрели три различных метода разделения папки с изображениями при тестировании поезда. Мы рассмотрели разделение вручную, случайное разделение с использованием scikit-learn и стратифицированное разделение для наборов данных, сбалансированных по классам. В зависимости от конкретных требований вашего проекта вы можете выбрать наиболее подходящий подход. Правильное разделение набора данных изображений обеспечивает надежную оценку моделей машинного обучения и облегчает точную оценку производительности.
Не забудьте адаптировать примеры кода в соответствии со структурой и потребностями вашего проекта. Приятного кодирования!