이 프로젝트는 비슷한 서수 사진을 표시하는 서비스를 만드는 데 중점을 둡니다.
UI 는 https://ordsimilarity.com/에서 제공됩니다. API (아래 세부 사항)는 https://api.ordsimilarity.com에서 제공됩니다.
그림은 average hash 알고리즘을 사용하여 분류되며, 이는 비트 시퀀스 0과 1s로 변환합니다. 그런 다음 Hamming distance 사용하여 비교하여 두 그림 사이에 몇 비트가 공통적인지 측정합니다. 자세한 설명은이 링크에서 찾을 수 있습니다.
모든 조례의 평균 해시는 JSON 파일에 저장됩니다. 예제 데이터는 average_hash_example.json 에서 볼 수 있습니다.
참고 : "일반 DB"대신 JSON 파일을 사용합니다. 왜냐하면 항상 모든 데이터를 반복해야하므로 SQLITE3과 같은 일부 DB보다 JSON 파일의 모든 데이터를로드하는 것이 훨씬 빠릅니다.
기본 처리 기능은 get_matches.py 의 get_matches_from_data 입니다. 이 기능은 주어진 모든 평균 해시를 반복하고 제공된 데이터에서 계산 된 평균 해시 (서수 ID 또는 사용자 정의 사진 내용)와 유사성을 비교합니다. 유사성으로 정렬 된 가장 유사한 조례 목록을 반환합니다.
get_matches.py 도 기능에 대한 CLI 액세스를 제공합니다. 자세한 내용은 python get_matches.py --help 참조하십시오.
API는 FastAPI 프레임 워크를 사용하여 python 에서 구현됩니다. 시작시 JSON 파일에서 평균 해시를 메모리에로드합니다. 그런 다음 각 요청에 대해 위에서 언급 한 get_matches_from_data 함수 에이 데이터를 제공하고 결과를 수집합니다. JSON 결과를 클라이언트에게 반환하기 전에 유용한 유용한 속성 또는 링크가있는 유사한 조례 데이터를 풍부하게합니다.
참고 : API는 실제로 Rust API를 호출하여 훨씬 더 나은 성능을 제공합니다. 자세한 내용은 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 바이너리와 라이브러리가 포함되어 있습니다.
python 의 Rust 에 대한 연결은 get_matches_rust.py 에서 설정되어 get_matches.py 와 동일한 CLI 인터페이스를 노출시킵니다. 이 연결은 similar_pictures/target/release/libsimilar_pictures.so 에있는 Rust 공유 라이브러리에 의해 가능합니다.
또한 similar_pictures/target/release/similar_pictures 에서 CLI 로 작용하는 독립형 Rust 바이너리가 생성됩니다. CLI 도움말은 ./similar_pictures/target/release/similar_pictures --help 실행하여 볼 수 있습니다. 사용법은 python 버전과 유사합니다.
Rust Library와 Binary는 모두 python 버전과 similar_pictures/src/get_matches.rs 작업을 수행하는 유사한 get_matches 기능을 사용합니다. 운영 체제를위한 Rust Binary 및 Library를 구축하려면 cargo build --release 실행하십시오.
서버 스타트 업에서 평균 해시를 메모리에로드하여 요청을 훨씬 빠르게 제공하는 접근 방식도 rust_http_server 에서 Rust 에서 복제되었습니다.
python API와 유사한 엔드 포인트가있는 (비공개) 서버가 포함되어 있습니다. 유일한 차이점은 파일 개체를 허용하지 않으며 File_hash를 직접 제공해야한다는 것입니다.
직접 사용해서는 안되는 것이 아니라 python API의 백엔드로 사용해야합니다. 연결은 rust_server.py 에서 설정되고 있습니다.