跳转到主要内容

用于查找重复图像并删除不需要的图像的库

项目描述

py-image-dedup Build Status PyPI version

py-image-dedup是一个用于在照片库中整理或删除重复图像的工具。与其他大多数解决方案不同,py-image-dedup故意使用近似图像比较来检测在分辨率、颜色或其他细微差别上略有差异的图像的重复项。

它是基于Image-Match构建的,这是一个用于计算图像的pHash并将其存储在用于非常高度可扩展性的ElasticSearch后端中的非常受欢迎的库。

asciicast

工作原理

第一阶段 - 数据库清理

在第一阶段,将Elasticsearch后端与当前文件系统状态进行比较,清理不再存在的文件的数据库条目。这将加快稍后进行的查询。

第二阶段 - 计数文件

虽然对于去重过程不是必需的,但在去重过程进行时有一些进度指示器是非常方便的。为了能够提供这一点,必须事先计数可用的文件。

第三阶段 - 分析文件

在这个阶段,每个图像文件都会被分析。这意味着生成一个签名(pHash),以便快速与其他图像进行比较,并将图像的其他元数据添加到用于下一阶段的Elasticsearch后端。

这个阶段非常耗费CPU,第一次运行可能需要相当长的时间。建议尽可能多地使用线程(使用-t参数)以获得最佳性能。

在分析给定的文件之前,我们可能已经在数据库中有一个该文件的早期版本,因此文件修改时间与给定的修改时间进行比较。如果数据库内容似乎仍然正确,则不会重新计算该文件的签名。因此,后续运行会快得多。但仍然需要发生一些文件访问,因此这可能会受到限制。

阶段 4 - 寻找重复项

现在将再次处理每个文件,但仅通过查询数据库后端以寻找相似图像(在给定的max_dist范围内)。如果找到与相似度标准匹配的图像,则它们被视为重复候选。然后按照以下标准(按此顺序)对所有候选者进行排序

  1. 像素计数(越多越好)
  2. EXIF数据(EXIF数据越多越好)
  3. 文件大小(越大越好)
  4. 文件修改时间(越新越好)
  5. 距离(越低越好)
  6. 文件名包含"copy"(False更好)
  7. 文件名长度(越长越好)-(对于"编辑"版本)
  8. 父文件夹路径长度(越短越好)
  9. 得分(越高越好)

结果列表中的第一个候选者被认为是所有候选者中最佳的可供版本。

阶段 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需要进行大量数学运算,它依赖于numpyscipy。为了在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=1000PGID=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 (44.1 kB 查看哈希)

上传时间

构建分布

py_image_dedup-2.0.0-py3-none-any.whl (43.2 kB 查看哈希)

上传时间 Python 3

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面