Розпізнавання зображень у застосунках: чому і як використовувати

Технологія розпізнавання зображень все частіше використовується в нашому повсякденному житті. Компанії та підприємства застосовують її для вирішення різних проблем, від безпеки до досліджень задоволеності клієнтів. Оцінки світового ринку розпізнавання зображень становили 28,3 мільярда доларів. Очікується, що до $126,8 мільярда до 2032 року з CAGR 16,5%. Цей фактор створив попит на ринку, оскільки бізнеси та галузі прагнуть перейти від традиційних ручних операцій до автоматизованих процесів. Також постійний розвиток у галузі глибокого навчання та комп'ютерного зору є одним з найзначніших двигунів ринку.

Використання розпізнавання зображень

Нижче наведено приклади того, як розпізнавання зображень використовується в різних сферах.

Охорона здоров'я

Хвороба змінює зовнішність кожного, і не на краще. Але є захворювання, які змінюють зовнішність більше, ніж інші. Порівнюючи деформації обличчя пацієнта з тими, що збережені в базі даних, лікарі ставлять більш точний діагноз і навіть визначають інтенсивність болю, який відчуває пацієнт. Застосунки, такі як AiCure, фіксують, чи приймав пацієнт ліки. А Orcam MyEye є справжнім порятунком для людей із поганим зором: застосунок інформує користувача про все, що він «бачить».

Комп'ютерний зір виявляє вживання ліків. Зображення з www.ncbi.nlm.nih.gov

Туризм

Ви бачите чудове фото в Instagram і хочете пообідати в тому ж кафе? Що якщо завантажити зображення в застосунок, щоб він переніс вас у це місце? На основі фотографій з Instagram сервіс Jetpac City Guides навіть створює топові списки для туристів з описами та відгуками.

Транспорт

Розпізнавання зображень є функцією, без якої безпілотний автомобіль не проїде навіть найменшу відстань без аварії. Але якщо ваш автопарк управляється людьми, ви також можете скористатися цією технологією машинного навчання. Наприклад, для запобігання несанкціонованому використанню автомобілів або неуважності водіїв.

Електронна комерція

Тут технології розпізнавання зображень застосовуються найширше. Онлайн-магазини eBuy та Bohoo допомагають користувачам знайти «той самий» товар, навіть коли клієнт не може згадати його назву. А такі застосунки, як Lookwish та NICE, навіть дозволяють віртуально «приміряти» одяг.

Ви вважаєте, що це тільки для великих і заможних гравців? Дійсно, впровадження машинного навчання (яке є основою розпізнавання зображень) може стати проблемою, якщо починати з нуля. На щастя, існують публічні бібліотеки, які дозволяють використовувати готові моделі при розробці ваших продуктів. Firebase ML Kit — одна з них. Далі ми розповімо, як його можна використовувати при розробці застосунків.

Що таке Firebase ML Kit і як він працює

ML Kit — це набір інструментів для мобільної розробки, спеціалізований на машинному навчанні від Google. Він об'єднує додатки для Android та iOS в універсальне та легко інтегроване рішення. У нього немає крутої кривої навчання, навіть якщо ви фахівець або новачок у машинному навчанні. Розробка може здійснюватися в кількох рядках коду. Не потрібно запам'ятовувати складні формули нейронних мереж або методи оптимізації моделей, щоб почати. Проте досвідчені розробники машинного навчання можуть інтегрувати свої власні моделі TensorFlow Lite у свої мобільні застосунки, використовуючи зручні API, надані в ML Kit.

ML Kit може працювати як онлайн (в цьому випадку ви отримуєте безкоштовний доступ до значно більшої бази даних, але з обмеженою кількістю запитів: лише перші тисяча з них будуть безкоштовними), так і офлайн. Такі функції, як розпізнавання тексту, штрих-кодів та зображень, доступні як онлайн, так і офлайн. Розпізнавання пам'яток (відомі будівлі, ріки, вулиці тощо) доступне лише онлайн, а розпізнавання облич — тільки офлайн з пристрою.

Як інтегрувати розпізнавання зображень у застосунок

В якості прикладу, почнемо з сканування штрих-кодів:

По-перше, вам потрібно додати залежність для сканування штрих-кодів ML Kit у вашому gradle файлі.

Implementation 'com.google.android.gms:play-services-mlkit-barcode-scanning:18.3.0'

Наступний крок — ініціалізувати параметри для нашого клієнта сканування штрих-кодів. Ви можете визначити, які формати штрих-кодів ви хочете обробляти. Повний список підтримуваних форматів можна знайти тут.

private val options = BarcodeScannerOptions.Builder()
   .setBarcodeFormats(Barcode.FORMAT_QR_CODE)
   .build()

Також, якщо ви хочете виявити всі штрих-коди, навіть якщо їх не можна розшифрувати, ви можете активувати їх виявлення, використовуючи метод BarcodeScanningOptions Builder `enableAllPotentialBarcodes()`.

Тепер ви можете використовувати ці параметри в функції, яка буде виявляти наші штрих-коди на об'єкті InputImage.

private suspend fun detectBarCodes(image: InputImage): List<barcode>{return BarcodeScanning.getClient(options)
       .process(image).await()}</barcode>

І давайте використаємо цю функцію, щоб отримати всі штрих-коди та оновити наш інтерфейс.

private fun proceedPhoto(photo: Uri){
   lifecycleScope.launch{
       val barcodes =
           detectBarCodes(InputImage.fromFilePath(requireContext(), photo))for(barcode in barcodes){
           updateUi(barcode)}}}

Останній крок — обробка штрих-коду та оновлення інтерфейсу. Кожен штрих-код має свій тип. Ви можете знайти всі типи тут.

А ось обробка найпоширеніших типів штрих-кодів.

private fun updateUi(barcode: Barcode){
   when (barcode.valueType){
       Barcode.TYPE_WIFI-&gt;{
           val ssid = barcode.wifi?.ssid
           val password = barcode.wifi?.password//Зробіть щось з цими даними}
 
 
       Barcode.TYPE_EMAIL-&gt;{
           val email = barcode.email?.address//Зробіть щось з цими даними}
 
 
       Barcode.TYPE_PHONE-&gt;{
           val phone = barcode.phone?.number//Зробіть щось з цими даними}
 
 
       Barcode.TYPE_URL-&gt;{
           val url = barcode.url?.url//Зробіть щось з цими даними}
 
 
       Barcode.TYPE_GEO-&gt;{
           val point = barcode.geoPoint//Зробіть щось з цими даними}
 
 
       else-&gt;{
           val raw = barcode.rawValue//Зробіть щось з цими даними}}}
 

Наступне — розпізнавання зображень. За допомогою API розпізнавання зображень ML Kit ви можете виявляти та витягувати інформацію про об'єкти на зображенні в широкому діапазоні категорій. Модель розпізнавання зображень за замовчуванням може ідентифікувати загальні об'єкти, місця, діяльність, види тварин, продукти тощо.

Процес практично такий же, з лише кількома відмінностями.

Ось залежність для бібліотеки розпізнавання зображень.

implementation 'com.google.android.gms:play-services-mlkit-image-labeling:16.0.8'
 

Цього разу ми створимо клієнта з параметрами за замовчуванням і продовжимо з нашим зображенням, як у скануванні штрих-кодів.

private suspend fun detectLabels(image: InputImage): List<imagelabel>{return ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS)
       .process(image).await()}
 
 
</imagelabel>

Або ви можете ініціалізувати свої параметри та встановити необхідний рівень впевненості.

val options = ImageLabelerOptions.Builder()
   .setConfidenceThreshold(0.5F)
   .build()
 
 

Потім ми можемо продовжити з фотографією та отримати мітки

private fun proceedPhoto(photo: Uri){
   lifecycleScope.launch{
       val labels =
           detectLabels(InputImage.fromFilePath(requireContext(), photo))
       labels.forEach{
           updateUi(it)}}}
 
 
 

З мітки ви можете отримати інформацію про позначені об'єкти. Ви можете отримати текстовий опис кожної мітки, індекс серед усіх міток, підтримуваних моделлю, і рівень впевненості відповідності.

private fun updateUi(label: ImageLabel){
   val labelText:String= label.text
   val labelIndex = label.index
   val labelConfidence:Float= label.confidence//Зробіть щось з цими даними}
 
 

Останнє, що ми розглянемо, — це переклад тексту. Вам потрібно отримати дозвіл на доступ до Інтернету у файлі маніфесту, щоб завантажити модель перекладу.

<uses-permission android:name="android.permission.INTERNET"></uses-permission>
 
 

Щоб перекласти текст з зображення, спочатку потрібно його витягти. Тож ми використаємо дві бібліотеки: розпізнавання тексту та переклад тексту.

implementation 'com.google.android.gms:play-services-mlkit-text-recognition:19.0.0'
implementation 'com.google.mlkit:translate:17.0.2'
 
 

Бібліотека TextRecognition розпізнає лише латиницю. Щоб розпізнати азійські мови, потрібно додати різні залежності.

implementation 'com.google.mlkit:text-recognition-korean:16.0.0'
implementation 'com.google.mlkit:text-recognition-chinese:16.0.0'
implementation 'com.google.mlkit:text-recognition-japanese:16.0.0'
implementation 'com.google.mlkit:text-recognition-devanagari:16.0.0'
 
 

По-перше, давайте створимо функцію, яка витягує текст з нашого зображення. Вам слід використовувати різні RecognizerOptions для різних мов.

  • TextRecognizerOptions
  • KoreanTextRecognizerOptions
  • JapaneseTextRecognizerOptions
  • ChineseTextRecognizerOptions
  • DevanagariTextRecognizerOptions
private suspend fun detectText(image: InputImage): Text {return TextRecognition
       .getClient(TextRecognizerOptions.DEFAULT_OPTIONS)
       .process(image)
       .await()}
 
 
 

Потім оголосіть параметри перекладача та вкажіть вихідну та цільову мови.

val options = TranslatorOptions.Builder()
   .setSourceLanguage(TranslateLanguage.ENGLISH)
   .setTargetLanguage(TranslateLanguage.UKRAINIAN)
   .build()
 
 
 
 

Також слід оголосити умови перекладу для завантаження моделі перекладу. Ви можете requireWifi або requireCharging

val conditions = DownloadConditions.Builder()
   .requireWifi()
   .build()
 
 

Наступний крок — створити клієнта перекладу, завантажити модель перекладу, виявити текст і, нарешті, перекласти його.

private suspend fun translateText(image: InputImage):String{
   val translator = Translation.getClient(options)
   translator.downloadModelIfNeeded(conditions).await()
   val text = detectText(image)return translator.translate(text.text).await()}
 
 

Тепер ви можете використовувати цю функцію для перекладу тексту на вашому зображенні.

private fun proceedPhoto(photo: Uri){
   lifecycleScope.launch{
       val translatedText = translateText(InputImage.fromFilePath(requireContext(), photo))}}
 
 
 

Як ви можете бачити, тут немає складнощів, і для більшості бібліотек слід використовувати один і той же алгоритм.

  1. Додайте залежність
  2. Оголосіть параметри
  3. Отримайте клієнта, використовуючи параметри
  4. Обробіть ваше зображення
  5. Обробіть отримані дані

Це все!

Підсумуємо

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

Впровадження розпізнавання зображень не завжди є дорогим. Ви можете використовувати вже існуючі рішення повністю або частково, одним з яких є Firebase ML Kit. Сподіваємося, що описаний алгоритм допоможе вам реалізувати це без зайвих зусиль. А якщо ви хочете бути абсолютно впевненими в результаті — зв'яжіться з нашою командою. Ми з радістю допоможемо вам у розробці веб-сервісів та мобільних застосунків.