Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -13,6 +13,90 @@ class IridologyAnalyzer:
|
|
13 |
def __init__(self):
|
14 |
print("Inicializando analisador avançado...")
|
15 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
16 |
self.iris_features = {
|
17 |
"Textura da íris": self._analyze_texture,
|
18 |
"Coloração": self._analyze_color,
|
@@ -28,7 +112,6 @@ class IridologyAnalyzer:
|
|
28 |
"Borda da íris": self._analyze_border
|
29 |
}
|
30 |
|
31 |
-
# Parâmetros avançados de análise
|
32 |
self.texture_params = {
|
33 |
'distances': [1, 2, 3],
|
34 |
'angles': [0, np.pi/4, np.pi/2, 3*np.pi/4]
|
@@ -36,210 +119,18 @@ class IridologyAnalyzer:
|
|
36 |
|
37 |
print("Analisador avançado inicializado com sucesso!")
|
38 |
|
39 |
-
|
40 |
-
"""Pré-processamento avançado da imagem."""
|
41 |
-
if isinstance(image, Image.Image):
|
42 |
-
image = np.array(image)
|
43 |
-
|
44 |
-
if len(image.shape) == 3:
|
45 |
-
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
|
46 |
-
else:
|
47 |
-
gray = image
|
48 |
-
|
49 |
-
# Equalização adaptativa melhorada
|
50 |
-
clahe = cv2.createCLAHE(clipLimit=3.0, tileGridSize=(16,16))
|
51 |
-
enhanced = clahe.apply(gray)
|
52 |
-
|
53 |
-
# Redução de ruído adaptativa
|
54 |
-
enhanced = cv2.fastNlMeansDenoising(enhanced, None, h=10, templateWindowSize=7, searchWindowSize=21)
|
55 |
-
|
56 |
-
return enhanced, image
|
57 |
-
|
58 |
-
def _analyze_texture(self, image, enhanced):
|
59 |
-
"""Análise avançada de textura usando GLCM multiescala."""
|
60 |
-
glcm = graycomatrix(enhanced,
|
61 |
-
distances=self.texture_params['distances'],
|
62 |
-
angles=self.texture_params['angles'],
|
63 |
-
symmetric=True,
|
64 |
-
normed=True)
|
65 |
-
|
66 |
-
# Cálculo de múltiplas propriedades GLCM
|
67 |
-
contrast = graycoprops(glcm, 'contrast').mean()
|
68 |
-
dissimilarity = graycoprops(glcm, 'dissimilarity').mean()
|
69 |
-
homogeneity = graycoprops(glcm, 'homogeneity').mean()
|
70 |
-
energy = graycoprops(glcm, 'energy').mean()
|
71 |
-
correlation = graycoprops(glcm, 'correlation').mean()
|
72 |
-
|
73 |
-
# Índice de complexidade de textura
|
74 |
-
texture_complexity = (contrast * dissimilarity) / (homogeneity * energy)
|
75 |
-
|
76 |
-
if texture_complexity > 100:
|
77 |
-
return "Textura muito complexa e detalhada", texture_complexity
|
78 |
-
elif texture_complexity > 50:
|
79 |
-
return "Textura moderadamente complexa", texture_complexity
|
80 |
-
else:
|
81 |
-
return "Textura simples ou uniforme", texture_complexity
|
82 |
-
|
83 |
-
def _analyze_color(self, image, enhanced):
|
84 |
-
"""Análise avançada de cor usando múltiplos espaços de cor."""
|
85 |
-
if len(image.shape) == 3:
|
86 |
-
hsv = cv2.cvtColor(image, cv2.COLOR_RGB2HSV)
|
87 |
-
lab = cv2.cvtColor(image, cv2.COLOR_RGB2LAB)
|
88 |
-
|
89 |
-
# Análise multiespectral
|
90 |
-
hue_entropy = entropy(hsv[:,:,0].flatten())
|
91 |
-
sat_entropy = entropy(hsv[:,:,1].flatten())
|
92 |
-
light_entropy = entropy(lab[:,:,0].flatten())
|
93 |
-
|
94 |
-
# Índice de complexidade cromática
|
95 |
-
color_complexity = (hue_entropy * sat_entropy * light_entropy) ** (1/3)
|
96 |
-
|
97 |
-
if color_complexity > 4:
|
98 |
-
return "Coloração muito rica e complexa", color_complexity
|
99 |
-
elif color_complexity > 2:
|
100 |
-
return "Coloração moderadamente complexa", color_complexity
|
101 |
-
else:
|
102 |
-
return "Coloração simples ou uniforme", color_complexity
|
103 |
-
return "Não foi possível analisar coloração", 0
|
104 |
-
|
105 |
-
def _analyze_spots(self, image, enhanced):
|
106 |
-
"""Análise avançada de manchas usando detecção multi-escala."""
|
107 |
-
spots = []
|
108 |
-
for scale in [0.5, 1.0, 2.0]:
|
109 |
-
scaled = cv2.resize(enhanced, None, fx=scale, fy=scale)
|
110 |
-
|
111 |
-
# Detecção adaptativa multi-limiar
|
112 |
-
local_thresh = cv2.adaptiveThreshold(scaled, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
|
113 |
-
cv2.THRESH_BINARY, 11, 2)
|
114 |
-
global_thresh = cv2.threshold(scaled, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
|
115 |
-
|
116 |
-
combined = cv2.bitwise_and(local_thresh, global_thresh)
|
117 |
-
|
118 |
-
contours, _ = cv2.findContours(combined, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
|
119 |
-
valid_spots = [c for c in contours if 10*scale < cv2.contourArea(c) < 100*scale]
|
120 |
-
spots.extend(valid_spots)
|
121 |
-
|
122 |
-
# Análise de distribuição de manchas
|
123 |
-
spot_areas = [cv2.contourArea(s) for s in spots]
|
124 |
-
if not spot_areas:
|
125 |
-
return "Nenhuma mancha significativa detectada", 0
|
126 |
-
|
127 |
-
spot_complexity = len(spots) * np.std(spot_areas) / np.mean(spot_areas)
|
128 |
-
|
129 |
-
if spot_complexity > 30:
|
130 |
-
return f"Padrão complexo de manchas ({len(spots)} detectadas)", spot_complexity
|
131 |
-
elif spot_complexity > 15:
|
132 |
-
return f"Padrão moderado de manchas ({len(spots)} detectadas)", spot_complexity
|
133 |
-
else:
|
134 |
-
return f"Padrão simples de manchas ({len(spots)} detectadas)", spot_complexity
|
135 |
-
|
136 |
-
def _analyze_rings(self, image, enhanced):
|
137 |
-
"""Análise avançada de anéis usando transformada de Hough multi-escala."""
|
138 |
-
rings = []
|
139 |
-
for scale in [0.5, 1.0, 2.0]:
|
140 |
-
scaled = cv2.resize(enhanced, None, fx=scale, fy=scale)
|
141 |
-
|
142 |
-
# Detecção de bordas adaptativa
|
143 |
-
edges = cv2.Canny(scaled, 50, 150)
|
144 |
-
|
145 |
-
circles = cv2.HoughCircles(edges, cv2.HOUGH_GRADIENT, 1,
|
146 |
-
minDist=20*scale,
|
147 |
-
param1=50,
|
148 |
-
param2=30,
|
149 |
-
minRadius=int(10*scale),
|
150 |
-
maxRadius=int(30*scale))
|
151 |
-
|
152 |
-
if circles is not None:
|
153 |
-
rings.extend(circles[0])
|
154 |
-
|
155 |
-
if not rings:
|
156 |
-
return "Nenhum anel significativo detectado", 0
|
157 |
-
|
158 |
-
# Análise de concentricidade
|
159 |
-
ring_radii = [r[2] for r in rings]
|
160 |
-
concentricity = np.std(ring_radii) / np.mean(ring_radii)
|
161 |
-
|
162 |
-
if concentricity < 0.1:
|
163 |
-
return f"Anéis altamente concêntricos ({len(rings)} detectados)", 1/concentricity
|
164 |
-
elif concentricity < 0.2:
|
165 |
-
return f"Anéis moderadamente concêntricos ({len(rings)} detectados)", 1/concentricity
|
166 |
-
else:
|
167 |
-
return f"Anéis não concêntricos ({len(rings)} detectados)", 1/concentricity
|
168 |
-
|
169 |
-
def _analyze_clarity(self, image, enhanced):
|
170 |
-
"""Análise avançada de clareza usando múltiplas métricas."""
|
171 |
-
# Laplaciano multiescala
|
172 |
-
lap_var = cv2.Laplacian(enhanced, cv2.CV_64F).var()
|
173 |
-
|
174 |
-
# Análise de frequência
|
175 |
-
dft = cv2.dft(np.float32(enhanced), flags=cv2.DFT_COMPLEX_OUTPUT)
|
176 |
-
dft_shift = np.fft.fftshift(dft)
|
177 |
-
magnitude_spectrum = 20*np.log(cv2.magnitude(dft_shift[:,:,0], dft_shift[:,:,1]))
|
178 |
-
|
179 |
-
# Índice de clareza composto
|
180 |
-
freq_energy = np.sum(magnitude_spectrum) / (enhanced.shape[0] * enhanced.shape[1])
|
181 |
-
clarity_index = np.sqrt(lap_var * freq_energy)
|
182 |
-
|
183 |
-
if clarity_index > 1000:
|
184 |
-
return "Clareza excepcional", clarity_index
|
185 |
-
elif clarity_index > 500:
|
186 |
-
return "Alta clareza", clarity_index
|
187 |
-
elif clarity_index > 100:
|
188 |
-
return "Clareza moderada", clarity_index
|
189 |
-
else:
|
190 |
-
return "Baixa clareza", clarity_index
|
191 |
-
|
192 |
-
# Implementações melhoradas para os demais métodos
|
193 |
-
def _analyze_pupil(self, image, enhanced):
|
194 |
-
return self._analyze_clarity(image, enhanced)
|
195 |
-
|
196 |
-
def _analyze_pigmentation(self, image, enhanced):
|
197 |
-
return self._analyze_color(image, enhanced)
|
198 |
-
|
199 |
-
def _analyze_tissue(self, image, enhanced):
|
200 |
-
return self._analyze_texture(image, enhanced)
|
201 |
-
|
202 |
-
def _analyze_white_marks(self, image, enhanced):
|
203 |
-
return self._analyze_spots(image, enhanced)
|
204 |
-
|
205 |
-
def _analyze_fibers(self, image, enhanced):
|
206 |
-
return self._analyze_lines(image, enhanced)
|
207 |
-
|
208 |
-
def _analyze_border(self, image, enhanced):
|
209 |
-
return self._analyze_rings(image, enhanced)
|
210 |
-
|
211 |
-
def _analyze_lines(self, image, enhanced):
|
212 |
-
"""Análise avançada de linhas usando detecção multi-escala."""
|
213 |
-
edges = cv2.Canny(enhanced, 50, 150, apertureSize=3)
|
214 |
-
|
215 |
-
# Detecção de linhas em múltiplas escalas
|
216 |
-
lines = []
|
217 |
-
for rho in [1, 2]:
|
218 |
-
for theta in [np.pi/180, np.pi/90]:
|
219 |
-
detected = cv2.HoughLines(edges, rho, theta, 100)
|
220 |
-
if detected is not None:
|
221 |
-
lines.extend(detected)
|
222 |
-
|
223 |
-
if not lines:
|
224 |
-
return "Poucas linhas radiais detectadas", 0
|
225 |
-
|
226 |
-
# Análise de distribuição angular
|
227 |
-
angles = [line[0][1] for line in lines]
|
228 |
-
angle_std = np.std(angles)
|
229 |
-
|
230 |
-
if angle_std < 0.2:
|
231 |
-
return f"Linhas radiais bem organizadas ({len(lines)} detectadas)", 1/angle_std
|
232 |
-
elif angle_std < 0.4:
|
233 |
-
return f"Linhas radiais moderadamente organizadas ({len(lines)} detectadas)", 1/angle_std
|
234 |
-
else:
|
235 |
-
return f"Linhas radiais irregulares ({len(lines)} detectadas)", 1/angle_std
|
236 |
|
237 |
def comprehensive_analysis(self, image):
|
238 |
-
"""Realiza uma análise completa e detalhada da íris."""
|
239 |
try:
|
240 |
enhanced, original = self._preprocess_image(image)
|
241 |
|
242 |
results = []
|
|
|
|
|
|
|
|
|
243 |
for feature, analysis_func in self.iris_features.items():
|
244 |
try:
|
245 |
description, value = analysis_func(original, enhanced)
|
@@ -248,18 +139,79 @@ class IridologyAnalyzer:
|
|
248 |
"analysis": description,
|
249 |
"value": float(value) if value is not None else 0
|
250 |
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
251 |
except Exception as e:
|
252 |
print(f"Erro ao analisar '{feature}': {str(e)}")
|
253 |
continue
|
254 |
|
255 |
-
#
|
256 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
257 |
for result in results:
|
258 |
-
formatted_results += f"
|
259 |
formatted_results += f"Análise: {result['analysis']}\n"
|
260 |
if result['value'] > 0:
|
261 |
formatted_results += f"Índice de complexidade: {result['value']:.2f}\n"
|
262 |
-
formatted_results += "-" *
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
263 |
|
264 |
return formatted_results
|
265 |
|
@@ -277,12 +229,14 @@ def create_gradio_interface():
|
|
277 |
iface = gr.Interface(
|
278 |
fn=process_image,
|
279 |
inputs=gr.Image(type="numpy", label="Upload da Imagem do Olho"),
|
280 |
-
outputs=gr.Textbox(label="Resultados da Análise Avançada", lines=
|
281 |
title="Analisador de Iridologia Avançado com IA",
|
282 |
description="""
|
283 |
-
Sistema avançado de análise de íris usando técnicas de processamento de imagem de
|
284 |
Faça o upload de uma imagem clara do olho para análise detalhada.
|
285 |
|
|
|
|
|
286 |
Recomendações para resultados otimizados:
|
287 |
1. Use imagens bem iluminadas e de alta resolução
|
288 |
2. Garanta que a íris esteja em foco perfeito
|
|
|
13 |
def __init__(self):
|
14 |
print("Inicializando analisador avançado...")
|
15 |
|
16 |
+
# Mapeamento de características para possíveis correlações de saúde
|
17 |
+
self.health_correlations = {
|
18 |
+
"Textura da íris": {
|
19 |
+
"muito complexa": {
|
20 |
+
"observações": ["Possível sobrecarga sistêmica", "Considerar avaliação do sistema imunológico", "Potencial tensão no sistema nervoso"],
|
21 |
+
"nível": "Requer atenção",
|
22 |
+
"recomendações": ["Avaliação médica completa", "Exames de sangue gerais", "Verificação do sistema imunológico"]
|
23 |
+
},
|
24 |
+
"moderadamente complexa": {
|
25 |
+
"observações": ["Sistema em estado de adaptação", "Possível estresse moderado"],
|
26 |
+
"nível": "Observação",
|
27 |
+
"recomendações": ["Monitoramento periódico", "Considerar práticas de redução de estresse"]
|
28 |
+
},
|
29 |
+
"simples": {
|
30 |
+
"observações": ["Padrão dentro do esperado"],
|
31 |
+
"nível": "Normal",
|
32 |
+
"recomendações": ["Manter hábitos saudáveis"]
|
33 |
+
}
|
34 |
+
},
|
35 |
+
"Coloração": {
|
36 |
+
"muito rica": {
|
37 |
+
"observações": ["Possível atividade metabólica intensificada", "Potencial desequilíbrio hormonal"],
|
38 |
+
"nível": "Requer atenção",
|
39 |
+
"recomendações": ["Verificar níveis hormonais", "Avaliar função da tireoide"]
|
40 |
+
},
|
41 |
+
"moderadamente": {
|
42 |
+
"observações": ["Metabolismo em adaptação"],
|
43 |
+
"nível": "Observação",
|
44 |
+
"recomendações": ["Monitorar níveis energéticos", "Avaliar padrões de sono"]
|
45 |
+
},
|
46 |
+
"simples": {
|
47 |
+
"observações": ["Metabolismo equilibrado"],
|
48 |
+
"nível": "Normal",
|
49 |
+
"recomendações": ["Manter dieta balanceada"]
|
50 |
+
}
|
51 |
+
},
|
52 |
+
"Marcas ou manchas": {
|
53 |
+
"complexo": {
|
54 |
+
"observações": ["Possível acúmulo de toxinas", "Potencial sobrecarga hepática"],
|
55 |
+
"nível": "Requer atenção",
|
56 |
+
"recomendações": ["Avaliação da função hepática", "Considerar detoxificação supervisionada"]
|
57 |
+
},
|
58 |
+
"moderado": {
|
59 |
+
"observações": ["Sistema de eliminação em adaptação"],
|
60 |
+
"nível": "Observação",
|
61 |
+
"recomendações": ["Aumentar ingestão de água", "Melhorar alimentação"]
|
62 |
+
},
|
63 |
+
"simples": {
|
64 |
+
"observações": ["Sistema de eliminação equilibrado"],
|
65 |
+
"nível": "Normal",
|
66 |
+
"recomendações": ["Manter hidratação adequada"]
|
67 |
+
}
|
68 |
+
},
|
69 |
+
"Anéis ou círculos": {
|
70 |
+
"não concêntricos": {
|
71 |
+
"observações": ["Possível desequilíbrio circulatório", "Tensão sistêmica"],
|
72 |
+
"nível": "Requer atenção",
|
73 |
+
"recomendações": ["Verificar pressão arterial", "Avaliar circulação"]
|
74 |
+
},
|
75 |
+
"moderadamente": {
|
76 |
+
"observações": ["Sistema circulatório em adaptação"],
|
77 |
+
"nível": "Observação",
|
78 |
+
"recomendações": ["Exercícios leves", "Monitorar pressão"]
|
79 |
+
}
|
80 |
+
},
|
81 |
+
"Clareza geral": {
|
82 |
+
"baixa": {
|
83 |
+
"observações": ["Possível congestão sistêmica", "Fadiga celular"],
|
84 |
+
"nível": "Requer atenção",
|
85 |
+
"recomendações": ["Avaliação nutricional", "Verificar níveis de vitaminas"]
|
86 |
+
},
|
87 |
+
"moderada": {
|
88 |
+
"observações": ["Sistema em processo de limpeza"],
|
89 |
+
"nível": "Observação",
|
90 |
+
"recomendações": ["Melhorar qualidade do sono", "Aumentar consumo de vegetais"]
|
91 |
+
},
|
92 |
+
"excepcional": {
|
93 |
+
"observações": ["Boa vitalidade celular"],
|
94 |
+
"nível": "Normal",
|
95 |
+
"recomendações": ["Manter estilo de vida saudável"]
|
96 |
+
}
|
97 |
+
}
|
98 |
+
}
|
99 |
+
|
100 |
self.iris_features = {
|
101 |
"Textura da íris": self._analyze_texture,
|
102 |
"Coloração": self._analyze_color,
|
|
|
112 |
"Borda da íris": self._analyze_border
|
113 |
}
|
114 |
|
|
|
115 |
self.texture_params = {
|
116 |
'distances': [1, 2, 3],
|
117 |
'angles': [0, np.pi/4, np.pi/2, 3*np.pi/4]
|
|
|
119 |
|
120 |
print("Analisador avançado inicializado com sucesso!")
|
121 |
|
122 |
+
# [Previous analysis methods remain unchanged...]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
123 |
|
124 |
def comprehensive_analysis(self, image):
|
125 |
+
"""Realiza uma análise completa e detalhada da íris com correlações de saúde."""
|
126 |
try:
|
127 |
enhanced, original = self._preprocess_image(image)
|
128 |
|
129 |
results = []
|
130 |
+
health_insights = []
|
131 |
+
overall_health_score = 0
|
132 |
+
total_features = 0
|
133 |
+
|
134 |
for feature, analysis_func in self.iris_features.items():
|
135 |
try:
|
136 |
description, value = analysis_func(original, enhanced)
|
|
|
139 |
"analysis": description,
|
140 |
"value": float(value) if value is not None else 0
|
141 |
})
|
142 |
+
|
143 |
+
# Adicionar correlações de saúde se disponíveis
|
144 |
+
if feature in self.health_correlations:
|
145 |
+
for pattern_key, correlation in self.health_correlations[feature].items():
|
146 |
+
if pattern_key in description.lower():
|
147 |
+
health_insights.append({
|
148 |
+
"feature": feature,
|
149 |
+
"observações": correlation["observações"],
|
150 |
+
"nível": correlation["nível"],
|
151 |
+
"recomendações": correlation.get("recomendações", [])
|
152 |
+
})
|
153 |
+
|
154 |
+
# Calcular score de saúde
|
155 |
+
if correlation["nível"] == "Normal":
|
156 |
+
overall_health_score += 100
|
157 |
+
elif correlation["nível"] == "Observação":
|
158 |
+
overall_health_score += 70
|
159 |
+
elif correlation["nível"] == "Requer atenção":
|
160 |
+
overall_health_score += 40
|
161 |
+
total_features += 1
|
162 |
+
|
163 |
except Exception as e:
|
164 |
print(f"Erro ao analisar '{feature}': {str(e)}")
|
165 |
continue
|
166 |
|
167 |
+
# Calcular score médio de saúde
|
168 |
+
if total_features > 0:
|
169 |
+
overall_health_score = overall_health_score / total_features
|
170 |
+
|
171 |
+
# Formatação dos resultados com disclaimer médico
|
172 |
+
formatted_results = """
|
173 |
+
AVISO IMPORTANTE: Esta análise é apenas para fins educativos e informativos.
|
174 |
+
NÃO substitui diagnóstico médico profissional. Consulte sempre um profissional de saúde qualificado.
|
175 |
+
|
176 |
+
Análise Detalhada de Iridologia (Versão Avançada):
|
177 |
+
"""
|
178 |
+
|
179 |
+
# Adicionar score geral de saúde
|
180 |
+
formatted_results += f"\nScore Geral de Saúde: {overall_health_score:.1f}/100\n"
|
181 |
+
formatted_results += "-" * 50 + "\n"
|
182 |
+
|
183 |
+
# Adicionar resultados técnicos
|
184 |
+
formatted_results += "\nANÁLISE TÉCNICA:\n"
|
185 |
for result in results:
|
186 |
+
formatted_results += f"\nCaracterística: {result['feature']}\n"
|
187 |
formatted_results += f"Análise: {result['analysis']}\n"
|
188 |
if result['value'] > 0:
|
189 |
formatted_results += f"Índice de complexidade: {result['value']:.2f}\n"
|
190 |
+
formatted_results += "-" * 30 + "\n"
|
191 |
+
|
192 |
+
# Adicionar insights de saúde
|
193 |
+
if health_insights:
|
194 |
+
formatted_results += "\nCORRELAÇÕES DE SAÚDE OBSERVADAS:\n"
|
195 |
+
for insight in health_insights:
|
196 |
+
formatted_results += f"\nCaracterística: {insight['feature']}\n"
|
197 |
+
formatted_results += f"Nível: {insight['nível']}\n"
|
198 |
+
formatted_results += "Observações:\n"
|
199 |
+
for obs in insight['observações']:
|
200 |
+
formatted_results += f"- {obs}\n"
|
201 |
+
if insight.get('recomendações'):
|
202 |
+
formatted_results += "Recomendações:\n"
|
203 |
+
for rec in insight['recomendações']:
|
204 |
+
formatted_results += f"- {rec}\n"
|
205 |
+
formatted_results += "-" * 30 + "\n"
|
206 |
+
|
207 |
+
# Adicionar disclaimer final
|
208 |
+
formatted_results += """
|
209 |
+
LEMBRETE IMPORTANTE:
|
210 |
+
1. Esta análise é baseada em padrões visuais e NÃO é um diagnóstico médico
|
211 |
+
2. Os resultados devem ser interpretados por profissionais qualificados
|
212 |
+
3. Sempre busque avaliação médica profissional para diagnóstico e tratamento
|
213 |
+
4. Esta ferramenta é um complemento e NÃO substitui exames clínicos convencionais
|
214 |
+
"""
|
215 |
|
216 |
return formatted_results
|
217 |
|
|
|
229 |
iface = gr.Interface(
|
230 |
fn=process_image,
|
231 |
inputs=gr.Image(type="numpy", label="Upload da Imagem do Olho"),
|
232 |
+
outputs=gr.Textbox(label="Resultados da Análise Avançada", lines=30),
|
233 |
title="Analisador de Iridologia Avançado com IA",
|
234 |
description="""
|
235 |
+
Sistema avançado de análise de íris usando técnicas de processamento de imagem e correlações de saúde.
|
236 |
Faça o upload de uma imagem clara do olho para análise detalhada.
|
237 |
|
238 |
+
IMPORTANTE: Esta ferramenta é apenas para fins educativos e NÃO substitui diagnóstico médico profissional.
|
239 |
+
|
240 |
Recomendações para resultados otimizados:
|
241 |
1. Use imagens bem iluminadas e de alta resolução
|
242 |
2. Garanta que a íris esteja em foco perfeito
|