Menggunakan Machine Learning untuk Mengenali Gambar Dengan IBM Watson
Indonesian (Bahasa Indonesia) translation by Yanti Baddolo (you can also view the original English article)
Bukankah akan sangat baik jika aplikasi Android bisa melihat dan mengerti lingkungan sekitar? Bisa kah Anda bayangkan bagaimana bagusnya tampilan pengguna aplikasi melihat penggunanya dan langsung bisa mengetahui umur, jenis kelamin dan emosi mereka? Aplikasi seperti mungkin terdengar futuristic, tapi itu bisa dilakukan saat ini.
Dengan layanan IBM Watson Visual Recognition, membuat aplikasi mobile yang dapat mendeteksi dan menganalisis objek dengan akurat pada gambar lebih mudah dari sebelumnya. Dalam tutorial ini, saya akan menunjukkan cara menggunakannya untuk membuat aplikasi Android cerdas yang bisa menebak umur dan jenis kelamin seseorang dan mengidentifikasi objek yang menonjol dalam sebuah foto.
Prasyarat
Untuk dapat mengikuti tutorial ini, Anda harus memiliki:
- akun IBM Bluemix
- Android Studio 3.0 Canary 8 atau lebih tinggi
- dan perangkat atau emulator yang menjalankan Android 4.4 atau lebih tinggi
Mengaktifkan Layanan Visual Recognition
Seperti semua layanan Watson, layanan Visual Recognition juga harus diaktifkan secara manual sebelum dapat digunakan di aplikasi. Jadi, masuklah ke konsol IBM Bluemix dan navigasikan ke Services > Watson. Di halaman yang terbuka, tekan tombol Create Watson service.



Dari daftar layanan yang tersedia ditunjukkan di samping, pilih Visual Recognition.



Sekarang Anda bisa memberikan nama yang mudah dimengerti untuk layanan ini dan tekan tombol Create.



Setelah layanan siap, sebuah kunci API akan dihasilkan. Anda dapat melihatnya dengan membuka tab Service credentials dan menekan tombol View Credentials.



Setup Proyek
Dalam tutorial ini, kita akan menggunakan SDK Watson Java dan Android saat berinteraksi dengan layanan Visual Recognition. Kita juga akan menggunakan library Picasso untuk mengambil dan menampilkan gambar dari Internet. Oleh karena itu, tambahkan dependensi implementation
berikut ke file build.gradle modul app
Anda:
implementation 'com.ibm.watson.developer_cloud:visual-recognition:3.9.1' implementation 'com.ibm.watson.developer_cloud:android-sdk:0.4.2' implementation 'com.squareup.picasso:picasso:2.5.2'
Agar dapat berinteraksi dengan server Watson, aplikasi Anda memerlukan izin untuk akses ke INTERNET
, jadi tambahkanlah untuk itu dalam file AndroidManifest.xml proyek Anda.
<uses-permission android:name="android.permission.INTERNET" />
Selain itu, aplikasi yang akan kita buat hari ini memerlukan akses ke kamera perangkat dan media penyimpan eksternal, jadi Anda juga harus meminta izin akses ke CAMERA
dan WRITE_EXTERNAL_STORAGE
.
<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Terakhir, tambahkan kunci API layanan Visual Recognition Anda ke file strings.xml.
<string name="api_key">a1234567890bcdefe</string>
Menginisialisasi Klien Visual Recognition
SDK Watson Java memaparkan semua fitur layanan Visual Recognition yang ditawarkan melalui kelas VisualRecognition
. Oleh karena itu, Anda sekarang seharusnya bisa menginisialisasi sebuah instance dengan menggunakan konstruktornya, yang mengharapkan tanggal versi dan kunci API sebagai argumennya.
Saat menggunakan layanan Visual Recognition, Anda biasanya ingin mengambil gambar dengan kamera perangkat. SDK Android Watson memiliki kelas CameraHelper
untuk membantu Anda melakukannya. Meskipun Anda tidak perlu melakukannya, saya sarankan Anda juga menginisialisasi sebuah instance di dalamnya dalam metode onCreate()
activity Anda.
private VisualRecognition vrClient; private CameraHelper helper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Initialize Visual Recognition client vrClient = new VisualRecognition( VisualRecognition.VERSION_DATE_2016_05_20, getString(R.string.api_key) ); // Initialize camera helper helper = new CameraHelper(this); }
Pada titik ini, Anda memiliki semua yang Anda butuhkan untuk mulai menganalisis gambar dengan layanan ini.
4. Mendeteksi Objek
Layanan Visual Recognition dapat mendeteksi berbagai macam objek fisik. Sebagai masukan, kamera ini mengharapkan gambar yang cukup terang yang resolusinya setidaknya 224 x 224 piksel. Untuk saat ini, mari kita gunakan kamera perangkat untuk mengambil gambar seperti itu.
Langkah 1: Tentukan layout
Pengguna harus bisa menekan tombol untuk mengambil gambar, jadi file XML layout activity Anda harus memiliki widget Button
. Ini juga harus memiliki widget TextView
untuk mendaftarkan objek yang terdeteksi.
Opsional, Anda bisa menambahkan widget ImageView
untuk menampilkan gambar.
<Button android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:text="Take picture" android:onClick="takePicture"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/detected_objects" android:layout_alignParentTop="true"/> <ImageView android:layout_width="match_parent" android:layout_height="200dp" android:scaleType="fitCenter" android:id="@+id/preview" android:layout_below="@+id/detected_objects"/>
Pada kode di atas kita telah menambahkan pengendali event on-click ke widget Button
. Anda bisa mengenerate potongan kode untuk widget ini dalam kode dengan mengklik ikon bola lampu yang ditampilkan disampingnya.
public void takePicture(View view) { // More code here }
Langkah 2: Mengambil Gambar
Anda dapat mengambil gambar hanya dengan memanggil metode dari objek CameraHelper
, dispatchTakePictureIntent()
jadi tambahkan kode berikut di dalam event handler:
helper.dispatchTakePictureIntent();
Metode di atas menggunakan aplikasi default kamera perangkat untuk mengambil gambar. Itu berarti mendapatkan akses ke gambar yang diambil, Anda harus mengganti metode activity onActivityResult()
dan mencari hasil yang kode permintaannya adalah REQUEST_IMAGE_CAPTURE
. Inilah cara melakukannya:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode == CameraHelper.REQUEST_IMAGE_CAPTURE) { // More code here } }
Setelah Anda menemukan hasil yang benar, Anda dapat mengekstrak gambar dari gambar dalam bentuk objek Bitmap
menggunakan metode getBitmap()
dari kelas CameraHelper
. Anda juga bisa mendapatkan path absolut gambar menggunakan metode getFile()
. Kita membutuhkan bitmap dan path absolut, jadi tambahkan kode berikut berikut ini:
final Bitmap photo = helper.getBitmap(resultCode); final File photoFile = helper.getFile(resultCode);
Jika Anda memilih untuk menambahkan widget ImageView
ke layout Anda, Anda dapat menampilkan gambar sekarang dengan langsung mengirimkan bitmap ke metode setImageBitmap()
nya.
ImageView preview = findViewById(R.id.preview); preview.setImageBitmap(photo);
Langkah 3: Klasifikasikan Gambar
Untuk mendeteksi item dalam gambar, Anda harus mengirimkan gambar sebagai masukan ke metode classify()
pada objek VisualRecognition
. Sebelum melakukannya, Anda harus meletakannya di dalam objek ClassifyImagesOptions
, yang dapat dibuat menggunakan kelas ClassifyImagesOptions.Builder
.
Nilai return dari metode classify()
adalah objek bernama ServiceCall
, yang mendukung permintaan jaringan secara sinkronus dan asinkron. Untuk saat ini, mari kita panggil metode execute()
untuk melakukan permintaan secara sinkronus. Tentu saja, karena operasi jaringan tidak diperbolehkan di thread UI, Anda harus ingat untuk melakukannya dari thread baru.
AsyncTask.execute(new Runnable() { @Override public void run() { VisualClassification response = vrClient.classify( new ClassifyImagesOptions.Builder() .images(photoFile) .build() ).execute(); // More code here } });
Metode classify()
dibangun untuk menangani banyak gambar sekaligus. Oleh karena itu, permintaannya adalah daftar rincian klasifikasi. Karena saat ini kita bekerja hanya dengan satu gambar, kita hanya memerlukan item pertama dari daftar. Inilah cara Anda bisa mendapatkannya:
ImageClassification classification = response.getImages().get(0); VisualClassifier classifier = classification.getClassifiers().get(0);
Layanan Visual Recognition memperlakukan setiap item yang dideteksi sebagai kelas terpisah dari tipe VisualClassifier.VisualClass
. Dengan memanggil metode getClasses()
, Anda bisa mendapatkan daftar semua kelas.
Setiap kelas memiliki, antara lain rincian, nama dan skor confidence yang terkait dengannya. Kode berikut menunjukkan cara melakukan perulangan pada daftar kelas dan menampilkan nama hanya mereka yang nilainya lebih besar dari 70% di widget TextView
.
final StringBuffer output = new StringBuffer(); for(VisualClassifier.VisualClass object: classifier.getClasses()) { if(object.getScore() > 0.7f) output.append("<") .append(object.getName()) .append("> "); } runOnUiThread(new Runnable() { @Override public void run() { TextView detectedObjects = findViewById(R.id.detected_objects); detectedObjects.setText(output); } });
Perhatikan bahwa kode di atas menggunakan metode runOnUiThread()
karena konten widget TextView
hanya dapat diperbarui dari thread UI.
Jika Anda menjalankan aplikasi sekarang dan mengambil gambar, Anda akan dapat melihat klasifikasi gambar Watson bekerja.



Menganalisis Wajah
Layanan Visual Recognition memiliki metode khusus untuk memproses wajah manusia. Ini bisa menentukan umur dan jenis kelamin seseorang dalam foto apapun. Jika orang itu terkenal, bisa juga langsung menebaknya.
Langkah 1: Tentukan Layout
Menganalisis wajah dengan layanan Visual Recognition tidak terlalu berbeda dengan mengklasifikasi objek. Jadi Anda bebas untuk menggunakan kembali layout yang Anda buat tadi. Namun, untuk mengenalkan Anda pada beberapa fitur yang ditawarkan layanan ini, saya akan membuat tata letak baru, yang satu ini memiliki fungsi yang sedikit berbeda.
Kali ini, alih-alih memotret menggunakan kamera dan mengirimkannya ke layanan, mari kita langsung mengirimkan sebuah URL gambar kedalamnya. Agar pengguna mengetik URL dan memulai analisis, layout kita memerlukan widget EditText
dan widget Button
. Ini juga memerlukan widget TextView
untuk menampilkan hasil analisis.
Saya sarankan Anda juga menambahkan widget ImageView
ke layout sehingga pengguna dapat melihat gambar yang ditunjukkan URL.
<EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/image_url" android:hint="Image URL"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/image_url" android:onClick="processImage" android:text="Analyze"/> <ImageView android:layout_width="match_parent" android:layout_height="200dp" android:layout_alignParentBottom="true" android:id="@+id/preview"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/person_details" android:layout_above="@+id/preview"/>
Langkah 2: Menampilkan Gambar
Di dalam handler on-click widget Button
, Anda dapat memanggil metode getText()
dari widget EditText
untuk menentukan URL gambar yang diketik pengguna. Setelah Anda mengetahui URLnya, Anda bisa langsung mengirimkannya ke metode load()
dan into()
Picasso untuk mendownload dan menampilkan gambar di widget ImageView
.
EditText imageURLInput = findViewById(R.id.image_url); final String url = imageURLInput.getText().toString(); ImageView preview = findViewById(R.id.preview); Picasso.with(this).load(url).into(preview);
Langkah 3: Jalankan Analisis Wajah
Untuk menjalankan analisis wajah pada URL, Anda harus menggunakan metode detectFaces()
dari klien VisualRecognition
. Sama seperti metode classify()
, metode ini juga membutuhkan objek VisualRecognitionOptions
sebagai inputnya.
Karena Anda sudah tahu cara menggunakan metode execute()
untuk melakukan permintaan secara sinkronus, mari kita sekarang memanggil metode enqueue()
, yang berjalan asinkronus dan membutuhkan sebuah callback. Kode berikut menunjukkan caranya:
vrClient.detectFaces(new VisualRecognitionOptions.Builder() .url(url) .build() ).enqueue(new ServiceCallback<DetectedFaces>() { @Override public void onResponse(DetectedFaces response) { // More code here } @Override public void onFailure(Exception e) { } });
Seperti yang dapat Anda lihat pada kode di atas, di dalam metode onResponse()
dari objek callback, Anda memiliki akses ke objek DetectedFaces
, yang berisi daftar hasil analisis wajah. Karena kita menggunakan satu gambar sebagai masukan kita, kita hanya memerlukan item pertama dari daftar. Dengan memanggil metode getFaces()
nya, Anda mendapatkan daftar semua objek face
yang terdeteksi.
List<Face> faces = response.getImages().get(0).getFaces();
Setiap objek Face
memiliki rentang jenis kelamin dan usia yang terkait dengannya, yang dapat diakses dengan memanggil metode getGender()
dan getAge()
.
Metode getGender()
sebenarnya mengembalikan objek Gender
. Anda harus memanggil metode getGender()
sendiri untuk mendapatkan jenis kelamin sebagai string, yang akan berupa "PRIA" atau "WANITA". Demikian pula, method getAge()
mengembalikan sebuah objek Age
. Dengan memanggil metode getMin()
dan getMax()
, Anda dapat menentukan perkiraan usia wajah dalam tahun.
Kode berikut menunjukkan cara melakukan pengulangan pada daftar objek face
, menghasilkan string yang mengandung jenis kelamin dan usia semua wajah, dan menampilkannya di widget TextView
:
String output = ""; for(Face face:faces) { output += "<" + face.getGender().getGender() + ", " + face.getAge().getMin() + " - " + face.getAge().getMax() + " years old>\n"; } TextView personDetails = findViewById(R.id.person_details); personDetails.setText(output);
Berikut adalah contoh analisis wajah hasil:



Kesimpulan
Layanan Pengenalan Visual Watson membuatnya sangat mudah bagi Anda untuk membuat aplikasi yang cerdas dan sadar akan lingkungan sekitar mereka. Dalam tutorial ini, Anda belajar bagaimana menggunakannya dengan SDK Watson Java dan Android untuk mendeteksi dan menganalisis objek generik dan wajah.
Untuk mempelajari lebih lanjut tentang layanan ini, Anda dapat merujuk ke dokumentasi resmi.
Dan pastikan untuk memeriksa beberapa posting kami yang lain tentang machine learning di Envato Tuts +!
- Android ThingsAndroid Things dan Machine LearningPaul Trebilcox-Ruiz
- Android ThingsAndroid Things: Membuat Doorman Terkoneksi CloudPaul Trebilcox-Ruiz
- Android SDKBagaimana Menggunakan Layanan Machine Learning Google Cloud untuk AndroidAshraff Hathibelagal
- Android SDKMembuat Aplikasi Pintar Dengan Google Cloud Speech dan Natural Language APIAshraff Hathibelagal
- Android SDKBagaimana Menggunakan Google Cloud Vision API di dalam Aplikasi AndroidAshraff Hathibelagal