(5-3)交通信号识别:基于深度学习的交通信号分类任务(1)

5.3  基于深度学习的交通信号分类任务

基于深度学习的交通信号分类任务,使用预处理后的交通信号图像数据集进行模型训练。项目首先对数据进行了预处理和增强,然后利用卷积神经网络(CNN)模型进行训练,采用 ResNet50 网络结构进行特征提取,并添加全连接层进行分类。最后,通过混淆矩阵和准确率等指标评估模型性能,实现了对交通信号的准确分类。

实例5-8基于深度学习的交通信号分类任务codes/5/traffic-signal-cnn.ipynb

5.3.1  数据集介绍

本项目使用的数据集是名为 "Traffic Signs Preprocessed" ,这是一个专门用于交通标志检测的数据集,其中包含了图像数据和相应的边界框标注。该数据集采用了YOLO格式,这是一种用于目标检测的通用格式。每张图像都附带有一个文本文件,其中包含了图像中每个交通标志目标的边界框注释。这些文本文件以TXT格式存储,与每张图像位于同一目录下。数据集中还提供了一个封面图像,用于展示数据集的内容和特征。

对于交通信号检测任务,这个数据集具有很高的实用性。交通信号在交通管理和交通安全中起着至关重要的作用,而自动化的交通信号检测系统可以帮助实现智能交通管理和智能驾驶等应用。通过使用这个数据集,研究人员和开发者可以构建和训练高效的交通信号检测模型,这些模型可以在实时场景中准确地检测交通信号并进行相应的识别和处理。因此,这个数据集对于促进交通领域的智能化发展具有重要意义。

此外,由于该数据集提供了图像和边界框标注的完整信息,因此可以用于训练各种深度学习模型,如卷积神经网络(CNN)、单阶段目标检测器(如YOLO)和两阶段目标检测器(如Faster R-CNN)。这使得研究人员和开发者能够选择最适合其需求的模型架构,并通过大规模的实验评估来优化模型性能。因此,这个数据集不仅对于交通信号检测领域的研究和开发具有重要意义,还可以作为目标检测任务的基准数据集,用于评估和比较不同模型的性能。

5.3.2  数据预处理

在深度学习中,数据预处理是一个关键步骤,包括加载数据、准备数据、进行数据增强等操作,以便将数据转换为适合模型输入的格式,并提高模型的性能和鲁棒性。

(1)下面代码用于遍历指定目录(/kaggle/input)下的文件,并打印出每个文件的完整路径。如果想要查看项目中使用的数据集的文件路径,可以将这段代码放入 Jupyter Notebook 中的一个单元格中,并执行它。这将列出该目录下的所有文件及其路径,使您能够进一步研究源代码中使用的数据集文件。

import os
for dirname, _, filenames in os.walk('/kaggle/input'):
    for filename in filenames:
        print(os.path.join(dirname, filename))

(2)加载名为 data8.pickle 的预处理数据文件,并打印输出训练集、测试集和验证集的形状信息。这些形状信息告诉我们每个数据集中样本的数量以及每个样本的维度。

data = pd.read_pickle("../input/traffic-signs-preprocessed/data8.pickle")

print("x train shape:", data["x_train"].shape)
print("y train shape:", data["y_train"].shape)
print("x test shape:", data["x_test"].shape)
print("y test shape:", data["y_test"].shape)
print("x validation shape:", data["x_validation"].shape)
print("y validation shape:", data["y_validation"].shape)

执行后会输出:

x train shape: (86989, 1, 32, 32)
y train shape: (86989,)
x test shape: (12630, 1, 32, 32)
y test shape: (12630,)
x validation shape: (4410, 1, 32, 32)
y validation shape: (4410,)

上述输出信息对于了解数据集的规模和结构非常有用,可以帮助我们确定构建和训练模型时所需的输入和输出维度。

(3)对训练集的图像数据进行了维度转换,将通道维度移到了最后一个维度,以符合一般的图像数据格式。

x_train = data["x_train"]
x_test = data["x_test"]
x_val = data["x_validation"]
y_train = data["y_train"]
y_val = data["y_validation"]

x_train = x_train.swapaxes(1,2)
x_train = x_train.swapaxes(2,3)
x_train.shape

在上述代码中,使用 swapaxes 函数将第二个维度(高度)和第三个维度(宽度)进行交换,以将通道维度移到了最后一个维度。然后再次使用 swapaxes 函数将原来的第二个维度(现在是通道维度)与原来的第三个维度(现在是高度)进行交换,以将通道维度置于最后一个位置。这样的操作将图像数据的维度从 (batch_size, channels, height, width) 转换为 (batch_size, height, width, channels),以便与许多深度学习框架中的默认图像数据格式相匹配。最后,打印输出了转换后的

训练集图像数据的形状,以确保转换正确执行。

(86989, 32, 32, 1)

(4)下面代码将验证集的图像数据维度进行了转换,将图像数据的维度从 (batch_size, channels, height, width) 转换为 (batch_size, height, width, channels),以使其符合深度学习框架中的默认图像数据格式。

x_val = x_val.swapaxes(1,2)
x_val = x_val.swapaxes(2,3)
print("x val shape:", x_val.shape)

在上述代码中,对验证集图像数据进行了维度转换,将通道维度移到了最后一个维度,以适应一般的图像数据格式。最后,打印了转换后的验证集图像数据的形状信息。执行后会输出:

x val shape: (4410, 32, 32, 1)

(5)创建一个大小为 10x10 英寸的图像,并在其中绘制了 16 个子图,每个子图显示了训练集中的一个图像样本。

plt.figure(figsize=(10,10)) 

for i in range(16):
    plt.subplot(4,4,i+1)   
    plt.imshow(x_train[i], cmap = "gray")
    plt.axis("off")

plt.show()

执行后会可视化训练集中的前 16 个图像样本,以便了解数据的内容和特征。如图5-8所示。

图5-8   训练集中前 16 个图像样本的可视化

(6)将训练集中第3个样本的图像以灰度图像的形式显示出来。首先使用 plt.imshow(x_train[2][:,:,0], cmap='gray') 显示训练集中第三个样本的灰度图像。x_train[2] 表示访问第三个样本的图像数据,[:,:,0] 表示只选择图像数据的第一个通道(灰度图像只有一个通道),并使用灰度色彩映射。然后,使用 plt.show() 显示图像。

plt.imshow(x_train[2][:,:,0],cmap='gray')
plt.show()

执行效果如图5-8所示。

图5-8  第3个样本的图像

(7)下面代码用于将训练集中第19个样本的图像以灰度图像的形式显示出来。

plt.imshow(x_train[18][:,:,0],cmap='gray')
plt.show()

执行效果如图5-8所示。

图5-8  第19个样本的图像

(8)下面这段代码定义了一个名为 resize 的函数,用于将输入图像数据调整为指定大小。然后,调用resize 函数来调整训练集和验证集的图像数据大小,并打印了调整大小后的图像数据数组的形状信息。

def resize(img):
    numberofImage = img.shape[0]
    new_array = np.zeros((numberofImage,64,64,1))
    for i in range(numberofImage):
        new_array[i] = tf.image.resize(img[i],(64,64))
    return new_array

x_train = resize(x_train)
x_val = resize(x_val)
print("x train resized shape:", x_train.shape)
print("x validation resized shape:", x_val.shape)

执行后会输出:

x train resized shape: (86989, 64, 64, 1)
x validation resized shape: (4410, 64, 64, 1)

(9)使用 to_categorical 函数将训练集和验证集的标签进行了独热编码,以便用于多类分类任务。

NumberofClass = 43
y_train = to_categorical(y_train, num_classes = NumberofClass)
y_val = to_categorical(y_val, num_classes = NumberofClass)

独热编码将原始的整数类别标签转换为二进制向量,其中对应类别的位置为 1,其他位置为 0。这样做的目的是为了方便神经网络模型进行多类分类任务的训练和预测。

(10)下面这段代码创建了一个图像数据生成器 datagen,用于对训练集中的图像进行数据增强。数据增强的操作包括随机旋转、缩放、水平和垂直平移等,以增加训练数据的多样性,提高模型的泛化能力。

# 数据增强
datagen = ImageDataGenerator(
        featurewise_center=False,  # 将数据集均值设为0
        samplewise_center=False,  # 将每个样本均值设为0
        featurewise_std_normalization=False,  # 将输入数据除以数据集的标准差
        samplewise_std_normalization=False,  # 将每个输入数据除以其标准差
        zca_whitening=False,  # ZCA白化
        rotation_range=5,  # 在5度范围内随机旋转图像
        zoom_range = 0.1, # 随机缩放图像10%
        width_shift_range=0.1,  # 随机水平平移图像10%
        height_shift_range=0.1,  # 随机垂直平移图像10%
        horizontal_flip=False,  # 随机水平翻转图像
        vertical_flip=False)  # 随机垂直翻转图像

datagen.fit(x_train)

  • 36
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农三叔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值