← Назад к вопросам
Как будешь увеличивать размер датасета из картинок?
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
Практические стратегии
-
Для маленьких датасетов (< 5000)
- Сильная аугментация + Transfer Learning
- Используй предобученные модели
-
Для средних датасетов (5000-50000)
- Комбинированная аугментация
- Fine-tuning последних слоев
-
Для больших датасетов (> 50000)
- Легкая аугментация
- Обучение с нуля или Transfer Learning
Инструменты
- Albumentations — быстрая и гибкая аугментация
- imgaug — более простая альтернатива
- Torchvision transforms — базовые трансформы
- PyTorch Cutout — для Cutout аугментации
Итоги
Увеличение датасета изображений достигается через:
- Геометрические трансформации (flip, rotate, crop)
- Цветовые изменения (brightness, contrast, noise)
- Передвинутое обучение (transfer learning)
- Синтез новых данных (GAN, Diffusion)
- Комбинированные техники (Mixup, CutMix)
Выбор метода зависит от размера и характеристик исходного датасета.