Ver como Markdown

Fuentes de predicción

El argumento source se clasifica antes de abrir nada, así que una sola llamada resuelve un JPEG, una carpeta, un MP4, un índice de webcam, una URL RTSP, una región de la pantalla o una lista de cámaras.

Cómo se clasifica una fuente

classify_source inspecciona el valor antes de que se abra o se descargue nada, en este orden. Gana la primera regla que coincide.

FuenteSe interpreta como
"screen", "screen 1", "screen 1 100 200 512 256"Captura de pantalla
Un int no negativo, o una cadena de dígitos sin ningún archivo con ese nombreWebcam
Una URL rtsp://, rtmp://, tcp:// o udp://Stream de red
Una URL http(s):// cuya ruta termina en .m3u8Stream de red
Una URL de página de YouTubeStream de red
Una lista o tupla cuyas entradas son todas en directo o vídeoVarios streams en directo
Cualquier otra lista o tuplaBatch de imágenes
Una ruta que termina en .streamsVarios streams en directo
Una ruta con extensión de vídeoArchivo de vídeo
Un directorio existenteCarpeta de imágenes
Cualquier otra cosaUna sola imagen

Una lista que mezcla fuentes en directo con imágenes lanza TypeError. Un índice de webcam negativo lanza ValueError.

El clasificador nunca toca la red, así que una URL mal escrita se manifiesta cuando se abre la captura, no cuando se llama a predict.

Imágenes

Una imagen
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreYOLO9s.pt") # Una fuente de una sola imagen devuelve un Results, no una lista.result = model(SAMPLE_IMAGE)print(len(result.boxes), "detections")
Imágenes en memoria
import numpy as npfrom PIL import Image from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreYOLO9s.pt") pil_image = Image.open(SAMPLE_IMAGE)array = np.asarray(pil_image)raw_bytes = open(SAMPLE_IMAGE, "rb").read() # Los arrays de NumPy se leen como BGR salvo que se indique otra cosa; este es RGB.result = model(array, color_format="rgb")print(type(array).__name__, len(result.boxes)) for source in (pil_image, raw_bytes):    result = model(source)    print(type(source).__name__, len(result.boxes))
Una carpeta
from pathlib import Pathfrom PIL import Image from libreyolo import LibreYOLO, SAMPLE_IMAGE folder = Path("sample_folder")folder.mkdir(exist_ok=True)image = Image.open(SAMPLE_IMAGE)for index in range(3):    image.save(folder / f"frame_{index}.jpg") model = LibreYOLO("LibreYOLO9s.pt") # Una carpeta devuelve una lista, un Results por imagen, ordenada por ruta.results = model(str(folder))print(len(results), "images")
CLI
libreyolo predict model=LibreYOLO9s.pt \  source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg

Una fuente de una sola imagen acepta siete tipos.

TipoSe interpreta como
str o pathlib.PathArchivo local, http(s)://, s3:// o gs://
PIL.Image.ImageConvertida a RGB
numpy.ndarrayEscala de grises 2D, o 3D HWC o CHW en orden BGR; un array 4D es un batch
torch.TensorCHW o NCHW, leído como RGB; un tensor 4D es un batch
bytesDatos de imagen codificados
io.BytesIODatos de imagen codificados

Un array o tensor 4D devuelve una lista con un Results por imagen.

Todo se convierte a RGB antes del preprocesado. Los arrays de NumPy son el único caso en el que el orden de los canales es ambiguo, así que lo controla color_format: "auto" (el valor por defecto) y "bgr" leen el array como BGR, el orden que devuelve OpenCV, y "rgb" lo deja tal cual, que es lo que necesita un array creado a partir de una imagen PIL.

Los arrays de coma flotante se reescalan según su propio rango: los valores iguales o inferiores a 1.0 se multiplican por 255, y los valores más altos se recortan al rango [0, 255]. Un array RGBA descarta su canal alfa.

Las rutas remotas necesitan un paquete cada una. requests, para http(s)://, viene con la instalación base; boto3 para s3:// y gcsfs para gs:// no.

El seguimiento acepta imágenes, carpetas ordenadas por nombre de archivo, listas, tuplas e iteradores de imágenes con carga diferida como fotogramas consecutivos. Pasa fps=30.0 para definir la temporización de la secuencia de imágenes y color_format="auto" para seleccionar la interpretación de entrada. Consulta seguimiento.

Carpetas

Un directorio se recorre de forma recursiva y se ordena, y todo archivo con uno de estos sufijos se convierte en una imagen: .jpg, .jpeg, .png, .gif, .webp, .bmp, .tiff, .tif. Cualquier otra cosa dentro de la carpeta se omite. Una carpeta vacía devuelve una lista vacía en lugar de lanzar un error.

Las carpetas y las listas son las dos fuentes que aceptan batch, que ejecuta una pasada hacia delante apilada por bloque en las familias que lo soportan. Consulta Rendimiento de la inferencia.

Archivos de vídeo

Un archivo de vídeo (usa tu propio clip)
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9s.pt") # Sustituye clip.mp4 por un archivo de vídeo que tengas en disco.for result in model("clip.mp4", stream=True):    print(result.frame_idx, len(result.boxes))
Un fotograma de cada tres, escrito en disco
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9s.pt") for result in model("clip.mp4", stream=True, vid_stride=3, save=True):    pass

Una ruta cuenta como vídeo cuando su sufijo es uno de .3g2, .3gp, .asf, .avi, .dav, .f4v, .flv, .gif, .h264, .h265, .hevc, .m2ts, .m4v, .mkv, .mov, .mp4, .mpeg, .mpg, .mts, .mxf, .ogv, .ts, .vob, .wmv, .webm.

.gif aparece en las dos listas. Una ruta .gif pasada directamente a predict se abre como vídeo, porque la comprobación de vídeo se ejecuta primero; un .gif que está dentro de una carpeta escaneada se carga como imagen fija.

vid_stride procesa uno de cada N fotogramas y su valor por defecto es 1. Sin stream=True el vídeo entero se decodifica en una lista, y cualquier cifra por encima de 500 fotogramas tras aplicar el salto emite un aviso que sugiere stream=True.

Cada Results procedente de un vídeo lleva frame_idx.

La codificación de vídeo recurre a un códec disponible cuando H.264 no puede abrirse. La alternativa se registra a nivel INFO y se guarda en caché por códec y lienzo solo después de que otro códec funcione.

Webcams, streams de red y YouTube

Webcam (requiere una cámara conectada)
import itertools from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9s.pt") # Índice de webcam 0. Las fuentes en directo no terminan nunca, así que acota el bucle.for result in itertools.islice(model(0, stream=True), 100):    print(result.frame_idx, len(result.boxes))
RTSP (requiere una URL de cámara accesible)
import itertools from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9s.pt")source = "rtsp://user:password@192.168.1.64:554/Streaming/Channels/101" for result in itertools.islice(model(source, stream=True), 100):    print(result.frame_idx, len(result.boxes))

Las fuentes en directo no tienen fin, así que requieren stream=True. Sin él, predict lanza ValueError en vez de intentar recopilar una lista infinita.

Los fotogramas se leen en un hilo en segundo plano, uno por captura. Por defecto la cola guarda solo el fotograma más reciente, así que un modelo más lento que la cámara se salta fotogramas en lugar de quedarse atrás. stream_buffer=True conserva todos los fotogramas capturados, lo que los preserva a costa de una latencia creciente.

Un índice de webcam es un int o una cadena de dígitos. En Windows la captura se abre primero a través del backend DirectShow y recurre al backend por defecto si eso falla.

Las URLs de páginas de YouTube se resuelven a una URL de medios directa sin descargar el vídeo, para lo que hace falta yt-dlp:

bash
pip install "libreyolo[stream]"

Las etiquetas de stream se censuran antes de registrarse en el log o de usarse como nombres de archivo. Una URL que lleva credenciales aparece como user:***@host, y las cadenas de consulta se eliminan de las etiquetas de stream directas porque ahí es donde viven las URLs firmadas y los tokens bearer. El id de un vídeo de YouTube se conserva, ya que no es una credencial.

Varias cámaras a la vez

Un archivo .streams (usa tus propias cámaras)
import itertoolsfrom pathlib import Path from libreyolo import LibreYOLO Path("cameras.streams").write_text(    "# one source per line, blank lines and comments are skipped\n"    "rtsp://192.168.1.64:554/Streaming/Channels/101\n"    "rtsp://192.168.1.65:554/Streaming/Channels/101\n",    encoding="utf-8",) model = LibreYOLO("LibreYOLO9s.pt")for result in itertools.islice(model("cameras.streams", stream=True), 100):    print(result.frame_idx, len(result.boxes))
Una lista de cámaras
import itertools from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9s.pt")cameras = [0, "rtsp://192.168.1.64:554/Streaming/Channels/101"] for result in itertools.islice(model(cameras, stream=True), 100):    print(result.frame_idx, len(result.boxes))

Un archivo .streams es una fuente por línea. Las líneas en blanco y las que empiezan por # se ignoran. Cada línea restante debe ser a su vez un índice de webcam, un stream de red, una URL de YouTube o la ruta a un archivo de vídeo; cualquier otra cosa lanza ValueError indicando el número de línea. Un archivo vacío lanza un error en lugar de arrancar sin cámaras.

Una lista o tupla de fuentes en directo hace lo mismo sin necesidad de archivo.

Cada captura tiene su propio hilo, y los fotogramas de todas ellas se multiplexan en un único generador. Cada pasada consulta todos los streams activos y entrega lo que esté listo, así que una cámara lenta no frena a una rápida, y los fotogramas de distintas cámaras se intercalan. Un stream que termina sale de la rotación mientras los demás continúan.

Captura de pantalla

Una captura de pantalla (requiere mss y una sesión de escritorio)
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9s.pt") # Sin stream=True esto captura un único fotograma.result = model("screen")print(len(result.boxes), "detections")
Una región de un monitor, en continuo
import itertools from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9s.pt") # "screen <monitor> <left> <top> <width> <height>"for result in itertools.islice(model("screen 1 100 200 512 256", stream=True), 50):    print(len(result.boxes))

Una fuente de pantalla es la palabra screen seguida de cero, uno, cuatro o cinco enteros. Cualquier otra cantidad lanza ValueError.

FormaCaptura
"screen"Todos los monitores, fusionados
"screen 1"El monitor 1
"screen 100 200 512 256"Un recuadro sobre el escritorio fusionado
"screen 1 100 200 512 256"Un recuadro sobre el monitor 1

Las coordenadas del recuadro son left top width height, relativas a la esquina superior izquierda del monitor elegido. Una fuente de pantalla informa de sus FPS como 30 dividido entre vid_stride, que es la tasa a la que se escribe un vídeo guardado. La captura necesita el paquete mss:

bash
pip install mss

Sin stream=True, una fuente de pantalla captura un fotograma y devuelve un único Results, que es el equivalente en captura de pantalla a predecir sobre un archivo de imagen. Con stream=True captura hasta que se rompe el bucle.

Qué devuelve predict

La forma del valor de retorno depende de la fuente y de stream.

Fuentestream=Falsestream=True
Una sola imagenUn ResultsGenerador de un Results
Lista de imágenesLista de ResultsGenerador
CarpetaLista de ResultsGenerador
Archivo de vídeoLista de ResultsGenerador
PantallaUn ResultsGenerador, sin fin
Webcam, stream de red, .streamsValueErrorGenerador, sin fin

Una sola imagen devuelve el propio objeto Results. Indexarlo selecciona una detección, no una imagen, así que result[0] en una predicción sobre una sola imagen es el primer box y no la primera foto. Para saber qué llevan esos objetos, consulta Trabajar con resultados.

Dónde escribe save

save=True escribe la salida anotada en un directorio de ejecución en lugar de devolverla.

Las imágenes van a un runs/detect/predict, runs/detect/predict2 y así sucesivamente que se autoincrementa, conservando el nombre de archivo de origen. Todas las imágenes de un mismo proceso acaban en el mismo directorio, así que dos carpetas de entrada que contengan el mismo nombre de archivo se sobrescriben entre sí. Las imágenes en memoria no tienen nombre de archivo que reutilizar. Una imagen suelta se guarda como inference, así que las llamadas repetidas la sobrescriben; una lista o un batch se numera image0, image1 y así sucesivamente. Dos procesos que guardan en el mismo instante obtienen directorios numerados distintos, porque cada ejecución reserva su directorio creándolo.

Las fuentes de vídeo y en directo se escriben como un único .mp4 con el nombre de la fuente.

output_path anula el directorio. Una ruta con sufijo se trata como un archivo, y una ruta sin él como un directorio. output_file_format selecciona la codificación de las imágenes fijas y acepta jpg, png o webp.

Tras guardar una imagen, la ruta escrita también se adjunta al resultado como result.saved_path.

Clasificación de fuentes leída de libreyolo/utils/source.py (classify_source, SourceKind, StreamSource, MultiStreamSource). Tipos de imagen aceptados y extensiones de directorio de libreyolo/utils/image_loader.py. Extensiones de vídeo y rutas de guardado de libreyolo/utils/video.py. Sintaxis de screen de libreyolo/utils/screen.py. Formas de retorno y valores por defecto de los argumentos de InferenceRunner.__call__ en libreyolo/models/base/inference.py.