Привет, меня зовут Виталий Беляев, я Android-разработчик в red_mad_robot. В этой статье я расскажу про опыт интеграции CameraX с ML Kit на замену библиотеки card.io, и что в итоге из этого получилось.
В приложении над которым я работаю, есть экран добавления банковской карты. Там можно заполнить всю информацию руками, а можно нажать «Сканировать», и с помощью камеры телефона распознать номер карты. Для этого у нас используется библиотека card.io.
Почему мы решили заменить card.io?
- мы хотели заменить third-party library, которая уже находится в архиве, на что-то более актуальное от крупных компаний;
- card.io использует подход с созданием отдельной activity, а мы стараемся придерживаться single-activity подхода;
- мало возможностей кастомизации UI в card.io ;
- интересно было попробовать CameraX и ML Kit ;
- card.io тянет много нативных библиотек. Если вы не используете App Bundle, то выпиливание card.io уменьшит ваш APK на 12 MB в размере.
РАЗНИЦА 2МП И 5МП КАМЕР ВИДЕОНАБЛЮДЕНИЕ ЗА ПАРКОВКОЙ
Что такое ML Kit?
Сразу уточню, что такое ML Kit . По сути это библиотека, которая предоставляет API для использования ML под разные задачи, такие как маркировка изображений, считывание штрихкода, распознавание текста, лиц, объектов, перевод текста, text to speech и так далее.
Всё это делается с помощью обученных моделей и может происходить как локально(on-device), так и удаленно на сервере(on-cloud).
И у Google, и у Huawei есть свой ML Kit , которые очень похожи. Google ML Kit зависит от GMS, а Huawei ML Kit , соответственно, зависит от HMS.
Для задачи по распознаванию номера банковской карты нам подходит та часть ML Kit , что связана с распознаванием текста. В обоих ML Kit она называется Text Recognition . В обоих ML Kit данный Text Recogniton может работать локально(on-device).
Используя on-device Text Recognition мы получаем более высокую скорость работы, независимость от наличия интернета и отсутствие платы за использование, по сравнению с on-cloud решением.
В качестве входа, Text Recognition принимает изображение, которое он обрабатывает и затем выдаёт результат в виде текста, который он распознал. Чтобы обеспечить Text Recognition входными данными, нам нужно получить эти изображения(фреймы) с камеры устройства.
Получаем фреймы с камеры для анализа
Для этой задачи нам необходимо работать с Camera API, чтобы показывать preview и передавать с него фреймы на анализ в ML Kit .
Google сделал CameraX — библиотеку для работы с камерой, часть Jetpack, которая инкапсулирует в себе работу с Camera1 и Camera2 API и предоставляет удобный lifecycle-aware интерфейс для работы с камерой.
В CameraX есть так называемые use cases, их всего три:
- ImageAnalysis
- Preview
- ImageCapture
По названию нетрудно догадаться, что и зачем используется. Нас интересуют Preview и ImageAnalysis .
УЯЗВИМОСТИ КАМЕР ВИДЕОНАБЛЮДЕНИЯ | Kali Linux, Shodan, Censys, RouterSploit, Hydra и Google
val preview = Preview.Builder() .setTargetRotation(Surface.ROTATION_0) .setTargetAspectRatio(screenAspectRatio) .build() .also < it.setSurfaceProvider(binding.cameraPreview.surfaceProvider) >val imageAnalyzer = ImageAnalysis.Builder() .setTargetRotation(Surface.ROTATION_0) .setTargetAspectRatio(screenAspectRatio) .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST) .build() .also
Не будем вдаваться в подробности каждой строчки, про это можно почитать хорошую документацию по CameraX или пройти codelab. Сейчас же мы конфигурируем use cases , и стоит отметить, что это довольно удобно и компактно выглядит.
Далее мы всё это привязываем к lifecycle и запускаем.
try < cameraProvider.unbindAll() camera = cameraProvider.bindToLifecycle( viewLifecycleOwner, CameraSelector.DEFAULT_BACK_CAMERA, useCaseGroup ) setupCameraMenuIcons() >catch (t: Throwable)
Здесь мы получаем так называемый cameraProvider — часть CameraX интерфейса. Затем один раз выполняем bindToLifecycle и всё. Далее, когда приложение уходит в background, CameraX сама обрабатывает эти ситуации и релизит камеру, а когда приложение возвращается в foreground, запускает наши use cases . И это очень круто: те, кто хоть раз сталкивался с Camera1 / Camera2 API, меня поймут.
При создании ImageAnalysis use case мы передали ему framesAnalyzer — это тоже сущность из CameraX , по сути, это просто SAM-интерфейс ImageAnalysis.Analyzer с одним методом analyze() , в котором нам приходит картинка в виде ImageProxy .
private val framesAnalyzer: ImageAnalysis.Analyzer by lazy
Вот таким образом мы получили картинку, которую можно передавать в ML Kit на распознавание.
GMS ML Kit
У Google раньше была библиотека ML Kit for Firebase, где были собраны все ML-related вещи: те, что работают on-device (сканирование штрихкодов например) и те, что работают on-cloud (Image Labeling например).
Потом они вынесли все те части, которые можно использовать on-device, в отдельный артефакт и назвали его ML Kit.
Все части, которые используют on-cloud обработку, поместили в библиотеку Firebase ML.
Вот, как раз новый ML Kit , который работает on-device и который полностью бесплатен, мы и будем использовать для распознавания номера карты.
Часть, отвечающая за распознавания текста в ML Kit , называется Text Recognition, и подключается она таким образом:
implementation ‘com.google.android.gms:play-services-mlkit-text-recognition:16.1.3’
В манифест внутри application tag нужно добавить:
Это нужно, чтобы модели для ML Kit скачались при установке вашего приложения. Если этого не сделать, то они загрузятся при первом использовании распознавания.
Далее всё достаточно просто, делаем всё по документации и получаем результат распознавания:
fun processFrame(frame: Image, rotationDegrees: Int): Task> < val inputImage = InputImage.fromMediaImage(frame, rotationDegrees) return analyzer .process(inputImage) .continueWith < task->task.result .textBlocks .flatMap < block ->block.lines > .map < line ->line.toRecognizedLine() > > >
Библиотека отдаёт достаточно детализированный результат в виде Text объекта, который содержит в себе список TextBlock . Каждый TextBlock , в свою очередь, содержит список Line , а каждый Line содержит список Element .
Для наших тестовых целей, пока что подойдёт просто работать со списком строк, поэтому мы используем RecognizedLine — это просто:
data class RecognizedLine(val text: String)
Отдельный класс нам нужен для того, чтобы иметь общую сущность, которую можно возвращать из GMS и из HMS ML Kit .
HMS ML Kit
Так как наше приложение распространяется также в Huawei App Gallery, нам нужно использовать ML Kit от Huawei.
В общем и целом, в HMS все составляющие имеют похожий на GMS интерфейс, ML Kit в этом плане не исключение.
Но Huawei не делали никакой разбивки ML библиотек по признаку on-device и on-cloud, поэтому, с этим SDK можно запустить как on-device распознавание, так и on-cloud.
Подключаем HMS ML Kit Text Recognition SDK согласно документации:
implementation ‘com.huawei.hms:ml-computer-vision-ocr:2.0.5.300’ implementation ‘com.huawei.hms:ml-computer-vision-ocr-latin-model:2.0.5.300’
И аналогично с GMS ML Kit добавляем в манифест:
Руководствуясь документацией обрабатываем фрейм с камеры и получаем результат:
fun processFrame(frame: Image, rotationDegrees: Int): Task> < val mlFrame = MLFrame.fromMediaImage(frame, getHmsQuadrant(rotationDegrees)) return localAnalyzer .asyncAnalyseFrame(mlFrame) .continueWith < task ->task.result .blocks .flatMap < block ->block.contents > .map < line ->line.toRecognizedLine() > > >
Результаты тестов распознавания
Я был удивлён результатами — оказалось, что распознавание работает не так хорошо и стабильно, как я думал.
При дневном естественном освещении у меня получилось распознать номер карты длинной в 16 цифр на своей VISA, но на это ушло около минуты разного кручения, отдаления и приближения карты. При этом одна из цифр была неверной.
При искусственном освещении, а также при тусклом освещении со включеной вспышкой, мне вообще не удалось получить что-то вменяемое, похожее на номер карты.
В то же время, сard.io даже в очень тёмном помещении со включенной вспышкой рапознаёт номер карты в среднем за 1-2 секунды.
Попытка использовать on-cloud распознавание
Раз on-device распознавание выдаёт неприемлемые результаты, то появилась идея попробовать on-cloud распознавание.
Сразу нужно понимать, что это будет платно, как в случае с GMS, так и в случае с HMS.
Как я ранее писал, Google разбил библиотеки на on-device и on-cloud. Поэтому вместо ML Kit нам, нужно использовать Firebase ML . Но не всё так просто, так как использовать его можно только если у вас Blaze-план для проекта в Firebase.
Поэтому я решил, что проще будет потестить on-cloud распознавание на HMS ML Kit . Для этого нам нужен проект в App Gallery Connect.
Нужно подключить agconnect плагин:
classpath ‘com.huawei.agconnect:agcp:1.4.1.300’
Также нужно скачать agconnect-services.json и положить его в app-папку вашего проекта.
Text Recognition SDK в данном случае тот же, и нам нужно использовать другой Analyzer , в который необходимо передать apiKey для вашего проекта из App Gallery Connect.
Создаём MLTextAnalyzer согласно документации:
private val remoteAnalyzer: MLTextAnalyzer by lazy
Далее обработка фрейма очень похожа на on-device:
fun processFrame(bitmap: Bitmap, rotationDegrees: Int): Task> < val mlFrame = MLFrame.fromBitmap(bitmap) return remoteAnalyzer .asyncAnalyseFrame(mlFrame) .continueWith < task ->task.result .blocks .flatMap < block ->block.contents > .map < line ->line.toRecognizedLine() > > >
Нужно отметить, что мы здесь используем Bitmap , а не Image для создания MLFrame , хоть мы и видели в случае с on-device, что можно создать MLFrame из Image . Мы это делаем потому, что MLTextAnalyzer кидает NPE с сообщением от том, что внутренний Bitmap null, если передавать ему MLFrame , созданный из Image . Если создавать из Bitmap , то всё работает.
Так как on-cloud Text Recognition платный (хоть и с бесплатным лимитом), я решил, что лучше перестрахуюсь и буду делать фото, то есть использовать ImageCapture use case вместо ImageAnalysis для on-cloud распознавания.
imageCapture = ImageCapture.Builder() .setTargetRotation(Surface.ROTATION_0) .setTargetAspectRatio(screenAspectRatio) .setCaptureMode(ImageCapture.CAPTURE_MODE_MAXIMIZE_QUALITY) .build()
Результаты распознавания в этом случае неудовлетворительные: из трёх фото в отличном качестве (я их сохранял в память приложения и посмотрел после съемки) с ествественным дневным освещением, ни на одном номер карты не распознался корректно.
При этом, стоит ометить, что с платным on-cloud распознаванием не получится использовать тот же подход, который мы использовали с on-device распознаванием— то есть, передавать фреймы камеры с максимально доступной нам скоростью и пытаться на каждом из них распознать номер карты.
На каждом дейвайсе будет по-разному: на Pixel 3 XL это в среднем 5 fps, на Huawei Y8p — это 2 fps, но главное, что в среднем в секунду этих фреймов будет больше 1, и они будут передаваться на распознавание сразу, как пользователь откроет экран, даже если он ещё не навёл камеру на карту.
Получается весьма значительное количество запросов, поэтому придётся отдать немалую сумму денег.
Последний шанс
После неудач с on-device и on-cloud распознаванием текста, я решил поискать, может есть более специфичные части в ML Kit , именно про распознавание номера карты. В GMS ML Kit ничего такого не нашёл, а вот в HMS ML Kit нашёл Bank Card Recognition.
Но есть 3 проблемы:
- Он сам работает с камерой, нужно только передать ему Activity и callback для получения результатов. Соответственно, мы не можем использовать CameraX .
- У GMS ML Kit такого нет и соответственно, работать это будет только для приложений в Huawei App Gallery, а мы хотим, чтобы работало для всех.
- Не очень понятна цена для этой фичи: для on-device написано Free in the trial period, а для on-cloudN/A.
Покажите мне код
Все вставки кода в статье сделаны из кода sample-приложения, доступного в этом репозитории. Оно рабочее, можете запусить на своём девайсе и проверить качество распознавания. Помимо CameraX + ML Kit , там также добавлена card.io , чтобы можно было сравнивать.
Итоги
Я рассказал про наш опыт замены card.io на связку CameraX + ML Kit для распознавания номера карты. ML Kit (GMS и HMS) справляется с задачей распознавания номера карты сильно хуже, по сравнению с card.io .
В связи с этим было принято решение оставить card.io в приложении и посмотреть в сторону считывания номера карты с помощью NFC, так как подавляющее большинство банковских карт сейчас — бесконтактные.
Все ссылки
- Sample app для этой статьи
- card.io
- CameraX
- CameraX codelab
- GMS Text Recognition
- GMS ML Kit Pricing
- Firebase ML
- HMS Text Recognition
- HMS ML Kit Pricing
- HMS Bank Card Recognition
Источник: habr.com
Camera Kit
Это приложение обеспечивает доступ к комплекту камеры SDK, который позволяет использовать линзы дополненной реальности в контенте, создаваемом через камеру. Опыт AR предназначен для того, чтобы вдохновить творчество и самовыражение.
Это приложение используется для питания систем для систем, часто предварительно установленных на устройствах, таких как определенные приложения для собственных камеры.
Дополнительная информация может быть найдена. Здесь: https://kit.snapchat.com/camera-kit
What’s New
Changelog: https://github.com/Snapchat/camera-kit-reference/blob/main/CHANGELOG.md
Similar
Zone Edge Launcher and drawer
A Swipad alternative. App drawer that keeps your shortcuts one finger swipe away
Action Launcher: Pixel Edition
Material You-style color · ️ Limitless customization · ️ Speed
ADW Launcher 2
ADW Launcher 2, beyond tweaking your android desktop
Microsoft Launcher
Personalize your phone and stay organized on the go.
Mini Desktop (Launcher)
Super lightweight Android launcher, with icon pack and apps lock
Apex Launcher Classic
Apex Launcher Classic v3.3.3 for you!
Niagara Launcher ‧ fresh/clean
A minimalist productivity launcher. One hand-friendly. Zero ads.
Lynx Launcher
A sleek, fast and unobtrusive Launcher.
Cool S20 Launcher Galaxy OneUI
Cool S20 Launcher, a style of Galaxy S20 launcher with One UI features and more
Инструменты
NightOwl VPN — Fast vpn, Free, Unlimited, Secure
Лучший безлимитный бесплатный vpn для разблокировки веб-сайтов, защиты конфиденциальности и точки доступа Wi-Fi
Мой МТС
Получайте данные по балансу и управляйте услугами в удобном интерфейсе.
QR Share
Нулевой трафик! SHAREit поможет вам экономить трафик и время.
Fnmods Esp
Fnmods Esp Another Experience Free High Features configuration Powered fnmods
Light cleaner
Простое приложение сохраняет заряд батареи и ускоряет работу телефона.
Auto Clicker — Automatic tap
Лучший инструмент об авто кликере. Помочь вам автоматизировать повторные нажатия.
Yandex
Яндекс — поиск по интернету, изображениям и видео
VPN Inf — Unlimited Free VPN Super Phone Cleaner
Super Phone Cleaner #128640;
Calculator
Простой калькулятор для Android
Google Lens
Камера поможет переводить слова, определять растения и многое другое
Translate All — Speech Text Translator
Translate All — Речевой текстовый переводчик
System Update
Обновление системы используется для обновления программного обеспечения EMUI операционной системы на устройствах.
Phone Cleaner- Cache Clean, Android Booster Master
Phone Cleaner — приложение для очистки кэша и ускорения работы телефона
Phone
Надежное приложение для звонков с АОН, защитой от спама и другими функциями
Yoga VPN — Free Unlimited Unblock
Постоянное бесплатное приложение VPN, надежный профессионал.
Лучшие Новые Приложения В Категории
CCleaner: Cache Cleaner, Phone Booster, Optimizer
Удаление ненужных файлов, освобождение места и улучшение работы системы
Turbo VPN- Free VPN Proxy Server Antivirus
Быстрое и мощное мобильное приложение ESET для защиты от вирусов.
Call Recorder — Cube ACR
Запись разговоров по телефону, в Skype, WhatsApp, Viber, Hangouts, Signal и т.д.
Dr.Web Security Space
Комплексная защита мобильных устройств от любых угроз (14 дней бесплатно).
Avast Antivirus – Scan security
Доступ к любимому контенту. Защита конфиденциальности с помощью NordVPN!
Browsec: FREE Secure proxy
Быстрые прокси сервера и защита Wi-Fi, большой список стран, анонимность 100%
JAVAD Mobile Tools
Управляйте приемниками JAVAD при помощи смартфонов или планшетов с Android™
Olmelny
PDF Scanner App — Free Document Scanner https://arkapk.com/ru/app/com.snap.camerakit.plugin.v1″ target=»_blank»]arkapk.com[/mask_link]
Camera Connection Kit. Варианты использования с iPad
Противники iPad часто отмечают один недостаток этого планшета – отсутствие USB порта. Однако, Apple официально продает аксессуар под названием Camera Connection Kit. Как понятно из названия, его основная функция – подключение камеры для переноса фотографий на iPad, но возможностей у этого аксессуара гораздо больше, чем кажется на первый взгляд.
Подключение USB клавиатуры
Как ни странно, в iPad есть поддержка USB-клавиатур. Просто подключите клавиатуру через USB порт в Camera Connection Kit и приступайте к набору текста. iPad может вывести на экран сообщение, что работа с данным аксессуаром не поддерживается.
Достаточно просто отклонить это сообщение и продолжить работу с клавиатурой.
Подключение USB-аудио устройств
Некоторые пользователи считают, что качество звука у USB-устройств лучше, чем у аналоговых. Хорошая новость – эти устройства можно использовать и с iPad, с помощью Camera Connection Kit. Переключиться между устройствами вывода звука можно через меню Airplay.
Подключение USB-микрофона
Если Вы хотите записать качественный звук на iPad, то использовать встроенный микрофон не стоит. Куда удобнее подключить внешний USB микрофон через Camera Conection Kit.
Подключение флэш-накопителей
Популярная джейлбрейк-утилита iFile позволит Вам получить доступ к внешнему накопителю: SD-карте или флешке, подключенной через Camera Connection Kit.
Подробнее об этом читайте в отдельной статье.
Как избавиться от ошибки “Данный аксессуар потребляет слишком много электроэнергии”?
Как только Вы решите вплотную использовать Camera Connection Kit, Вы сразу столкнетесь с тем, что многие USB-устройства не работают с iPad, так как требуют большего напряжения USB порта. Справиться с этой проблемой можно только одним способом – используя USB-концентратор с блоком внешнего питания. Благодаря использованию такого устройства, Вы сможете подключить к iPad даже внешний жесткий диск.
Насколько публикация полезна?
Нажмите на звезду, чтобы оценить!
Средняя оценка 0 / 5. Количество оценок: 0
Оценок пока нет. Поставьте оценку первым.
Источник: yablyk.com