MediaPipe использует обученную нейросеть, которая анализирует изображение с камеры и находит на руке 21 ключевую точку (суставы и кончики пальцев). По этим точкам программа понимает положение каждого пальца. В этой программе используются две точки: кончик указательного пальца (id = 8) и кончик большого пальца (id = 4). По координате указательного пальца двигается курсор, а расстояние между двумя пальцами используется для определения клика.
np.interp, и что произойдёт без неё?Камера и экран имеют разные размеры и координаты. Например, камера может быть 640×480, а экран — 1920×1080. Интерполяция np.interp переводит координаты пальца из системы координат камеры в систему координат экрана. Если её убрать, курсор будет двигаться неправильно: он сможет перемещаться только в маленькой области экрана или будет прыгать.
MediaPipe возвращает координаты пальца x и y. Эти координаты переводятся в координаты экрана, и программа вызывает функцию:
Это перемещает курсор мыши туда, где находится указательный палец. Поэтому, когда человек двигает пальцем перед камерой, курсор повторяет это движение.
Камера не может получать команды как клавиатура или кнопка. Поэтому программе нужен жест, который можно увидеть на изображении. Когда большой и указательный пальцы сближаются, расстояние между ними становится маленьким. Это легко вычислить математически, поэтому этот жест удобно использовать как “виртуальный клик”.
Можно использовать несколько способов:
сглаживание координат (усреднять последние позиции пальца);
увеличить порог клика, чтобы случайные движения не вызывали нажатие;
ограничить скорость движения курсора;
использовать фильтр шумов, который убирает мелкие колебания.
Это сделает управление более плавным.
Несколько параметров сильно влияют на работу системы:
click_threshold — расстояние между пальцами для клика
размер изображения камеры — влияет на скорость обработки
частота кадров (FPS) — чем выше, тем плавнее движение
чувствительность движения курсора
Подбор этих параметров помогает сделать систему быстрее и удобнее.
Главное преимущество — контакт не требуется. Человек может управлять компьютером, не касаясь устройств. Это полезно:
в стерильных помещениях (медицина, лаборатории),
когда руки заняты или в перчатках,
когда нельзя использовать обычные устройства ввода.
Также такой интерфейс может быть удобен людям с ограниченной подвижностью.
Такие системы могут использоваться:
в операционных и медицинских лабораториях;
в VR и AR интерфейсах;
в умных домах;
в играх и интерактивных системах;
в бесконтактных терминалах;
в системах помощи людям с инвалидностью.
Без дополнительного обучения система может иметь ограничения:
хуже работает при плохом освещении;
может путать жесты, если рука закрыта;
не всегда точно распознаёт движение при быстром перемещении;
работает только с теми жестами, которые уже предусмотрены.
То есть система не “учится” новым жестам сама.
Систему можно сделать намного мощнее, добавив новые жесты:
Например:
два пальца вверх — прокрутка страницы
движение рукой влево/вправо — переключение слайдов
три пальца — правая кнопка мыши
разведение пальцев — масштабирование (zoom)
круговое движение пальца — регулировка громкости
Также можно добавить распознавание нескольких рук или жесты для запуска программ.
1. Что такое нейросеть
Нейросеть — это компьютерная программа, которая учится находить закономерности в данных примерно так же, как человек учится на опыте. Ей показывают много примеров (например, фотографий кошек и собак), и постепенно она начинает понимать, чем они отличаются. После обучения нейросеть может сама смотреть на новое изображение и пытаться угадать, что на нём изображено.
2. Что такое функция активации — это правило внутри нейросети, которое решает, насколько сильно нейрон должен “сработать” и передать сигнал дальше. Можно представить это как переключатель или регулятор силы сигнала: если значение маленькое, сигнал может почти не передаваться, а если большое — передаётся дальше по сети.
3. Что такое сверточная нейросеть
Сверточная нейросеть — это особый тип нейросети, который создан специально для работы с изображениями. Она не смотрит на всю картинку сразу, а как будто рассматривает её маленькими участками, постепенно находя линии, формы и детали. Благодаря этому она лучше понимает изображения и работает быстрее, чем обычные нейросети.
4. Зачем нужны сверточные нейросети
Сверточные нейросети помогают компьютерам распознавать изображения и видео. Например, они могут находить лица на фотографии, распознавать дорожные знаки для беспилотных машин или определять предметы на картинках. Благодаря таким сетям работают многие современные технологии: фильтры в телефонах, системы безопасности и медицинская диагностика.
5. Почему полносвязные сети быстро перегружаются информацией
Полносвязная нейросеть соединяет каждый пиксель изображения со всеми нейронами следующего слоя. Если картинка большая, получается огромное количество связей и вычислений. Из-за этого сеть становится очень тяжёлой, медленной и требует много памяти. Сверточные сети решают эту проблему, потому что работают только с небольшими участками изображения.
6. Что такое компьютерное зрение
Компьютерное зрение — это область технологий, которая учит компьютеры понимать изображения и видео. Например, компьютер может определить, где на фотографии человек, машина или животное. Это похоже на человеческое зрение, только вместо глаз и мозга используются камеры и программы.
7. Как работает сверточный слой
Сверточный слой работает как маленькое окошко, которое медленно двигается по изображению. Внутри этого окошка выполняется простая математическая операция, которая помогает обнаружить линии, границы или другие детали. Когда это окошко проходит по всей картинке, получается новое изображение, показывающее, где были найдены нужные признаки.
8. Сколько слоев может быть в сверточной нейросети
В сверточной нейросети может быть разное количество слоёв: от нескольких до десятков и даже сотен. Чем больше слоёв, тем более сложные признаки сеть может находить. Обычно первые слои ищут простые линии и края, а более глубокие слои начинают распознавать части объектов и сами объекты.
9. Что такое фильтры
Фильтр — это небольшой набор чисел (маленькая матрица), который помогает находить определённые детали на изображении. Один фильтр может искать вертикальные линии, другой — горизонтальные, третий — текстуры. Когда фильтр проходит по изображению, он показывает, где именно встречается этот признак.
10. Что такое дополненная реальность
Дополненная реальность — это технология, которая добавляет виртуальные объекты в реальный мир через камеру телефона или очки. Например, когда приложение рисует на лице маску или показывает виртуального персонажа на столе. Камера видит реальный мир, а программа добавляет к нему цифровые элементы.
11. Что такое карта признаков
Карта признаков — это изображение, которое получается после того, как фильтр обработал исходную картинку. Она показывает, где на изображении были найдены определённые признаки, например линии или границы. В нейросети обычно создаётся много таких карт, каждая из которых отвечает за свой тип признака.
12. Что такое дополненная реальность (AR) — это технология наложения виртуальных объектов на изображение из реального мира. Благодаря AR, пользователь видит дополненную сцену: на изображение с камеры «накладываются» 3D-объекты, текст, эффекты или подсказки.
13. Что такое OpenCV
OpenCV — это специальная библиотека программирования, которая помогает работать с изображениями и видео. С её помощью можно загружать фотографии, находить объекты, выделять контуры и многое другое. Её часто используют вместе с нейросетями для создания систем компьютерного зрения. Для создания таких проектов часто используется OpenCV
14. Что такое пулинг
Пулинг — это операция, которая уменьшает размер изображения внутри нейросети. Она берёт небольшой участок изображения и оставляет только самое важное значение. Благодаря этому сеть работает быстрее и запоминает только самые значимые признаки.
15. Что такое нормализация
Нормализация — это процесс, который приводит данные к удобному диапазону значений, например от 0 до 1. Это помогает нейросети учиться быстрее и стабильнее. Можно представить, что мы приводим все числа к одному масштабу, чтобы их было легче сравнивать.
16. Что такое тензор
Тензор — это просто способ хранить данные в виде многомерной таблицы чисел. Например, изображение можно представить как таблицу пикселей, а цветное изображение — как несколько таких таблиц. В нейросетях почти вся информация хранится и передаётся именно в виде тензоров.
17. Что такое Conv2d
Conv2d — это операция в программировании нейросетей, которая выполняет двумерную свёртку над изображением. Она берёт фильтр и двигает его по картинке, находя нужные признаки. Именно эта операция лежит в основе работы сверточных нейросетей при обработке изображений.
Разберём функцию по шагам и максимально просто, чтобы это можно было объяснить даже детям.
Эта функция применяет свёрточный фильтр (kernel) к цветному изображению.
Но цветное изображение состоит из трёх каналов:
R — красный
G — зелёный
B — синий
Поэтому фильтр нужно применить к каждому каналу отдельно, а потом собрать их обратно.
Это изображение в виде массива NumPy.
Его форма примерно такая:
Например:
3 — это каналы RGB.
Это матрица свёртки 3×3, например:
Такой фильтр делает резкость.
Создаётся новый массив, куда мы будем записывать результат обработки.
empty_like означает:
создать массив такого же размера как
image.
То есть:
Цикл выполняется 3 раза:
Это означает:
То есть мы берём одно чёрно-белое изображение канала.
Например:
Функция convolve:
двигает ядро kernel по изображению
вычисляет новое значение пикселя
создаёт новое изображение
mode='reflect' означает:
если фильтр выходит за край картинки,
пиксели зеркально отражаются, чтобы не было обрезки.
Получившийся обработанный канал записывается обратно в результат.
В итоге:
После свёртки значения могут выйти за пределы:
Но изображение должно иметь диапазон:
clip обрезает значения:
Функция возвращает новое RGB-изображение, к которому применён фильтр.
Например:
фильтр резкости
фильтр размытия
фильтр контуров
Можно представить это так:
Вот что можно изменить в коде Задачи 1, чтобы результаты картинок заметно менялись,
Где: filt_brighter, filt_darker
Поиграть с delta: 0.05, 0.2, 0.4
Объяснение: мы просто прибавляем/вычитаем число ко всем пикселям.
Где: filt_contrast(img, factor)
Поиграть с factor: 0.4 (очень мягко), 1.0 (без изменений), 2.5 (очень жёстко)
Где: filt_warm
Поиграть с коэффициентами каналов: усилить синий (холодно), усилить красный (тепло).
Пример “Холодный тон”:
И добавить в FILTERS.
Где: filt_gray
Сейчас используется color.rgb2gray (умное преобразование). Можно дать ребятам 2 варианта:
Среднее: (R+G+B)/3
Только один канал: например только R
Это прям классно показывает, что “цвет = три слоя”.
Где: SHARPEN_KERNEL
Сейчас ядро такое:
Пусть попробуют:
“резче” (центр больше): 7 или 9
“мягче” (центр меньше): 3
Добавить 2 фильтра и сравнить глазами.
Новый фильтр: “Blur”.
И добавить в FILTERS. Ребята сразу увидят, что свёртка может “мылить”.
Можно добавить простой Laplacian:
Так дети поймут: “контуры можно искать разными способами”.
Где: convolve(..., mode='reflect')
Попробовать:
'reflect' (как сейчас)
'nearest' (берёт ближайший пиксель)
'constant' (за краем считает нули — часто даёт рамку)
Это хороший эксперимент “почему края ведут себя странно”.
Где: data.chelsea()
Пусть попробуют другие встроенные картинки:
Или загрузка из файла (если в окружении можно).
Это прикольный эффект и очень простой:
Самое простое и наглядное:
Пусть прогонят все 4 фотографии и сравнят: где лучше детектируются лица/глаза/рот и почему (свет, ракурс, масштаб, повороты).
FACE_SCALE_FACTOR и FACE_MIN_NEIGHBORSЭто отвечает за поиск лиц.
FACE_SCALE_FACTOR (например 1.1–1.8)
меньше (1.1–1.3): ищет тщательнее, но медленнее, может найти больше лиц
больше (1.6–2.0): быстрее, но может пропускать лица
FACE_MIN_NEIGHBORS (например 3–8)
меньше: больше находок, но больше “ложных лиц”
больше: меньше шума, но можно потерять реальные лица
Эксперимент для ребят:
Поставить FACE_MIN_NEIGHBORS = 3 и увидеть “лишние лица”.
Поставить FACE_MIN_NEIGHBORS = 8 и увидеть пропуски.
EYE_* параметры (глаза)Особенно часто ломаются на фото с бликами/очками/поворотами головы.
EYE_SCALE_FACTOR: 1.05–1.4
EYE_MIN_NEIGHBORS: 4–12
Эксперимент:
Сделать EYE_MIN_NEIGHBORS ниже и увидеть, как каскад начинает принимать за глаз “что угодно”.
MOUTH_* параметры (рот)Рот часто определяется хуже всего. Важны:
MOUTH_MIN_NEIGHBORS (6–15)
minSize=(30,15) можно тоже менять (например (40, 20))
Эксперимент:
Уменьшить minSize, увидеть, что “рот” находится на подбородке/носу/складках.
Увеличить minSize, увидеть, что рот иногда перестаёт находиться.
Очки обычно: 0.55–0.80 от ширины лица (зависит от PNG)
Усы: 0.40–0.75
Эксперимент:
Сделать очки “слишком большими” (0.9) и “слишком маленькими” (0.3) — легко увидят масштабирование.
Смещение измеряется как доля face_h, поэтому для разных лиц ведёт себя похожим образом.
Эксперимент:
Очки: 0.05 / 0.20 / 0.35 (опускаются на нос)
Усы: 0.00 / 0.05 / 0.10 (поднимаются к носу)
Сейчас берёте два самых левых:
Это иногда неверно (каскад может найти “глаз” на брови или тени).
Идея улучшения для ребят (простая логика):
выбирать два глаза, которые:
примерно на одной высоте (abs(y1 - y2) маленькое)
имеют похожий размер (abs(w1 - w2) маленькое)
находятся достаточно далеко друг от друга (иначе это не “два глаза”)
Это прям хорошая мини-задача на фильтрацию.
Сейчас выбирается “самый большой прямоугольник”:
Иногда “самый большой” — это вообще не рот.
Улучшение:
искать рот ближе к центру нижней половины лица
отбрасывать слишком высоко/низко найденные области
Очень полезно для обучения:
рисовать точки центра глаз
рисовать линию между глазами
рисовать вектор p_up
Чтобы дети увидели: “ага, вот откуда берётся угол, вот почему усы едут вбок”.