开源 AI 相册 Immich 安装记录

技术 · 09-27 · 617 人浏览

目录

讲故事

  • 电脑上有特别多照片,大概几个 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 客户端,安装到移动设备上。
  • 在客户端中输入服务端的地址,登录。
  • 在客户端右上角打开自动备份页面,选择要备份的文件夹,开启自动备份。

自用懒人小脚本

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,我会尽量回答。
开源 AI 相册 Immich 安装记录

https://blog.lsy223622.com/archives/65/

作者

木生睡不着

发布时间

2024-09-27

服务器 安装 Docker Linux 推荐 经验 AI Immich 开源
Theme Jasmine