该项目着重于创建显示类似序数图片的服务。
它的UI可在https://ordsimilarity.com/上获得。 API (以下详细信息)可在https://api.ordsimilarity.com上找到。
图片使用average hash算法进行分类,该算法将它们转换为0s和1s的位序列。然后,使用Hamming distance比较它们,该距离衡量了两张图片之间常见的数量。可以在此链接上找到详细的描述。
所有序列的平均哈希都存储在JSON文件中。示例数据可以在average_hash_example.json中看到。
注意:我们使用JSON文件而不是“正常DB”,因为我们需要始终循环浏览内部所有数据,事实证明,加载JSON文件的所有数据要比SQLite3(例如SQLite3)要快得多。
主要的处理功能是get_matches_from_data in get_matches.py中。此函数通过所有给定的平均哈希进行迭代,并将它们的相似性与从提供的数据计算得出的平均哈希 - 序数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接口。 Rust共享库使此连接成为可能,该库属于similar_pictures/target/release/libsimilar_pictures.so 。
此外,在similar_pictures/target/release/similar_pictures下,独立的Rust二进制用作CLI 。 CLI帮助可以通过运行./similar_pictures/target/release/similar_pictures --help 。它的用法类似于python版本。
Rust库和二进制文件都从similar_pictures/src/get_matches.rs使用了Common get_matches函数,该功能执行与python版本相同的任务。要为您的操作系统构建生锈的二进制库和库,请运行cargo build --release 。
在Rust中,在rust_http_server中也复制了将普通哈希加载到服务器启动中以更快地服务请求的方法的方法。
它包含一台(非公共)服务器,其端点与python API相似 - 唯一的区别是它不接受文件对象,需要直接给出file_hash。
它不应直接使用,而应作为python API的后端。连接是在rust_server.py中建立的。