Recopilación de Scripts Útiles

Índice- Modificar valores de clase en archivos TXT con formato YOLO

  • Extraer fotogramas de un video o flujo RTSP
  • Renombrar archivos
  • Contar archivos en un directorio específico
  • Deteción con modelo YOLOv8 en flujo RTSP

Modiifcación de valores de clase en acrhivos TXT

  1. Script implementado:
import os
from pathlib import Path

'''
Cambiar el valor de la clase en archivos TXT, por ejemplo 0 0.407532 0.697235 0.13095 0.59244 a 1 0.407532 0.697235 0.13095 0.59244
:param ruta: Directorio donde se encuentran los archivos de anotación
:param mapa_clases: Diccionario con relaciones de cambio
'''
def modificarClase(ruta='.', mapa_clases = {}):
    archivos = Path(ruta).glob('*.txt')
    for archivo in archivos:
        with open(archivo, 'r+') as f:
            lineas = f.readlines()
            for i in range(len(lineas)):
                partes = lineas[i].split(' ', 1)
                if len(partes) > 1:
                    lineas[i] = f"{mapa_clases.get(partes[0], partes[0])} {partes[1]}"
            f.seek(0)
            f.writelines(lineas)
            f.truncate()


if __name__ == '__main__':
    mapa_clases = {'0': '1'}   # Cambiar valores de clase de 0 a 1
    modificarClase('C:/Users/root/test/', mapa_clases)


Extracción de fotogramas de video o flujo

  1. Script implementado:
import cv2
from loguru import logger

'''
Extraer fotogramas de video o flujo RTSP según intervalo especificado
:param origen: Ruta del video o flujo
:param frecuencia: Intervalo de extracción (por defecto 25)
:param destino: Carpeta de guardado
'''
def extraerFotogramas(origen = '.', frecuencia = 25, destino = '.'):
    captura = cv2.VideoCapture(origen)
    if not captura.isOpened():
        logger.error(f"No se puede abrir {origen}")
        exit(-1)

    contador = 1
    while True:
        estado, frame = captura.read()
        if estado:
            if contador % frecuencia == 0:
                logger.info(f"Extrayendo fotograma {str(contador)}")
                if not destino.endswith('/'):
                    destino += '/'
                cv2.imwrite(f"{destino}{contador}.jpg", frame)
            contador += 1
            cv2.waitKey(1)
        else:
            logger.info("Fin del video")
            break
    captura.release()


if __name__ == '__main__':
    # extraerFotogramas('C:/Users/root/Desktop/video.mp4', 20, 'C:/Users/root/Desktop/imagenes')
    extraerFotogramas('rtsp://xxx', 25, 'C:/Users/root/Desktop/imagenes')


Renombramiento de archivos

  1. Script implementado:
import os
from loguru import logger

'''
Renombrar archivos en directorio específico
:param ruta: Directorio con archivos
:param contador: Número inicial para nombres
:param prefijo: Parte inicial del nombre
:param extension: Tipo de archivo
'''
def renombrarArchivos(ruta = '.', contador = 0, prefijo = '', extension = 'jpg'):
    archivos = os.listdir(ruta)             
    for archivo in archivos:  
        ruta_original = os.path.join(ruta, archivo)     
        if os.path.isdir(ruta_original):             
            continue

        ruta_nueva = os.path.join(ruta, f"{prefijo}{contador}.{extension}")  
        logger.info(f'Original: {ruta_original} -> Nuevo: {ruta_nueva}')
        
        if os.path.exists(ruta_nueva):
            logger.error(f"Archivo con mismo nombre existe en {ruta}")
            exit(-1)
        
        os.rename(ruta_original, ruta_nueva)    
        contador += 1                 

if __name__ == '__main__':
    # renombrarArchivos(r'C:\Users\root\Desktop\imagenes', contador=1, prefijo='img', extension='png')
    renombrarArchivos(r'C:\Users\root\Desktop\imagenes', contador=100, prefijo='img')


Conteo de archivos en directorio

  1. Script implementado:
import os
from loguru import logger

'''
Contar archivos con extensión específica en directorio
:param ruta: Directorio a analizar
:param ext: Extensión del archivo
:param recursivo: Buscar en subdirectorios
:return: Número de archivos
'''
def contarArchivos(ruta = '.', ext = 'txt', recursivo = True):
    contador = 0
    for ruta_actual, _, archivos in os.walk(ruta):    
        for archivo in archivos:
            if len(archivo.split('.')) > 1 and archivo.split('.')[1] == ext:
                contador += 1   
        if not recursivo:
            break
    return contador


if __name__ == '__main__':
    cantidad = contarArchivos(r'C:\Users\root\Desktop\imagenes', ext='jpg', recursivo=False)
    logger.info(f'Cantidad de archivos: {cantidad}')


Detección con YOLOv8 en flujo RTSP

  1. Script implementado:
import cv2
import threading
from queue import Queue
from loguru import logger
from ultralytics import YOLO

cola = Queue()

modelo = YOLO('weights/xxx.pt')  

def recibir(flujos):
    captura = cv2.VideoCapture(flujos)
    if not captura.isOpened():
        logger.error(f"No se puede abrir {flujos}")
        exit(-1)
    
    conteo = 0
    while True:
        estado, frame = captura.read()
        if estado:
            conteo = 0
            cola.put(frame)
        else:
            conteo += 1
            if conteo > 25:
                captura = cv2.VideoCapture(flujos)
            continue
    
 
def mostrar():
    while True:
        if not cola.empty():
            frame = cola.get()
            resultado = modelo.predict(source=frame, conf=0.35, save=True, save_txt=True)
        
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    cv2.destroyAllWindows()

if __name__=='__main__':
    url_flujo = "rtsp://xxx"

    hilo1 = threading.Thread(target=recibir, args = (url_flujo,))
    hilo2 = threading.Thread(target=mostrar)
    
    hilo1.start()
    hilo2.start()


Este contenido se actualiza periódicamente...........

Etiquetas: YOLOv8 opencv rtsp Python ImageProcessing

Publicado el 8-26 21:25