valencar commited on
Commit
1802cfd
·
verified ·
1 Parent(s): d868a57

Upload 13 files

Browse files
.gitattributes CHANGED
@@ -33,3 +33,10 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ doencas_pulmonares.jpg filter=lfs diff=lfs merge=lfs -text
37
+ imagem_random.png filter=lfs diff=lfs merge=lfs -text
38
+ LANA_Card.png filter=lfs diff=lfs merge=lfs -text
39
+ modelo_raiox.keras filter=lfs diff=lfs merge=lfs -text
40
+ pulmox_logo_transparent.png filter=lfs diff=lfs merge=lfs -text
41
+ pulmox_logo_v2.png filter=lfs diff=lfs merge=lfs -text
42
+ pulmox_logo.png filter=lfs diff=lfs merge=lfs -text
LANA_Card.png ADDED

Git LFS Details

  • SHA256: 620a9887fb18bedd7f3d32379161274e225d5a9c2c0b8978418eaade26b7e2cb
  • Pointer size: 131 Bytes
  • Size of remote file: 133 kB
ai_system.html ADDED
@@ -0,0 +1,280 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="pt-BR">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>PulmoX - AI System</title>
7
+ <style>
8
+ body {
9
+ font-family: sans-serif;
10
+ background-color: #0e1117;
11
+ color: white;
12
+ margin: 0;
13
+ padding: 0;
14
+ display: flex;
15
+ }
16
+ .sidebar {
17
+ width: 280px;
18
+ min-height: 100vh;
19
+ background-color: rgba(127, 36, 25, 0.4);
20
+ backdrop-filter: blur(10px);
21
+ color: white;
22
+ padding: 20px;
23
+ box-sizing: border-box;
24
+ flex-shrink: 0;
25
+ display: flex; /* Adicionado para layout flexível */
26
+ flex-direction: column; /* Organiza os itens verticalmente */
27
+ }
28
+ .sidebar-content {
29
+ flex-grow: 1; /* Permite que o conteúdo cresça e empurre a imagem para baixo */
30
+ }
31
+ .sidebar-image {
32
+ margin-top: auto; /* Empurra a imagem para o final */
33
+ padding-top: 20px;
34
+ text-align: left;
35
+ }
36
+ .sidebar-image img {
37
+ max-width: 100%;
38
+ height: auto;
39
+ border-radius: 8px;
40
+ }
41
+ .sidebar-logo {
42
+ text-align: left; /* Alinha a logomarca à esquerda */
43
+ padding: 20px 0 0 20px; /* Ajusta o padding para o alinhamento */
44
+ background-color: transparent; /* Cor de fundo da sidebar */
45
+ }
46
+ .sidebar-menu {
47
+ margin-top: 40px; /* Aumenta o espaço entre a logo e o menu */
48
+ margin-bottom: 20px;
49
+ }
50
+ .sidebar-menu a {
51
+ display: block;
52
+ color: white;
53
+ text-decoration: none;
54
+ padding: 15px 20px; /* Aumenta o padding */
55
+ margin: 5px -20px; /* Estende a área de destaque para a borda da sidebar */
56
+ font-size: 28px; /* Aumenta a fonte para maior visibilidade */
57
+ font-family: sans-serif; /* Volta para a fonte padrão do corpo, mais legível */
58
+ font-weight: 700; /* Negrito, mas não excessivo */
59
+ transition: all 0.2s ease-in-out;
60
+ border-radius: 0 10px 10px 0; /* Borda arredondada no lado direito */
61
+ }
62
+ .sidebar-menu a:hover {
63
+ background-color: #0e1117; /* Cor de fundo escura para destaque */
64
+ color: #9ecbff; /* Cor do texto de destaque */
65
+ box-shadow: 0 0 5px rgba(0, 0, 0, 0.3); /* Sombra sutil no hover */
66
+ }
67
+ .sidebar-menu a.active {
68
+ background-color: #0e1117; /* Cor de fundo escura para destaque */
69
+ color: #9ecbff; /* Cor do texto de destaque */
70
+ box-shadow: 0 0 10px rgba(0, 0, 0, 0.5); /* Sombra apenas no ativo */
71
+ font-weight: bold;
72
+ border-left: 5px solid #9ecbff; /* Linha de destaque na lateral */
73
+ padding-left: 15px; /* Ajusta o padding para compensar a borda */
74
+ }
75
+ .main-content {
76
+ flex-grow: 1;
77
+ padding: 1rem 2rem;
78
+ box-sizing: border-box;
79
+ }
80
+ .main-container {
81
+ max-width: 700px;
82
+ margin: 0 auto;
83
+ }
84
+ .image-placeholder {
85
+ width: 100%;
86
+ height: 520px; /* Aumentado em 30% de 400px */
87
+ background-color: rgba(51, 51, 51, 0.4);
88
+ backdrop-filter: blur(10px);
89
+ border-radius: 8px;
90
+ display: flex;
91
+ align-items: center;
92
+ justify-content: center;
93
+ margin-bottom: 1.5rem;
94
+ font-size: 1.5rem;
95
+ color: rgba(204, 204, 204, 0.6);
96
+ overflow: hidden;
97
+ }
98
+ .image-placeholder img {
99
+ width: 100%; /* Garante que a imagem tente ocupar 100% da largura */
100
+ height: 100%; /* Garante que a imagem tente ocupar 100% da altura */
101
+ object-fit: contain; /* Garante que a proporção seja mantida */
102
+ }
103
+ .prediction-placeholder {
104
+ min-height: 50px;
105
+ margin-bottom: 1.5rem;
106
+ padding: 10px 0;
107
+ }
108
+ .columns-container {
109
+ display: flex;
110
+ gap: 1rem;
111
+ align-items: flex-start;
112
+ }
113
+ .column {
114
+ flex: 1;
115
+ }
116
+ .button-style {
117
+ border: 2px solid white;
118
+ border-radius: 12px;
119
+ background-color: black;
120
+ color: white;
121
+ padding: 1.2rem 2rem;
122
+ font-size: 20px;
123
+ font-family: sans-serif;
124
+ cursor: pointer;
125
+ width: 100%;
126
+ text-align: center;
127
+ transition: all 0.2s ease-in-out;
128
+ height: 100%;
129
+ display: flex;
130
+ align-items: center;
131
+ justify-content: center;
132
+ text-decoration: none;
133
+ box-sizing: border-box;
134
+ }
135
+ .button-style:hover {
136
+ background-color: #333;
137
+ border-color: #9ecbff;
138
+ }
139
+ .upload-label {
140
+ display: block;
141
+ cursor: pointer;
142
+ }
143
+ #file-upload-input {
144
+ display: none;
145
+ }
146
+ .footer {
147
+ text-align: left; /* Garante o alinhamento à esquerda */
148
+ padding: 1rem 20px; /* Adiciona padding lateral para afastar da borda */
149
+ color: #aaa;
150
+ font-size: 14px;
151
+ line-height: 1.5;
152
+ }
153
+ .footer a {
154
+ color: #9ecbff !important;
155
+ text-decoration: none !important;
156
+ }
157
+ </style>
158
+ </head>
159
+ <body>
160
+ <div class="sidebar">
161
+ <div class="sidebar-logo">
162
+ <a href="index.html"><img src="pulmox_logo_v2.png" alt="PulmoX Logo" style="width: 191px; height: auto; margin-bottom: 20px;"></a>
163
+ </div>
164
+ <div class="sidebar-content">
165
+
166
+ <div class="sidebar-menu">
167
+ <a href="index.html">Sobre</a>
168
+ <a href="ai_system.html" class="active">PulmoX</a>
169
+ <a href="contact.html">Contato</a>
170
+ </div>
171
+ </div>
172
+
173
+ </div>
174
+ <div class="main-content">
175
+ <div class="main-container">
176
+ <div style="font-size:32px; font-weight:bold; margin-top:0px; line-height:1.2; margin-bottom: 1.5rem;">
177
+ Classificação de Doenças Pulmonares via IA
178
+ </div>
179
+
180
+ <div class="image-placeholder" id="image-placeholder">
181
+ <img src="doencas_pulmonares.jpg" alt="Imagem de Raio-X de Pulmão">
182
+ </div>
183
+ <div class="prediction-placeholder">
184
+ <span style="color:white; font-size:32px;">Previsão:</span>
185
+ <span id="prediction-result" style="color:#5dade2; font-size:32px;">Aguardando Ação</span>
186
+ <span id="prediction-prob" style="color:white; font-size:32px;"></span>
187
+ </div>
188
+ <div class="columns-container">
189
+ <div class="column">
190
+ <button class="button-style" id="random-button">Raios-X Aleatórios</button>
191
+ </div>
192
+ <div class="column">
193
+ <input type="file" id="file-upload-input" accept=".png">
194
+ <label for="file-upload-input" class="upload-label">
195
+ <div class="button-style">Selecionar Arquivo</div>
196
+ </label>
197
+ </div>
198
+ </div>
199
+
200
+ </div>
201
+ </div>
202
+ <script>
203
+ const resultElement = document.getElementById('prediction-result');
204
+ const probElement = document.getElementById('prediction-prob');
205
+ const imagePlaceholder = document.getElementById('image-placeholder');
206
+ const fileInput = document.getElementById('file-upload-input');
207
+
208
+ function updatePrediction(classe, prob, cor) {
209
+ resultElement.textContent = classe;
210
+ resultElement.style.color = cor;
211
+ probElement.textContent = prob > 0 ? ` - ${prob}%` : '';
212
+ }
213
+
214
+ function displayImage(file) {
215
+ const reader = new FileReader();
216
+ reader.onload = function(e) {
217
+ imagePlaceholder.innerHTML = `<img src="${e.target.result}" alt="Imagem de Raio-X">`;
218
+ };
219
+ reader.readAsDataURL(file);
220
+ }
221
+
222
+ fileInput.addEventListener('change', function(event) {
223
+ const file = event.target.files[0];
224
+ if (!file) return;
225
+
226
+ displayImage(file);
227
+
228
+ const formData = new FormData();
229
+ formData.append('file', file);
230
+
231
+ updatePrediction('Processando...', 0, '#9ecbff');
232
+
233
+ fetch('/predict', {
234
+ method: 'POST',
235
+ body: formData
236
+ })
237
+ .then(response => response.json())
238
+ .then(data => {
239
+ if (data.error) {
240
+ updatePrediction('Erro', 0, '#ff0000');
241
+ alert(`Erro na predição: ${data.error}`);
242
+ return;
243
+ }
244
+ updatePrediction(data.classe, data.prob, data.cor);
245
+ })
246
+ .catch(error => {
247
+ console.error('Erro:', error);
248
+ updatePrediction('Erro de Conexão', 0, '#ff0000');
249
+ alert('Erro ao conectar com o servidor de predição. Verifique se o servidor Flask está rodando.');
250
+ });
251
+ });
252
+
253
+ document.getElementById('random-button').addEventListener('click', function() {
254
+ updatePrediction('Buscando Imagem...', 0, '#9ecbff');
255
+
256
+ fetch('/random_predict', {
257
+ method: 'GET'
258
+ })
259
+ .then(response => response.json())
260
+ .then(data => {
261
+ if (data.error) {
262
+ updatePrediction('Erro', 0, '#ff0000');
263
+ alert(`Erro ao buscar imagem: ${data.error}`);
264
+ return;
265
+ }
266
+
267
+ const imgSource = `data:${data.image_mimetype};base64,${data.image_base64}`;
268
+ imagePlaceholder.innerHTML = `<img src="${imgSource}" alt="Imagem de Raio-X Aleatória">`;
269
+
270
+ updatePrediction(data.classe, data.prob, data.cor);
271
+ })
272
+ .catch(error => {
273
+ console.error('Erro:', error);
274
+ updatePrediction('Erro de Conexão', 0, '#ff0000');
275
+ alert('Erro ao conectar com o servidor de predição. Verifique se o servidor Flask está rodando.');
276
+ });
277
+ });
278
+ </script>
279
+ </body>
280
+ </html>
app.py ADDED
@@ -0,0 +1,185 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from flask import Flask, request, jsonify
2
+ from PIL import Image
3
+ from io import BytesIO
4
+ import numpy as np
5
+ import requests
6
+ import os
7
+ from keras.models import load_model
8
+ from keras.preprocessing import image
9
+ import warnings
10
+ import random
11
+ import base64
12
+ import shutil
13
+ from threading import Thread
14
+
15
+ # Constantes para o download
16
+ RANDOM_XRAYS_DIR = 'random_xrays'
17
+ RANDOM_XRAYS_BASE_URL = "https://raw.githubusercontent.com/vladimiralencar/Projects-2024/main/X-Rays/Dados_Raios_X/"
18
+ RANDOM_XRAYS_LIST = [
19
+ 'CHNCXR_0342_1.png','CHNCXR_0022_0.png','CHNCXR_0006_0.png','CHNCXR_0004_0.png','CHNCXR_0338_1.png',
20
+ 'CHNCXR_0340_1.png','CHNCXR_0020_0.png','CHNCXR_0019_0.png','CHNCXR_0024_0.png','CHNCXR_0344_1.png'
21
+ ]
22
+
23
+ def download_random_xrays():
24
+ """Baixa as imagens aleatórias para uma pasta local."""
25
+ if os.path.exists(RANDOM_XRAYS_DIR):
26
+ print(f"✅ Pasta '{RANDOM_XRAYS_DIR}' já existe. Pulando download.")
27
+ return
28
+
29
+ os.makedirs(RANDOM_XRAYS_DIR, exist_ok=True)
30
+ print(f"⏳ Baixando {len(RANDOM_XRAYS_LIST)} imagens para '{RANDOM_XRAYS_DIR}'...")
31
+
32
+ for filename in RANDOM_XRAYS_LIST:
33
+ url = RANDOM_XRAYS_BASE_URL + filename
34
+ local_path = os.path.join(RANDOM_XRAYS_DIR, filename)
35
+ try:
36
+ response = requests.get(url, stream=True)
37
+ response.raise_for_status()
38
+ with open(local_path, 'wb') as file:
39
+ shutil.copyfileobj(response.raw, file)
40
+ print(f" - Baixado: {filename}")
41
+ except Exception as e:
42
+ print(f" ❌ Erro ao baixar {filename}: {e}")
43
+
44
+ print("✅ Download de imagens aleatórias concluído.")
45
+
46
+ warnings.filterwarnings("ignore")
47
+
48
+ app = Flask(__name__, static_folder='.', static_url_path='/')
49
+
50
+ # ===========================
51
+ # Carregamento do modelo
52
+ # ===========================
53
+ MODEL_PATH = 'modelo_raiox.keras'
54
+ MODEL = None
55
+
56
+ try:
57
+ if not os.path.exists(MODEL_PATH):
58
+ print(f"❌ Arquivo de modelo '{MODEL_PATH}' não encontrado. A predição não funcionará.")
59
+ else:
60
+ MODEL = load_model(MODEL_PATH, compile=False)
61
+ print("✅ Modelo carregado com sucesso.")
62
+ except Exception as e:
63
+ print(f"❌ Erro ao carregar o modelo: {e}")
64
+
65
+ # ===========================
66
+ # Função de predição (Adaptada para Flask)
67
+ # ===========================
68
+ def predict_image(img_data):
69
+ """
70
+ Realiza a predição em um objeto PIL Image.
71
+ Retorna um dicionário com a classe, probabilidade e cores.
72
+ """
73
+ if MODEL is None:
74
+ return {
75
+ "classe": "Erro",
76
+ "prob": 0,
77
+ "cor": "#ff0000",
78
+ "mensagem": "Modelo não carregado."
79
+ }
80
+
81
+ IMAGE_HEIGHT, IMAGE_WIDTH = 96, 96
82
+ categories = ['Normal', 'Tuberculose']
83
+
84
+ # 1. Pré-processamento
85
+ img = img_data.convert("RGB").resize((IMAGE_HEIGHT, IMAGE_WIDTH))
86
+ img = image.img_to_array(img)
87
+ img = np.expand_dims(img, axis=0) / 255.0
88
+
89
+ # 2. Predição
90
+ pred = MODEL.predict(img, verbose=0)
91
+ classe_idx = np.argmax(pred)
92
+ prob = np.max(pred) * 100
93
+
94
+ # 3. Formatação do resultado
95
+ classe = categories[classe_idx]
96
+ cor_classe = "#5dade2" if classe_idx == 0 else "#e74c3c"
97
+
98
+ return {
99
+ "classe": classe,
100
+ "prob": round(prob),
101
+ "cor": cor_classe,
102
+ "mensagem": "Predição realizada com sucesso."
103
+ }
104
+
105
+ # ===========================
106
+ # Rotas do Flask
107
+
108
+ @app.route('/random_predict', methods=['GET'])
109
+ def random_predict():
110
+ """Endpoint para buscar uma imagem aleatória local, realizar a predição e retornar a imagem em base64 e o resultado."""
111
+
112
+ if not os.path.exists(RANDOM_XRAYS_DIR) or not os.listdir(RANDOM_XRAYS_DIR):
113
+ return jsonify({"error": "Imagens aleatórias não encontradas. Verifique o download."}), 500
114
+
115
+ # 1. Escolher uma imagem localmente
116
+ imagens_locais = os.listdir(RANDOM_XRAYS_DIR)
117
+ nome_imagem = random.choice(imagens_locais)
118
+ local_path = os.path.join(RANDOM_XRAYS_DIR, nome_imagem)
119
+
120
+ try:
121
+ # 2. Carregar a imagem para predição
122
+ # 2. Carregar a imagem para predição
123
+ with open(local_path, 'rb') as f:
124
+ img_data = f.read()
125
+
126
+ # 3. Realizar a predição
127
+ img = Image.open(BytesIO(img_data))
128
+ result = predict_image(img)
129
+
130
+ # 4. Codificar a imagem em Base64 para envio ao frontend
131
+ img_base64 = base64.b64encode(img_data).decode('utf-8')
132
+
133
+ # 5. Combinar resultado da predição com a imagem
134
+ result['image_base64'] = img_base64
135
+ result['image_mimetype'] = 'image/png' # Assumindo que as imagens são PNG
136
+
137
+ return jsonify(result)
138
+
139
+ except Exception as e:
140
+ print(f"Erro interno no random_predict (local): {e}")
141
+ return jsonify({"error": f"Erro interno: {e}"}), 500
142
+
143
+ @app.route('/')
144
+ # ===========================
145
+
146
+ @app.route('/')
147
+ def index():
148
+ """Serve o arquivo HTML principal."""
149
+ # O Flask está configurado para servir arquivos estáticos da pasta atual.
150
+ # A rota '/' irá servir o index.html.
151
+ return app.send_static_file('index.html')
152
+
153
+ @app.route('/predict', methods=['POST'])
154
+ def predict():
155
+ """Endpoint para receber o arquivo e realizar a predição."""
156
+ if 'file' not in request.files:
157
+ return jsonify({"error": "Nenhum arquivo enviado"}), 400
158
+
159
+ file = request.files['file']
160
+
161
+ if file.filename == '':
162
+ return jsonify({"error": "Nome de arquivo vazio"}), 400
163
+
164
+ if file and file.filename.endswith('.png'):
165
+ try:
166
+ # Lê o arquivo diretamente para um objeto PIL Image
167
+ img = Image.open(BytesIO(file.read()))
168
+
169
+ # Realiza a predição
170
+ result = predict_image(img)
171
+
172
+ return jsonify(result)
173
+
174
+ except Exception as e:
175
+ print(f"Erro durante a predição: {e}")
176
+ return jsonify({"error": f"Erro interno durante a predição: {e}"}), 500
177
+
178
+ return jsonify({"error": "Formato de arquivo inválido. Apenas .png é aceito."}), 400
179
+
180
+ if __name__ == '__main__':
181
+ # Inicia o download das imagens em uma thread separada para não bloquear o servidor
182
+ download_thread = Thread(target=download_random_xrays)
183
+ download_thread.start()
184
+
185
+ app.run(debug=True)
contact.html ADDED
@@ -0,0 +1,123 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="pt-BR">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>PulmoX - Contact</title>
7
+ <style>
8
+ body {
9
+ font-family: sans-serif;
10
+ background-color: #0e1117;
11
+ color: white;
12
+ margin: 0;
13
+ padding: 0;
14
+ display: flex;
15
+ }
16
+ .sidebar {
17
+ width: 280px;
18
+ min-height: 100vh;
19
+ background-color: rgba(127, 36, 25, 0.4);
20
+ backdrop-filter: blur(10px);
21
+ color: white;
22
+ padding: 20px;
23
+ box-sizing: border-box;
24
+ flex-shrink: 0;
25
+ display: flex;
26
+ flex-direction: column;
27
+ }
28
+ .sidebar-content {
29
+ flex-grow: 1;
30
+ }
31
+ .sidebar-image {
32
+ margin-top: auto;
33
+ padding-top: 20px;
34
+ text-align: left;
35
+ }
36
+ .sidebar-image img {
37
+ max-width: 100%;
38
+ height: auto;
39
+ border-radius: 8px;
40
+ }
41
+ .sidebar-logo {
42
+ text-align: left; /* Alinha a logomarca à esquerda */
43
+ padding: 20px 0 0 20px; /* Ajusta o padding para o alinhamento */
44
+ background-color: transparent; /* Cor de fundo da sidebar */
45
+ }
46
+ .sidebar-menu {
47
+ margin-top: 40px; /* Aumenta o espaço entre a logo e o menu */
48
+ margin-bottom: 20px;
49
+ }
50
+ .sidebar-menu a {
51
+ display: block;
52
+ color: white;
53
+ text-decoration: none;
54
+ padding: 15px 20px; /* Aumenta o padding */
55
+ margin: 5px -20px; /* Estende a área de destaque para a borda da sidebar */
56
+ font-size: 28px; /* Aumenta a fonte para maior visibilidade */
57
+ font-family: sans-serif; /* Volta para a fonte padrão do corpo, mais legível */
58
+ font-weight: 700; /* Negrito, mas não excessivo */
59
+ transition: all 0.2s ease-in-out;
60
+ border-radius: 0 10px 10px 0; /* Borda arredondada no lado direito */
61
+ }
62
+ .sidebar-menu a:hover {
63
+ background-color: #0e1117; /* Cor de fundo escura para destaque */
64
+ color: #9ecbff; /* Cor do texto de destaque */
65
+ box-shadow: 0 0 5px rgba(0, 0, 0, 0.3); /* Sombra sutil no hover */
66
+ }
67
+ .sidebar-menu a.active {
68
+ background-color: #0e1117; /* Cor de fundo escura para destaque */
69
+ color: #9ecbff; /* Cor do texto de destaque */
70
+ box-shadow: 0 0 10px rgba(0, 0, 0, 0.5); /* Sombra apenas no ativo */
71
+ font-weight: bold;
72
+ border-left: 5px solid #9ecbff; /* Linha de destaque na lateral */
73
+ padding-left: 15px; /* Ajusta o padding para compensar a borda */
74
+ }
75
+ .main-content {
76
+ flex-grow: 1;
77
+ padding: 1rem 2rem;
78
+ box-sizing: border-box;
79
+ }
80
+ .main-container {
81
+ max-width: 700px;
82
+ margin: 0 auto;
83
+ }
84
+ .contact-info {
85
+ margin-top: 2rem;
86
+ font-size: 18px; /* Aumenta a fonte para 18px */
87
+ line-height: 1.8;
88
+ text-align: left; /* Garante o alinhamento à esquerda do conteúdo de contato */
89
+ }
90
+ .contact-info a {
91
+ color: #9ecbff !important;
92
+ text-decoration: none !important;
93
+ }
94
+ </style>
95
+ </head>
96
+ <body>
97
+ <div class="sidebar">
98
+ <div class="sidebar-logo">
99
+ <a href="index.html"><img src="pulmox_logo_v2.png" alt="PulmoX Logo" style="width: 191px; height: auto; margin-bottom: 20px;"></a>
100
+ </div>
101
+ <div class="sidebar-content">
102
+ <div class="sidebar-menu">
103
+ <a href="index.html">Sobre</a>
104
+ <a href="ai_system.html">PulmoX</a>
105
+ <a href="contact.html" class="active">Contato</a>
106
+ </div>
107
+ </div>
108
+
109
+ </div>
110
+ <div class="main-content">
111
+ <div class="main-container">
112
+ <h1>Contato e Informações do Projeto</h1>
113
+ <div class="contact-info">
114
+ <p><strong>PulmoX - versão 1.6</strong></p>
115
+ <p>Desenvolvido por:<br> Prof. Dr. Vladimir C. Alencar e Pesquisadores Associados</p>
116
+ <p>LANA/UEPB</p>
117
+ <p>Campina Grande. Paraíba. Brasil. 2025</p>
118
+ <p><a href="https://www.valencar.com" target="_blank">www.valencar.com</a></p>
119
+ </div>
120
+ </div>
121
+ </div>
122
+ </body>
123
+ </html>
doencas_pulmonares.jpg ADDED

Git LFS Details

  • SHA256: 3e91aa3ceba63ae41ea05a132513255c5cb88af4754c95cbefa88e472f373c00
  • Pointer size: 131 Bytes
  • Size of remote file: 112 kB
imagem_random.png ADDED

Git LFS Details

  • SHA256: 84232c59a9d758336b90cb2e0270d830777d9f9e97069d73d29a884e4269624f
  • Pointer size: 131 Bytes
  • Size of remote file: 135 kB
index.html ADDED
@@ -0,0 +1,324 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="pt-BR">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>PulmoX - About</title>
7
+ <style>
8
+ body {
9
+ font-family: sans-serif;
10
+ background-color: #0e1117;
11
+ color: white;
12
+ margin: 0;
13
+ padding: 0;
14
+ display: flex;
15
+ }
16
+ .sidebar {
17
+ width: 280px;
18
+ min-height: 100vh;
19
+ background-color: rgba(127, 36, 25, 0.4);
20
+ backdrop-filter: blur(10px);
21
+ color: white;
22
+ padding: 20px;
23
+ box-sizing: border-box;
24
+ flex-shrink: 0;
25
+ display: flex; /* Adicionado para layout flexível */
26
+ flex-direction: column; /* Organiza os itens verticalmente */
27
+ }
28
+ .sidebar-content {
29
+ flex-grow: 1; /* Permite que o conteúdo cresça e empurre a imagem para baixo */
30
+ }
31
+ .sidebar-image {
32
+ margin-top: auto; /* Empurra a imagem para o final */
33
+ padding-top: 20px;
34
+ text-align: left;
35
+ }
36
+ .sidebar-image img {
37
+ max-width: 100%;
38
+ height: auto;
39
+ border-radius: 8px;
40
+ }
41
+ .sidebar-logo {
42
+ text-align: left; /* Alinha a logomarca à esquerda */
43
+ padding: 20px 0 0 20px; /* Ajusta o padding para o alinhamento */
44
+ background-color: transparent; /* Cor de fundo da sidebar */
45
+ }
46
+ .sidebar-menu {
47
+ margin-top: 40px; /* Aumenta o espaço entre a logo e o menu */
48
+ margin-bottom: 20px;
49
+ }
50
+ .sidebar-menu a {
51
+ display: block;
52
+ color: white;
53
+ text-decoration: none;
54
+ padding: 15px 20px; /* Aumenta o padding */
55
+ margin: 5px -20px; /* Estende a área de destaque para a borda da sidebar */
56
+ font-size: 28px; /* Aumenta a fonte para maior visibilidade */
57
+ font-family: sans-serif; /* Volta para a fonte padrão do corpo, mais legível */
58
+ font-weight: 700; /* Negrito, mas não excessivo */
59
+ transition: all 0.2s ease-in-out;
60
+ border-radius: 0 10px 10px 0; /* Borda arredondada no lado direito */
61
+ }
62
+ .sidebar-menu a:hover {
63
+ background-color: #0e1117; /* Cor de fundo escura para destaque */
64
+ color: #9ecbff; /* Cor do texto de destaque */
65
+ box-shadow: 0 0 5px rgba(0, 0, 0, 0.3); /* Sombra sutil no hover */
66
+ }
67
+ .sidebar-menu a.active {
68
+ background-color: #0e1117; /* Cor de fundo escura para destaque */
69
+ color: #9ecbff; /* Cor do texto de destaque */
70
+ box-shadow: 0 0 10px rgba(0, 0, 0, 0.5); /* Sombra apenas no ativo */
71
+ font-weight: bold;
72
+ border-left: 5px solid #9ecbff; /* Linha de destaque na lateral */
73
+ padding-left: 15px; /* Ajusta o padding para compensar a borda */
74
+ }
75
+ .main-content {
76
+ flex-grow: 1;
77
+ padding: 1rem 2rem;
78
+ box-sizing: border-box;
79
+ }
80
+ .main-container {
81
+ max-width: 700px;
82
+ margin: 0 auto;
83
+ }
84
+ .image-placeholder {
85
+ width: 100%;
86
+ height: 520px; /* Aumentado em 30% de 400px */
87
+ background-color: #333;
88
+ border-radius: 8px;
89
+ display: flex;
90
+ align-items: center;
91
+ justify-content: center;
92
+ margin-bottom: 1.5rem;
93
+ font-size: 1.5rem;
94
+ color: rgba(204, 204, 204, 0.6);
95
+ overflow: hidden;
96
+ }
97
+ .image-placeholder img {
98
+ width: 100%; /* Garante que a imagem tente ocupar 100% da largura */
99
+ height: 100%; /* Garante que a imagem tente ocupar 100% da altura */
100
+ object-fit: contain; /* Garante que a proporção seja mantida */
101
+ }
102
+ .prediction-placeholder {
103
+ min-height: 50px;
104
+ margin-bottom: 1.5rem;
105
+ padding: 10px 0;
106
+ }
107
+ .columns-container {
108
+ display: flex;
109
+ gap: 1rem;
110
+ align-items: flex-start;
111
+ }
112
+ .column {
113
+ flex: 1;
114
+ }
115
+ .button-style {
116
+ border: 2px solid white;
117
+ border-radius: 12px;
118
+ background-color: black;
119
+ color: white;
120
+ padding: 1.2rem 2rem;
121
+ font-size: 20px;
122
+ font-family: sans-serif;
123
+ cursor: pointer;
124
+ width: 100%;
125
+ text-align: center;
126
+ transition: all 0.2s ease-in-out;
127
+ height: 100%;
128
+ display: flex;
129
+ align-items: center;
130
+ justify-content: center;
131
+ text-decoration: none;
132
+ box-sizing: border-box;
133
+ }
134
+ .button-style:hover {
135
+ background-color: #333;
136
+ border-color: #9ecbff;
137
+ }
138
+ .upload-label {
139
+ display: block;
140
+ cursor: pointer;
141
+ }
142
+ #file-upload-input {
143
+ display: none;
144
+ }
145
+ .footer {
146
+ text-align: left; /* Garante o alinhamento à esquerda */
147
+ padding: 1rem 0;
148
+ color: #aaa;
149
+ font-size: 14px;
150
+ line-height: 1.5;
151
+ }
152
+ .footer a {
153
+ color: #9ecbff !important;
154
+ text-decoration: none !important;
155
+ }
156
+ /* Estilos adicionados do pulmox_landing.html para a página About */
157
+ .about-content h2 {
158
+ font-size: 24px;
159
+ margin-top: 1.5rem;
160
+ margin-bottom: 0.5rem;
161
+ }
162
+ .about-content p.lead {
163
+ color: #aaa;
164
+ font-size: 16px;
165
+ margin-bottom: 1.5rem;
166
+ }
167
+ .about-content .card {
168
+ background-color: #1a1a1a;
169
+ border-radius: 8px;
170
+ padding: 15px;
171
+ box-shadow: 0 4px 12px rgba(0,0,0,0.3);
172
+ }
173
+ .about-content .pill {
174
+ display: inline-block;
175
+ padding: 4px 8px;
176
+ border-radius: 999px;
177
+ background-color: #333;
178
+ font-weight: 700;
179
+ color: rgba(204, 204, 204, 0.6);
180
+ font-size: 12px;
181
+ }
182
+ .about-content .muted {
183
+ color: #aaa;
184
+ }
185
+ .about-content .section-title {
186
+ font-size: 20px;
187
+ margin-top: 1.5rem;
188
+ margin-bottom: 0.5rem;
189
+ }
190
+ .about-content .section-sub {
191
+ color: #aaa;
192
+ margin-bottom: 1rem;
193
+ }
194
+ .about-content .pipeline {
195
+ display: flex;
196
+ gap: 10px;
197
+ flex-wrap: wrap;
198
+ }
199
+ .about-content .step {
200
+ flex: 1;
201
+ min-width: 150px;
202
+ background-color: #222;
203
+ padding: 10px;
204
+ border-radius: 6px;
205
+ }
206
+ .about-content .step h4 {
207
+ margin: 0 0 5px;
208
+ font-size: 14px;
209
+ }
210
+ .about-content .step p {
211
+ margin: 0;
212
+ color: #aaa;
213
+ font-size: 13px;
214
+ }
215
+ .about-content .grid {
216
+ display: grid;
217
+ grid-template-columns: repeat(3, 1fr);
218
+ gap: 15px;
219
+ margin-top: 15px;
220
+ }
221
+ .about-content .feature h3 {
222
+ margin: 0 0 5px;
223
+ }
224
+ .about-content .feature p {
225
+ margin: 0;
226
+ color: #aaa;
227
+ font-size: 14px;
228
+ }
229
+ @media (max-width: 768px) {
230
+ .about-content .grid {
231
+ grid-template-columns: 1fr;
232
+ }
233
+ }
234
+ </style>
235
+ </head>
236
+ <body>
237
+ <div class="sidebar">
238
+ <div class="sidebar-logo">
239
+ <a href="index.html"><img src="pulmox_logo_v2.png" alt="PulmoX Logo" style="width: 191px; height: auto; margin-bottom: 20px;"></a>
240
+ </div>
241
+ <div class="sidebar-content">
242
+
243
+ <div class="sidebar-menu">
244
+ <a href="index.html" class="active">Sobre</a>
245
+ <a href="ai_system.html">PulmoX</a>
246
+ <a href="contact.html">Contato</a>
247
+ </div>
248
+ </div>
249
+
250
+ </div>
251
+ <div class="main-content">
252
+ <div class="main-container">
253
+ <div style="font-size:32px; font-weight:bold; margin-top:0px; line-height:1.2; margin-bottom: 1.5rem;">
254
+ Classificação de Doenças Pulmonares via IA
255
+ </div>
256
+ <div class="about-intro" style="margin-bottom: 2rem; padding: 1.5rem; background-color: rgba(26, 26, 26, 0.6); border-radius: 8px; backdrop-filter: blur(10px);">
257
+ <h1>About PulmoX</h1>
258
+ <p style="font-size: 18px; line-height: 1.6;">PulmoX – Um Sistema para Classificação de Doenças Pulmonares em Imagens de Raios-X com Aplicação de Técnicas de Inteligência Artificial.</p>
259
+ <p style="font-size: 18px; line-height: 1.6;">Ele usa técnicas de Deep Learning com Transfer Learning e Vision Transformers (ViT) para classificação de doenças pulmonares em imagens de Raios-X de Pulmão.</p>
260
+ <p style="font-size: 18px; line-height: 1.6;">Foram obtidas pouco mais de 7.000 imagens de Raios-X etiquetadas com as patologias, de fontes open source.</p>
261
+ </div>
262
+ <hr style="border-color: #333; margin: 2rem 0;">
263
+ <div class="about-content">
264
+ <h2>PulmoX — Inteligência Artificial para Diagnósticos Pulmonares Mais Rápidos e Confiáveis</h2>
265
+ <p class="lead">Analise automaticamente raios‑X de tórax com modelos de ponta: Transfer Learning e Vision Transformers (ViT). Otimize triagens, padronize laudos e acelere decisões clínicas.</p>
266
+ <div style="margin-top:18px" class="card">
267
+ <div style="display:flex;align-items:center;justify-content:space-between;gap:12px">
268
+ <div>
269
+ <div class="pill">Treinado com +7.000 imagens rotuladas</div>
270
+ <div style="font-weight:700;margin-top:8px">Precisão clínica para triagem e apoio diagnóstico</div>
271
+ <div class="muted" style="margin-top:6px;font-size:13px">Compatível com fluxos DICOM e integração via API</div>
272
+ </div>
273
+ <div style="text-align:right;font-size:12px;color:var(--muted)">Adequado para hospitais, clínicas e centros de pesquisa</div>
274
+ </div>
275
+ </div>
276
+ <section style="margin-top: 2rem;">
277
+ <h2 class="section-title">Como Funciona</h2>
278
+ <p class="section-sub">Pipeline simples e integrado para incorporar IA ao seu fluxo de trabalho clínico.</p>
279
+ <div class="pipeline">
280
+ <div class="step">
281
+ <h4>1. Upload / Integração DICOM</h4>
282
+ <p>O PulmoX recebe imagens em formatos clínicos e as prepara para análise.</p>
283
+ </div>
284
+ <div class="step">
285
+ <h4>2. Pré‑processamento</h4>
286
+ <p>Normalização, redimensionamento e melhoria de contraste para robustez do modelo.</p>
287
+ </div>
288
+ <div class="step">
289
+ <h4>3. Inferência com ViT</h4>
290
+ <p>Vision Transformers e Transfer Learning para extração de padrões sutis.</p>
291
+ </div>
292
+ <div class="step">
293
+ <h4>4. Mapa de Calor & Classe</h4>
294
+ <p>Geração de probabilidades, mapa de calor explicável e relatório pré‑formatado.</p>
295
+ </div>
296
+ <div class="step">
297
+ <h4>5. Integração e Laudo</h4>
298
+ <p>API para integração com PACS, EMR ou exportação em PDF.</p>
299
+ </div>
300
+ </div>
301
+ </section>
302
+ <section style="margin-top: 2rem;">
303
+ <h2 class="section-title">Base de Treinamento</h2>
304
+ <p class="section-sub">Modelo treinado com um conjunto open source de mais de 7.000 imagens de raios‑X rotuladas cobrindo patologias relevantes.</p>
305
+ <div class="grid">
306
+ <div class="card feature">
307
+ <h3>Robustez</h3>
308
+ <p>Treinamento com imagens de diferentes equipamentos e resoluções para melhor generalização.</p>
309
+ </div>
310
+ <div class="card feature">
311
+ <h3>Variedade Clínica</h3>
312
+ <p>Patologias múltiplas representadas para permitir classificação multi‑rótulo.</p>
313
+ </div>
314
+ <div class="card feature">
315
+ <h3>Atualizações</h3>
316
+ <p>Pipeline que suporta re‑treinamento contínuo e incorporação de novas anotações.</p>
317
+ </div>
318
+ </div>
319
+ </section>
320
+ </div>
321
+ </div>
322
+ </div>
323
+ </body>
324
+ </html>
modelo_raiox.keras ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c3fa34d7b1ad08c3eff75e4818c2a7ad85481ccf02c48e5ef596c620b7abe53b
3
+ size 13364273
pulmox_landing.html ADDED
@@ -0,0 +1,357 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="pt-BR">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <title>PulmoX — Inteligência Artificial para Diagnósticos Pulmonares</title>
7
+ <meta name="description" content="PulmoX: Sistema de IA para classificação de doenças pulmonares em imagens de raios‑X. Transfer Learning, Vision Transformers (ViT) e mais de 7.000 imagens rotuladas.">
8
+ <style>
9
+ :root{
10
+ --bg:#0f1724; --card:#0b1220; --muted:#94a3b8; --accent:#4f46e5; --accent-2:#06b6d4; --glass: rgba(255,255,255,0.04);
11
+ --radius:12px; --maxw:1100px; --gap:24px; --container-padding:20px;
12
+ font-family: Inter, ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial;
13
+ }
14
+ *{box-sizing:border-box}
15
+ html,body{height:100%}
16
+ body{margin:0;background:linear-gradient(180deg,#071029 0%, #071227 45%, #071b2b 100%);color:#e6eef8;line-height:1.45}
17
+ .container{max-width:var(--maxw);margin:0 auto;padding:48px var(--container-padding)}
18
+
19
+ /* Header */
20
+ header{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:36px}
21
+ .brand{display:flex;align-items:center;gap:12px}
22
+ .logo{width:48px;height:48px;border-radius:10px;background:linear-gradient(135deg,var(--accent),var(--accent-2));display:flex;align-items:center;justify-content:center;box-shadow:0 6px 18px rgba(79,70,229,0.18)}
23
+ .logo svg{width:26px;height:26px}
24
+ .brand h1{font-size:18px;margin:0}
25
+ nav{display:flex;gap:18px;align-items:center}
26
+ nav a{color:var(--muted);text-decoration:none;font-weight:600;font-size:14px}
27
+ .cta{background:linear-gradient(90deg,var(--accent),var(--accent-2));padding:10px 16px;border-radius:10px;color:white;text-decoration:none;font-weight:700}
28
+
29
+ /* Hero */
30
+ .hero{display:grid;grid-template-columns:1fr 460px;gap:32px;align-items:center;margin-bottom:48px}
31
+ .hero h2{font-size:34px;margin:0 0 12px}
32
+ .hero p.lead{color:var(--muted);font-size:16px;margin:0 0 20px}
33
+ .hero .actions{display:flex;gap:12px}
34
+ .btn{padding:12px 16px;border-radius:10px;text-decoration:none;font-weight:700}
35
+ .btn-primary{background:linear-gradient(90deg,var(--accent),#7c3aed);color:white}
36
+ .btn-ghost{border:1px solid rgba(255,255,255,0.06);color:var(--muted);background:transparent}
37
+
38
+ /* Card */
39
+ .card{background:linear-gradient(180deg,rgba(255,255,255,0.02),transparent);border-radius:var(--radius);padding:18px;box-shadow:0 6px 20px rgba(2,6,23,0.6);backdrop-filter: blur(5px);}
40
+
41
+ /* Features grid */
42
+ .grid{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;margin-top:18px}
43
+ .feature h3{margin:0 0 8px}
44
+ .feature p{margin:0;color:var(--muted);font-size:14px}
45
+
46
+ /* Responsive */
47
+ @media (max-width:980px){
48
+ .hero{grid-template-columns:1fr;}
49
+ .grid{grid-template-columns:repeat(2,1fr)}
50
+ }
51
+ @media (max-width:620px){
52
+ .container{padding:28px 16px}
53
+ nav{display:none}
54
+ .grid{grid-template-columns:1fr}
55
+ }
56
+
57
+ /* Sections */
58
+ section{margin-bottom:48px}
59
+ h2.section-title{font-size:22px;margin:0 0 12px}
60
+ p.section-sub{color:var(--muted);margin:0 0 18px}
61
+
62
+ /* Pipeline */
63
+ .pipeline{display:flex;gap:12px;flex-wrap:wrap}
64
+ .step{flex:1;min-width:180px;background:var(--glass);padding:12px;border-radius:10px}
65
+ .step h4{margin:0 0 6px;font-size:14px}
66
+ .step p{margin:0;color:var(--muted);font-size:13px}
67
+
68
+ /* Testimonials */
69
+ .testimonials{display:grid;grid-template-columns:repeat(2,1fr);gap:18px}
70
+ .testimonial p{color:var(--muted);font-size:14px}
71
+ .quote{font-weight:600}
72
+ @media(max-width:760px){.testimonials{grid-template-columns:1fr}}
73
+
74
+ /* CTA large */
75
+ .cta-large{display:flex;align-items:center;justify-content:space-between;padding:22px;border-radius:14px;background:linear-gradient(90deg,rgba(79,70,229,0.12),rgba(6,182,212,0.06));}
76
+ .cta-large h3{margin:0}
77
+ .cta-large p{margin:6px 0 0;color:var(--muted)}
78
+
79
+ footer{color:var(--muted);font-size:13px;padding:36px 0 80px}
80
+
81
+ /* small helpers */
82
+ .muted{color:var(--muted)}
83
+ .pill{display:inline-block;padding:6px 10px;border-radius:999px;background:rgba(255,255,255,0.03);font-weight:700;color:var(--muted);font-size:12px}
84
+
85
+ /* image mock */
86
+ .xray-mock{width:100%;height:340px;border-radius:12px;background:rgba(9, 18, 39, 0.6);backdrop-filter: blur(10px);display:flex;flex-direction:column;align-items:center;justify-content:center;position:relative;overflow:hidden}
87
+ .xray-mock .overlay{position:absolute;inset:12px;border-radius:10px;background:linear-gradient(180deg,rgba(255,255,255,0.02),transparent)}
88
+ .xray-outline{width:86%;height:78%;border-radius:6px;background:linear-gradient(180deg,#e6eef830,#9fb3c030);display:flex;align-items:center;justify-content:center;color:rgba(219, 238, 254, 0.6);font-weight:700}
89
+
90
+ /* tiny form */
91
+ .form-inline{display:flex;gap:8px;align-items:center}
92
+ .form-inline input{padding:10px 12px;border-radius:10px;border:1px solid rgba(255,255,255,0.04);background:transparent;color:inherit}
93
+ .form-inline button{padding:10px 12px;border-radius:10px;background:var(--accent);border:none;color:white}
94
+
95
+ /* code block */
96
+ pre{background:#071127;padding:12px;border-radius:10px;color:#c6f6ff;overflow:auto}
97
+ </style>
98
+ </head>
99
+ <body>
100
+ <div class="container">
101
+ <header>
102
+ <div class="brand">
103
+ <div class="logo" aria-hidden>
104
+ <!-- simple lung + pixel icon -->
105
+ <svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M7 3c-1.1 0-2 .9-2 2v4c0 2.8 2.2 5 5 5h2" stroke="white" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" opacity="0.95"/><path d="M17 3c1.1 0 2 .9 2 2v4c0 2.8-2.2 5-5 5h-2" stroke="white" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" opacity="0.95"/></svg>
106
+ </div>
107
+ <div>
108
+ <h1>PulmoX</h1>
109
+ <div class="muted" style="font-size:13px;margin-top:3px">AI | Radiologia | Diagnóstico</div>
110
+ </div>
111
+ </div>
112
+
113
+ <nav>
114
+ <a href="#como-funciona">Como funciona</a>
115
+ <a href="#beneficios">Benefícios</a>
116
+ <a href="#casos">Casos de Uso</a>
117
+ <a href="#contato" class="cta">Solicitar Demonstração</a>
118
+ </nav>
119
+ </header>
120
+
121
+ <!-- HERO -->
122
+ <main class="hero">
123
+ <div>
124
+ <h2>PulmoX — Inteligência Artificial para Diagnósticos Pulmonares Mais Rápidos e Confiáveis</h2>
125
+ <p class="lead">Analise automaticamente raios‑X de tórax com modelos de ponta: Transfer Learning e Vision Transformers (ViT). Otimize triagens, padronize laudos e acelere decisões clínicas.</p>
126
+ <div class="actions">
127
+ <a class="btn btn-primary" href="#contato">Solicitar Demonstração</a>
128
+ <a class="btn btn-ghost" href="#como-funciona">Ver Tecnologia</a>
129
+ </div>
130
+
131
+ <div style="margin-top:18px" class="card">
132
+ <div style="display:flex;align-items:center;justify-content:space-between;gap:12px">
133
+ <div>
134
+ <div class="pill">Treinado com +7.000 imagens rotuladas</div>
135
+ <div style="font-weight:700;margin-top:8px">Precisão clínica para triagem e apoio diagnóstico</div>
136
+ <div class="muted" style="margin-top:6px;font-size:13px">Compatível com fluxos DICOM e integração via API</div>
137
+ </div>
138
+ <div style="text-align:right;font-size:12px;color:var(--muted)">Adequado para hospitais, clínicas e centros de pesquisa</div>
139
+ </div>
140
+ </div>
141
+ </div>
142
+
143
+ <aside>
144
+ <div class="card xray-mock" aria-hidden>
145
+ <div class="overlay"></div>
146
+ <div class="xray-outline">Visualização de Raio‑X + Mapa de Calor (Heatmap)</div>
147
+ </div>
148
+
149
+ <div style="display:flex;gap:12px;margin-top:12px">
150
+ <div class="card" style="flex:1">
151
+ <strong>Tempo médio de análise</strong>
152
+ <div class="muted">Redução de até 40% no tempo de triagem clínico</div>
153
+ </div>
154
+ <div class="card" style="width:160px;text-align:center">
155
+ <strong>Escalável</strong>
156
+ <div class="muted">Nuvem ou on‑premise</div>
157
+ </div>
158
+ </div>
159
+ </aside>
160
+ </main>
161
+
162
+ <!-- Features -->
163
+ <section id="como-funciona">
164
+ <h2 class="section-title">Como Funciona</h2>
165
+ <p class="section-sub">Pipeline simples e integrado para incorporar IA ao seu fluxo de trabalho clínico.</p>
166
+ <div class="pipeline">
167
+ <div class="step">
168
+ <h4>1. Upload / Integração DICOM</h4>
169
+ <p>O PulmoX recebe imagens em formatos clínicos e as prepara para análise.</p>
170
+ </div>
171
+ <div class="step">
172
+ <h4>2. Pré‑processamento</h4>
173
+ <p>Normalização, redimensionamento e melhoria de contraste para robustez do modelo.</p>
174
+ </div>
175
+ <div class="step">
176
+ <h4>3. Inferência com ViT</h4>
177
+ <p>Vision Transformers e Transfer Learning para extração de padrões sutis.</p>
178
+ </div>
179
+ <div class="step">
180
+ <h4>4. Mapa de Calor & Classe</h4>
181
+ <p>Geração de probabilidades, mapa de calor explicável e relatório pré‑formatado.</p>
182
+ </div>
183
+ <div class="step">
184
+ <h4>5. Integração e Laudo</h4>
185
+ <p>API para integração com PACS, EMR ou exportação em PDF.</p>
186
+ </div>
187
+ </div>
188
+ </section>
189
+
190
+ <!-- Dataset -->
191
+ <section>
192
+ <h2 class="section-title">Base de Treinamento</h2>
193
+ <p class="section-sub">Modelo treinado com um conjunto open source de mais de 7.000 imagens de raios‑X rotuladas cobrindo patologias relevantes.</p>
194
+
195
+ <div class="grid">
196
+ <div class="card feature">
197
+ <h3>Robustez</h3>
198
+ <p>Treinamento com imagens de diferentes equipamentos e resoluções para melhor generalização.</p>
199
+ </div>
200
+ <div class="card feature">
201
+ <h3>Variedade Clínica</h3>
202
+ <p>Patologias múltiplas representadas para permitir classificação multi‑rótulo.</p>
203
+ </div>
204
+ <div class="card feature">
205
+ <h3>Atualizações</h3>
206
+ <p>Pipeline que suporta re‑treinamento contínuo e incorporação de novas anotações.</p>
207
+ </div>
208
+ </div>
209
+ </section>
210
+
211
+ <!-- Benefits -->
212
+ <section id="beneficios">
213
+ <h2 class="section-title">Benefícios para sua Instituição</h2>
214
+ <p class="section-sub">Resultados práticos que impactam a operação e a qualidade do atendimento.</p>
215
+
216
+ <div class="grid">
217
+ <div class="card">
218
+ <h3>Agilidade operacional</h3>
219
+ <p class="muted">Triagens mais rápidas e filas de espera reduzidas.</p>
220
+ </div>
221
+ <div class="card">
222
+ <h3>Padronização</h3>
223
+ <p class="muted">Menos variabilidade entre profissionais, maior consistência diagnóstica.</p>
224
+ </div>
225
+ <div class="card">
226
+ <h3>Suporte à Decisão</h3>
227
+ <p class="muted">Relatórios com probabilidade e mapas que auxiliam a interpretação clínica.</p>
228
+ </div>
229
+ </div>
230
+ </section>
231
+
232
+ <!-- Integration -->
233
+ <section>
234
+ <h2 class="section-title">Integração & Segurança</h2>
235
+ <p class="section-sub">Fácil integração via API, compatibilidade DICOM e opções de implantação seguras.</p>
236
+ <div style="display:flex;gap:18px;align-items:flex-start;flex-wrap:wrap">
237
+ <div class="card" style="flex:1;min-width:260px">
238
+ <h3>APIs e SDKs</h3>
239
+ <p class="muted">Endpoints REST, exemplos em Python e suporte a integração com PACS.</p>
240
+ </div>
241
+ <div class="card" style="flex:1;min-width:260px">
242
+ <h3>Conformidade</h3>
243
+ <p class="muted">Processamento em ambiente seguro, com opções on‑premise para dados sensíveis.</p>
244
+ </div>
245
+ <div class="card" style="flex:1;min-width:260px">
246
+ <h3>Escalabilidade</h3>
247
+ <p class="muted">From single‑server deployments to cloud clusters—scale as you need.</p>
248
+ </div>
249
+ </div>
250
+ </section>
251
+
252
+ <!-- Cases -->
253
+ <section id="casos">
254
+ <h2 class="section-title">Casos de Uso</h2>
255
+ <p class="section-sub">Aplicável a vários cenários clínicos e de pesquisa.</p>
256
+
257
+ <div class="grid">
258
+ <div class="card">
259
+ <h3>Hospitais</h3>
260
+ <p class="muted">Aceleração da triagem em emergências e suporte a plantões com alta demanda.</p>
261
+ </div>
262
+ <div class="card">
263
+ <h3>Clínicas e Laboratórios</h3>
264
+ <p class="muted">Padronização de laudos e aumento da produtividade.</p>
265
+ </div>
266
+ <div class="card">
267
+ <h3>Pesquisa e Ensino</h3>
268
+ <p class="muted">Ferramenta para estudos de visão computacional aplicada à saúde.</p>
269
+ </div>
270
+ </div>
271
+ </section>
272
+
273
+ <!-- Testimonials -->
274
+ <section>
275
+ <h2 class="section-title">Depoimentos</h2>
276
+ <p class="section-sub">Feedback real de profissionais que testaram o PulmoX.</p>
277
+ <div class="testimonials">
278
+ <div class="card testimonial">
279
+ <div class="quote">“O PulmoX reduziu nosso tempo de análise em mais de 40% sem perda de qualidade.”</div>
280
+ <p class="muted">— Dr. João Mendes, Radiologista</p>
281
+ </div>
282
+ <div class="card testimonial">
283
+ <div class="quote">“A solução trouxe confiabilidade e padronização às avaliações médicas do nosso setor.”</div>
284
+ <p class="muted">— Gestor Clínico</p>
285
+ </div>
286
+ </div>
287
+ </section>
288
+
289
+ <!-- CTA -->
290
+ <section>
291
+ <div class="cta-large card">
292
+ <div>
293
+ <h3>Pronto para elevar o nível do diagnóstico pulmonar na sua instituição?</h3>
294
+ <p class="muted">Solicite uma demonstração, piloto ou proposta técnica personalizada.</p>
295
+ </div>
296
+ <div style="display:flex;gap:10px;align-items:center">
297
+ <a href="#contato" class="btn btn-primary">Solicitar Demonstração</a>
298
+ <a href="#contato" class="btn btn-ghost">Fale com um Especialista</a>
299
+ </div>
300
+ </div>
301
+ </section>
302
+
303
+ <!-- Contact form -->
304
+ <section id="contato">
305
+ <h2 class="section-title">Solicitar Demonstração</h2>
306
+ <p class="section-sub">Preencha os dados abaixo e nossa equipe entrará em contato para agendar uma demonstração.</p>
307
+
308
+ <div style="display:flex;gap:18px;flex-wrap:wrap">
309
+ <form class="card" style="flex:1;min-width:320px;padding:18px" onsubmit="event.preventDefault();alert('Obrigado! Entraremos em contato.');">
310
+ <label style="display:block;margin-bottom:8px">Nome</label>
311
+ <input type="text" placeholder="Nome completo" required style="width:100%;margin-bottom:12px;padding:10px;border-radius:10px;border:1px solid rgba(255,255,255,0.04);background:transparent;color:inherit">
312
+
313
+ <label style="display:block;margin-bottom:8px">E-mail</label>
314
+ <input type="email" placeholder="seu@exemplo.com" required style="width:100%;margin-bottom:12px;padding:10px;border-radius:10px;border:1px solid rgba(255,255,255,0.04);background:transparent;color:inherit">
315
+
316
+ <label style="display:block;margin-bottom:8px">Instituição</label>
317
+ <input type="text" placeholder="Hospital / Clínica / Universidade" style="width:100%;margin-bottom:12px;padding:10px;border-radius:10px;border:1px solid rgba(255,255,255,0.04);background:transparent;color:inherit">
318
+
319
+ <label style="display:block;margin-bottom:8px">Mensagem (opcional)</label>
320
+ <textarea placeholder="Breve descrição do interesse" style="width:100%;min-height:100px;padding:10px;border-radius:10px;border:1px solid rgba(255,255,255,0.04);background:transparent;color:inherit"></textarea>
321
+
322
+ <div style="display:flex;gap:8px;margin-top:12px">
323
+ <button class="btn btn-primary" type="submit">Enviar Solicitação</button>
324
+ <a class="btn btn-ghost" href="#">Baixar Folheto (PDF)</a>
325
+ </div>
326
+ </form>
327
+
328
+ <div style="flex:1;min-width:260px">
329
+ <div class="card" style="padding:16px;margin-bottom:12px">
330
+ <h4 style="margin:0 0 6px">Agende um piloto</h4>
331
+ <p class="muted">Implementação piloto em ambiente controlado para avaliar impacto clínico e operacional.</p>
332
+ </div>
333
+
334
+ <div class="card" style="padding:16px">
335
+ <h4 style="margin:0 0 6px">Documentação técnica</h4>
336
+ <p class="muted">Disponibilizamos API docs, whitepapers e resultados de validação para revisão técnica.</p>
337
+ </div>
338
+ </div>
339
+ </div>
340
+ </section>
341
+
342
+ <footer>
343
+ <div style="display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap">
344
+ <div style="max-width:540px">
345
+ <strong>PulmoX</strong> — Tecnologia avançada para quem cuida de vidas.<br>
346
+ <span class="muted">© 2025 PulmoX. Todos os direitos reservados. Política de privacidade | Termos de serviço</span>
347
+ </div>
348
+ <div style="display:flex;gap:12px;align-items:center">
349
+ <a href="#" class="muted">Sobre</a>
350
+ <a href="#" class="muted">Contato</a>
351
+ <a href="#" class="muted">Suporte</a>
352
+ </div>
353
+ </div>
354
+ </footer>
355
+ </div>
356
+ </body>
357
+ </html>
pulmox_logo.png ADDED

Git LFS Details

  • SHA256: 6f55be1b656b90aa7184fb4738f2f4fda78e29316badd856cb1f2c3c70778ef4
  • Pointer size: 131 Bytes
  • Size of remote file: 763 kB
pulmox_logo_transparent.png ADDED

Git LFS Details

  • SHA256: 85305405a7af29d3c57a95face36457975656ac1c6e22136532a1b077caaea97
  • Pointer size: 131 Bytes
  • Size of remote file: 759 kB
pulmox_logo_v2.png ADDED

Git LFS Details

  • SHA256: 0dec4ab05f2a07b14d35de14dce5171626844fcfc112f71a94bd839df8bbcfc7
  • Pointer size: 131 Bytes
  • Size of remote file: 817 kB
requirements.txt ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ Flask==3.1.2
2
+ keras==2.15.0
3
+ numpy==2.3.5
4
+ Pillow==12.0.0
5
+ Requests==2.32.5