Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Введение в Computer Vision

🎯 Цель

После прочтения этой главы:

  • Знаете 5 основных типов задач Computer Vision
  • Можете выбирать подходящие pretrained модели для каждой задачи
  • Знаете необходимые понятия для работы с изображениями/видео
  • Можете планировать CV pipeline, подходящий для domain

Что нужно изучить

  • Типы CV задач — classification, detection, segmentation, OCR, pose, generation
  • Image fundamentals — pixel, channels, color spaces (RGB, BGR, HSV, Grayscale)
  • Image formats — JPEG, PNG, WebP, TIFF
  • Pretrained экосистема для CV — torchvision, timm, MMDetection, Detectron2, Ultralytics
  • Edge cases — rotation, occlusion, lighting, scale

5 основных типов CV задач

1. Image Classification

  • Одно изображение → один label (или несколько label, multi-label)
  • Модель: ResNet, EfficientNet, ViT, ConvNeXt
  • Пример: spam image, тип заболевания, категория товара

2. Object Detection

  • Одно изображение → несколько bounding box + label + confidence
  • Модель: YOLO, Faster R-CNN, DETR
  • Пример: подсчёт автомобилей, угрозы безопасности

3. Semantic / Instance / Panoptic Segmentation

  • Classification на уровне pixel
  • Модель: U-Net, Mask R-CNN, SAM (Segment Anything Model)
  • Пример: medical imaging, satellite analysis

4. OCR (Optical Character Recognition)

  • Изображение → текст
  • Модель: Tesseract, EasyOCR, PaddleOCR, TrOCR
  • Пример: ID карты, документы, receipts

5. Pose / Keypoint Estimation

  • Поиск точек тела человека или объекта
  • Модель: MediaPipe, OpenPose, MMPose
  • Пример: sport analytics, AR фильтры

6. Generative (бонус)

  • Генерация/изменение изображений
  • Модель: Stable Diffusion, DALL-E, ControlNet
  • Пример: marketing assets, design tools

Image fundamentals

Pixel и Channels

RGB rasm (3 channel):
shape = (height, width, 3)
har pixel: [R, G, B] qiymatlari, har biri [0..255] (uint8) yoki [0..1] (float)

Grayscale (1 channel):
shape = (height, width)
har pixel: [0..255] (yorqinlik darajasi)

OpenCV o'qiganda BGR (not RGB)!
PIL/torchvision RGB ishlatadi

Color spaces

SpaceChannelsКогда
RGBRed, Green, BlueDefault display
BGRBlue, Green, RedOpenCV default
GrayscaleЯркостьEdge detection, classification (маленькая)
HSVHue, Saturation, ValueColor-based filtering
YCrCbLuminance, ChromaVideo compression
LABLightness, A, BColor-aware processing

Image formats — когда какой?

FormatLossy?TransparencyUse case
JPEGYesNoPhotos, web (маленькие)
PNGNoYesLogos, screenshots
WebPBothYesWeb (modern, маленькие)
TIFFNo (или Yes)YesPrint, scientific
HEICYesYesiPhone
NPYNoN/AML pipeline (raw arrays)

Основные библиотеки

pip install opencv-python pillow numpy matplotlib
pip install torch torchvision timm
pip install ultralytics                  # YOLO
pip install easyocr paddleocr            # OCR
pip install mediapipe                    # Pose, hand tracking
pip install albumentations               # Augmentation

Примеры кода

Загрузка и инспекция Image

import cv2
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt

# OpenCV (BGR)
img_cv = cv2.imread("photo.jpg")
print(img_cv.shape)         # (H, W, 3)
print(img_cv.dtype)         # uint8
img_rgb = cv2.cvtColor(img_cv, cv2.COLOR_BGR2RGB)

# PIL (RGB)
img_pil = Image.open("photo.jpg")
print(img_pil.size)         # (W, H) — внимание: порядок другой!

# matplotlib (ожидает RGB)
plt.imshow(img_rgb)
plt.axis("off")
plt.show()

Основные операции с изображением

# Resize
resized = cv2.resize(img_cv, (224, 224))

# Crop
cropped = img_cv[100:400, 200:500]  # [y1:y2, x1:x2]

# Rotation
h, w = img_cv.shape[:2]
M = cv2.getRotationMatrix2D((w/2, h/2), angle=45, scale=1.0)
rotated = cv2.warpAffine(img_cv, M, (w, h))

# Flip
flipped = cv2.flip(img_cv, 1)  # 1=horizontal, 0=vertical, -1=both

# Color conversion
gray = cv2.cvtColor(img_cv, cv2.COLOR_BGR2GRAY)
hsv = cv2.cvtColor(img_cv, cv2.COLOR_BGR2HSV)

Выбор CV pipeline — decision tree

Ваша задача?
│
├── "Что это за изображение?"
│   → Image Classification (ResNet/EfficientNet/ViT)
│
├── "Где что на изображении?"
│   → Object Detection (YOLO, Faster R-CNN)
│
├── "Какому объекту принадлежит каждый pixel?"
│   → Segmentation (U-Net, SAM)
│
├── "Какой текст написан на изображении?"
│   → OCR (Tesseract, EasyOCR, PaddleOCR)
│
├── "Нахождение keypoint'ов человека"
│   → Pose Estimation (MediaPipe, OpenPose)
│
└── "Генерация/изменение изображений"
    → Generative (Stable Diffusion)

Backend интеграция — общие паттерны

1. Endpoint загрузки изображения

from fastapi import FastAPI, UploadFile
from PIL import Image
import io

app = FastAPI()

@app.post("/process-image")
async def process_image(file: UploadFile):
    # Validation
    if not file.content_type.startswith("image/"):
        return {"error": "Not an image"}
    
    # Read
    contents = await file.read()
    img = Image.open(io.BytesIO(contents)).convert("RGB")
    
    # Validate size
    if img.size[0] > 4000 or img.size[1] > 4000:
        return {"error": "Image too large"}
    
    # Process (CV pipeline)
    # ...
    
    return {"status": "ok", "size": img.size}

2. Загрузка изображения по URL

import httpx
from PIL import Image
import io

@app.post("/process-url")
async def process_url(url: str):
    async with httpx.AsyncClient(timeout=10) as client:
        response = await client.get(url)
    
    img = Image.open(io.BytesIO(response.content)).convert("RGB")
    # ...

3. Stream/Video processing

import cv2

def process_video(video_path: str, output_path: str):
    cap = cv2.VideoCapture(video_path)
    fps = cap.get(cv2.CAP_PROP_FPS)
    w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    
    out = cv2.VideoWriter(output_path, cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))
    
    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            break
        
        # Apply model
        processed = some_model_inference(frame)
        out.write(processed)
    
    cap.release()
    out.release()

4. Async processing (Celery)

@celery_app.task
def process_image_async(image_path: str):
    img = cv2.imread(image_path)
    
    # Heavy processing
    result = run_yolo(img)
    
    # Save result
    output_path = image_path.replace(".jpg", "_processed.jpg")
    cv2.imwrite(output_path, result)
    
    return {"output": output_path}

@app.post("/process-async")
async def process_async(file: UploadFile):
    # Save uploaded file
    path = f"/tmp/{uuid.uuid4()}.jpg"
    with open(path, "wb") as f:
        f.write(await file.read())
    
    # Queue task
    task = process_image_async.delay(path)
    return {"task_id": task.id}

Ресурсы

  • PyImageSearchpyimagesearch.com — лучший CV блог
  • OpenCV docsdocs.opencv.org
  • CS231n(Stanford) — теория CV
  • Roboflow — datasets и training (no-code)
  • MMDetection / Detectron2 — production-grade detection frameworks
  • HuggingFace Vision — pretrained vision models

🏋️ Упражнения

🟢 Easy

  1. Загрузите изображение (OpenCV и PIL), выведите shape и format.
  2. Преобразуйте RGB → Grayscale, RGB → HSV и визуализируйте.
  3. Сделайте resize изображения до 224x224 и сохраните.

🟡 Medium

  1. Image gallery API: в FastAPI image upload, создание thumbnail (200x200), получение EXIF metadata.
  2. Color analysis: найдите доминантные цвета в изображении через K-Means (из Месяца 2).
  3. Pretrained classifier: top-5 prediction для изображения через модель torchvision.

🔴 Hard

  1. CV Pipeline Service: FastAPI + Celery + Redis. Endpoint’ы:
  • Upload image
  • Resize / convert format
  • Apply pretrained model (classification/detection)
  • Async с webhook callback
  1. Real-time webcam: FastAPI WebSocket + browser webcam → на сервере YOLO → возврат bounding box JSON.

Capstone

notebooks/month-04/01_cv_intro.ipynb:

  • Загрузите custom dataset (200+ изображений) или возьмите с Kaggle
  • Примените 5 разных CV задач к одному dataset:
  • Classification (pretrained)
  • Detection (YOLO)
  • Segmentation (SAM)
  • OCR (на изображениях с текстом)
  • Pose (на изображениях с людьми)

✅ Чек-лист

  • Знаю 5+ основных задач CV
  • Знаю разницу между Image formats и color spaces
  • Знаю разницу между OpenCV и PIL
  • Знаю, когда какую pretrained модель выбрать
  • Могу планировать async image processing pipeline

Переходим к Работа с OpenCV.