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.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:- Unduh gambar pelatihan
- Tandai Tag / Tag objek pada gambar
- Ulangi (model menjadi lebih baik dengan lebih banyak data pelatihan)
- 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 Baru2. 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 proyek4. Di jendela XamarinImageClassification, klik Tambah gambar5. Pilih gambar yang mengandung objek untuk identifikasi6. Di jendela Unggah Gambar , tambahkan tagCatatan: dalam contoh ini, kami bekerja dengan gambar jamur7. Di jendela Gambar unggah klik UnggahCatatan: terus unggah gambar sampai Anda memiliki setidaknya 5 gambar untuk setiap tag8. Di jendela XamarinImageClassification di sudut kanan atas jendela, klik tombol Train Model (gambar hijau roda gigi)9. Di jendela Choose Training Type , pilih Quick Training10. Di jendela Choose Training Type , pilih Train2. 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 TensorFlow4. Dalam daftar turun bawah Choose your platform , pilih TensorFlow Lite5. Pada jendela Choose your platform , pilih Unduh3. Impor TensorFlow Lite ke aplikasi Xamarin.Android kami
1. Instal paket NuGet yang sesuai di proyek Xamarin.Android kamiCatatan: 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.Android2. Buka ritsleting model yang diekspor yang kami unduh dari portal web layanan Custom VisionCatatan: 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 Asset4. Pada menu pop-up, pilih Add → Existing Item ...5. Dalam menu Add Existing Item , pilih kedua file yang baru saja dibongkar:6. Di Visual Studio, di Xamarin.Android → Aset , klik kanan labels.txt7. Di menu pop-up, pilih Properties8. Di jendela Properties , pilih Build Action → Android Asset9. Di Visual Studio, di Xamarin.Android → Aset , klik kanan pada models.tflite10. Di menu pop-up, pilih Properties11. Di jendela Properties , pilih Build Action → Android Asset4. 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
{
const int FloatSize = 4;
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);
var streamReader = new StreamReader(Application.Context.Assets.Open("labels.txt"));
var labels = streamReader.ReadToEnd().Split('\n').Select(s => s.Trim()).Where(s => !string.IsNullOrEmpty(s)).ToList();
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[]>();
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;
}
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;
}
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;
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: