Этот проект фокусируется на создании сервиса, которая отображает аналогичные порядковые изображения.
Его UI доступен по адресу https://ordsimilality.com/. API (подробности ниже) доступен по адресу https://api.ordsimilality.com.
Картинки классифицируются с использованием average hash , который преобразует их в битную последовательность 0s и 1s. Затем их сравнивают с использованием Hamming distance , которое измеряет, сколько бит распространено между двумя картинками. Подробное описание можно найти по этой ссылке.
Средние хэши всех ординалов хранятся в файле JSON . Пример данных можно увидеть в average_hash_example.json .
Примечание. Мы используем файл JSON вместо «нормального DB», потому что нам нужно всегда проходить через все данные внутри, и оказывается, что загружать все данные из файла JSON намного быстрее, чем из некоторых DB, таких как SQLite3.
Основная функция обработки - get_matches_from_data в get_matches.py . Эта функция итерация проходит через все данные средние хэши и сравнивает их сходство со средним хэшем, рассчитанным по предоставленным данным - либо порядковый идентификатор, либо пользовательское содержание изображения. Он возвращает список самых похожих ординал, отсортированных по их сходству.
get_matches.py также обеспечивает доступ CLI к функции. См. python get_matches.py --help для более подробной информации.
API реализован в python с использованием FastAPI Framework. При запуске он загружает средний хэши из файла JSON в память. Затем, для каждого запроса, он предоставляет эти данные для вышеупомянутой функции get_matches_from_data и собирает результат. Прежде чем вернуть результат JSON к клиенту, он обогащает аналогичные данные Ординал с дополнительными полезными свойствами или ссылками.
Примечание. API фактически называет API Rust , который обеспечивает гораздо лучшую производительность. Смотрите раздел Rust server для получения более подробной информации.
API включает в себя несколько конечных точек для поиска сходства, которые определены в api.py :
GET /ord_id/{ord_id}?top_n=Ntop_n составляет 20, и это необязательно. Если не указано, это по умолчанию до 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 не ограничен в этом случае и не является обязательным. Если не указано, это по умолчанию до 20. Для улучшения производительности функциональность get_matches также была реализована в Rust , чтобы ускорить поиск сходства.
similar_pictures содержит двоичный и библиотеку Rust и библиотеку для этой цели.
Подключение к Rust от python установлено в get_matches_rust.py , которая обнажает тот же интерфейс CLI , что и get_matches.py . Это соединение стало возможным благодаря библиотеке общей Rust , находящейся под similar_pictures/target/release/libsimilar_pictures.so .
Кроме того, создается автономная бинарная актерская игра Rust как CLI , под similar_pictures/target/release/similar_pictures . CLI HELP можно увидеть с помощью запуска ./similar_pictures/target/release/similar_pictures --help . Его использование похоже на версию python .
Как библиотека Rust , так и Binary используют функцию Common get_matches от similar_pictures/src/get_matches.rs , которая выполняет ту же задачу, что и ее версия python . Чтобы построить двоичный банар Rust и библиотеку для вашей операционной системы, запустите cargo build --release .
Подход с загрузкой среднего хэша в память при запуске сервера для обслуживания запросов гораздо быстрее был также воспроизведен в Rust - в rust_http_server .
Он содержит (непубличный) сервер с аналогичными конечными точками, как API python - единственное отличие состоит в том, что он не принимает файловый объект, ему необходимо предоставить файл_HASH напрямую.
Его не следует использовать напрямую, а скорее как бэкэнд для python API. Соединение устанавливается в rust_server.py .