群晖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),除特别说明外内容皆为原创,可以自由转载与传播,但请署名及注明文章出处。

129 条评论

  1. Rejey
    Rejey · 2024-01-22 18:57

    大神你好。我现在用补丁能够识别,但识别不全什么,有的人识别不出来,这个正常吗。我的是EXSi6.7u2方案,直通核显能直接出人脸识别吗?我的是I5-4590T,4代。

    1. jinlife
      jinlife · 2024-01-24 20:03 作者

      正常的,群晖的神经网络模型也不是每个人脸都能识别,有概率的。光线不好,角度不好都有可能没办法。
      4代CPU好像有点老,不清楚支持不。7,8,9代的问题不大。

  2. tomcatjerry
    tomcatjerry · 2024-01-23 19:55

    请问大佬,10代核心可以正常人脸识别了吗?

    1. jinlife
      jinlife · 2024-01-24 20:00 作者

      好像 10700H 等笔记本CPU可以,10400这些台式机CPU只能核显视频解码,不能人脸识别。
      不过SA6400型号的Linux内核新一些,可以试试。这个比较折腾的。

  3. jsdfhasuh
    jsdfhasuh · 2024-01-30 11:05

    作者你好,我用unraid通过Intel GVT-g虚拟核显分配给了群晖,调了设备位置,一样是没起作用,日志如下:2024-01-29T14:57:35.929009Z qemu-system-x86_64: -device {"driver":"vfio-pci","id":"hostdev0","sysfsdev":"/sys/bus/mdev/devices/91df055b-651d-41a6-b7eb-23f6b257848e","display":"off","bus":"pcie.0","addr":"0x2"}: IGD device 91df055b-651d-41a6-b7eb-23f6b257848e cannot support legacy mode due to existing devices at address 1f.0

    1. jinlife
      jinlife · 2024-02-01 18:14 作者

      你这个跟补丁没啥关系啊。 你的CPU是什么型号?
      你试一下用Q35类型虚拟机试试,其他的我跟你一样,GVT-g可以把10代CPU核显分配给群晖的,分配到0x2的位置:
      address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/
      硬解都没问题,人脸识别不行,我自己也用的补丁。 8,9代的CPU估计才能人脸识别。

  4. sigangjun
    sigangjun · 2024-02-19 16:09

    DS918+从7.1升级到7.2.1,相册升级并打完补丁后,提示这个“正在等待人脸识别结果迁移,正在识别并迁移过去已命名的人物”,已经一周了,其他用户人脸识别都正常了,只有管理员账户之前设置过人物名称,结果就这样了,怎么解决?

    1. Yyy
      Yyy · 2024-11-09 09:07

      我的也这样,其他账户正常,管理员不正常,还没找到解决办法

  5. dlutwang
    dlutwang · 2024-07-24 16:05

    大神,现在SA6400支持intel 12-14代的核显了,但人脸识别无法调用GPU。有没有办法让SA6400的Photos人脸识别调用GPU?

  6. ycx
    ycx · 2024-11-15 18:23

    大神,骚扰一下,使用您的方法肯定可以,但是,套件每次启动,日志里面有大量报错,如:
    2024-11-15T17:36:35+08:00 nas synocloudserviceauth[25165]: cloudservice_get_api_key.cpp:21 Cannot get key
    2024-11-15T17:36:36+08:00 nas synocloudserviceauth[25165]: cloudservice_register_api_key.cpp:293 Register api key failed: Invalid device info
    大约需要30分钟后停止,我最先升级7.0就发现了,现在7.2.1,最新的套件,还是发现这个现象。
    后面发现是SynologyPhotos-js-server.service这个服务无法启动,服务内容如下 cat /etc/systemd/system/pkg-SynologyPhotos-StartDaemon.target.wants/pkg-SynologyPhotos-js-server.service,一旦执行
    /var/packages/SynologyPhotos/target/usr/bin/synofoto-bin-push-service --get 就会有上述代码。这个有啥影响吗

    systemctl status pkg-SynologyPhotos-js-server.service可以查看状态

发表评论


captcha
请输入验证码