Weekend ini saya berencana untuk belajar & research tentang Image Similarity Search. Saya sudah baca beberapa artikel dan fitur ISS ini adalah sesuatu yang sangat feasible untuk saya kerjakan dan integrate ke project-project saya berikutnya.
Beberapa hal yang sudah saya ketahui sebelumnya tentang topik ini:
sama seperti similarity search yang lainnya, vector adalah main ingridient dari fitur ini
saya membutuhkan sebuah vector database
saya membutuhkan model / embeddings untuk menconvert image ke vector representatif
mostly implementasi yang paling mudah adalah menggunakan Python
Karena saya tidak familiar dengan Python, maka hal pertama yang saya coba lakukan adalah menggunakan Js instead of Python dan snippet berikut adalah percobaan pertama saya
import path from "path"
import tf from "@tensorflow/tfjs-node"
import mobilenet from "@tensorflow-models/mobilenet";
import sharp from "sharp"
async function extractFeatures(imagePath: string) {
const image = await sharp(imagePath).resize({ width: 224, height: 224 }).toBuffer();
const model = await mobilenet.load();
const tensor = tf.node.decodeImage(new Uint8Array(image));
const features = model.infer(tensor, true);
return features.data()
}
const run = async () => {
let n = 0;
while (n < 10) {
console.time("time")
const data = await extractFeatures("./images/01J4DH4A3T1DK3RQ9C0XZJB69N.jpg")
// console.log(data)
console.timeEnd("time")
n++
}
}
run()
flow snippet diatas adalah
resize image ke ukuran 224x224
decode image ke bentuk tensor
convert tensor ke vector representatif based on model
mobilenet
Masalah dari snippet diatas adalah kecepatan, saya sudah coba switch menggunakan @tensorflow/tfjs-node-gpu
dan mencoba switch hardware ke nvidia dengan cuda, dan tetap saja. Untuk memproses 1 image membutuhkan waktu sekitar 7 detik dan saya yakin pasti ada yang salah!
Switch ke Python
Dari contoh-contoh di internet, mostly implementasinya menggunakan Python maka waktunya onboard ke python!
Terakhir kali saya mencoba python, teman saya menyarankan menggunakan tooling yang bernama Conda
untuk urusan virtual env, dan saya rasa saat itu experiencenya tidak nyaman, maka saya coba mencari tools lain dan menemukan uv
https://github.com/astral-sh/uv
sepemahaman saya uv
ini sama seperti nvm / fnm dan juga pnpm dimana saya dapat
membuat virtual env yang direpresentasikan oleh directory
.venv
deps / packages install & resolver dengan command
uv pip install ..
Semua yang berhubungan dengan uv
berjalan lancar dan saya berhasil replicate contoh dari artikel ini https://upstash.com/blog/image-similarity-search
Kesimpulannya, implementasi menggunakan Python memang jauh lebih cepat, entah apakah karena Maturity library pada Python atau karena menggunakan model yang berbeda karena pada saat saya menggunakan Python, model yang digunakan adalah openai/clip-vit-base-patch32
instead of mobilenet
dan sepertinya setelah ini saya akan banyak coding Python! Sekian.