群晖7.0系统中的Synology Photos支持人脸识别的补丁

由 jinlife 发布

群晖6.x系统中主要是用Moments来管理相册,之前有个用老版本的Moments来做补丁,可以让群晖支持人脸识别。其实这个有点风险,如果Moments升级多了,可能这个补丁就不好用了而导致程序调用出错。

群晖7.0以上系统新出现的Synology Photos出来后,这个补丁就不起作用了。一方面用的老Moments的so库文件,本来就是碰运气能用。另外一方面,Synology Photos是另外一种软件了,代码和库都有些不一样了。

经过研究,Synology Photos应该使用了OpenCv的DNN神经网络来识别人脸。这个OpenCv库可根据群晖的型号调用不同的神经网络模型,并调用显卡的GPU来加速计算。如果硬件和库代码不匹配,那就无法人脸识别了。所以人脸识别主要是显卡的GPU调用的问题,跟洗白没关系。技术上可以打个补丁解决。

这里的补丁主要是针对黑群晖的,白群晖厂家已经做好了适配,对应的CPU和GPU运行都没问题。如果无法人脸识别,那是Photos套件自身有Bug,等着Photos出新版本修复即可。黑裙由于建于虚拟机或者直接硬件运行群晖,使用的CPU和GPU都不一定是官方群晖用过的,比较容易出问题。 其实神经网络对CPU的兼容性比较高,不容易兼容的是显卡的GPU。

工具

  1. IDA Pro 破解工具

    • 之前提供的地址挂了,这个东西也是个破解版,有需要自行搜索下载吧。

Unraid虚拟机教程

  1. Unraid上如何建虚拟机并启用人脸识别

建议

以下是说明的打补丁的技术过程,如果没兴趣可以直接去文章最下面的下载地址下载。
个人建议没特殊需要的话,可以装DS3615xs的群晖,对GPU没要求,不用打如下补丁,可以直接人脸识别。
除非特别想用DS918+的系统,那显卡能支持,已经有人脸识别的话,也不用打补丁。
此补丁主要是为了用了DS918+的系统,显卡又不支持,而没有人脸识别的用户。
如果Synlology Photos升级,版本更新了,补丁可能会失效,需要重新破解。 所以为了省事,最好用DS3615xs,或者能够让显卡支持人脸识别。

提示:

用虚拟机装群晖,最少分4个CPU核心给群晖,在群晖里面要能看到4个核心。如果CPU核心没分够,这个人脸识别的代码库也容易出问题。

获取需修改破解的文件

  1. 装好群晖7.0以上系统。
  2. 装好Synology Photos套件
  3. 在群晖控制面版开启SSH访问。
  4. 使用如下步骤将文件拷贝出来。
  5. 拷贝出来的文件出现在群晖的Homes目录的home目录下,群晖文件浏览器可以直接看到,看到后下载到本地用IDA分析。

a. Win10电脑,打开命令行,输入 ssh [email protected]
其中 jinlife是群晖的管理员,后面的ip是群晖的地址。输入密码登录群晖SSH。 第一次登录需要输入一个yes。
b. 登陆后继续输入 sudo -i 并再次输入密码进入管理员权限。
c. 输入如下命令将 libsynophoto-plugin-model.so 拷贝到homes的jinlife目录下。

cp /var/packages/SynologyPhotos/target/usr/lib/libsynophoto-plugin-model.so /volume1/homes/jinlife/

破解Synology Photos,让其不调用GPU显卡,只用CPU

用IDA打开libsynophoto-plugin-model.so, 自动分析完后打开输出函数页面 Exports
找到 __int64 __fastcall synophoto::plugin::network::IeNetwork::IsSupported(synophoto::plugin::network::IeNetwork *this)
Exports_1.png

双击这个函数,进入IDA View,按F5键生成伪代码。进入函数后,找到返回值为1的地方,都改成返回为0. 即强制让所有调用GPU是不是支持的地方都回复不支持。
Function1To0_2.png

这里将v8都赋值为0即可。改的时候需要进入 Hex View,右键有个同步选项,将Hex View和伪代码Pseudocode窗口Sync同步。再进入伪代码选择V8=1的地方,点开HexView就可以看到BB 01 00 00 00的代码了。把这个01改成00即可。 两个v8赋值成1的地方都要改。
ChangeByte_3.png

只有两个字节要改。
PatchedByte_4.png

改完后,使用IDA的Apply Patch功能,生成破解文件。 保存的时候记得勾上生成备份文件bak。
ApplyPatch_5.png

至此,已经生成了无视GPU的Photos补丁文件。DS918+和DS3615xs一样都不需要GPU就可以人脸识别了。
用群晖的文件浏览器将补丁 libsynophoto-plugin-model.so 拷贝回群晖的homes的jinlife目录。覆盖之前的文件。

如果之前ssh没退出,继续用。退出了就再次登录到管理员权限下。
使用如下的命令将补丁覆盖回原始位置。

cp /volume1/homes/jinlife/libsynophoto-plugin-model.so /var/packages/SynologyPhotos/target/usr/lib/ 

拷贝完后,重启一下Synology Photos套件。 或者重启群晖也行。
再次备份照片看看情况,正常需要等待一段时间,建议去喝杯茶,群晖需要索引照片后,人脸识别才能正常运行完毕。

补丁下载地址

https://github.com/jinlife/Synology_Photos_Face_Patch/releases
Github认为Readme里面的链接到这个博客是在打广告,没啥征兆就封掉账号了。还真没想到是这个原因,Github太牛了。我只是放了个双向链接,一个是代码库,一个是技术文档,互相引用。结果是打广告。就这小技术博客能有啥广告,都是免费分享的东西,玩玩而已。看来Github不是啥稳定放代码的地方,不靠谱,动不动就封号,这也太不保险了,还是自建的Git库靠谱。最近查了下Github,因为美国制裁还封掉过伊朗的所有个人账号。。。这是个开源的地方吗,太政治了。国内建gitee还是有必要的,有代码还是得多处备份,只放Github的风险太高了。
经过跟Github的Support沟通,终于要回账号了,这帮人瞎搞,没啥正当理由继续封账号,应该是机器人出错了,乱封的账号。这跟杀毒软件误杀似得,做机器人的水平也一般啊,还直接用封账号的方式处理,真不靠谱。

放个执行文件在这,有需求自己patch吧。

链接: https://pan.baidu.com/s/1sjeAbWxNAsc49CODE-31Mw?pwd=d97s
把这个文件用FileStation上传到群晖,在ssh界面用chmod +x PatchELFSharp 加上执行权限,然后运行如下命令即可。可以做成任务计划,升级了Photos之后,运行一下计划就行了。

./PatchELFSharp "/var/packages/SynologyPhotos/target/usr/lib/libsynophoto-plugin-model.so" "_ZN9synophoto6plugin7network9IeNetwork11IsSupportedEv" "B8 00 00 00 00 C3"

从V1.6.0-0629版本开始,群晖把相关代码移到 libsynophoto-plugin-platform.so 文件里面去了,需要用下面的命令改这个文件。之前的文件libsynophoto-plugin-model.so已经没有相关代码了。

# support face and concept
./PatchELFSharp "/var/packages/SynologyPhotos/target/usr/lib/libsynophoto-plugin-platform.so" "_ZN9synophoto6plugin8platform20IsSupportedIENetworkEv" "B8 00 00 00 00 C3"
# force to support concept
./PatchELFSharp "/var/packages/SynologyPhotos/target/usr/lib/libsynophoto-plugin-platform.so" "_ZN9synophoto6plugin8platform18IsSupportedConceptEv" "B8 01 00 00 00 C3"
# force no Gpu
./PatchELFSharp "/var/packages/SynologyPhotos/target/usr/lib/libsynophoto-plugin-platform.so" "_ZN9synophoto6plugin8platform23IsSupportedIENetworkGpuEv" "B8 00 00 00 00 C3"

libsynosdk.so.7 支持NFS和CIFS远程目录。VideoStation或AudioStation可用。

./PatchELFSharp "/usr/lib/libsynosdk.so.7" "SYNOFSIsRemoteFS" "B8 00 00 00 00 C3"
本文作者:jinlife
本文链接:群晖7.0系统中的Synology Photos支持人脸识别的补丁 - https://blog.jinlife.com/index.php/archives/49/
版权声明:本博客内容遵守 “署名-非商业性使用-禁止演绎 4.0 国际”协议(CC BY-NC-ND 4.0),除特别说明外内容皆为原创,可以自由转载与传播,但请署名及注明文章出处。

126 条评论

  1. Gosh
    Gosh · 2022-10-16 02:33

    大佬您好,Synology drive使用挂载的文件夹无法创建文件夹 请问能去一下限制吗? 万谢

    1. jinlife
      jinlife · 2022-10-16 09:55 作者

      这个貌似是权限问题。
      如果是NFS挂载远程目录,挂载权限需要映射好。 先试试CIFS共享目录挂载看看,如果CIFS也不行,那就是群晖内部的权限控制了。这个目前没找到办法弄,跟Photos里面家目录的权限一样比较复杂。

      1. Gosh
        Gosh · 2022-10-18 02:39

        是CIFS的,权限全开了,除了这个其他都拜读您的文章完美解决了。

  2. Martin
    Martin · 2022-11-06 17:01

    大佬,请教下,unraid 6.10.2 安装的 7.1-42661 3617xs,人脸识别是可以用的,还有必要去path这个补丁吗,谢谢!

    1. jinlife
      jinlife · 2022-11-08 16:37 作者

      都已经可以用了,当然不用patch了。

  3. 涉世未深的小白
    涉世未深的小白 · 2022-11-28 13:54

    大佬你好 想问下黑裙7.1 N5095打完人脸补丁后 硬盘导入照片视频 (多数为IOS备份的)人脸识别一直卡在还有一个照照片待发现

    1. jinlife
      jinlife · 2022-12-02 20:44 作者

      可能是别的原因,可以试试在Photos里面上传10来张照片看看情况。

  4. 超级小可爱
    超级小可爱 · 2023-01-13 16:23

    大佬有个小问题,使用了libsynosdk.so.7挂载的NFS和CIFS远程目录,jellyfin和NAStools能够识别了但是fellyfin实时刷新影视库会失效,需要手动刷新。nastools目录同步 也不能自动同步,需要手动运行。 这是什么原因呢?

    1. jinlife
      jinlife · 2023-02-06 12:35 作者

      这个我没碰到过,我这边用VideoStation,自己写了个脚本定时去索引目录是OK的。
      你这个情况建议改改目录的权限,或者可能要写脚本去索引目录。

      1. rxmn
        rxmn · 2023-05-04 13:52

        请教一下,索引目录的脚本怎么写,或者网上搜索什么关键字可以找到教程?

  5. yanyisio
    yanyisio · 2023-02-04 13:36

    大佬您好!想问一下,我有独立显卡,显卡是 telsa P4 ,如何做才能让photos调用独立显卡呢? 系统是 7.1.1 42962 U3

    1. jinlife
      jinlife · 2023-02-06 12:42 作者

      你这个首先的群辉里面得有 telsa P4的显卡驱动才行。可以试试,如果驱动不了就是没驱动了。另外,我们只能极其微小的改一下群辉的文件,群辉自身硬件没这个显卡,如果系统和软件不支持,能不能用也是个问题。
      建议最好还是往群辉的原生硬件靠近,用 J4125,intel的6到8代的CPU,能用核显,问题少点。群辉系统太老,都不能正常支持比较新的CPU。

  6. zid
    zid · 2023-02-17 16:41

    感谢大佬,请问用PVE装DS3615xs和DS3617xs、DS3622xs有什么区别吗?这几个都没有GPU,是不是说都可以用。物理机CPU是5代酷睿i5,多谢

    1. jinlife
      jinlife · 2023-02-20 09:05 作者

      这些系统都可以用,补丁都不用打,具体看别的需求吧。

  7. 大雄
    大雄 · 2023-03-08 15:32

    大佬牛逼啊,用这个方法确实可以识别到了照片了,但是有一个问题就是在照片套件里面删除了图片的话,挂载目录里面删除不了,请问这个请怎么搞.

    1. jinlife
      jinlife · 2023-03-31 17:48 作者

      这个没办法,权限问题。
      或者不要用家目录,用DS File上传的photo目录。

  8. chen
    chen · 2023-04-27 10:06

    大佬,我这边用虚拟机配置也够,按前面教程修改后索引照片,开始CPU占用20-30,十几分钟后感觉就停止了 CPU占用上不去了最后也不能识别人物,想问下人物识别的日志在那个路径,我找来看看是什么原因停止的。感谢!

    1. chen
      chen · 2023-04-27 10:10

      虚拟机I5-6500,给了4核心4G内存,photo目录下面建了子目录 使用NFS挂载到子目录的。

      1. jinlife
        jinlife · 2023-04-28 18:41 作者

        看起来像NFS挂载的权限问题。你先用群晖本地目录上传几个图片看看情况吧。
        六代的CPU默认支持GPU解码,貌似不需要打补丁就能直接用。

  9. chen
    chen · 2023-05-25 16:59

    测了下非nfs存储目录的照片也不行

  10. pkids
    pkids · 2023-06-14 09:12

    大佬请教下,群晖的Synology photo已经打了人脸识别补丁,能识别homes/user/文件夹里的照片。

    但是我做了细分,分别把照片存到了homes/user/我 homes/user/家人 homes/user/宠物 这几个文件夹里。

    刚才试了下,自拍了2张,一张存在“homes/user/”目录里,一张存在“homes/user/我/”目录里,只能识别第一张(根目录那张),这个能怎么修改,让Synology photo识别homes下面所有子文件夹的图吗?

    1. jinlife
      jinlife · 2023-06-25 18:02 作者

      这个没碰到过,可以重新索引一下看看。
      也有可能是权限问题。

  11. skill7899
    skill7899 · 2023-06-28 19:39

    可以让sa6400有核显的时候,修改photos调用核显做人脸吗?

    1. jinlife
      jinlife · 2023-07-02 19:47 作者

      硬解后不能核显人脸吗? 这个是系统的问题。
      CPU足够人脸识别了,就Photos这点一次性的计算量,用核显也没啥用。而且集成在CPU里面的核显,只能加快一点点计算而已,效果一般般。这个核显或CPU,对于人脸识别的结果没什么区别,区别只是计算得稍微快一点。没什么人用核显做机器学习的研究的,除非用英伟达之类的专业显卡,才会快很多。不过再快也就一次性。有钱的用高级显卡做NAS的人才有用,这种几百瓦的显卡,24小时运行,电费杠杠滴,这种人估计很少。

  12. moments
    moments · 2023-08-31 11:05

    video和音乐支持nfs smb了,能否让moments也支持,最喜欢moments这个相册了,7.0相册砍了好多功能,ui也不好看,我在虚拟机安装的,文件我想全部放在win来管理,能支持moments识别 smb和nfs就好了

    1. jinlife
      jinlife · 2023-09-03 09:38 作者

      moments是改libsynosdk.so.6文件,同样的改法就行。不过Moments跟Photos一样,权限管理比较复杂,改了有一堆问题,特别是无法删文件。不推荐用这个办法。

  13. 普通青年
    普通青年 · 2023-10-20 11:20

    大佬你好~,
    我用了补丁后人脸识别从1万多张开始最后卡在了5868张不动了,好几天了,可以指导一下这个要怎么处理吗?

    1. 普通青年
      普通青年 · 2023-10-20 11:23

      系统版本是DSM 7.2.1-69057 Update 1
      synology Photos版本是1.6.0-0629
      黑群晖 DS920+ 虚拟机给了4核心4G内存

      1. jinlife
        jinlife · 2023-10-22 18:42 作者

        这个估计图片多了,群晖自身出问题了。只能多试几次了。或者降级到1.5版本再试试。

        1. 普通青年
          普通青年 · 2023-10-23 21:56

          多谢大佬指导,降级到1.5版本好了。

    2. 大好河山
      大好河山 · 2023-10-26 20:01

      我的情况跟这个类似。6W张照片慢慢识别到剩下15000张然后数字不减少了。反复重建索引也不行。

      1. jinlife
        jinlife · 2023-10-29 20:51 作者

        群晖的Photos V1.6.0版本改动比较大,目前看来不是个稳定的版本。建议降级到1.5用着先,等1.6迭代几次之后估计才会稳定一点。

  14. jeff
    jeff · 2023-10-21 08:39

    7.2正常升级到7.2.1怎么又要人脸重新识别迁移啊。这个有规律么
    正在等待人脸识别结果迁移 ,CPU计算好慢啊,又要跑几天

    1. jeff
      jeff · 2023-10-21 08:40

      或者正好升级photos1.6 的原因?

      1. jinlife
        jinlife · 2023-10-22 18:43 作者

        升级系统或者重装photos都有可能导致之前的数据库丢失的,这样只能重新识别了。

  15. vogala
    vogala · 2023-11-04 20:38

    今天升级了1.6.1-0141,升级后个人相册不显示了,只有新传的照片能识别并显示,有救吗,大佬?

    1. vogala
      vogala · 2023-11-04 20:43

      重新索引后也只有新上传的,之前的都不见了

      1. jinlife
        jinlife · 2023-11-06 18:48 作者

        重新索引也不管用,卸载重装看看。

  16. kasimu
    kasimu · 2023-11-20 18:17

    博主你好,请问i5 8600T安装DS920+ 开启人脸识别CPU占用率很高是怎么回事? 核显已经驱动的。

    1. jinlife
      jinlife · 2023-12-13 18:18 作者

      这个问题我可能也不知道咋回事,8600T不需要补丁的,原生支持群晖的功能。

  17. seven7th
    seven7th · 2023-12-13 03:37

    大佬,1.6.1-0641 按照您的github上的方法替换了两个SO文件,都还是不行,是什么状况?
    蜗牛星际的J1900 电子垃圾黑裙

    1. seven7th
      seven7th · 2023-12-13 03:40

      另外部分论坛引用了您的代码,他仅更换 1.0.so的那个文件,两个SO文件有什么不同呢

      1. jinlife
        jinlife · 2023-12-13 18:20 作者

        这个有人说是链接文件,不过我这边改so也能用,全部替换应该没问题的。可能是替换过程出了问题。
        可以在目录下用 ll 命令看看文件是不是真的修改了,可以看到修改日期的。

  18. huangda1982
    huangda1982 · 2023-12-13 12:17

    您好。
    用PatchELFSharp的时候出现了“failed to find function _ZN9synophoto6plugin7network9IeNetwork11IsSupportedEv”,请问怎么办?

    另外,photos如何降级到1.5?

    1. jinlife
      jinlife · 2023-12-13 18:28 作者

      上面的命令适合1.5版本之前的,1.6开始是改别的文件了。 我更新在上面了。
      装1.5 需要卸载掉当前的photos,然后到群晖下载1.5的spk安装包,上传安装就行了。
      https://archive.synology.com/download/Package/SynologyPhotos

  19. oaksharks
    oaksharks · 2023-12-24 19:13

    sa6400,N100 处理器,可以硬解。 今天把photo重装升级到 1.6.1-0141 人脸识别失效了,之前是可以用的。

    一个负责迁移的systemd unit 的日志里有 Dependency Failed , 降级回去也不好使了。

    1. jinlife
      jinlife · 2023-12-25 16:32 作者

      你用了SA6400,有比较新的kernel,装了最新的GPU驱动吗,N100如果用GPU能驱动,能硬解和人脸识别,那应该用什么版本都没区别,也不用打补丁。
      如果驱动不管用,并且打了我这的人脸补丁,那就跟系统没关系了,注意1.5和1.6修改的文件不一样了,别打错补丁了。

      1. oaksharks
        oaksharks · 2023-12-25 19:06

        核显gpu确认是驱动的,我用jellyfin转码播放时,查看GPU的使用率是非常高的。
        照片创建索引时候不管是否大模型,GPU使用率都是0,CPU的使用率也不高。

        1. jinlife
          jinlife · 2023-12-25 20:19 作者

          硬解不一定能人脸识别。 如果不行就打补丁吧。如果你一定要核显人脸识别,我这可能提供不了啥帮助。这个是核显驱动或配置的问题。

          1. oaksharks
            oaksharks · 2023-12-28 10:11

            大佬回复真及时。我在虚拟机里测试,这个补丁是好用的,在那个N100主机上打补丁也试过,还是显示人脸重新识别迁移 。 最后N100主机删除系统分区重装系统了,数据没有丢失。重装完成后没有打补丁就好了。

  20. seven7th
    seven7th · 2023-12-31 12:43

    博主您好,有空的时候能测试下1.6.1-0641,我蜗牛星际j1900+DSM7.2,尝试卸载photo套件,还ssh删除了photo的缓存,人脸识别还是失败。 我cd /var/packages/SynologyPhotos/target/usr/lib/ 用ll 命令看了下,从文件修改时间上来看,好像只有libsynophoto-plugin-platform.so.1.0这个文件替换成功了。
    其他的文件修改时间都是群晖套件安装的时间。
    另外1.6.1-0641 我看文件夹里同时也有libsynophoto-plugin-model.so 文件?
    如下:
    -rwxr-xr-x 1 SynologyPhotos SynologyPhotos 41258 Dec 31 12:00 libsynophoto-plugin-platform.so.1.0
    -rwx------ 1 root root 41258 Dec 31 11:52 libsynophoto-plugin-platform.so.1.0-bak
    -rwx------ 1 root root 41258 Dec 31 11:52 libsynophoto-plugin-platform.so-bak
    降级到 1.5.0-0489 版本,然后执行您的命令行人脸识别就正常了。

    1. jinlife
      jinlife · 2023-12-31 17:20 作者

      博文写得挺清楚啊,1.5.0是给model打补丁,1.6.1之后是改platform文件了。1.6.1里面的model在是在,群晖把里面的补丁相关代码移到platform里面去了。
      分清楚文件吧,另外记得重启,我这边试过没问题的。

      1. seven7th
        seven7th · 2024-01-01 08:49

        感谢大佬回复,之前试了很多次在套件中心下载 的photo,用您的补丁怎么都不行。
        昨天我在https://archive.synology.com/download/Package/SynologyPhotos 手动下载安装,然后应用您的补丁,现在待发现的人脸数量在减少了,而且任务管理器 synofoto-face-extraction 里CPU占用也起来了,谢谢

发表评论


captcha
请输入验证码