×

使用Sony Spresense和人工智能识别不良驾驶习惯

消耗积分:0 | 格式:zip | 大小:0.21 MB | 2023-02-06

王娟

分享资料个

描述

不良驾驶习惯导致危险的驾驶条件

我们的 10n2 项目旨在通过使用 Sony Spresense 和人工智能识别不良驾驶习惯。年轻的司机可以而且确实在很小的时候就养成了很多不良习惯。不良习惯的范围从不正确的手部位置到在控制车辆时使用移动设备。国家安全委员会报告称,手机使用每年导致160 万起车祸!随着新司机的诞生,我们非常有兴趣在不良驾驶习惯养成习惯之前帮助他们消除这种习惯。

人工智能和物联网来拯救

10n2 设备不仅会检测手机使用情况,还会检测手部位置不当、急转弯、短停快速加速和跳坑。所有这些都会导致危险的驾驶条件。当检测到违规行为时,司机会收到实时通知。

 

设备收集的信息用于在 Google 地球 KML 中生成报告,其中详细说明检测到的违规行为以及地理位置。收集违规行为,并在旅行的各个部分计算分数。司机可以回顾他们的行程并了解他们可以改进的地方。

 

构建设备

10n2 是 3d 打印材料、DiY 电气元件、Sony Spresense 板和摄像头、经过 Edge Impulse 训练的 CNN 和一些使其全部工作的代码的组合。

pxl_20220805_153400343_mp_dFJrWatOMz.jpg?auto=compress%2Cformat&w=740&h=555&fit=max
 

10n2 坐骑

首先要做的是打印 10n2 安装。将model.stl加载到切片软件(如Cura )中,生成许多3d打印机使用的gcode。获得 gcode 后,将其加载到 3d 打印机上,打印大约需要 1 小时。在 Ender3 Pro 上!

pxl_20220805_143251229_mp_E1KEIgskew.jpg?auto=compress%2Cformat&w=740&h=555&fit=max
 

现场准备

现在是时候按照索尼网站上的精彩文档准备 Sony Spresense 了启动并运行 Spresense 并安装 Sony 相机板后,就可以将电池插座焊接到主板上了。

安装组件

下一步是安装 MPU 和按钮开关。10n2 安装座具有 MPU 和按钮的安装座。MPU 使用 M3 螺丝固定,按钮使用 Velcro 直接安装到 10n2 安装座。

pxl_20220805_155354965_wb44EzYbWq.jpg?auto=compress%2Cformat&w=740&h=555&fit=max
 

电线组件

现在组件已安装,您可以按照下面的接线图连接 MPU 和按钮。可以通过在相机带状电缆下方布设电线来实现电线管理。这样可以让电线远离您,并有助于 GPS 信号。

pxl_20220805_155905920_mp_oixSwZcn4C.jpg?auto=compress%2Cformat&w=740&h=555&fit=max
 

收尾工作

设备全部连接好后,我们现在可以安装电池外壳和 Velcro(用于将 10n2 设备安装到车顶)。电池外壳粘在相机支架的底部。这有两个目的;1) 固定电池 (duh) 和 2) 为相机捕捉图像和执行实时分类提供正确的角度。您还可以安装轻型 3.5 毫米。杰克扬声器作为这一点。

pxl_20220805_162059106_NRQqpGdo1T.jpg?auto=compress%2Cformat&w=740&h=555&fit=max
 

恭喜!你现在对硬件不满意了。

加载 10n2 软件

GitHub 上提供了所有 10n2 软件。要加载软件,建议您遵循 Spresense SDK 设置,克隆存储库并使用 VSCode 将软件直接安装到设备。

IDE准备

按照Sony Spresense IDE 指南为您的环境安装和配置软件。

10n2 准备和构建

现在您已经准备好一个 IDE,是时候克​​隆 10n2 存储库了。将存储库克隆到新的 VSCode 项目。10n2 存储库有一个 10n2 sdk.config ,其中包含运行 10n2 软件所需的所有 nuttx/spresense 配置。通过微型 USB 将您的 Spresense 设备连接到您的计算机,并确保它被 VSCode 识别。现在,您可以通过左键单击您的 VSCode 项目并选择Spresense:Build and Flash 来刷新您的设备。

10n2-build_f3rgu4gTUx.png?auto=compress%2Cformat&w=740&h=555&fit=max
 

如果一切顺利,没有任何问题,您应该可以使用 10n2 设备了!

挂载 10n2

10n2需要倒置安装在驾驶员头部后方约 12 英寸处,并在车门之间居中,向下倾斜约 15 度(由电池支架提供)。

 
 
 
10n2-deployed_i4sjeRKNSa.jpg?auto=compress%2Cformat&w=740&h=555&fit=max
 
1 / 2
 

训练

10n2 设备使用Edge Impulse在 10n2 的核心设计模型和训练 CNN。该模型是一个简单的 3 类(手/无手/细胞)2D 量化卷积模型。由于 Sony Spresense 的内存/计算限制,我们决定使用简单的 CNN。量化是必不可少的,因为它使模型达到可管理的大小。Edge Impulse 具有易于使用的量化模型方法,以及有关如何在目标硬件上使用量化模型的详细说明。

10n2-ei-model_USrst73XId.png?auto=compress%2Cformat&w=740&h=555&fit=max
 

如您所见,该模型训练得相对较好并且表现出奇的好。

10n2-ei-testing_ITF951BQbE.png?auto=compress%2Cformat&w=740&h=555&fit=max
 

数据

该模型是在 96x96 位图像灰度 8 位图像上训练的。我们选择 96x96 是因为它刚好足以覆盖视野中的方向盘,又小到足以为我们的目标平台制作大小合适的模型,而 96x96 是许多流行的预训练模型中的常见尺寸。

数据采集

数据直接从 Spresense 和 Sony Camera 开发板收集*。对于我们的 96x96 下采样,我们使用相机 x 坐标中 192-288 的像素和相机 y 坐标中 12-108 的像素。它位于相机的右上象限,即覆盖方向盘和手部位置的象限。

* 所有数据均在 2007 年本田 CRV 中收集

安装 EI 模型

一旦你有了一个你喜欢的模型,你就可以使用很棒的 Edge Impulse 网站来构建一个可部署的模型。10n2项目采用C++模型部署方式

10n2-ei-deploy_SCQNMsK0iK.png?auto=compress%2Cformat&w=740&h=555&fit=max
 

获得 C++ 模型部署 zip 后,您需要做的就是将以下文件提取到 10n2 存储库中的等效文件:

model_metadata.h
tflite-resolver.h
tflite-trained.h //model weights

代码

任何项目中我最喜欢的部分是代码!完整的 10n2 代码可通过 GitHub 获得。本节将突出显示导入部件。首先,SMP是必需的,因为 10n2 对 Spresense 的要求很高。SMP 允许异步使用所有 6 个内核。10n2 将一个完整的核心专用于 TensorFlow 推理引擎,并将剩余的核心分配给相机捕捉、数据收集和 KML 生成等功能。

SMP 示例

您会注意到在使用 SMP 时设置 CPU 亲和性很重要。这告诉调度程序哪个 CPU 运行 p 线程。

bool imu_init(void)
{
    printf("imu init\n");
    imu_running = true;
    cpu_set_t cpuset = 1 << 2;
    pthread_create(&imu_th_consumer, NULL, &_imu_q_read, NULL);
    int rc;
    rc = pthread_setaffinity_np(imu_th_consumer, sizeof(cpu_set_t), &cpuset);
    if (rc != 0)
    {
        printf("Unable set CPU affinity : %d", rc);
    }

    return true;
}

Edge Impulse 模型推理

EI生成的TFLM模型是量化的。必须对输入和输出进行量化和反量化以获得有意义的结果。

量化

int8_t quantize(uint8_t pixel_grayscale)
{

    // ITU-R 601-2 luma transform
    // see: https://pillow.readthedocs.io/en/stable/reference/Image.html#PIL.Image.Image.convert
    int32_t gray = (iRedToGray * pixel_grayscale) + (iGreenToGray * pixel_grayscale) + (iBlueToGray * pixel_grayscale);
    gray >>= 16; // scale down to int8_t
    gray += EI_CLASSIFIER_TFLITE_INPUT_ZEROPOINT;
    if (gray < -128)
        gray = -128;
    else if (gray > 127)
        gray = 127;
    return static_cast8_t>(gray);
}

反量化

for (int k = 0; k < NUM_CLASSES; k++)
      {
          //dequantized output
          conf = (od[k] - EI_CLASSIFIER_TFLITE_OUTPUT_ZEROPOINT) * EI_CLASSIFIER_TFLITE_OUTPUT_SCALE;

      }

急转弯、加速和减速都是根据 MPU 收集的数据计算得出的。MPU 安装在 10n2 的一侧,Z 轴朝上,Y 轴沿车辆的加速度轴,Z 轴垂直于 X 和 Y。

加速/减速

通过确定 Y 样本在 100 Hz 的 moving.35 秒窗口上的斜率来计算加速度和减速度。样品。如果坡度高于阈值,则认为车辆加速过快。如果坡度低于阈值 (± 500),则认为车辆减速过快。

急转弯

转弯的计算方式与加速度相同,但使用来自 MPU 的 X 加速度并使用小得多的斜率阈值 (+- 250)。

坑洞

通过对沿 Z 轴的加速度使用标准偏差阈值来识别坑洞。如果标准偏差 > 1800,那么我们认为这是一个底池持有。

收集的数据

10n2 记录原始传感器数据以及 csv 中的计算数据。当 10n2 处于“训练”模式时,也会收集图像数据。CSV 数据以以下 CSV 格式存储:

t	slopex	slopey	slopez	inf	conf	acx	acy	acz	gyx	gyy	gyz	y	M	d	h	m	s	us	type	lat	lon
23915	-98	55.299999	-27	0	0.53125	4225	-210	644	205	-129	-54	2022	8	3	23	42	23	586585	1	39.513708	-104.764668
24016	17.1	44.599998	-15.6	2	0.589843	4949	-4	641	-71	-75	20	2022	8	3	23	42	24	817926	1	39.513708	-104.764668
24117	-11.2	-31.700001	-6.1	1	0.46875	4870	-99	713	-53	-196	32	2022	8	3	23	42	25	433078	1	39.513708	-104.764668
24218	-67.400002	-35.200001	-7.1	0	0.953125	4969	10	685	-60	-104	-2	2022	8	3	23	42	26	648016	1	39.513708	-104.764668
24321	-12.1	7.8	6.6	1	0.734375	5005	-44	704	-60	-120	15	2022	8	3	23	42	27	890861	1	39.513708	-104.764668

结论

如果你做到了这一点,谢谢。我们在开发我们认为有用的产品方面度过了愉快的时光。我们欢迎所有评论和问题,希望您喜欢 10n2。要查看更多信息,请在线访问我们


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.lene-v.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'使用Sony Spresense和人工智能识别不良驾驶习惯',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.lene-v.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);