Запитання для співбесіди інженера з комп'ютерного зору
15 відібраних запитань для співбесіди з комп'ютерного зору, згрупованих за рівнем досвіду. Використовуйте їх для повторення основ, практичних компромісів та міркувань щодо продакшену на старшому рівні.
1Що таке дискретна 2D згортка зображення, і як вона співвідноситься з ядрами, фільтрами та взаємною кореляцією?
Дискретна 2D згортка зображення — це лінійна операція просторової фільтрації, під час якої матриця ваг (ядро) ковзає по вхідному зображенню. У кожній просторовій позиції вона обчислює по елементах добуток між вагами ядра та локальною ділянкою зображення, що перекривається (рецептивним полем), і підсумовує результати (часто додаючи член зміщення), щоб отримати єдине значення пікселя у вихідній карті ознак.
У класичній математиці та обробці сигналів справжня згортка передбачає перевертання (обертання на 180 градусів) ядра по горизонталі та вертикалі перед обчисленням ковзного скалярного добутку: $(I * K)(i, j) = \sum_m \sum_n I(i - m, j - n) K(m, n)$. Натомість, взаємна кореляція обчислює ковзний скалярний добуток безпосередньо без перевертання ядра: $(I \star K)(i, j) = \sum_m \sum_n I(i + m, j + n) K(m, n)$.
У фреймворках глибокого навчання, таких як PyTorch та TensorFlow, операція, реалізована під назвою "convolution" (згортка), насправді є взаємною кореляцією. Оскільки ваги ядра є навчаними параметрами, оптимізованими безпосередньо за допомогою зворотного поширення помилки (backpropagation), мережа просто вивчає відповідним чином орієнтовані ваги, що робить математичне перевертання ядра обчислювально надлишковим як під час навчання, так і під час висновку.
2Коли ви б використовували представлення RGB, HSV, Lab, YCbCr або відтінки сірого (grayscale) у пайплайні комп'ютерного зору?
Різні колірні простори розділяють специфічні фізичні, перцептивні та статистичні властивості візуальних даних, що робить їх придатними для конкретних завдань комп'ютерного зору:
1. **RGB / BGR**: Стандартний формат для сенсорів камер та обладнання відображення, що представляє адитивні основні кольори (червоний, зелений, синій). Колірні канали сильно корельовані з яскравістю (luminance) — зміни освітлення одночасно впливають на всі три канали. Це стандартний вхід для глибоких нейронних мереж (CNN (Convolutional Neural Networks), Vision Transformers). Основною виробничою проблемою є обмін каналами RGB проти BGR (наприклад, OpenCV завантажує BGR, тоді як PIL/PyTorch очікують RGB), що непомітно знижує точність моделі.
2. **HSV / HSL**: Явно відокремлює хроматичність (Відтінок (Hue) = колірний тон, Насиченість (Saturation) = чистота кольору) від інтенсивності (Яскравість/Світлість (Value/Lightness)). Ідеально підходить для класичної порогової обробки кольору, відстеження об'єктів за кольором та сегментації кольору за змінного освітлення, оскільки Відтінок є відносно інваріантним до тіней та змін яскравості.
3. **CIE Lab**: Перцептивно рівномірний колірний простір, де Евклідова відстань між двома точками ($\Delta E$) безпосередньо відображає людську перцептивну відмінність. Він відокремлює Яскравість ($L^*$) від опонентних колірних осей ($a^*$ зелений-червоний, $b^*$ синій-жовтий). Використовується для інспекції колірної відмінності, корекції кольору, оцінки якості зображень та завдань колоризації.
4. **YCbCr**: Відокремлює яскравість ($Y$) від синьо-різницевих ($Cb$) та червоно-різницевих ($Cr$) компонентів хроматичності. Це основа стандартів стиснення відео та зображень (JPEG, MPEG, H.264/H.265), оскільки людська зорова система менш чутлива до деталей хроматичності, що дозволяє субдискретизацію хроматичності (наприклад, 4:2:0) для зменшення пропускної здатності та обчислень.
5. **Відтінки сірого (Grayscale)**: Одноканальне представлення інтенсивності ($Y \approx 0.299R + 0.587G + 0.114B$). Ідеально підходить для завдань, що базуються на геометрії та текстурі, де колір несуттєвий (наприклад, оптичний потік, SLAM (Simultaneous Localization and Mapping), класичне вилучення ознак, таких як SIFT/ORB, виявлення контурів), щоб заощадити 66% пам'яті та обчислювальних ресурсів. Однак його не слід використовувати, коли колір є ключовим дискримінаційним показником (наприклад, класифікація станів світлофора).
import cv2
import numpy as np
# Sample image: saturated red under normal and shaded lighting
img_bgr = np.zeros((100, 100, 3), dtype=np.uint8)
img_bgr[:, :50] = [0, 0, 255] # Bright Red in BGR
img_bgr[:, 50:] = [0, 0, 120] # Shaded/Dark Red in BGR
# Convert to HSV (OpenCV H: 0-179, S: 0-255, V: 0-255)
img_hsv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV)
# Red Hue wraps around 0/180; track red with single Hue range [0, 10] & high saturation
lower_red = np.array([0, 100, 50])
upper_red = np.array([10, 255, 255])
mask_hsv = cv2.inRange(img_hsv, lower_red, upper_red)
print("HSV segmented pixels:", np.count_nonzero(mask_hsv), "out of", mask_hsv.size)
3Чому поканальна нормалізація зображень, нормалізація для кожного зображення та послідовне масштабування пікселів важливі в системах комп'ютерного зору?
Нормалізація зображень є життєво важливою в конвеєрах обробки зображень для підтримки числової стабільності, прискорення збіжності градієнтного спуску та запобігання зсуву розподілу між навчанням та обслуговуванням:
1. **Масштабування пікселів ([0, 1] або [-1, 1])**: Сирі пікселі зображення зберігаються як беззнакові 8-бітові цілі числа (`uint8` $\in [0, 255]$). Подача сирих значень $[0, 255]$ у нейронні мережі викликає надзвичайно великі ранні активації та вибух градієнта або насичення. Масштабування до $[0.0, 1.0]$ (ділення на 255.0) або $[-1.0, 1.0]$ центрує вхідні дані навколо нуля, узгоджуючись зі стандартними методами ініціалізації ваг (He, Xavier).
2. **Поканальна нормалізація на рівні набору даних (стандартизація за середнім значенням та стандартним відхиленням)**: Стандартизує вхідні дані за допомогою $x_{norm} = \frac{x - \mu_c}{\sigma_c}$, використовуючи попередньо розраховані глобальні поканальні статистики (наприклад, середнє `[0.485, 0.456, 0.406]` та стандартне відхилення `[0.229, 0.224, 0.225]` для ImageNet). Це центрує кожен канал навколо нульового середнього значення з одиничною дисперсією по всьому набору даних, забезпечуючи збалансований потік градієнта між каналами. Критичною операційною проблемою є **перекіс між навчанням та обслуговуванням**: якщо інференс (виведення) опускає ділення на 255, використовує невідповідні константи середнього/стандартного відхилення або застосовує їх у неправильному порядку каналів (RGB проти BGR), продуктивність моделі значно падає.
3. **Нормалізація для кожного зображення (нормалізація екземпляра / Min-Max / Z-score)**: Обчислює середнє значення та стандартне відхилення для кожного окремого зображення: $x_{norm} = \frac{x - \mu_{img}}{\sigma_{img}}$. Це усуває глобальні варіації контрасту та освітлення в різних умовах зйомки. Хоча це ефективно в передачі стилю (style transfer), медичній візуалізації MRI (магнітно-резонансна томографія) / CT (комп'ютерна томографія) або супутникових знімках, це може бути згубним, коли абсолютна інтенсивність пікселів несе фізичне значення (наприклад, класифікація день/ніч, відбивна здатність матеріалу або виявлення дефектів при каліброваному освітленні).
import torch
import torchvision.transforms as T
from PIL import Image
import numpy as np
# Create a mock uint8 RGB image
raw_img = Image.fromarray(np.random.randint(0, 256, (224, 224, 3), dtype=np.uint8))
# Standard transform pipeline:
# 1. ToTensor scales uint8 [0, 255] -> float32 [0.0, 1.0] and permutes HWC -> CHW
# 2. Normalize standardizes per-channel using dataset mean and std
preprocess = T.Compose([
T.ToTensor(),
T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
tensor_img = preprocess(raw_img)
print("Tensor shape:", tensor_img.shape)
print("Tensor dtype:", tensor_img.dtype)
print("Channel 0 min/max:", round(tensor_img[0].min().item(), 2), round(tensor_img[0].max().item(), 2))
4Як геометричні та фотометричні аугментації сприяють інваріантності, і як ви вирішуєте, чи зберігає аугментація мітки?
Геометричні аугментації (такі як обертання, перенесення, масштабування та віддзеркалення) змінюють відображення просторових координат пікселів, тоді як фотометричні аугментації (такі як яскравість, контраст, коливання відтінку та розмиття) змінюють інтенсивність пікселів та колірні канали без зміни просторових координат. У класифікації обидві категорії піддають модель реалістичним варіаціям, заохочуючи її вивчати інваріантні представлення, де прогнози залишаються стабільними попри зміни пози, точки огляду або умов освітлення. У завданнях просторового прогнозування (виявлення та сегментація) геометричні перетворення вимагають відповідних перетворень для обмежувальних рамок або масок істинності для збереження еквіваріантності. Вирішення питання про те, чи зберігає аугментація мітки, вимагає оцінки семантики домену та фізичних апріорних знань. Перетворення є таким, що зберігає мітки, якщо отримане зображення залишається правдоподібним екземпляром вихідного цільового класу без зміни його семантичної ідентичності. Наприклад, горизонтальне віддзеркалення зберігає ідентичність для загальних об'єктів (таких як автомобілі або тварини), але змінює ідентичність або робить недійсними символи в оптичному розпізнаванні символів (OCR) та класифікації цифр. Аналогічно, повне обертання на 360 градусів є дійсним у гістології або супутникових знімках, де немає канонічної орієнтації, але неприродним в автономному водінні, де перевернуті об'єкти порушують реальні фізичні обмеження.
5Що таке інтерполяція за найближчим сусідом (nearest-neighbor), білінійна (bilinear), бікубічна (bicubic) та за площею (area interpolation), і як зміна розміру може спричинити аліасинг або розмиття?
Методи інтерполяції оцінюють інтенсивність пікселів у безперервних координатах при передискретизації на нову дискретну сітку: - **Інтерполяція за найближчим сусідом:** Призначає інтенсивність найближчого дискретного пікселя. Вона обчислювально $O(1)$ і зберігає точні вихідні значення, але створює блокові артефакти при збільшенні роздільної здатності (upsampling) та сильні зазубрені краї при зменшенні роздільної здатності (downsampling). - **Білінійна інтерполяція:** Обчислює зважене за відстанню середнє значення $2 \times 2$ (4 найближчих) сусідніх пікселів, використовуючи лінійну інтерполяцію вздовж обох осей, що забезпечує плавні переходи з помірним розмиттям. - **Бікубічна інтерполяція:** Вибирає зразок з області $4 \times 4$ (16 найближчих) за допомогою кубічних поліноміальних ядер. Вона захоплює локальні градієнти інтенсивності, створюючи чіткіші краї та плавніші криві, ніж білінійна, але може створювати артефакти перерегулювання/кільцювання навколо різких переходів. - **Інтерполяція за площею (Box-фільтр):** Обчислює часткове перекриття площі цільових пікселів, спроектованих на вихідні пікселі, і усереднює базові інтенсивності вихідних пікселів. Вона особливо ефективна для зменшення роздільної здатності без муару. **Механізми аліасингу та розмиття:** - **Аліасинг** виникає під час зменшення роздільної здатності, коли високочастотний вміст перевищує частоту Найквіста ($f_s / 2$) нової частоти дискретизації без достатньої низькочастотної фільтрації. Високі частоти зворотньо відображаються у нижчі частотні діапазони, створюючи хибні шаблони, муар та зазубрені краї. - **Розмиття** виникає, коли ядра інтерполяції діють як низькочастотні згладжувальні фільтри, що послаблюють легітимні високі частоти (наприклад, білінійне згладжування), або коли високочастотні деталі усереднюються під час зменшення роздільної здатності.
6Проти яких реальних візуальних режимів відмови слід оцінювати систему зору, і як вони зміщують вхідний розподіл?
Реальні візуальні режими відмови поділяються на кілька широких категорій: умови навколишнього середовища (низьке освітлення, прямі відблиски, дощ, сніг, туман), сенсорні та оптичні ефекти (розмиття від руху, розмиття поза фокусом, шум сенсора при високому ISO (International Organization for Standardization), спотворення від рухомого затвора), деградація від стиснення та передачі (блоковість JPEG (Joint Photographic Experts Group), дроселювання бітрейту відео, зменшення частоти дискретизації), а також семантичні/просторові зрушення (часткова оклюзія, обрізання, пози об'єктів поза розподілом). Ці режими відмови зміщують вхідний розподіл від номінальних навчальних доменів на кількох рівнях. На рівні пікселів вони змінюють гістограми яскравості та кольоровості, руйнують локальний контраст, знижують відношення сигнал/шум (SNR - Signal-to-Noise Ratio) та вносять штучні високочастотні артефакти або ядра розмиття. На структурному та семантичному рівні вони послаблюють градієнти країв, приховують ключові візуальні особливості, спотворюють силуети та маскують критичні діагностичні області. Коли моделі, навчені на чистих даних, стикаються з цими зміщеними вхідними даними, низькорівневі згорткові або атеншн-екстрактори ознак не активуються коректно, що призводить до пропущених виявлень, галюцинованих хибнопозитивних результатів на шумових патернах та надмірно впевнених помилок.
7Як класичні дескриптори, такі як HOG, представляють структуру зображення, і які обмеження вони мають порівняно з вивченими ознаками CNN?
HOG (Histogram of Oriented Gradients — гістограма орієнтованих градієнтів) — це класичний, розроблений вручну дескриптор ознак, призначений для фіксування локальної форми та вигляду об'єкта через розподіл орієнтацій градієнтів інтенсивності. Конвеєр обчислень HOG включає: (1) обчислення горизонтальних та вертикальних градієнтів зображення (наприклад, за допомогою 1D похідних фільтрів [-1, 0, 1]) для отримання величини та орієнтації градієнта; (2) поділ зображення на невеликі просторові області, які називаються «комірками» (наприклад, 8x8 пікселів), та накопичення 1D гістограм орієнтацій градієнтів, зважених за величиною градієнта; (3) групування сусідніх комірок у більші перекривні «блоки» (наприклад, 2x2 комірки) та нормалізація векторів ознак блоків (використовуючи L2-норму або L1-sqrt) для досягнення стійкості до локальних змін освітлення, контрасту та затінення; і (4) конкатенація нормалізованих векторів блоків у кінцеве 1D представлення ознак, історично поєднуване з лінійними SVM (Support Vector Machines — машинами опорних векторів) для виявлення пішоходів та об'єктів. Порівняно з вивченими ознаками CNN (Convolutional Neural Network — згорткових нейронних мереж), HOG має значні обмеження: По-перше, ознаки HOG є фіксованими та розробленими вручну, фіксуючи лише низькорівневу статистику орієнтації локальних ребер без здатності вивчати ієрархічні представлення, специфічні для завдання (такі як текстури, частини об'єктів та семантичні концепції). По-друге, HOG забезпечує дуже обмежену геометричну інваріантність: хоча нормалізація блоків обробляє монотонні зміни освітлення та невеликі просторові зсуви всередині комірок, HOG крихкий до 3D обертань поза площиною, значних змін масштабу, нежорстких артикуляцій пози та значного фонового засмічення. На відміну від цього, CNN вивчають багатошарові нелінійні абстракції, оптимізовані наскрізно для цільової задачі.
8Як кроковий розмір (stride), заповнення (padding), дилатація (dilation) та розмір ядра (kernel size) визначають розмір виходу згортки та рецептивне поле?
Просторові розміри виходу згорткового шару та його кумулятивне рецептивне поле визначаються розміром ядра $k$, кроком $s$, заповненням $p$ та дилатацією $d$:
1. **Просторовий розмір виходу**: Дилатація додає $(d - 1)$ проміжки між елементами ядра, надаючи ефективний розмір ядра $k' = d(k - 1) + 1$. Розмір виходу вздовж осі задається формулою:
$$\text{O} = \left\lfloor \frac{I + 2p - k'}{s} \right\rfloor + 1 = \left\lfloor \frac{I + 2p - d(k - 1) - 1}{s} \right\rfloor + 1$$
Тут крок (stride) зменшує роздільну здатність, переміщуючи ядро на $s$ пікселів за крок; заповнення (padding) додає віртуальні граничні пікселі для збереження або коригування просторових розмірів; а дилатація (dilation) розширює охоплення фільтра без додавання додаткових параметрів.
2. **Рецептивне поле (RF)**: Теоретичне рецептивне поле описує просторову область у вхідному зображенні, яка впливає на певну активацію. У стекованих шарах рецептивне поле $RF_l$ та кумулятивний крок (jump $j_l$) оновлюються рекурсивно:
* Крок: $j_l = j_{l-1} \cdot s_l$, де $j_0 = 1$
* Рецептивне поле: $RF_l = RF_{l-1} + (k'_l - 1) \cdot j_{l-1}$, де $RF_0 = 1$
Кроки та пулінг множинно розширюють рецептивне поле вглиб, оскільки кроки ядра наступних шарів відповідають більшим стрибкам пікселів у вихідному просторі вхідних координат. Дилатація адитивно розширює рецептивне поле в межах одного шару, збільшуючи $k'_l$ без просторового зменшення вибірки.
9Як ядро згортки відповідає класичному лінійному фільтру зображень, і коли 2D-фільтр може бути роздільним?
У класичній лінійній обробці сигналів та зображень ядро згортки (convolution kernel) представляє просторову імпульсну характеристику (функцію розсіювання точки) лінійної інваріантної щодо зсуву (LSI) системи. Застосування ядра є операцією лінійної фільтрації у просторовій області, що формує частотну характеристику зображення (його двовимірне перетворення Фур'є). Ядра низьких частот (наприклад, Гауса, розмиття за боксом) послаблюють високі просторові частоти для придушення шуму та згладжування текстур, тоді як ядра високих частот або смугові ядра (наприклад, Sobel, Laplacian, Prewitt) підсилюють високі частоти для виявлення країв та градієнтів. Двовимірне ядро фільтра $K \in \mathbb{R}^{M \times N}$ є просторово роздільним (spatially separable), якщо його можна розкласти на зовнішній добуток двох одновимірних фільтрів: $K = u \cdot v^T$, де $u \in \mathbb{R}^{M \times 1}$ та $v \in \mathbb{R}^{N \times 1}$. У термінах лінійної алгебри, двовимірна матриця є роздільною тоді і тільки тоді, коли її ранг матриці дорівнює 1. Це можна перевірити за допомогою розкладу за сингулярними значеннями (SVD), де рівно одне сингулярне значення є ненульовим ($ \sigma_1 > 0, \sigma_2 = \dots = 0$). Роздільність значно зменшує обчислювальну складність. Застосування нероздільного ядра розміром $K \times K$ до зображення $H \times W$ вимагає $O(H \cdot W \cdot K^2)$ множень та додавань. При розкладанні на два послідовних одновимірних проходи (горизонтальний, потім вертикальний) складність зменшується до $O(H \cdot W \cdot 2K)$. Для ядра розміром $15 \times 15$ це забезпечує приблизно $7.5\times$ прискорення.
10Як зміна розміру, центральне обрізання, випадкове обрізання зі зміною розміру, розтягування та леттербоксинг змінюють розподіл вхідних даних?
Різні стратегії зміни розміру та обрізання змінюють розподіл вхідних даних щодо геометрії, масштабу, покриття вмісту та просторових меж: 1. **Пряма зміна розміру (розтягування/стискання):** Масштабує зображення неізотропно до цільового розміру $(H, W)$, спотворюючи вихідні співвідношення сторін. Це змушує модель обробляти деформовані форми об'єктів (наприклад, круглі об'єкти стають витягнутими еліпсами). 2. **Центральне обрізання:** Витягує центральну ділянку фіксованого розміру або співвідношення. Воно зберігає вихідне співвідношення сторін та локальний масштаб, але вводить сильне зміщення до центру (припускаючи, що цільові об'єкти розташовані по центру) та відкидає периферійний контекст або відрізає об'єкти, розташовані по краях. 3. **Випадкове обрізання зі зміною розміру (RRC — Random-Resized Cropping):** Витягує випадкові підрегіони з різними масштабами площі та співвідношеннями сторін, а потім змінює їх розмір до фіксованого. Це розширює розподіл масштабу навчання та сприяє навчанню ознак на основі частин, але екстремальні обрізання можуть повністю виключити цільовий об'єкт. 4. **Леттербоксинг (ізотропна зміна розміру з заповненням полів):** Рівномірно масштабує зображення, доки його найдовший вимір не відповідатиме цільовому розміру, а потім заповнює решту меж постійним значенням. Це зберігає справжні пропорції об'єктів та співвідношення сторін, але вводить штучні висококонтрастні межі та неінформативні пікселі заповнення.
11Які режими шуму анотацій виникають у наборах даних комп'ютерного зору, і як їх виявити або пом'якшити?
Набори даних комп'ютерного зору зазвичай демонструють чотири основні режими шуму анотацій:
1. **Шум категорійних міток (Categorical Label Noise)**: Зображенню або об'єкту присвоєно неправильну мітку класу (наприклад, неправильна класифікація кота як собаки або плутанина тонких, деталізованих класів).
2. **Пропущені анотації (Шум пропуску, Omission Noise)**: Дійсні об'єкти переднього плану залишаються без анотацій. У виявленні об'єктів (object detection) пропущені цілі трактуються як фонові негативи, що безпосередньо штрафує правильні виявлення моделі під час навчання.
3. **Тремтіння обмежувальної рамки/ключової точки (Шум локалізації, Localization Noise)**: Неточні, розмиті або зміщені координати обмежувальних рамок та розташування ключових точок, спричинені непослідовністю людського анотатора.
4. **Неоднозначність меж маски (Mask Boundary Ambiguity)**: Непослідовні або грубі контури сегментації вздовж складних або розмитих меж (наприклад, волосся, напівпрозорі поверхні, розмиття руху).
**Стратегії виявлення та пом'якшення:**
* **Відстеження викидів втрат та впевнене навчання (Loss Outlier Tracking & Confident Learning)**: Відстеження втрат зразків протягом епох навчання ідентифікує стійкі викиди з високими втратами, які часто вказують на неправильно позначені або пропущені екземпляри. Алгоритми, такі як Confident Learning, оцінюють розподіли шуму для обрізки або виправлення помилок.
* **Розбіжності прогнозів Out-of-Fold (OOF)**: Навчання моделей крос-валідації та порівняння прогнозів на відкладених даних з еталонними даними (ground truth) виявляє неправильно позначені зображення та відсутні обмежувальні рамки.
* **Згода між анотаторами (Inter-Annotator Agreement, IAA) та арбітраж (Adjudication)**: Вимірювання метрик, таких як коефіцієнт Коена (для класифікації) або середнє Intersection-over-Union (IoU) (для локалізації) між кількома анотаторами виявляє зразки з низькою згодою для консенсусного перегляду.
* **Надійні формулювання функцій втрат (Robust Loss Formulations)**: Використання згладжування міток (label smoothing), стійких до шуму функцій втрат для класифікації або робастних функцій втрат для регресії на основі IoU зменшує чутливість до тремтіння та неправильної розмітки.
import torch
import torch.nn.functional as F
def find_label_noise_candidates(model, dataloader, device, top_k=50):
model.eval()
sample_losses = []
with torch.no_grad():
for batch_idx, (images, targets, sample_ids) in enumerate(dataloader):
images, targets = images.to(device), targets.to(device)
logits = model(images)
loss_per_sample = F.cross_entropy(logits, targets, reduction='none')
for sid, l, target, pred in zip(sample_ids, loss_per_sample.cpu(), targets.cpu(), logits.argmax(dim=-1).cpu()):
sample_losses.append({'id': sid, 'loss': l.item(), 'target': target.item(), 'pred': pred.item()})
sample_losses.sort(key=lambda x: x['loss'], reverse=True)
return sample_losses[:top_k]
12Як дисбаланс класів впливає на навчання моделей класифікації зображень, виявлення об'єктів та щільного передбачення?
Дисбаланс класів впливає на динаміку оптимізації та ландшафти функції втрат у різних завданнях комп'ютерного зору: 1. **Класифікація зображень:** Коли мажоритарні класи кількісно переважають міноритарні, емпірична мінімізація ризику призводить до того, що оновлення параметрів домінують градієнти мажоритарних класів. Модель вивчає емпіричне апріорне розподілення класів $P(Y)$ та зміщує свою межу рішення проти рідкісних класів. Це забезпечує високу загальну точність за Top-1, але призводить до серйозного згортання повноти для міноритарних класів. 2. **Виявлення об'єктів:** – *Дисбаланс переднього та заднього плану:* У щільних одностадійних та якірно-орієнтованих детекторах сотні тисяч кандидатних областей оцінюються для кожного зображення, причому понад 99% є фоном. Навіть якщо окремі легкі якірні бокси фону дають невеликі втрати, їх величезний сукупний градієнт пригнічує інформативні градієнтні сигнали від розріджених об'єктів переднього плану. – *Дисбаланс класів переднього плану:* Поширені категорії об'єктів з'являються на порядки частіше, ніж рідкісні категорії, що зменшує ефективний розмір вибірки та навчальний сигнал для рідкісних класів. 3. **Щільне передбачення (сегментація):** Дисбаланс на рівні пікселів є серйозним, оскільки великі фонові класи та класи-об'єкти 'stuff' (наприклад, дорога, небо) займають мільйони пікселів, тоді як малі класи-об'єкти 'thing' (наприклад, дорожні знаки, пішоходи) можуть займати менше ніж 0,1% пікселів зображення. Стандартна попіксельна крос-ентропійна функція втрат домінує великими областями класів, що призводить до недосегментації або повного зникнення малих, тонких структур.
13Як ви б відлагоджували NaN (Not a Number) або нестабільну функцію втрат під час великомасштабного навчання комп'ютерного зору з розподіленою паралелізацією даних (DDP)?
Відлагодження NaN або нестабільної функції втрат у великомасштабному навчанні комп'ютерного зору з розподіленою паралелізацією даних (DDP) вимагає ізоляції першопричини: чи вона походить від поганих вхідних даних, числового переповнення/недоповнення в змішаній точності (AMP — Automatic Mixed Precision), чи від нестабільності оптимізації між воркерами. По-перше, встановіть детермінізм та захисні перехоплювачі (safety hooks): увімкніть виявлення аномалій (`torch.autograd.set_detect_anomaly(True)`), зареєструйте перехоплювачі градієнтів/активацій, щоб зловити точний шар, де з'являються NaN, і додайте сувору валідацію даних у `DataLoader` (перевіряючи на кінцеві значення, шукаючи пошкоджені зображення нульового розміру, порожні обмежувальні рамки або дільники нормалізації з нульовою дисперсією). Логування на рівні міні-пакетів має відстежувати втрати на кожен ранг, URI вхідних даних, норму градієнта до відсікання та масштабні коефіцієнти `GradScaler`. По-друге, перевірте змішану точність (AMP) та динамічне масштабування втрат: у FP16 великі градієнти легко переповнюються (`> 65504`), змушуючи масштабувальник втрат пропускати кроки та багаторазово зменшувати свій масштабний коефіцієнт вдвічі, доки масштаб не досягне нуля; переведення нестабільних операцій (наприклад, `softmax`, `LayerNorm`, показників фокальної втрати або знаменників IoU обмежувальної рамки) на FP32 або використання BF16 (який відповідає динамічному діапазону FP32) зазвичай стабілізує навчання. Нарешті, перевірте специфічні для DDP підводні камені, такі як операції all-reduce, що поширюють NaN від одного воркера на всі ранги, масштабування розігріву швидкості навчання (наприклад, правило лінійного масштабування з великими глобальними розмірами пакетів) та відсікання градієнта.
import torch
from torch.cuda.amp import autocast, GradScaler
scaler = GradScaler()
optimizer = torch.optim.AdamW(model.parameters(), lr=1e-4)
for step, (images, targets, uris) in enumerate(dataloader):
# 1. Input sanitization
if not torch.isfinite(images).all():
print(f"Corrupt input detected from URIs: {uris}")
continue
optimizer.zero_grad(set_to_none=True)
with autocast(dtype=torch.float16):
outputs = model(images)
loss = criterion(outputs, targets)
if not torch.isfinite(loss):
print(f"NaN/Inf loss at step {step} on rank {torch.distributed.get_rank()}; skipping step.")
continue
scaler.scale(loss).backward()
# Unscale before clipping to inspect true gradient norms
scaler.unscale_(optimizer)
grad_norm = torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
if torch.isnan(grad_norm) or torch.isinf(grad_norm):
print(f"Warning: Grad norm is {grad_norm}. Scaler will adjust.")
scaler.step(optimizer)
scaler.update()
14Як би ви спроєктували компонент онлайн-стабілізації цифрового відео для камери з тремтінням кадру?
Проектування конвеєра онлайн-стабілізації цифрового відео для камерного тремтіння в реальному часі включає чотири основні етапи: оцінка руху, згладжування руху, компенсація руху (деформація) та обробка меж.
1. **Міжкадрова оцінка руху**: Вилучення 2D розріджених ключових точок послідовних кадрів за допомогою швидких детекторів ознак (наприклад, ORB (Oriented FAST and Rotated BRIEF), FAST (Features from Accelerated Segment Test) або кутів Ши-Томасі) та обчислення відповідностей за допомогою оптичного потоку Лукаса-Канаде або зіставлення дескрипторів ознак. Оцінка міжкадрової геометричної трансформації (наприклад, афінної або гомографічної моделі) за допомогою RANSAC (Random Sample Consensus) для відхилення викидів (відповідностей), спричинених незалежно рухомими об'єктами переднього плану.
2. **Накопичення траєкторії руху та онлайн-згладжування**: Інтеграція покадрових трансформацій з часом для підтримки кумулятивного шляху камери $P_t = P_{t-1} \cdot H_t$. Застосування онлайн-фільтра згладжування — такого як 1D/2D фільтр Калмана або короткострокове причинне рухоме середнє — для відокремлення високочастотного небажаного тремтіння від низькочастотного навмисного панорамування камери.
3. **Компенсація та деформація зображення**: Обчислення коригуючої трансформації $C_t = S_t \cdot P_t^{-1}$ (де $S_t$ — згладжений шлях) та деформація поточного кадру за допомогою білінійної/бікубічної інтерполяції.
4. **Обробка меж та обмеження затримки**: Деформація спричиняє відсутні пікселі на краях / чорні рамки; це вирішується шляхом застосування фіксованого динамічного коефіцієнта обрізки (наприклад, 5-10% збільшення) з екстраполяцією меж або адаптивним масштабом. В онлайн-середовищі підтримуйте мінімальну буферизацію (1–3 кадри передбачення), щоб обмежити затримку обробки.
15Як ви оптимізуватимете конвеєр комп'ютерного зору в реальному часі, якщо детектор працює повільніше, ніж цільова частота кадрів?
Коли детектор об'єктів не може підтримувати цільову частоту кадрів (наприклад, працює на 15-20 кадрів на секунду (FPS) при відеопотоці 60 FPS), надійна виробнича архітектура відокремлює виявлення від циклу представлення в реальному часі, використовуючи асинхронний багатопотоковий конвеєр, що поєднує важке виявлення з легковажним відстеженням. У цій гібридній архітектурі потік захоплення (ingestion thread) безперервно захоплює відеокадри. Важкий детектор працює асинхронно як «детектор ключових кадрів» у фоновому робочому потоці. Тим часом легковажний трекер (такий як оптичний потік Лукаса-Канаде, ByteTrack/BoT-SORT або швидкий кореляційний фільтр/фільтр Калмана) працює синхронно на кожному кадрі з повною швидкістю 60 FPS, підтримуючи стан об'єкта, ідентичність та плавні траєкторії обмежувальних рамок. Щоб уникнути затримок і зворотного тиску без введення необмеженої затримки або застарілих кадрів, використовуються обмежені кільцеві буфери та політики відкидання найновіших кадрів. Коли детектор завершує обробку кадру T_0 в момент часу T_curr, його вихідні дані є застарілими. Конвеєр виконує перекалібрування координат/зворотну проєкцію: він асоціює затримані результати виявлення з історичним станом треклета в T_0, оновлює ідентичності та пропущені треки, а також поширює корекції вперед до T_curr за допомогою векторів руху відстеження або кроків прогнозу фільтра Калмана.
import queue
import threading
frame_queue = queue.Queue(maxsize=1) # Drop stale frames, keep latest
det_result_queue = queue.Queue()
def detector_worker():
while True:
frame, frame_id, timestamp = frame_queue.get()
boxes, scores, classes = heavy_detector.infer(frame)
det_result_queue.put({'frame_id': frame_id, 'boxes': boxes, 'timestamp': timestamp})
def realtime_pipeline(video_stream):
tracker = FastTracker() # e.g. Optical flow or Kalman tracker
for frame, frame_id, timestamp in video_stream:
if frame_queue.empty():
frame_queue.put((frame, frame_id, timestamp))
if not det_result_queue.empty():
det_result = det_result_queue.get()
tracker.reconcile_and_correct(det_result, current_frame_id=frame_id)
active_tracks = tracker.update(frame)
display_or_downstream(frame, active_tracks)