Este proyecto se centra en crear un servicio que muestre imágenes ordinales similares.
Su UI está disponible en https://ordsimilarity.com/. La API (detalles a continuación) está disponible en https://api.ordsimilarity.com.
Las imágenes se clasifican utilizando el algoritmo average hash , que las convierte en una secuencia de bits de 0s y 1s. Luego se comparan usando la Hamming distance , que mide cuántos bits son comunes entre dos imágenes. Se puede encontrar una descripción detallada en este enlace.
Los hashes promedio de todos los ordenales se almacenan en un archivo JSON . Los datos de ejemplo se pueden ver en average_hash_example.json .
Nota: Usamos el archivo JSON en lugar de un "DB normal" porque debemos recorrer siempre todos los datos dentro, y resulta que es mucho más rápido cargar todos los datos del archivo JSON que de algunos DB como SQLITE3.
La función de procesamiento principal es get_matches_from_data en get_matches.py . Esta función itera a través de todos los hashes promedio dados y compara su similitud con el hash promedio calculado a partir de los datos proporcionados, ya sea una ID ordinal o el contenido de la imagen personalizada. Devuelve una lista de las ordinales más similares, ordenadas por su similitud.
get_matches.py también proporciona acceso CLI a la función. Consulte python get_matches.py --help para obtener más detalles.
La API se implementa en python utilizando el marco FastAPI . Al inicio, carga los hashes promedio del archivo JSON en la memoria. Luego, para cada solicitud, proporciona estos datos a la función get_matches_from_data mencionada anteriormente y recopila el resultado. Antes de devolver el resultado JSON al cliente, enriquece los datos de los ordinales similares con propiedades o enlaces útiles adicionales.
Nota: La API en realidad llama a la API Rust , que proporciona un rendimiento mucho mejor. Consulte la sección Rust server para obtener más detalles.
La API incluye múltiples puntos finales para búsquedas de similitud, que se definen en api.py :
GET /ord_id/{ord_id}?top_n=Ntop_n es 20, y es opcional. Si no se especifica, es predeterminado a 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 es ilimitado en este caso y es opcional. Si no se especifica, es predeterminado a 20. Para un rendimiento mejorado, la funcionalidad get_matches también se ha implementado en Rust , para acelerar la búsqueda de similitud.
similar_pictures contiene un binario y biblioteca Rust para este propósito.
La conexión con Rust de python se establece en get_matches_rust.py , que expone la misma interfaz CLI que get_matches.py . Esta conexión es posible por una biblioteca compartida Rust , que reside en similar_pictures/target/release/libsimilar_pictures.so .
Además, se crea un binario Rust independiente que actúa como CLI , bajo similar_pictures/target/release/similar_pictures . La ayuda CLI se puede ver ejecutando ./similar_pictures/target/release/similar_pictures --help . Su uso es similar a la versión python .
Tanto la biblioteca Rust como el binario utilizan la función común get_matches de similar_pictures/src/get_matches.rs , que realiza la misma tarea que su versión python . Para construir el binario y la biblioteca de óxido para su sistema operativo, ejecute cargo build --release .
El enfoque con la carga de los hashes promedio en la memoria en el inicio del servidor para servir a las solicitudes mucho más rápido también se replicó en Rust , en rust_http_server .
Contiene un servidor (no público) con puntos finales similares que la API python ; la única diferencia es que no acepta el objeto de archivo, debe recibir un archivo_hash directamente.
No debe usarse directamente, sino como un backend para la API python . La conexión se está estableciendo en rust_server.py .