基于神经网络预测车道行驶的自动驾驶

124 篇文章 1 订阅
43 篇文章 0 订阅

数据定义先假定

首先定义我们在自动驾驶,并且可以获取前后左右各个车的数据。传感器和摄像头已经在车身上部署好。
 假定我们在车道上行驶,根据跟驰模型数据我们能知道的是:
1 左车距离
2 右车距离
3 前车距离
为了简化问题,我们暂时不使用后车距离,事实上我们也是可以获取的。
神经网络
    图中可以看出我们的输出值为5类,-1 为前往左车道,1 为前往右车道,2 为加速行驶,0 为保持跟驰, -2 为刹车慢速

    也就是简化模型为:三维输入,三个距离,一维输出,是前进还是保持,是刹车还是右行,为了得到神经网络权值,我们必须来假设一批数据。
如下图,三个车道,前方有车220米,右边为200米,左边为170米,我们的输出是什么?随着不断地变化,我们的自动驾驶该怎么做?
在这里插入图片描述

设定数据

float train_data[13][3] = {
{ 200,100,250 }, //1
{70,70,70}, //2
{ 50, 50, 45},//3
{ 50,100, 50},//4
{100,300,100},//5
{100,100,115},//6
{100,100,100},//7
{200,300,200},//8
{300,60,100},//9
{30,50,150}, //10
{100,50,100}, //11
{400,100,300},{50,60,200}
};
我们举个例子,在左车道距离为50,本车道为60,右车道为200的时候,我们可以选择右行,打右向灯,离开本车道到右车道, 输出为1.
float labels[13] = { 1,0,0,0,2,1,0,2,-1,1,-2 ,-1,1};
上面13个数据的输出为float型,ok,准备好数据,我们可以开始了。

我们可以手写一段神经网络代码,也可以使用现有的工具,设计是第一位的,我们此次设计的是,三个输入,隐层10层,一个输出,使用最简单的网络来做这次自动驾驶。


#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/imgcodecs/imgcodecs.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/ml/ml.hpp"
int main
{
	// 训练样本
	//离左前方距离为 ,前方距离, 右前方距离
	float train_data[13][3] = {
	{ 200,100,250 }, //1
	{70,70,70}, //2
	{ 50, 50, 45},//3
	{ 50,100, 50},//4
	{100,300,100},//5
	{100,100,115},//6
	{100,100,100},//7
	{200,300,200},//8
	{300,60,100},//9
	{30,50,150}, //10
	{100,50,100}, //11
	{400,100,300},{50,60,200}
	};


 // 每个样本数据对应的输出
	float labels[13] = { 1,0,0,0,2,1,0,2,-1,1,-2 ,-1,1};
	Mat train_data_mat(13, 3, CV_32FC1, train_data);
	Mat labels_mat(13, 1, CV_32FC1, labels);

	// BP 模型创建和参数设置
	Ptr<ml::ANN_MLP> bp = ml::ANN_MLP::create();

	Mat layers_size = (Mat_<int>(1, 3) << 3, 10, 1); // 3维输入,1维输出
	bp->setLayerSizes(layers_size);

	bp->setTrainMethod(ml::ANN_MLP::BACKPROP, 0.1, 0.1);
	bp->setActivationFunction(ml::ANN_MLP::SIGMOID_SYM);
	bp->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 10000, /*FLT_EPSILON*/1e-6));

	// 保存训练好的神经网络参数
	try
	{
		bool trained = bp->train(train_data_mat, ml::ROW_SAMPLE, labels_mat);

		if (trained) {
			bp->save("bp_param");
		}
	}
	catch (cv::Exception &ex)
	{
		std::cout << ex.msg << std::endl;
	}

	Mat sample_mat = (Mat_<float>(1, 3) << 60,60,60);
	Mat response_mat;
	bp->predict(sample_mat, response_mat);

	float response = response_mat.ptr<float>(0)[0];

	std::cout << "the response is " << response << std::endl;

	sample_mat = (Mat_<float>(1, 3) << 60, 60, 200);
	bp->predict(sample_mat, response_mat);
	response = response_mat.ptr<float>(0)[0];
	std::cout << "the response is " << response << std::endl;

	sample_mat = (Mat_<float>(1, 3) << 260, 60, 100);
	bp->predict(sample_mat, response_mat);
	response = response_mat.ptr<float>(0)[0];
	std::cout << "the response is " << response << std::endl;
}

测试输出

本次得到的数据结果如下,
数据结果

               2 ->加速
左<-1      0      1 ->右
               -2 ->刹车
得到的数据分析:
1、在60,60,60的情况下,得到的结果接近为0,也就是保持不变
2、在60,60,200 的情况下,得到的结果接近为1,也就是右车距离200是比较安全,(注意这里不是真的安全),可以右行。
3、在260,60,100的情况下,结果为负数,也就是要么刹车,要么左行,可以先刹车后左行。

结论

因为数据非常少,实际上该次神经网络的权值并不理想,只要我们完善数据,根据设计需求来完善网络。此次是一个示例。改进:
1 可以完善更多的数据,在外部加载进来
2 可以完善网络,下次再聊

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

qianbo_insist

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

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

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

打赏作者

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

抵扣说明:

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

余额充值