# 机器学习课设
# 交通标志识别
## 交通标志识别的作用:
有几种不同类型的交通标志,如限速,禁止进入,交通信号灯,左转或右转,儿童交叉口,不通过重型车辆等。交通标志分类是识别交通标志所属类别的过程。
在本项目中,通过构建一个深度神经网络模型,可以将图像中存在的交通标志分类为不同的类别。通过该模型,我们能够读取和理解交通标志,这对所有自动驾驶汽车来说都是一项非常重要的任务。
## 交通标志数据集:
数据集包含超过50,000张不同交通标志的图像。它被进一步分为43个不同的类。数据集变化很大,一些类有许多图像,而一些类有很少的图像。数据集的大小约为 300 MB。数据集有一个训练文件夹,其中包含每个类中的图像和一个测试文件夹,我们将用于测试我们的模型。
## 构建此交通标志分类模型的方法分为四个步骤:
1. 浏览分析数据集
1. 构建 CNN 模型并训练
1. 验证模型
1. 使用测试数据集测试模型
### 步骤1:浏览分析数据集
“train”文件夹包含 43 个文件夹,每个文件夹代表不同的类别。文件夹的范围是从 0 到 42。迭代所有类,并在数据和标签列表中附加图像及其各自的标签。
所有图像及其标签存储到列表(数据和标签)中,再将列表转换为 numpy 数组,以便提供给模型使用,数据的形状为 (39209, 30, 30, 3),这意味着有 39,209 张大小为 30×30 像素的图像,最后的 3 表示数据包含彩色图像(RGB 值)。

```
folders = os.listdir(train_path)
train_number = [] # 训练集中该类别的数量
class_num = [] # 类别
for folder in folders:
if folder=='.ipynb_checkpoints':
continue
print(folder)
print(classes[int(folder)])
train_files = os.listdir(train_path + '/' + folder)
train_number.append(len(train_files))
class_num.append(classes[int(folder)])
# 根据每个类中的图像数量对数据集进行排序
zipped_lists = zip(train_number, class_num)
sorted_pairs = sorted(zipped_lists)
tuples = zip(*sorted_pairs)
train_number, class_num = [ list(tuple) for tuple in tuples]
# 绘制每个类中的图像数量
plt.figure(figsize=(21,10))
plt.bar(class_num, train_number)
plt.xticks(class_num, rotation='vertical')
plt.show()
# 测试数据的 25 张随机图像
import random
from matplotlib.image import imread
test = pd.read_csv(data_dir + '/Test.csv')
imgs = test["Path"].values
plt.figure(figsize=(25,25))
for i in range(1,26):
plt.subplot(5,5,i)
random_img_path = data_dir + '/' + random.choice(imgs)
rand_img = imread(random_img_path)
plt.imshow(rand_img)
plt.grid(b=None)
plt.xlabel(rand_img.shape[1], fontsize = 20)#图片宽度
plt.ylabel(rand_img.shape[0], fontsize = 20)#图片高度
# 训练数据:
image_data = []
image_labels = []
for i in range(NUM_CATEGORIES):
path = data_dir + '/Train/' + str(i)
if i == 43:
continue
images = os.listdir(path)
for img in images:
try:
image = cv2.imread(path + '/' + img)
image_fromarray = Image.fromarray(image, 'RGB')
resize_image = image_fromarray.resize((IMG_HEIGHT, IMG_WIDTH))
image_data.append(np.array(resize_image))
image_labels.append(i)
except:
print("Error in " + img)
# 将 list 更改为 numpy 数组
image_data = np.array(image_data)
image_labels = np.array(image_labels)
print(image_data.shape, image_labels.shape)
# 打乱数据集
shuffle_indexes = np.arange(image_data.shape[0])
np.random.shuffle(shuffle_indexes)
image_data = image_data[shuffle_indexes]
image_labels = image_labels[shuffle_indexes]
# 将数据拆分为训练集和验证集
X_train, X_val, y_train, y_val = train_test_split(image_data, image_labels, test_size=0.3, random_state=42, shuffle=True)
# 图形归一化
X_train = X_train/255
X_val = X_val/255
print("X_train.shape", X_train.shape)
print("X_valid.shape", X_val.shape)
print("y_train.shape", y_train.shape)
print("y_valid.shape", y_val.shape)
# 独热编码:
y_train = keras.utils.to_categorical(y_train, NUM_CATEGORIES)
y_val = keras.utils.to_categorical(y_val, NUM_CATEGORIES)
# 分为了43个独热编码:
print(y_train.shape)
print(y_val.shape)
```
使用 train_test_split() 方法来拆分训练和测试数据:
使用to_categorical方法将y_train和t_test中存在的标签转换为单热编码:

### 步骤2:构建 CNN 模型
把图像分类到各自的类别中,构建一个CNN模型(卷积神经网络)(多分类):
```
####################################################################
# 模型的训练:
model = keras.models.Sequential([
#卷积层VGG
#图像空间的2维卷积
# Conv2D层 滤波器=16 kernel_size=3*3 激活函数='relu' 输入input_shape
# Conv2D层 滤波器=32 kernel_size=3*3 激活函数='relu'
# 最大池化MaxPool2D层 pool_size=(2,2)
# BatchNormalization 归一化 每一层都要归一化
keras.layers.Conv2D(filters=16, kernel_size=(3,3), activation='relu', input_shape=(IMG_HEIGHT,IMG_WIDTH,channels)),
keras.layers.Conv2D(filters=32, kernel_size=(3,3), activation='relu'),
keras.layers.MaxPool2D(pool_size=(2, 2)),
keras.layers.BatchNormalization(axis=-1),
keras.layers.Conv2D(filters=64, kernel_size=(3,3), activation='relu'),
keras.layers.Conv2D(filters=128, kernel_size=(3,3), activation='relu'),
keras.layers.MaxPool2D(pool_size=(2, 2)),
keras.layers.BatchNormalization(axis=-1),
# 全连接层 512个节点 激活函数='relu'
# Flatten 多维数据的降维
# Dense 输出数组尺寸relu
# Dropout 随机丢弃 防止过拟合提高效果
keras.layers.Flatten(),
keras.layers.Dense(512, activation='relu'), # 全连接层
keras.layers.BatchNormalization(),
keras.layers.Dropout(rate=0.5),
#密集层43个节点,激活='softmax'
keras.layers.Dense(43, activation='softmax')
])
lr = 0.001
# 训练30次
epochs = 30
# Adam优化器编译模型,多分类损失用categorical_crossentropy --> 自适应优化
opt = Adam(lr=lr, decay=lr / (epochs * 0.5))
model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy'])
# 扩充数据并训练模型
# 批处理保存图片
aug = ImageDataGenerator(
rotation_range=10, # 整数,随机选择图片的角度
zoom_range=0.15, # 浮点数或形如[lower,upper]的列表,随机缩放的幅度,若为浮点数
width_shift_range=0.1, # 浮点数,图片宽度的某个比例,数据提升时图片随机水平偏移的幅度
height_shift_range=0.1,
shear_range=0.15,
horizontal_flip=False,
vertical_flip=False,
fill_mode="nearest")
model.summary() # 显示输出网络结构
history = model.fit(aug.flow(X_train, y_train, batch_size=32), epochs=epochs, validation_data=(X_val, y_val))
model.save('traffic_classifier.h5')
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d (Conv2D) (None, 28, 28, 16) 448
_________________________________________________________________
conv2d_1 (Conv2D) (None, 26, 26, 32) 4640
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 13, 13, 32) 0
_________________________________________________________________
batch_normalization (BatchNo (None, 13, 13, 32) 128
_________________________________________________________________
conv2d_

云哲-吉吉2021
- 粉丝: 4165
- 资源: 1128
最新资源
- 微控制器固件包_STM32CubeG0_1741142084.zip
- 《ARM9嵌入式系统设计基础教程》第13章图形用户接口(GUI).ppt
- 《机械设计基础》课后习题答案
- C#调用Ni板卡进行实现采集任务(模拟量输入输出)示例2
- 《实验一 Java开发环境&语法基础》
- 2016级河南大学计算机与信息工程学院创新实践计划-消防机器人.zip
- Java课程设计-学生成绩管理系统-Swing+MySQL.zip
- 《AE影视后期特效制作实例教程》8-3++空中气流写字字帖.ppt
- Unwrap Pro是一个3ds Max插件,可以在产生低失真,无重叠,加权密度的UVs的同时展开网格,而不像3ds Max Peel命令,它产生具有高面积失真的重叠UV,UnwrapPro是非常快的
- 大二下SQL实验学生信息系统.zip
- macd指标算法 php语言编写 大智慧/同花顺 数据一致
- 2025修复版绿色全自适应php核心制作的邮编查询网整站源码带百万数据+定时触发更新
- 人工智能&深度学习:PyTorch 图像识别实战 - 卷积神经网络与模块应用资源(源码+数据集+说明资料)
- 《Java语言编程基础立体化实用教程》2-6+成绩增加和成绩修改窗体的实现.ppt
- ITECH艾德克斯交直流程控源使用手册
- 实时操作系统_FreeRTOS_内核组件_通用与特定_1741145229.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈


