Update app.py
Browse files
app.py
CHANGED
@@ -25,7 +25,7 @@ EN_TO_NL = {
|
|
25 |
"sad": "Verdrietig",
|
26 |
"surprise": "Verrast",
|
27 |
"angry": "Boos",
|
28 |
-
"anger": "Boos",
|
29 |
"disgust": "Walging",
|
30 |
"fear": "Bang",
|
31 |
"contempt": "Minachting",
|
@@ -36,7 +36,7 @@ def to_dutch(label: str) -> str:
|
|
36 |
if not label:
|
37 |
return "Onbekend"
|
38 |
key = label.strip().lower()
|
39 |
-
return EN_TO_NL.get(key, label) # fallback naar
|
40 |
|
41 |
def visualize(image, det_res, fer_res):
|
42 |
output = image.copy()
|
@@ -44,12 +44,10 @@ def visualize(image, det_res, fer_res):
|
|
44 |
|
45 |
for det, fer_type in zip(det_res, fer_res):
|
46 |
bbox = det[0:4].astype(np.int32)
|
47 |
-
# Modelbeschrijving -> NL label
|
48 |
fer_type_str_en = FacialExpressionRecog.getDesc(fer_type)
|
49 |
fer_type_str_nl = to_dutch(fer_type_str_en)
|
50 |
|
51 |
cv.rectangle(output, (bbox[0], bbox[1]), (bbox[0]+bbox[2], bbox[1]+bbox[3]), (0, 255, 0), 2)
|
52 |
-
# Iets grotere en vettere tekst
|
53 |
cv.putText(output, fer_type_str_nl, (bbox[0], max(0, bbox[1] - 10)),
|
54 |
cv.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2, cv.LINE_AA)
|
55 |
|
@@ -67,16 +65,11 @@ def summarize_emotions(fer_res):
|
|
67 |
if not fer_res:
|
68 |
return "## **Geen gezicht gedetecteerd**"
|
69 |
|
70 |
-
# Haal Engelstalige labels uit het model en map naar NL
|
71 |
names_en = [FacialExpressionRecog.getDesc(x) for x in fer_res]
|
72 |
names_nl = [to_dutch(n) for n in names_en]
|
73 |
counts = Counter(names_nl).most_common()
|
74 |
top, top_n = counts[0]
|
75 |
-
|
76 |
-
# Compacte lijst: "Blij (2), Neutraal (1)"
|
77 |
details = ", ".join([f"{name} ({n})" for name, n in counts])
|
78 |
-
|
79 |
-
# Grote headline + toelichting
|
80 |
return f"# **{top}**\n\n_Gedetecteerde emoties: {details}_"
|
81 |
|
82 |
def detect_expression(input_image):
|
@@ -86,7 +79,6 @@ def detect_expression(input_image):
|
|
86 |
|
87 |
dets = detect_model.infer(image)
|
88 |
if dets is None:
|
89 |
-
# Geen gezichten
|
90 |
emotion_md = summarize_emotions([])
|
91 |
return cv.cvtColor(image, cv.COLOR_BGR2RGB), emotion_md
|
92 |
|
@@ -122,8 +114,8 @@ custom_css = """
|
|
122 |
"""
|
123 |
|
124 |
with gr.Blocks(css=custom_css, theme=gr.themes.Default()) as demo:
|
125 |
-
gr.Markdown("## Herkenning van gezichtsuitdrukkingen ")
|
126 |
-
gr.Markdown("Detecteert gezichten en herkent gezichtsuitdrukkingen ")
|
127 |
|
128 |
with gr.Row():
|
129 |
with gr.Column(scale=1):
|
@@ -132,9 +124,9 @@ with gr.Blocks(css=custom_css, theme=gr.themes.Default()) as demo:
|
|
132 |
submit_btn = gr.Button("Verstuur", variant="primary")
|
133 |
clear_btn = gr.Button("Wissen")
|
134 |
with gr.Column(scale=1):
|
135 |
-
#
|
136 |
-
emotion_md = gr.Markdown(value="## **Nog geen resultaat**", elem_id="emotie-uitslag")
|
137 |
output_image = gr.Image(type="numpy", label="Resultaat gezichtsuitdrukking")
|
|
|
138 |
|
139 |
# Output(s) leegmaken bij nieuwe upload
|
140 |
def _clear_output_on_new_image():
|
|
|
25 |
"sad": "Verdrietig",
|
26 |
"surprise": "Verrast",
|
27 |
"angry": "Boos",
|
28 |
+
"anger": "Boos",
|
29 |
"disgust": "Walging",
|
30 |
"fear": "Bang",
|
31 |
"contempt": "Minachting",
|
|
|
36 |
if not label:
|
37 |
return "Onbekend"
|
38 |
key = label.strip().lower()
|
39 |
+
return EN_TO_NL.get(key, label) # fallback naar origineel indien onbekend
|
40 |
|
41 |
def visualize(image, det_res, fer_res):
|
42 |
output = image.copy()
|
|
|
44 |
|
45 |
for det, fer_type in zip(det_res, fer_res):
|
46 |
bbox = det[0:4].astype(np.int32)
|
|
|
47 |
fer_type_str_en = FacialExpressionRecog.getDesc(fer_type)
|
48 |
fer_type_str_nl = to_dutch(fer_type_str_en)
|
49 |
|
50 |
cv.rectangle(output, (bbox[0], bbox[1]), (bbox[0]+bbox[2], bbox[1]+bbox[3]), (0, 255, 0), 2)
|
|
|
51 |
cv.putText(output, fer_type_str_nl, (bbox[0], max(0, bbox[1] - 10)),
|
52 |
cv.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2, cv.LINE_AA)
|
53 |
|
|
|
65 |
if not fer_res:
|
66 |
return "## **Geen gezicht gedetecteerd**"
|
67 |
|
|
|
68 |
names_en = [FacialExpressionRecog.getDesc(x) for x in fer_res]
|
69 |
names_nl = [to_dutch(n) for n in names_en]
|
70 |
counts = Counter(names_nl).most_common()
|
71 |
top, top_n = counts[0]
|
|
|
|
|
72 |
details = ", ".join([f"{name} ({n})" for name, n in counts])
|
|
|
|
|
73 |
return f"# **{top}**\n\n_Gedetecteerde emoties: {details}_"
|
74 |
|
75 |
def detect_expression(input_image):
|
|
|
79 |
|
80 |
dets = detect_model.infer(image)
|
81 |
if dets is None:
|
|
|
82 |
emotion_md = summarize_emotions([])
|
83 |
return cv.cvtColor(image, cv.COLOR_BGR2RGB), emotion_md
|
84 |
|
|
|
114 |
"""
|
115 |
|
116 |
with gr.Blocks(css=custom_css, theme=gr.themes.Default()) as demo:
|
117 |
+
gr.Markdown("## Herkenning van gezichtsuitdrukkingen (FER) met OpenCV DNN")
|
118 |
+
gr.Markdown("Detecteert gezichten en herkent gezichtsuitdrukkingen met YuNet + MobileFaceNet (ONNX).")
|
119 |
|
120 |
with gr.Row():
|
121 |
with gr.Column(scale=1):
|
|
|
124 |
submit_btn = gr.Button("Verstuur", variant="primary")
|
125 |
clear_btn = gr.Button("Wissen")
|
126 |
with gr.Column(scale=1):
|
127 |
+
# Eerst de afbeelding, DAARONDER de emotie-uitslag
|
|
|
128 |
output_image = gr.Image(type="numpy", label="Resultaat gezichtsuitdrukking")
|
129 |
+
emotion_md = gr.Markdown(value="## **Nog geen resultaat**", elem_id="emotie-uitslag")
|
130 |
|
131 |
# Output(s) leegmaken bij nieuwe upload
|
132 |
def _clear_output_on_new_image():
|