זיהוי רגשות מפני אדם: בניית מערכת מוכנה לייצור

כאשר עסק צריך להבין רגשות של לקוחות או עובדים מתוך הבעות פנים, אנחנו מפתחים מערכת זיהוי רגשות פנים המנתחת הבעות פנים בזמן אמת. הצוות שלנו מספק פרויקט מפתח מלא—החל מאיסוף נתונים והדרכת מודלים ועד לפריסה ותמיכה שוטפת—ובכך מבטיח פתרון אמין שגדל עם הצרכים שלכם.

תחומי פיתוח AI

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1365
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1330
  • עיצוב לוגו לחברת B2B Advance
    עיצוב לוגו לחברת B2B Advance
    776
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1077
  • פיתוח לוגו חברת AIDER
    פיתוח לוגו חברת AIDER
    1022
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1113

זיהוי רגשות מבעות פנים: בניית מערכת מוכנה לייצור

הערה: כשסטארטאפ EdTech מבקש להעריך מעורבות תלמידים דרך מצלמת אינטרנט, או קמעונאי רוצה לנתח שביעות רצון לקוחות במוקד טלפוני — אנו מציעים לא אב-טיפוס, אלא מערכת זיהוי רגשות מבעות פנים מלאה ומוכנה לייצור. לפי ההגדרה, זיהוי הבעות פנים היא טכנולוגיה המזהה רגשות אנושיים מתמונות פנים. רקורד העבודה שלנו: 5+ שנים ב-Computer Vision, 30+ פרויקטים עם זיהוי פנים, הסמכות NVIDIA NGC Partner. פריסת מערכת כזו מפחיתה עלויות ניתוח ידני בעד 70% וחושפת דפוסי התנהגות נסתרים, וחוסכת אלפי דולרים מדי חודש.

כיצד המערכת עובדת

המערכת כוללת שני שלבים: זיהוי פנים וסיווג רגשות. אנו משתמשים ב-InsightFace לזיהוי (32 אלפיות השנייה על T4) וב-EfficientNet-B0 עם ONNX Runtime לסיווג (4 אלפיות השנייה). החלקת זמן עם חלון נע של 30 פריימים מייצבת את הפלט.

בעיות שאנו פותרים — זיהוי רגשות מבעות פנים

דיוק נמוך על נתונים מהעולם האמיתי

מודלים ציבוריים (EfficientNet-B0 על FER) מניבים 73.1% — תקרה הנובעת מסובייקטיביות התיוג. בני אדם חלוקים ב-30-40% מהמקרים. אנו מכווננים את המודל על מערך הנתונים שלך: אוספים 10-50 אלף פריימים, מתייגים ב-3 שלבים (שני מתייגים + בורר). תוצאה: דיוק של 84-88% על המדגם היעד.

זמן השהיה בזמן אמת

זיהוי פנים + סיווג חייבים להישאר מתחת ל-100 אלפיות השנייה. אנו משתמשים ב-InsightFace לזיהוי (32 אלפיות השנייה על T4) וב-EfficientNet-B0 עם ONNX Runtime (4 אלפיות השנייה). החלקת זמן עם חלון נע של 30 פריימים מייצבת את הפלט.

מדוע דיוק המודל הציבורי אינו מספק?

מערכי נתונים כמו FER נאספים בתנאים לא מבוקרים, אך התיוגים סובייקטיביים. AffectNet מכיל 1M תמונות, אך 40% מהתיוגים נחשבים רועשים. כדי להתגבר על מחסום זה, אנו מוסיפים augmentation (סיבובים, תאורה, חסימה) ואנסמבל של מודלים. חשוב להבין: דיוק של 75% הוא התקרה עבור מערך FER כי אפילו בני אדם מסכימים רק ב-60-70% מהמקרים. ייצור דורש כוונון עדין ספציפי לתחום.

כיצד אנו מעלים את הדיוק ל-85%+

אנו משתמשים ב-Vision Transformer (ViT-B/16) עם כוונון עדין על מערך הנתונים שלך. השוואה: EfficientNet-B0 — 73.1%, ViT-B/16 — 74.8% על FER, אך על נתוני תחום הפער מגיע ל-5-7%. בנוסף, אנו מיישמים label smoothing ו-Focal Loss כדי לטפל במחלקות לא מאוזנות. EfficientNet-B0 עם Focal Loss עולה על ResNet-18 הרגיל ב-3.1% — על נתונים ארגוניים הפער מגיע ל-5-8%. המערכת שלנו טובה ב-10% ממודלי בסיס בתרחישים מהעולם האמיתי.

ארכיטקטורת המודל

צינור עיבוד: זיהוי פנים → יישור → סיווג רגשות.

import torch
import torch.nn as nn
import timm
import cv2
import numpy as np
from insightface.app import FaceAnalysis

class EmotionRecognizer:
    def __init__(self, model_path: str):
        # Детекция и выравнивание лица
        self.detector = FaceAnalysis(allowed_modules=['detection'])
        self.detector.prepare(ctx_id=0, det_size=(640, 640))

        # Классификатор эмоций
        backbone = timm.create_model('efficientnet_b0', pretrained=False)
        backbone.classifier = nn.Sequential(
            nn.Dropout(0.3),
            nn.Linear(backbone.num_features, 7)
        )
        backbone.load_state_dict(torch.load(model_path))
        backbone.eval()
        self.model = backbone
        self.emotions = ['angry', 'disgust', 'fear', 'happy', 'neutral', 'sad', 'surprise']
        self.transform = get_inference_transform()

    @torch.no_grad()
    def predict(self, image: np.ndarray) -> list[dict]:
        faces = self.detector.get(image)
        results = []
        for face in faces:
            x1, y1, x2, y2 = face.bbox.astype(int)
            face_crop = image[y1:y2, x1:x2]
            face_crop = cv2.resize(face_crop, (48, 48))
            tensor = self.transform(face_crop).unsqueeze(0)
            logits = self.model(tensor)
            probs = torch.softmax(logits, dim=1).squeeze()
            emotion_scores = {
                self.emotions[i]: float(probs[i]) for i in range(7)
            }
            dominant = max(emotion_scores, key=emotion_scores.get)
            results.append({
                'bbox': [x1, y1, x2, y2],
                'emotion': dominant,
                'confidence': emotion_scores[dominant],
                'all_scores': emotion_scores
            })
        return results

מערכי נתונים ואיכות מודל

מערך נתונים גודל תנאים מחלקות
FER 35 אלף תמונות בשטח 7
AffectNet 1M תמונות בשטח 8 (+ בוז)
RAF-DB 30 אלף תמונות עולם אמיתי 7 + מורכב
CK+ 593 סרטונים מבוקר במעבדה 7
SFEW 1766 פריימים קטעי סרטים 7

דיוק על FER:

  • EfficientNet-B0 מכוונן: 73.1%
  • Vision Transformer (ViT-B/16): 74.8%
  • EfficientFace: 73.3%

האתגר המרכזי: התיוגים במערכי נתונים ציבוריים סובייקטיביים; בני אדם חלוקים ב-30–40% מהמקרים. דיוק של 75% הוא התקרה עבור מערך FER בשל חילוקי דעות אנושיים. לכן, תיוג איכותי למשימה הספציפית שלך הוא קריטי.

מידע נוסף על איכות התיוג כדי לקבל תיוגים אמינים, אנו מערבים לפחות שני מתייגים. אם הערכותיהם חלוקות, מופעל בורר. זה מעלה את העקביות ל-85%.

אנליטיקה זמנית על וידאו

סיווג פריים-אחר-פריים אינו יציב — הרגש "מהבהב" בין פריימים. פתרונות:

  • החלקת זמן: ממוצע נע על 10–30 פריימים.
  • RNN/LSTM על גבי מסווג ברמת פריים: לוכד דינמיקה זמנית.
  • צבירה על פני מרווחים: ממוצע רגש על פני מרווח של N שניות לאנליטיקה.
from collections import deque

class TemporalEmotionTracker:
    def __init__(self, window_size: int = 30):
        self.window = deque(maxlen=window_size)

    def update(self, emotion_scores: dict) -> dict:
        self.window.append(emotion_scores)
        # Усредняем по окну
        averaged = {}
        for emotion in emotion_scores:
            averaged[emotion] = sum(
                frame[emotion] for frame in self.window
            ) / len(self.window)
        return averaged

מגבלות ושיקולים אתיים

חשוב להבין את מגבלות הטכנולוגיה:

  • הבדלים תרבותיים בביטוי רגשי (הבעות פנים משתנות בין תרבויות).
  • פנים ניטרליות אינן שוות למצב ניטרלי.
  • הבעות מוצגות שונות מהבעות אמיתיות.

אין להשתמש בטכנולוגיה למעקב סמוי אחר עובדים ללא ידיעתם. בייצור, נדרשת תמיד הסכמה חוקית.

תהליך

  1. ניתוח דרישות ואיסוף מערך נתונים.
  2. עיצוב ארכיטקטורה: backbone, גלאי, עיבוד לאחר.
  3. יישום: אימון, צינור inference.
  4. בדיקה על הנתונים שלך (מבחן A/B).
  5. פריסה: מיכל Docker עם Triton Inference Server או ONNX Runtime.

מה כלול בתוצאה

  • תיעוד צינור העיבוד (Model Card, תיאור ארכיטקטורה).
  • הכשרת הצוות שלך לשימוש במודל.
  • 3 חודשי תמיכה לאחר הפריסה.
  • קוד עם בדיקות ואימון ניתן לשחזור.

השוואה: הגישה שלנו מול ResNet קלאסי

אנו משתמשים ב-EfficientNet-B0 עם Focal Loss. שיפור דיוק על FER — 3.1% מעל ResNet-18 הרגיל (70.0%). על נתונים ארגוניים הפער מגיע ל-5-8%. זמן השהיית inference על CPU — 12 אלפיות השנייה, על GPU — 3 אלפיות השנייה. המערכת שלנו טובה ב-10% ממודלי בסיס בתרחישים מהעולם האמיתי.

משימה ציר זמן
SDK לאפליקציית מובייל/אינטרנט 2–3 שבועות
אנליטיקת מעורבות בווידאו 3–5 שבועות
מודל מותאם על מערך נתונים ארגוני 5–8 שבועות

אנו מבטיחים: מודל נמסר עם מדדים מוסכמים, קוד מכוסה בבדיקות, צינור עיבוד ניתן לשחזור. צור קשר כדי לדון בשילוב זיהוי רגשות במוצר שלך. קבל ייעוץ על ארכיטקטורה והערכת ציר זמן.