Este projeto se concentra na criação de um serviço que exibe imagens ordinais semelhantes.
Sua UI está disponível em https://ordsimilarity.com/. A API (detalhes abaixo) está disponível em https://api.ordsimilarity.com.
As imagens são classificadas usando o algoritmo average hash , que as converte em uma sequência de 0s e 1s. Eles são então comparados usando a Hamming distance , que mede quantos bits são comuns entre duas imagens. Uma descrição detalhada pode ser encontrada neste link.
Os hashes médios de todos os ordinais são armazenados em um arquivo JSON . Exemplo de dados podem ser vistos em average_hash_example.json .
Nota: Usamos o arquivo JSON em vez de um "banco de dados normal", porque precisamos sempre percorrer todos os dados dentro, e acontece que é muito mais rápido carregar todos os dados do arquivo JSON do que de algum banco de dados como o SQLITE3.
A principal função de processamento é get_matches_from_data em get_matches.py . Essa função itera através de todos os hashes médios fornecidos e compara sua semelhança com o hash médio calculado a partir dos dados fornecidos - um ID ordinal ou o conteúdo de imagem personalizado. Ele retorna uma lista dos ordinais mais semelhantes, classificados por sua semelhança.
get_matches.py também fornece acesso CLI à função. Consulte python get_matches.py --help para obter mais detalhes.
A API é implementada no python usando a estrutura FastAPI . Na startup, ele carrega os hashes médios do arquivo json na memória. Em seguida, para cada solicitação, ele fornece esses dados para a função get_matches_from_data acima mencionada e coleta o resultado. Antes de devolver o resultado do JSON ao cliente, ele enriquece os dados de ordinais similares com propriedades ou links úteis adicionais.
NOTA: A API realmente chama a API Rust , que fornece um desempenho muito melhor. Consulte a seção Rust server para obter mais detalhes.
A API inclui vários pontos de extremidade para pesquisas de similaridade, que são definidas na api.py :
GET /ord_id/{ord_id}?top_n=Ntop_n é 20 e é opcional. Se não for especificado, ele padrão é 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 é ilimitado neste caso e é opcional. Se não for especificado, ele padrão é 20. Para um desempenho aprimorado, a funcionalidade get_matches também foi implementada no Rust , para acelerar a pesquisa de similaridade.
similar_pictures contém um binário Rust e biblioteca para esse fim.
A conexão com Rust do python é estabelecida em get_matches_rust.py , que expõe a mesma interface CLI que get_matches.py . Essa conexão é possível por uma biblioteca compartilhada Rust , residindo em similar_pictures/target/release/libsimilar_pictures.so .
Além disso, uma atuação binária Rust independente como CLI é criada, em similar_pictures/target/release/similar_pictures . A ajuda CLI pode ser vista executando ./similar_pictures/target/release/similar_pictures --help . Seu uso é semelhante à versão python .
A biblioteca Rust e o binário utilizam a função get_matches COMMEL de similar_pictures/src/get_matches.rs , que executa a mesma tarefa que sua versão python . Para construir o binário de ferrugem e a biblioteca para o seu sistema operacional, execute cargo build --release .
A abordagem com o carregamento dos hashes médios na memória na inicialização do servidor para atender às solicitações muito mais rápido também foi replicada em Rust - em rust_http_server .
Ele contém um servidor (não público) com pontos de extremidade semelhantes à API python - a única diferença é que ele não aceita o objeto de arquivo, ele precisa receber um FILE_HASH diretamente.
Não deve ser usado diretamente, mas como um back -end para a API python . A conexão está sendo estabelecida em rust_server.py .