Spaces:
Sleeping
Sleeping
import gradio as gr | |
import cv2 | |
import numpy as np | |
from dataclasses import dataclass | |
from typing import Dict, List, Tuple | |
from datetime import datetime | |
class IrisZone: | |
name: str | |
ratio: Tuple[float, float] # (inner, outer) | |
color: Tuple[int, int, int] | |
conditions: Dict[str, List[str]] # Detailed health conditions | |
recommendations: Dict[str, List[str]] | |
class IrisAnalyzer: | |
def __init__(self): | |
self.zones = [ | |
IrisZone( | |
name="Zona Cerebral/Neural", | |
ratio=(0.85, 1.0), | |
color=(255, 0, 0), | |
conditions={ | |
"baixa": [ | |
"Possível fadiga neural crônica", | |
"Indicadores de estresse prolongado", | |
"Sinais de insônia ou distúrbios do sono", | |
"Possível déficit de vitamina B12" | |
], | |
"media": ["Estado neural estável", "Função cognitiva normal"], | |
"alta": ["Excelente saúde neural", "Ótima resposta cognitiva"] | |
}, | |
recommendations={ | |
"baixa": [ | |
"Suplementação de vitamina B12", | |
"Técnicas de meditação diária", | |
"Melhorar qualidade do sono", | |
"Reduzir exposição a telas" | |
], | |
"media": ["Manter rotina de sono", "Exercícios mentais regulares"], | |
"alta": ["Manter práticas atuais", "Exercícios de mindfulness"] | |
} | |
), | |
IrisZone( | |
name="Zona Digestiva", | |
ratio=(0.7, 0.85), | |
color=(0, 255, 0), | |
conditions={ | |
"baixa": [ | |
"Possível inflamação intestinal", | |
"Sinais de má absorção", | |
"Indicadores de disbiose", | |
"Possível deficiência enzimática" | |
], | |
"media": ["Digestão funcional", "Absorção adequada"], | |
"alta": ["Excelente saúde digestiva", "Ótima absorção"] | |
}, | |
recommendations={ | |
"baixa": [ | |
"Probióticos específicos", | |
"Enzimas digestivas", | |
"Dieta anti-inflamatória", | |
"Eliminar alimentos processados" | |
], | |
"media": ["Manter dieta balanceada", "Hidratação adequada"], | |
"alta": ["Manter dieta atual", "Rotina alimentar saudável"] | |
} | |
), | |
IrisZone( | |
name="Zona Respiratória", | |
ratio=(0.55, 0.7), | |
color=(0, 0, 255), | |
conditions={ | |
"baixa": [ | |
"Possível comprometimento respiratório", | |
"Sinais de baixa oxigenação", | |
"Indicadores de congestão brônquica", | |
"Possível sensibilidade respiratória" | |
], | |
"media": ["Função respiratória adequada", "Oxigenação normal"], | |
"alta": ["Excelente capacidade respiratória", "Ótima oxigenação"] | |
}, | |
recommendations={ | |
"baixa": [ | |
"Exercícios respiratórios diários", | |
"Avaliar qualidade do ar", | |
"Considerar atividades aeróbicas", | |
"Técnicas de respiração profunda" | |
], | |
"media": ["Manter exercícios regulares", "Praticar respiração consciente"], | |
"alta": ["Continuar práticas saudáveis", "Manter atividades aeróbicas"] | |
} | |
), | |
IrisZone( | |
name="Zona Circulatória", | |
ratio=(0.4, 0.55), | |
color=(255, 255, 0), | |
conditions={ | |
"baixa": [ | |
"Possível circulação periférica reduzida", | |
"Indicadores de estagnação sanguínea", | |
"Sinais de baixo fluxo sanguíneo", | |
"Possível deficiência de ferro" | |
], | |
"media": ["Circulação adequada", "Fluxo sanguíneo normal"], | |
"alta": ["Excelente circulação", "Ótimo fluxo sanguíneo"] | |
}, | |
recommendations={ | |
"baixa": [ | |
"Aumentar atividade física", | |
"Considerar suplementação de ferro", | |
"Massagens circulatórias", | |
"Hidratação adequada" | |
], | |
"media": ["Manter exercícios regulares", "Alimentação rica em ferro"], | |
"alta": ["Manter rotina atual", "Continuar exercícios"] | |
} | |
), | |
IrisZone( | |
name="Zona Linfática", | |
ratio=(0.25, 0.4), | |
color=(255, 0, 255), | |
conditions={ | |
"baixa": [ | |
"Sistema linfático congestionado", | |
"Possível retenção de líquidos", | |
"Indicadores de toxicidade", | |
"Baixa resposta imunológica" | |
], | |
"media": ["Sistema linfático funcional", "Drenagem adequada"], | |
"alta": ["Excelente drenagem linfática", "Ótima desintoxicação"] | |
}, | |
recommendations={ | |
"baixa": [ | |
"Drenagem linfática regular", | |
"Aumentar consumo de água", | |
"Exercícios específicos", | |
"Dieta desintoxicante" | |
], | |
"media": ["Manter hidratação", "Exercícios leves regulares"], | |
"alta": ["Manter hábitos atuais", "Continuar atividades físicas"] | |
} | |
), | |
IrisZone( | |
name="Zona Endócrina", | |
ratio=(0.15, 0.25), | |
color=(0, 255, 255), | |
conditions={ | |
"baixa": [ | |
"Possível desequilíbrio hormonal", | |
"Sinais de estresse adrenal", | |
"Indicadores de fadiga endócrina", | |
"Possível disfunção tireoidiana" | |
], | |
"media": ["Sistema endócrino estável", "Função hormonal adequada"], | |
"alta": ["Excelente equilíbrio hormonal", "Ótima função endócrina"] | |
}, | |
recommendations={ | |
"baixa": [ | |
"Gestão do estresse", | |
"Suporte adrenal natural", | |
"Regular ciclo sono-vigília", | |
"Alimentação rica em iodo" | |
], | |
"media": ["Manter rotina regular", "Cuidar do sono"], | |
"alta": ["Manter equilíbrio atual", "Continuar boas práticas"] | |
} | |
), | |
IrisZone( | |
name="Zona Pupilar", | |
ratio=(0, 0.15), | |
color=(128, 128, 128), | |
conditions={ | |
"baixa": [ | |
"Sistema nervoso autônomo sobrecarregado", | |
"Possível desequilíbrio simpático/parassimpático", | |
"Indicadores de estresse crônico", | |
"Sinais de fadiga autonômica" | |
], | |
"media": ["SNA equilibrado", "Resposta autonômica normal"], | |
"alta": ["Excelente regulação autonômica", "Ótimo equilíbrio do SNA"] | |
}, | |
recommendations={ | |
"baixa": [ | |
"Técnicas de relaxamento", | |
"Práticas de mindfulness", | |
"Regular rotina diária", | |
"Exercícios de respiração" | |
], | |
"media": ["Manter práticas relaxantes", "Continuar boa rotina"], | |
"alta": ["Manter equilíbrio atual", "Continuar práticas saudáveis"] | |
} | |
) | |
] | |
def analyze_iris(self, image: np.ndarray) -> Dict: | |
# Converter para diferentes espaços de cor para análise mais completa | |
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) | |
hsv = cv2.cvtColor(image, cv2.COLOR_RGB2HSV) | |
lab = cv2.cvtColor(image, cv2.COLOR_RGB2LAB) | |
# Detectar centro e borda da íris usando Hough Circles | |
circles = cv2.HoughCircles( | |
gray, cv2.HOUGH_GRADIENT, dp=1, minDist=100, | |
param1=50, param2=30, minRadius=50, maxRadius=150 | |
) | |
if circles is not None: | |
circle = circles[0][0] | |
center = (int(circle[0]), int(circle[1])) | |
radius = int(circle[2]) | |
else: | |
center = (image.shape[1]//2, image.shape[0]//2) | |
radius = min(image.shape[:2])//4 | |
results = { | |
"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), | |
"analysis": {}, | |
"metrics": { | |
"iris_radius": radius, | |
"image_quality": self._assess_image_quality(image) | |
} | |
} | |
for zone in self.zones: | |
inner_r = int(radius * zone.ratio[0]) | |
outer_r = int(radius * zone.ratio[1]) | |
# Criar máscaras para diferentes análises | |
mask = np.zeros(gray.shape, dtype=np.uint8) | |
cv2.circle(mask, center, outer_r, 255, -1) | |
cv2.circle(mask, center, inner_r, 0, -1) | |
# Análise multiespectral | |
zone_metrics = { | |
"intensity": cv2.mean(gray, mask=mask)[0], | |
"saturation": cv2.mean(hsv[..., 1], mask=mask)[0], | |
"texture": self._analyze_texture(gray, mask), | |
"contrast": self._analyze_contrast(lab[..., 0], mask), | |
"patterns": self._detect_patterns(gray, mask) | |
} | |
# Análise detalhada baseada em múltiplos fatores | |
health_score = ( | |
zone_metrics["intensity"] * 0.3 + | |
zone_metrics["saturation"] * 0.2 + | |
zone_metrics["texture"] * 0.2 + | |
zone_metrics["contrast"] * 0.15 + | |
zone_metrics["patterns"] * 0.15 | |
) | |
if health_score < 40: | |
level = "baixa" | |
elif health_score < 75: | |
level = "media" | |
else: | |
level = "alta" | |
results["analysis"][zone.name] = { | |
"conditions": self._customize_conditions(zone.conditions[level], zone_metrics), | |
"recommendations": self._customize_recommendations(zone.recommendations[level], zone_metrics), | |
"metrics": { | |
"intensity": float(zone_metrics["intensity"]), | |
"saturation": float(zone_metrics["saturation"]), | |
"texture": float(zone_metrics["texture"]), | |
"contrast": float(zone_metrics["contrast"]), | |
"patterns": float(zone_metrics["patterns"]), | |
"health_score": float(health_score) | |
}, | |
"status": level, | |
"confianca_analise": self._calculate_confidence(zone_metrics) | |
} | |
# Marcar zona na imagem | |
cv2.circle(image, center, outer_r, zone.color, 2) | |
cv2.putText(image, zone.name, | |
(center[0]-outer_r, center[1]+outer_r), | |
cv2.FONT_HERSHEY_SIMPLEX, 0.5, zone.color, 1) | |
return image, results | |
def _customize_conditions(self, base_conditions: List[str], metrics: Dict) -> List[str]: | |
"""Personaliza as condições baseado nas métricas específicas""" | |
customized = [] | |
for condition in base_conditions: | |
# Adicionar detalhes específicos baseados nas métricas | |
if metrics["intensity"] < 50: | |
condition += " (intensidade muito baixa)" | |
elif metrics["contrast"] < 30: | |
condition += " (baixo contraste)" | |
if metrics["patterns"] > 70: | |
condition += " (padrões significativos detectados)" | |
customized.append(condition) | |
return customized | |
def _customize_recommendations(self, base_recommendations: List[str], metrics: Dict) -> List[str]: | |
"""Personaliza as recomendações baseado nas métricas específicas""" | |
customized = [] | |
for rec in base_recommendations: | |
# Adicionar detalhes específicos baseados nas métricas | |
if metrics["texture"] < 40: | |
rec += " (prioridade alta)" | |
elif metrics["saturation"] < 50: | |
rec += " (atenção especial necessária)" | |
customized.append(rec) | |
return customized | |
def _calculate_confidence(self, metrics: Dict) -> str: | |
"""Calcula o nível de confiança da análise baseado nas métricas""" | |
confidence_score = ( | |
metrics["intensity"] * 0.25 + | |
metrics["contrast"] * 0.25 + | |
metrics["texture"] * 0.25 + | |
metrics["patterns"] * 0.25 | |
) | |
if confidence_score > 75: | |
return "alta" | |
elif confidence_score > 50: | |
return "média" | |
else: | |
return "baixa" | |
def process_image(img): | |
if img is None: | |
return [None] * 5, gr.Warning("Por favor, carregue uma imagem.") | |
analyzer = IrisAnalyzer() | |
processed_img, results = analyzer.analyze_iris(img) | |
# Relatório Geral | |
general_report = "# 📊 Visão Geral da Análise\n\n" | |
status_counts = {"baixa": 0, "media": 0, "alta": 0} | |
for analysis in results["analysis"].values(): | |
status_counts[analysis["status"]] += 1 | |
health_score = ((status_counts["alta"] * 100) + (status_counts["media"] * 50)) / len(results["analysis"]) | |
general_report += f"**Índice de Saúde Geral:** {health_score:.1f}%\n\n" | |
general_report += f"**Data da Análise:** {results['timestamp']}\n\n" | |
general_report += "**Qualidade da Imagem:** {:.1f}%\n\n".format(results['metrics']['image_quality']) | |
# Condições Detalhadas | |
detailed_conditions = "# 🔍 Análise Detalhada por Zona\n\n" | |
for zone_name, analysis in results["analysis"].items(): | |
detailed_conditions += f"## {zone_name}\n\n" | |
detailed_conditions += "### Condições Identificadas:\n" | |
for condition in analysis["conditions"]: | |
detailed_conditions += f"- {condition}\n" | |
detailed_conditions += f"\n**Status:** {analysis['status'].title()}\n" | |
detailed_conditions += f"**Confiança da Análise:** {analysis['confianca_analise']}\n" | |
detailed_conditions += "**Métricas Detalhadas:**\n" | |
for metric, value in analysis["metrics"].items(): | |
detailed_conditions += f"- {metric.replace('_', ' ').title()}: {value:.1f}\n" | |
detailed_conditions += "\n" | |
# Recomendações | |
recommendations = "# 💡 Recomendações Personalizadas\n\n" | |
for zone_name, analysis in results["analysis"].items(): | |
recommendations += f"## {zone_name}\n\n" | |
for rec in analysis["recommendations"]: | |
recommendations += f"- {rec}\n" | |
recommendations += "\n" | |
# Alertas de Saúde | |
health_alerts = "# ⚠️ Alertas e Atenção Especial\n\n" | |
for zone_name, analysis in results["analysis"].items(): | |
if analysis["status"] == "baixa" or analysis["metrics"]["health_score"] < 50: | |
health_alerts += f"## {zone_name}\n" | |
health_alerts += "### Pontos de Atenção:\n" | |
for condition in analysis["conditions"]: | |
health_alerts += f"- ⚠️ {condition}\n" | |
health_alerts += "\n### Ações Recomendadas:\n" | |
for rec in analysis["recommendations"]: | |
health_alerts += f"- ✅ {rec}\n" | |
health_alerts += "\n" | |
return [ | |
processed_img, | |
general_report, | |
detailed_conditions, | |
recommendations, | |
health_alerts | |
] | |
if img is None: | |
return [None] * 5, gr.Warning("Por favor, carregue uma imagem.") | |
analyzer = IrisAnalyzer() | |
processed_img, results = analyzer.analyze_iris(img) | |
# Relatório Geral | |
general_report = "# 📊 Visão Geral da Análise\n\n" | |
status_counts = {"baixa": 0, "media": 0, "alta": 0} | |
for analysis in results["analysis"].values(): | |
status_counts[analysis["status"]] += 1 | |
health_score = ((status_counts["alta"] * 100) + (status_counts["media"] * 50)) / len(results["analysis"]) | |
general_report += f"**Índice de Saúde Geral:** {health_score:.1f}%\n\n" | |
general_report += f"**Data da Análise:** {results['timestamp']}\n\n" | |
# Condições Detalhadas | |
detailed_conditions = "# 🔍 Análise Detalhada por Zona\n\n" | |
for zone_name, analysis in results["analysis"].items(): | |
detailed_conditions += f"## {zone_name}\n\n" | |
detailed_conditions += "### Condições Identificadas:\n" | |
for condition in analysis["conditions"]: | |
detailed_conditions += f"- {condition}\n" | |
detailed_conditions += f"\n**Status:** {analysis['status'].title()}\n" | |
detailed_conditions += f"**Intensidade:** {analysis['intensity']:.1f}\n\n" | |
# Recomendações | |
recommendations = "# 💡 Recomendações Personalizadas\n\n" | |
for zone_name, analysis in results["analysis"].items(): | |
recommendations += f"## {zone_name}\n\n" | |
for rec in analysis["recommendations"]: | |
recommendations += f"- {rec}\n" | |
recommendations += "\n" | |
# Alertas de Saúde | |
health_alerts = "# ⚠️ Alertas e Atenção Especial\n\n" | |
for zone_name, analysis in results["analysis"].items(): | |
if analysis["status"] == "baixa": | |
health_alerts += f"## {zone_name}\n" | |
health_alerts += "### Pontos de Atenção:\n" | |
for condition in analysis["conditions"]: | |
health_alerts += f"- ⚠️ {condition}\n" | |
health_alerts += "\n### Ações Recomendadas:\n" | |
for rec in analysis["recommendations"]: | |
health_alerts += f"- ✅ {rec}\n" | |
health_alerts += "\n" | |
return [ | |
processed_img, | |
general_report, | |
detailed_conditions, | |
recommendations, | |
health_alerts | |
] | |
# Interface Gradio moderna com Blocks | |
with gr.Blocks(theme=gr.themes.Soft()) as iface: | |
gr.Markdown(""" | |
# 🔍 Analisador Avançado de Íris | |
### Sistema Educacional de Análise Iridológica v2.0 | |
⚠️ Este é um sistema para fins educacionais. Não utilize para diagnósticos médicos. | |
""") | |
with gr.Tabs() as tabs: | |
# Aba de Análise | |
with gr.Tab("📸 Análise de Imagem", id=1): | |
with gr.Row(): | |
with gr.Column(scale=1): | |
input_image = gr.Image( | |
label="Upload da Imagem da Íris", | |
type="numpy", | |
sources=["upload", "webcam", "clipboard"], | |
height=400 | |
) | |
analyze_btn = gr.Button("🔍 Analisar Íris", variant="primary", size="lg") | |
with gr.Column(scale=1): | |
output_image = gr.Image(label="Visualização da Análise", height=400) | |
# Aba de Resultados | |
with gr.Tab("📊 Resultados", id=2): | |
with gr.Tabs() as result_tabs: | |
with gr.Tab("📈 Visão Geral", id=2.1): | |
general_output = gr.Markdown() | |
with gr.Tab("🔍 Condições Detalhadas", id=2.2): | |
conditions_output = gr.Markdown() | |
with gr.Tab("💡 Recomendações", id=2.3): | |
recommendations_output = gr.Markdown() | |
with gr.Tab("⚠️ Alertas", id=2.4): | |
alerts_output = gr.Markdown() | |
# Aba de Informações | |
with gr.Tab("ℹ️ Informações", id=3): | |
gr.Markdown(""" | |
## 📚 Sobre a Análise Iridológica | |
### 🎯 Zonas Analisadas: | |
1. **Zona Cerebral/Neural** - Sistema nervoso central e periférico | |
2. **Zona Digestiva** - Sistema digestório completo | |
3. **Zona Respiratória** - Sistema respiratório | |
4. **Zona Circulatória** - Sistema cardiovascular | |
5. **Zona Linfática** - Sistema imunológico | |
6. **Zona Endócrina** - Sistema hormonal | |
7. **Zona Pupilar** - Sistema nervoso autônomo | |
### 📋 Como Usar: | |
1. Faça upload de uma imagem clara da íris | |
2. Clique em "Analisar Íris" | |
3. Verifique os resultados nas diferentes abas | |
4. Consulte os alertas e recomendações | |
### ⚠️ Observações Importantes: | |
- Sistema para fins educacionais | |
- Não substitui avaliação médica | |
- Consulte profissionais de saúde | |
- Mantenha check-ups regulares | |
""") | |
# Configurar eventos | |
analyze_btn.click( | |
fn=process_image, | |
inputs=input_image, | |
outputs=[ | |
output_image, | |
general_output, | |
conditions_output, | |
recommendations_output, | |
alerts_output | |
] | |
) | |
if __name__ == "__main__": | |
iface.launch() |