immich/machine-learning
Kang 02b29046b3
feat: ocr (#18836)
* feat: add OCR functionality and related configurations

* chore: update labeler configuration for machine learning files

* feat(i18n): enhance OCR model descriptions and add orientation classification and unwarping features

* chore: update Dockerfile to include ccache for improved build performance

* feat(ocr): enhance OCR model configuration with orientation classification and unwarping options, update PaddleOCR integration, and improve response structure

* refactor(ocr): remove OCR_CLEANUP job from enum and type definitions

* refactor(ocr): remove obsolete OCR entity and migration files, and update asset job status and schema to accommodate new OCR table structure

* refactor(ocr): update OCR schema and response structure to use individual coordinates instead of bounding box, and adjust related service and repository files

* feat: enhance OCR configuration and functionality

- Updated OCR settings to include minimum detection box score, minimum detection score, and minimum recognition score.
- Refactored PaddleOCRecognizer to utilize new scoring parameters.
- Introduced new database tables for asset OCR data and search functionality.
- Modified related services and repositories to support the new OCR features.
- Updated translations for improved clarity in settings UI.

* sql changes

* use rapidocr

* change dto

* update web

* update lock

* update api

* store positions as normalized floats

* match column order in db

* update admin ui settings descriptions

fix max resolution key

set min threshold to 0.1

fix bind

* apply config correctly, adjust defaults

* unnecessary model type

* unnecessary sources

* fix(ocr): switch RapidOCR lang type from LangDet to LangRec

* fix(ocr): expose lang_type (LangRec.CH) and font_path on OcrOptions for RapidOCR

* fix(ocr): make OCR text search case- and accent-insensitive using ILIKE + unaccent

* fix(ocr): add OCR search fields

* fix: Add OCR database migration and update ML prediction logic.

* trigrams are already case insensitive

* add tests

* format

* update migrations

* wrong uuid function

* linting

* maybe fix medium tests

* formatting

* fix weblate check

* openapi

* sql

* minor fixes

* maybe fix medium tests part 2

* passing medium tests

* format web

* readd sql

* format dart

* disabled in e2e

* chore: translation ordering

---------

Co-authored-by: mertalev <101130780+mertalev@users.noreply.github.com>
Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
2025-10-27 14:09:55 +00:00
..
2025-10-27 14:09:55 +00:00
2025-03-17 21:08:19 +00:00
2025-10-07 12:24:23 -04:00
2023-05-17 12:07:17 -05:00
2025-03-24 12:02:33 -04:00
2025-10-27 14:09:55 +00:00
2025-10-27 14:09:55 +00:00
2025-03-17 21:08:19 +00:00
2024-06-07 03:09:47 +00:00
2025-10-14 17:51:31 +00:00
2025-10-27 14:09:55 +00:00

Immich Machine Learning

  • CLIP embeddings
  • Facial recognition

Setup

This project uses uv, so be sure to install it first. Running uv sync --extra cpu will install everything you need in an isolated virtual environment. CUDA, ROCM and OpenVINO are supported as acceleration APIs. To use them, you can replace --extra cpu with either of --extra cuda, --extra rocm or --extra openvino. In the case of CUDA, a compute capability of 5.2 or higher is required.

To add or remove dependencies, you can use the commands uv add $PACKAGE_NAME and uv remove $PACKAGE_NAME, respectively. Be sure to commit the uv.lock and pyproject.toml files with uv lock to reflect any changes in dependencies.

Load Testing

To measure inference throughput and latency, you can use Locust using the provided locustfile.py. Locust works by querying the model endpoints and aggregating their statistics, meaning the app must be deployed. You can change the models or adjust options like score thresholds through the Locust UI.

To get started, you can simply run locust --web-host 127.0.0.1 and open localhost:8089 in a browser to access the UI. See the Locust documentation for more info on running Locust.

Note that in Locust's jargon, concurrency is measured in users, and each user runs one task at a time. To achieve a particular per-endpoint concurrency, multiply that number by the number of endpoints to be queried. For example, if there are 3 endpoints and you want each of them to receive 8 requests at a time, you should set the number of users to 24.

Facial Recognition

Acknowledgements

This project utilizes facial recognition models from the InsightFace project. We appreciate the work put into developing these models, which have been beneficial to the machine learning part of this project.

Used Models

  • antelopev2
  • buffalo_l
  • buffalo_m
  • buffalo_s

License and Use Restrictions

We have received permission to use the InsightFace facial recognition models in our project, as granted via email by Jia Guo (guojia@insightface.ai) on 18th March 2023. However, it's important to note that this permission does not extend to the redistribution or commercial use of their models by third parties. Users and developers interested in using these models should review the licensing terms provided in the InsightFace GitHub repository.

For more information on the capabilities of the InsightFace models and to ensure compliance with their license, please refer to their official repository. Adhering to the specified licensing terms is crucial for the respectful and lawful use of their work.