用于查找重复图像并删除不需要的图像的库
项目描述
py-image-dedup

py-image-dedup是一个用于在照片库中整理或删除重复图像的工具。与其他大多数解决方案不同,py-image-dedup故意使用近似图像比较来检测在分辨率、颜色或其他细微差别上略有差异的图像的重复项。
它是基于Image-Match构建的,这是一个用于计算图像的pHash并将其存储在用于非常高度可扩展性的ElasticSearch后端中的非常受欢迎的库。
工作原理
第一阶段 - 数据库清理
在第一阶段,将Elasticsearch后端与当前文件系统状态进行比较,清理不再存在的文件的数据库条目。这将加快稍后进行的查询。
第二阶段 - 计数文件
虽然对于去重过程不是必需的,但在去重过程进行时有一些进度指示器是非常方便的。为了能够提供这一点,必须事先计数可用的文件。
第三阶段 - 分析文件
在这个阶段,每个图像文件都会被分析。这意味着生成一个签名(pHash),以便快速与其他图像进行比较,并将图像的其他元数据添加到用于下一阶段的Elasticsearch后端。
这个阶段非常耗费CPU,第一次运行可能需要相当长的时间。建议尽可能多地使用线程(使用-t
参数)以获得最佳性能。
在分析给定的文件之前,我们可能已经在数据库中有一个该文件的早期版本,因此文件修改时间与给定的修改时间进行比较。如果数据库内容似乎仍然正确,则不会重新计算该文件的签名。因此,后续运行会快得多。但仍然需要发生一些文件访问,因此这可能会受到限制。
阶段 4 - 寻找重复项
现在将再次处理每个文件,但仅通过查询数据库后端以寻找相似图像(在给定的max_dist
范围内)。如果找到与相似度标准匹配的图像,则它们被视为重复候选。然后按照以下标准(按此顺序)对所有候选者进行排序
- 像素计数(越多越好)
- EXIF数据(EXIF数据越多越好)
- 文件大小(越大越好)
- 文件修改时间(越新越好)
- 距离(越低越好)
- 文件名包含"copy"(False更好)
- 文件名长度(越长越好)-(对于"编辑"版本)
- 父文件夹路径长度(越短越好)
- 得分(越高越好)
结果列表中的第一个候选者被认为是所有候选者中最佳的可供版本。
阶段 5 - 移动/删除重复项
现在将从文件系统中删除上阶段识别出的重复候选者的所有版本(除非您指定了--dry-run
)。
如果设置了duplicates_target_directory
,则将使用指定的文件夹作为根目录将重复项移动到,而不是删除它们,复制其原始文件夹结构。
阶段 6 - 删除空文件夹(可选)
在最后阶段,由于去重过程而变为空的文件夹将被删除,清理目录结构(如果配置中开启)。
如何使用
安装
使用pip安装py-image-dedup
pip3 install py-image-dedup
配置
py-image-dedup
使用container-app-conf来提供配置,通过YAML文件以及启动时生成的ENV变量,从而提供配置。请参阅有关该文档的说明
请参阅此存储库中的示例py_image_dedup_reference.yaml。
设置elasticsearch后端
由于这个库基于Image-Match,因此您需要一个运行的elasticsearch实例来高效地存储和查询图像签名。
Elasticsearch版本
此库需要elasticsearch版本5或更高版本。遗憾的是,Image-Match库仍然指定版本2,因此使用原始项目的分支。此分支由我维护,任何贡献都将非常欢迎。
设置索引
py-image-dedup
使用单个索引(默认情况下称为images
)。配置后,此索引将自动为您创建。
命令行使用
py-image-dedup
可以从命令行这样使用
py-image-dedup deduplicate --help
查看帮助输出以了解如何进行自定义。
守护进程
注意!此功能仍在开发中。请始终对数据进行备份!
py-image-dedup
有一个内置的守护进程,允许您持续监视源目录并在运行时进行去重。
当运行守护进程(并在配置中启用)时,会使用Prometheus报告器来允许您收集一些统计数据洞察。
py-image-dedup daemon
模拟运行
为了分析图像并获得要删除的图像的概述,请务必先进行模拟运行。
py-image-dedup deduplicate --dry-run
FreeBSD
如果您想在FreeBSD主机上运行此程序,请确保您有一个最新的版本,能够安装ports。
由于Image-Match需要进行大量数学运算,它依赖于numpy
和scipy
。为了在FreeBSD上运行它们,您必须将它们作为ports安装
pkg install pkgconf
pkg install py38-numpy
pkg install py27-scipy
为了支持.png
,您还需要安装
pkg install png
尽管安装了所有这些,只是将这两者混合在一起后,它才最终运行成功
pkg install freetype
pkg install py27-matplotlib # this has a LOT of dependencies
编码问题
在FreeBSD上使用Python库click
时,您可能会遇到编码问题。为了减轻这种情况,如果可能,将您的区域设置从ANSII
更改为UTF-8
。
例如,可以通过创建一个包含以下内容的文件~/.login_conf
来实现
me:\
:charset=ISO-8859-1:\
:lang=de_DE.UTF-8:
Docker
要使用Docker运行py-image-dedup
,您可以使用DockerHub上的markusressel/py-image-dedup镜像
sudo docker run -t \
-p 8000:8000 \
-v /where/the/original/photolibrary/is/located:/data/in \
-v /where/duplicates/should/be/moved/to:/data/out \
-e PY_IMAGE_DEDUP_DRY_RUN=False \
-e PY_IMAGE_DEDUP_ANALYSIS_SOURCE_DIRECTORIES=/data/in/ \
-e PY_IMAGE_DEDUP_ANALYSIS_RECURSIVE=True \
-e PY_IMAGE_DEDUP_ANALYSIS_ACROSS_DIRS=True \
-e PY_IMAGE_DEDUP_ANALYSIS_FILE_EXTENSIONS=.png,.jpg,.jpeg \
-e PY_IMAGE_DEDUP_ANALYSIS_THREADS=8 \
-e PY_IMAGE_DEDUP_ANALYSIS_USE_EXIF_DATA=True \
-e PY_IMAGE_DEDUP_DEDUPLICATION_DUPLICATES_TARGET_DIRECTORY=/data/out/ \
-e PY_IMAGE_DEDUP_ELASTICSEARCH_AUTO_CREATE_INDEX=True \
-e PY_IMAGE_DEDUP_ELASTICSEARCH_HOST=elasticsearch \
-e PY_IMAGE_DEDUP_ELASTICSEARCH_PORT=9200 \
-e PY_IMAGE_DEDUP_ELASTICSEARCH_INDEX=images \
-e PY_IMAGE_DEDUP_ELASTICSEARCH_AUTO_CREATE_INDEX=True \
-e PY_IMAGE_DEDUP_ELASTICSEARCH_MAX_DISTANCE=0.1 \
-e PY_IMAGE_DEDUP_REMOVE_EMPTY_FOLDERS=False \
-e PY_IMAGE_DEDUP_STATS_ENABLED=True \
-e PY_IMAGE_DEDUP_STATS_PORT=8000 \
markusressel/py-image-dedup:latest
由于还需要Elasticsearch实例,您还可以使用此存储库中包含的docker-compose.yml
文件,该文件还将设置单个节点的Elasticsearch集群
sudo docker-compose up
UID和GID
要使用特定的用户ID和组ID在容器中运行py-image-dedup
,您可以使用环境变量PUID=1000
和PGID=1000
。
贡献
GitHub是用于社交编码的地方:如果您想编写代码,我鼓励通过从这个存储库的分支中发起pull request的方式进行贡献。为错误和新的功能创建GitHub票据,并评论您感兴趣的内容。
许可证
py-image-dedup by Markus Ressel
Copyright (C) 2018 Markus Ressel
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://gnu.ac.cn/licenses/>.
项目详情
下载文件
下载适合您平台的应用程序。如果您不确定选择哪个,请了解更多关于安装包的信息。
源分布
构建分布
py-image-dedup-2.0.0.tar.gz的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | b924050b977ed7d8040fe3e0914abbed2b50cd44cb2f3bc0aca2b45bf3622cfc |
|
MD5 | 51199b317d835b576267182b4af71612 |
|
BLAKE2b-256 | b89bb6c959cf5b628e901eefb92941d00adca65dba2d648b2c935eb268c9d244 |
py_image_dedup-2.0.0-py3-none-any.whl的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 0ea1cf2e0d92b15f2dfb139fb9bcd9add4d7a67728a4204890a3b2284107121f |
|
MD5 | 3ce2953af909daf3bfa89abf10f62464 |
|
BLAKE2b-256 | f54d7af469c2978b030c66d226e02a0ec065081fc13e45d0643f177e7828ee01 |