Розробка AI-стабілізації відео
Тремтіння камери — неминучий артефакт зйомки з рук, дронів або екшн-камер. Класична стабілізація зображення через оптичний потік (optical flow) оцінює рух між кадрами, згладжує траєкторію та компенсує тремтіння. Але на динамічних сценах зі швидким рухом або rolling shutter класика часто дає збої: з'являються геометричні спотворення, втрачається різкість. Уявіть: ви знімаєте гонку дронів або трейл-біг — на кожному другому кадрі розмиття, а кроп з'їдає 20% корисної площі. Ми пропонуємо AI-стабілізацію на основі deep learning, яка обробляє відео семантично — відрізняє рух оператора від руху об'єкта та відновлює викадровані пікселі через inpainting. Наша команда реалізувала понад 30 проєктів зі стабілізації для дронів, екшн-камер і трансляцій. Оцінимо ваш кейс під ключ — зв'яжіться з нами для отримання безкоштовної консультації.
Згідно з документацією OpenCV, класичний стабілізатор потребує кропу до 20% кадру.
Проблеми, які вирішуємо
Наші клієнти часто стикаються з:
- Тряска в датасетах для навчання нейромереж: для object detection і tracking потрібен чистий фон. AI-стабілізація прибирає тремтіння, не вносячи шуму.
- Rolling shutter і розмиття: DUT використовує вікна кадрів для передбачення, що знижує ефект розмиття.
- Кроп кадру: AI-методи зберігають до 95% площі кадру проти 80% у OpenCV, що особливо важливо при постобробці.
Як AI покращує стабілізацію порівняно з класикою?
Класичний optical flow (OpenCV VideoStabilizer) працює добре на статичних сценах з повільним рухом. Але на швидких переміщеннях або при зйомці з дрона він втрачає треки, вносить тремтіння та потребує значного кропу (до 20% кадру). AI-методи, такі як DUT (Deep Unified Transformer) або DIFRINT, навчаються на парах «нестабільний → стабільний» і передбачають оптимальну трансформацію, використовуючи future frames. Це дозволяє зберегти більше пікселів (кроп 5–10%) та обробляти сцени з розмиттям, засвіткою та rolling shutter. За нашими даними, DUT у 2.5 рази кращий за stability score, ніж класика.
Класична стабілізація через optical flow
Приклад реалізації на Python з OpenCV
import cv2
import numpy as np
from scipy.signal import medfilt
class VideoStabilizer:
def __init__(self, smoothing_window: int = 30,
crop_ratio: float = 0.1):
self.smoothing_window = smoothing_window
self.crop_ratio = crop_ratio
def stabilize(self, input_path: str, output_path: str) -> dict:
cap = cv2.VideoCapture(input_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))
transforms = self._estimate_transforms(cap)
cap.release()
smoothed = self._smooth_trajectory(transforms)
cap = cv2.VideoCapture(input_path)
out = cv2.VideoWriter(output_path,
cv2.VideoWriter_fourcc(*'mp4v'),
fps, (w, h))
for i, (orig, smooth) in enumerate(zip(transforms, smoothed)):
ret, frame = cap.read()
if not ret:
break
stabilized = self._apply_transform(frame, orig, smooth, w, h)
out.write(stabilized)
cap.release()
out.release()
return {'frames': len(transforms), 'smoothing_window': self.smoothing_window}
def _estimate_transforms(self, cap) -> list[np.ndarray]:
ret, prev = cap.read()
prev_gray = cv2.cvtColor(prev, cv2.COLOR_BGR2GRAY)
transforms = []
while True:
ret, curr = cap.read()
if not ret:
break
curr_gray = cv2.cvtColor(curr, cv2.COLOR_BGR2GRAY)
prev_pts = cv2.goodFeaturesToTrack(
prev_gray, maxCorners=200, qualityLevel=0.01,
minDistance=30, blockSize=3
)
curr_pts, status, _ = cv2.calcOpticalFlowPyrLK(
prev_gray, curr_gray, prev_pts, None
)
valid_prev = prev_pts[status == 1]
valid_curr = curr_pts[status == 1]
m, _ = cv2.estimateAffinePartial2D(valid_prev, valid_curr)
if m is None:
m = np.eye(2, 3, dtype=np.float64)
transforms.append(m)
prev_gray = curr_gray
return transforms
def _smooth_trajectory(self, transforms: list) -> list:
trajectory = np.cumsum([m[:, 2] for m in transforms], axis=0)
smoothed = np.zeros_like(trajectory)
for i in range(len(trajectory)):
start = max(0, i - self.smoothing_window // 2)
end = min(len(trajectory), i + self.smoothing_window // 2)
smoothed[i] = trajectory[start:end].mean(axis=0)
delta = smoothed - trajectory
result = []
for i, m in enumerate(transforms):
m_smooth = m.copy()
m_smooth[:, 2] += delta[i]
result.append(m_smooth)
return result
def _apply_transform(self, frame: np.ndarray,
orig_m: np.ndarray,
smooth_m: np.ndarray,
w: int, h: int) -> np.ndarray:
stabilized = cv2.warpAffine(frame, smooth_m, (w, h))
crop = int(min(w, h) * self.crop_ratio)
stabilized = stabilized[crop:h-crop, crop:w-crop]
return cv2.resize(stabilized, (w, h))
DUT — Deep Unified Transformer для AI-стабілізації
class DeepVideoStabilizer:
"""
AI-підхід: навчання стабілізувати відео на парах нестабільний/стабільний.
Перевага перед класикою: краще обробляє
rolling shutter, швидкий рух, розмиття.
"""
def __init__(self, checkpoint_path: str, device: str = 'cuda'):
import sys
sys.path.append('/opt/DUT')
from model import DUTStabilizer
self.model = DUTStabilizer()
self.model.load_state_dict(torch.load(checkpoint_path))
self.model.eval().to(device)
self.device = device
@torch.no_grad()
def stabilize_clip(self, frames: list[np.ndarray],
window_size: int = 16) -> list[np.ndarray]:
"""
Обробляє відео вікнами по window_size кадрів.
Ключова особливість DUT: використовує future frames
для передбачення поточної стабілізації.
"""
results = []
for i in range(0, len(frames), window_size // 2):
window = frames[i:i+window_size]
if len(window) < window_size:
window = window + [window[-1]] * (window_size - len(window))
tensor = self._frames_to_tensor(window)
stabilized_tensor = self.model(tensor.to(self.device))
stabilized_frames = self._tensor_to_frames(stabilized_tensor)
results.extend(stabilized_frames[:window_size//2])
return results[:len(frames)]
Процес роботи
- Аналітика: вивчаємо вихідне відео, метадані (FPS, роздільна здатність, тип тремтіння).
- Проектування: вибираємо метод (класика або AI) та налаштовуємо параметри (smoothing window, crop ratio, window size).
- Реалізація: розробляємо пайплайн на Python/C++ з використанням OpenCV, PyTorch, ONNX.
- Тестування: оцінюємо метрики (stability score, cropping ratio, distortion) та візуально перевіряємо.
- Деплой: пакуємо в Docker, налаштовуємо CI/CD, надаємо API або інтеграцію.
Терміни
| Завдання | Термін |
|---|---|
| Batch стабілізація через OpenCV | 1 тиждень |
| AI стабілізація з DUT/DIFRINT | 4–6 тижнів |
| Realtime стабілізація для трансляцій | 6–10 тижнів |
Оцінка проєкту займає 2 робочі дні. Зв'яжіться з нами для обговорення вашого кейсу.
Метрики якості стабілізації
def evaluate_stabilization(unstable_frames: list, stable_frames: list) -> dict:
"""
Метрики:
- Cropping Ratio: скільки пікселів збережено (вище = краще)
- Distortion Value: спотворення геометрії (нижче = краще)
- Stability Score: дисперсія руху між кадрами (нижче = краще)
"""
flows = []
for i in range(1, len(stable_frames)):
prev_gray = cv2.cvtColor(stable_frames[i-1], cv2.COLOR_BGR2GRAY)
curr_gray = cv2.cvtColor(stable_frames[i], cv2.COLOR_BGR2GRAY)
flow = cv2.calcOpticalFlowFarneback(prev_gray, curr_gray, None,
0.5, 3, 15, 3, 5, 1.2, 0)
flows.append(np.abs(flow).mean())
return {
'stability_score': float(np.std(flows)),
'mean_motion': float(np.mean(flows)),
'max_motion': float(np.max(flows))
}
| Метод | Stability↓ | Cropping↑ | Швидкість |
|---|---|---|---|
| OpenCV (vidstab) | 0.35 | 0.91 | Realtime |
| DIFRINT | 0.18 | 0.89 | 5–10 FPS |
| DUT | 0.14 | 0.87 | 3–5 FPS |
| StabNet | 0.16 | 0.90 | 8 FPS |
AI-стабілізація DUT забезпечує покращення stability score у 2.5 рази порівняно з OpenCV, при цьому зберігаючи майже повний кадр. Економія часу та бюджету на постобробку досягає 40%.
Чому AI-стабілізація вигідніша за класичну?
Класика хороша для простих сцен, але потребує великого кропу та часто вносить спотворення. AI-методи адаптуються до складних сцен, зменшують кроп та автоматично виправляють rolling shutter. Для проєктів з високими вимогами до якості AI-рішення окупається за 2-3 місяці за рахунок скорочення ручної роботи. Замовте прототип AI-стабілізації для вашого датасету — ми швидко покажемо результат.
Що входить у результат
- Вихідний код пайплайну (Python або C++).
- Документація (опис архітектури, інструкція із запуску).
- Навчання вашої команди (до 2 годин онлайн).
- Гарантія на роботу протягом 3 місяців (безкоштовні правки по bug-фіксах).
Отримайте консультацію щодо вашого відео — зв'яжіться з нами для оцінки проєкту.







