3 Commits

Author SHA1 Message Date
Yakhyokhuja Valikhujaev
7d37633b1a chore: drop Python 3.10 support, bump scikit-image to >=0.26.0 (#96) 2026-03-19 10:04:52 +09:00
Yakhyokhuja Valikhujaev
bc413df4a8 docs: Add release changelog markdown file (#92) 2026-03-19 09:46:16 +09:00
Marc-Antoine BERTIN
8db0577991 feat: Add Python 3.14 support (#95)
- Relax requires-python upper bound from <3.14 to <3.15
- Add Python 3.14 classifier to pyproject.toml
- Add Python 3.14 to CI test matrix (ubuntu-latest)
- Fix SimilarityTransform.estimate() deprecation warning (scikit-image >=0.26)
  by switching to SimilarityTransform.from_estimate() class constructor

All 147 tests pass on Python 3.14.3 with no warnings.

Co-authored-by: marc-antoine <marcantoine.bertin@storyzy.com>
2026-03-19 09:41:44 +09:00
12 changed files with 85 additions and 21 deletions

View File

@@ -20,7 +20,7 @@ jobs:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.10"
python-version: "3.11"
- uses: pre-commit/action@v3.0.1
test:
@@ -34,9 +34,11 @@ jobs:
include:
# Full Python range on Linux (fastest runner)
- os: ubuntu-latest
python-version: "3.10"
python-version: "3.11"
- os: ubuntu-latest
python-version: "3.13"
- os: ubuntu-latest
python-version: "3.14"
- os: macos-latest
python-version: "3.13"
- os: windows-latest

View File

@@ -54,7 +54,7 @@ jobs:
strategy:
fail-fast: false
matrix:
python-version: ["3.10", "3.13"]
python-version: ["3.11", "3.13"]
steps:
- name: Checkout code
@@ -92,7 +92,7 @@ jobs:
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.10"
python-version: "3.11"
cache: 'pip'
- name: Install build tools

63
CHANGELOG.md Normal file
View File

@@ -0,0 +1,63 @@
# Changelog
All notable changes to this project will be documented in this file.
## [3.1.1] - 2026-03-19
- Drop Python 3.10 support; minimum is now Python 3.11 ([#95](https://github.com/yakhyo/uniface/pull/95))
- Bump `scikit-image` to `>=0.26.0` and use `SimilarityTransform.from_estimate()` ([#95](https://github.com/yakhyo/uniface/pull/95))
- Add Python 3.14 support ([#95](https://github.com/yakhyo/uniface/pull/95))
## [3.1.0] - 2026-03-11
- Add FAISS vector database for fast face search ([#86](https://github.com/yakhyo/uniface/pull/86))
- Add `ModelInfo` dataclass for centralized model registry ([#90](https://github.com/yakhyo/uniface/pull/90))
- Add download retry with exponential backoff ([#90](https://github.com/yakhyo/uniface/pull/90))
- Add dataset documentation ([#85](https://github.com/yakhyo/uniface/pull/85))
## [3.0.0] - 2026-02-14
- Add ByteTrack multi-object face tracking ([#81](https://github.com/yakhyo/uniface/pull/81))
- Add 5 gaze estimation backbones ([#82](https://github.com/yakhyo/uniface/pull/82))
- Add configurable cache directory ([#80](https://github.com/yakhyo/uniface/pull/80))
- Redesign unified API with standardized return types ([#82](https://github.com/yakhyo/uniface/pull/82))
## [2.3.0] - 2026-02-05
- Add XSeg face segmentation ([#72](https://github.com/yakhyo/uniface/pull/72))
- Update documentation and README ([#78](https://github.com/yakhyo/uniface/pull/78))
## [2.2.1] - 2026-01-18
- Add ONNX Runtime provider selection (CUDA, CoreML, CPU) ([#68](https://github.com/yakhyo/uniface/pull/68))
- Fix cache directory check on startup ([#67](https://github.com/yakhyo/uniface/pull/67))
## [2.2.0] - 2026-01-07
- Add YOLOv8-Face detection ([#62](https://github.com/yakhyo/uniface/pull/62))
- Add AdaFace recognition ([#61](https://github.com/yakhyo/uniface/pull/61))
- Add MkDocs documentation site ([#51](https://github.com/yakhyo/uniface/pull/51))
- Add Google Colab support ([#52](https://github.com/yakhyo/uniface/pull/52))
## [2.0.0] - 2025-12-30
- Initial v2 release
- Detection: RetinaFace, SCRFD, YOLOv5-Face
- Recognition: ArcFace, MobileFace, SphereFace
- 106-point facial landmarks
- Face parsing (BiSeNet, 19 classes)
- Gaze estimation (MobileGaze)
- Age/gender/race prediction (AgeGender, FairFace)
- Emotion recognition (DDAMFN)
- Anti-spoofing (MiniFASNet)
- Face anonymization (5 blur methods)
- SHA-256 weight verification
- Pure ONNX Runtime inference
[3.1.1]: https://github.com/yakhyo/uniface/compare/v3.1.0...v3.1.1
[3.1.0]: https://github.com/yakhyo/uniface/compare/v3.0.0...v3.1.0
[3.0.0]: https://github.com/yakhyo/uniface/compare/v2.3.0...v3.0.0
[2.3.0]: https://github.com/yakhyo/uniface/compare/v2.2.1...v2.3.0
[2.2.1]: https://github.com/yakhyo/uniface/compare/v2.2.0...v2.2.1
[2.2.0]: https://github.com/yakhyo/uniface/compare/v2.0.0...v2.2.0
[2.0.0]: https://github.com/yakhyo/uniface/releases/tag/v2.0.0

View File

@@ -59,12 +59,12 @@ This project uses [Ruff](https://docs.astral.sh/ruff/) for linting and formattin
#### General Rules
- **Line length:** 120 characters maximum
- **Python version:** 3.10+ (use modern syntax)
- **Python version:** 3.11+ (use modern syntax)
- **Quote style:** Single quotes for strings, double quotes for docstrings
#### Type Hints
Use modern Python 3.10+ type hints (PEP 585 and PEP 604):
Use modern Python 3.11+ type hints (PEP 585 and PEP 604):
```python
# Preferred (modern)

View File

@@ -3,7 +3,7 @@
<div align="center">
[![PyPI Version](https://img.shields.io/pypi/v/uniface.svg?label=Version)](https://pypi.org/project/uniface/)
[![Python Version](https://img.shields.io/badge/Python-3.10%2B-blue)](https://www.python.org/)
[![Python Version](https://img.shields.io/badge/Python-3.11%2B-blue)](https://www.python.org/)
[![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
[![Github Build Status](https://github.com/yakhyo/uniface/actions/workflows/ci.yml/badge.svg)](https://github.com/yakhyo/uniface/actions)
[![PyPI Downloads](https://static.pepy.tech/personalized-badge/uniface?period=total&units=INTERNATIONAL_SYSTEM&left_color=GRAY&right_color=BLUE&left_text=Downloads)](https://pepy.tech/projects/uniface)

View File

@@ -32,7 +32,7 @@ ruff check . --fix
**Guidelines:**
- Line length: 120
- Python 3.10+ type hints
- Python 3.11+ type hints
- Google-style docstrings
---

View File

@@ -13,7 +13,7 @@ template: home.html
<p class="hero-subtitle">All-in-One Open-Source Face Analysis Library</p>
[![PyPI Version](https://img.shields.io/pypi/v/uniface.svg?label=Version)](https://pypi.org/project/uniface/)
[![Python Version](https://img.shields.io/badge/Python-3.10%2B-blue)](https://www.python.org/)
[![Python Version](https://img.shields.io/badge/Python-3.11%2B-blue)](https://www.python.org/)
[![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
[![Github Build Status](https://github.com/yakhyo/uniface/actions/workflows/ci.yml/badge.svg)](https://github.com/yakhyo/uniface/actions)
[![PyPI Downloads](https://static.pepy.tech/personalized-badge/uniface?period=total&units=INTERNATIONAL_SYSTEM&left_color=GRAY&right_color=BLUE&left_text=Downloads)](https://pepy.tech/projects/uniface)

View File

@@ -6,7 +6,7 @@ This guide covers all installation options for UniFace.
## Requirements
- **Python**: 3.10 or higher
- **Python**: 3.11 or higher
- **Operating Systems**: macOS, Linux, Windows
---
@@ -159,11 +159,11 @@ print("Installation successful!")
### Import Errors
If you encounter import errors, ensure you're using Python 3.10+:
If you encounter import errors, ensure you're using Python 3.11+:
```bash
python --version
# Should show: Python 3.10.x or higher
# Should show: Python 3.11.x or higher
```
### Model Download Issues

View File

@@ -1,6 +1,6 @@
[project]
name = "uniface"
version = "3.1.0"
version = "3.1.1"
description = "UniFace: A Comprehensive Library for Face Detection, Recognition, Tracking, Landmark Analysis, Face Parsing, Gaze Estimation, Age, and Gender Detection"
readme = "README.md"
license = "MIT"
@@ -9,7 +9,7 @@ maintainers = [
{ name = "Yakhyokhuja Valikhujaev", email = "yakhyo9696@gmail.com" },
]
requires-python = ">=3.10,<3.14"
requires-python = ">=3.11,<3.15"
keywords = [
"face-detection",
"face-recognition",
@@ -34,17 +34,17 @@ classifiers = [
"Intended Audience :: Science/Research",
"Operating System :: OS Independent",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Programming Language :: Python :: 3.14",
]
dependencies = [
"numpy>=1.21.0",
"opencv-python>=4.5.0",
"onnxruntime>=1.16.0",
"scikit-image>=0.19.0",
"scikit-image>=0.26.0",
"scipy>=1.7.0",
"requests>=2.28.0",
"tqdm>=4.64.0",
@@ -73,7 +73,7 @@ uniface = ["py.typed"]
[tool.ruff]
line-length = 120
target-version = "py310"
target-version = "py311"
exclude = [
".git",
".ruff_cache",

View File

@@ -1,7 +1,7 @@
numpy>=1.21.0
opencv-python>=4.5.0
onnxruntime>=1.16.0
scikit-image>=0.19.0
scikit-image>=0.26.0
scipy>=1.7.0
requests>=2.28.0
tqdm>=4.64.0

View File

@@ -29,7 +29,7 @@ from __future__ import annotations
__license__ = 'MIT'
__author__ = 'Yakhyokhuja Valikhujaev'
__version__ = '3.1.0'
__version__ = '3.1.1'
import contextlib

View File

@@ -71,8 +71,7 @@ def estimate_norm(
alignment[:, 0] += diff_x
# Compute the transformation matrix
transform = SimilarityTransform()
transform.estimate(landmark, alignment)
transform = SimilarityTransform.from_estimate(landmark, alignment)
matrix = transform.params[0:2, :]
inverse_matrix = np.linalg.inv(transform.params)[0:2, :]