基于VGG-16+Android+Python的智能车辆驾驶行为分析—深度学习算法应用(含全部工程源码)+数据集+模型(二)

news2024/11/13 7:56:40

目录

  • 前言
  • 总体设计
    • 系统整体结构图
    • 系统流程图
  • 运行环境
  • 模块实现
    • 1. 数据预处理
      • 1)数据集来源
      • 2)数据集内容
      • 3)数据集预处理
    • 2. 模型构建
      • 1)定义模型结构
      • 2)优化损失函数
  • 相关其它博客
  • 工程源代码下载
  • 其它资料下载


在这里插入图片描述

前言

本项目采用VGG-16网络模型,使用Kaggle开源数据集,旨在提取图片中的用户特征,最终在移动端实现对不良驾驶行为的识别功能。

首先,通过使用VGG-16网络模型,本项目能够深入学习和理解驾驶场景图像中的特征。VGG-16是一种深度卷积神经网络,特别适用于图像识别任务,通过多层次的卷积和池化层,能够有效地提取图像中的抽象特征。

其次,项目利用Kaggle提供的开源数据集,包括各种驾驶场景图像,覆盖了不同的驾驶行为和条件。这样的数据集是训练模型所需的关键资源。

接下来,利用训练好的VGG-16模型,项目提取图像中的用户特征。包括驾驶行为的姿势、眼神、手部动作等方面的特征,有助于判断是否存在不良驾驶行为。

最后,通过在移动端实现这个模型,可以将不良驾驶行为的识别功能直接部署到车辆或驾驶辅助系统中。这种实时的、移动端的识别方案有望在驾驶安全和监管方面发挥积极的作用。

总的来说,项目结合了深度学习、图像处理和移动端技术,致力于实现对不良驾驶行为的智能化识别,为提升驾驶安全提供了一种创新的解决方案。

总体设计

本部分包括系统整体结构图和系统流程图。

系统整体结构图

系统整体结构如图所示。

在这里插入图片描述

系统流程图

系统流程如图所示。

在这里插入图片描述
VGG-16网络架构如图所示。

在这里插入图片描述

运行环境

本部分包括Python环境、TensorFlow环境、Pycharm环境和Android环境。

详见博客。

模块实现

本项目包括4个模块:数据预处理、模型构建、模型训练及保存、模型生成。下面分别给出各模块的功能介绍及相关代码。

1. 数据预处理

本部分包括数据集来源、内容和预处理。

1)数据集来源

使用开源数据集state-farm-distracted-driver-detection,下载地为:https://www.kaggle.com/c/state-farm-distradcted-driver-detection/data,直接在网页上单击Download按钮下载。也可以调用API下载,下载地址为:kaggle/competitions/download-c/state-farm-distracted-driver-detection。数据集包括22424张训练集图片,若干测试集图片,总计10万+。由于是竞赛数据集,测试集的图片没有标签,故不使用。

2)数据集内容

数据集共包括10个驾驶状态:安全驾驶、右手使用手机、右手打电话、左手使用手机、左手打电话、调广播、喝水、向后拿东西、整理头发或化妆、与乘客交流。除安全驾驶外都是危险状态,如图所示。

在这里插入图片描述

3)数据集预处理

数据集中每张图片大小都是640×480像素,从同一角度拍摄的车载监控图片,数据集十分规范,无噪声,不需要进行过多的预处理,在训练前通过图像增广进行预处理里产生相似但又不同的训练样本。随机改变训练样本可以降低模型对某些属性的依赖,提高模型的泛化能力。

train_datagen = ImageDataGenerator(rescale=1.0/255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True)
#采用图像缩放、随机水平翻转、随机剪切、随机缩放进行图像增广

2. 模型构建

数据加载进模型之后,需要定义模型结构,并优化损失函数。

1)定义模型结构

使用VGG-16网络结构,共13个卷积层、3个全连接层和5个池化层,使用Keras库搭建模型,构建Sequential顺序模型,它由多个网络层线性堆叠而成。

model = Sequential() 
#快速开始序贯模型Sequential,通过ADD的方法将layer逐个加入模型中
model.add(ZeroPadding2D((1, 1), input_shape=(150, 150, 3)))
#图像上下左右都补0,输入图像
model.add(Convolution2D(64, 3, 3, activation='relu'))
#使用64个3*3的卷积核,激活Relu函数
model.add(ZeroPadding2D((1, 1)))
model.add(Convolution2D(64, 3, 3, activation='relu'))
model.add(MaxPooling2D((2, 2), strides=(2, 2)))
#最大值池化窗口2*2,步长两个方向都是2
model.add(ZeroPadding2D((1, 1)))
model.add(Convolution2D(128, 3, 3, activation='relu'))
model.add(ZeroPadding2D((1, 1)))
model.add(Convolution2D(128, 3, 3, activation='relu'))
model.add(MaxPooling2D((2, 2), strides=(2, 2)))
model.add(ZeroPadding2D((1, 1)))
model.add(Convolution2D(256, 3, 3, activation='relu'))
model.add(ZeroPadding2D((1, 1)))
model.add(Convolution2D(256, 3, 3, activation='relu'))
model.add(ZeroPadding2D((1, 1)))
model.add(Convolution2D(256, 3, 3, activation='relu'))
model.add(MaxPooling2D((2, 2), strides=(2, 2)))
model.add(ZeroPadding2D((1, 1)))
model.add(Convolution2D(512, 3, 3, activation='relu'))
model.add(ZeroPadding2D((1, 1)))
model.add(Convolution2D(512, 3, 3, activation='relu'))
model.add(ZeroPadding2D((1, 1)))
model.add(Convolution2D(512, 3, 3, activation='relu'))
model.add(MaxPooling2D((2, 2), strides=(2, 2)))
model.add(ZeroPadding2D((1, 1)))
model.add(Convolution2D(512, 3, 3, activation='relu'))
model.add(ZeroPadding2D((1, 1)))
model.add(Convolution2D(512, 3, 3, activation='relu'))
model.add(ZeroPadding2D((1, 1)))
model.add(Convolution2D(512, 3, 3, activation='relu'))
model.add(MaxPooling2D((2, 2), strides=(2, 2)))
#卷积层以及池化层搭建完毕
model.load_weights('vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5')
#加载上述模型中预训练的权重参数,不含top model
top_model = Sequential()
#构建多层感知机MLP作为top model
top_model.add(Flatten(input_shape=model.output_shape[1:]))
#flatten用于将多维数据变成一维,卷积层到全连接层的过渡
top_model.add(Dense(256, activation='relu'))
#加入全连接层,输出维度256个神经元,激活函数为Relu函数
top_model.add(Dropout(0.5))
#加入dropout层防止训练过拟合,控制需要断开的神经元比例为0.5
top_model.add(Dense(256, activation='relu'))
top_model.add(Dropout(0.5))
top_model.add(Dense(10, activation='softmax'))
#输出层,softmax分类,共10类
model.add(top_model)
#将top_model加入之前的模型中
for layer in model.layers[:25]:
    layer.trainable = False
#将卷积神经网络权重参数设置为不可改变,减少训练量
#VGG16模型搭建完毕

2)优化损失函数

优化损失函数相关代码如下:

model.compile(loss='categorical_crossentropy', optimizer='adadelta', metrics=['accuracy'])
#因为是多分类问题,标签为one-hot编码,损失函数设置为类别交叉熵,指标列表metrics设置为accuracy,使用adadelta优化器,加快收敛速度,防止局部最优解

相关其它博客

基于VGG-16+Android+Python的智能车辆驾驶行为分析—深度学习算法应用(含全部工程源码)+数据集+模型(一)

基于VGG-16+Android+Python的智能车辆驾驶行为分析—深度学习算法应用(含全部工程源码)+数据集+模型(三)

基于VGG-16+Android+Python的智能车辆驾驶行为分析—深度学习算法应用(含全部工程源码)+数据集+模型(四)

工程源代码下载

详见本人博客资源下载页


其它资料下载

如果大家想继续了解人工智能相关学习路线和知识体系,欢迎大家翻阅我的另外一篇博客《重磅 | 完备的人工智能AI 学习——基础知识学习路线,所有资料免关注免套路直接网盘下载》
这篇博客参考了Github知名开源平台,AI技术平台以及相关领域专家:Datawhale,ApacheCN,AI有道和黄海广博士等约有近100G相关资料,希望能帮助到所有小伙伴们。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1304953.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

flex布局一行n个

上图 缩小后 主要用了 flex-basis flex-grow flex-shrink flex的三个属性 有兴趣的可以看看 深入理解CSS之flex精要之 flex-basis flex-grow flex-shrink 实战讲解 .bg{background-color: aquamarine;width: 100%;height: 100%;display: flex;flex-wrap: wrap;}.box1{backgr…

Python Thefuck库详解:让错误命令变得“友好”

更多资料获取 📚 个人网站:ipengtao.com Python中有许多强大的库,其中Thefuck库独具特色,它的作用是纠正用户在终端输入的错误命令,让操作变得更加友好和高效。在本篇博客文章中,我们将深入探讨Thefuck库的…

d2l绘图不显示的问题

之前试了各种方法都不行 在pycharm中还是不行,但是在anaconda中的命令行是可以的 anaconda prompt conda activaye py39 #进入f盘 F: #运行文件 python F:\python_code\softmax.py

vue-print-nb ,element-ui => table打印不全不说原理直接上代码

你的边框的颜色能深就深点&#xff0c;有的时候打印不出来 如果你出现这种情况请复制以下代码&#xff1a; <style media"print" scoped> page {size: auto;/* auto is the initial value *//* margin: 3mm; */margin-bottom: 0mm;/* this affects the margin…

小白必看!海外静态ip和动态ip解析!

在如今的时代&#xff0c;互联网已经成为我们生活中必不可少的一部分。无论是工作、学习还是娱乐&#xff0c;我们都得要一个稳定快速的网络连接。而在某些特殊情况下&#xff0c;海外静态ip和动态IP就变得非常重要。这篇文章就来解析这两种IP的类型&#xff0c;帮助新手们更好…

CGAN笔记总结第二弹~

CGAN原理与源码分析 一、复习GAN1.1损失函数1.2判别器源码1.3 生成器源码 二、什么是CGAN&#xff1f;2.1 CGAN原理图2.2条件GAN的损失函数2.3 生成器源码2.4 判别器源码2.5 训练过程1&#xff09;这里的训练顺序2&#xff09;为什么先训练判别器后训练生成器呢&#xff1f; 2.…

Dijkstra求最短路 II(堆优化Dijkstra算法)

给定一个 n 个点 m 条边的有向图&#xff0c;图中可能存在重边和自环&#xff0c;所有边权均为非负值。 请你求出 11 号点到 n 号点的最短距离&#xff0c;如果无法从 11 号点走到 n 号点&#xff0c;则输出 −1−1。 输入格式 第一行包含整数 n 和 m。 接下来 m 行每行包含…

Vue指令之v-else与v-else-if

在上一篇博客中介绍了v-if&#xff0c;而在各式各样的程序语句中 if 和 else 通常是伴生的&#xff0c;在Vue中也不例外&#xff0c;Vue同样提供了v-else和v-else-if指令&#xff0c;其功能就是补充v-if的逻辑判断。 例如&#xff0c;当我们要根据一个分数输出对应的等级&…

路由器的转换原理--ENSP实验

目录 一、路由器的工作原理 二、路由表的形成 1、直连路由 2、非直连路由 2.1静态路由 2.2动态路由 三、静态路由和默认路由 1、静态路由 1.1静态路由的缺点 1.2路由的配置--结合ensp实验 2、默认路由--特殊的静态路由 2.1概念 2.2格式 2.3默认路由的配置--ens…

3GPP标准查看、下载和几个UE相关系列标准

由于一直做终端侧协议。最近以UE为核心重新下载了一系列文档。 总结并举例一下分类标准。 如何查看3GPP标准列表 实际上在3GPP网站如下链接&#xff1a;Specifications by Series&#xff0c;每个系列以及分类都说的很清楚。 几个系列分类举例 和终端协议层工作比较关系密切…

【Java】构建表达式二叉树和表达式二叉树求值

问题背景 1. 实现一个简单的计算器。通过键盘输入一个包含圆括号、加减乘除等符号组成的算术表达式字符串&#xff0c;输出该算术表达式的值。要求&#xff1a; &#xff08;1&#xff09;系统至少能实现加、减、乘、除等运算&#xff1b; &#xff08;2&#xff09;利用二叉…

LeetCode(55)环形链表【链表】【简单】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 环形链表 1.题目 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评…

啊?150水冷踏板卷到7千多,巧格的钱购买150了?

力帆的车一般我是不太想写的&#xff0c;但是顶不住它这个价格&#xff0c;实在是....&#xff0c;标准版售价干到了7980元&#xff0c;和巧格一个价了&#xff0c;比福喜还便宜点&#xff0c;属实是离离原上谱&#xff0c;不过这个车不太影响的了豪爵大哥的UHR&#xff0c;两台…

Cypress安装与使用教程(2)—— 软测大玩家

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;【Austin_zhai】 &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xff0c;分享行业相关最新信息。…

pip list 报错 ImportError: cannot import name ‘main‘ from ‘pip._int

文章目录 报错信息问题原因解决方案 关注公众号&#xff1a;『AI学习星球』 算法学习、4对1辅导、论文辅导或核心期刊可以通过公众号或CSDN滴滴我 报错信息 最近在操作服务器的时候&#xff0c;发现pip list这个命令不好使了&#xff0c;报错如下 外链图片转存失败,源站可能…

[Linux] yum安装分布式LNMP架构

1. 在一台主机安装nginx&#xff08;192.168.136.120&#xff09; 1.1 搭建nginx相关的yum源 cd /yum.repos.d mkdir bak mv *.repo bak vim /etc/yum.repos.d/nginx.repo [nginx-stable] namenginx stable repo baseurlhttp://nginx.org/packages/centos/7/$basearch/ gpgche…

Self-Distillation from the Last Mini-Batch for Consistency Regularization中文版

Self-Distillation from the Last Mini-Batch for Consistency Regularization 从上一个小批量自发蒸馏&#xff0c;实现一致性正则化 摘要 知识蒸馏&#xff08;Knowledge distillation&#xff0c;KD&#xff09;展示了强大的潜力&#xff0c;作为一种强有力的正则化策略&a…

CETN01 - How to Use Cloud Classroom

文章目录 I. Introduction to Cloud ClassroomII. How to Use Cloud Classroom1. Publish Resources2. Conduct Activities3. Class Teaching Reports4. View Experience Values5. Performance in Cloud Classroom I. 云课堂介绍II. 如何使用云课堂1. 发布资源2. 进行活动3. 班…

C++STL之List的实现

首先我们要实现List的STL,我们首先要学会双向带头链表的数据结构。那么第一步肯定是要构建我们的节点的数据结构。 首先要有数据域&#xff0c;前后指针域即可。 再通过模板类进行模板化。 然后再写List的构造函数&#xff0c;这个地方用T&,通过引用就可以减少一次形参拷…

Android 蓝牙BluetoothAdapter 相关(一)

Android 蓝牙相关 本文主要讲述android 蓝牙的简单使用. 1: 是否支持蓝牙 /*** 是否支持蓝牙** return*/ private boolean isSupportBluetooth() {BluetoothAdapter bluetoothAdapter BluetoothAdapter.getDefaultAdapter();return bluetoothAdapter ! null; }2: 开启蓝牙 …