Разделите набор данных на обучающую/валидационную/тестовую выборки для обнаружения объектов.

Вопрос или проблема

У меня есть набор данных для обнаружения объектов с метками в формате YOLO, каждая картинка может содержать вхождения разных классов и множественные вхождения одного и того же класса.

Как можно разделить набор данных на обучающую, валидационную и тестовую выборки так, чтобы каждая содержала примерно одинаковый процент вхождений для каждого класса?

Один из подходов может заключаться в том, чтобы начать с разделения набора данных по классам, имея одинаковое количество записей в каждом из них, так как это ваше требование для окончательных делений. Затем разделите каждую часть класса на обучающую, валидационную и тестовую. А затем в конце объедините все деления по их типу, а не по классу, другими словами, объедините все обучающие деления и объедините валидационные деления и так далее. Таким образом, вы гарантируете выполнение вашего требования.

Ответ или решение

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

Шаг 1: Анализ данных

Прежде всего, проведите анализ вашего набора данных. Определите количество изображений и классов, а также частоту появления каждого класса на изображениях. Это поможет вам понять, как распределены ваши данные.

Шаг 2: Группировка по классам

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

Шаг 3: Деление классов на выборки

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

  • Обучающая выборка: 70%
  • Валидационная выборка: 15%
  • Тестовая выборка: 15%

Такое деление может варьироваться в зависимости от общего объема данных и специфики вашей задачи, но важно сохранить пропорции.

Шаг 4: Объединение выборок

После того как вы разделили каждый отдельный класс, необходимо объединить все полученные выборки по типам:

  • Соберите все обучающие подвыборки в одну итоговую обучающую выборку.
  • Также объедините валидационные и тестовые подвыборки.

Такой подход гарантирует, что каждая выборка (обучающая, валидационная и тестовая) будет содержать равное представительство всех классов, соответствующее их общему распределению в исходном датасете.

Шаг 5: Проверка распределения классов

Важно провести финальную проверку распределения классов в каждой из выборок (обучающей, валидационной и тестовой) после их объединения. Убедитесь, что пропорции соответствуют первоначальному распределению классов в данных. Это можно сделать с помощью анализа частоты появления классов в каждой выборке.

Шаг 6: Использование инструментов

Для реализации вышеописанных шагов вы можете использовать Python и библиотеки для обработки данных, такие как Pandas, а также инструменты для работы с файловой системой, чтобы эффективно манипулировать изображениями и аннотациями.

Примерный код для разбивки данных может выглядеть так:

import os
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split

# Пути к вашим изображениям и аннотациям
image_dir = "path/to/images"
annotations_dir = "path/to/annotations"

# Считываем данные
data = pd.read_csv("annotations.csv")  # Предполагается, что есть csv с метками

# Сгруппируем данные по классам
class_groups = data.groupby('class')

train_data = []
val_data = []
test_data = []

for class_name, group in class_groups:
    train, temp = train_test_split(group, test_size=0.3, stratify=group['class'])
    val, test = train_test_split(temp, test_size=0.5, stratify=temp['class'])

    train_data.append(train)
    val_data.append(val)
    test_data.append(test)

# Конкатенируем результаты
train_data = pd.concat(train_data)
val_data = pd.concat(val_data)
test_data = pd.concat(test_data)

# Сохраняем результат
train_data.to_csv("train_data.csv", index=False)
val_data.to_csv("val_data.csv", index=False)
test_data.to_csv("test_data.csv", index=False)

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...