Í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
- 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
- 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
- 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
- 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
- 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...........