AR-примерка маникюра в браузере: MVP на React, Vite, MediaPipe и Canvas2D
Browser-based virtual manicure try-on MVP для beauty-бизнеса и интерактивных сайтов
Live camera UX, MediaPipe hand tracking, Canvas2D overlays и PNG nail assets
Computer vision proof of work от AI-разработчика и AI coding studio в Армении
AR try-on, beauty tech AI, browser computer vision и AI-assisted product development

$ npm run dev -- --host 127.0.0.1
> VITE ready at http://127.0.0.1:5173/
> camera: active
> canvas: 1280x720
> tracking: MediaPipe Hand Landmarker
> active style: Blue Ocean Navy #426Этот материал - инженерный разбор MVP, который мы собрали для идеи AR-примерки маникюра в браузере. Проект показывает, как AI-разработчик в Армении, AI developer in Yerevan, AI coding studio и команда product engineering могут быстро превратить неясную гипотезу из beauty-бизнеса в работающий browser-based computer vision prototype.
Идея продукта простая для пользователя и сложная для реализации: человек открывает сайт маникюрного салона, включает камеру, показывает руку, а система автоматически находит пальцы и визуально примеряет разные ногти. Для салона это может стать сильной digital-фичей: клиент видит Rose Tan #153, Blue Ocean Navy #426 или другие дизайны не на абстрактной карточке товара, а прямо на своей руке.
С технической стороны это не просто "поставить картинку на видео". Нужно решить несколько задач одновременно:
- получить доступ к камере в браузере;
- определить руку и 21 landmark пальцев;
- понять, где должен находиться ноготь;
- построить форму ногтя для большого, указательного, среднего, безымянного пальца и мизинца;
- вставить цвет, texture или PNG-дизайн;
- не отправлять кадры на сервер;
- сделать UX пригодным для сайта;
- оставить возможность ручной корректировки посадки;
- не обещать больше, чем MVP реально умеет.
Именно поэтому стек был выбран прагматично: React, Vite, TypeScript, MediaPipe Tasks Vision, Canvas2D и статическая HTTPS-страница без backend. Это не тяжелое native-приложение, не Unity, не WebGL-проект и не custom ML pipeline. Это AI MVP для beauty tech, который можно встроить в сайт и постепенно улучшать.
Почему это важно для AI Armenia и локального бизнеса в Ереване
Для рынка Armenia, Yerevan, CIS и локальных сервисных бизнесов AI часто звучит абстрактно: chatbot, automation, RAG, LLM, AI agents. Но реальная ценность появляется там, где AI и computer vision создают понятный пользовательский сценарий. AR nail try-on для маникюрного салона - хороший пример такого сценария.
Пользователь не думает про MediaPipe, Canvas2D, landmark smoothing или PNG clipping. Он видит:
- "я могу примерить маникюр";
- "цвет выглядит примерно так на моей руке";
- "мне легче выбрать дизайн";
- "салон выглядит технологично";
- "это не обычная страница услуг, а интерактивный AI experience".
Для сайта aicoding.am такой кейс важен как proof of work: AI developer Armenia, AI developer Yerevan, AI coding studio Armenia, custom AI development, browser computer vision MVP и AI-assisted product development показываются не словами, а рабочей системой.
Исходная задача
Первичная формулировка была не как формальная спецификация, а как продуктовая идея:
- человек подносит руку к камере;
- алгоритм видит пальцы и ногти;
- система вставляет другие ногти вместо настоящих;
- нужны готовые PNG-ногти;
- особенно важен случай, когда ладонь повернута к камере: ногти не должны неестественно лежать поверх пальцев;
- нужно сделать MVP, который потом можно встроить в сайт.
Из этого мы сформулировали технический план:
- live camera first, а не photo upload;
- Vite React TypeScript;
- MediaPipe Hand Landmarker для отслеживания руки;
- Canvas2D overlay поверх video;
- landmark-derived nail masks вместо отдельной ML-модели сегментации ногтя;
- optional calibration;
- PNG support как демонстрационный режим;
- local privacy: кадры не уходят на сервер;
- статический production bundle для HTTPS hosting.
Это важный принцип AI product development: сначала не строить идеальную систему распознавания ногтевой пластины, а собрать MVP, который доказывает сценарий и выявляет реальные проблемы на камере.
Архитектура MVP
Технически MVP оформлен как Vite React app: это обычная frontend-страница, которую можно поднять локально, собрать в статический bundle и затем встроить в сайт или посадочную страницу салона.
Ключевая структура:
src/App.tsx- demo shell, registry стилей и default style;src/ar/NailTryOnWidget.tsx- главный embeddable-компонент;src/ar/handTracker.ts- загрузка MediaPipe model и inference wrapper;src/ar/nailGeometry.ts- геометрия ногтей из landmarks;src/ar/nailRenderer.ts- Canvas2D rendering;src/ar/calibration.ts- per-finger calibration и localStorage;src/ar/types.ts- типыNailStyle,NailMask,TrackedHand;public/models/hand_landmarker.task- self-hosted MediaPipe model;public/wasm/- self-hosted MediaPipe WASM runtime;public/nails/- PNG-ассеты для примерки.
Система работает в браузере. Backend для v1 не нужен. Это важно для privacy, скорости разработки и простоты интеграции в сайт.
Camera flow
Камера запускается только после действия пользователя. Это нужно для мобильных браузеров и для UX доверия. MVP использует getUserMedia с несколькими fallback-пресетами:
- ideal 1280x720, 30 FPS;
- fallback 960x540;
- fallback 640x480.
Видео идет в <video>, а overlay рисуется в <canvas>. Canvas подстраивается под фактический размер видеопотока. В Chrome проверке активный stream давал 1280x720.
Компонент умеет:
- стартовать камеру;
- остановить stream и вызвать
track.stop(); - закрыть MediaPipe tracker;
- очистить canvas;
- показать status: idle, loading, ready, detecting, lost, error.
Это не просто demo: для website embedding важно корректно освобождать камеру, не оставлять активные tracks и не ломать страницу после остановки.
Hand tracking: MediaPipe Hand Landmarker
Для распознавания руки используется @mediapipe/tasks-vision. Модель лежит локально в public/models/hand_landmarker.task, runtime WASM - в public/wasm.
Решение self-hosted:
- не зависит от CDN в production;
- проще контролировать deployment;
- лучше подходит для статического HTTPS-сервера;
- стабильнее для MVP, который должен жить внутри сайта.
Tracker настроен на одну руку:
numHands: 1;- running mode:
VIDEO; - CPU delegate;
- detection/presence/tracking confidence около 0.55-0.58.
Render loop ограничивает частоту inference, а canvas может перерисовываться чаще. Это стандартный компромисс для browser computer vision: не перегружать CPU, но сохранить визуальную отзывчивость.
Nail geometry: как из landmarks получить ногти
MediaPipe не дает границу ногтя. Он дает landmarks руки: wrist, MCP, PIP, DIP, TIP и другие точки. Поэтому MVP строит nail masks параметрически.
Для каждого пальца берутся DIP и TIP:
axisидет от DIP к TIP;acrossперпендикулярен axis;- длина distal phalanx дает масштаб;
- ширина оценивается из расстояний между суставами;
- итоговая форма строится как
Path2D.
После нескольких итераций простая форма была заменена на более женственную модель, основанную на параметрах:
L- длина ногтевой пластины;W0- ширина у основания;Wm- ширина в середине;W1- ширина у кончика;R0,Rm,R1- радиусы поперечной кривизны;dBase- глубина дуги кутикулы;dTip- округление кончика;E- видимое выступание ногтя.
В Canvas2D используется 2D-часть этой модели: ширина по длине, U-образная кутикула и мягкий округлый кончик. Радиусы сохранены в модели как база для дальнейшего 3D/шейдинг развития, но текущий MVP остается Canvas2D.
Практический результат: ногти больше не выглядят треугольными, не похожи на грубые stickers и отличаются по пальцам. Большой палец шире, мизинец меньше, средний и указательный выглядят вытянутее.
Посадка ногтя относительно TIP
Важная часть итераций была вокруг того, где начинать ноготь. Визуально пользователь ожидал, что верхняя tracked TIP-точка пальца будет связана с нижней частью ногтя. В коде это выразилось через nailAnchorDropRatio.
Сейчас посадка сдвинута ниже TIP на 25% высоты ногтя. Это не абсолютная медицинская истина, а MVP-эвристика, которую удобно дальше калибровать в live Chrome.
Почему так:
- MediaPipe TIP часто находится на конце пальца, а искусственный длинный ноготь должен начинаться ниже;
- у PNG-ногтей есть собственная высота и свободный край;
- если ставить PNG прямо по TIP, он выглядит слишком высоко;
- если опустить слишком сильно, ноготь начинает сидеть как наклейка на фаланге.
Именно поэтому включены landmarks по умолчанию: видно, где TIP, DIP, PIP и как маска ложится на палец.
PNG product rendering: Rose Tan #153 и Blue Ocean Navy #426
Самый важный продуктовый поворот: пользователь попросил не просто цвет, а точную вставку PNG-продукта. Были добавлены два ассета:
Rose Tan #153;Blue Ocean Navy #426.
PNG были получены из скриншотов. Обработка была только техническая:
- удалить белый фон через edge-connected background removal;
- сохранить внутренние highlights;
- оставить прозрачные углы;
- обрезать лишние поля;
- не перекрашивать;
- не дорисовывать искусственные блики поверх PNG.
Это принципиально. Для salon, beauty tech и e-commerce важно показывать реальный визуал продукта, а не приближенный цвет. Поэтому для PNG-стилей renderer не добавляет synthetic contour, highlight или recolor.
В NailStyle добавлено поле:
pngFit?: 'contain' | 'cover'Для точных product PNG используется contain. Это значит, что исходная картинка сохраняет пропорции и целиком попадает в маску. Затем canvas clipping ограничивает ее формой ногтя.
Почему Canvas2D, а не Three.js
Для первого MVP Canvas2D лучше:
- быстрее собрать;
- меньше runtime complexity;
- проще отлаживать в Chrome;
- достаточно для live camera overlay;
- легче встроить в обычный сайт;
- нет необходимости в WebGL pipeline на первом этапе.
Three.js или WebGL могут понадобиться позже, если мы захотим:
- реалистичный 3D curvature;
- physically-based highlights;
- depth mesh;
- более точное наложение на разные углы пальца;
- nail segmentation model;
- hand surface reconstruction.
Но для MVP цель другая: доказать, что browser AR manicure try-on может работать на сайте.
Palm-facing behavior: ладонь к камере
Один из самых сложных UX-моментов - когда человек показывает ладонь. В реальности ногти находятся на обратной стороне пальцев. Если камера видит ладонь, overlay не должен просто лежать поверх пальцев.
Изначально обсуждалась более сложная логика:
- скрывать только часть ногтя;
- оставлять видимый свободный кончик длинного ногтя;
- использовать собственный палец как occluder;
- строить matte из finger capsules.
Но для текущего MVP пользователь выбрал более простое и надежное поведение: если hand pose считается palm-facing, ногти исчезают. Это дешевле, стабильнее и меньше ломает восприятие, чем полу-работающая "магия за пальцем".
В будущей версии можно вернуться к partial occlusion, но только после более надежного определения ориентации пальцев и, возможно, depth/segmentation logic.
Calibration и ручная настройка
MVP поддерживает optional edit mode. Пользователь может:
- выбрать конкретный ноготь;
- двигать посадку;
- менять width scale;
- менять height scale;
- менять rotation;
- reset fit.
Calibration хранится локально в браузере через localStorage. Аккаунты, backend и синхронизация в MVP не нужны.
Это важно, потому что руки у людей разные. Абсолютная универсальная посадка невозможна без более сильной модели. Но calibration позволяет быстро исправить ошибку на конкретной руке и проверить UX.
Privacy-first архитектура
Кадры камеры не отправляются на сервер. Обработка идет локально:
- video stream живет в браузере;
- MediaPipe inference работает на клиенте;
- Canvas2D overlay рисуется локально;
- PNG assets загружаются как обычные static files;
- calibration хранится в localStorage.
Для AI Armenia, AI developer Yerevan и локальных бизнесов это важный selling point: интерактивная AI-фича не обязана сразу становиться риском по privacy. MVP можно показать клиентам без backend, без хранения изображений, без обработки персональных данных на сервере.
Что уже проверено
Проверки:
npm run build
npm run lintОбе команды проходили после последних изменений.
Chrome QA:
- локальная страница открыта на
http://127.0.0.1:5173/; - камера запускается;
- active style:
Blue Ocean Navy #426; - landmarks включены;
- canvas активного stream:
1280x720; - tracking работает;
- PNG отображается на ногтях.
Известный console noise:
INFO: Created TensorFlow Lite XNNPACK delegate for CPU.Он появляется как error-level log, но в текущей проверке не означал падение.
Что не нужно преувеличивать
Это важная часть инженерного контента. Нельзя говорить, что MVP уже идеально распознает реальные границы ногтя. Он этого не делает.
Правильные claims:
- browser-based AR nail try-on MVP;
- MediaPipe hand tracking;
- landmark-derived nail masks;
- Canvas2D overlay;
- exact PNG product preview with clipping;
- local camera processing;
- optional calibration;
- static HTTPS deployment ready in principle.
Неправильные claims:
- "идеальное распознавание ногтевой пластины";
- "медицински точная геометрия";
- "точное соответствие цвета лака";
- "production-ready mobile AR";
- "полная сегментация руки и ногтя";
- "универсальная посадка для всех рук без калибровки".
Эта честность полезна и для SEO, и для доверия. AI developer Armenia, AI development Yerevan, computer vision developer, AR try-on engineer - все эти запросы должны вести не к пустому marketing claim, а к доказуемому инженерному результату.
Почему это хороший кейс для aicoding.am
Этот проект хорошо ложится в позиционирование aicoding.am:
- AI-assisted product development;
- vibe coding with engineering discipline;
- browser computer vision;
- custom AI MVP for business;
- practical React development;
- production-minded prototype;
- AI developer in Armenia;
- AI coding studio in Yerevan;
- automation and product engineering.
Кейс показывает не просто "мы умеем писать React". Он показывает полный цикл:
- Из нечеткой идеи выделить MVP.
- Найти подходящий existing AI/CV runtime.
- Не переусложнять ML-модель в v1.
- Сделать live camera UX.
- Итеративно править геометрию по скриншотам.
- Добавить exact product PNG rendering.
- Проверить через Chrome.
- Зафиксировать архитектурные решения, ограничения MVP и проверочные команды, чтобы следующая итерация разработки не начиналась заново.
Для клиента это сильнее, чем абстрактная фраза "мы внедряем AI". Здесь видно, как AI coding превращается в конкретный интерфейс.
Ключевые SEO-сущности
Эта статья должна помогать по запросам:
- AI разработчик в Армении;
- AI разработка Ереван;
- AI developer Armenia;
- AI developer Yerevan;
- AI coding studio Armenia;
- AI product development Armenia;
- AI для бизнеса Армения;
- computer vision developer Armenia;
- AR try-on app development;
- AR примерка маникюра;
- виртуальная примерка ногтей;
- AI для маникюрного салона;
- beauty tech AI;
- MediaPipe React developer;
- Vite React computer vision app;
- browser-based AI MVP;
- custom AI development for beauty salons.
Но важно использовать эти keywords естественно. Статья должна ранжироваться не за счет keyword stuffing, а за счет entity coverage: Armenia, Yerevan, AI developer, React, MediaPipe, computer vision, AR try-on, beauty salon, manicure, Canvas2D, Vite, TypeScript, privacy-first, static hosting, MVP.
Следующие инженерные шаги
Чтобы превратить MVP в более сильный demo для сайта или клиента, следующие шаги:
- Проверить mobile Safari и Android Chrome.
- Подстроить palm-facing thresholds по реальным live poses.
- Сделать режим "debug off" для публичной демонстрации.
- Добавить больше PNG-продуктов из каталога салона.
- Улучшить пер-палец fitting для разных длин ногтей.
- Добавить screenshot capture для клиента.
- Проверить HTTPS hosting и camera permissions.
- Добавить copy: "visual preview only, color may vary by lighting and screen".
- Рассмотреть segmentation model, если landmark masks перестанут хватать.
- Подготовить embeddable API для сайта салона.
Итог
Мы уже сделали working MVP: browser-only AR Nail Try-On на React, Vite, TypeScript, MediaPipe и Canvas2D. Система запускает камеру, отслеживает руку, строит параметрические nail masks, вставляет точные PNG-ногти, поддерживает calibration, не отправляет кадры на сервер и проходит build/lint.
Это не финальная commercial AR-платформа, но это реальный AI product prototype. Для aicoding.am это сильный кейс в направлении AI Armenia, AI developer Yerevan, custom AI development, computer vision MVP, browser AR и AI-assisted product development для локального бизнеса.
Главный результат: из идеи "человек подносит руку, а сайт примеряет ногти" получился работающий инженерный фундамент, который можно развивать в production-ready beauty tech feature.
Где это применимо
Beauty salons, e-commerce и interactive websites с практическим AI MVP
Этот кейс полезен локальным сервисным бизнесам, которые хотят проверить computer vision идею на сайте до инвестиций в полноценное AR-приложение или custom ML model.
- Маникюрные салоны и beauty-бизнесы, которым нужна виртуальная примерка или interactive product preview.
- Основатели, которые хотят протестировать browser-based computer vision перед mobile app или custom segmentation.
- Команды, которые ищут AI-разработчика в Армении или Ереване для практического MVP.