AI Super-Resolution — апскейл изображений
Мы постоянно сталкиваемся с задачей: дать клиенту максимальную детализацию из исходного изображения низкого разрешения. Бикубическая интерполяция даёт 4x апскейл, но картинка остаётся размытой, теряются текстуры. AI сверхразрешение (Super-resolution) с использованием Real-ESRGAN и GFPGAN решает это: восстанавливает волосы, текст на вывесках, структуру ткани. Разница видна невооружённым глазом и в цифрах: PSNR бикубика — 28–30 dB, Real-ESRGAN — 32–36 dB на фотографиях. При этом современные модели обучены на синтетических деградациях, что даёт устойчивость к реальным шумам и сжатию.
Для коммерческих проектов выбор модели определяет не только качество, но и скорость инференса. Клиенты часто приходят со старыми архивами, где разрешение не превышает 480p, и хотят получить 4K для печати. Мы подбираем конфигурацию так, чтобы уложиться в разумный бюджет: сохраняя баланс между детализацией и временем обработки.
Например, для клиента из сферы e-commerce мы обработали 50 000 изображений товаров: после апскейла конверсия выросла на 15% благодаря лучшей детализации. Стоимость интеграции готового решения значительно ниже разработки с нуля: в среднем наши клиенты экономят 60–80% бюджета.
Как мы реализуем апскейл для ваших задач?
Мы подбираем модель под конкретный домен: для портретов — связка Real-ESRGAN + GFPGAN, для архитектуры — чистый Real-ESRGAN, для аниме/арта — специализированная версия с аниме-весами. Всё заворачиваем в API-сервис, который легко интегрируется в ваш пайплайн. Используем тайловый инференс для обработки изображений любых размеров без OOM.
Как настроить пайплайн апскейла
- Установите зависимости:
pip install basicsr realesrgan gfpgan.
- Скачайте предобученные веса Real-ESRGAN_x4plus.pth и GFPGANv1.4.pth.
- Запустите инференс на одном изображении: используйте пример кода ниже для проверки. Затем масштабируйте на батч с помощью
DataLoader.
Real-ESRGAN — практический стандарт
import torch
import numpy as np
from PIL import Image
from basicsr.archs.rrdbnet_arch import RRDBNet
from realesrgan import RealESRGANer
def upscale_image(
image_path: str,
scale: int = 4,
model_name: str = 'RealESRGAN_x4plus', # или 'RealESRGAN_x4plus_anime_6B'
tile_size: int = 512, # для больших изображений — обработка тайлами
half_precision: bool = True
) -> np.ndarray:
"""
tile_size=512 при VRAM 6GB, tile_size=0 (whole image) при VRAM 24GB.
half=True — FP16, экономит ~50% VRAM.
"""
model = RRDBNet(
num_in_ch=3, num_out_ch=3,
num_feat=64, num_block=23, num_grow_ch=32,
scale=scale
)
upsampler = RealESRGANer(
scale=scale,
model_path=f'weights/{model_name}.pth',
model=model,
tile=tile_size,
tile_pad=10, # перекрытие тайлов для сглаживания швов
pre_pad=0,
half=half_precision,
device='cuda'
)
img = np.array(Image.open(image_path).convert('RGB'))
output, _ = upsampler.enhance(img, outscale=scale)
return output
GFPGAN для восстановления лиц
Real-ESRGAN на портретах иногда создаёт артефакты на лице. GFPGAN добавляет face restoration поверх SR:
from gfpgan import GFPGANer
def restore_face_photo(
degraded_image: np.ndarray,
upscale: int = 2,
arch: str = 'clean', # 'clean' | 'RestoreFormer'
channel_multiplier: int = 2,
weight: float = 0.5 # 0=чистый GFPGAN, 1=без face enhancement
) -> np.ndarray:
"""
weight=0.5 — компромисс между восстановлением и сохранением
индивидуальных черт. При weight=0 лица «глянцевые».
"""
restorer = GFPGANer(
model_path='weights/GFPGANv1.4.pth',
upscale=upscale,
arch=arch,
channel_multiplier=channel_multiplier,
bg_upsampler=None # можно передать RealESRGANer для фона
)
_, _, restored = restorer.enhance(
degraded_image,
has_aligned=False,
only_center_face=False,
paste_back=True,
weight=weight
)
return restored
Почему Real-ESRGAN — стандарт индустрии?
Модель обучена на реалистичных данных с синтетическими деградациями (шум, размытие, сжатие), поэтому хорошо работает с реальными фото. Комбинируем с GFPGAN для лиц — получаем детализированный результат без артефактов. Наш опыт показывает: для 90% коммерческих задач эта связка оптимальна по соотношению качество/скорость. Кроме того, Wang et al., "Real-ESRGAN: Training Real-World Blind Super-Resolution with Pure Synthetic Data" подтверждает её эффективность на бенчмарках.
Метрики и сравнение моделей
| Модель |
PSNR (Set5 4x) |
SSIM |
Скорость 1080p→4K |
Применение |
| Bicubic |
28.42 |
0.810 |
Мгновенно |
Baseline |
| SRCNN |
30.48 |
0.862 |
Fast |
Устаревший |
| ESRGAN |
32.73 |
0.901 |
~2s RTX3080 |
Фото |
| Real-ESRGAN x4+ |
33.98 |
0.918 |
~3s RTX3080 |
Фото, текст |
| SwinIR-L |
34.97 |
0.932 |
~8s RTX3080 |
Максимум качества |
| GFPGAN v1.4 |
— |
— |
~4s RTX3080 |
Портреты |
PSNR — не единственный критерий: человеческое восприятие коррелирует с LPIPS (perceptual loss). Real-ESRGAN при PSNR ниже SwinIR часто выглядит лучше субъективно из-за более высокочастотных деталей.
Батчевая обработка больших объёмов
from pathlib import Path
import torch
from torch.utils.data import DataLoader, Dataset
from torchvision import transforms
class ImageDataset(Dataset):
def __init__(self, image_paths: list[str], size: int = 256):
self.paths = image_paths
self.transform = transforms.Compose([
transforms.Resize((size, size)),
transforms.ToTensor()
])
def __len__(self): return len(self.paths)
def __getitem__(self, idx):
img = Image.open(self.paths[idx]).convert('RGB')
return self.transform(img), self.paths[idx]
def batch_upscale_pipeline(
input_dir: str,
output_dir: str,
batch_size: int = 4, # при VRAM 12GB и tile_size=0
scale: int = 4
):
paths = list(Path(input_dir).glob('*.{jpg,jpeg,png}'))
Path(output_dir).mkdir(exist_ok=True)
# Для батч-инференса используем прямой forward
# (RealESRGANer не поддерживает батчи, нужен прямой вызов модели)
model = RRDBNet(
num_in_ch=3, num_out_ch=3,
num_feat=64, num_block=23, num_grow_ch=32, scale=scale
)
model.load_state_dict(
torch.load(f'weights/RealESRGAN_x4plus.pth')['params_ema']
)
model.eval().cuda().half()
for path in paths:
with torch.no_grad(), torch.cuda.amp.autocast():
img_t = transforms.ToTensor()(
Image.open(path).convert('RGB')
).unsqueeze(0).half().cuda()
out = model(img_t).squeeze(0).float().cpu()
out_img = transforms.ToPILImage()(out.clamp(0, 1))
out_img.save(
Path(output_dir) / (Path(path).stem + '_4x.png')
)
Ограничения и типичные проблемы
-
Галлюцинации текстур — Real-ESRGAN может добавить несуществующий текст на вывесках. На forensics-применениях это недопустимо
-
OOM на больших изображениях — 12-мегапиксельное фото при 4x апскейл = 192Мп, не лезет в память целиком. Решение:
tile_size=512 с tile_pad=10
-
JPEG-артефакты — блочность артефактов JPEG усиливается SR. Предобработка: JPEG-aware денойзинг (nf_denoise из BasicSR)
Как мы решаем проблему галлюцинаций
Для критичных сценариев (медицинские снимки, документы) мы добавляем пост-валидацию: сравниваем с оригиналом по LPIPS и отбраковываем ненадёжные пиксели. Также используем дообучение на специфическом домене, что резко снижает процент артефактов.
Что входит в реализацию под ключ
Мы предоставляем: рабочее API на FastAPI с документацией (Swagger), Docker-образ для лёгкого деплоя, инструкцию по настройке GPU-инференса, benchmark ваших данных, поддержку в течение месяца после сдачи. При необходимости — обучение команды заказчика. Гарантируем стабильную работу и оптимизацию под ваше железо. Стоимость обработки одного изображения в батчевом режиме составляет от $0.002 до $0.02 в зависимости от размера и модели. Закажите пилотный проект, чтобы оценить прирост качества на своих данных. Получите консультацию — свяжитесь с нами.
Сроки
| Задача |
Срок |
| API-сервис SR (Real-ESRGAN) |
1–2 недели |
| Fine-tuning на специфический домен |
4–6 недель |
| Кастомная SR-модель с нуля |
10–16 недель |
Экономия бюджета при выборе готовой модели вместо разработки с нуля может достигать 4–6 раз. Оценим ваш проект бесплатно — свяжитесь с нами. Имеем 5+ лет опыта в computer vision, десятки успешных интеграций.
Как distribution shift убивает метрики CV-модели в промышленности
На производстве ставят камеру, контролируют качество продукции. Модель обучена на 10 000 размеченных изображений — точность на тесте mAP 0.84. Запускают в продакшен — и в первую же неделю пропускают 30 % дефектов. Освещение на линии меняется по сменам, distribution shift обнуляет метрики. Это классическая история с Computer Vision в промышленности, где распознавание образов даёт сбой без правильной обработки дрейфа.
Наши инженеры с опытом 60+ проектов по компьютерному зрению знают, как исключить такие сценарии. Гарантируем стабильную работу модели под реальными условиями.
Детекция объектов: YOLO, RT‑DETR и всё что между ними
YOLO — стандарт для real‑time детекции. YOLOv8 и YOLOv11 от Ultralytics — наиболее используемые версии в производстве: простой API, активное сообщество, встроенная валидация и экспорт в ONNX/TensorRT. Для задач с высокими требованиями к точности и когда latency менее критична — RT‑DETR, transformer‑based архитектура без NMS, даёт лучший mAP на COCO при сравнимой скорости с YOLOv8l.
| Архитектура |
mAP на COCO (val2017) |
FPS (A10G, FP16) |
Сложность деплоя |
| YOLOv8n |
37.3 |
700+ |
Низкая (ONNX/TensorRT) |
| YOLOv8m |
50.2 |
250 |
Низкая |
| RT‑DETR-L |
53.0 |
140 |
Средняя (требует PyTorch) |
| Mask R‑CNN |
38.2 (bbox) |
30 |
Высокая |
Типичная ошибка при обучении детектора: датасет 8000 изображений, 3 класса, fine‑tune YOLOv8m — F1 0.73 на валидации. Смотрим confusion matrix — один класс почти никогда не детектируется. Причина: дисбаланс 1:23. Решение: oversampling редкого класса, focal loss для objectness, аугментации (Mosaic, MixUp отключить для редкого класса — они его «размывают»). Transfer learning обязателен: предобученные на COCO веса сокращают потребность в данных в 10 раз. Fine‑tune на 500–2000 доменных изображениях даёт рабочую модель за 1–2 дня на одной GPU.
Для edge deployment: экспорт в ONNX → TensorRT engine. YOLOv8n в TensorRT FP16 на Jetson AGX Orin даёт 150+ FPS при P99 latency < 8 ms — это в 3 раза быстрее, чем ONNX Runtime без TensorRT. На сервере A10G: 700+ FPS для YOLOv8n в TensorRT INT8.
Как fine‑tuning YOLO помогает в распознавании образов?
Допустим, нужно находить микродефекты на поверхности металла — задача с высоким разрешением и перекосом классов. Используем YOLOv8m, предобученный на COCO (документация Ultralytics), и дообучаем на 2000 собственных изображений. Применяем аугментации Mosaic, MixUp, random perspective. После 200 эпох mAP 0.5 достигает 0.93. Ключевые приёмы:
-
focal loss для objectness головы — уменьшает вклад легко классифицируемых примеров.
-
class‑balanced sampling — выравнивает представительство редких классов.
-
Test Time Augmentation (TTA) — повышает recall на 5–7 % за счёт усреднения по флипам и масштабам.
Получите консультацию по подбору архитектуры для вашей задачи — свяжитесь с нами.
Сегментация: SAM, Mask R‑CNN и instance segmentation
SAM (Segment Anything Model) от Meta изменил подход к сегментации. SAM 2 работает с видео, поддерживает трекинг объектов через кадры — для интерактивного выделения объекта по точке или bbox это лучший выбор из коробки. Для production instance segmentation без интерактивного промпта — Mask R‑CNN или YOLOv8‑seg. YOLOv8‑seg обучается как обычный детектор с дополнительными масками, удобен в тех же пайплайнах. Семантическая сегментация (каждый пиксель — класс) — SegFormer, DeepLabV3+. SegFormer‑B5 даёт хороший баланс точности и скорости для анализа спутниковых снимков или медицинской сегментации.
Кейс: сегментация клеток на микроскопических изображениях. Датасет 400 изображений с ручной разметкой. Обучение Mask R‑CNN на ResNet‑50 backbone дало IoU 0.61 — плохо. Проблема: объекты (клетки) перекрываются, стандартный NMS убивает перекрывающиеся предсказания. Решение: переход на cellpose (специализированная архитектура для биомедицинских задач) + soft‑NMS. IoU вырос до 0.79.
OCR: когда Tesseract не справляется
Tesseract — отправная точка для простых задач: печатный текст, хорошее освещение, ровное расположение. Как только появляются рукописные элементы, нестандартные шрифты, перспективные искажения или многоколоночный макет — Tesseract деградирует быстро.
PaddleOCR — production‑grade решение: обнаружение текстовых блоков + распознавание + структурный анализ. Работает из коробки для 80+ языков, включая русский. Поддерживает таблицы и документы со сложной структурой. Wikipedia: Оптическое распознавание символов. TrOCR (Microsoft) — трансформерный OCR с сильными результатами на рукописном тексте. Для русского рукописного текста нужен fine‑tuning: базовая модель обучена преимущественно на латинице.
Что делать, если Tesseract не справляется с распознаванием образов на документах?
Для задач «извлеки данные из счёта / договора / паспорта» используем LayoutLMv3 или Donut — эти модели понимают layout документа, а не только текст. Интеграция через Hugging Face Transformers, fine‑tuning на 200–500 размеченных документах. Типичный pipeline:
- Preprocessing: deskew, denoising, binarization через OpenCV.
- Обнаружение текстовых блоков: PaddleOCR detection или CRAFT.
- Распознавание: PaddleOCR recognition или TrOCR.
- Post‑processing: нормализация, валидация через regex или LLM для структурированных полей.
Для документов с фиксированной структурой template matching + OCR точечно по координатам зачастую надёжнее end‑to‑end решения.
Face Recognition: идентификация и верификация
Face recognition = detection + alignment + embedding + matching. Каждый этап важен.
Detection: RetinaFace или InsightFace для точной локализации лица и ключевых точек. MTCNN — более старое, но надёжное решение. Embedding: ArcFace (InsightFace) — state‑of‑the‑art для face recognition embeddings. Модели iresnet50/iresnet100 предобучены на MS1MV3 (5M идентичностей). Эмбеддинг‑вектор 512 float32, сравнение по cosine similarity. Threshold tuning: порог решения — критический параметр. При threshold 0.6 типичный FPR на LFW benchmark — 0.001, TPR — 0.985. В production threshold нужно калибровать под реальный distribution: люди в масках, с изменившейся внешностью, в разных условиях освещения. Liveness detection обязателен: MiniFASNet — lightweight модель на CPU, FaceX‑Zoo содержит несколько предобученных liveness‑детекторов.
Видеоаналитика
Видео — последовательность кадров плюс временное измерение. Наивный подход — детектировать на каждом кадре — дорого.
Трекинг: ByteTrack и BoT‑SORT — стандарт для multi‑object tracking. Работают поверх любого детектора, добавляют persistent ID объектам между кадрами — это даёт подсчёт объектов, треки движения, velocity.
Оптимизация: не нужно обрабатывать каждый кадр. Для статичных сцен детекция на каждом 5–10 кадре, между ними — трекер. Для детекции событий (человек вошёл в зону) background subtraction (OpenCV MOG2) как lightweight pre‑filter перед нейросетевой детекцией. Action Recognition: SlowFast, VideoMAE для классификации действий. Тяжёлые модели — для production используем ONNX export + TensorRT либо оффлайн обработку.
Как измерить качество модели распознавания образов в продакшене?
Мониторинг качества — ключевой элемент MLOps. Отслеживаем:
- распределение prediction confidence;
- долю low‑confidence предсказаний (индикатор OOD‑данных);
- дрейф входных изображений через feature distribution (embeddings из backbone).
Падение средней confidence с 0.87 до 0.71 за неделю — ранний сигнал о distribution shift. NVIDIA Triton Inference Server рекомендует отслеживать эти метрики через Prometheus. Наши сертифицированные инженеры настраивают мониторинг и гарантируют SLA по качеству инференса.
Деплой CV‑моделей
Для онлайн инференса используем Triton Inference Server (NVIDIA) — production‑стандарт для serving CV‑моделей. Поддерживает TensorRT, ONNX, PyTorch, dynamic batching, multiple instances. REST и gRPC API. Гарантируем стабильную работу под нагрузкой.
Edge deployment: ONNX Runtime на ARM/x86 CPU. TensorFlow Lite для мобильных устройств. OpenVINO для Intel CPU/GPU/VPU — даёт 2–3× прирост скорости на Intel железе по сравнению с ONNX Runtime. После деплоя передаём модель с документацией и обучаем персонал.
Что входит в работу
| Этап |
Содержание |
Ориентировочный срок |
| Анализ |
Техническое задание, подбор архитектуры, оценка данных |
3–5 дней |
| Разметка |
Сбор изображений, аннотирование (до 5000 объектов) |
1–3 недели |
| Обучение |
Fine‑tuning модели, валидация на тестовой выборке |
1–2 недели |
| Оптимизация |
Экспорт в ONNX/TensorRT/OpenVINO, тестирование на целевом железе |
1–2 недели |
| Интеграция |
REST/gRPC API, интеграция с существующей инфраструктурой |
1–2 недели |
| Деплой |
Развёртывание на сервере или edge‑устройстве, нагрузочное тестирование |
1 неделя |
| Документация и обучение |
Инструкции, обучение персонала, передача кода и модели |
3–5 дней |
| Поддержка |
Техническая поддержка на 3 месяца после запуска |
— |
Сроки и стоимость
Прототип детектора на существующих данных — 1–2 недели. Production‑система с оптимизацией под целевое железо — 4–8 недель. Полный цикл включая разметку данных (1000–5000 изображений) — 2–4 месяца. Стоимость рассчитывается индивидуально под каждую задачу. Примерная экономия от внедрения системы контроля качества — до 1 млн рублей в месяц на одном производственном участке.
Мы на рынке более 5 лет, реализовали 60+ проектов по компьютерному зрению. Оценим ваш проект под ключ — закажите консультацию, чтобы получить расчёт и техническое предложение.