مقدمه
در قسمت اول، با پیشرفتهای تشخیص چهره در سال ۲۰۲۵ آشنا شدیم: دقت ۹۹.۸٪، Capsule Networks، Liveness Detection، کاربردها در فرودگاهها، بیمارستانها و چالشهای اخلاقی و امنیتی. اما بهترین بخش هوش مصنوعی این است که دیگر فقط برای شرکتهای بزرگ نیست. شما همین امروز میتوانید یک سیستم تشخیص چهره حرفهای، مقاوم به deepfake بسازید. در این قسمت، یک سیستم تشخیص چهره کامل، از صفر تا صد، با بهترین ابزارهای متنباز سال ۲۰۲۵ میسازیم که با ماسک، نور کم و زوایای عجیب کار میکند، در برابر deepfake و عکس چاپی مقاوم است، در کمتر از ۰.۳ ثانیه هویت را شناسایی میکند، روی CPU معمولی اجرا میشود (بدون نیاز به GPU گرانقیمت) و یک صفحه کاربری زیبا و حرفهای با Streamlit دارد.
مرحله اول: تشخیص و همترازی چهره (Face Detection + Alignment)
- دقت تشخیص ۹۹.۸٪ در دیتاستهای واقعی دارد،
- با ماسک، عینک، کلاه و زوایای تا ۹۰ درجه کار میکند،
- ۱۰۶ نقطه کلیدی (landmark) دقیق ارائه میدهد،
- روی CPU در کمتر از ۳۰ میلیثانیه اجرا میشود.
# مرحله ۱: تشخیص و همترازی چهره
import cv2
from insightface.app import FaceAnalysis
# بارگذاری مدل buffalo_l — بهترین مدل متنباز ۲۰۲۵
app = FaceAnalysis(
name="buffalo_l",
providers=['CUDAExecutionProvider', 'CPUExecutionProvider']
)
app.prepare(ctx_id=0, det_size=(640, 640)) # ctx_id=0 برای GPU، -1 برای CPU
def detect_and_align(image_path):
img = cv2.imread(image_path)
faces = app.get(img)
if len(faces) == 0:
print("هیچ چهرهای تشخیص داده نشد!")
return None, img
# انتخاب بهترین تشخیص (بالاترین امتیاز)
best_face = max(faces, key=lambda x: x.det_score)
bbox = best_face.bbox.astype(int)
# رسم مستطیل سبز دور چهره
cv2.rectangle(img, (bbox[0], bbox[1]), (bbox[2], bbox[3]), (0, 255, 0), 3)
cv2.putText(img, f"Score: {best_face.det_score:.3f}",
(bbox[0], bbox[1]-10), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0,255,0), 2)
# رسم ۵ نقطه کلیدی (چشمها، بینی، دهان)
landmarks = best_face.landmark_2d_106
for point in landmarks[[30, 35, 60, 66, 93]]: # چشم چپ، چشم راست، بینی، لبها
cv2.circle(img, (int(point[0]), int(point[1])), 4, (0, 0, 255), -1)
cv2.imwrite("output_detected.jpg", img)
print(f"چهره با موفقیت تشخیص داده شد! امتیاز: {best_face.det_score:.3f}")
return best_face, img
# تست
face, result_img = detect_and_align("test.jpg")
مرحله دوم: تولید امضای دیجیتال چهره (Face Embedding)
# مرحله ۲: تولید امضای دیجیتال چهره
def get_face_embedding(face):
if face is None:
return None
return face.normed_embedding # وکتور ۵۱۲ بعدی نرمالشده
# ساخت دیتابیس افراد شناختهشده
known_faces = {}
def add_known_person(name, image_path):
face, _ = detect_and_align(image_path)
if face:
embedding = get_face_embedding(face)
known_faces[name] = embedding
print(f"{name} به دیتابیس اضافه شد.")
else:
print(f"خطا در اضافه کردن {name}")
# اضافه کردن افراد شناختهشده
add_known_person("احمد رضایی", "known/ahmad.jpg")
add_known_person("سارا محمدی", "known/sara.jpg")
add_known_person("دکتر حسینی", "known/hosseini.jpg")
print(f"دیتابیس آماده شد — {len(known_faces)} نفر ثبت شده.")
مرحله سوم: شناسایی هویت
# مرحله ۳: شناسایی هویت
from scipy.spatial.distance import cosine
def recognize_face(embedding, threshold=0.38):
if embedding is None:
return "ناشناس", 0.0
best_match = "ناشناس"
highest_similarity = 0.0
for name, known_emb in known_faces.items():
# محاسبه شباهت (۱ - فاصله کسینوسی)
similarity = 1 - cosine(embedding, known_emb)
if similarity > highest_similarity:
highest_similarity = similarity
best_match = name
# تصمیمگیری نهایی
if highest_similarity > (1 - threshold):
return best_match, highest_similarity
else:
return "ناشناس", highest_similarity
# تست شناسایی
test_face, _ = detect_and_align("test_unknown.jpg")
if test_face:
name, confidence = recognize_face(get_face_embedding(test_face))
print(f"شناسایی شد: {name} — اطمینان: {confidence:.1%}")
مرحله چهارم: تشخیص زنده بودن (Liveness Detection)، ضد Deepfake
امروزه یکی از بزرگترین تهدیدها، deepfake و عکس چاپی است. اینجا با DeepFace و مدل ضد جعل، سیستم را ایمن میکنیم.
# مرحله ۴: تشخیص زنده بودن (ضد Deepfake)
from deepface import DeepFace
def check_liveness(image_path):
try:
result = DeepFace.extract_faces(
img_path=image_path,
anti_spoofing=True,
enforce_detection=False
)
face_obj = result[0]
is_real = face_obj["anti_spoofing"]["is_real"]
spoof_score = face_obj["anti_spoofing"]["score"]
if is_real and spoof_score > 0.7:
print(f"واقعی است! امتیاز زنده بودن: {spoof_score:.3f}")
return True, spoof_score
else:
print(f"هشدار: جعلی تشخیص داده شد! امتیاز: {spoof_score:.3f}")
return False, spoof_score
except Exception as e:
print("خطا در تشخیص زنده بودن:", e)
return False, 0.0
# تست
is_live, score = check_liveness("test_live.jpg")
مرحله پنجم: برنامه تحت وب با Streamlit
حالا همه چیز را در یک صفحه کاربرپسند نشان میدهیم.
# فایل: app.py
import streamlit as st
from PIL import Image
import cv2
import numpy as np
st.set_page_config(page_title="تشخیص چهره ۲۰۲۵", layout="centered")
st.title("سیستم تشخیص چهره حرفهای — سال ۲۰۲۵")
st.caption("ساختهشده با بهترین مدلهای متنباز | دقت ۹۹.۵٪+ | ضد Deepfake")
uploaded_file = st.file_uploader(
"عکس خود را آپلود کنید",
type=["jpg", "jpeg", "png"],
help="عکس واضح از چهره بگیرید"
)
if uploaded_file:
image = Image.open(uploaded_file)
st.image(image, caption="عکس دریافت شد", width=300)
image.save("temp_upload.jpg")
with st.spinner("در حال تحلیل چهره..."):
# تشخیص چهره
face, result_img = detect_and_align("temp_upload.jpg")
if face:
# شناسایی
name, confidence = recognize_face(get_face_embedding(face))
# تشخیص زنده بودن
is_live, live_score = check_liveness("temp_upload.jpg")
st.image(result_img, caption="نتیجه تشخیص")
col1, col2 = st.columns(2)
with col1:
st.success(f"شناسایی: **{name}**")
st.metric("اطمینان شناسایی", f"{confidence:.1%}")
with col2:
if is_live:
st.success("واقعی است!")
st.metric("امتیاز زنده بودن", f"{live_score:.3f}")
else:
st.error("هشدار: ممکن است جعلی باشد!")
else:
st.error("چهرهای در عکس پیدا نشد.")
جمعبندی
شما اکنون توانستید یک سیستم ساده تشخیص چهره بسازید. با وبلاگ ابررایانه سیمرغ همراه باشید تا مفاهیم مورد علاقه خود را یاد بگیرید.
سوالات متداول
-
تشخیص چهره (Face Recognition) دقیقاً چیست؟
- تفاوت تشخیص چهره با شناسایی چهره (Face Detection) چیست؟
- چگونه از deepfake و جعل چهره جلوگیری میکند؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
ثبت نظر