Seru-seruan bareng AI pakai Node.js
Kecerdasan buatan alias Artificial Intelligence (AI) itu bikin gue mindblow 🤯. Meskipun gue ngerti dunia Software Developer, tapi setiap kali nyoba produk yang dikasih sentuhan AI, gue cuma bisa manggut-manggut sambil bilang, 'wah, ini kayak sihir beneran'. Tentu aja, gue paham, nggak ada sihir-sihiran dalam teknologi. Semua bisa dijelaskan dan tentunya bisa dipelajari.
AI jadi salah satu yang ingin gue eksplorasi tahun ini. Gua nggak punya ambisi gede sih. Belajar kali ini bukan buat jadi master AI (kayak AI Engineer, ML Engineer gitu). Tapi minimal, gue bisa seneng-seneng aja main-main sama AI lewat tools-tools yang udah biasa gue pake sebagai web developer.
Learning Outcome
Setiap kali gue mau belajar sesuatu yang baru, gue selalu menetapkan sebuah target. Tujuannya biar terus termotivasi dan terarah selama proses belajarnya. Target gue belajar AI kali ini adalah minimal gue bisa bikin aplikasi web yang ada proses komputasi memanfaatkan teknologi AI. Kurang lebih gini spesifikasi aplikasinya.
- Gambaran Aplikasi: Aplikasi pendeteksi nama boneka
- Interface: HTTP API (RCP)
- User Input: File -> Foto Boneka
- System Output: Nama Boneka
- Tools yang bakal dipakai: JavaScript, Node.js.
Yap! Target gue adalah pingin coba buat aplikasi (RCP API, karena malas bikin Front-End wkwk) yang bisa mendeteksi nama dari boneka-boneka anak gue. Dia sering banget beli boneka dan langsung dikasih nama sendiri. 😆
Jadi, dari target di atas, ada dua hal utama yang perlu gue capai.
- [ ] Harus bisa bikin model Machine Learning sendiri. Model Machine Learning itu harus belajar nama-nama boneka anak gue.
- [ ] Harus bisa pake model Machine Learning di Node.js (gue yakin bisa karena ada ONNX runtime web atau Tensorflow.js).
Ayok kita mulai petualangannya!
Target 1: Bikin Model Machine Learning Sendiri
Pertualangan gue di dunia AI dimulai dari ngikutin kelas Belajar Dasar AI di Dicoding. Gue lihat materinya kira-kira cocok dan enggak bikin pusing. Ada 4 topik inti di kelas ini, mulai dari Berkenalan dengan Artificial Intelligence, Data untuk AI, Pengantar Machine Learning, sampai Deep Learning untuk Semua Orang.
Supaya lulus dari kelas ini, gue harus jawab beberapa soal pilihan ganda. Beruntungnya, gue bisa dapet nilai 100 di setiap soalnya 😅. Biasanya di kelas Dicoding, buat lulus ada tugas yang harus dikumpulin. Tapi sayangnya, kelas ini enggak punya.
Ini dia sertifikat gue setelah lulus kelas Belajar Dasar AI.
Rangkuman Hasil Belajar dari Kelas Belajar Dasar AI
Yuk, gue ceritain beberapa hal seru yang gue dapet dari kelas ini.
Berkenalan dengan Artificial Intellegence
Di bagian ini, kita dikenalin sama AI dari pengertian sampai contoh produk yang udah populer. Gue dapet beberapa insight baru, misalnya gue jadi ngerti hubungan antara Artificial Intelligence, Machine Learning, Deep Learning, dan Generative AI. Semua itu ada di level yang semakin dalam dan jadi satu kesatuan.
Di bagian ini juga, gue ngeh kalo pemanfaatan AI punya tahapannya. Mulai dari kumpulin data, bersihin data, bikin dan latih model berdasarkan data, sampe kita bisa dapet manfaat dari model AI yang udah kita buat. Meskipun di kelas ini enggak dijelasin detail teknisnya, tapi menurut gue, buat web developer kayak gue, cukup tahu "Oh" aja (setidaknya untuk sekarang). 😋
Data untuk AI
Modul ini membahas tentang data yang bisa diproses sama AI. Paling intinya, AI bisa ngolah banyak data, asal data itu bisa disimpan di komputer. Jadi, kalo data masih dalam bentuk konvensional, misalnya kertas, AI enggak bisa langsung olah. Harus di-digitalisasi dulu, entah dengan difoto atau ditulis dalam bentuk dokumen.
Di bagian ini enggak banyak yang baru buat gue karena sebagai web developer, gue udah biasa main dengan data. Meskipun JavaScript termasuk 🦆 typing, tapi gue tahu tipe-tipe data yang biasa diproses komputer karena gue udah berurusan sama Database.
Ada kutipan yang menurut gue keren dan perlu diingat yaitu "Garbage in, garbage out". Ketika kita memasukan data "sampah", hasilnya pun akan "sampah". Jadi kualitas dari yang dihasilkan oleh AI, sangat tergantung dari data yang kita berikan sebagai input.
Pengantar Machine Learning
Di modul ini 🧠 mulai bekerja keras memproses kalimat demi kalimat karena banyak istilah machine learning yang belum gue ketahui. Intinya, modul ini menjelaskan tentang beberapa tipe-tipe machine learning berdasarkan cara belajarnya. Ada 3 tipe yang dijelaskan yaitu supervised learning, unsupervied learning, dan reinforcement learning.
Singkatnya, supervised learning merupakan Machine Learning yang belajarnya melalui data yang dikasih "label". Misalnya, ada data yang merupakan gambar 🐱 lalu data tersebut dilabeli dengan teks "Kucing", begitu juga dengan gambar 🐔 yang dilabeli "Ayam". Nantinya, mesin akan belajar dari apa yang kita kasih dan akhirnya bisa membedakan Kucing dan Ayam.
Buat kalian yang gak tahu bedanya kucing dan ayam, tolong tonton video ini. SERIUS LANGSUNG PAHAM!
Supervised learning mirip seperti ngajarin nama-nama hewan ke anak gue ketika umurnya 1 tahun. "Nak, iniloh Kuda", "Nak, iniloh Jerapah". Menurut gue, supervised learning cocok digunakan sebagai solusi kalo kalian ingin punya alat "detector" berdasarkan sebuah data (bisa tersturktur atau tidak terstruktur).
Kalo unsupervised learning itu Machine Learning yang belajarnya melalui data tanpa label. Biasanya Machine Learning tipe ini digunakan untuk mengelompokan sebuah data, bukan menentukan jenis datanya. Misalkan mesin dikasih input [🍎🍇🧀🌶️🍆🍌]
, mesin akan menghasilkan output dari hasil pengelompokan inputnya, contohnya hasilnya akan seperti ini [🍇🍆,🌶️🍎,🧀🍌]
. Jadi, mesin secara mandiri mencari pola yang bisa mengelompokan input, kasus ini dikelompokan berdasarkan warna.
Terakhir reinforcement learning yang menurut gue paling menarik. Machine learning jenis ini belajar dengan pendekatan reward dan punishment. Mesin harus bertindak benar untuk mendapatkan reward, sebaliknya jika salah, akan mendapatkan punishment. Di sini, posisi mesin sebisa mungkin harus mendapatkan reward. Kalo sekali aja dia kena punishment, prosesnya akan diulang sampai bener-bener mesin paham dengan tujuannya.
Jika kalian belum terbayang cara belajarnya, gue pernah nonton video bagus yang mencontohkan implementasi dari reinforcement learning di bawah ini.
Banyak banget ilmu baru yang gue dapat dari modul ini, baik yang langsung didapatkan ketika gue baca materinya ataupun yang gue eksplorasi lebih dalam dari sumber lain. Di modul ini juga dijelaskan cara maintenance model AI agar terus menghasilkan prediksi yang relevan tidak termakan oleh waktu.
Deep Learning untuk Semua Orang
Modul Deep Learning untuk Semua Orang menurut gue sama beratnya dengan modul sebelumnya. Gue sadar ini faktor kapasitas otak gue yang 🤏🏻. Namun, gue tetap lanjut baca pelan-pelan memahami kalimat tiap kalimatnya. Jadi apa aja yang gue pelajari di modul ini?
Deep learning adalah subset dari Machine Learning. Intinya, AI yang dibangun dengan Deep Learning memiliki cara kerja yang terinsipirasi dari otak manusia. Di sini dijelasin pengertian dari Artificial Neural Network, Multi Layer Perceptron, dan istilah lainnya yang berhubungan tentang Deep learning. Jujurnya, ketika nulis artikel ini, gue udah sebagian lupa karena memang diberikan informasi yang sudah terlalu dalam dan gue sendiri menolak untuk mendalaminya (balik lagi karena gue cuma ingin pakai AI bukan membuat hihi).
Yang paling menarik dari modul ini dan mungkin paling menarik dari keseluruhan kelasnya adalah gue jadi tahu eksistensi platform Teachable Machine. Ini merupakan platform untuk membuat model AI dengan cara yang sangat ramah bagi pemula, bahkan non-developer pun gue yakin bisa pakai. Walaupun gitu, model yang dihasilkan tetap powerful. Yang paling gue senang tentu karena platform ini gratis. 😛
Setelah menemukan platform ini, membuat model machine learning sendiri jadi semakin mudah tercapai 😂. Walau cara yang dipakai sangat instan, tapi ini sangat cukup untuk kebutuhan gue sekarang. 😅
Bikin Model Pakai Teachable Machine
Sebelum gue buat model AI-nya, gue mau kenalin dulu nih tiga boneka anak gue yang bakal dipake untuk eksperimen.
Boneka yang kiri namanya Gogo, singkatan dari Gosig Golden. Nah, yang tengah tuh Lili, diambil dari nama Lilieplut. Sementara yang paling kanan namanya Apikat, gibberish dari nama binatang Mirkat. 😅
Saatnya menuju ke platfirm Teachable Machine.
Untuk bikin model pakai Teachable Machine, kunjungi websitenya di teachablemachine.withgoogle.com. Kayak produk Google lainnya, tampilannya keren dan friendly banget.
Teachable Machine menyediakan tiga base model: image project, audio project, dan pose project.
Kali ini, gue pilih yang image project (dan standar image model) karena sesuai dengan kebutuhan kita.
Proses training model super duper mudah. Cukup kasih dataset (gambar) per kelas. Di sini gue buat tiga kelas, yaitu Gogo, Lili, dan Apikat. Pastikan tiap kelas punya dataset yang memadai.
Setelah itu, klik tombol Train Model untuk mulai training.
Yay, sekarang kita bisa ekspor modelnya. Hasil ekspor tersedia dalam berbagai format. Gue pilih format Tensorflow.js karena dipakai di Node.js.
Model akan terdownload dalam format .zip dan kalo diekstrak, isinya sekitar gini:
- my-tf-model
- metadata.json
- model.json
- weights.bin
Target pertama selesai! Selanjutnya, kita akan pakai model ini di Node.js! 🚀
Target 2: Pakai Model Machine Learning di Node.js
Buat mempersingkat artikel, kita lewati bagian pembuatan HTTP server ya. Udah jadi porsi kerjaan gue. 😬 Jadi, gue kasih starter project langsung, bisa di-download di link: starter project.
Di proyek ini, udah ada HTTP server (Hapi Framework), endpoint POST /predict
, model machine learning (dari Teachable Machine), dan unit test buat nyoba tiga boneka (dengan data yang beda dari dataset training). Yang kurang cuma integrasi model Tensorflow.js dengan aplikasinya.
Jalanin starter proyeknya cukup simpel.
- Pasang dependencies yang dibutuhkan:
npm install
- Jalanin HTTP server:
npm start
ataunpm run dev
(untuk auto-reload) - Jalanin unit test:
npm test
Pastikan unit testnya fail, soalnya kita akan fix itu sekarang. Gas!
Pertama, pasang package @tensorflow/tfjs-node
karena kita bakal pakai Tensorflow.js di Node.js. Caranya gampang, ketik di terminal:
npm install @tensorflow/tfjs-node
Lanjut, kita load model machine learning yang berada di /models/model.json
dan label klasifikasinya di /models/metadata.json
.
Bikin fungsi baru namanya loadModel
buat abstraksi proses ini semua. Taruh fungsi tersebut di berkas baru lokasinya di /src/ml.js
.
// file: /src/ml.js
import tf from '@tensorflow/tfjs-node';
import * as path from 'path';
import * as fs from 'fs';
async function loadModel() {
const modelUrl = tf.io.fileSystem(
path.join(process.cwd(), 'models', 'model.json'),
);
const metadata = JSON.parse(
fs.readFileSync(
path.join(process.cwd(), 'models', 'metadata.json'),
{ encoding: 'utf-8' },
),
);
const model = await tf.loadLayersModel(modelUrl);
model.classes = metadata.labels;
return model;
}
Proses load model dilakukan dengan fungsi tf.loadLayersModel
. Fungsi ini menerima satu argumen, yaitu url
dari model yang akan dibaca. Kalau model kita disimpan di cloud storage dan punya public URL, kita bisa langsung kasih URLnya. Tapi, karena model kita lokal, kita ubah dulu alamat lokalnya menjadi URL. Proses ini bisa kalian lihat di kode inisialisasi variabel modelUrl
.
Masih di berkas yang sama, kita perlu membuat fungsi transformImage
yang akan mengubah gambar dari Buffer
(input pengguna) menjadi Tensor
(yang dibutuhkan model sebagai input).
// file: /src/ml.js
function transformImage(image) {
return tf.node
.decodeImage(image, 3)
.expandDims()
.resizeNearestNeighbor([224, 224])
.div(tf.scalar(127))
.sub(tf.scalar(1));
}
Proses transformasi gambar dilakukan dengan fungsi tf.node.decodeImage
. Selain itu, kita perlu lakukan berbagai normalisasi agar input dapat diproses dengan baik oleh model agar menghasilkan prediksi yang akurat. Salah satu referensi normalisasi bisa dilihat di: Data augmented.
Selanjutnya, buat fungsi predict
yang digunakan untuk mengabstraksi proses prediksi input. Fungsi ini menerima dua argumen, yaitu model
dan image
(dalam bentuk Tensor).
// file: /src/ml.js
import { indexOfMaxNumber } from './utils.js';
// ... other code
async function predict(model, image) {
const result = await model.predict(image).data();
const index = indexOfMaxNumber(result);
return model.classes[index];
}
Proses predict dilakukan melalui model
dengan menggunakan model.predict()
. Lalu, untuk mendapatkan data prediksinya, gunakan fungsi data()
. Fungsi ini mengembalikan array yang tiap elemennya menunjukkan nilai kecocokan dari masing-masing kelas. Di sini, kita perlu mendapatkan index dari nilai tertinggi hasil prediksi menggunakan fungsi indexOfMaxNumber()
dan mengembalikan fungsi predict
dengan classification label sesuai dengan index tertinggi.
Terakhir di berkas ini, kita perlu mengekspor ketiga fungsi yang sudah kita buat agar bisa dipakai di berkas JavaScript lain.
// file: /src/ml.js
// ... other code
export { transformImage, loadModel, predict };
Pembuatan fungsi-fungsi yang terkait dengan Machine Learning selesai! 😌 Sekarang, kita akan menggunakan apa yang sudah kita buat.
Pertama, buka berkas /src/http.js
dan panggil fungsi loadModel
di top-level fungsi createServer
untuk load dan dapatkan model ML.
// file: /src/http.js
import { loadModel, predict, transformImage } from './ml.js';
async function createServer() {
const model = await loadModel();
// ... other code
}
Selanjutnya, pada fungsi handler
, kita transform image
dari request, lalu predict
, dan kembalikan hasilnya sebagai HTTP response.
// file: /src/http.js
import { loadModel, predict, transformImage } from './ml.js';
async function createServer() {
// ... other code
server.route({
// ... other code
handler: async (request) => {
const { image } = request.payload;
const processedImage = transformImage(image);
const result = await predict(model, processedImage);
return { result };
},
// ... other code
});
return server;
}
Everything looks good! Sekarang, coba tes dengan menjalankan npm test
.
BOOM! Meski dataset-nya tidak seberapa, hasil prediksinya cukup akurat. Ingat, gue gak pake gambar yang sama dengan saat training. Jadi, pengujian ini mencerminkan input di production. Teachable Machine emang keren! 👏🏻
Let's mark all the target as done! 😁
- [x] Harus bisa bikin model Machine Learning sendiri. Model Machine Learning itu harus belajar nama-nama boneka anak gue.
- [x] Harus bisa pake model Machine Learning di Node.js (gue yakin bisa karena ada ONNX runtime web atau Tensorflow.js).
Akhir Kata
Melalui eksplorasi ini, gue tidak hanya berhasil mencapai target awal, tetapi mendapatkan pemahaman yang lebih luas tentang dunia AI. Siapa tahu, mungkin ke depannya gue akan terus menjelajahi dan menggali lebih dalam lagi dalam dunia yang begitu menarik ini. Bagaimana pun, pembelajaran adalah perjalanan tanpa akhir, dan kita harus siap untuk menghadapi tantangan baru yang mungkin ada di depan. Mari terus belajar dan berkembang bersama teknologi yang selalu berubah dan berkembang pesat. 🚀