Image Similarity Search, Python, UV

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:

  1. sama seperti similarity search yang lainnya, vector adalah main ingridient dari fitur ini

  2. saya membutuhkan sebuah vector database

  3. saya membutuhkan model / embeddings untuk menconvert image ke vector representatif

  4. 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

  1. resize image ke ukuran 224x224

  2. decode image ke bentuk tensor

  3. 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

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.