| # Hướng dẫn sử dụng DeepPrint ONNX Model | |
| File ONNX model này chỉ chứa **DeepPrint model** (không có LoFTR). LoFTR là bước tiền xử lý riêng biệt. | |
| ## File ONNX Model | |
| - **Đường dẫn**: `onnx_models/deepprint_fvc_db1_loftr_final.onnx` | |
| - **Input**: `input_image` - shape `[batch_size, 1, 299, 299]` (grayscale image) | |
| - **Outputs**: | |
| - `texture_embeddings`: shape `[batch_size, 256]` | |
| - `minutia_embeddings`: shape `[batch_size, 256]` | |
| ## Cài đặt | |
| ```bash | |
| pip install onnxruntime | |
| ``` | |
| ## Cách sử dụng | |
| ### 1. Sử dụng script có sẵn | |
| ```bash | |
| # Extract embedding từ 1 ảnh | |
| python use_onnx_model.py --image1 path/to/fingerprint.tif | |
| # So sánh 2 ảnh fingerprint | |
| python use_onnx_model.py --image1 path/to/image1.tif --image2 path/to/image2.tif --threshold 0.5 | |
| ``` | |
| ### 2. Sử dụng trong code Python | |
| ```python | |
| import numpy as np | |
| import onnxruntime as ort | |
| from PIL import Image | |
| import torchvision.transforms.functional as VTF | |
| import sys | |
| # Add DeepPrint path | |
| sys.path.append("deepprint/fixed-length-fingerprint-extractors") | |
| from flx.image_processing.binarization import LazilyAllocatedBinarizer | |
| from flx.data.image_helpers import pad_and_resize_to_deepprint_input_size | |
| # Load ONNX model | |
| onnx_model_path = "onnx_models/deepprint_fvc_db1_loftr_final.onnx" | |
| session = ort.InferenceSession(onnx_model_path) | |
| # Preprocess image | |
| def preprocess_image(image_path): | |
| img = Image.open(image_path).convert('L') | |
| img_tensor = VTF.to_tensor(img) | |
| # Binarize fingerprint | |
| binarizer = LazilyAllocatedBinarizer(5.0) | |
| img_tensor = binarizer(img_tensor) | |
| # Pad to square and resize to 299x299 | |
| img_tensor = pad_and_resize_to_deepprint_input_size(img_tensor) | |
| img_tensor = img_tensor.unsqueeze(0) # Add batch dimension | |
| return img_tensor.numpy().astype(np.float32) | |
| # Extract embeddings | |
| input_tensor = preprocess_image("path/to/fingerprint.tif") | |
| outputs = session.run(['texture_embeddings', 'minutia_embeddings'], | |
| {'input_image': input_tensor}) | |
| texture_emb = outputs[0][0] # [256] | |
| minutia_emb = outputs[1][0] # [256] | |
| combined_emb = np.concatenate([texture_emb, minutia_emb]) # [512] | |
| # Tính similarity giữa 2 embeddings | |
| def cosine_similarity(emb1, emb2): | |
| emb1_norm = emb1 / (np.linalg.norm(emb1) + 1e-8) | |
| emb2_norm = emb2 / (np.linalg.norm(emb2) + 1e-8) | |
| return np.dot(emb1_norm, emb2_norm) | |
| similarity = cosine_similarity(combined_emb1, combined_emb2) | |
| print(f"Similarity: {similarity:.6f}") | |
| ``` | |
| ## Preprocessing Pipeline | |
| Model yêu cầu preprocessing theo thứ tự sau: | |
| 1. **Load image**: PIL Image (grayscale) | |
| 2. **Convert to tensor**: `VTF.to_tensor()` → shape `[1, H, W]` | |
| 3. **Binarize**: `LazilyAllocatedBinarizer(5.0)` → enhance fingerprint ridges | |
| 4. **Pad & Resize**: `pad_and_resize_to_deepprint_input_size()` → `[1, 299, 299]` | |
| 5. **Add batch dimension**: `unsqueeze(0)` → `[1, 1, 299, 299]` | |