Машинное обучение - одна из самых обсуждаемых тем в мире. Это разновидность искусственного интеллекта, которая играет ключевую роль в создании когнитивной природы ИИ. В этом руководстве я расскажу вам, как реализовать модель машинного обучения на устройствах Android с помощью Kotlin. Модель будет основана на Firebase ML Kit и платформе Google Cloud, что сэкономит нам много времени на создание предварительно обученной модели. Вот снимок того, что мы будем делать:

Требования:

  1. Android Studio (Полная настройка)
  2. Базовые знания Котлин
  3. Базовое взаимодействие с Firebase
  4. Аккаунт Google Cloud (выставлен счет, но есть бесплатный кредит в размере 300 долларов США)

Шаг 1. Настройка Firebase и Google Cloud:

1. Посетите https://firebase.google.com/ и создайте учетную запись (если у вас ее нет.) Затем перейдите к началу работы → Добавить проект (дайте ему желаемое имя, я назвал свое мой-проект)

2. Войдите в консоль вашей учетной записи Firebase. Найдите и перейдите к ML-KIT → Начать. В следующем интерфейсе вы увидите список доступных API машинного обучения, доступных от Google, таких как обнаружение текста, распознавание лиц и т. Д. Нас интересует только распознавание лиц.

3. Чтобы включить обнаружение текста, нам нужно включить Vision API из консоли платформы Google Cloud, находящейся по адресу https://console.cloud.google.com/ (не забудьте нажать на консоль).

В появившемся интерфейсе нажмите «Поиск», затем введите «Cloud Vision API», как показано.

После загрузки нажмите «Включить API».

Шаг 2. Настройка Android Studio.

Чтобы использовать машинное обучение в Android Studio, нам нужна пара библиотек, которые помогут нам реализовать наш первый проект машинного обучения.

1. Создайте новый проект: откройте свою Android Studio, создайте новый проект, может быть пустое действие или любое другое действие, которое вы выберете. Обязательно выберите версию API 21 или выше для поддержки ML. Не забудьте также отметить Kotlin в качестве языка, поскольку мы будем делать это руководство на Kotlin.

2. Добавьте разрешения. После этого откройте папку манифеста в древовидной структуре проекта и добавьте эти разрешения и метатег.

//These ones will come before the application tags
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

//add the meta tags before initiating your activity
<meta-data
    android:name="com.google.firebase.ml.vision.DEPENDENCIES"
    android:value="text,face,label" />

Этот метатег поможет нам загрузить модели при первой установке приложения пользователем, что упростит нашу работу. Разрешения позволят нашему приложению получить доступ к Интернету через телефон пользователя.

3. Подключите приложение к Firebase: чтобы использовать функции Firebase в нашем приложении, нам нужно будет подключить наше приложение к вашему уже созданному проекту в Firebase, перейдя по адресу:

Инструменты → Firebase → (появляется боковое меню) → Перейти к аналитике → Записать событие анализа → Подключиться к Firebase (подождать, пока оно синхронизируется) → Добавить аналитику в ваше приложение (пусть оно также синхронизируется)

Нам также потребуются библиотека Picasso (для загрузки наших изображений), библиотека Anko (чтобы помочь нам упростить структуру синтаксиса Kotlin). Итак, перейдите к build.gradle (модульное приложение) и добавьте следующие строки. Эти строки импортируют все вышеупомянутые библиотеки.

implementation 'com.google.firebase:firebase-ml-vision:16.0.0'
implementation 'com.squareup.picasso:picasso:2.5.2'
implementation 'org.jetbrains.anko:anko-commons:0.10.5'

После добавления вышеуказанного убедитесь, что ваша студия Android синхронизируется правильно.

4. Создайте представления. В Android нам понадобятся кнопка, ImageView и EditText, на которых мы будем взаимодействовать с нашим приложением. EditText будет играть ключевую роль в получении изображений, а кнопка поможет нам обнаружить текст после загрузки изображения. Откройте свой activity_main.xml и отредактируйте, используя следующий код. (Настройте по своему желанию)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <EditText
        android:layout_width="match_parent"
        android:imeOptions="actionDone"
        android:id="@+id/etUrl"
        android:inputType="textUri"
        android:hint="Enter url"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:layout_alignParentTop="true"
        android:layout_marginTop="20dp"
        android:layout_height="wrap_content"/>
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:scaleType="centerCrop"
        android:layout_below="@+id/etUrl"
        android:id="@+id/image_holde"
        />

    <Button
        android:layout_width="match_parent"
        android:id="@+id/btnDetect"
        android:text="DETECT TEXT"
        android:textColor="#ffffff"
        android:layout_margin="20dp"
        android:backgroundTint="@color/colorAccent"
        android:background="@drawable/button_background"
        android:layout_alignParentBottom="true"
        android:layout_height="wrap_content"/>

</RelativeLayout>

Для приведенного выше, чтобы сделать кнопку немного закругленной, я создал файл ресурсов с возможностью рисования button_background и поиграл с формой и краями, как показано:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">

    <corners android:radius="16dp" android:topLeftRadius="25dp" android:bottomRightRadius="25dp"/>
</shape>

5. Подключите код, чтобы получить ML в приложении. Мы начнем с создания экземпляра FirebaseVision с функцией извлечения текста из изображения, как показано, над функцией onCreate ():

val detector = FirebaseVision.getInstance().visionTextDetector

Затем мы должны разрешить пользователю вводить URL-адрес изображения в поле ввода, и мы позволим пользователю нажимать кнопку «Готово» на виртуальной клавиатуре и слушать каждый раз, когда этот пользователь нажимает ее, как только этот пользователь нажимает кнопку «Готово», наше приложение загрузит желаемое изображение из введенного URL и отобразит его с помощью библиотеки Picasso, которую мы добавили ранее. Мы используем идентификатор EditText (etUrl) и добавляем к нему слушателей событий, как показано ниже:

etUrl.setOnEditorActionListener { _, action, _ ->
    if (action==EditorInfo.IME_ACTION_DONE) {
     
     Picasso.with(ctx)
            .load(etUrl.text.toString())
            .into(image_holder)

Как только изображение загружено в наш ImageView, мы затем просим наш детектор, ранее объявленный, попытаться обнаружить любой читаемый текст из изображения, и, таким образом, мы пройдемся по этому изображению, чтобы получить как можно больше данных, как показано ниже. Помните, что мы должны преобразовать это изображение из Picasso в растровое, чтобы они могли правильно взаимодействовать с процессом преобразования Firebase Image, как показано.

btnDetect.setOnClickListener {
  val textImage = FirebaseVisionImage
                      .fromBitmap((image_holde.drawable as BitmapDrawable).bitmap)

Как только мы получим требуемое растровое изображение, в данном случае textImage, мы говорим детектору обнаружить текст на изображении и запрашиваем слушателя, который ответит нам либо успехом, либо неудачей в зависимости от преобладающих условий. Затем мы переберем полученный ответ, и каждый раз, когда мы получим данные, мы присваиваем их переменной: detectText.

detector.detectInImage(textImage).addOnCompleteListener {
                    var detectedText = ""
                    it!!.result!!.blocks!!.forEach {
                        detectedText += it.text + "\n"
                        ctx!!.runOnUiThread {
                            alert(detectedText, "DETECTED TEXT").show()
                        }
                    }
                }.addOnFailureListener {
                    ctx!!.runOnUiThread {
                        alert("Unable to detect Text", "ERROR DURING DETECTION").show()
                    }
                }
            }
            detector.close()

            true
        }

        false }
}

Конечно, мы использовали библиотеку Anko для создания предупреждений, чтобы показать наш обнаруженный текст, который выполняется в потоке пользовательского интерфейса.

Полный код для нашего MainActivity.kt будет таким, как показано ниже:

package bensalcie.likesyou.org.textdetector
import android.graphics.drawable.BitmapDrawable
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.inputmethod.EditorInfo
import com.google.firebase.ml.vision.FirebaseVision
import com.google.firebase.ml.vision.common.FirebaseVisionImage
import com.squareup.picasso.Picasso
import kotlinx.android.synthetic.main.activity_main.*
import org.jetbrains.anko.alert
import org.jetbrains.anko.ctx
import org.jetbrains.anko.runOnUiThread
class MainActivity : AppCompatActivity() {
    val detector=FirebaseVision.getInstance().visionTextDetector
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        etUrl.setOnEditorActionListener { _, action, _ ->
            if (action==EditorInfo.IME_ACTION_DONE)
            {
                Picasso.with(ctx).load(etUrl.text.toString()).into(image_holde)
                btnDetect.setOnClickListener {
                    val textImage=FirebaseVisionImage.fromBitmap((image_holde.drawable as BitmapDrawable).bitmap)
                    detector.detectInImage(textImage).addOnCompleteListener {
                        var detectedText = ""
                        it!!.result!!.blocks!!.forEach {
                            detectedText += it.text + "\n"
                            ctx!!.runOnUiThread {
                                alert(detectedText, "DETECTED TEXT").show()
                            }
                        }
                    }.addOnFailureListener {
                        ctx!!.runOnUiThread {
                            alert("Unable to detect Text", "ERROR DURING DETECTION").show()
                        }
                    }
                }
                detector.close()

                true
            }

            false }
    }
}

Пройдя через все это, когда вы запустите свое приложение, вы сможете обнаружить любой текст из изображения с любого URL-адреса.

Помните, что при использовании Firebase ML Kit обнаружение выполняется либо на устройстве, либо на облачной платформе Google, в нашем случае мы использовали обнаружение на устройстве, что удобно для более быстрой загрузки моделей данных. Вы также можете обучить свою собственную модель и загрузить ее в комплект Firebase ML и использовать ее так же, как мы использовали модель обнаружения текста.

Ниже приведена иллюстрация только что созданного приложения:

Если во время этого урока у вас возникли проблемы, напишите мне:

Twitter: @ibensalcie

Электронная почта: [email protected],

Номер в WhatsApp: +254704808070