Рубрики
Без рубрики

Detección en yolo, рамка рама

La Visión POR ComputaDora es una de las áreas del antrendizaje automático con mayor cantidad de avance … Теги с Python, Yolo, Computerscience, Darknet.

La Visión Por ComputaDora es una de las áreas del Artrendizaje Automático Con Mayer Cantidad de Avances En Los últimos Tiempos y, Sin Embargo, Donde También Quedan Aún Luceos Проблема Por Resolver. Doctro de Este Campo Podemos Pensar Ru Varias Subdivisions Según La Tarea Realizar, Por Ejemplo, Clazificación de Imágenes, Detección de objetos, Procesamiento de Imágenes y un unargo etcétera. En este artículo vamos a trabajar en elcomea de la deección de múltiples objetos en imágenes utilizando yolo + darknet, una de las combinacions stortes para tal tarea.

Йоло (вы смотрите только один раз) ся una arquitectura de red convoluesta оригинал por joseph redmon, santosh divvala, Росс Гиршик у Али Фархади [ https://arxiv.org/abs/1506.02640 . CON EL PASO DEL TIEMPO SE HAN REALIZADO DVESTASS MEJORAS A La Arquitectura Оригинал Y Al Día de Hoy Se Encuentra Devolov4, Su última Versión. Aunque es posable Afterientar la arquitectura de yolo ru diversass plataformas, Quizás la más Удобно PARA TAL FIN ES La Que Brinda Darknet. Darknet ES Or Framework Pensado Para Afterientar Distintas Arquitecturas de Redes Buscando La Mayor Eficiencia de Cómputo. La Contrapartida Que Tiene Es Mayor difeatult de Adverysación Comparado Con Otros Frameworks Más ConoCidos Como Tensorflow O Pytorch.

En este artículo no претендентов explicaar la arquitectura Ni El Funcionamiento de Yolo. Lo que haremos, en cambio, es mastrar cómo utilizar la lementación de darknet y cuáles son las primeras dificateults que pueden aparecer cuanto intentamos hacer esto utilizando python. Primero, Sin Embargo, Vamos Mencionar Muy Brevemente El Crashio de Funcionamiento de Una Red Convolucial Para Ubicar ru Contexto El Flancea Que Estamos Intentando Resolver.

Si Pensamos en una Imagen Представитель POR UNA MATRIZ, DONDE CADA Píxel es en valor numérico, podemos pensar también en que alguna transformación sobre esta Imagen Нет es otra cosa que una transformación sobre la matriz оригинал. EN Особенно SE SUELE Pensar EN Las Images Como La Composición de 3 матрицы, CADA UNA POR CADA RGB. Doctro del Campo del Procesado de Imágenes Una Transvericación Comúnmente Utilizada Es La Convolución. CONVOLUCIANAR UNA IMPEAN (Матрис) Con On Filtro (Matriz) da Como Resuldado Una Nueva Imagen más pequeña que la оригинал. ESTA Imagen Tendrá Una u Otra Característica Según El Filtro Que Se Haya Utilizado A La Hora de ConsoLuciaR. Algunos Filtros Muy Comunes Son Aquellos Que Buscan Bordes En La Imagen (Edge), Aquellos Que La Difuminan (Blur), Etcétera. ESTOS FILTROS SIRVEN PARA, EN FINDITITIVA, EXENERA O Risaltar Alguna Propiedad (особенность) de la Imagen оригинал. Estas Propiedades Filtradas PueDen Aportar Información Carreate Sobre La Imagen Оригинал Y ESTA Puede Ayudar En On Proceso de Clasifación, de Identificationación de Objetos o de Custerle oTra Tarea uno uno pueda a una красный нейрональный.

La Pregunta проведет ES Cómo Pasarle Esta Información Adiedional (Filtrada de la Images оригинал) una красный нейрональ. La Respuesta Este Smethrea Viene Dado Por Las Redes Convoluciales. EL ALLAS UNO PASA Sólo La Imagen Оригинальный ввод COMO. Luego, En Las Capas Capas Curolucales, CADA NEURONA (CORMOLUCIONION) Applica Un Filtro A Iinse que Llega de la Capa Ansiory Y entrega Como Resuldado Una Nueva Imagen Filtrada. Y Обуждает, ¿Qué Filtro Applican Estas Capas Capas Curoluciales?. La Respuesta es ninguno Ensial. LAS REDES CORMOLUCIONES HEREDAN LA FILOSOFIAE DE LAS REDES MULTIPERCEPTRON DONDE CADA NEURONA ENTRENA SUS PESOS Y POR Lo Tanto la Operación que asta realiza sobre la entrada. EN LAS Neuronas Convoluciales Lo Que Se Enrena E EL FILTRO Applepaado A Antrada. ES Más: PodeMos Applicar Mouseas Capas Capas Curoluciales, de modo que Cada Capa Applica Una Serie de Filtros Sobre Las Imagees de las capas Anderlees. ESTO Premite «Apilar» Una Suzesión de Filtros Donde Cada Uno Rexoge Alguna Característica Distinta de la Images. ESTA LOGICA Ужели в Una Inmensa Flexibilidad y ООН потенциал Enorme a La Hora de Emerry Información Sobre Una Imagen оригинал. Финализа, Al Final De Las Capas Curoluciales Se Sulee Agregar Alguna Capa Multiperceptrón Para Que Esta actúe Como Clasifitor, Coverestor, Etcétera.

Bajo Esta Lógica Es Que Funcionan LAS REDES CONVOLUCIONES Y EN Особенно La Arquitectura de Yolo. TENIEDEO ESTO PRESTE ES QUE VAMOS A UTILIZAR EL Framework de darknet [ https://pjreddie.com/darknet/ ] Para Impreatear yolo y mastraremos los primeros flanceas a los que uno se enfrenta cuanto решить утильзар phython para tal fr. Утилизаремский пункт La Tarea. Йолов3.

Вемос …

Siguiendo La Guía de Instalación de Darknet de Su Pá Página Of Córyo Realizar Una Detección de Córabiles detección de combile. Sin Embargo, Es También Posible Hacer Lo Mismo Utilizando El Archivo Darknet.py que ya viene en Эль Пакет. ESTE Código de Python Tiene Un Coudunto de Funciones que nos permiten realizar una detección sobre la imagen seleccionada, con eel simple reperimiento de que escifiquemos la dirección de la Carpeta contedora de la Images. ESTO SE Concey En La Línea

  r = detect(net, meta, b"/direction/image.jpg")

que está dentro de la función главный AL Final Del Archivo. EL Restuctionado de la deección outrega cuando corremos el archivo Darknet.py En La Consola.

Tengan En Mente Que Este Archivo Está Escrito Para Python 2, Que Ya Está Daperaado Dado Que Ahora Eshouse Python 3, El Cual ReComendamos Usar. ES NECESARIO ENTONES ESPORTAR ONOS CAMBIOS EN Эль Archivo Antes Que Nada:

  • Todas Las Direcciones de los archivos deben llevar una B Делант-де-лас Comillas de la Dirección. ESTO SE Debe en Cambio de Formato en los archivos. El formato. Нет es un on Строка , Sino del Tipo байты y en python 3 esto debe ser Esceptificado.
  • Las Direcciones en сеть y мета (La Red, Los Pesos Y Los Nombres) Deben Ser Cambiados, Y También La Dirección del архиво libdarknet.so en la línea либ .
  • Además, Эстика Ахора Йолов3. Así Que es posable descargarlo y usar los nuevos pesos y la красный.
  • Cuidado Con La Dirección del Archivo Coco.names Que Se Essifea Doctro de Coco.data En La Carpeta CFG/ Es Necesario Añadirle La Dirección завершится.
  • Нет SE OLVIDEN DE AANADIR LOS PARÉNTESS CORDATINES EN LAS LINEAS DE Печать (ESTO ES Necesario En Python 3).

Ahora Vamos Al Grano, El Interés de Esta Publicación Es Realizar La Detección de un video Frame Por Por. La Función Видеокаптир Дель Пакет CV2 Procesa El Video Y ES Bosible Leer Y Guardar Cada Crame Susando Читать () Отказ Перо Эль Архиво Darknet.py Нет entende el formato de Рамка ; Necesita Una Imagen. PARA PODER CORRER LA RED RU RU ООН Video ES Necesario Convertire Los Frames A Formato Imagen, Y Para Lograrlo Escribimos Una Función Que ExplicaMos Más abajo.

Nuestra Función.

Utilizaremos La Función de deetección en Darknet.py Así Que Es Menester Alimentarla Con Algo Que PueDa Digerir. Así es Que Necesitamos Saber Que es. Notamos que обнаруживать Carga La Imines Utilizando La Función load_image Una Función de C Que Darknet.py переведите питон. Buscándola, Descubrimos Que Está Escrita En Эль Архиво image.c Doctro del Directorio SRC/ , Y Que Llama a la función load_image_stb Escrita algunas líneas arriba en Эль-МИММО Архиво. La Salida de Esta Función Es la Entrada de обнаруживать con lo cual nos dice cuál eel formato deseado para el frame. En este caso es la clase Darknet. Изображение , Официальный POR.

class IMAGE(Structure):
    _fields_ = [("w", c_int),
                ("h", c_int),
                ("c", c_int),
                ("data", POINTER(c_float))]

Recuerden Que Una Imagen Tiene Una Altura H , ООН Ancho варенье , H * W Píxeles y Tres Clocks Por Cada Píxel: Un Triplete [x, y, z] , Донс CADA UNO va desde cero uno. Образование TeneMos H * W * 3 NúMEROS PARA DINDIRLA. ООН Рамка en de la clase numpy.ndarray Отказ Necesitamos Tenser Una Clase Darknet. ИЗОБРАЖЕНИЕ Para que la función обнаруживать Pueda leerla.

Перо Л.Ю. Тенемос Partir de la lectura de CV2 сын кадров. ООН Рама ООН Массив CON TRES CENCENADAS DONDE LAS DOS Primeras Refieren A La Posición, Con Conceenadas h y W y la tercera al vector de orles. Podemos Pictorizarlo Como.

   [ [[x1 y1 z1], [x2 y2 z2],... [xn yn zn]], [[xn+1 yn+1 zn+1],... ], ... ]

y Estos números Corren de Cero A 255: SON CENCENADAS RGB.

EN CHARDIO, PODEMOS USAR ESTE ARRAY COMO LA CUARTA ENTRADA DE LA FUNCION Изображение Перо Эсто не Функционарара. POR Qué Y Cómo Resolverlo Puede Ser Concontrado En La Función load_image_stb , Предыдущая Менсионада,

image load_image_stb(char *filename, int channels)

EN в частности, Hay Una Parte del Código Donde PodeMos Ver Cómo Es El Formato de Salida,

for(k = 0; k < c; ++k){
        for(j = 0; j < h; ++j){
            for(i = 0; i < w; ++i){
                int dst_index = i + w*j + w*h*k;
                int src_index = k + c*i + c*w*j;
                im.data[dst_index] = (float)data[src_index]/255.;
            }
        }
    }

ЭСТО определяет El Centre Ordenamiento del Vector. Siguiendo La Notación de Arriba, Донс (xi, yi, zi) Es El Triplete de la Corceenada Я , Эль-вектор де entrada de Изображение Деб Тенер Ла Пинта

[z1, z2, z3, ..., y1, y2, y3, ..., x1, x2, x3, ...]

AHORA QUE CONOCEMOS EL ORDENAMIRETO, PodeMos Escribir Nuestra Propia Función Que Convierta Рамки En Imágenes de la Clase Изображение Con El Orden Específico. La Función queda

def frameToImage(frame):
  frame = (frame/255).astype(ct.c_float)
  me = np.hstack((frame[:, :, 2].flatten(), frame[:, :, 1].flatten(), frame[:, :, 0].flatten()))
  img = dn.IMAGE(frame.shape[1], frame.shape[0], 3, me.ctypes.data_as(ct.POINTER(ct.c_float)))
  return img

Necesitamos Importar El Paquete CTYPES Que NoS помогает манипулятор Tipos de C En Python. En la primera línea de la función, normalizamos cada elemento del frame de forma tal de que vaya de cero a uno ou conventivimos en un un ou chation conventiMos, queremos que todos los elementos estén en un un sola fila, así que tomamos Тодос Лос-Элементос де ООН Цвет (Por Ejemplo, рамка [:,:, 2] ), LO PoneMos en una lista y removemos los paréntes сплющить . Усандо HSTACK Creamos Vector un vector que contiene todos los elementos en una misma fila, como queríamos. Queda algo como esto

 [z1 z2 z3 ... y1 y2 y3... x1 x2 x3...]

Que es easicamente lo que eccesitamos como engrada para Изображение Отказ

Финализация, en la última línea, crowsos una range racho, así que ou entregamos el Ancho, La Altura, ООН 3 Que соответствует A La Cantidad de Colores Y El Vector Que Crownos Antes, ConvertiDo en unater a Флотан-де-C.

¡Al Fin! Lo único que nos queda es reemplazar algunas poCas líneas en la función Обнаружить Para Cargar La Imagen y Estamos Listos. Модификамос EL Archivo Darknet.py , Partir de Ahora Contendrá Nuestra Función караметоимаж y обнаруживать Томара ООН Рамка, Llamará a Nuestra Función Y La Transformará en una clase de imagen por su propia cuenta. Нет Тендер Салина Я КСЕ преданный USAMOS COMO UNA Librería. La Adveryacióón Entera Está El репозиторион

Y финализация, Escribimos Script Que Ejecuta La Función обнаруживать Para Cada Рамка de un video. Sóestro Necesitamos Importar Nuestra librería Como Импорт библиотеки как lib y llamar a la función обнаруживать COMO r.detect (рамка, мета, Imagerot) Отказ

import numpy as np
import cv2 
import ctypes as ct
import math
import random
import libreria as lib

# Carga la red, los pesos y las etiquetas
net = lib.load_net(b"/home/user/darknet/cfg/yolov3.cfg", b"/home/user/darknet/yolov3.weights", 0)
meta = lib.load_meta(b"/home/user/darknet/cfg/coco.data")

# Lee el video y calcula el número total de frames 
video = cv2.VideoCapture("./video2.mp4")
number = int(video.get(cv2.CAP_PROP_FRAME_COUNT))

# Podemos definir desde qué frame y hasta cuál queremos ir acá (si queremos ir al último usamos ultimo = number)
primero = 0
ultimo = 10
currentframe = primero

print("\nDETECCION USANDO DARKNET + YOLOV3")
print(f"\nCantidad de frames totales = {number}")
print(f"\nPrimer frame = {primero}\nUltimo frame = {ultimo}")
print("\n\n" )

# Corre la red para los frames seleccionados
while currentframe < ultimo:

    video.set(1, currentframe)
    ret, framevid = video.read()
    print(currentframe)

    if ret: 
        imagerot = lib.rotateimage(framevid, 90) # Puede ser necesario rotar los frames del video
        r = lib.detect(net, meta, imagerot); # Procesado de la red
        print(r)
        print('###########################################################################')
    else: 
        break

    currentframe = currentframe + 1

# Libera el video
video.release() 

Выводит

Este Pequeño. взломать Para Poder Utilizar Darknet. (con todo su poder) en python junto a las herramientas de análisis de imágenes que ya análisis de imágenes que ya conoCemos (como opencv ) nos “simplifificart bucio el reconocimiento de imágenes de alta performance con toda la versatilidad y las librizerías de python. EN ADELANTE VAMOS A VER Más en profundidad las capacidades extra que obtenemos al poder usar todas estas libererías.

Оригинал: “https://dev.to/ninjaia/deteccion-en-yolo-frame-por-frame-1mam”