Di era AI (Artificial Intelligence), banyak sekali penerapan AI di kehidupan sehari-hari. Di bidang teknologi, AI sudah lazim diterapkan, seperti di smart speaker, smart driving car, dan ChatGPT. Kamu mungkin mempunyai kasus yang mengharuskan untuk mengintegrasikan machine learning ke dalam REST API.Â
Untuk mengintegrasikan model machine learning ke REST API, kita memerlukan beberapa konfigurasi yang cukup menantang. Namun, tak usah risau. Pada artikel ini, kita akan bahas cara mengintegrasikan model machine learning ke dalam lingkungan REST API di Node.js. Yuk, disimak!
Persiapan Project
Langkah pertama, siapkan proyek terlebih dahulu. Pada artikel ini, kita akan menggunakan JavaScript sebagai bahasa pemrograman dan Hapi sebagai kerangka kerja (framework).
💻 Mulai Belajar Pemrograman
Belajar pemrograman di Dicoding Academy dan mulai perjalanan Anda sebagai developer profesional.
Daftar Sekarang- Pertama, buat proyek baru dan bukalah proyek tersebut di teks editor/IDE.
- Inisialisasi proyek dengan perintah npm init -y.
- Selanjutnya, jalankan npm install @hapi/hapi untuk menginstal Hapi versi terbaru. Setelah berhasil, buatlah struktur proyek seperti gambar berikut.
- Setelah itu, bukalah berkas server.js dan tulis kode berikut ini:
12345678910111213141516171819202122232425262728const Hapi = require(''@hapi/hapi'')require(''dotenv'').config()const predict = require(''./src'')const PredictService = require(''./src/service'');const init = async () => {const predictService = new PredictService();const server = Hapi.server({port: process.env.PORT,host: ''localhost'',})await server.register([{plugin: predict,options: {service: predictService}}])await server.start()console.log(''Server running on'', server.info.uri)}init()
Kode tersebut merupakan kode untuk membuat HTTP Server. - Kemudian, buka file index.js dan tulis kode berikut ini.
1234567891011const PredictHandler = require(''./handler'');const routes = require(''./routes'');module.exports = {name: ''predicts'',version: ''1.0.0'',register: async (server, { service }) => {const handler = new PredictHandler(service);server.route(routes(handler));},};
Kode di atas digunakan untuk membuat hapi plugin. - Setelah itu, bukalah routes.js dan tulislah kode berikut ini.
12345678910111213141516const routes = (handler) => [{method: ''POST'',path: ''/predict'',handler: handler.getPredictResult,options: {payload: {allow: ''multipart/form-data'',multipart: true,output: ''stream''}}},];module.exports = routes;
Kita membuat route ‘/predict’ dengan metode ‘POST’. Berkas gambar yang dikirim melalui request akan diproses dengan multipart/form-data. - Selanjutnya, bukalah handler.js dan tulis kode berikut ini.
12345678910111213141516171819202122class PredictHandler {constructor(service) {this._service = servicethis.getPredictResult = this.getPredictResult.bind(this)}async getPredictResult(request, h) {const photo = request.payloadconst predict = await this._service.predictImage(photo.file)const { diseaseLabel, confidenceScore } = predictreturn h.response({status: ''success'',message: ''Predict success'',data: {disease: diseaseLabel,confidenceScore}})}}module.exports = PredictHandler;
PredictHandler memiliki konstruktor yang berisi service. Handler akan mengembalikan respons dengan label data penyakit dan confidence score. Langkah selanjutnya adalah membuat service.Â
Integrasi Machine LearningÂ
Di dalam service, kita akan mengintegrasikan model machine learning. Di sini, kita tidak akan membahas cara membuat model machine learning, jadi saya asumsikan kamu sudah memiliki modelnya. Kita akan menggunakan model yang sudah dilatih sebelumnya untuk memprediksi penyakit kulit.Â
Karena modelnya dibuat dengan TensorFlow, kita akan menggunakan TensorFlow.js. Untuk mengintegrasikan model machine learning ke dalam RESTful API, kamu perlu menginstal beberapa dependensi.
- Untuk menambahkan dependensi tfjs-node, kamu dapat menulis perintah berikut ini.
npm install @tensorflow/tfjs-node - Setelah memasang dependencies, bukalah berkas service.js.
- Selanjutnya, import dependencies tensorflow yang dipasang sebelumnya.
const tf = require(''@tensorflow/tfjs-node'')
- Kemudian, buatlah kelas PredictService dan method predictImage.
123class PredictService {async predictImage(photo) {}} - Di dalam method predictImage, tulis kode untuk memuat model machine learning.
12const modelPath = ''file://model/model.json''const model = await tf.loadLayersModel(modelPath);
Model.json akan disimpan di folder model. - Langkah selanjutnya adalah memproses berkas gambar. Jadi, tulislah array dengan nama buffers.
123456const buffers = [];for await (const data of photo) {buffers.push(data);}const image = Buffer.concat(buffers)
Kode tersebut memproses berkas foto menjadi potongan data dan menggabungkannya menjadi satu Buffer dengan nama image. - Selanjutnya, kita bisa memprediksi gambar dengan menulis kode berikut.
12345678910const tensor = tf.node.decodeImage(image).resizeNearestNeighbor([224, 224]).expandDims().toFloat();const predict = await model.predict(tensor);const score = await predict.data();const confidenceScore = Math.max(...score);const label = tf.argMax(predict, 1).dataSync()[0];
TensorFlow API resizeNearestNeighbor digunakan untuk mengubah ukuran gambar. Variabel score menerima nilai hasil prediksi dengan method data(). Variabel confidenceScore menghitung nilai maksimum dari confidence score dari array score. Variabel label menggunakan argMax function untuk menemukan index dari maksimum score yang mengindikasi label dari class. - Pada kasus ini, kita memiliki tiga label. Jadi tambahkan kode berikut ini.
123const diseaseLabels = [''Melanocytic nevus'', ''Squamous cell carcinoma'', ''Vascular lesion''];const diseaseLabel = diseaseLabels[label]
Variabel diseaseLabel mengembalikan nama label yang kita prediksi. Jadi, jika labelnya 1, label penyakitnya adalah ‘Squamous cell carcinoma’. - Terakhir, kembalikan confidence score dan label penyakit.
return { confidenceScore, diseaseLabel };Berikut keseluruhan kode yang ada di berkas service.js.
12345678910111213141516171819202122232425262728293031class PredictService {async predictImage(photo) {const modelPath = ''file://model/model.json''const model = await tf.loadLayersModel(modelPath);const buffers = [];for await (const data of photo) {buffers.push(data);}const image = Buffer.concat(buffers);const tensor = tf.node.decodeImage(image).resizeNearestNeighbor([224, 224]).expandDims().toFloat();const predict = await model.predict(tensor);const score = await predict.data();const confidenceScore = Math.max(...score);const label = tf.argMax(predict, 1).dataSync()[0];const diseaseLabels = [''Melanocytic nevus'', ''Squamous cell carcinoma'', ''Vascular lesion''];const diseaseLabel = diseaseLabels[label];return { confidenceScore, diseaseLabel };}}module.exports = PredictService;
Pengujian
Langkah terakhir, kita akan menguji REST API yang telah dibuat sebelumnya. Kamu dapat menggunakan Postman atau tools lainnya. Untuk menguji REST API, buatlah satu request ke endpoint ‘/predict’ dan pastikan endpoint mengembalikan confidence score dan nama penyakit.
Tak terasa kita sudah di penghujung artikel. Kita sudah berhasil mengintegrasikan model machine learning ke REST API menggunakan tfjs-node dan Hapi. Mudah, kan? Sampai jumpa di artikel selanjutnya, Adiós!