Digikam 7.0发布了基于神经网络的人脸识别功能

2020-07-25 17:22:47

正好赶上节日气氛,我们今天很自豪地发布DigitalKam 7.0.0最终版。这个版本是一年前开始的长期开发的结果,在这个版本中,我们引入了新功能和大量修复程序。请查看下面列出的一些亮点,并详细了解所有的更改。

多年来,DIGITAL KAM提供了一个重要的功能,致力于检测和识别照片中的人脸。背景中使用的算法(不是基于深度学习)是旧的,自包含此功能的第一个版本(DIGHEMKAM 2.0.0)以来一直没有变化。它存在功能不够强大的问题,无法自动促进人脸管理工作流程。

到目前为止,分析图像内容以分离和标记人脸的复杂方法是使用OpenCV库中经典的基于特征的级联分类器来执行的。人脸检测可以给出80%的好结果,而分析也不算太差,但需要大量的用户反馈才能确认它检测到的是否是真正的人脸。此外,根据用户来自bugzilla的反馈,当涉及到自动标记机制时,人脸识别并没有为人们提供良好的体验。

在2017年夏天,我们指导了一位名叫刘英杰(音译)的学生,他致力于将神经网络整合到基于dlib库的人脸管理管道中。结果大多是示范性的,非常实验性,计算速度很慢。我们认为这是概念的非技术证明,但不能用于生产。解决问题的方法走错了方向,这就是为什么Face Management中的深度学习选项从未为用户激活的原因。

今年我们再次尝试,一个名叫Thanh Trung Dinh的新学生成功地完成了代码的完全重写。

这个项目的目标是摒弃所有旧的想法,将检测和识别引擎移植到更现代的深度学习方法中。新代码基于OpenCV库中最新的深度神经网络功能,使用带有专门用于面部管理的预先学习数据模型的神经网络。进行人脸检测和识别不需要学习阶段。我们节省了编码时间,运行速度,提高了成功率,达到了97%的真实位置。另一个优势是它能够检测到非人类的人脸,比如狗的人脸,就像你在这个屏幕截图中看到的那样。

但是人脸检测还有更多的改进。我们使用的神经网络模型确实是一个很好的模型,因为它可以检测模糊的人脸、被覆盖的人脸、人脸的轮廓、打印的人脸、转过身的人脸、部分人脸等。在大量集合上处理的结果给出了很好的结果,误报率很低。参见下面由神经网络执行的人脸检测挑战的示例。

识别工作流程仍然与以前的版本相同,但包括了相当多的改进。您需要教神经网络一些人脸,以便它自动识别集合中的这些人脸。用户必须用相同的人标记一些图像并运行识别过程。神经网络将解析已检测为未知的面孔,并将它们与已标记的面孔进行比较。如果识别出新项目,自动工作流将在缩略图周围用绿色边框突出显示新面孔,并将报告在脸部标签中注册了多少新用户。请参见下面在运行人脸识别过程时拍摄的屏幕截图。

只需标记一个人脸就可以开始识别,使用以前的算法至少需要6个项目才能获得结果。当然,如果已经标记了多个人脸,识别将有更多机会返回好的结果。关于深度学习识别的真正积极的评估非常出色,并且增加到95%,在最好的情况下,较旧的算法无法达到75%。识别还包括调整结果准确性的灵敏度/特异性设置,但我们建议您保留默认设置,开始使用您自己的收集来试验此功能。

性能比之前的版本更好,因为该实现支持多核来加速计算。我们还努力修复人脸管理管道中严重而复杂的内存泄漏。这次黑客攻击花了很多时间才完成,因为错误很难重现。你可以从这篇Bugzilla词条中读到长篇故事。通过解决此问题,我们可以关闭与Face Management相关的一长串较旧的报告。

为了完成他的项目,Thanh Trung Dinh在9月份在米兰举行的Akademy 2019上展示了新的深度学习面孔管理。演讲被录制下来,可以在这里看到。

尽管Thanh的项目已经完成,但整个故事还没有完成,重写面孔管理工作流程的第二阶段是一个持续的过程,今年夏天有两个新学生在做这项工作。

第一个项目由Kartik Ramesh管理,必须完全修复图形界面中的所有主要错误,并提高标记和管理面部的可用性。面部管理工作流程将进行以下更改:

拒绝面子建议:红色减号按钮拒绝面子建议。这是用户指示建议是一张脸的方式,但不是算法猜测的那张脸。这会将脸部移回未知状态。

忽略面孔:数字化Kam通常会检测到用户不希望被识别的面孔。有了这个新功能,用户可以通过在未知面孔上使用拒绝按钮来告诉算法忽略这些面孔。在识别过程中,不会考虑标记为“忽略”的人脸。

为人脸工作流提供帮助框:为了让新用户可以轻松使用人脸管理工作流,我们提供了一个帮助框来提供必要的信息。这可以通过单击人员侧栏中脸部设置面板中的问号图标进行访问

人名按重要性排序:在人脸识别过程中,算法会为不同的面孔建议名字。这些名称需要用户注意才能确认或拒绝这些建议。现在,重要的标记被固定在People侧边栏的顶部,并以粗体突出显示,而不是让用户搜索name标记。

自动分配脸部标签图标:为了使脸部工作流程更直观,已将自动图标分配添加到脸部标签中。选择用来代表特定人物的图标是用户确认的第一张脸。如果需要,用户仍然可以更改图标。您可以在下面看到一个屏幕截图,其中显示了标签图标和排序后的侧边栏。

按未确认面孔对脸部视图进行排序:为了避免面孔建议与已确认面孔混合出现,提供了一个新的排序角色,该角色将根据每个图像中未确认面孔的数量对图像进行排序。这导致人脸建议在开始时集体出现,随后是已经确认的人脸。此功能可通过查看->;排序项目->;按面排序访问。

按相似度分组:人脸识别过程的结果现在根据不同面孔之间的相似度分组在一起,这使得用户可以轻松地选择多个面孔,并同时确认或拒绝它们。

第二个项目由Minh Nghia Duong负责,旨在改善人脸识别所使用的神经网络引擎。人脸识别算法将有以下变化:

在对时间延迟错误的DNN人脸聚类算法进行性能测试后,我们决定改用DNN分类器方法。

新的人脸分类器:为了提高人脸引擎的人脸识别模块的处理时间和准确率,实现并测试了新的人脸分类器。对向量机分类器的支持带来了80%的准确率和82ms/Face的速度。每次向Face引擎添加新的面孔时,都会重新加载和重新训练该模型。

我们对K-近邻分类器进行了测试,该分类器的准确率为84%,速度为100ms/face.该模型采用KD-Tree结构进行管理,存储在机器内存中.。面的存储空间减少到1.5KB。

新的人脸嵌入数据库:Faces引擎现在支持RAM和数据库中的人脸分类器操作。根据用户的配置,面部识别可以在机器的内存中快速执行,每个人脸的存储空间约为1.5Kb,或者可以通过直接在数据库上进行K最近搜索,在不占用内存的情况下执行面部识别。我们根据Newface分类器算法对数据库模式进行升级,以存储人脸识别数据。

正如你所看到的,工作进展非常顺利,我们希望在今年夏天晚些时候发布新的代码,很可能是数字Kam 7.2.0的代码,届时所有的实现都将经过测试,并准备好投入生产。

DigitKam尝试支持数码相机提供的尽可能多格式的文件。对原始文件的支持是一个巨大的挑战。有些应用程序是专门为支持来自特定摄像头的RAW文件而创建的,因为这种支持复杂、时间长,而且很难随着时间的推移而维护。

RAW文件与JPEG图像不同。没有任何东西是标准化的,相机制造商可以自由地改变这些数字容器中的一切,而不需要记录下来。RAW文件允许相机制造商重新发明轮子和实现隐藏功能,高速缓存元数据,并需要一台功能强大的计算机来处理数据。

当您购买昂贵的相机时,您会希望提供的图像经过相机固件的认真预处理,并且可以立即使用。这适用于JPEG,但不适用于RAW文件。尽管JPEG并不完美,但它是一种标准化程度很高的格式,而且文档也很齐全。对于Raw来说,对于每个新的相机版本,格式可能会改变,因为它取决于相机的传感器数据,而相机的固件不一定会处理这些数据。这需要密集的逆向工程,而DigitKam团队并不总是能很好地支持这一点。这就是为什么我们使用强大的Libraw库对计算机上的原始文件进行后处理的原因。该库包括复杂的算法,以支持各种不同的原始文件格式。

在7.0.0版本中,我们使用libraw的新版本0.20,它引入了40多种新的RAW格式,特别是市场上最新的相机型号。该列表包括新的佳能CR3格式和索尼A7R4(61mpx!)。有关详细信息,请参阅以下列表:

佳能:PowerShot G5 X Mark II、G7 X Mark III、SX70 HS、EOS R、EOS RP、EOS 90D、EOS 250D、EOS M6 Mark II、EOS M50、EOS M200。

这个Libraw版本总共可以处理1100多种RAW格式。您可以通过帮助/支持的RAW相机对话框在DigitKam和Showfoto中找到完整的列表。我们要感谢Libraw团队共享和维护这个精彩的库。

从6.4.0版本开始,我们开始支持一种新的图像格式:HEIF。这个容器被苹果用来在iOS设备上存储照片,佳能也用来存储1DX Mark III相机的HDR图像。

HEIF是单个图像和图像序列的文件格式。它是由运动图像专家组(MPEG)开发的。MPEG小组声称,HEIF图像中可以存储的信息是相同大小的JPEG图像中的两倍,从而产生更好的图像质量。HEIF还支持动画,并且能够存储比动画GIF更多的信息,而GIF的大小只有GIF的一小部分。

HEIF中的压缩被委托给一个额外的编解码器,目前支持x265。该编解码器在编码小尺寸图像时具有出色的效果而不会丢失信息。还支持元数据、预览和颜色管理。

如果编译额外的编解码器的像素颜色深度大于8位,HEIF也可以支持HDR。在这种情况下,由于我们支持HDR已经有一段时间了,所以DIGHTALKAM可以存储和编辑图像而不会降低质量。

除了能够对HEIF图像内容进行解码或编码之外,另一个重要的点是使用从相机捕获的主镜头信息填充数据库。我们的目标是以后能够在搜索引擎中使用一些技术标准来查找海量集合中的项目。在这个新版本中,我们完全支持使用libheif共享库从HEIF中提取Exif、IPTC和XMP元数据。目前通过XMP SideCar支持HEIF元数据更改,因为目前还没有可用的写入支持。

未来的计划是支持复杂的HEIF结构作为图像序列和派生。libheif最近还引入了AVIF图像格式支持,这是另一个照片容器,所以diumitKam在下一个版本中也将继承这一特性。

在这个新版本中,我们在所有实现上都做了很多工作,以支持新的Qt框架版本。Qt5.15现在完全受支持,代码将大部分准备好编译,计划在年底推出下一个Qt6版本。

所有二进制包都已切换到最新的Qt 5.14.2LTS。在Linux和MacOS下,我们使用QtWebEngine代替QtWebKit来显示Web内容,比如来自云Web服务登录页面的内容,同时所有的捆绑包都切换到了最新的Kf5 5.70.0版本。这一主要升级包括来自KDE框架的大量修复,尤其是现在支持Gimp XCF文件格式>;=2.10的旧版本。

我们现在正式支持FlatPak Linux捆绑包,该捆绑包由KDE持续集成工作流使用来自GIT的最新实现每晚打包。这允许用户快速检查开发人员应用的最新更改。另一个版本仅通过FlatHub托管服务与官方稳定版本一起处理。

您可以使用Linux桌面安装程序(如等离子体的Discover或Gnome软件管理器)安装diumitKam Flatpak包。

最后,我们通过专用的持续集成工作流添加了对Microsoft Visual C++的支持,以便使用此编译器编译所有代码。

当然,我们继续支持Linux AppImage 64位和32位,Windows Installer 64位和32位,以及MacOS软件包,就像以前的数字化Kam版本一样。

一个新的工具ImageMosaicWall已经作为第三方插件被引入,它可以根据一系列其他照片创建图像。此工具包含在所有二进制包中。

关于元数据管理支持,我们添加了新的选项来将地理位置信息写入文件的元数据。此外,元数据高级设置面板还可以管理从中检索或存储颜色标签信息的位置。

我们改进了Windows端口,支持网络路径的通用命名约定和基于UTF-16的Unicode编码路径,这些都不同于Linux操作系统。

幻灯片放映工具现在被移植为一个数字Kam和Showfoto的插件,我们引入了一个新的设置来在无序模式下播放图像。幻灯片放映工具设置已从应用程序配置面板移至插件托管的对话框。这使您可以在工具工作时动态更改设置。

HTMLGallery插件引入了一个名为“Html5Responsive”的新主题。这个主题允许DIGHTKAM生成一个使用HTML5和CSS3响应的图片库(并且应该调整自身的大小以很好地显示在智能手机屏幕或台式电脑显示器上)。生成的页面使用UTF-8字符编码,因此非拉丁字符可以显示在照片标题中,依此类推。

该主题附带了各种视觉样式,这些样式使生成的图库页面具有非常不同的外观,如下所述。

基本款:简约的款式,没有华而不实的装饰。“抖动”模式对基本样式没有影响。请参阅此处的样例图库。

灯箱:这种风格给人一种在灯箱上观看摄影幻灯片的感觉,而摄影底片胶片则起到装饰的作用。“抖动”模式使幻灯片稍微旋转,给人一种忙碌的摄影师没有时间整齐地把幻灯片放到灯箱上的感觉。请参阅此处的示例库。

Feed:受社交媒体Feed的启发,该样式创建了带有日期和标题文本的图像缩略图的垂直栏。“抖动”目前对Feed样式没有影响。请参阅此处的示例库。

棕色卡片:以棕色卡片的旧相册为基础,配以照片边角和粗糙边的照片卡片。默认情况下,缩略图显示为深褐色色调,但“抖动”模式会使缩略图混合使用不同级别的深褐色和灰度。请参阅此处的示例库。

如您所见,DIGITAL Kam版本7.0.0有很多优点。这个版本中关闭的Bugzilla条目令人印象深刻,在一年的开发中关闭了750多个文件。我们以前从来没有达到过这个水平。

我们要感谢所有用户的支持和捐赠,以及所有允许我们改进和获得此版本的贡献者、学生和测试人员。

可以从此存储库中下载DIGITALKAM 7.0.0源代码tarball、Linux 32/64位AppImage捆绑包、macOSpackage和Windows 32/64位安装程序。