mirror of
https://github.com/yakhyo/uniface.git
synced 2025-12-30 09:02:25 +00:00
fix: Fix type conversion and remove redundant type conversion (#29)
* ref: Remove type conversion and update face class * fix: change the type to float32 * chore: Update all examples, testing with latest version * docs: Update docs reflecting the recent changes
This commit is contained in:
committed by
GitHub
parent
f4458f0550
commit
3982d677a9
File diff suppressed because one or more lines are too long
@@ -13,9 +13,17 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Note: you may need to restart the kernel to use updated packages.\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"%pip install -q uniface"
|
||||
]
|
||||
@@ -29,14 +37,14 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"1.3.0\n"
|
||||
"1.3.1\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -65,7 +73,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -95,7 +103,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -136,7 +144,7 @@
|
||||
"\n",
|
||||
" # Print face attributes\n",
|
||||
" for i, face in enumerate(faces, 1):\n",
|
||||
" print(f' Face {i}: {face.gender}, {face.age}y')\n",
|
||||
" print(f' Face {i}: {face.sex}, {face.age}y')\n",
|
||||
"\n",
|
||||
" # Prepare visualization (without text overlay)\n",
|
||||
" vis_image = image.copy()\n",
|
||||
@@ -159,7 +167,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -186,7 +194,7 @@
|
||||
" axes[1, idx].axis('off')\n",
|
||||
" info_text = f'{len(faces)} face(s)\\n'\n",
|
||||
" for i, face in enumerate(faces, 1):\n",
|
||||
" info_text += f'Face {i}: {face.gender}, {face.age}y\\n'\n",
|
||||
" info_text += f'Face {i}: {face.sex}, {face.age}y\\n'\n",
|
||||
"\n",
|
||||
" axes[1, idx].text(0.5, 0.5, info_text,\n",
|
||||
" ha='center', va='center',\n",
|
||||
@@ -207,7 +215,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -236,7 +244,7 @@
|
||||
" print(f' - Confidence: {face.confidence:.3f}')\n",
|
||||
" print(f' - Landmarks shape: {face.landmarks.shape}')\n",
|
||||
" print(f' - Age: {face.age} years')\n",
|
||||
" print(f' - Gender: {face.gender}')\n",
|
||||
" print(f' - Gender: {face.sex}')\n",
|
||||
" print(f' - Embedding shape: {face.embedding.shape}')\n",
|
||||
" print(f' - Embedding dimension: {face.embedding.shape[1]}D')"
|
||||
]
|
||||
@@ -252,14 +260,14 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Similarity between faces: 0.1201\n",
|
||||
"Similarity between faces: 0.1135\n",
|
||||
"Same person: No (threshold=0.6)\n"
|
||||
]
|
||||
}
|
||||
@@ -283,7 +291,7 @@
|
||||
"\n",
|
||||
"- `analyzer.analyze()` performs detection, recognition, and attribute prediction in one call\n",
|
||||
"- Each `Face` object contains: `bbox`, `confidence`, `landmarks`, `embedding`, `age`, `gender`\n",
|
||||
"- Gender is available as both ID (0=Female, 1=Male) and string via `face.gender` property\n",
|
||||
"- Gender is available as both ID (0=Female, 1=Male) and string via `face.sex` property\n",
|
||||
"- Face embeddings are L2-normalized (norm ≈ 1.0) for similarity computation\n",
|
||||
"- Use `face.compute_similarity(other_face)` to compare faces (returns cosine similarity)\n",
|
||||
"- Typical similarity threshold: 0.6 (same person if similarity > 0.6)"
|
||||
@@ -297,7 +305,7 @@
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3",
|
||||
"display_name": "base",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
@@ -311,7 +319,7 @@
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.10.0"
|
||||
"version": "3.13.5"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
||||
@@ -13,9 +13,17 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Note: you may need to restart the kernel to use updated packages.\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"%pip install -q uniface"
|
||||
]
|
||||
@@ -29,14 +37,14 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"1.3.0\n"
|
||||
"1.3.1\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -61,7 +69,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -88,7 +96,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -99,7 +107,7 @@
|
||||
"<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=1024x624>"
|
||||
]
|
||||
},
|
||||
"execution_count": 3,
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
@@ -119,7 +127,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -175,7 +183,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -222,7 +230,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -11,15 +11,6 @@
|
||||
"## 1. Install UniFace"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"%pip install -q uniface"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
@@ -29,7 +20,24 @@
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"1.3.0\n"
|
||||
"Note: you may need to restart the kernel to use updated packages.\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"%pip install -q uniface"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"1.3.1\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -56,7 +64,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -72,12 +80,12 @@
|
||||
"analyzer = FaceAnalyzer(\n",
|
||||
" detector=RetinaFace(conf_thresh=0.5),\n",
|
||||
" recognizer=ArcFace()\n",
|
||||
")\n"
|
||||
")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -99,12 +107,12 @@
|
||||
"faces1 = analyzer.analyze(image1)\n",
|
||||
"faces2 = analyzer.analyze(image2)\n",
|
||||
"\n",
|
||||
"print(f'Detected {len(faces1)} and {len(faces2)} faces')\n"
|
||||
"print(f'Detected {len(faces1)} and {len(faces2)} faces')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -130,31 +138,7 @@
|
||||
"axes[1].axis('off')\n",
|
||||
"\n",
|
||||
"plt.tight_layout()\n",
|
||||
"plt.show()\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Similarity: 0.1201\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"if faces1 and faces2:\n",
|
||||
" face1 = faces1[0]\n",
|
||||
" face2 = faces2[0]\n",
|
||||
"\n",
|
||||
" similarity = face1.compute_similarity(face2)\n",
|
||||
" print(f'Similarity: {similarity:.4f}')\n",
|
||||
"else:\n",
|
||||
" print('Error: Could not detect faces')\n"
|
||||
"plt.show()"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -166,7 +150,31 @@
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Similarity: 0.1201\n",
|
||||
"Similarity: 0.1135\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"if faces1 and faces2:\n",
|
||||
" face1 = faces1[0]\n",
|
||||
" face2 = faces2[0]\n",
|
||||
"\n",
|
||||
" similarity = face1.compute_similarity(face2)\n",
|
||||
" print(f'Similarity: {similarity:.4f}')\n",
|
||||
"else:\n",
|
||||
" print('Error: Could not detect faces')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Similarity: 0.1135\n",
|
||||
"Threshold: 0.6\n",
|
||||
"Result: Different people\n"
|
||||
]
|
||||
@@ -180,12 +188,12 @@
|
||||
"\n",
|
||||
" print(f'Similarity: {similarity:.4f}')\n",
|
||||
" print(f'Threshold: {THRESHOLD}')\n",
|
||||
" print(f'Result: {\"Same person\" if is_same_person else \"Different people\"}')\n"
|
||||
" print(f'Result: {\"Same person\" if is_same_person else \"Different people\"}')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"execution_count": 8,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -193,9 +201,9 @@
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Comparing multiple pairs:\n",
|
||||
"image0.jpg vs image1.jpg: 0.1201\n",
|
||||
"image0.jpg vs image2.jpg: 0.0951\n",
|
||||
"image1.jpg vs image2.jpg: -0.0047\n"
|
||||
"image0.jpg vs image1.jpg: 0.1135\n",
|
||||
"image0.jpg vs image2.jpg: 0.0833\n",
|
||||
"image1.jpg vs image2.jpg: -0.0082\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -220,7 +228,7 @@
|
||||
" img1_name = img1_path.split('/')[-1]\n",
|
||||
" img2_name = img2_path.split('/')[-1]\n",
|
||||
"\n",
|
||||
" print(f'{img1_name} vs {img2_name}: {sim:.4f}')\n"
|
||||
" print(f'{img1_name} vs {img2_name}: {sim:.4f}')"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user