Bagaimana Cara Memakai Google Cloud Machine Learning Service Untuk Android?
Senin, 23 September 2019
Edit
Berbagai info 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 menciptakan aplikasi semacam itu dari nol.
Untungnya baru-baru ini Google meluncurkan platform Cloud Machine Learning, yang memperlihatkan jaringan syaraf yang telah dilatih sebelumnya untuk menjalankan banyak sekali tugas. Sebagian modelnya tidak hanya sangat akurat, tetapi terus menerus ada peningkatan. Dan tebak, Anda bisa menggunakannya hanya dengan menciptakan beberapa panggilan REST API!
Dalam tutorial ini, akan saya perkenalkan Anda pada platform Cloud Machine Learning dan memperlihatkan Anda cara menggunakannya untuk menciptakan aplikasi cerdas Android yang bisa mengenali objek-objek dunia faktual dan menyebutkan namanya dalam banyak sekali bahasa.
Prasyarat
Untuk bisa maksimal mengikuti tutorial ini, yang Anda butuhkan adalah:
- versi terkini Android Studio
- perangkat yang menjalankan Android 4.4 atau yang lebih tinggi
- dan sebuah akun Google Cloud Platform
1. Mendapatkan kunci API
Untuk bisa memakai layanan pembelajaran mesin Google di aplikasi Android Anda, dibutuhkan suatu kunci API. Anda bisa mendapatkannya dengan menciptakan proyek gres di konsol Google Cloud Platform.
Mulailah dengan masuk ke konsol dan menekan tombol Create New Project. Pada obrolan 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 memakai 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 memakai 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 gres dengan activity yang kosong. Saya sarankan Anda menentukan setidaknya API level 19 untuk SDK minimal yang didukung.
Meskipun Anda tidak harus melakukannya, selalu lebih baik untuk memakai pustaka jaringan yang kokoh dalam berkomunikasi dengan platform Google Cloud Machine Learning. Dalam tutorial ini, kita akan memakai salah satu pustaka (library) yang berjulukan Fuel. Tambahkan sebagai dependensi
compile
di file build.gradle modul app
:compile 'com.github.kittinunf.fuel:fuel-android:1.5.0'
Tekan Sync Now untuk memperbarui proyek Anda.
Berikutnya aplikasi kita akan membutuhkan izin
INTERNET
untuk berkomunikasi dengan server Google. Oleh alasannya yaitu itu, tambahkan baris berikut di dalam manifest file proyeknya:<uses-permission android:name="android.permission.INTERNET"/>
Yang terakhir, tambahkan kunci API Anda ke file values/strings.xml:
<string name="mykey">ABCDEF12345-abcdef12345-123</string>
3. Menggunakan Vision API
Vision API membantu Anda menciptakan aplikasi yang bisa melihat dan mengerti lingkungan pengguna. Deteksi wajah, deteksi emosi, pengenalan huruf optik, dan anotasi gambar yaitu sebagian dari sekian banyak fitur yang dimilikinya. Untuk ketika 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 alasannya yaitu itu, mari menciptakan layar yang pengguna bisa mengambil gambar dengan kamera perangkat.
Langkah 1: Buat Suatu Tata Letak
Tata letak layar kita akan mempunyai 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 alasannya yaitu itu, tambahkan instruksi berikut ke file XML tata letak activity Anda:<Button android: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 menciptakan intent gres dengan agresi
ACTION_IMAGE_CAPTURE
dan memasukkannya ke metode startActivityForResult()
, Anda bisa meminta aplikasi kamera default pengguna untuk mengambil gambar dan memasukkannya ke aplikasi Anda. Oleh alasannya yaitu itu tambahkan instruksi berikut ke kelas Activity
Anda:public final static int MY_REQUEST_CODE = 1; public void takePicture(View view) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, MY_REQUEST_CODE); }
Untuk mendapatkan 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
.@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(requestCode == MY_REQUEST_CODE && resultCode == RESULT_OK) { // Convert image data to bitmap Bitmap picture = (Bitmap)data.getExtras().get("data"); // Set the bitmap as the source of the ImageView ((ImageView)findViewById(R.id.previewImage)) .setImageBitmap(picture); // More code goes here } }
Jika Anda menjalankan aplikasinya kini dan mengambil gambar, Anda akan melihat gambarnya tidak mengecewakan kecil. Itu tidak masalah—Cloud Vision API sangatlah akurat meskipun dengan gambar keluku (thumbnail).
Langkah 3: Kodekan Gambarnya
Vision API tidak bisa memakai objek
Bitmap
secara langsung, melainkan mengekspektasikan string data gambar dikompresi yang berkode Base64.Untuk kompresi data gambar, Anda sanggup memakai 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 memakai format JPG dan memastikan bahwa kualitas gambar yang dihasilkan cukup tinggi:ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); picture.compress(Bitmap.CompressFormat.JPEG, 90, byteStream);
Sekarang Anda bisa memroduksi string Base64 dengan memakai metode
encodeToString()
kelas Base64
.String base64Data = Base64.encodeToString(byteStream.toByteArray(), Base64.URL_SAFE);
Langkah 4: Proses Gambarnya
Setelah semua kerja keras itu, Anda mempunyai semua yang dibutuhkan untuk berinteraksi dengan Vision API. Mulailah dengan menciptakan string yang berisi URL API dan kunci API:
String requestURL = "https://vision.googleapis.com/v1/images:annotate?key=" + getResources().getString(R.string.mykey);
Untuk mengirimkan data ke API, Anda harus menciptakan undangan HTTP POST. Badan undangan harus berupa dokumen JSON yang berisi data gambar berkode Base64. Untuk deteksi label, dokumen juga harus mempunyai array
features
yang mengandung nilai LABEL_DETECTION
. Berikut yaitu format dokumen JSON.{"requests": [{ "image": { "content": <Base64-encoded image data> }, "features": [{ "type": "LABEL_DETECTION" }] }]}
Meskipun memungkinkan untuk menulis sendiri instruksi dokumen JSON, membuatnya secara terprogram akan mengurangi kemungkinan kesalahan. Kode berikut memperlihatkan Anda cara melakukannya dengan kelas
JSONObject
dan JSONArray
:// Create an array containing // the LABEL_DETECTION feature JSONArray features = new JSONArray(); JSONObject feature = new JSONObject(); feature.put("type", "LABEL_DETECTION"); features.put(feature); // Create an object containing // the Base64-encoded image data JSONObject imageContent = new JSONObject(); 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 = new JSONArray(); JSONObject request = new JSONObject(); request.put("image", imageContent); request.put("features", features); requests.put(request); JSONObject postData = new JSONObject(); postData.put("requests", requests); // Convert the JSON into a // string String body = postData.toString();
Di titik ini, kita bisa memakai metode
post()
kelas Fuel
untuk menciptakan undangan HTTP POST. Sebagai satu-satunya argumennya, metode ini mengekspektasikan URL API. Anda juga harus memasukkan header content-length
dan content-type
di permintaannya. Untuk melaksanakan itu gunakan metode header()
. Dengan cara serupa, untuk menambahkan dokumen JSON ke tubuh undangan POST, gunakan metode post()
.Yang terakhir, dengan memanggil metode
responseString()
dan memasukkan instance gres kelas Handler
ke dalamnya, Anda bisa secara asinkron mendapatkan respon undangan sebagai string. Oleh alasannya yaitu itu, tambahkan instruksi berikut:Fuel.post(requestURL) .header( new Pair<String, Object>("content-length", body.length()), new Pair<String, Object>("content-type", "application/json") ) .body(body.getBytes()) .responseString(new Handler<String>() { @Override public void success(@NotNull Request request, @NotNull Response response, String data) { // More code goes here } @Override public void failure(@NotNull Request request, @NotNull Response response, @NotNull FuelError fuelError) {} });
Ketika Anda memakai 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 ibarat ini:
{"responses":[{ "labelAnnotations": [ { "mid": "/m/id1", "description": "label1", "score": 0.91 }, { "mid": "/m/id2", "description": "label2", "score": 0.90 }, ... }]}
Untuk ketika ini, mari memutar ulang semua objek di array
labelAnnotations
dan menambahkan nilai tiap kunci description
ke widget TextView
tata letak kita. Berikut yaitu cara melakukannya di dalam metode success()
kelas Handler
:// Access the labelAnnotations arrays JSONArray labels = new JSONObject(data) .getJSONArray("responses") .getJSONObject(0) .getJSONArray("labelAnnotations"); String results = ""; // Loop through the array and extract the // description key for each item for(int i=0;i<labels.length();i++) { results = results + labels.getJSONObject(i).getString("description") + "\n"; } // Display the annotations inside the TextView ((TextView)findViewById(R.id.resultsText)).setText(results);
Sekarang Anda bisa menjalankan aplikasinya, ambil gambar objek apa saja di akrab 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 menciptakan 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 simpulan tata letak activity Anda dengan memakai instruksi berikut:<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 mempunyai event handler
onClick
yang harus didefinisikan dalam kelas Activity
Anda.Langkah 2: Terjemahkan Labelnya
Menggunakan Translation API jauh lebih gampang daripada memakai Vision API, terutama alasannya yaitu Anda tidak harus menciptakan dokumen JSON untuk mendefinisikan undangan Anda. Sebaliknya, Anda bisa memasukkan banyak sekali parameter dalam suatu string kueri.
Buat metode
translateToGerman()
dan, di dalamnya, buat suatu string yang berisi URL Translation API.public void translateToGerman(View view) { String requestURL = "https://translation.googleapis.com/language/translate/v2"; // More code goes here }
Untuk menambahkan isian (field) ke string kueri URL di atas, kita bisa memakai objek
List
dari Pair
. Isian-isian berikut penting:key
, menentukan kunci diam-diam API Anda.source
, menentukan bahasa sumber yang akan Anda terjemahkantarget
, menentukan bahasa sasaran terjemahanq
, menentukan teks yang Anda ingin terjemahkan
Kode berikut memperlihatkan Anda cara mengonfigurasi API untuk menerjemahkan dari bahasa Inggris ke bahasa Jerman:
List<Pair<String, String>> params = new ArrayList<>(); // Add API key params.add(new Pair<String, String>("key", getResources().getString(R.string.mykey))); // Set source and sasaran languages params.add(new Pair<String, String>("source", "en")); params.add(new Pair<String, String>("target", "de"));
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:String[] queries = ((TextView)findViewById(R.id.resultsText)) .getText().toString().split("\n"); for(String query:queries) { params.add(new Pair<String, String>("q", query)); }
Terakhir, Anda bisa memanggil metode
get()
dari kelas Fuel
untuk menciptakan undangan HTTP GET ke Translation API. Kali ini juga, Anda bisa memakai metode responseString()
untuk mendapatkan respon dalam bentuk string secara asinkron.Fuel.get(requestURL, params).responseString(new Handler<String>() { @Override public void success(@NotNull Request request, @NotNull Response response, String data) { // More code here } @Override public void failure(@NotNull Request request, @NotNull Response response, @NotNull FuelError fuelError) { } });
Respon Translation API yaitu dokumen JSON yang mengandung sekumpulan terjemahan. Formatnya yaitu sebagai berikut:
{ "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 memakai nilai yang diasosiasikan dengan kunci-kunci translatedText
.// Access the translations array JSONArray translations = new JSONObject(data) .getJSONObject("data") .getJSONArray("translations"); // Loop through the array and extract the translatedText // key for each item String result = ""; for(int i=0;i<translations.length();i++) { result += translations.getJSONObject(i) .getString("translatedText") + "\n"; } // Update the contents of the TextView widget ((TextView)findViewById(R.id.resultsText)).setText(result);
Jika Anda menjalankan aplikasinya sekarang, menghasilkan label untuk suatu gambar, dan menekan tombol kedua, Anda akan melihat labelnya dalam bahasa Jerman.
Kesimpulan
Dalam tutorial ini, Anda berguru cara memakai Cloud Vision dan Cloud Translation API, yang merupakan bab dari platform Google Cloud Machine Learning, di aplikasi Android. Ada banyak lagi API yang ditawarkan oleh platform ini. Anda bisa memppelajarinya lebih lanjut dengan merujuk ke dokumentasi resmi.
Senyampang Anda masih di sini, pelajari beberapa tutorial kami yang lain ihwal bagaimana memakai machine learning dan cloud service di aplikasi Android Anda!
Indonesian Translation by Kurniawan Sugi Purwanto
Original English article can be viewed here