无人驾驶:Term-1-p2-traffic-sign-classifier

2023-05-16

简介

  Term-1第二节课是进行交通标志分类,数据集主要来自于German Traffic Sign,包含了42种交通标志,通过深度学习网络进行分类。

环境准备

  • python 2.7
  • numpy
  • scikit-learn
  • tensorflow
  • keras

处理流程

  处理流程如下图所示

数据读取

  我们拿到的数据集是一系列交通标志图像,每个类别的交通标志放在了同一个文件夹下,并且有一个csv文件用于描述每个交通标志图片的ROI区域和该标志所属类别。下载图像的时候网站提供了一份用于数据处理的python程序(Python code for GTSRB文件夹下),在这里可以用到。
  这里按csv描述的图像信息进行ROI部分的提取,并使用pickle保存为.p文件方便后续模型训练使用。代码示例如下:

import numpy as np
import pickle
import os
import cv2
import csv

//处理训练数据
def process_train_data(path):
    file = os.listdir(path)
    classes = len(file)
    train_data = []
    train_labels = []
    for i in range(0,classes):
        dir_name = file[i]
        if dir_name=='.DS_Store':
            continue
        full_dir_path = path + dir_name
        csv_file_path = full_dir_path + '/' + 'GT-{0}.csv'.format(dir_name)
        with open(csv_file_path) as f:
            csv_reader = csv.reader(f,delimiter=';')
            # pass header
            csv_reader.next()
            for (filename,width,height,x1,y1,x2,y2,classid) in csv_reader:
                train_labels.append(classid)
                image_file_path = full_dir_path+'/'+filename
                resized_image = resize_image(image_file_path,(x1,y1,x2,y2))
                train_data.append(resized_image)
            f.close()
    print 'train data process done'
    return train_data,train_labels

//提取roi区域,并调整大小,统一为32*32像素
def resize_image(path,index):
    image = cv2.imread(path)
    image = image[int(index[0]):int(index[2]),int(index[1]):int(index[3])]
    res = cv2.resize(image,(32,32),interpolation = cv2.INTER_CUBIC)
    return res 

//处理测试数据
def process_test_data(path):
    test_data = []
    test_labels = []
    csv_file_path = path + '/' + 'GT-final_test.csv'
    with open(csv_file_path) as f:
        csv_reader = csv.reader(f,delimiter=';')
        csv_reader.next()
        for (filename,width,height,x1,y1,x2,y2,classid) in csv_reader:
            test_labels.append(classid)
            image_file_path = path+'/'+filename
            resized_image = resize_image(image_file_path,(x1,y1,x2,y2))
            test_data.append(resized_image)
    print 'test data process done'
    return test_data,test_labels

def main():
    train_data_path = '../data/GTSRB/Final_Training/Images/'
    test_data_path = '../data/GTSRB2/Final_Test/Images'
    train_data,train_labels = process_train_data(train_data_path)
    test_data,test_labels = process_test_data(test_data_path)
    with open('./train.p','wb') as f:
        pickle.dump({"data":np.array(train_data),"labels":np.array(train_labels)},f)
    with open('./test.p','wb') as f:
        pickle.dump({"data":np.array(test_data),"labels":np.array(test_labels)},f)

if __name__=="__main__":
    main()

  放几张效果图

数据处理

  目前已经得到了训练集和测试集,需要对数据进行shuffle以及对label进行one-hot编码。

def shuffle_data(X_train,Y_train,X_test,Y_test):
    X_train,Y_train = shuffle(X_train,Y_train,random_state = 0)
    X_test,Y_test = shuffle(X_test,Y_test,random_state=0)
    return X_train,Y_train,X_test,Y_test

def encode_label(Y_train,Y_test):
    Y_train_encoded = to_categorical(Y_train,num_classes = 43)
    Y_test_encode = to_categorical(Y_test,num_classes = 43)
    return Y_train_encoded,Y_test_encode

模型构建

  下面使用keras构建卷积神经网络,keras的使用方法具体参见Keras中文文档。

  模型构建部分代码示例如下:

def build_model():
    //使用sequential模型
    model = Sequential()
    //创建卷积层,输入为32*32*3的图像数据,卷积核大小为3*3
    model.add(Conv2D(32,(3,3),input_shape = (32,32,3),activation = 'relu'))
    //添加最大池化层
    model.add(MaxPooling2D(pool_size=(2,2)))
    //dropout修正过拟合
    model.add(Dropout(0.5))
    //将输出展平
    model.add(Flatten())
    //普通全连接层
    model.add(Dense(512,activation='relu'))
    model.add(Dropout(0.2))
    model.add(Dense(128,activation='relu'))
    model.add(Dropout(0.2))
    model.add(Dense(43,activation='softmax'))
    //定义损失函数,优化器、评估标准
model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])
    return model

模型训练

  模型定义完成后开始进行模型训练

//指定训练集、测试机,迭代次数等
model.fit(X_train,Y_train,validation_data=(x_dev,y_dev),epochs=40,batch_size=200,verbose =1)

效果评估

  经过40轮迭代,模型准确率基本能达到99%左右,为了验证模型效果,特意挑选了10张图像进行比对。
  最终结果如下图所示


效果评估

  其中第6张图类别应该是“Priority road”,其他分类全部正确。

总结

  这节课主要是使用深度学习模型进行图像分类,在没有进行深入调优的情况下,在测试集上获得了90%的正确率,如果想进一步提高分类准确率可以采用效果更好的模型进行轮数更多的训练。这部分的代码详见Term-1-p2-traffic-sign-classifier。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无人驾驶:Term-1-p2-traffic-sign-classifier 的相关文章

随机推荐

  • 浅谈Android指纹识别技术

    浅谈Android指纹识别技术 当今时代 xff0c 随着移动智能手机的普及 xff0c 指纹解锁早已是手机不可或缺的一个功能 除了现在比较新款的iPhone或者部分手机采用了Face ID之外 xff0c 人们几乎天天都会用到指纹解锁技术
  • 安装ubuntu分区建议

    前言 xff1a 备份用 xff0c 非原创 Step1 xff1a Start the installation Proceed to Step 4 and choose Something else Step2 xff1a Create
  • 为贝尔吉比特电信G-120W-B光猫添加自动重启功能

    定时重启光猫 xff0c 有利于清除光猫进行中产生的垃圾提升光猫的运行速度 xff0c 还能防止遭受黑客的GPT攻击 xff08 家用光猫重启后会重新分配IP地址 xff09 xff0c 既然有这么多好处 xff0c 快来把我们的光猫设置为
  • 使用yolo-v5训练测试自己的数据

    使用环境 xff1a python3 6 8 CUDA10 0 Centos7 5 目录 一 前言 1 1下载yolov5代码 1 2安装yolov5运行时需要的包 1 3下载预训练模型和测试 二 制作自己的训练数据集 2 1使用Label
  • ImportError: libSM.so.6: cannot open shared object file: No such file or directory一系列错误解决方式

    Centos7系统出现 xff1a ImportError libSM so 6 cannot open shared object file No such file or directory的解决方式 xff1a 错误1 xff1a 解
  • Centos7开放和关闭某个端口

    1 开放端口 firewall cmd zone 61 public add port 61 8688 tcp permanent 开放8688端口 firewall cmd reload 使配置立刻生效 2 关闭端口 firewall c
  • 解决error C2059: 语法错误:“::”问题

    错误代码提示 xff1a 1 gt f opencv opencv build include opencv2 flann lsh table h 266 error C2059 语法错误 f opencv opencv build inc
  • C++ string字符串的UTF-8与GBK(GB2312)编码相互转换转换

    UTF8 GBK Tools hpp内容如下 xff1a pragma once include lt iostream gt include lt string gt include lt fstream gt include lt wi
  • Ubuntu卸载protobuf并安装3.6.0版本的protobuf

    1 卸载Ubuntu自带的protobuf xff1b sudo apt get remove libprotobuf dev which protoc 运行完 which protoc 会显示一个protoc的路径 xff0c 如果没有显
  • python 图片上添加中文文字

    1 在 C Windows Fonts Microsoft YaHei UI 目录下搜索找到 msyh ttc xff0c 复制到工程目录 2 编写代码 xff1a from PIL import Image from PIL import
  • 移除数组中某个数

    移除数组中某个数 span class token macro property span class token directive keyword include span span class token string lt stdi
  • Ubuntu系统修改用户名,主机名

    0 Ubuntu是一个Linux操作系统 xff0c 修改密码和用户名是有危险的动作 xff0c 请谨慎修改 提示 xff1a 如果你要修改密码和用户名的话 xff0c 请先修改密码 xff0c 重启后 xff0c 再修改用户名 xff0c
  • Ubuntu 多用户管理及 SSH 远程连接

    目录 1 Ubuntu 多用户管理的场景 2 多用户管理理解 3 多用户管理 1 创建用户组 2 创建用户 3 给用户分配权限 4 SSH远程连接 1 Ubuntu 多用户管理的场景 多人需要远程登录服务器完成各自的任务 xff0c 同时各
  • 如何使用Typora快速高效的写Csdn博客

    最近终于有时间写点东西了 xff0c 准备写一些技术博客 xff0c 一是为了记录自己学习工作中的一些心得 xff0c 二是多年来自己的知识几乎都是从别的大牛那里白嫖来的 xff0c 现在有时间了也想把自己的一些感想贡献给爱好学习的年经人
  • keil5工程重命名

    有一个简单的办法 假设原来的工程文件名是first xff0c 在工程文件目录中 xff0c 你可以看到很多主文件名为first的文件 xff0c 其中有两个文件分别叫做 first uvopt和first uvproj 你只要把这两个文件
  • 由ModuleNotFoundError: No module named ‘_ssl‘引发的一场血案

    本人需要在服务器上 xff08 用户 xff09 安装cutadapt软件 xff0c 安装该软件需要用到下面这个命令 xff0c 非常明显使用python软件 xff0c 通过pip插件线上安装cutadapt软件 xff0c 于是开始了
  • HISAT2 - StringTie - DESeq2 pipeline 进行bulk RNA-seq

    软件官网 xff1a Hisat2 xff1a Manual HISAT2 StringTie xff1a StringTie 文章 xff1a Transcript level expression analysis of RNA seq
  • 命令提示符CMD美化

    命令提示符美化运行cmd会出现命令提示符 xff0c 黑底白字 xff0c 看似乎很别扭 xff0c 如果该成欢迎朋友的信息该多好呀 xff01 xff01 首先 xff0c 需要写一个批处理 注意以下括号里为解释的内容 xff0c 不要编
  • WSL-Ubuntu使用xfce4桌面环境

    安装WSL Ubuntu xff0c 参考我的另外一篇手工在非系统盘安装WSL xff08 Ubuntu xff09 安装软件MobaXterm运行MobaXterm xff0c 创建一个新的Session xff1a 安装桌面环境 xff
  • 无人驾驶:Term-1-p2-traffic-sign-classifier

    简介 Term 1第二节课是进行交通标志分类 xff0c 数据集主要来自于German Traffic Sign xff0c 包含了42种交通标志 xff0c 通过深度学习网络进行分类 环境准备 python 2 7numpyscikit