Berbagai berita pada hari-hari ini dipenuhi dengan kata kunci semacam automasi, kecerdasan buatan, dan pembelajaran mesin (machine learning). Itulah mengapa semakin banyak pengguna smartphone yang mulai mencari aplikasi yang lebih cerdas. Sebagai pengembang rutin aplikasi Android, mungkin Anda kekurangan sumber daya yang dibutuhkan untuk membuat aplikasi semacam itu dari nol. Untungnya baru-baru ini Google meluncurkan platform Cloud Machine Learning, yang menawarkan jaringan syaraf yang telah dilatih sebelumnya untuk menjalankan berbagai tugas. Sebagian modelnya tidak hanya sangat akurat, tetapi terus menerus ada peningkatan. Dan tebak, Anda bisa menggunakannya hanya dengan membuat beberapa panggilan REST API! Dalam tutorial ini, akan saya perkenalkan Anda pada platform Cloud Machine Learning dan menunjukkan Anda cara menggunakannya untuk membuat aplikasi cerdas Android yang bisa mengenali objek-objek dunia nyata dan menyebutkan namanya dalam berbagai bahasa.
Prasyarat
Untuk bisa maksimal mengikuti tutorial ini, yang Anda butuhkan adalah:
Untuk mampu menggunakan layanan pembelajaran mesin Google di aplikasi Android Anda, dibutuhkan suatu kunci API. Anda bisa mendapatkannya dengan membuat proyek baru di konsol Google Cloud Platform. Mulailah dengan masuk ke konsol dan menekan tombol Create New Project. Pada dialog yang muncul, berikan nama yang bermakna untuk proyeknya.
Begitu proyeknya dibuat, buka API Manager > Dashboard dan tekan tombol Enable API. Di layar berikutnya, di bawah kepala teks Google Cloud Machine Learning, Anda akan bisa melihat semua API pembelajaran mesin yang tersedia untuk Anda. Dalam tutorial ini, kita hanya akan menggunakan Vision dan Translation API.
Untuk mengaktifkan Vision API, klik tautannya dan tekan tombol Enable.
Dengan cara serupa, untuk mengaktifkan Translation API, klik tautannya dan tekan tombol Enable. Anda hanya butuh satu kunci untuk menggunakan kedua API tersebut. Untuk mendapatkannya buka tab Credentials, tekan tombol Create credentials, dan pilih API key.
Sekarang Anda akan melihat popup yang berisi kunci API Anda.
2. Membuat Proyek Android Baru
Buka Android Studio dan buat proyek baru dengan activity yang kosong. Saya sarankan Anda memilih setidaknya API level 19 untuk SDK minimal yang didukung. Meskipun Anda tidak harus melakukannya, selalu lebih baik untuk menggunakan pustaka jaringan yang kokoh dalam berkomunikasi dengan platform Google Cloud Machine Learning. Dalam tutorial ini, kita akan menggunakan salah satu pustaka (library) yang bernama Fuel. Tambahkan sebagai dependensi compile di file build.gradle modul app:
Tekan Sync Now untuk memperbarui proyek Anda. Berikutnya aplikasi kita akan membutuhkan izin INTERNET untuk berkomunikasi dengan server Google. Oleh karena itu, tambahkan baris berikut di dalam manifest file proyeknya:
Vision API membantu Anda membuat aplikasi yang bisa melihat dan mengerti lingkungan pengguna. Deteksi wajah, deteksi emosi, pengenalan karakter optik, dan anotasi gambar adalah sebagian dari sekian banyak fitur yang dimilikinya. Untuk saat ini, kita hanya berfokus pada fitur anotasi gambar yang hebat, disebut juga deteksi label—yang saya pikir ini sangat bermanfaat. Seperti yang Anda harapkan, API ini mengekspektasikan gambar sebagai salah satu masukannya. Oleh karena itu, mari membuat layar yang pengguna bisa mengambil gambar dengan kamera perangkat.
Langkah 1: Buat Suatu Tata Letak
Tata letak layar kita akan memiliki widget Button yang pengguna bisa menekannya untuk mengambil gambar, widget ImageView untuk menampilkan gambar, dan widget TextView untuk menampilkan label, atau anotasi yang dihasilkan oleh API. Oleh karena itu, tambahkan kode berikut ke file XML tata letak activity Anda:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
<Buttonandroid:text="Take a picture"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/takePictureButton"
android:onClick="takePicture"/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/takePictureButton"
android:id="@+id/previewImage"
android:layout_centerHorizontal="true"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/resultsText"
android:layout_below="@id/previewImage"/>
Perhatikan bahwa kita telah mengasosiasikan suatu handler onClick dengan tombolnya. Akan kita definisikan itu di langkah berikutnya.
Langkah 2: Membuat Intent
Dengan membuat intent baru dengan aksi ACTION_IMAGE_CAPTURE dan memasukkannya ke metode startActivityForResult(), Anda bisa meminta aplikasi kamera default pengguna untuk mengambil gambar dan memasukkannya ke aplikasi Anda. Oleh karena itu tambahkan kode berikut ke kelas Activity Anda:
Untuk menerima gambar yang ditangkap dengan aplikasi kamera default, Anda harus mengesampingkan metode onActivityResult() kelas Activity Anda. Di dalam metodenya, Anda akan mengakses objek Bundle yang berisi semua data gambar. Anda bisa merender data gambar dengan sekedar mengonversinya menjadi Bitmap dan memasukkannya ke widget ImageView.
Jika Anda menjalankan aplikasinya sekarang dan mengambil gambar, Anda akan melihat gambarnya lumayan kecil. Itu tidak masalah—Cloud Vision API sangatlah akurat meskipun dengan gambar keluku (thumbnail).
Langkah 3: Kodekan Gambarnya
Vision API tidak bisa menggunakan objek Bitmap secara langsung, melainkan mengekspektasikan string data gambar dikompresi yang berkode Base64. Untuk kompresi data gambar, Anda dapat menggunakan metode compress() kelas Bitmap. Sebagai argumennya, metode itu mengekspektasikan format kompresi yang digunakan, kualitas keluaran yang diharapkan, dan suatu objek ByteArrayOutputStream. Kode berikut mengompresi bitmap dengan menggunakan format JPG dan memastikan bahwa kualitas gambar yang dihasilkan cukup tinggi:
Setelah semua kerja keras itu, Anda memiliki semua yang dibutuhkan untuk berinteraksi dengan Vision API. Mulailah dengan membuat string yang berisi URL API dan kunci API:
Untuk mengirimkan data ke API, Anda harus membuat permintaan HTTP POST. Badan permintaan harus berupa dokumen JSON yang berisi data gambar berkode Base64. Untuk deteksi label, dokumen juga harus memiliki array features yang mengandung nilai LABEL_DETECTION. Berikut adalah format dokumen JSON.
1
2
3
4
5
6
7
8
{"requests": [{
"image": {
"content": <Base64-encoded image data>
},
"features": [{
"type": "LABEL_DETECTION"
}]
}]}
Meskipun memungkinkan untuk menulis sendiri kode dokumen JSON, membuatnya secara terprogram akan mengurangi kemungkinan kesalahan. Kode berikut menunjukkan Anda cara melakukannya dengan kelas JSONObject dan JSONArray:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// Create an array containing
// the LABEL_DETECTION feature
JSONArray features = newJSONArray();
JSONObject feature = newJSONObject();
feature.put("type", "LABEL_DETECTION");
features.put(feature);
// Create an object containing
// the Base64-encoded image data
JSONObject imageContent = newJSONObject();
imageContent.put("content", base64Data);
// Put the array and object into a single request
// and then put the request into an array of requests
JSONArray requests = newJSONArray();
JSONObject request = newJSONObject();
request.put("image", imageContent);
request.put("features", features);
requests.put(request);
JSONObject postData = newJSONObject();
postData.put("requests", requests);
// Convert the JSON into a
// string
String body = postData.toString();
Di titik ini, kita bisa menggunakan metode post() kelas Fuel untuk membuat permintaan HTTP POST. Sebagai satu-satunya argumennya, metode ini mengekspektasikan URL API. Anda juga harus memasukkan header content-length dan content-type di permintaannya. Untuk melakukan itu gunakan metode header(). Dengan cara serupa, untuk menambahkan dokumen JSON ke badan permintaan POST, gunakan metode post(). Yang terakhir, dengan memanggil metode responseString() dan memasukkan instance baru kelas Handler ke dalamnya, Anda bisa secara asinkron mendapatkan respon permintaan sebagai string. Oleh karena itu, tambahkan kode berikut:
Ketika Anda menggunakan fitur deteksi label, Vision API mengembalikan dokumen JSON yang berisi label. Pada tiap label, Anda juga mendapatkan skor yang menetapkan seberapa akurat labelnya. Dokumennya akan terlihat seperti ini:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
{"responses":[{
"labelAnnotations": [
{
"mid": "/m/id1",
"description": "label1",
"score": 0.91
},
{
"mid": "/m/id2",
"description": "label2",
"score": 0.90
},
...
}]}
Untuk saat ini, mari memutar ulang semua objek di array labelAnnotations dan menambahkan nilai tiap kunci description ke widget TextView tata letak kita. Berikut adalah cara melakukannya di dalam metode success() kelas Handler:
Sekarang Anda bisa menjalankan aplikasinya, ambil gambar objek apa saja di dekat Anda dan meihat label yang dihasilkan Vision API untuknya.
4. Menggunakan Translation API
Cloud Translation API, sebagaimana namanya, bisa menerjemahkan teks dari dan ke lebih 100 bahasa. Dengan menggunakannya secara efektif, Anda bisa membuat aplikasi cerdas yang bisa berkomunikasi dengan para pengguna Anda dalam bahasa mereka sendiri. Di langkah sebelumnya, Anda melihat bahwa label yang dihasilkan aplikasi kita berbahasa Inggris. Sekarang mari menambahkan tombol untuk menerjemahkan label-label tersebut ke bahasa Jerman.
Langkah 1: Perbarui Tata Letaknya
Tambahkan widget Button di akhir tata letak activity Anda dengan menggunakan kode berikut:
1
2
3
4
5
6
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/resultsText"
android:text="in German"
android:onClick="translateToGerman"/>
Perhatikan bahwa tombol ini juga memiliki event handler onClick yang harus didefinisikan dalam kelas Activity Anda.
Langkah 2: Terjemahkan Labelnya
Menggunakan Translation API jauh lebih mudah daripada menggunakan Vision API, terutama karena Anda tidak harus membuat dokumen JSON untuk mendefinisikan permintaan Anda. Sebaliknya, Anda bisa memasukkan berbagai parameter dalam suatu string kueri. Buat metode translateToGerman() dan, di dalamnya, buat suatu string yang berisi URL Translation API.
Dikarenakan string kueri bisa berisi banyak isian q, kita akan bisa menambahkan satu untuk tiap label yang ada dalam tata letak TextView kita. Berikut bagaimana melakukannya:
Terakhir, Anda bisa memanggil metode get() dari kelas Fuel untuk membuat permintaan HTTP GET ke Translation API. Kali ini juga, Anda bisa menggunakan metode responseString() untuk mendapatkan respon dalam bentuk string secara asinkron.
Respon Translation API adalah dokumen JSON yang mengandung sekumpulan terjemahan. Formatnya adalah sebagai berikut:
1
2
3
4
5
6
7
8
9
{ "data": { "translations": [
{
"translatedText": "...."
},
{
"translatedText": "...."
},
...
] } }
Untuk kali ini, di dalam metode success() kelas Handler, mari memutar ulang array translations dokumen JSON di atas, dan memperbarui konten widget TextView dengan menggunakan nilai yang diasosiasikan dengan kunci-kunci translatedText.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
// Access the translations array
JSONArray translations = newJSONObject(data)
.getJSONObject("data")
.getJSONArray("translations");
// Loop through the array and extract the translatedText
Jika Anda menjalankan aplikasinya sekarang, menghasilkan label untuk suatu gambar, dan menekan tombol kedua, Anda akan melihat labelnya dalam bahasa Jerman.
Leave a Comment