交通标志识别

时间:2022-05-22点击次数:2128信息来源:

接下来,我们将使用深度神经网络对交通信号标志进行分类。我们的网络将识别停止标志、交通标志、各种交通标志和非交通标志。

LeNet 网络是实现交通信号灯分类的好网络。但在此之前,让我们来看看 LeNet 网络回顾。

上图显示了1998年杨乐昆在期刊上发表的 LeNet 结构的原始绘图。网络输入为 3232 图像,然后通过卷积层C1,子采样层S2。虽然 LeNet 较初是这样设计的,但现在大多数子采样层已经被称为合并层。接下来是另一个卷积层序列C3,然后是合并层。最后,有三个全连接层,包括较终输出层,即 LeNet 系统结构。

如下是用 Tensorflow 对 LeNet 的实现。

# 从 Tensorflow 中导入 MINST 数据集from tensorflow.examples.tutorials.mnist import input_datamnist = input_data.read_data_sets("MNIST_data/",reshape=False)# 分别存储训练集、验证集和集X_train,y_train = mnist.train.i ges,mnist.train.labelsX_validation,y_validation = mnist.validation.i ges,mnist.validation.labelsX_test,y_test = mnist.test.i ges,mnist.test.labels# 对每个 验证 图像数量与标签数量的一致性assert(len(X_train) == len(y_train))assert(len(X_validation) == len(y_validation))assert(len(X_test) == len(y_test))# 打印图像形状,让我们知道数据的维度。print()print("I ge Shape: {}".for t(X_train[0].shape))print()# 打印每个数据集的大小# 我们的训练集有 5000个图像,验证集有 5000个图像,集有 1万个图像。print("Training Set: {}samples".for t(len(X_train)))print("Validation Set: {} samples".for t(len(X_validation)))print("Test Set: {}samples".for t(len(X_test)))# 将 2828 的 MINST 图像转化为 3232 的 LeNet 图像格式。我们本可以通过图像处理软件来扩展每个图像,但在这里,我们只填充图像多余的边缘为零。这样做很快,效果也很好。# 当我们完成时,图像的大小是 32321,这正是 LeNet 图像输入格式。import numpy as np# Pad i ges with 0sX_train = np.pad(X_train,(0,0),(2,2),(2,2),(0,0),'constant')X_validation = np.pad(X_validation,(0,0),(2,2),(2,2),(0,0),'constant')X_test = np.pad(X_test,(0,0),(2,2),(2,2),(0,0),'constant')# 输出图像扩展后的尺寸print("Updated I ge Shape: {}".for t(X_train[0].shape))# 可视化数据,确保一切看起来都像我们想象的那样,总是个好主意。import randomimport numpy as npimport tplotlib.pyplot as plt% tplotlib inline# 从训练中选择随机图像,使用 tplot 来画吧。index = random.randint(0,len(X_train))i ge = X_train[index].squeeze()plt.figure(figsize=(1,1))plt.imshow(i ge,c p="gray")# 打印图像标签print(y_train[index])

显示效果如下:

显示内容与相应的标签相匹配。


敲黑板,划重点。

我们将重写上述代码并使用 LeNet 网络识别交通标志。

首先,我们需要消除 MINST 导入数据集,加载我们的交通灯数据集 Ger n Traffic Sign Dataset 。在这里,我们已经实现了将训练集切割成训练集和验证集。如果使用不切割的数据集,可以使用 sklearn 中的 train_test_split 函数切分训练集,一般我们会选择分配 20% 的训练集作为验证集。

# Load pickled dataimport pickle# TODO: Fill this in based on where you saved the training and testing datatraining_file = "./traffic-signs-data/train.p"validation_file= "./traffic-signs-data/valid.p"testing_file = "./traffic-signs-data/test.p"with open(training_file,mode='rb') as f: train = pickle.load(f)with open(validation_file,mode='rb') as f: valid = pickle.load(f)with open(testing_file,mode='rb') as f: test = pickle.load(f) X_train,y_train = train['features'],train['labels']X_valid,y_valid = valid['features'],valid['labels']X_test,y_test = test['features'],test['labels']print("X_train shape:",X_train.shape)print("y_train shape:",y_train.shape)print("X_valid shape:",X_valid.shape)print("y_valid shape:",y_valid.shape)print("X_test shape:",X_test.shape)print("y_test shape:",y_test.shape)

训练集、验证集和集的大小如下:

X_train shape: y_train shape: (34799,)X_valid shape: (4410,32,32,33)y_valid shape: (4410,)X_test shape: y_test shape: (12630,)

现在你可以从数据集中可视化图像,但请记住,交通标志图像的颜色不像 MINST 图像也是灰色图像。因此,输入深度应设置为3,与输入图像相匹配的 RGB 三个颜色通道。而且交通标志输出层的数量应该是 43 ,而不是 MINST 中的 10 类。因此需要更新 Tensorflow 占位符的输入和输出形状匹配新的数据集。


对于使用 LeNet 网络实现交通灯分类的具体代码,大家可以查阅我的实现:CarND-Traffic-Sign-Classifier-Project- ster。我已经在实现代码中写了详细的注释,因为文件太长,我不会在这里重复粘贴。



http://www.bhjtss.com

产品**