Полное руководство: как выполнить разделение Train-Test в папке с изображением

В области машинного обучения и компьютерного зрения крайне важно разделить наш набор данных на отдельные обучающие и тестовые подмножества для оценки модели. При работе с данными изображений, хранящимися в папке, нам необходимо использовать определенные методы, чтобы обеспечить правильное разделение данных. В этой статье мы рассмотрим несколько методов и предоставим примеры кода для выполнения разделения поезда и теста на папку с изображениями. Давайте погрузимся!

Метод 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 и стратифицированное разделение для наборов данных, сбалансированных по классам. В зависимости от конкретных требований вашего проекта вы можете выбрать наиболее подходящий подход. Правильное разделение набора данных изображений обеспечивает надежную оценку моделей машинного обучения и облегчает точную оценку производительности.

Не забудьте адаптировать примеры кода в соответствии со структурой и потребностями вашего проекта. Приятного кодирования!