JohnSupertramp2026 commited on
Commit
f7a5626
·
verified ·
1 Parent(s): 4d6f113

Upload 2 files

Browse files
Files changed (3) hide show
  1. .gitattributes +1 -0
  2. FitoAsistente_demo.mp4 +3 -0
  3. index.html +39 -17
.gitattributes CHANGED
@@ -35,3 +35,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
  matriz_confusion_convnext-tiny.png filter=lfs diff=lfs merge=lfs -text
37
  matriz_confusion_vit-base.png filter=lfs diff=lfs merge=lfs -text
 
 
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
  matriz_confusion_convnext-tiny.png filter=lfs diff=lfs merge=lfs -text
37
  matriz_confusion_vit-base.png filter=lfs diff=lfs merge=lfs -text
38
+ FitoAsistente_demo.mp4 filter=lfs diff=lfs merge=lfs -text
FitoAsistente_demo.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ae4c4d7f10454a6544e4d23836aca2b2ec81ef94c463a20d225589e08418e2e2
3
+ size 385819
index.html CHANGED
@@ -89,9 +89,10 @@
89
  <div class="wrap">
90
  <div class="eyebrow">Universidad San Sebastián · Facultad de Ingeniería · Magíster en Data Science</div>
91
  <h1>FitoAsistente</h1>
92
- <p class="sub">Asistente multimodal para el diagnóstico fitosanitario de cultivos, con modelos fundacionales de Hugging Face.</p>
93
  <div class="rule"></div>
94
- <a class="cta" id="btn-app" href="#" target="_blank" rel="noopener">Abrir la aplicación</a>
 
95
  <a class="cta ghost" href="https://huggingface.co/JohnSupertramp2026/vit-base-plantvillage" target="_blank" rel="noopener">Modelo ViT</a>
96
  <a class="cta ghost" href="https://huggingface.co/JohnSupertramp2026/convnext-tiny-plantvillage" target="_blank" rel="noopener">Modelo ConvNeXt</a>
97
  <p class="meta" style="margin-top:26px">
@@ -104,10 +105,21 @@
104
 
105
  <div class="wrap">
106
 
 
 
 
 
 
 
 
 
 
 
 
107
  <section>
108
  <h2>Qué hace</h2>
109
  <p class="lead">Dos capacidades distintas de modelos fundacionales, en una sola aplicación</p>
110
- <p>Subes la foto de una hoja y el sistema hace dos cosas que no son la misma. La <strong>clasifica</strong> entre 38 categorías fitopatológicas, y por separado <strong>la describe</strong> en lenguaje natural, sin comprometerse con un nombre de enfermedad.</p>
111
 
112
  <div class="cards">
113
  <div class="card">
@@ -116,14 +128,14 @@
116
  <p>Ajustados sobre PlantVillage. Devuelven una etiqueta entre 38 clases con su probabilidad. Se pueden ejecutar por separado o comparar lado a lado.</p>
117
  </div>
118
  <div class="card">
119
- <span class="tag">Capacidad 2 · image-text-to-text</span>
120
- <h4>SmolVLM-256M-Instruct</h4>
121
- <p>Sin ajustar. Genera texto libre describiendo los síntomas visibles y responde preguntas abiertas sobre la imagen.</p>
122
  </div>
123
  </div>
124
 
125
  <h3>Por qué se necesitan las dos</h3>
126
- <p>El clasificador es preciso pero cerrado: ante una especie que nunca vio devuelve igual una de sus 38 etiquetas, con alta confianza y sin manera de decir «no sé». El modelo de lenguaje es impreciso pero abierto, y puede describir cualquier hoja. Cuando la descripción no calza con la etiqueta, esa discrepancia es una señal para desconfiar del diagnóstico.</p>
127
  </section>
128
 
129
  <section>
@@ -161,17 +173,22 @@
161
 
162
  <section>
163
  <h2>Lo que aprendimos del modelo de lenguaje</h2>
164
- <p class="lead">Un resultado que nos hizo cambiar el diseño de la aplicación</p>
165
- <p>Probamos tres formas de pedirle lo mismo al modelo de visión y lenguaje, sobre una hoja de duraznero verde, con manchas pardo-rojizas y el borde superior desgarrado.</p>
166
  <table>
167
- <thead><tr><th>Formulación</th><th style="text-align:left">Respuesta</th><th style="text-align:left">Observación</th></tr></thead>
168
  <tbody>
169
- <tr><td>A · descripción libre</td><td style="text-align:left"><em>«dark green with reddish brown spots… damaged or torn in the middle»</em></td><td style="text-align:left">Correcta. Todo verificable en la imagen.</td></tr>
170
- <tr><td>B · síntomas guiados</td><td style="text-align:left"><em>«The leaf is brown… dry and appears to be dead»</em></td><td style="text-align:left">Falso: la hoja está verde y turgente.</td></tr>
171
- <tr><td>C · con contexto</td><td style="text-align:left"><em>«Bacterial spot.»</em></td><td style="text-align:left">Repitió la etiqueta que le entregamos y dejó de describir.</td></tr>
 
172
  </tbody>
173
  </table>
174
- <p>Habíamos diseñado la aplicación para entregarle al modelo la clase predicha como contexto. Resultó contraproducente: un mecanismo de verificación que recibe la respuesta que debe verificar deja de verificar nada. La aplicación quedó con la instrucción más simple y con el contexto desactivado por defecto, disponible como casilla opcional.</p>
 
 
 
 
175
  </section>
176
 
177
  <section>
@@ -183,6 +200,9 @@
183
  <li><strong>Tres épocas es poco.</strong> ConvNeXt todavía venía subiendo en la tercera, así que su cifra final subestima su techo.</li>
184
  <li><strong>Muestras pequeñas.</strong> Varias clases tienen menos de diez ejemplos en prueba y sus F1 individuales son inestables.</li>
185
  <li><strong>Conjunto cerrado.</strong> El clasificador no tiene mecanismo de rechazo.</li>
 
 
 
186
  <li>La aplicación prioriza la atención de un profesional. No lo reemplaza.</li>
187
  </ul>
188
  <p>En lo metodológico, los dos hallazgos que más cambiaron nuestra lectura de los resultados —el buffer de barajado del experimento de referencia y el agrupamiento por hoja de PlantVillage— no tienen nada que ver con la arquitectura de los modelos.</p>
@@ -192,7 +212,8 @@
192
  <h2>Sobre este despliegue</h2>
193
  <div class="aviso">
194
  <p style="margin:0 0 10px"><strong>Por qué la aplicación no corre dentro de este Space.</strong></p>
195
- <p style="margin:0 0 10px">En julio de 2026 Hugging Face modificó su política: las cuentas gratuitas creadas después de ese cambio solo pueden crear Spaces de tipo <strong>Static</strong>, y los de tipo <strong>Gradio</strong> pasaron a requerir plan PRO. Está documentado en el <a href="https://discuss.huggingface.co/t/gradio-sdk-now-marked-as-paid-when-creating-a-new-space/177619" target="_blank" rel="noopener">foro oficial de Hugging Face</a>.</p>
 
196
  <p style="margin:0">La aplicación es exactamente la misma que habíamos preparado. Lo único que cambia es dónde se ejecuta el proceso: en vez del contenedor de Hugging Face, corre en un cuaderno de Google Colab y Gradio publica la dirección con <code>share=True</code>. Los dos modelos ajustados siguen publicados en el Hub, y esta portada está desplegada como Space Static.</p>
197
  </div>
198
 
@@ -200,9 +221,10 @@
200
  <ul>
201
  <li><a href="https://huggingface.co/JohnSupertramp2026/vit-base-plantvillage" target="_blank" rel="noopener">ViT-Base/16 ajustado sobre PlantVillage</a> — 38 clases, publicado en el Hub</li>
202
  <li><a href="https://huggingface.co/JohnSupertramp2026/convnext-tiny-plantvillage" target="_blank" rel="noopener">ConvNeXt-Tiny ajustado sobre PlantVillage</a> — 38 clases, publicado en el Hub</li>
203
- <li><a href="https://huggingface.co/HuggingFaceTB/SmolVLM-256M-Instruct" target="_blank" rel="noopener">SmolVLM-256M-Instruct</a> — usado sin modificar</li>
204
  <li><a href="https://huggingface.co/datasets/BrandonFors/Plant-Diseases-PlantVillage-Dataset" target="_blank" rel="noopener">Dataset PlantVillage</a> — 54.305 imágenes, 38 clases</li>
205
  <li>Esta portada, desplegada como Space Static en Hugging Face</li>
 
206
  </ul>
207
  </section>
208
 
@@ -220,7 +242,7 @@
220
  <script>
221
  // Dirección pública de la aplicación (Gradio con share=True desde Colab).
222
  // Cambiarla aquí cada vez que se levante el cuaderno.
223
- const URL_APP = "";
224
 
225
  const b = document.getElementById("btn-app");
226
  if (URL_APP) {
 
89
  <div class="wrap">
90
  <div class="eyebrow">Universidad San Sebastián · Facultad de Ingeniería · Magíster en Data Science</div>
91
  <h1>FitoAsistente</h1>
92
+ <p class="sub">Asistente para el diagnóstico fitosanitario de cultivos, con dos capacidades distintas de modelos fundacionales de Hugging Face.</p>
93
  <div class="rule"></div>
94
+ <a class="cta" href="#demo">Ver la demostración</a>
95
+ <a class="cta ghost" id="btn-app" href="#" target="_blank" rel="noopener">Abrir la aplicación</a>
96
  <a class="cta ghost" href="https://huggingface.co/JohnSupertramp2026/vit-base-plantvillage" target="_blank" rel="noopener">Modelo ViT</a>
97
  <a class="cta ghost" href="https://huggingface.co/JohnSupertramp2026/convnext-tiny-plantvillage" target="_blank" rel="noopener">Modelo ConvNeXt</a>
98
  <p class="meta" style="margin-top:26px">
 
105
 
106
  <div class="wrap">
107
 
108
+ <section id="demo">
109
+ <h2>La aplicación funcionando</h2>
110
+ <p class="lead">Recorrido real de 34 segundos, grabado sobre la aplicación en ejecución</p>
111
+ <video src="FitoAsistente_demo.mp4" controls muted playsinline loop preload="metadata"
112
+ style="width:100%;border-radius:10px;border:1px solid #D6DEE6;background:#F7F9FB"></video>
113
+ <p style="margin-top:14px">Se carga la fotografía de una hoja, el clasificador la identifica como <strong>Peach · Bacterial spot</strong> con 99,7 % de confianza, el asistente responde una consulta de manejo con ese diagnóstico en contexto, y una consulta ajena al dominio queda rechazada por el filtro sin llegar al modelo de lenguaje.</p>
114
+ <div class="aviso" style="margin-top:16px">
115
+ <p style="margin:0"><strong>Por qué hay un video.</strong> La aplicación corre desde un cuaderno de Google Colab y su dirección pública solo existe mientras el cuaderno está en ejecución. El video deja el funcionamiento disponible de forma permanente. Si el botón «Abrir la aplicación» no responde, significa que el cuaderno no está levantado en este momento.</p>
116
+ </div>
117
+ </section>
118
+
119
  <section>
120
  <h2>Qué hace</h2>
121
  <p class="lead">Dos capacidades distintas de modelos fundacionales, en una sola aplicación</p>
122
+ <p>Subes la foto de una hoja y el sistema hace dos cosas que no son la misma. La <strong>clasifica</strong> entre 38 categorías fitopatológicas, y después <strong>conversa</strong> contigo sobre qué hacer con ese diagnóstico. El sistema tiene dos capacidades y tres modelos: ViT y ConvNeXt resuelven la misma tarea y están los dos porque son el objeto de la comparación experimental.</p>
123
 
124
  <div class="cards">
125
  <div class="card">
 
128
  <p>Ajustados sobre PlantVillage. Devuelven una etiqueta entre 38 clases con su probabilidad. Se pueden ejecutar por separado o comparar lado a lado.</p>
129
  </div>
130
  <div class="card">
131
+ <span class="tag">Capacidad 2 · text-generation</span>
132
+ <h4>Qwen2.5-1.5B-Instruct</h4>
133
+ <p>Sin ajustar. Recibe como texto la clase que decidió el clasificador y conversa sobre tratamiento y manejo. No procesa la imagen.</p>
134
  </div>
135
  </div>
136
 
137
  <h3>Por qué se necesitan las dos</h3>
138
+ <p>El clasificador es preciso pero cerrado: ante una especie que nunca vio devuelve igual una de sus 38 etiquetas, con alta confianza y sin manera de decir «no sé». El modelo de lenguaje no decide nada: recibe la clase ya resuelta y se encarga de traducirla a manejo agronómico, que es la pregunta que un usuario tiene de verdad frente a una hoja enferma.</p>
139
  </section>
140
 
141
  <section>
 
173
 
174
  <section>
175
  <h2>Lo que aprendimos del modelo de lenguaje</h2>
176
+ <p class="lead">Medimos la segunda capacidad y dos cosas que creíamos resultaron falsas</p>
177
+ <p>Sometimos el asistente a diez consultas sobre una misma hoja de duraznero clasificada como <em>Peach · Bacterial spot</em>: ocho del dominio agronómico y dos deliberadamente ajenas. Cada respuesta se clasificó en correcta, vaga o incorrecta.</p>
178
  <table>
179
+ <thead><tr><th>Resultado sobre 10 consultas</th><th>Qwen2.5-0,5B</th><th>Qwen2.5-1,5B</th></tr></thead>
180
  <tbody>
181
+ <tr><td style="text-align:left">Correctas (de 8 en dominio)</td><td>0</td><td class="win">1</td></tr>
182
+ <tr><td style="text-align:left">Vagas (de 8 en dominio)</td><td>1</td><td>3</td></tr>
183
+ <tr><td style="text-align:left">Incorrectas (de 8 en dominio)</td><td>7</td><td>4</td></tr>
184
+ <tr><td style="text-align:left">Fuera de dominio bloqueadas</td><td>0 de 2</td><td class="win">2 de 2</td></tr>
185
  </tbody>
186
  </table>
187
+ <h3>El resultado más informativo</h3>
188
+ <p>Ante la pregunta por la dosis de cobre, el modelo de 0,5 B inventó una cifra —<em>«0,001 gramos por litro»</em>— y un instrumento que no existe. El de 1,5 B respondió que no tenía información específica y derivó a un agrónomo. <strong>Se abstuvo.</strong> Un modelo mayor no solo acierta más: reconoce mejor los límites de lo que sabe, y en un asistente que sugiere tratamientos eso importa más que la exactitud media.</p>
189
+ <h3>El guardarraíl por instrucción no funcionaba</h3>
190
+ <p>Habíamos escrito en la instrucción de sistema que el asistente solo respondiera sobre botánica y agricultura. Al medirlo, dejó pasar las dos consultas ajenas al dominio: a una pregunta de salud humana llegó a sugerir analgésicos. Lo reemplazamos por un <strong>filtro léxico determinista</strong> que decide antes de invocar al modelo, y que acertó <strong>21 de 21</strong> casos etiquetados. La lección se resume en una línea: lo que debe cumplirse siempre no se le pide al modelo, se le impone al sistema.</p>
191
+ <p>Es una mitigación, no una solución: el filtro decide por vocabulario, así que una consulta ajena redactada con palabras agrícolas pasaría.</p>
192
  </section>
193
 
194
  <section>
 
200
  <li><strong>Tres épocas es poco.</strong> ConvNeXt todavía venía subiendo en la tercera, así que su cifra final subestima su techo.</li>
201
  <li><strong>Muestras pequeñas.</strong> Varias clases tienen menos de diez ejemplos en prueba y sus F1 individuales son inestables.</li>
202
  <li><strong>Conjunto cerrado.</strong> El clasificador no tiene mecanismo de rechazo.</li>
203
+ <li><strong>El asistente no es confiable.</strong> De ocho consultas en dominio, Qwen2.5-1.5B acertó una. Explica y sugiere; no valida un tratamiento.</li>
204
+ <li><strong>El filtro de dominio es léxico y se puede burlar.</strong> Decide por vocabulario: una consulta ajena redactada con palabras agrícolas pasaría.</li>
205
+ <li><strong>El asistente arrastra sus propios errores.</strong> Como el historial viaja en cada consulta, una alucinación del primer turno se propaga a los siguientes.</li>
206
  <li>La aplicación prioriza la atención de un profesional. No lo reemplaza.</li>
207
  </ul>
208
  <p>En lo metodológico, los dos hallazgos que más cambiaron nuestra lectura de los resultados —el buffer de barajado del experimento de referencia y el agrupamiento por hoja de PlantVillage— no tienen nada que ver con la arquitectura de los modelos.</p>
 
212
  <h2>Sobre este despliegue</h2>
213
  <div class="aviso">
214
  <p style="margin:0 0 10px"><strong>Por qué la aplicación no corre dentro de este Space.</strong></p>
215
+ <p style="margin:0 0 10px">En julio de 2026 Hugging Face modificó su política: los Spaces de tipo <strong>Gradio</strong> y <strong>Docker</strong> pasaron a requerir plan PRO, mientras que los de tipo <strong>Static</strong> siguen siendo gratuitos. Está documentado en el <a href="https://discuss.huggingface.co/t/gradio-sdk-now-marked-as-paid-when-creating-a-new-space/177619" target="_blank" rel="noopener">foro oficial de Hugging Face</a>.</p>
216
+ <p style="margin:0 0 10px">La documentación menciona una excepción: una cuenta gratuita «in good standing» podría alojar hasta dos Spaces Gradio sobre <strong>ZeroGPU</strong>. La verificamos en la cuenta del proyecto el 11 de agosto de 2026 y no estuvo disponible: el formulario de creación ofrece Gradio y Docker marcados como «Paid», sin opción de hardware ZeroGPU.</p>
217
  <p style="margin:0">La aplicación es exactamente la misma que habíamos preparado. Lo único que cambia es dónde se ejecuta el proceso: en vez del contenedor de Hugging Face, corre en un cuaderno de Google Colab y Gradio publica la dirección con <code>share=True</code>. Los dos modelos ajustados siguen publicados en el Hub, y esta portada está desplegada como Space Static.</p>
218
  </div>
219
 
 
221
  <ul>
222
  <li><a href="https://huggingface.co/JohnSupertramp2026/vit-base-plantvillage" target="_blank" rel="noopener">ViT-Base/16 ajustado sobre PlantVillage</a> — 38 clases, publicado en el Hub</li>
223
  <li><a href="https://huggingface.co/JohnSupertramp2026/convnext-tiny-plantvillage" target="_blank" rel="noopener">ConvNeXt-Tiny ajustado sobre PlantVillage</a> — 38 clases, publicado en el Hub</li>
224
+ <li><a href="https://huggingface.co/Qwen/Qwen2.5-1.5B-Instruct" target="_blank" rel="noopener">Qwen2.5-1.5B-Instruct</a> — usado sin modificar</li>
225
  <li><a href="https://huggingface.co/datasets/BrandonFors/Plant-Diseases-PlantVillage-Dataset" target="_blank" rel="noopener">Dataset PlantVillage</a> — 54.305 imágenes, 38 clases</li>
226
  <li>Esta portada, desplegada como Space Static en Hugging Face</li>
227
+ <li>El video de demostración, disponible de forma permanente en esta misma página</li>
228
  </ul>
229
  </section>
230
 
 
242
  <script>
243
  // Dirección pública de la aplicación (Gradio con share=True desde Colab).
244
  // Cambiarla aquí cada vez que se levante el cuaderno.
245
+ const URL_APP = "https://23de65230041a88d1e.gradio.live";
246
 
247
  const b = document.getElementById("btn-app");
248
  if (URL_APP) {