记录贴:将inria行人检测数据集转化为YOLO可以训练的txt格式

inria行人检测数据集解压后有train和test文件,将里面的标注信息提取出来

转化代码

# coding=UTF-8

import os
import re
from PIL import Image

sets=['train']
#需要填写变量image_path、annotations_path、full_path
image_path = r"D:\BaiduNetdiskDownload\59_INRIA Person Dataset\shuju1/"                          # 图片存放路径,路径固定
annotations_path = r"D:\BaiduNetdiskDownload\59_INRIA Person Dataset\INRIAPerson\Test\annotations/" #文件夹目录                                          # INRIA标签存放路径
annotations= os.listdir(annotations_path) #得到文件夹下的所有文件名称

# 获取文件夹下所有图片的图片名
def get_name(file_dir):
   list_file=[]
   for root, dirs, files in os.walk(file_dir):
      for file in files:
         # splitext()将路径拆分为文件名+扩展名,例如os.path.splitext(“E:/lena.jpg”)将得到”E:/lena“+".jpg"
         if os.path.splitext(file)[1] == '.jpg':
            list_file.append(os.path.join(root, file))
   return list_file

# 在labels目录下创建每个图片的标签txt文档
def text_create(name,bnd):
   full_path = r"D:\BaiduNetdiskDownload\59_INRIA Person Dataset\labels1/%s.txt"%(name)
   size = get_size(name + '.png')
   convert_size = convert(size, bnd)
   file = open(full_path, 'a')
   file.write('0 ' + str(convert_size[0]) + ' ' + str(convert_size[1]) + ' ' + str(convert_size[2]) + ' ' + str(convert_size[3]) )
   file.write('\n')

# 获取要查询的图片的w,h
def get_size(image_id):
   im = Image.open(r'D:\BaiduNetdiskDownload\59_INRIA Person Dataset\INRIAPerson\Test\pos/%s'%(image_id))       # 源图片存放路径
   size = im.size
   w = size[0]
   h = size[1]
   return (w,h)

# 将Tagphoto的x,y,w,h格式转换成yolo的X,Y,W,H
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] - box[0]
   h = box[3] - box[1]
   x = x*dw
   w = w*dw
   y = y*dh
   h = h*dh
   return (x,y,w,h)

# 将处理的图片路径放入一个txt文件夹中
for image_set in sets:
   if not os.path.exists(r'D:\BaiduNetdiskDownload\59_INRIA Person Dataset\labels1'):
      os.makedirs(r'D:\BaiduNetdiskDownload\59_INRIA Person Dataset\labels1')                     # 生成的yolo3标签存放路径,路径固定
   image_names = get_name(image_path)
   list_file = open('2007_%s.txt'%(image_set), 'w')
   for image_name in image_names:
      list_file.write('%s\n'%(image_name))
   list_file.close()

s = []
for file in annotations: #遍历文件夹
   str_name = file.replace('.txt', '')

   if not os.path.isdir(file): #判断是否是文件夹,不是文件夹才打开
      with open(annotations_path+"/"+file) as f : #打开文件
         iter_f = iter(f); #创建迭代器
         for line in iter_f: #遍历文件,一行行遍历,读取文本
            str_XY = "(Xmax, Ymax)"
            if str_XY in line:
               strlist = line.split(str_XY)
               strlist1 = "".join(strlist[1:])    # 把list转为str
               strlist1 = strlist1.replace(':', '')
               strlist1 = strlist1.replace('-', '')
               strlist1 = strlist1.replace('(', '')
               strlist1 = strlist1.replace(')', '')
               strlist1 = strlist1.replace(',', '')
               b = strlist1.split()
               bnd = (float(b[0]) ,float(b[1]) ,float(b[2]) ,float(b[3]))
               text_create(str_name, bnd)
            else:
               continue

可视化一下

判断转化是否正确,写了一个可视化代码

import os
import cv2
img_path = r'D:\BaiduNetdiskDownload\59_INRIA Person Dataset\INRIAPerson\Train\pos/'
label_path = r'D:\BaiduNetdiskDownload\59_INRIA Person Dataset\labels/'
f = os.listdir(img_path)
def paint(label_file, img_file):
    #读取照片
    img = cv2.imread(img_file)
    img_h, img_w, _ = img.shape
    with open(label_file, 'r') as f:
        obj_lines = [l.strip() for l in f.readlines()]
    for obj_line in obj_lines:
        cls, cx, cy, nw, nh = [float(item) for item in obj_line.split(' ')]
        color = (0, 0, 255) if cls == 0.0 else (0, 255, 0)
        x_min = int((cx - (nw / 2.0)) * img_w)
        y_min = int((cy - (nh / 2.0)) * img_h)
        x_max = int((cx + (nw / 2.0)) * img_w)
        y_max = int((cy + (nh / 2.0)) * img_h)
        cv2.rectangle(img, (x_min, y_min), (x_max, y_max), color, 2)
    cv2.imshow('Ima', img)
    cv2.waitKey(0)
for i in f:
    label_path_name = label_path + i.replace('png','txt')
    img_path_name = img_path + i
    print(label_path_name)
    print(img_path_name)
    paint(label_path_name,img_path_name)

发现这个数据集的多人场景下只标注了几个人