TensorFlow实战(五)——交通标志牌(GTSRB数据集)的格式转换(一)

前言:

     这个系列是学习基于TensorFlow,利用德国交通标志数据集——GTSRB交通信号数据集包含43种交通信号),进行训练简单的卷积神经网络完成识别。本文先介绍数据集的下载以及如何编写脚本进行兴趣区域的批处理和数据格式转换。

一、交通标志数据集下载

      交通标志识别是一个很好的入门练手项目,在网上可以找到很多的相关资料。首先呢,去找到一个优秀的训练数据集是至关重要的。在这里,我选择了德国交通标志数据集,那么如何下载数据集呢?

    进入网址:http://benchmark.ini.rub.de/?section=gtsrb&subsection=dataset点击打开链接,如下:


往下拉,可以看到:


点击下载即可。


二、数据集文件的格式转换以及ROI区域的截取

        打开我下载的解压后的数据集,首先我们来看训练集,如下所示:


任意进入一个文件夹:


这是测试数据:


      必须注意,下载的GTSRB数据集都是.ppm格式的,我们看不了,我们需要将其转换为jpg格式,在转换之前,我们要知道,每类标志所在的文件夹最下面都有一个后缀为.csv的文件,如下所示:



    再看看测试集:


我们打开测试数据集中的csv文件,来看看里面包含什么信息:


     里面有ROI区域的坐标,我们需要根据这个ROI区域的坐标,来分割出ROI区域,并另存为后缀为.jpg的格式。我们编写脚本如下:

# -*- coding: utf-8 -*-

###################################
#########  作者:行歌   ############
#########  时间:2018.5.11  ########
######  email:1013007057@qq.com  ##
###################################

import os
import numpy as np
import PIL
import matplotlib.pyplot as plt
import pandas as pd


def convert_train_data(file_dir):

    root_dir = 'E:\\DataSet\\GTRSB\\GTSRB_Final_Training_Images_roi_jpg'
    # 这是图片转换成jpg后另存为的根目录,在运行程序前需要自己先创建

    directories = [file for file in os.listdir(file_dir)  if os.path.isdir(os.path.join(file_dir, file))]
    # print(directories)
    # directories是一个列表,其中每个元素都是file_dir目录下的文件名,部分展示如下所示:
    # ['00000', '00001', '00002', '00003', '00004', '00005', '00006',
    #  '00007', '00008', '00009', '00010', '00011','00012', '00013',
    #  ...

    for files in directories:
        path = os.path.join(root_dir,files)
        if not os.path.exists(path):
            os.makedirs(path)
        # print( path)
        # 判断path路径是否存在,不存在就先创建路径,部分展示如下:
        # E:\DataSet\GTRSB\GTSRB_Final_Training_Images_roi_jpg\00000
        # E:\DataSet\GTRSB\GTSRB_Final_Training_Images_roi_jpg\00001
        # E:\DataSet\GTRSB\GTSRB_Final_Training_Images_roi_jpg\00002
        # E:\DataSet\GTRSB\GTSRB_Final_Training_Images_roi_jpg\00003

        data_dir = os.path.join(file_dir, files)
        # print(data_dir),部分输出如下:
        # E:\DataSet\GTRSB\GTSRB_Final_Training_Images\GTSRB\Final_Training\Images\00000
        # E:\DataSet\GTRSB\GTSRB_Final_Training_Images\GTSRB\Final_Training\Images\00001
        # E:\DataSet\GTRSB\GTSRB_Final_Training_Images\GTSRB\Final_Training\Images\00002
        # E:\DataSet\GTRSB\GTSRB_Final_Training_Images\GTSRB\Final_Training\Images\00003

        file_names = [os.path.join(data_dir, f) for f in os.listdir(data_dir)  if f.endswith(".ppm")]
        # file_name里面每个元素都是以.ppm为后缀的文件的绝对地址

        for f in os.listdir(data_dir):
            if f.endswith(".csv"):
                csv_dir = os.path.join(data_dir, f)
                # 获取注解文件的绝对地址
                # print(csv_dir),部分展示如下:
                # E:\DataSet\GTRSB\GTSRB_Final_Training_Images\GTSRB\Final_Training\Images\00000\GT - 00000.csv
                # E:\DataSet\GTRSB\GTSRB_Final_Training_Images\GTSRB\Final_Training\Images\00001\GT - 00001.csv
                # E:\DataSet\GTRSB\GTSRB_Final_Training_Images\GTSRB\Final_Training\Images\00002\GT - 00002.csv
                # E:\DataSet\GTRSB\GTSRB_Final_Training_Images\GTSRB\Final_Training\Images\00003\GT - 00003.csv

        csv_data = pd.read_csv(csv_dir)
        # csv_data是一个DataFrama形式的数据结构

        csv_data_array = np.array(csv_data)
        # print(csv_data_array),部分展示如下:
        # [['00000_00000.ppm;29;30;5;6;24;25;0']
        #  ['00000_00001.ppm;30;30;5;5;25;25;0']
        #  ['00000_00002.ppm;30;30;5;5;25;25;0']
        #  ['00000_00003.ppm;31;31;5;5;26;26;0']
        #  ['00000_00004.ppm;30;32;5;6;25;26;0']
        #  ...

        for i in range(csv_data_array.shape[0]):
            csv_data_list = np.array(csv_data)[i,:].tolist()[0].split(";")
            # print(csv_data_list),部分展示如下:
            # ['00000_00000.ppm', '29', '30', '5', '6', '24', '25', '0']
            # ['00000_00001.ppm', '30', '30', '5', '5', '25', '25', '0']
            # ['00000_00002.ppm', '30', '30', '5', '5', '25', '25', '0']
            # ['00000_00003.ppm', '31', '31', '5', '5', '26', '26', '0']
            # ['00000_00004.ppm', '30', '32', '5', '6', '25', '26', '0']
            # ['00000_00005.ppm', '31', '31', '6', '6', '26', '26', '0']

            sample_dir = os.path.join(data_dir, csv_data_list[0])
            # 获取该data_dir目录下每张图片的绝对地址
            # print(sample_dir),部分展示如下:
            # E:\DataSet\GTRSB\GTSRB_Final_Training_Images\GTSRB\Final_Training\Images\00000\00000_00000.ppm
            # E:\DataSet\GTRSB\GTSRB_Final_Training_Images\GTSRB\Final_Training\Images\00000\00000_00001.ppm
            # E:\DataSet\GTRSB\GTSRB_Final_Training_Images\GTSRB\Final_Training\Images\00000\00000_00002.ppm
            # E:\DataSet\GTRSB\GTSRB_Final_Training_Images\GTSRB\Final_Training\Images\00000\00000_00003.ppm


            img = PIL.Image.open(sample_dir)
            box = (int(csv_data_list[3]),int(csv_data_list[4]),int(csv_data_list[5]),int(csv_data_list[6]))
            roi_img = img.crop(box)
            # 获取兴趣ROI区域

            new_dir = os.path.join(path, csv_data_list[0].split(".")[0] + ".jpg")
            # 截取到兴趣区域后,准备另存为的地址
            # print(new_dir),部分输出如下:
            # E:\DataSet\GTRSB\GTSRB_Final_Training_Images_roi_jpg\00000\00000_00000.jpg
            # E:\DataSet\GTRSB\GTSRB_Final_Training_Images_roi_jpg\00000\00000_00001.jpg
            # E:\DataSet\GTRSB\GTSRB_Final_Training_Images_roi_jpg\00000\00000_00002.jpg
            # E:\DataSet\GTRSB\GTSRB_Final_Training_Images_roi_jpg\00000\00000_00003.jpg

            roi_img.save(new_dir, 'JPEG')




def convert_test_data(file_dir):

    root_dir = 'E:\DataSet\GTRSB\GTSRB_Final_Test_Images_roi_jpg'

    for f in os.listdir(file_dir):
        if f.endswith(".csv"):
            csv_dir = os.path.join(file_dir, f)
    csv_data = pd.read_csv(csv_dir)
    csv_data_array = np.array(csv_data)

    for i in range(csv_data_array.shape[0]):
        csv_data_list = np.array(csv_data)[i, :].tolist()[0].split(";")
        sample_dir = os.path.join(file_dir, csv_data_list[0])
        img = PIL.Image.open(sample_dir)
        box = (int(csv_data_list[3]), int(csv_data_list[4]), int(csv_data_list[5]), int(csv_data_list[6]))
        roi_img = img.crop(box)
        new_dir = os.path.join(root_dir, csv_data_list[0].split(".")[0] + ".jpg")
        roi_img.save(new_dir, 'JPEG')



if __name__ == "__main__":
    train_data_dir = 'E:\\DataSet\\GTRSB\\GTSRB_Final_Training_Images\\GTSRB\\Final_Training\\Images'
    test_data_dir = 'E:\\DataSet\\GTRSB\\GTSRB_Final_Test_Images\\GTSRB\\Final_Test\\Images'
    convert_train_data(train_data_dir)
    convert_test_data(test_data_dir)


三、新的数据集

    转换完成以后,我们一步步打开另存后的路径,如下:


先进入训练集:



然后进入测试集看看:


这样就完成啦!so easy!

  • 18
    点赞
  • 147
    收藏
    觉得还不错? 一键收藏
  • 23
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值