SahrulRamadhani29/portfolio

KEJEPRET-AI

Public source

Layanan face recognition untuk foto event olahraga: enrollment, ekstraksi embedding, dan similarity search.

SoloAPI face recognition, inferensi InsightFace, penyimpanan embedding, dan pencocokan

Sorotan kontribusi saya

Baca seluruh 8 modul kontribusi
Daftar isi · 8 modul kontribusi

Gambaran alur utama

6 langkah

Dua masukan—selfie pelari dan foto event—diproses menjadi vektor wajah. Kedua jalur ini bertemu saat client meminta pencarian kecocokan foto.

  1. 01Siapkan referensi pelari

    1. Kirim permintaan enrollment

      Backend marketplace & FastAPI
    2. Bentuk embedding referensi

      InsightFace & OpenCV
  2. 02Indeks wajah foto event

    1. Kirim foto kandidat

      Backend marketplace
    2. Simpan vektor tiap wajah

      Model & PostgreSQL/pgvector
  3. 03Bandingkan dan urutkan

    1. Tentukan ruang pencarian

      Client & layanan pencarian
    2. Hitung cosine similarity

      NumPy & API hasil
Rincian proses dan percabangan
  1. Kirim permintaan enrollmentBackend marketplace & FastAPI

    Client mengirim identitas pelari dan URL selfie melalui endpoint ber-API key. Layanan memuat serta men-decode gambar.

  2. Bentuk embedding referensiInsightFace & OpenCV

    Wajah terbesar dipilih untuk enrollment, lalu embedding di-upsert pada identitas pelari.

    Ada wajah pada selfie?

    • Ada wajah. Simpan atau perbarui referensi pelari untuk pencarian.
    • Tidak ada wajah. Kembalikan kegagalan input; referensi wajah tidak dibuat sembarang.
  3. Kirim foto kandidatBackend marketplace

    Jalur foto event memuat gambar dari URL dan mendeteksi beberapa wajah yang mungkin berada dalam satu foto.

  4. Simpan vektor tiap wajahModel & PostgreSQL/pgvector

    Embedding 512 dimensi dikaitkan dengan foto dan indeks wajahnya. Pemrosesan ulang mengganti embedding foto yang lama.

  5. Tentukan ruang pencarianClient & layanan pencarian

    Client memberi identitas pelari dan daftar foto. Layanan mengambil referensi serta embedding kandidat yang terkait.

  6. Hitung cosine similarityNumPy & API hasil

    Bandingkan vektor, ambil skor terbaik per foto, terapkan threshold, lalu urutkan hasil.

    Skor melewati threshold?

    • Lolos threshold. ID foto dan skor dikembalikan untuk dipetakan ke tampilan marketplace.
    • Tidak lolos. Foto tidak dimasukkan sebagai hasil kecocokan.

Selfie dan foto event menjadi dua jalur masukan terpisah. Layanan memakai model pretrained dan membandingkan embedding kandidat dengan cosine similarity di NumPy.

CASE_STUDY.mdProduk & kontribusi saya

Tentang KEJEPRET-AI

KEJEPRET-AI adalah layanan pengenalan wajah yang menghubungkan selfie pelari dengan wajah pada foto event olahraga. Backend marketplace KeJepret mengirim referensi pelari dan foto kandidat, lalu memakai hasil pencarian untuk menampilkan foto yang memiliki kecocokan.

Saya membangun layanan Python/FastAPI ini, mulai dari inisialisasi model pretrained InsightFace, pemrosesan gambar, penyimpanan embedding, hingga API pencarian. KeJepret menggunakan layanan ini sebagai integrasi AI pada produk marketplace.

Kontribusi saya

Inisialisasi model dan runtime inferensi

Saya menyiapkan model pretrained InsightFace buffalo_l dengan ONNX Runtime pada CPU. Saya menghubungkan kebutuhan model dengan pemrosesan OpenCV/NumPy serta menyesuaikan lokasi artefak model. Bagian ini menjadi dasar layanan untuk menerima gambar dan menghasilkan representasi vektor wajah yang dapat dibandingkan.

Kontrak endpoint dan pemeriksaan akses

Saya menyusun schema request/response FastAPI dan Pydantic untuk enrollment, embedding foto, pencarian, penghapusan embedding, serta health. Endpoint mutasi dan pencarian memeriksa API key. Kontrak ini menghubungkan identitas pelari, URL gambar, daftar foto, dan keluaran layanan dengan backend marketplace.

Enrollment dan referensi wajah pelari

Saya membangun proses pengambilan gambar dari URL, decode gambar, deteksi wajah, serta pemilihan wajah terbesar sebagai referensi enrollment. Embedding dikaitkan dengan identitas pelari melalui operasi upsert agar enrollment berikutnya memperbarui referensi yang sama. Input tanpa wajah dikembalikan sebagai kegagalan input.

Ekstraksi beberapa wajah dalam foto

Saya mengembangkan pemrosesan foto event yang dapat memuat lebih dari satu wajah. Setiap embedding diberi hubungan ke foto dan indeks wajahnya. Ketika foto diproses ulang, embedding lama diganti agar data pencarian mengikuti hasil pemrosesan foto terbaru yang disimpan layanan.

Penyimpanan embedding dan hubungan data

Saya menyimpan vektor wajah berdimensi 512 pada PostgreSQL dengan ekstensi pgvector, beserta relasi pelari atau foto. Data referensi dan kandidat dipakai kembali ketika client meminta pencarian. Pemisahan hubungan pelari, foto, dan indeks wajah membantu memetakan hasil perbandingan kembali ke objek yang dikenali aplikasi.

Cosine similarity dan pengurutan hasil

Saya mengerjakan pengambilan embedding dari daftar foto kandidat, normalisasi vektor, serta perhitungan cosine similarity menggunakan NumPy. Saya mengambil skor terbaik per foto, memetakan skor ke skala aplikasi, menerapkan threshold, lalu mengurutkan hasil sebelum dikembalikan kepada client. Perbandingan kandidat dijalankan pada lapisan aplikasi Python.

Penghapusan data dan integrasi marketplace

Saya menyediakan endpoint untuk menghapus embedding pelari atau foto dan menyesuaikan kontrak identitas serta input daftar foto. Pekerjaan ini menghubungkan pemeliharaan data AI dengan perubahan data pada marketplace, sekaligus memastikan respons ID foto dan skor dapat dipakai oleh alur pencarian KeJepret.

Container dan kebutuhan hosting model

Saya menyesuaikan container, permission, lokasi model, serta kebutuhan startup layanan untuk lingkungan hosting. Saya juga memperbaiki kontrak API yang digunakan backend. Fokusnya adalah menyiapkan layanan inferensi yang dapat dipanggil aplikasi utama dengan bentuk input/output yang konsisten.

Bidang & teknologi inti

Bidang proyek

AI EngineeringComputer VisionBackend & APIData & Databases

Teknologi inti

PythonFastAPIInsightFaceONNX RuntimeOpenCVPostgreSQLpgvectorNumPy

14 commit dalam 12 bulan terakhir

Semua branch
NovDesJanFebMarAprMeiJunJulAguSepOktNov
Minggu
Senin
Selasa
Rabu
Kamis
Jumat
Sabtu
Arahkan ke kotak untuk melihat tanggal.
SedikitBanyak
Streak saat ini0 hari
Streak terpanjang dalam periode2 hari
Hari aktif dalam periode3 hari
Data terverifikasi · pembaruan dijadwalkan tiap jam.
Cara perhitungan · 1 repo · 1 branch

Commit milik saya yang terjangkau dari seluruh branch remote saat sinkronisasi. Satu SHA dihitung sekali, termasuk jika ada di beberapa branch atau fork. Merge commit dikecualikan. Tanggal memakai waktu author dalam WIB, bukan waktu push. Streak saat ini tetap berjalan bila commit terakhir kemarin dan hari ini belum selesai.

Ini kalender commit dengan cakupan semua branch, sehingga angkanya dapat berbeda dari kalender contributions GitHub yang juga memiliki jenis aktivitas dan aturan branch sendiri. Kalender ini khusus untuk proyek yang sedang dibaca.

Riwayat kontribusi

14 commit non-merge milik saya · Seluruh branch · Data 3 November 2026.

Contoh commit public
Kembali ke semua proyek