← Назад к вопросам

Как будешь увеличивать размер датасета из картинок?

2.7 Senior🔥 191 комментариев
#Машинное обучение

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как увеличивать размер датасета из картинок

Увеличение датасета изображений (data augmentation) — это ключевая техника в компьютерном зрении для борьбы с переобучением и недостатком данных. Существует множество подходов: от простых трансформаций до синтеза новых образцов.

Основные техники аугментации

1. Геометрические трансформации

import albumentations as A
import cv2
from PIL import Image
import numpy as np

# Библиотека albumentations (рекомендуется)
transform = A.Compose([
    A.HorizontalFlip(p=0.5),           # Горизонтальный flip
    A.VerticalFlip(p=0.3),             # Вертикальный flip
    A.Rotate(limit=30, p=0.5),         # Поворот на ±30 градусов
    A.ShiftScaleRotate(shift_limit=0.1, scale_limit=0.2, rotate_limit=45),
    A.Perspective(scale=(0.05, 0.1), p=0.5),  # Перспективные искажения
    A.ElasticTransform(p=0.5),         # Упругие деформации
], bbox_params=A.BboxParams(format='pascal_voc', label_fields=['class_labels']))

# Применение
image = cv2.imread('image.jpg')
augmented = transform(image=image, bboxes=[], class_labels=[])
augmented_image = augmented['image']

2. Цветовые трансформации

transform = A.Compose([
    A.RandomBrightnessContrast(p=0.5),     # Яркость и контраст
    A.RandomGamma(p=0.5),                  # Гамма-коррекция
    A.GaussNoise(p=0.5),                   # Гауссовский шум
    A.ISONoise(p=0.5),                     # ISO-шум
    A.Blur(blur_limit=3, p=0.5),          # Размытие
    A.MotionBlur(blur_limit=3, p=0.5),    # Motion blur
    A.MedianBlur(blur_limit=3, p=0.5),    # Медианное фильтрование
    A.GaussBlur(blur_limit=3, p=0.5),     # Гауссово размытие
    A.OneOf([
        A.OpticalDistortion(p=0.5),
        A.GridDistortion(p=0.5),
    ], p=0.2),
])

3. Комбинированная аугментация

# Сильная аугментация для small datasets
strong_augmentation = A.Compose([
    A.HorizontalFlip(p=0.5),
    A.ShiftScaleRotate(shift_limit=0.1, scale_limit=0.2, rotate_limit=45, p=0.5),
    A.RandomBrightnessContrast(p=0.5),
    A.GaussNoise(p=0.3),
    A.Blur(blur_limit=3, p=0.3),
    A.Cutout(num_holes=8, max_h_size=20, max_w_size=20, p=0.3),  # Cutout
], bbox_params=A.BboxParams(format='pascal_voc', label_fields=['labels']))

Применение аугментации в PyTorch DataLoader

import torch
from torch.utils.data import Dataset, DataLoader
import albumentations as A
from albumentations.pytorch import ToTensorV2

class CustomDataset(Dataset):
    def __init__(self, images, labels, transform=None):
        self.images = images
        self.labels = labels
        self.transform = transform
    
    def __len__(self):
        return len(self.images)
    
    def __getitem__(self, idx):
        image = self.images[idx]
        label = self.labels[idx]
        
        if self.transform:
            augmented = self.transform(image=image)
            image = augmented['image']
        
        return image, label

# Трансформы для train и val
train_transform = A.Compose([
    A.HorizontalFlip(p=0.5),
    A.ShiftScaleRotate(shift_limit=0.1, scale_limit=0.2, rotate_limit=45, p=0.5),
    A.RandomBrightnessContrast(p=0.5),
    A.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
    ToTensorV2(),
])

val_transform = A.Compose([
    A.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
    ToTensorV2(),
])

train_dataset = CustomDataset(train_images, train_labels, transform=train_transform)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True, num_workers=4)

Передвинутое обучение (Transfer Learning)

Если датасет очень маленький, используй предобученные модели:

import torchvision.models as models
import torch.nn as nn

# Загрузить предобученную модель
model = models.resnet50(pretrained=True)

# Заморозить слои
for param in model.parameters():
    param.requires_grad = False

# Заменить последний слой
num_classes = 10
model.fc = nn.Sequential(
    nn.Linear(2048, 512),
    nn.ReLU(),
    nn.Dropout(0.3),
    nn.Linear(512, num_classes)
)

# Разморозить последние слои для fine-tuning
for param in model.layer4.parameters():
    param.requires_grad = True
for param in model.fc.parameters():
    param.requires_grad = True

Синтез новых данных (GAN, Diffusion)

# Использование предобученной Diffusion модели для генерации
from diffusers import StableDiffusionPipeline
import torch

pipe = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
pipe = pipe.to("cuda")

# Генерирование изображений
prompts = [
    "A dog sitting on a bench",
    "A cat playing with a ball",
    "A bird flying in the sky"
]

for prompt in prompts:
    image = pipe(prompt).images[0]
    image.save(f"generated_{prompt}.png")

Mixup и CutMix аугментация

# CutMix: смешивание частей изображений
def cutmix(images, labels, alpha=1.0):
    batch_size = images.shape[0]
    index = torch.randperm(batch_size)
    
    lam = np.random.beta(alpha, alpha)
    
    # Случайный размер и положение квадрата
    cut_size = int(images.shape[2] * np.sqrt(1 - lam))
    cx = np.random.randint(0, images.shape[2])
    cy = np.random.randint(0, images.shape[3])
    
    bbx1 = np.clip(cx - cut_size // 2, 0, images.shape[2])
    bby1 = np.clip(cy - cut_size // 2, 0, images.shape[3])
    bbx2 = np.clip(cx + cut_size // 2, 0, images.shape[2])
    bby2 = np.clip(cy + cut_size // 2, 0, images.shape[3])
    
    images[:, :, bbx1:bbx2, bby1:bby2] = images[index, :, bbx1:bbx2, bby1:bby2]
    
    lam = 1 - ((bbx2 - bbx1) * (bby2 - bby1)) / (images.shape[2] * images.shape[3])
    
    return images, labels, labels[index], lam

Практические стратегии

  1. Для маленьких датасетов (< 5000)

    • Сильная аугментация + Transfer Learning
    • Используй предобученные модели
  2. Для средних датасетов (5000-50000)

    • Комбинированная аугментация
    • Fine-tuning последних слоев
  3. Для больших датасетов (> 50000)

    • Легкая аугментация
    • Обучение с нуля или Transfer Learning

Инструменты

  • Albumentations — быстрая и гибкая аугментация
  • imgaug — более простая альтернатива
  • Torchvision transforms — базовые трансформы
  • PyTorch Cutout — для Cutout аугментации

Итоги

Увеличение датасета изображений достигается через:

  • Геометрические трансформации (flip, rotate, crop)
  • Цветовые изменения (brightness, contrast, noise)
  • Передвинутое обучение (transfer learning)
  • Синтез новых данных (GAN, Diffusion)
  • Комбинированные техники (Mixup, CutMix)

Выбор метода зависит от размера и характеристик исходного датасета.

Как будешь увеличивать размер датасета из картинок? | PrepBro