Proyek ini berfokus pada pembuatan layanan yang menampilkan gambar ordinal yang sama.
UI -nya tersedia di https://ordsimilarity.com/. API (detail di bawah) tersedia di https://api.ordsimilarity.com.
Gambar -gambar diklasifikasikan menggunakan algoritma average hash , yang mengubahnya menjadi sedikit urutan 0s dan 1s. Mereka kemudian dibandingkan dengan menggunakan Hamming distance , yang mengukur berapa banyak bit yang umum di antara dua gambar. Deskripsi terperinci dapat ditemukan di tautan ini.
Hash rata -rata dari semua ordinal disimpan dalam file JSON . Contoh data dapat dilihat di average_hash_example.json .
Catatan: Kami menggunakan file JSON sebagai ganti "DB normal" karena kami harus selalu mengulangi semua data di dalam, dan ternyata jauh lebih cepat untuk memuat semua data dari file JSON daripada dari beberapa DB seperti SQLite3.
Fungsi pemrosesan utama adalah get_matches_from_data di get_matches.py . Fungsi ini mengulangi semua hash rata -rata yang diberikan dan membandingkan kesamaannya dengan hash rata -rata yang dihitung dari data yang disediakan - baik ID ordinal atau konten gambar khusus. Ini mengembalikan daftar ordinal yang paling mirip, diurutkan berdasarkan kesamaan mereka.
get_matches.py juga menyediakan akses CLI ke fungsi. Lihat python get_matches.py --help untuk lebih jelasnya.
API diimplementasikan dalam python menggunakan kerangka FastAPI . Pada startup, memuat hash rata -rata dari file JSON ke dalam memori. Kemudian, untuk setiap permintaan, ia memberikan data ini ke fungsi get_matches_from_data yang disebutkan di atas dan mengumpulkan hasilnya. Sebelum mengembalikan hasil JSON ke klien, itu memperkaya data ordinal yang serupa dengan properti atau tautan yang berguna tambahan.
Catatan: API sebenarnya memanggil API Rust , yang memberikan kinerja yang jauh lebih baik. Lihat bagian Rust server untuk lebih jelasnya.
API mencakup beberapa titik akhir untuk pencarian kesamaan, yang didefinisikan dalam api.py :
GET /ord_id/{ord_id}?top_n=Ntop_n adalah 20, dan itu opsional. Jika tidak ditentukan, itu default ke 20.POST /file?top_n=Ncurl -X POST -H "Content-Type: multipart/form-data" -F "file=@images/1.jpg" http://localhost:8001/file?top_n=10top_n tidak terbatas dalam hal ini, dan opsional. Jika tidak ditentukan, itu default ke 20. Untuk kinerja yang lebih baik, fungsi get_matches juga telah diimplementasikan dalam Rust , untuk mempercepat pencarian kesamaan.
similar_pictures berisi biner Rust dan perpustakaan untuk tujuan ini.
Koneksi ke Rust dari python dibuat di get_matches_rust.py , yang memperlihatkan antarmuka CLI yang sama dengan get_matches.py . Koneksi ini dimungkinkan oleh perpustakaan bersama Rust , yang berada di bawah similar_pictures/target/release/libsimilar_pictures.so .
Selain itu, biner Rust mandiri yang bertindak sebagai CLI dibuat, di bawah similar_pictures/target/release/similar_pictures . Bantuan CLI dapat dilihat dengan menjalankan ./similar_pictures/target/release/similar_pictures --help . Penggunaannya mirip dengan versi python .
Baik Perpustakaan Rust dan Binary menggunakan fungsi get_matches Common dari similar_pictures/src/get_matches.rs , yang melakukan tugas yang sama dengan versi python -nya. Untuk membangun biner dan perpustakaan karat untuk sistem operasi Anda, jalankan cargo build --release .
Pendekatan dengan memuat hash rata -rata ke dalam memori pada startup server untuk melayani permintaan lebih cepat juga direplikasi dalam Rust - di rust_http_server .
Ini berisi server (non -publik) dengan titik akhir yang sama dengan API python - satu -satunya perbedaan adalah bahwa ia tidak menerima objek file, ia perlu diberikan file_hash secara langsung.
Seharusnya tidak digunakan secara langsung, melainkan sebagai backend untuk API python . Koneksi sedang dibuat di rust_server.py .