# Домашнє завдання · Карта задач компʼютерного зору

> Лекція: [lecture.html](lecture.html) · Практика: [practice.ipynb](practice.ipynb) · Тест: [quiz.html](quiz.html)

Тема оглядова, тож і завдання тут не про навчання моделей — жодну модель ти не
навчатимеш. Вони про те, щоб упевнено розрізняти постановки задач, рахувати IoU
й чесно оцінювати ціну розмітки, перш ніж братися за роботу.

---

## 🟢 Рівень 1 — База

Побудуй у зошиті власну сцену з **трьома** предметами: два телефони й одна коробка
(коробку зроби ширшим прямокутником під іншим кутом). Створи для неї всі пʼять
типів розмітки, як це зроблено в практиці.

**Зроблено, якщо:**

- надруковано таблицю з трьох рядків: для кожного предмета — площа маски, рамка
  `(x1, y1, x2, y2)` і частка фону всередині рамки у відсотках;
- надруковано, скільки чисел містить кожна з пʼяти розміток цієї сцени;
- у сцені є хоча б одна пара предметів, які торкаються, і `cv2.connectedComponents`
  на семантичній масці повертає **менше** областей, ніж предметів у сцені.

---

## 🟡 Рівень 2 — Плюс

Візьми поріг IoU і подивись, як від нього залежить оцінка детектора.

Зафіксуй розмічену рамку правого телефона й перебери **сто** «прогнозів»: рамки,
зсунуті на випадкові величини від −40 до +40 пікселів по кожній осі
(`np.random.default_rng(42)`, щоб результат відтворювався). Для кожного порога
IoU зі списку `0.3, 0.5, 0.7, 0.9` порахуй, скільки прогнозів вважаються влучними.

**Зроблено, якщо:**

- надруковано таблицю «поріг → скільки влучань зі ста»;
- побудовано графік: по горизонталі поріг, по вертикалі частка влучань;
- у висновку одним абзацом пояснено, чому та сама модель на порозі 0.9 виглядає
  майже непрацездатною, хоча жодна її рамка не змінилась.

---

## 🔴 Рівень 3 — Виклик

Дві частини: розрахунок і рішення.

**Частина А — кошторис.** Напиши функцію
`annotation_hours(images, objects_per_image, task)`, яка повертає час розмітки
в годинах для `task` зі списку `"класифікація"`, `"детекція"`, `"сегментація"`.
Побудуй графік: по горизонталі — кількість зображень від 100 до 20 000
(логарифмічна шкала), по вертикалі — години. Познач горизонтальною лінією бюджет
у 200 годин і знайди, скільки зображень уміщається в цей бюджет для кожної з
трьох постановок.

**Частина Б — вибір.** Замовник із дошки оголошень просить систему, яка
«перевірятиме фото товару перед публікацією». Випиши **пʼять** різних конкретних
питань, які за цим формулюванням можуть ховатись (наприклад: «чи є на фото
взагалі телефон», «чи не додано чуже фото з іншого оголошення»), і для кожного
назви постановку задачі, тип розмітки й приблизний час розмітки 5 000 зображень
за твоєю функцією з частини А.

**Зроблено, якщо:**

- графік побудовано, і для кожної постановки названо число зображень, яке
  вміщається в 200 годин;
- у таблиці зі пʼяти рядків для кожного питання стоїть постановка, тип розмітки
  й час;
- обрано один варіант із пʼяти як «з якого починати» і пояснено вибір саме через
  співвідношення користі й ціни розмітки, а не через складність моделі.

---

## Підказки

- Рамку предмета не обовʼязково задавати руками: якщо є маска, рамка з неї
  дістається трьома рядками — `np.any` по рядках, `np.any` по стовпцях, потім
  перший і останній `True`.
- У завданні 2 не пиши IoU заново — візьми `box_iou` з практики. Якщо доводиться
  копіювати код удруге, це знак, що функція має жити окремо.
- `cv2.connectedComponents` повертає **пару**: кількість міток і карту міток.
  Фон теж має мітку (нуль), тому предметів завжди на одиницю менше, ніж міток.
- У завданні 3 не шукай «правильної» відповіді в частині Б — її немає. Оцінюється
  саме те, чи звʼязані між собою питання замовника, форма відповіді моделі й
  кошторис розмітки.
