Use yolov5 para la detección de objetivos y recorte el objetivo detectado

Use yolov5 para la detección de objetivos y recorte el objetivo detectado

Escrito en el frente: Acerca de la depuración y el funcionamiento de yolov5, no entraré en detalles aquí. Para la depuración y el funcionamiento de yolov5, consulte: https://www.bilibili.com/video/BV1tf4y1t7ru/spm_id_from=333.999.0.0&vd_source=043dc71f3eaf6a0ccb6dada9dbd8be37
Este artículo explica principalmente el corte.

Requisitos: Identificar los personajes de la imagen y recortarlos

Si solo necesita reconocer personas, solo necesita configurar parámetros en yolov5, por ejemplo, cuando usa la línea de comando para ejecutar: es decir, python --classes 0
configure los parámetros para reconocer solo personas. Además, se debe recortar el objetivo detectado y se requieren las coordenadas del punto central del objetivo y el ancho y alto del objetivo, por lo que se debe guardar la información del objetivo. Realice la detección de personas y guarde la información del objetivo detectado. El comando en ejecución es: python --classes0 --save-txt
En el archivo tx que guarda la información del objetivo, por ejemplo, la siguiente figura: 0 0.682078 0.495935 0.613014 0.99187, que representan de izquierda a derecha: tipo de objetivo (0 representa persona), el valor x (x_center) de las coordenadas del punto central del objetivo, el valor y (y_center) de las coordenadas del punto central del objetivo, el ancho (ancho) del objetivo y la altura ( altura) del objetivo.
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
La condición para el recorte es obtener x1, x2, y1, y2. obviamente

x1=x_center-width/2
x2=x_center+width/2
y1=y_center-height/2
y2=y_center+height/2

Sin embargo, dado que el centro x, el centro y, el ancho y la altura almacenados en el archivo txt de yolov5 están todos normalizados, los valores x1, x2, y1 e y2 calculados en la fórmula anterior están todos normalizados. querer es el valor original, entonces

x1=(x_center-width/2)*整张图片的宽度(注:是整张图片的宽度不是目标的宽度,这里的宽度就是像素宽度)
x2=(x_center+width/2)*整张图片的宽度
y1=(y_center-height/2)*整张图片的高度(注:是整张图片的高度不是目标的高度,这里的高度就是像素高度)
y2=(y_center+height/2)*整张图片的高度

Obtenga los cuatro valores de x1, x2, y1, y2, luego corte x1---->x2 en dirección horizontal y corte y1---->y2 en dirección vertical.
Código:

import os
import cv2

def main():
	#图片路径
    img_path = './data/images/hg.jpg'
    #txt文件路径
    label_path = './runs/detect/exp23/labels/hg.txt'
    # 读取图片,结果为三维数组
    img = cv2.imread(img_path)
    # 图片宽度(像素)
    w = img.shape[1]
    # 图片高度(像素)
    h = img.shape[0]
    # 打开文件,编码格式'utf-8','r+'读写
    f = open(label_path, 'r+', encoding='utf-8')  
    # 读取txt文件中的第一行,数据类型str
    line = f.readline()
    # 根据空格切割字符串,最后得到的是一个list
    msg = line.split(" ")
    x1 = int((float(msg[1]) - float(msg[3]) / 2) * w)  # x_center - width/2
    y1 = int((float(msg[2]) - float(msg[4]) / 2) * h)  # y_center - height/2
    x2 = int((float(msg[1]) + float(msg[3]) / 2) * w)  # x_center + width/2
    y2 = int((float(msg[2]) + float(msg[4]) / 2) * h)  # y_center + height/2
    print(x1, ",", y1, ",", x2, ",", y2)
    #裁剪
    img_roi = img[y1:y2,x1:x2]
    save_path='./cutpictures/hg.jpg'
    cv2.imwrite(save_path,img_roi)

if __name__ == '__main__':  
    main() 

Visualización de efectos:
la detección de objetivos
Por favor agregue una descripción de la imagen
y el recorte
Por favor agregue una descripción de la imagen
se escriben más tarde: en la implementación del código anterior, porque ya sé que solo hay una persona en la imagen, solo hay una línea en el archivo txt, así que solo leo una línea, si f.readlin()hay son varias personas objetivo, luego f.readlines()leen varias líneas y luego usan el ciclo for para cortar línea por línea.

Corrección: en la operación de seguimiento, quiero eliminar a la persona más alejada de la imagen, que es el marco rojo en la imagen de abajo. Luego, solo necesito comparar y_center y recortar el y_center más grande. De acuerdo con esta idea, lo que corté es un marco verde.
inserte la descripción de la imagen aquí
La verificación posterior encontró que el sistema de coordenadas en yolov es el siguiente:
inserte la descripción de la imagen aquí
pero no afecta la comprensión de los procesos relacionados anteriores.

Supongo que te gusta

Origin blog.csdn.net/weixin_44747173/article/details/127277989
Recomendado
Clasificación