之前的一篇文字说了,如何私有化部署自己的私有相册, immich提供的照片相关的AI功能,如人脸检查,搜索等,参考告别付费会员,部署适合个人的相册库。
这些功能是靠ghcr.io/immich-app/immich-machine-learning
这个镜像提供的。这个镜像独立于主要的immich-server
。镜像的主要主要为server端提供人工智能相关的接口。这个镜像可以独立部署,也可以集成部署,当然也可以选择不部署。这个根据自己机器的性能来看,如果只是照片备份或者简单的相册功能,可以不用,不过提供的AI功能是真的好用。担心机器性能的,官方推荐的2个核心, 4G内存是完全可以部署起来的。
实现这些智能功能的容器叫做immich-machine-learning, 机器学习。 这是人工智能领域的一个技术,即通过计算机程序的自我学习,实现像人一样,能够智能的完成一些工作或者判断一些事务。
比如,immich的一个功能,照片搜索,其实就是一个以文搜图的场景,这个在baidu等搜索引擎上很常见,但是要搬到你家的NAS或者软路由上,没有后台强大的服务器支持,需要怎么实现呢?
这里依靠一个叫模型
的东西。这个大家可能听过:大模型,chatGPT等的关键技术也是这个。 正常我要识别一张照片是猫,而不是狗,可以通过观看他得外貌,耳朵、鼻子,体型等特征,基于我们得认知,得到结论。计算机也是一样,,对于一张猫得照片,不过它不知道什么鼻子嘴巴,它需要通过建立一个数学模型,集合大量得数据,经过一复杂的运算,得到一套标准(这就是所谓的训练):然后给定一张新得照片,符合这个标准得,就是猫(所谓得推理)。
模型就是把训练得结果保存起来,然后应用根据相应得接口要求去调用并返回,这样我们得设备或者程序就智能了。
当然是智能还是智障,和你的模型(标准)、机器资源(快慢)、输入(符合度)都有关。
模型:你选择了什么样的模型,就表明你具备了什么能力,是识图,还是识字得模型是不一样得。在识图一类得模型中,训练得越好得,精确度越高。
机器资源:就是你允许模型的地方,你如果内存、cpu这些都不够,你让他判断得时候,直接OOM了,那也是不行的。
输入:就是你让他判断得是什么,如果是一个识图得模型,你让让他写作,风马牛不相及,他肯定干不了。
开源社区,做好了很多的模型,大家可以直接用,具体可以到hugingface站点:https://huggingface.co/ 去查询和下载。这些模型用的过程中,也可以进行二次训练,这个站点也提供了训练的数据集。
immich得机器学习中,用了2类模型:人脸识别模型,和搜索模型。
这两类模型其实很多,但是得让immich能够调用(即前面说得遵循得规则),所以immich得文档里面提了很多支持得模型。 具体选择什么样得模型,怎么配置,在immich的web端可以进行配置,参考这里:
可以设置是否启用,调用的接口是什么。下面可以对每一个功能设置相关的参数,比如用什么样的模型,具体检查的精确度等。
但是第一次部署完成之后,照片备份完成,按照页面设置,开启智能搜索, 模型按照默认的选择,发现搜索等功能都用不了。
查看immich-machine-learning得日志,发现很多这样的打印,都是下载失败:
[11/26/24 07:47:31] INFO Downloading detection model 'buffalo_l'. This may take a while. [11/26/24 07:47:32] WARNING Failed to load detection model 'buffalo_l'. Clearing cache. [11/26/24 07:47:32] WARNING Attempted to clear cache for model 'buffalo_l', but cache directory does not exist [11/26/24 07:47:32] WARNING Failed to load detection model 'buffalo_l'. Clearing cache. [11/26/24 07:47:32] WARNING Attempted to clear cache for model 'buffalo_l', but cache directory does not exist [11/26/24 07:47:33] INFO Downloading visual model 'ViT-B-32__openai'. This may take a while. [11/26/24 07:49:42] INFO Downloading detection model 'buffalo_l'. This may take a while. [11/26/24 07:49:42] WARNING Failed to load visual model 'ViT-B-32__openai'. Clearing cache. [11/26/24 07:49:42] WARNING Attempted to clear cache for model 'ViT-B-32__openai', but cache directory does not exist [11/26/24 07:51:54] INFO Downloading visual model 'ViT-B-32__openai'. This may take a while.
查看了下代码,官方站点提供的是通过huggingface的接口下载的,但是国内因为大家都知道的原因,下载肯定失败。
from huggingface_hub import snapshot_download
...
def _download(self) -> None:
ignore_patterns = [] if self.model_format == ModelFormat.ARMNN else ["*.armnn"]
snapshot_download(
f"immich-app/{clean_name(self.model_name)}",
cache_dir=self.cache_dir,
local_dir=self.cache_dir,
ignore_patterns=ignore_patterns,
)
不过hugeface,在国内有镜像站,HF-mirror : https://hf-mirror.com。这里尝试从国内镜像站下载了,手动传上去。
在查阅资料的时候,了解到immich默认的搜索模型ViT-B-32__openai
不支持中文,于是搜索的模型换成了XLM-Roberta-Large-Vit-B-16Plus。
参考hf-mirror首页得如何使用,下载方式有很多。
这里我选择了git的方式直接全部拉下来。
模型记得选择immich-app这个拥者的。下载过程如下;
# 确保安装了git和lfs,用如下命令验证是否安装了
git lfs install
# 如果没有安装
# 根据系统选择更新软件源,参考这里https://github.com/git-lfs/git-lfs/blob/main/INSTALLING.md
curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
apt-get install git-lfs
# 安装完成之后直接下载对应得模型文件,XLM-Roberta-Large-Vit-B-16Plus和buffalo_l
git clone https://hf-mirror.com/immich-app/XLM-Roberta-Large-Vit-B-16Plus
git clone https://hf-mirror.com/immich-app/buffalo_l
默认得compose文件,模型并没有持久化保存,所以修改docker-compose文件中 immich_machine_learning得volume部分
immich-machine-learning:
container_name: immich_machine_learning
# For hardware acceleration, add one of -[armnn, cuda, openvino] to the image tag.
# Example tag: ${IMMICH_VERSION:-release}-cuda
image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
# extends: # uncomment this section for hardware acceleration - see https://immich.app/docs/features/ml-hardware-acceleration
# file: hwaccel.ml.yml
# service: cpu # set to one of [armnn, cuda, openvino, openvino-wsl] for accelerated inference - use the `-wsl` version for WSL2 where applicable
volumes:
- /data/immich/modelcache:/cache # 修改这里,根据个人情况,我这里是/data/immich/modelcache
env_file:
- immich.env
restart: always
healthcheck:
disable: false
如果你的immich是部署在有GPU得机器上,可以选择开启GPU硬件加速,可以提高搜索、识别得速度。参考compose中注释掉得部分
然后将模型放到你得本地路径下,这里遇到了一个小坑:这个模型得目录结构。 最开始我是这样得结构:
.
└── modelcache
├── buffalo_l
└── XLM-Roberta-Large-Vit-B-16Plus
然后日志还是提示失败。查了下,好像也没找到相关资料,都是直接下载了放到对应目录下,不知道是不是版本更新了。然后我在下载得代码/usr/src/app/models/base.py
里面加了一条log
def download(self) -> None:
if not self.cached:
log.info(self.model_path) # 增加得日志打印
log.info(
f"Downloading {self.model_type.replace('-', ' ')} model '{self.model_name}'. This may take a while."
)
self._download()
看到日志路径应该是这样:
[11/28/24 17:10:53] INFO /cache/clip/XLM-Roberta-Large-Vit-B-16Plus/visual/model.onnx
...
[11/28/24 20:29:14] INFO /cache/facial-recognition/buffalo_l/detection/model.onnx
原来在模型前面还有一个路径,分别是clip和facial-recognition,按照以上得路径,重新存放我们git拉下的目录,结构如下
├── modelcache
│ ├── clip
│ │ └── XLM-Roberta-Large-Vit-B-16Plus
│ └── facial-recognition
│ └── buffalo_l
然后在看容器的log,就没有发现错误了。
到配置页面,修改搜索得模型为XLM-Roberta-Large-Vit-B-16Plus
修改之后,需要手动触发任务,更新数据
等待任务完成,我就可以快速得搜索了。速度算不上多快,属于能接受的范围,如果我机器配置高一点,应该会更快。
比如这里,我搜索关键字沙漠,就把几年前去沙漠得照片都搜索出来了
之前一篇文章,immich作为自己私有得在线相册是非常方便得,今天配置完成了机器学习相关的内容,不管是web端,还是app端,都非常方便,都媲美商业软件了。关于immich的人工智能功能,说几点大家可能关心得吧:
_l
和16Plus
,代表的含义是不一样,不同的模型,对资源占用,精确度等都不一样,有精力的可以看下模型的介绍自己验证下。