Conjunto de datos de Coco a conjunto de datos de Yolo (simple y fácil de entender)

1. Antecedentes

Tengo un conjunto de datos de detección de objetivos en mi mano. Descargué el código yolov5 pero no pude ejecutarlo. Descubrí que el formato del conjunto de datos es diferente, así que aquí está cómo convertirlo.

2. Conversión de datos

2.1 Datos sin procesar

Esta es la carpeta de los datos originales, donde tren2017 es la imagen del conjunto de entrenamiento, val2017 es la imagen del conjunto de verificación y anotaciones es la etiqueta.
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

2.2 Código convertido

Cree un nuevo py, cambie la ruta a su propia ruta y ejecute el siguiente código. Debe ejecutarse dos veces, y tanto el conjunto de entrenamiento como el conjunto de verificación están entrenados, de modo que se pueda responder al efecto esperado de la respuesta.

#COCO 格式的数据集转化为 YOLO 格式的数据集
#--json_path 输入的json文件路径
#--save_path 保存的文件夹名字,默认为当前目录下的labels。

import os
import json
from tqdm import tqdm
import argparse

parser = argparse.ArgumentParser()
#这里根据自己的json文件位置,换成自己的就行
parser.add_argument('--json_path', default='D:/workSpace/pycharm/yolov5/MyTest/SAR_coco/annotations/instances_val2017.json',type=str, help="input: coco format(json)")
#这里设置.txt文件保存位置
parser.add_argument('--save_path', default='D:/workSpace/pycharm/yolov5/MyTest/SAR_coco/Lable/val2017', type=str, help="specify where to save the output dir of labels")
arg = parser.parse_args()

def convert(size, box):
    dw = 1. / (size[0])
    dh = 1. / (size[1])
    x = box[0] + box[2] / 2.0
    y = box[1] + box[3] / 2.0
    w = box[2]
    h = box[3]
#round函数确定(xmin, ymin, xmax, ymax)的小数位数
    x = round(x * dw, 6)
    w = round(w * dw, 6)
    y = round(y * dh, 6)
    h = round(h * dh, 6)
    return (x, y, w, h)

if __name__ == '__main__':
    json_file =   arg.json_path # COCO Object Instance 类型的标注
    ana_txt_save_path = arg.save_path  # 保存的路径

    data = json.load(open(json_file, 'r'))
    if not os.path.exists(ana_txt_save_path):
        os.makedirs(ana_txt_save_path)

    id_map = {
    
    } # coco数据集的id不连续!重新映射一下再输出!
    with open(os.path.join(ana_txt_save_path, 'classes.txt'), 'w') as f:
        # 写入classes.txt
        for i, category in enumerate(data['categories']):
            f.write(f"{
      
      category['name']}\n")
            id_map[category['id']] = i
    # print(id_map)
    #这里需要根据自己的需要,更改写入图像相对路径的文件位置。
    list_file = open(os.path.join(ana_txt_save_path, 'train2017.txt'), 'w')
    for img in tqdm(data['images']):
        filename = img["file_name"]
        img_width = img["width"]
        img_height = img["height"]
        img_id = img["id"]
        head, tail = os.path.splitext(filename)
        ana_txt_name = head + ".txt"  # 对应的txt名字,与jpg一致
        f_txt = open(os.path.join(ana_txt_save_path, ana_txt_name), 'w')
        for ann in data['annotations']:
            if ann['image_id'] == img_id:
                box = convert((img_width, img_height), ann["bbox"])
                f_txt.write("%s %s %s %s %s\n" % (id_map[ann["category_id"]], box[0], box[1], box[2], box[3]))
        f_txt.close()
        #将图片的相对路径写入train2017或val2017的路径
        list_file.write('./images/train2017/%s.jpg\n' %(head))
    print("convert successful!")
    list_file.close()



necesita modificar
inserte la descripción de la imagen aquí

Captura de pantalla después de ejecutar el código
inserte la descripción de la imagen aquí

Embalaje formato 2.4

Empaqueta los datos generados según el formato de yolo, como se muestra en la siguiente figura.
inserte la descripción de la imagen aquí

3 pruebas

Edite el archivo yml
inserte la descripción de la imagen aquí
para ejecutar, sin errores, ¡éxito!
inserte la descripción de la imagen aquí

El funcionamiento del código yolov5 puede referirse a la siguiente publicación del blog ( cómo ejecutar yolov5 )

Supongo que te gusta

Origin blog.csdn.net/qq_43471945/article/details/128161276
Recomendado
Clasificación