Как реализовать распознавание лиц и отрисовку квадратиков на изображении из камеры
Что проверяют
Умеете ли вы собрать живой конвейер «камера, анализ кадра, отрисовка поверх превью» на актуальном стеке и понимаете, где он ломается. Следом обычно спрашивают, как совместить координаты лица с экраном и что будет с производительностью на слабом устройстве.
Как отвечать
Сначала уточните термин: найти лица на кадре это детекция, а понять, чьё лицо, уже распознавание. Для него нужна модель эмбеддингов (например, на LiteRT, бывший TensorFlow Lite) и база эталонов. Квадратики рисуют по результатам детекции.
Каркас на современном стеке:
- камера: CameraX, связка
Previewдля показа иImageAnalysisдля кадров. Стратегия по умолчаниюSTRATEGY_KEEP_ONLY_LATESTотбрасывает кадры, которые анализ не успевает обработать; - детекция: ML Kit Face Detection,
FaceDetectorOptionsсPERFORMANCE_MODE_FASTдля потока, кадр оборачивается черезInputImage.fromMediaImage(image, rotationDegrees); - результат: у каждого
FaceестьboundingBox, по желанию контуры и ключевые точки; - отрисовка: своя
ViewповерхPreviewViewсcanvas.drawRectвonDraw, в Compose этоCanvasв том жеBox; - разрешение:
CAMERAзапрашивается в рантайме черезActivityResultContracts.RequestPermission.
Главная техническая часть: перевод координат. Рамка приходит в системе координат кадра анализа, у которого своё разрешение и поворот, а превью масштабируется под экран. Нужно учесть поворот, масштаб, обрезку FILL_CENTER и зеркалирование фронтальной камеры. Проще отдать это MlKitAnalyzer из camera-mlkit-vision с COORDINATE_SYSTEM_VIEW_REFERENCED: он вернёт рамки уже в координатах PreviewView.
Где спотыкаются
Не закрывают ImageProxy после обработки. Анализатор ждёт закрытия кадра, поток останавливается после первого же, и выглядит это как «детектор завис».
Рисуют рамки прямо в координатах кадра. На экране они смещены и растянуты, а на фронтальной камере двигаются в противоположную сторону.
Предлагают Mobile Vision (play-services-vision) и CameraSource из старых туториалов. Этот API давно объявлен устаревшим, на смену ему пришёл ML Kit.