gender_analyze / app.py
Caturan's picture
Upload 3 files
0907b4c verified
import cv2
import mediapipe as mp
import numpy as np
import gradio as gr
import pandas as pd
# --- Feature Data ---
FEMALE_BRAIN_FEATURES = [
"Duygusal farkındalık yüksek",
"Empati kurma becerisi güçlü",
"Sözel iletişim becerisi gelişmiş",
"Yüz ifadeleri ve beden dilini anlama konusunda başarılı",
"Multitasking (çoklu görev yürütme) becerisi yüksek",
"Duygusal hafıza güçlü",
"Stres altında sosyal destek arama eğilimi ('tend-and-befriend')",
"Detaylara dikkat yüksek",
"Sosyal ilişkilere hassaslık",
"Yargılayıcı olmadan dinleme becerisi",
"Zamanlama ve organizasyon becerileri gelişmiş",
"Dil merkezleri her iki yarımkürede yaygın",
"İçsel konuşma (self-talk) daha aktif"
]
MALE_BRAIN_FEATURES = [
"Uzamsal zekâ güçlü",
"Problem çözme odaklı yaklaşım",
"Tek işe odaklanma (mono-tasking) yeteneği yüksek",
"Sistematik düşünme eğilimi",
"Rekabetçi davranış eğilimi",
"Risk alma eğilimi daha yüksek",
"Analitik düşünme",
"Duygusal ifadeyi bastırma eğilimi",
"Görsel işleme becerisi güçlü",
"Kısa süreli hedeflere odaklanma eğilimi",
"Motor koordinasyon ve el-göz uyumu güçlü",
"Stres altında içe kapanma ('fight-or-flight') tepkisi baskın olabilir"
]
# --- Hand Analysis Class ---
class HandAnalyzer:
def __init__(self):
self.mp_hands = mp.solutions.hands
self.hands = self.mp_hands.Hands(
static_image_mode=False,
max_num_hands=1,
min_detection_confidence=0.7,
min_tracking_confidence=0.5
)
self.mp_draw = mp.solutions.drawing_utils
def analyze_frame(self, frame):
"""Analyzes a single frame, draws landmarks, and returns gender."""
rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
results = self.hands.process(rgb_frame)
gender = None
if results.multi_hand_landmarks:
for hand_landmarks in results.multi_hand_landmarks:
self.mp_draw.draw_landmarks(
frame, hand_landmarks, self.mp_hands.HAND_CONNECTIONS)
# Index finger length (landmarks 5 to 8)
index_mcp = hand_landmarks.landmark[self.mp_hands.HandLandmark.INDEX_FINGER_MCP]
index_tip = hand_landmarks.landmark[self.mp_hands.HandLandmark.INDEX_FINGER_TIP]
index_finger_length = np.linalg.norm([index_tip.x - index_mcp.x, index_tip.y - index_mcp.y])
# Ring finger length (landmarks 13 to 16)
ring_mcp = hand_landmarks.landmark[self.mp_hands.HandLandmark.RING_FINGER_MCP]
ring_tip = hand_landmarks.landmark[self.mp_hands.HandLandmark.RING_FINGER_TIP]
ring_finger_length = np.linalg.norm([ring_tip.x - ring_mcp.x, ring_tip.y - ring_mcp.y])
gender = "Kadın" if index_finger_length > ring_finger_length else "Erkek"
return frame, gender
# Create a single instance of the analyzer
analyzer = HandAnalyzer()
# --- Gradio Processing Function ---
def process_image(image):
"""
Takes a webcam image, processes it, and returns the processed image
and the corresponding feature table.
"""
if image is None:
return None, "Lütfen elinizi kameraya gösterin."
# Flip the image for a more natural webcam view
frame = cv2.flip(image, 1)
processed_frame, gender = analyzer.analyze_frame(frame)
feature_table_md = ""
if gender:
if gender == "Kadın":
title = "Kadın Beyni Özellikleri"
features = FEMALE_BRAIN_FEATURES
df = pd.DataFrame({"Özellikler": features})
feature_table_md = f"## {title}\n" + df.to_markdown(index=False)
else: # Erkek
title = "Erkek Beyni Özellikleri"
features = MALE_BRAIN_FEATURES
df = pd.DataFrame({"Özellikler": features})
feature_table_md = f"## {title}\n" + df.to_markdown(index=False)
else:
feature_table_md = "El algılanmadı. Lütfen elinizi kameraya daha net gösterin."
return processed_frame, feature_table_md
# --- Gradio Interface ---
with gr.Blocks() as demo:
gr.Markdown("# Parmak Uzunluğuna Göre Cinsiyet ve Beyin Özellikleri Analizi")
gr.Markdown(
"Bu uygulama, elinizin işaret ve yüzük parmağı uzunluklarını karşılaştırarak cinsiyet tahmini yapar "
"ve ilgili cinsiyetin genel beyin işlevsel özelliklerini gösterir."
)
with gr.Row():
webcam_input = gr.Image(sources="webcam", streaming=True, label="Webcam")
with gr.Column():
processed_output = gr.Image(label="İşlenmiş Görüntü")
feature_output = gr.Markdown(label="Özellikler Tablosu")
webcam_input.stream(
process_image,
inputs=[webcam_input],
outputs=[processed_output, feature_output]
)
if __name__ == "__main__":
demo.launch()