---
include-before-body:
  text: |
    <script>
        </script>
engine: knitr
lightbox: true
author:
  - name: Elio Guarionex Lagunes Díaz
    url: datamarindo.baselinux.net/blog/presentaciones_interactivas
  - name: Alejandra Alamillo Alamillo
  - name: Octavio Pérez Maqueo  

format: 
  revealjs:
    theme: [default, style.scss]
    width: 1600
    height: 900
    footer: 'Inecol, 2023'
    chalkboard: 
      buttons: false
---


#  {.title}

::: r-fit-text

[Una inmersión profunda en el ]{.flow}

[comportamiento animal]{.flow}

[a través de la ]{.flow}

[visión por computadora]{.flow}

<!-- a quarto no le gustan los avi... 
los convertí y así me funcionaron:
ffmpeg -ss 00:00:00 -to 00:00:10 -i object_counting.avi -c:v libx264 -preset slow -crf 19 -c:a libvo_aacenc -b:a 128k object_counting.mp4
-->

:::


```{css}
li {
  color: yellow;
  text-shadow:
    -1px -1px 0 cyan,
    1px -1px 0 magenta,
    -1px 1px 0 magenta,
    1px 1px 0 magenta;
  font-weight: bold;
  font-family: "Latin Modern Mono Light";
}

h2 {
    background: linear-gradient(to right, turquoise, yellow);
    border-radius: 15px;
    padding: 15px;
    color: white
    /*background-color:cyan;  
    color:#00FFFF; 
    font-size:medium; */
    line-height:1.5; 
    /*text-indent:20px;*/
    padding-left:20px;
}

figcaption{
   margin: auto;
   text-align: center;
   color: cyan;
}
```

## Energías Marinas Renovables

*¿Qué son?*

Fuentes de energía renovable que utilizan el potencial energético de los océanos

![](images/Ale1.jpg)

## Tipos de energías marinas renovables

::: {layout-nrow=3  }

![Gradiente térmico](images/Ale2.jpg)

![Gradiente salino](images/Ale3.jpg)

![Biomasa marina](images/Ale4.jpg)

![Oleaje](images/Ale5.jpg)

![Eólica marina](images/Ale6.jpg)

![Corrientes y mareomotriz](images/Ale7.jpg)

:::

## Tecnologías para aprovechar las corrientes marinas {background-video="images/corte.mp4" width=50% }

Dispositivos que utilizan la dirección en el flujo de una marea o una corriente marina.

:::: {.columns}

::: {.column width="50%"}

* Sistema de efecto Venturi
* Cometa de corriente
* Álabe oscilante
* Tornillo de Arquímedes
* Turbina de flujo axial
* Turbina de flujo transversal

:::


::: {.column width="20%"}

![](images/Ale8.jpg)
:::

::::



## Efectos ambientales

* Al ser una nueva tecnología, muchos se los efectos que puedan provocar en el ambiente son desconocidos.

![](images/Efectos.jpg)

## Experimentos en canal de corriente

* IINGEN-UNAM

 ![](images/Ale10.jpg)

## Experimentos en canal de corriente {background-video="images/peces_turbina_corte.mp4"}


* ¿Cómo utilizan los peces el espacio en un canal de corriente?]
* ¿Cambia esta utilización al instalar estas turbinas?
* ¿Hay conflicto?




## Análisis de video con IA para medir el uso del espacio

* Pensamos entrenar una inteligencia artificial para seguir a los peces a lo largo de la grabación e identificar distancias al sitio donde estaría la turbina.


## Intentos previos en ImageJ {background-video="images/intento_0.mp4"}

* Mucho consumo de RAM
* Mucho volumen de datos intermedios

## Object tracking clásico {background-video="images/intento_lukas.mp4"}

* Algoritmo Lukas-Canade
* Requeriría algo de preproceso

## Modelo YOLO

* Subimos los videos los cuales serán muestreados automáticamente en Roboflow
* Etiquetamos las imágenes

![](images/annotated.png)

## Entrenamos un modelo pre-entrenado

* YOLO de Ultralytics. 
- El más avanzado. 
- Puro software libre: AGPL-3.0

```{python}
#| eval: false
#| echo: true
from ultralytics import YOLO
from roboflow import Roboflow

rf = Roboflow(api_key="yoznRk8CpCBU9ZeusGwC")
project = rf.workspace("fish-tracking-s61ch").project("fish-tracking-8malz")
version = project.version(3)
dataset = version.download("yolov11") 

model = YOLO("yolo11n.pt")

augmentation_params = {
    "hsv_h": 0.05,  
    "hsv_v": 0.3    
}

model.train(data="/home/datamarindo/Fish-tracking-3/data.yaml", 
            epochs = 50, 
            imgsz = 640, 
            device = 0,
            augment=True, 
            **augmentation_params )

model.val(data="/home/datamarindo/Fish-tracking-3/data.yaml", model="/home/datamarindo/runs/detect/train/weights/best.pt")
```

## Resultados del entrenamiento

```{python}
#| eval: false
#| echo: true

Validating runs/detect/train4/weights/best.pt...
Ultralytics 8.3.74 🚀 Python-3.10.16 torch-2.6.0+cu124 CUDA:0 (NVIDIA GeForce RTX 3060, 11940MiB)
YOLO11n summary (fused): 238 layers, 2,582,347 parameters, 0 gradients, 6.3 GFLOPs
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 1/1 [00:00<00:00, 11.38it/s]
                   all         10        161      0.935      0.882      0.943      0.721
Speed: 0.1ms preprocess, 5.1ms inference, 0.0ms loss, 1.9ms postprocess per image
```

## Aplicamos el modelo

```{python}
#| eval: false
#| echo: true
archivos = glob.glob("/home/datamarindo/peces_ale/**/*corte_vt.mp4")
restrack = YOLO("/home/datamarindo/runs/detect/train3/weights/best.pt")

archi = archivos[1]
pattern = re.compile(r'[0-9]{6}')
rboxes = []
for r in restrack.track(archi, stream = True, persist = True): 
    rboxes.append(r.boxes)
    pass 
```

## {background-video="images/intento_1_x.mp4"}

* Sólo usamos imágenes del estanque sin la turbina encendida
- Sale bien
- Con sólo 20 imágenes etiquetadas logramos este avance


## {background-video="images/intento_2.mp4"}

* Lo probamos con videos con la turbina encendida...
- Confunde las burbujas con peces

## {background-video="images/intento_3.mp4"}

* Anotamos en Roboflow más imágenes, ahora con la turbina encendida:
- Ya no confunde a las burbujas
- Confunde por instantes a la base de la turbina con un pez

## {background-video="images/claro.mp4"}

* Nos faltó etiquetar imágenes en cada condición de luz

## {background-video="images/oscuro.mp4"}

* Ya salen suficientemente bien las etiquetas

## {background-video="images/object_conteo.mp4"}

* Ya podemos contar cuántos peces pasan en la cercanía de la turbina en tiempo real

## {background-video="images/heatmap.mp4"}

* Y podemos hacer un heatmap en tiempo real

## Resultados del análisis de ocupación

::: {layout="[[100,100], [100, 100]]"}

![](images/Rplot05.png){ width=80% }


![](images/Rplot04.png){ width=80% }

![](images/histogram.jpeg){ width=80% }

![](images/corregida.png)

:::

#  {.title}

::: r-fit-text

[Peces]{.flow}

[libres en el mar]{.flow}

:::


## {background-video="images/marinos_vacio.mp4"}

* El video tiene largos ratos sin peces, por lo cual si lo mandamos a Roboflow se van a escoger muchos frames vacíos
- ... YOLO nos puede ayudar

## {background-video="images/marinos_seleccion.mp4"}

* Seleccionamos unos cuadros (frames) que tengan peces y les aplicamos el yolo-cls
* Los frames vacíos salen etiquetados con las siguientes clases:
* `['nematode', 'beer_glass', 'car_mirror', 'coffee_mug', 'face_powder', 'golf_ball', 'loupe', 'matchstick', 'Petri_dish', 'pick']`,
* Nos fijamos qué clases (de las mil) están en el top5
* Usando un modelo yolo-cls vamos seleccionando aquellas imágenes que según el modelo tengan:
* `["snail", "shark", "jellyfish", "axolotol", "dugong", "bubble", "electric_ray"]`
  
## {background-video="images/marinos_depth.mp4"}

* Estimación monocular de la profundidad con modelos disponibles en Huggingface 🤗):
- Ahora con unas imágenes con objetos a distancias conocidas podríamos calibrar la escena para tener la distancia de cada pez


