Klasifikasi gambar di Android menggunakan TensorFlow Lite dan Azure Custom Vision

Klasifikasi gambar memungkinkan aplikasi Xamarin kami untuk mengenali objek dalam foto.

Semakin sering terjadi adalah kemampuan untuk mengambil foto dan mengenali isinya. Kita dapat mengamati ini dalam aplikasi perbankan kita ketika melakukan setoran seluler, dalam aplikasi foto saat menambahkan filter dan dalam aplikasi HotDog untuk menentukan apakah makanan kita hot dog.

Berkat layanan Azure Custom Vision, kami tidak perlu mempelajari algoritma pembelajaran mesin yang rumit untuk mengimplementasikan klasifikasi gambar.

Pada artikel ini, kita akan melihat bagaimana menerapkan klasifikasi gambar menggunakan layanan Azure Custom Vision , TensorFlow Lite (platform pembelajaran mesin sumber terbuka), danXamarin . Android .


Catatan: Untuk Xamarin.iOS, kami juga dapat menggunakan layanan Azure Custom Vision dengan CoreML , tetapi sebaiknya simpan untuk artikel lain.

gambar

Perpustakaan Klasifikasi Gambar


Kami akan menggunakan layanan Azure Custom Vision dan TensorFlow Lite untuk mengimplementasikan klasifikasi gambar kami.

1. Layanan Visi Kustom Azure


Layanan Azure Custom Vision menyederhanakan pembuatan dan pelatihan model pembelajaran mesin - tidak memerlukan pengalaman dengan Artificail Intelligence (AI) atau Machine Learning (ML).

Dengan menggunakan portal web layanan Custom Vision , kami dapat melakukan hal berikut tanpa menulis kode AI / ML:

  1. Unduh gambar pelatihan
  2. Tandai Tag / Tag objek pada gambar
  3. Ulangi (model menjadi lebih baik dengan lebih banyak data pelatihan)
  4. Itu saja - Visi Kustom mengurus sisanya!

2. TensorFlow Lite


TensorFlow Lite adalah platform pembelajaran mesin sumber terbuka yang memungkinkan kita untuk menggunakan TensorFlow di IoT dan perangkat seluler.

TensorFlow Lite dan TensorFlow tersedia di sumber terbuka di GitHub .

Menerapkan klasifikasi gambar menggunakan Azure + Xamarin. Android


Contoh aplikasi klasifikasi gambar lengkap tersedia di GitHub .

1. Pelatihan model


Menggunakan portal web layanan Custom Vision , pertama-tama kami melatih model klasifikasi gambar.

1. Di portal web layanan Visi Kustom, klik Proyek Baru

gambar

2. Di jendela Buat proyek baru , atur parameter berikut:

  • Nama: XamarinImageClassification
  • Deskripsi: Mengidentifikasi Objek dalam Gambar
  • Sumberdaya: [Buat sumber daya baru]
  • Jenis Proyek: Klasifikasi
  • Jenis Klasifikasi: Multilabel (Beberapa tag per gambar)
  • Domain: Umum (kompak)
  • Kemampuan Ekspor: Platform dasar

3. Di jendela Buat proyek baru , klik Buat proyek

4. Di jendela XamarinImageClassification, klik Tambah gambar

5. Pilih gambar yang mengandung objek untuk identifikasi

6. Di jendela Unggah Gambar , tambahkan tag
Catatan: dalam contoh ini, kami bekerja dengan gambar jamur

7. Di jendela Gambar unggah klik Unggah
Catatan: terus unggah gambar sampai Anda memiliki setidaknya 5 gambar untuk setiap tag

gambar

8. Di jendela XamarinImageClassification di sudut kanan atas jendela, klik tombol Train Model (gambar hijau roda gigi)

9. Di jendela Choose Training Type , pilih Quick Training

10. Di jendela Choose Training Type , pilih Train

gambar

2. Mengekspor model yang terlatih dari layanan Azure Custom Vision


Sekarang kami telah melatih model kami, mari kita ekspor untuk digunakan dalam aplikasi seluler kami .

Ini akan memungkinkan kami untuk menggunakan model tanpa koneksi Internet, yang akan memastikan privasi terbaik bagi pengguna, karena fotonya tidak akan pernah meninggalkan perangkat seluler.

Untuk mengekspor model kami, lakukan hal berikut:

1. Di jendela XamarinImageClassifcation di bagian atas halaman, pilih tab Performance.

2. Pada tab Performace , klik tombol Export (panah bawah)

3. Di jendela Choose your platform , pilih TensorFlow

gambar

4. Dalam daftar turun bawah Choose your platform , pilih TensorFlow Lite

5. Pada jendela Choose your platform , pilih Unduh

gambar

3. Impor TensorFlow Lite ke aplikasi Xamarin.Android kami


1. Instal paket NuGet yang sesuai di proyek Xamarin.Android kami
Catatan: Paket NuGet ini adalah proyek sumber terbuka yang dibuat oleh tim Xamarin di Microsoft. Ini berisi ikatan C # untuk pustaka TensorFlow Lite asli , yang dapat digunakan dalam aplikasi Xamarin.Android

2. Buka ritsleting model yang diekspor yang kami unduh dari portal web layanan Custom Vision
Catatan: di dalam file zip ada labels.txt dan model.tflite :

  • labels.txt berisi tag gambar yang dibuat selama persiapan pelatihan di situs web Custom Vision
  • models.tflite adalah model pembelajaran mesin yang kami gunakan untuk perkiraan kami.

3. Di Visual Studio, di proyek Xamarin.Android, klik kanan folder Asset

4. Pada menu pop-up, pilih AddExisting Item ...

5. Dalam menu Add Existing Item , pilih kedua file yang baru saja dibongkar:

  • models.tflite
  • labels.txt

6. Di Visual Studio, di Xamarin.AndroidAset , klik kanan labels.txt

7. Di menu pop-up, pilih Properties

8. Di jendela Properties , pilih Build ActionAndroid Asset

9. Di Visual Studio, di Xamarin.AndroidAset , klik kanan pada models.tflite

10. Di menu pop-up, pilih Properties

11. Di jendela Properties , pilih Build ActionAndroid Asset

gambar

4. Penerapan kode klasifikasi gambar untuk Xamarin. Android


Sekarang kita telah mengimpor model, sekarang saatnya untuk menulis kode.

Sebagai pengingat, aplikasi klasifikasi gambar sampel yang sudah selesai tersedia di GitHub .

Dalam proyek Xamarin.Android , tambahkan ImageClassifcationModel.cs dan TensorflowClassifier.cs :

ImageClassificationModel.cs


public class ImageClassificationModel 
{ 
    public ImageClassificationModel(string tagName, float probability) 
    { 
        TagName = tagName; 
        Probability = probability; 
    } 
   
    public float Probability { get; } 
    public string TagName { get; } 
}

TensorflowClassifier.cs


using System.Collections.Generic;
using System.IO;
using System.Linq;
using Android.App;
using Android.Graphics;
using Java.IO;
using Java.Nio;
using Java.Nio.Channels;

public class TensorflowClassifier
{
    //FloatSize     4,        4 
    const int FloatSize = 4;
    //PixelSize -     3,        : ,   .
    const int PixelSize = 3;

    public List<ImageClassificationModel> Classify(byte[] image)
    {
        var mappedByteBuffer = GetModelAsMappedByteBuffer();
        var interpreter = new Xamarin.TensorFlow.Lite.Interpreter(mappedByteBuffer);

        //   ,       
        var tensor = interpreter.GetInputTensor(0);
        var shape = tensor.Shape();

        var width = shape[1];
        var height = shape[2];

        var byteBuffer = GetPhotoAsByteBuffer(image, width, height);

        // StreamReader    labels.txt
        var streamReader = new StreamReader(Application.Context.Assets.Open("labels.txt"));

        // labels.txt  List<string>
        var labels = streamReader.ReadToEnd().Split('\n').Select(s => s.Trim()).Where(s => !string.IsNullOrEmpty(s)).ToList();

        //     Java.Lang.Object,    Xamarin.TensorFlow.List.Interpreter.
        var outputLocations = new float[1][] { new float[labels.Count] };
        var outputs = Java.Lang.Object.FromArray(outputLocations);

        interpreter.Run(byteBuffer, outputs);
        var classificationResult = outputs.ToArray<float[]>();

        // classificationResult     ,  ,     
        var classificationModelList = new List<ImageClassificationModel>();

        for (var i = 0; i < labels.Count; i++)
        {
            var label = labels[i]; classificationModelList.Add(new ImageClassificationModel(label, classificationResult[0][i]));
        }

        return classificationModelList;
    }

    // model.tflite  Java.Nio.MappedByteBuffer,    Xamarin.TensorFlow.Lite.Interpreter.
    private MappedByteBuffer GetModelAsMappedByteBuffer()
    {
        var assetDescriptor = Application.Context.Assets.OpenFd("model.tflite");
        var inputStream = new FileInputStream(assetDescriptor.FileDescriptor);

        var mappedByteBuffer = inputStream.Channel.Map(FileChannel.MapMode.ReadOnly, assetDescriptor.StartOffset, assetDescriptor.DeclaredLength);

        return mappedByteBuffer;
    }

    //     TensorFlow
    private ByteBuffer GetPhotoAsByteBuffer(byte[] image, int width, int height)
    {
        var bitmap = BitmapFactory.DecodeByteArray(image, 0, image.Length);
        var resizedBitmap = Bitmap.CreateScaledBitmap(bitmap, width, height, true);

        var modelInputSize = FloatSize * height * width * PixelSize;
        var byteBuffer = ByteBuffer.AllocateDirect(modelInputSize);
        byteBuffer.Order(ByteOrder.NativeOrder());

        var pixels = new int[width * height];
        resizedBitmap.GetPixels(pixels, 0, resizedBitmap.Width, 0, 0, resizedBitmap.Width, resizedBitmap.Height);

        var pixel = 0;

        //     Java.Nio.ByteBuffer
        for (var i = 0; i < width; i++)
        {
            for (var j = 0; j < height; j++)
            {
                var pixelVal = pixels[pixel++];

                byteBuffer.PutFloat(pixelVal >> 16 & 0xFF);
                byteBuffer.PutFloat(pixelVal >> 8 & 0xFF);
                byteBuffer.PutFloat(pixelVal & 0xFF);
            }
        }

        bitmap.Recycle();

        return byteBuffer;
    }
}

Itu saja! Sekarang kita bisa meneruskan gambar ke TensorflowClassifier.Classify untuk mendapatkan ImageClassificationModel .

Bahan untuk studi lebih lanjut


Periksa tautan di bawah ini:


All Articles