* fix(ml): pass model_root_dir to OcrOptions for RapidOCR compatibility
Fix a TypeError (Path(None)) when the OCR model is invoked, caused by an upstream change in RapidOCR v3.8.1 (RapidAI/RapidOCR@8ea9626).
RapidOCR now internally calls `Path(cfg.get("model_root_dir"))`. Since `model_root_dir` was missing from `OcrOptions`, it evaluated to `None` and triggered a `TypeError: argument should be a str or an os.PathLike`.
This fix adds the missing `model_root_dir` argument to prevent the error.
Ref: #28331
* fix(ml-test): update OCR tests for RapidOCR schema change
* chore(ml-test): remove unused `cache_dir` parameter from `TextRecognizer`
* Revert "chore(ml-test): remove unused `cache_dir` parameter from `TextRecognizer`"
This reverts commit 007ad7b3f2.
* fix(ml): use self.cache_dir for model_root_dir in OcrOptions
* fix: stabilize ROCm MIGraphX inference
Serialize MIGraphX session runs so lazy compiles cannot overlap within a worker.
Use a fixed face-recognition batch size for MIGraphX to avoid compiling a new program for each detected face count.
* fix(ml): increase ROCm worker timeout
* fix(ml): narrow MIGraphX compile locking
* docs: format environment variables table
* docs: apply prettier to environment variables table
* fix(ml): handle empty/corrupt images in face detection
When a corrupt or degenerate image with zero-dimension (0 width or 0 height)
reaches the face detection pipeline, insightface's RetinaFace.detect() calls
cv2.resize() with a target size of 0, triggering an OpenCV assertion failure:
error: (-215:Assertion failed) inv_scale_x > 0 in function 'resize'
This crashes the ML worker and returns a 500 error to the server.
Add an early return in FaceDetector._predict() that checks for zero-dimension
images after decoding and returns empty detection results instead of passing
them to the insightface model.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix(ml): move empty image validation to request level
Per review feedback, validate image dimensions in the predict endpoint
(returning 400) rather than in each model's _predict method. This
catches all zero-dimension images before they reach any model task.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix(ml): resolve mypy strict type error in predict endpoint
Use intermediate `decoded` variable so mypy knows `.width` and `.height`
are accessed on `Image`, not on `Image | str`.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* Enable OpenVINO CPU acceleration in Immich
* Remove unnecessary debug log
* Removing checking for device_ids for openvino since cpu will always be available
* Find OpenVINOExecutionProvider index instead of assuming index 0
* Fix openvino tests
* Fix failing test mock. OpenVINO expects provider options, but cuda provide doesn't so use that for mocked tests.
* Support empty provider options in OrtSessions in which case ONNXRuntime will use its own defaults
* Use OpenVINOExecutionProvider for test_sets_provider_options_kwarg
* fix mock
* simplify
* unused variable
---------
Co-authored-by: Aleksander <pejcic@adobe.com>
Co-authored-by: mertalev <101130780+mertalev@users.noreply.github.com>
* 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>
* fix(ml): Resolve IPv6 startup crash and healthcheck failure
Fixes#13782
* fix(ml): updated the fix to use the std lib
* Apply code formatting to __main__.py