Компьютерное зрение (Computer Vision): полный курс — от OpenCV до YOLO, SAM и генеративных моделей
Компьютерное зрение — это область ИИ, которая учит машины «видеть»: понимать, что изображено на картинке или в видео, находить объекты, распознавать лица, оценивать глубину сцены и даже генерировать новые изображения.
Этот материал — структурированный роадмап по Computer Vision: от базовой обработки изображений до современных генеративных моделей. Курс построен по принципу «теория → фреймворк → проект», и каждый блок закрепляется практикой на OpenCV, PyTorch, YOLO, SAM и Stable Diffusion.
Оглавление
- Введение в CV: задачи, история, области применения
- CV Pipeline: как устроен конвейер обработки
- Основы обработки изображений: фильтры, преобразования, гистограммы
- OpenCV basics — практическая библиотека
- CNN: свёрточные нейронные сети
- PyTorch CNN tutorial — реализация на практике
- Классификация изображений: AlexNet, VGG, ResNet, EfficientNet
- ResNet from scratch
- Object Detection: R-CNN, YOLO, SSD
- YOLOv8 — практический фреймворк
- Semantic Segmentation: FCN, U-Net, DeepLab
- Проект: сегментация с SAM
- Instance Segmentation: Mask R-CNN, YOLACT
- Detectron2 — инструмент от Meta
- Face Recognition: FaceNet, ArcFace, DeepFace
- Видеоанализ: трекинг, оптический поток, action recognition
- 3D Vision: stereo, depth, point clouds, NeRF
- Open3D — библиотека 3D-зрения
- Итоговый роадмап и куда двигаться дальше
- Бонус: ROS2-пакет yolo_ros2_demo
1. Введение в CV
Компьютерное зрение (Computer Vision, CV) — дисциплина на стыке ИИ, математики и обработки сигналов. Она решает задачу извлечения семантической информации из визуальных данных: пикселей (изображения) и их последовательностей (видео).
Ключевые задачи CV:
| Задача | Что делает | Пример выхода |
|---|---|---|
| Классификация | Определяет класс объекта на изображении | «кот» |
| Детекция | Находит объекты и ограничивающие рамки | [кот, x1,y1,x2,y2] |
| Сегментация | Классифицирует каждый пиксель | маска объекта |
| Распознавание лиц | Идентифицирует/верифицирует человека | person_id |
| Оценка позы | Находит суставы скелета | keypoints |
| Генерация | Создаёт новые изображения | исходный файл |
Области применения: беспилотные автомобили, медицинская диагностика, промышленный контроль качества, ритейл (аналитика полки), безопасность, AR/VR, робототехника, дополненная реальность на маркетплейсах.
История (кратко):
- 1960-е — первые эксперименты, «летний проект» MIT по зрению.
- 1999–2010 — эпоха классических методов: SIFT, HOG, каскады Хаара.
- 2012 — AlexNet побеждает на ImageNet → революция глубокого обучения.
- 2015 — ResNet, 2015+ — рост детекторов (YOLO, SSD).
- 2020-е — ViT (Vision Transformers), SAM, диффузионные модели (Stable Diffusion), мультимодальность (CLIP).
2. CV Pipeline
Типичный конвейер CV-системы:
- Захват данных — камера, видео, датасет.
- Препроцессинг — resize, нормализация, denoising, аугментация.
- Извлечение признаков — ручное (классика) или обучаемое (CNN).
- Модель — классификация / детекция / сегментация.
- Постпроцессинг — NMS, фильтрация по порогу, трекинг.
- Принятие решения / вывод — бизнес-логика, API, визуализация.
Понимание пайплайна критично: большинство реальных ошибок — не в модели, а в данных и препроцессинге.
3. Основы обработки изображений
Фундамент, без которого не понять нейросети.
- Представление изображения: матрица пикселей (H×W×C), каналы BGR/RGB, градации серого.
- Фильтры: размытие (Gaussian, median), повышение резкости, края (Sobel, Canny).
- Преобразования: resize, поворот, аффинные и перспективные преобразования, кроп.
- Цветовые пространства: RGB, HSV, LAB — важны для пороговых методов.
- Гистограммы: распределение яркости, эквализация (выравнивание контраста), CLAHE.
- Морфология: эрозия, дилатация, открытие/закрытие — чистка масок.
Это база для препроцессинга и для классических пайплайнов.
4. OpenCV basics
OpenCV — де-факто стандарт для обработки изображений.
import cv2
img = cv2.imread("image.jpg") # чтение
img = cv2.resize(img, (640, 640)) # resize
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # в серый
blur = cv2.GaussianBlur(gray, (5, 5), 0) # размытие
edges = cv2.Canny(blur, 100, 200) # края
cv2.imshow("edges", edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
Ключевые модули: imgproc (обработка), videoio (видео), dnn (запуск нейросетей), features2d (признаки).
5. CNN: свёрточные нейронные сети
CNN — основа современного CV. Ключевая идея — разделение весов и локальность: свёрточный фильтр (ядро) скользит по изображению, извлекая локальные признаки.
Компоненты слоя:
- Convolution — свёртка ядром (K×K), stride, padding.
- Padding — сохранение размера (same) или уменьшение (valid).
- Pooling — max/average — уменьшает размерность, даёт инвариантность.
- Activation — ReLU и др., вносит нелинейность.
- BatchNorm — стабилизирует обучение.
Формула выходного размера:
out = floor((W - K + 2P) / S) + 1
где W — размер входа, K — ядро, P — padding, S — stride.
Иерархия признаков: нижние слои — края и текстуры, средние — части объектов, верхние — целые объекты.
6. PyTorch CNN tutorial
Практика на PyTorch: собираем простую CNN для классификации.
import torch
import torch.nn as nn
class SimpleCNN(nn.Module):
def __init__(self, num_classes=10):
super().__init__()
self.features = nn.Sequential(
nn.Conv2d(3, 32, 3, padding=1), nn.ReLU(), nn.MaxPool2d(2),
nn.Conv2d(32, 64, 3, padding=1), nn.ReLU(), nn.MaxPool2d(2),
nn.Conv2d(64, 128, 3, padding=1), nn.ReLU(), nn.MaxPool2d(2),
)
self.classifier = nn.Sequential(
nn.AdaptiveAvgPool2d(1), nn.Flatten(),
nn.Linear(128, num_classes),
)
def forward(self, x):
return self.classifier(self.features(x))
Типовой цикл обучения: DataLoader → forward → loss (CrossEntropy) → backward → optimizer.step().
7. Классификация изображений
Эволюция архитектур — гонка за точностью и эффективностью.
- AlexNet (2012) — прорыв, показал силу глубоких CNN + ReLU + dropout.
- VGG (2014) — глубина за счёт однотипных блоков 3×3 (16–19 слоёв), но тяжеловесна.
- ResNet (2015) — skip-connections решили проблему затухающих градиентов, позволили 50–152+ слоёв.
- EfficientNet (2019) — масштабирование ширины/глубины/разрешения через compound scaling, лучший баланс точность/размер.
Практический подход: не обучать с нуля, а использовать transfer learning — берём предобученную модель и дообучаем на своей задаче.
8. ResNet from scratch
Residual-блок — ядро ResNet:
class ResidualBlock(nn.Module):
def __init__(self, ch):
super().__init__()
self.conv1 = nn.Conv2d(ch, ch, 3, padding=1)
self.bn1 = nn.BatchNorm2d(ch)
self.conv2 = nn.Conv2d(ch, ch, 3, padding=1)
self.bn2 = nn.BatchNorm2d(ch)
self.relu = nn.ReLU()
def forward(self, x):
identity = x
out = self.relu(self.bn1(self.conv1(x)))
out = self.bn2(self.conv2(out))
out = out + identity # skip connection
return self.relu(out)
Реализация «с нуля» отлично тренирует понимание того, почему skip-connections работают.
9. Object Detection
Детекция = классификация + локализация (bounding box).
- R-CNN (2014) — регионы-кандидаты + CNN, точная но медленная.
- Fast/Faster R-CNN — RoI Pooling, Region Proposal Network → real-time.
- YOLO (2016) — «You Only Look Once»: один проход сети, очень быстрая. Ставка на скорость.
- SSD — multi-scale anchors, хороший баланс скорость/точность.
Ключевые понятия: anchor boxes, IoU, NMS (non-max suppression), метрики mAP@0.5 и mAP@0.5:0.95, precision/recall.
10. YOLOv8
Современный стандарт для детекции и не только (детекция, сегментация, поза, классификация).
from ultralytics import YOLO
model = YOLO("yolov8n.pt") # nano-версия
results = model("image.jpg") # inference
results[0].show() # визуализация
# обучение на своём датасете
model.train(data="data.yaml", epochs=50, imgsz=640)
Размеры: n/s/m/l/x — от быстрой к точной. Отличная стартовая точка для продакшена.
11. Semantic Segmentation
Попиксельная классификация — каждый пиксель получает класс.
- FCN (2015) — заменил полносвязные слои свёртками, end-to-end сегментация.
- U-Net (2015) — encoder-decoder со skip-connections, стандарт для медицины.
- DeepLab — atrous (dilated) свёртки + ASPP, работа с многомасштабностью.
Метрики: IoU (Jaccard), Dice coefficient, pixel accuracy.
12. Сегментация с SAM
SAM (Segment Anything Model, Meta, 2023) — модель, которая сегментирует любой объект по подсказке (точка, бокс, текст-промпт), без дообучения. Построена на огромном датасете SA-1B (1 млрд масок).
from segment_anything import SamPredictor, sam_model_registry
sam = sam_model_registry["vit_h"](checkpoint="sam_vit_h.pth")
predictor = SamPredictor(sam)
predictor.set_image(image)
masks, scores, logits = predictor.predict(point_coords=[[500, 375]],
point_labels=[1])
SAM совершил революцию в «универсальной» сегментации и стал базой для многих инструментов.
13. Instance Segmentation
Отделяет каждый экземпляр объекта, даже одного класса.
- Mask R-CNN (2017) — Faster R-CNN + ветка маски (RoIAlign). Эталон качества.
- YOLACT — real-time instance segmentation через прототипы масок.
Применения: подсчёт объектов, ритейл, медицинская микроскопия.
14. Detectron2
Detectron2 (Meta AI) — мощный фреймворк для детекции и сегментации: Mask R-CNN, RetinaNet, Faster R-CNN «из коробки», удобный тренер и конфиги.
from detectron2.engine import DefaultPredictor
from detectron2.config import get_cfg
cfg = get_cfg()
cfg.merge_from_file("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml")
cfg.MODEL.WEIGHTS = "model_final.pth"
predictor = DefaultPredictor(cfg)
outputs = predictor(image)
15. Face Recognition
Идентификация («кто это?») и верификация («это один и тот же человек?»).
- FaceNet (2015) — триплет-лосс, эмбеддинги лиц в общее пространство.
- ArcFace (2019) — additive angular margin loss, SOTA-точность.
- RetinaFace — детекция лиц и landmarks.
DeepFace — удобная обёртка: FaceNet, ArcFace, VGG-Face, Dlib.
from deepface import DeepFace
result = DeepFace.verify("img1.jpg", "img2.jpg", model_name="ArcFace")
df = DeepFace.find("target.jpg", db_path="faces_db/", model_name="ArcFace")
16. Видеоанализ
Работа с временной осью.
- Трекинг объектов — сопоставление объектов между кадрами:
- SORT / DeepSORT / ByteTrack — трекинг + ассоциация.
- OpenCV:
cv2.TrackerCSRT,cv2.TrackerKCF. - Оптический поток — движение пикселей: Lucas-Kanade (sparse), Farneback (dense).
- Action Recognition — распознавание действий: 3D-CNN (I3D), Two-Stream, SlowFast, видео-трансформеры (ViViT, TimeSformer).
17. 3D Vision
Восстановление трёхмерной структуры сцены.
- Stereo vision — карта глубины из двух камер (stereo matching).
- Depth estimation — монокулярная оценка глубины (MiDaS, DPT).
- Point clouds — облака точек (LiDAR), регистрация, фильтрация.
- NeRF (2020) — нейронные поля: представление сцены как непрерывной функции, реконструкция и novel view synthesis.
- 3D Gaussian Splatting (2023) — быстрая альтернатива NeRF.
18. Open3D
Библиотека для 3D-данных: облака точек, меши, регистрация, визуализация.
import open3d as o3d
pcd = o3d.io.read_point_cloud("scene.ply")
pcd = pcd.voxel_down_sample(0.05) # прореживание
pcd.estimate_normals()
o3d.visualization.draw_geometries([pcd]) # визуализация
19. Итоговый роадмап
Путь обучения (последовательный):
- База: OpenCV → обработка изображений → гистограммы, фильтры.
- Глубокое обучение: PyTorch → CNN → классификация (ResNet/EfficientNet).
- Детекция: YOLO/SSD → обучение на своём датасете.
- Сегментация: U-Net → SAM → Mask R-CNN.
- Прикладное: Face Recognition, видеоанализ (DeepSORT/ByteTrack).
- Продвинутое: 3D (Open3D, NeRF), генеративные модели (Stable Diffusion, диффузия).
- Мультимодальность: CLIP, ViT, VLM (vision-language models).
Советы:
- Начинайте с готовых решений (transfer learning, YOLOv8, DeepFace) — быстрый результат.
- Сначала данные, потом модели: качество датасета важнее архитектуры.
- Держите практику: каждый блок — мини-проект.
- Для продакшена следите за latency, размером модели (ONNX, TensorRT, квантование).
20. Бонус: ROS2-пакет
Готовый пакет yolo_ros2_demo для интеграции YOLO в ROS2 — с setup.py, launch-файлами и requirements.txt — собран как отдельный демо-репозиторий (см. материал «yolo_ros2_demo»). Он подписывается на ROS2-топик с изображением, запускает YOLOv8 и публикует результаты детекции + аннотированное изображение.
Итог: Computer Vision сегодня — это не только классические CNN, но и трансформеры, диффузионные и мультимодальные модели. Начните с базы (OpenCV + CNN), закрепите детекцией и сегментацией, а затем двигайтесь к генерации и 3D. Такой роадмап даёт крепкий фундамент и выход на самые актуальные направления.
Материал подготовлен по программе курса «Computer Vision» на ASI Biont.
Комментарии