目录
讲故事
- 电脑上有特别多照片,大概几个 T,之前就简单地存在硬盘里,用文件夹整理了一下。照片看肯定是看不过来的,想找也不知道要怎么找。
- 起初试了很多 Windows 本地安装的照片管理软件,感觉没啥好的。我想着至少能找到苹果相册那样水平的软件,但可惜没有。
- 最后选中了两个支持人脸识别分类的软件:Lightroom 和 Picasa。
- Lightroom 众所周知是个庞大的商业软件,启动时间很长,处理大量照片很卡。它虽然有人脸识别分类功能,但毕竟不是以相册为目的设计的,不适合作为一个相册来使用。
- 最后在选择有限的情况下,最好的选择就是 Picasa。它是 Google 在很久以前推出的免费相册软件,支持人脸识别分类,启动很快,使用流畅。它会生成预览图保存到数据库,从而使得快速翻阅照片的时候基本上不用等待图片加载。它的人脸相册整理方便流畅,还能使用包含人脸的照片生成回忆影片。虽然但是,它在很多年前就停止支持了。它曾经能够使用的照片上传云服务转变为了现在的 Google Photos,软件也不再更新。它在如今的 Windows 11 上仍能正常使用,唯一缺少的就是 hidpi 适配。
- 人脸识别相册的算法还是能经常给人惊喜的,偶尔会突然发现它识别出来一张特别模糊或者角度很偏的人脸,但分类居然还是对的。
- 扯得有点远了,反正我就很开心地用了蛮久 Picasa,直到有一天。那天我觉得 Picasa 虽然能满足我人脸识别分类的需求,但并没有多少别的整理功能。如果我想根据时间或者内容或者地点查找照片,还是需要自己手动翻阅一大堆照片,配合记忆来搜索。它作为一个原生 win32 软件,只能在电脑上本地运行,离开了电脑没法看到照片。它也不能帮助我保护照片安全,备份频率决定了意外发生时我会丢多少照片,我仍旧需要每隔一段时间自己把手机、iPad 等设备上的照片手动导入到电脑,然后启动 Picasa 让它扫描。
为什么选择 Immich
- 于是我决定搭建一个照片服务器。根据多方信息进行对比,我认为用户评价较好、完成度较高的照片服务器应用有以下几款:
- Immich:开源免费,捐赠与否不影响功能。支持人脸识别、自然语言搜索、地图相册等,功能比较完善。有多种开源 clip 模型和人脸识别模型可以选择,实测搜索效果非常好,并且支持组合筛选。有多平台客户端,移动设备后台自动备份,实测工作稳定,反应速度比系统自带云备份还快。支持为各种格式的照片和视频生成预览,可选高压缩率的 webp 等格式,占用空间不大。主要的视图是时间轴,浏览原始目录层级的文件夹模式刚刚推出,还不完善。没有 OCR 搜索功能,这个我蛮想要的,目前还没见到哪家有,希望以后能加上。
- PhotoPrism:开源,基础功能免费,少量高级功能需要订阅,个人用途一般免费够用。支持人脸识别、地图相册、文件夹视图等,功能比较完善。人脸识别效果一般,文档里说它用的模型没多少亚洲人和小孩的训练数据,怪不得很多都识别不出来,而且模型不能换,光这点就可以不用选了。搜图方面,感觉它只用了很简单的图像标签模型,不能自然语言搜索,只有几个常见的关键词能搜到图片,同样不能换模型。文件夹视图比 Immich 完善。预览图非常占空间,每张图片生成了十张预览图和缩略图,在我电脑上占了一百多 g,看了一下它的预览图分辨率,最大尺寸和最大尺寸小一点点各生成了一张,不知道在想什么。
- Nextcloud Photos:Nextcloud 的一个应用
(插件),根据网上对比在各种功能方面完成度也是很高的,但我感觉 Nextcloud 已经非常臃肿,网页用起来都卡卡的,实在算不上流畅(不过也有我云服务器性能不行的关系),就不装这个给它增加负担了。不过确实是可以在自己的照片服务器单独装一个 Nextcloud,这样性能方面应该问题不大,但和我云服务器上的 Nextcloud 就要冲突了。(好像 Nextcloud 客户端都是可以添加多个服务器的?) - MT Photos:订阅制,有永久版,价格不贵。支持人脸识别、自然语言搜索、地图相册等,功能该有的基本上有。它居然支持 OCR 搜索,刚说没人有这下打脸了,希望 Immich 能跟进。它用的 clip 和人脸识别模型都比 Immich 用的差一些,可能是考虑到要兼容各种配置的设备,毕竟它能配置的选项确实蛮少的,算是傻瓜式应用。UI 和 Immich 就是一个模子刻出来的,因为都是照着 Google Photos 做的。国内平台蛮多人推荐这个,确实好用不贵而且用起来很简单。但我个人喜欢有免费的就用免费的,而且主观上会给开源加分,倾向于能折腾的东西,所以觉得它不如 Immich。
- Synology Photos:顾名思义,群晖用的。我没有群晖 NAS,也没听说过黑什么的,于是没有用过。听说它的功能性也挺不错的,但反正有不限制群晖设备的替代品,就不用考虑了。
- 最后显然,Immich 在我这里胜出了。
安装前准备
安装 Docker
装系统就不讲了啊
- 我使用的是 Windows 台式机,安装 Docker for Desktop,它会安装 WSL 并把 Docker 安装到 WSL 中,还带有一个便于操作的图形化管理器。
- Linux 的话自己看官方文档吧
编写 docker-compose.yml
官方 docker-compose.yml
模板下载地址:https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
以下是我的 docker-compose.yml:
name: immich
services:
immich-server:
container_name: immich_server
image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
# extends:
# file: hwaccel.transcoding.yml
# service: cpu # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding
volumes:
- ${UPLOAD_LOCATION}/encoded-video:/usr/src/app/upload/encoded-video
- ${UPLOAD_LOCATION}/library:/usr/src/app/upload/library
- ${UPLOAD_LOCATION}/thumbs:/usr/src/app/upload/thumbs
- /etc/localtime:/etc/localtime:ro
- "C:/Users/lsy22/Pictures:/immich-photo-library/Pictures:ro"
- "D:/图&片:/immich-photo-library/图&片:ro"
- "D:/Backup/ImmichPhotoBackup:/usr/src/app/upload/upload"
env_file:
- .env
ports:
- 2283:2283
depends_on:
- redis
- database
restart: always
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}-cuda
extends: # uncomment this section for hardware acceleration - see https://immich.app/docs/features/ml-hardware-acceleration
file: hwaccel.ml.yml
service: cuda # set to one of [armnn, cuda, openvino, openvino-wsl] for accelerated inference - use the `-wsl` version for WSL2 where applicable
volumes:
- ./model-cache:/cache
env_file:
- .env
restart: always
healthcheck:
disable: false
redis:
container_name: immich_redis
image: docker.io/redis:6.2-alpine@sha256:2d1463258f2764328496376f5d965f20c6a67f66ea2b06dc42af351f75248792
healthcheck:
test: redis-cli ping || exit 1
restart: always
database:
container_name: immich_postgres
image: docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_DB: ${DB_DATABASE_NAME}
POSTGRES_INITDB_ARGS: '--data-checksums'
volumes:
- "database:/var/lib/postgresql/data"
healthcheck:
test: pg_isready --dbname='${DB_DATABASE_NAME}' --username='${DB_USERNAME}' || exit 1; Chksum="$$(psql --dbname='${DB_DATABASE_NAME}' --username='${DB_USERNAME}' --tuples-only --no-align --command='SELECT COALESCE(SUM(checksum_failures), 0) FROM pg_stat_database')"; echo "checksum failure count is $$Chksum"; [ "$$Chksum" = '0' ] || exit 1
interval: 5m
start_interval: 30s
start_period: 5m
command: ["postgres", "-c" ,"shared_preload_libraries=vectors.so", "-c", 'search_path="$$user", public, vectors', "-c", "logging_collector=on", "-c", "max_wal_size=2GB", "-c", "shared_buffers=512MB", "-c", "wal_compression=on"]
restart: always
volumes:
database:
driver: local
7-9 行:
# extends:
# file: hwaccel.transcoding.yml
# service: cpu # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding
- 这里是硬件加速视频转码相关的设置,如果需要的话从
https://github.com/immich-app/immich/releases/latest/download/hwaccel.transcoding.yml
下载hwaccel.transcoding.yml
放在旁边。我因为没有打算转码播放视频,也为了节约空间,没有开视频转码,也就不配置硬件加速转码了。 - service 参数可选
cpu
(软件编码),nvenc
(NVIDIA),quicksync
(Intel),rkmpp
(Rockchip),vaapi
(AMD / NVIDIA / Intel),vaapi-wsl
(AMD / NVIDIA / Intel)
10-17 行:
volumes:
- ${UPLOAD_LOCATION}/encoded-video:/usr/src/app/upload/encoded-video
- ${UPLOAD_LOCATION}/library:/usr/src/app/upload/library
- ${UPLOAD_LOCATION}/thumbs:/usr/src/app/upload/thumbs
- /etc/localtime:/etc/localtime:ro
- "C:/Users/lsy22/Pictures:/immich-photo-library/Pictures:ro"
- "D:/图&片:/immich-photo-library/图&片:ro"
- "D:/Backup/ImmichPhotoBackup:/usr/src/app/upload/upload"
- 这里是目录映射相关的设置,用来指定转码的视频、缩略图、预览图、外部图库、上传的图片等存储的位置。
-
${UPLOAD_LOCATION}
在环境变量中定义,因为前三行分别是转码的视频、图库、缩略图/预览图的存储位置,建议放在读取速度相对快的固态硬盘上,否则可能影响浏览图库时的加载速度。不能设置只读。 -
- "C:/Users/lsy22/Pictures:/immich-photo-library/Pictures:ro"
是外部图库的目录映射,需要自己修改。- 冒号
:
左边是宿主机上已有照片的存储位置。如果是 Windows 路径,其中的反斜杠\
要改成正斜杠/
。 - 冒号
:
右边是映射到容器中的位置。可以自己修改,之后要在 Immich 的设置中填写。 - 末尾的
:ro
是只读模式。因为这是外部图库,我不需要 Immich 来修改,为了防止意外删库选择了只读。如果没有这方面的顾虑,或者需要用 Immich 来删除或者修改外部图库中的图片,就不要添加这个参数。 - 如果有多个外部图库位置可以添加多行,每行对应一个位置,注意映射到容器中的目录不能相同。例如下一行
- "D:/图&片:/immich-photo-library/图&片:ro"
。
- 冒号
-
- "D:/Backup/ImmichPhotoBackup:/usr/src/app/upload/upload"
是图片上传文件夹的目录映射,手动上传的图片和客户端自动备份的图片会存储在这里,需要自己修改。- 冒号
:
左边是宿主机上为上传文件夹准备的目录。如果是 Windows 路径,其中的反斜杠\
要改成正斜杠/
。因为会上传大量原图,占空间较大,我选择放在机械硬盘。 - 冒号
:
右边是映射到容器中的位置,不能修改。 - 不能设置只读。
- 冒号
20-21 行:
ports:
- 2283:2283
- 这里是外部访问端口映射设置。
- 冒号
:
左边的2283
是外部访问端口,可以自己修改,之后用http://ip:2283
访问 WebUI。 - 冒号
:
右边的2283
是容器内部端口,不能修改。
27-36 行:
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}-cuda
extends: # uncomment this section for hardware acceleration - see https://immich.app/docs/features/ml-hardware-acceleration
file: hwaccel.ml.yml
service: cuda # set to one of [armnn, cuda, openvino, openvino-wsl] for accelerated inference - use the `-wsl` version for WSL2 where applicable
volumes:
- ./model-cache:/cache
-
这里是机器学习容器的设置。
-
image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}-cuda
这一行前面都不用修改,最后的-cuda
有以下几种选择:- 不加,也就是
image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
,使用 CPU 运行机器学习,效率低。 -
-cuda
,支持 CUDA 的 N 卡,效率高,一般最好有 N 卡并且选这个。 -
-armnn
,ARM 的机器学习硬件加速。 -
-openvino
,Intel 的机器学习硬件加速。
- 不加,也就是
-
extends: file: hwaccel.ml.yml service: cuda
-
这部分是硬件加速机器学习的配置,如果需要的话从
https://github.com/immich-app/immich/releases/latest/download/hwaccel.ml.yml
下载hwaccel.ml.yml
放在旁边,不用就把这部分注释掉或者删掉。-
services
有以下可选: -
cpu
:使用 CPU 进行机器学习。 -
cuda
:使用 N 卡加速机器学习,最推荐。 -
openvino
:使用 I 卡加速机器学习。 -
openvino-wsl
:如果使用 I 卡并且安装在 WSL2 中就选择这个。
-
58-59 行:
volumes:
- "database:/var/lib/postgresql/data"
- 这里我没有按照官方提供的文档要求,原版的目录映射是
- ${DB_DATA_LOCATION}:/var/lib/postgresql/data
,然后DB_DATA_LOCATION
在环境变量中定义为./postgres
。原版在 Linux 上能正常工作,但是因为 PostgreSQL 数据库在 NTFS 文件系统上会有权限问题,所以我选择映射到了 Docker 容器的数据卷里。
59-70 行:
volumes:
database:
driver: local
-
这里是数据库数据卷的设置,和上面的数据库目录映射配合使用。
-
如果上面使用官方原版的目录映射,这里也改成原本的设置:
-
volumes: model-cache:
编写 .env
官方 .env
模板下载地址:https://github.com/immich-app/immich/releases/latest/download/example.env
,下载之后记得改文件名为 .env
。
以下是我的 .env:
# You can find documentation for all the supported env variables at https://immich.app/docs/install/environment-variables
# The location where your uploaded files are stored
UPLOAD_LOCATION=./library
# The location where your database files are stored
DB_DATA_LOCATION=./postgres
# To set a timezone, uncomment the next line and change Etc/UTC to a TZ identifier from this list: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List
TZ=Asia/Shanghai
# The Immich version to use. You can pin this to a specific version like "v1.71.0"
IMMICH_VERSION=release
# Connection secret for postgres. You should change it to a random password
DB_PASSWORD=postgres
# The values below this line do not need to be changed
###################################################################################
DB_USERNAME=postgres
DB_DATABASE_NAME=immich
MACHINE_LEARNING_WORKER_TIMEOUT=300
- 大多数都不用改,只需要把
DB_PASSWORD
改成一个随机密码就行了。 -
TZ
是时区设置,我改成了Asia/Shanghai
。 -
MACHINE_LEARNING_WORKER_TIMEOUT
是机器学习工作超时时间,单位秒,不设置默认 120。这意味着如果机器学习工作进程持续这么久无响应就会被强制停止。我有段时间发现高负载的时候搜索时间很长,有时候会超时被强制停止,于是改成了 300 秒,改了之后似乎是够用了。
下载 hwaccel.ml.yml
官方 hwaccel.ml.yml
模板下载地址:https://github.com/immich-app/immich/releases/latest/download/hwaccel.ml.yml
这个文件没啥要改的,要用到硬件加速机器学习的话就下载放在旁边。
安装
启动 Immich
- 打开终端,进入
docker-compose.yml
所在目录。 - 输入
docker-compose up -d
启动 Immich。
访问 Immich
- 打开浏览器,输入
http://ip:2283
访问 Immich。 - 如果装在本机,可以输入
http://localhost:2283
访问 Immich。 - 第一次访问会要求设置管理员账号和密码,设置好之后就可以使用了。
设置 Immich
- 登录 Immich 后,点击右上角的头像,选择
Account Settings
进入用户设置页面。 - 语言改成简体中文。
- 再次点击右上角的头像,选择
管理
进入系统设置页面。 - 点击左边的
设置
选项卡。- 在
图片设置
中根据空间占用需求设置图片的压缩参数。 - 在
任务设置
中根据机器性能设置各种任务的并发数量。 - 展开
机器学习设置
。- 在
URL
中填入机器学习容器的地址http://immich-machine-learning:3003
。 - 在
智能搜索
中填入一个 clip 模型,推荐支持多语言的XLM-Roberta-Large-Vit-B-16Plus
,可以提前从https://huggingface.co/immich-app/XLM-Roberta-Large-Vit-B-16Plus
下载好,解压到docker-compose.yml
旁边的model-cache\clip
文件夹下。 - 在
人脸识别
中选择一个人脸识别模型,推荐antelopev2
,可以提前从https://huggingface.co/immich-app/antelopev2
下载好,解压到docker-compose.yml
旁边的model-cache\facial-recognition
文件夹下。
- 在
- 底下的
视频转码设置
需要的话也可以设置一下,我选择不要对任何视频进行转码。
- 在
- 点击左边的
外部图库
选项卡。- 点击
创建图库
。 - 点击新的图库右边的菜单键,重命名和编辑导入路径,导入路径填写在
docker-compose.yml
中外部图库映射到容器内的目录。 - 如果有多个外部图库,可以重复上面的步骤。
- 点击
- 点击左边的
任务
选项卡。- 点击
图库
右边的全部
,开始扫描图库。 - 扫描完图库之后,就可以把其他任务都执行一遍,比如智能搜索、人脸检测等。
- 点击
设置移动设备自动备份
- 下载 Immich 客户端,安装到移动设备上。
- Android:Google Play 或 GitHub 或 F-Droid。
- iOS/iPadOS:App Store。
- 在客户端中输入服务端的地址,登录。
- 在客户端右上角打开自动备份页面,选择要备份的文件夹,开启自动备份。
自用懒人小脚本
start.bat
@echo off
echo Starting Immich...
docker compose up -d
docker compose logs -f
echo Done.
update.bat
@echo off
echo Pulling Docker images...
docker compose pull
echo:
echo Restarting Immich...
docker compose stop
docker compose up -d
echo Done.
结语
- Immich 确实好用,用了一段时间,感觉非常满意,推荐大家有需要的可以安装试试。
- 有什么问题欢迎在评论区提出或者联系 QQ,我会尽量回答。