مرا به خاطر بسپار

تشخیص چهره چیست؟ (بخش دوم)

بازدید: 229 آخرین به‌روزرسانی: 17 آذر 1404

مقدمه

در قسمت اول، با پیشرفت‌های تشخیص چهره در سال ۲۰۲۵ آشنا شدیم: دقت ۹۹.۸٪، Capsule Networks، Liveness Detection، کاربردها در فرودگاه‌ها، بیمارستان‌ها و چالش‌های اخلاقی و امنیتی. اما بهترین بخش هوش مصنوعی این است که دیگر فقط برای شرکت‌های بزرگ نیست. شما همین امروز می‌توانید یک سیستم تشخیص چهره حرفه‌ای، مقاوم به deepfake بسازید. در این قسمت، یک سیستم تشخیص چهره کامل، از صفر تا صد، با بهترین ابزارهای متن‌باز سال ۲۰۲۵ می‌سازیم که با ماسک، نور کم و زوایای عجیب کار می‌کند، در برابر deepfake و عکس چاپی مقاوم است، در کمتر از ۰.۳ ثانیه هویت را شناسایی می‌کند، روی CPU معمولی اجرا می‌شود (بدون نیاز به GPU گران‌قیمت) و یک صفحه کاربری زیبا و حرفه‌ای با Streamlit دارد.

مرحله اول: تشخیص و هم‌ترازی چهره (Face Detection + Alignment)

اولین و مهم‌ترین مرحله در هر سیستم تشخیص چهره، تشخیص دقیق وجود چهره و هم‌ترازی صحیح آن است. بدون این مرحله، حتی بهترین مدل‌های شناسایی هم شکست می‌خورند.
در سال ۲۰۲۵، مدل buffalo_l از پروژه InsightFace به عنوان استاندارد طلایی متن‌باز شناخته شد. این مدل:
  • دقت تشخیص ۹۹.۸٪ در دیتاست‌های واقعی دارد،
  • با ماسک، عینک، کلاه و زوایای تا ۹۰ درجه کار می‌کند،
  • ۱۰۶ نقطه کلیدی (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)

حالا که چهره را پیدا کردیم، باید آن را به یک کد عددی منحصربه‌فرد تبدیل کنیم؛ مثل اثر انگشت دیجیتال.
این کد (Embedding) یک بردار ۵۱۲ بعدی است که تمام ویژگی‌های منحصربه‌فرد صورت را در خود نگه می‌دارد. مدل buffalo_l این بردار را به‌صورت نرمال‌شده تولید می‌کند، یعنی آماده مقایسه مستقیم است.
# مرحله ۲: تولید امضای دیجیتال چهره
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)} نفر ثبت شده.")

مرحله سوم: شناسایی هویت

حالا قلب سیستم: مقایسه چهره جدید با پایگاه داده.
از فاصله کسینوسی (Cosine Distance) استفاده می‌کنیم ساده، سریع و دقیق. آستانه ۰.۳۸ امروزه به‌عنوان استاندارد طلایی شناخته می‌شود.
# مرحله ۳: شناسایی هویت
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("چهره‌ای در عکس پیدا نشد.")

جمع‌بندی

شما اکنون توانستید یک سیستم ساده تشخیص چهره بسازید. با وبلاگ ابررایانه سیمرغ همراه باشید تا مفاهیم مورد علاقه خود را یاد بگیرید.

سوالات متداول

  1. تشخیص چهره (Face Recognition) دقیقاً چیست؟
فناوری هوش مصنوعی است که با تحلیل ویژگی‌های منحصربه‌فرد صورت (مثل فاصله چشم‌ها، شکل بینی و فک) هویت افراد را شناسایی یا تأیید می‌کند.
  1. تفاوت تشخیص چهره با شناسایی چهره (Face Detection) چیست؟
تشخیص چهره فقط می‌گوید اینجا یک صورت هست، اما شناسایی چهره می‌گوید این صورت متعلق به کیست.
  1. چگونه از deepfake و جعل چهره جلوگیری می‌کند؟
با فناوری Liveness Detection (تشخیص زنده بودن) که حرکت چشم، بافت پوست و عمق 3 بعدی را بررسی می‌کند.
تا چه حد این مطلب برای شما مفید بود؟
بر اساس رای 0 نفر

اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.

ثبت نظر

نظر دادن