Upload 2 files
Browse files- .gitattributes +1 -0
- FitoAsistente_demo.mp4 +3 -0
- 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
|
| 93 |
<div class="rule"></div>
|
| 94 |
-
<a class="cta"
|
|
|
|
| 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
|
| 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 ·
|
| 120 |
-
<h4>
|
| 121 |
-
<p>Sin ajustar.
|
| 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
|
| 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">
|
| 165 |
-
<p>
|
| 166 |
<table>
|
| 167 |
-
<thead><tr><th>
|
| 168 |
<tbody>
|
| 169 |
-
<tr><td
|
| 170 |
-
<tr><td
|
| 171 |
-
<tr><td
|
|
|
|
| 172 |
</tbody>
|
| 173 |
</table>
|
| 174 |
-
<
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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:
|
|
|
|
| 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/
|
| 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) {
|