在Android上通过AI危险检测向驾驶员发出警报

261 篇文章 9 订阅
39 篇文章 2 订阅

目录

防止连续警报


这是有关使用Android构建实时危害检测器的系列文章中的第四篇。在上一篇文章中,我们研究了如何在屏幕上突出显示对象。我们还注意到,并非所有检测到的物体都是我们要提醒用户的东西。检测器可以识别的其他物体包括鸟类和其他交通工具,这都不是我们要提醒用户的东西。探测器确实可以识别人和各种动物。我们想要这些警报。如果汽车没有移动,则可能根本没有必要提醒用户。人们在汽车等待时穿过街道,这是一个被识别的实体进入手机视野的场景,但在这个场景中,我们不希望系统产生警报。

为了避免不必要地警告用户,我们将选择应生成警报的对象的选择列表。除了TensorFlow Lite模型和标签文件外,我还添加了一个新的文件,名为concerns.txtconcerns.txt的每行包含一个从labels.txt复制的行,该行是检测器将针对其发出警报的标签。检测器以与加载标签相同的方式将它们加载到列表中。

if(concernList.size() == 0) {
   InputStream concernStream = context.getAssets().open("concerns.txt");
   BufferedReader br = new BufferedReader(new InputStreamReader(concernStream));
   String line;
   while(null != (line = br.readLine())) {
       Log.i(TAG, String.format("Concern: %s", line));
       concernList.add(line);
   }
}

声音是提醒用户的一种选择。如果设备具有立体声扬声器,我们可以通过产生声音通过左扬声器,右扬声器或两个扬声器播放以快速指示危险的总体方向来利用它们。为此,我制作了三个声音文件,并将它们添加到项目的资源中。这些声音文件位于app/src/res/raw文件夹中。声音文件将添加到我们可以在代码中引用的资源中。我定义了一些常数,这些常数保存声音文件的ID,以便更轻松地引用它们。MediaPlayer还需要引用一个变量。该MediaPlayer负责播放声音。

val ALARM_LEFT: Int = R.raw.left_sound
val ALARM_RIGHT: Int = R.raw.right_sound
val ALARM_CENTER: Int = R.raw.center_sound
var soundPlayer: MediaPlayer? = null

创建具有MediaPlayer声音值之一的对象将为我们提供一个可以播放警报声音的对象。

防止连续警报

为了防止在驾驶员不动时发送警报,用户必须超过最低速度。如果用户低于此速度,则不会生成声音警报。Android的位置服务以米/秒为单位返回速度。在考虑行驶速度时,我倾向于以每小时公里数来考虑。为了设置最小速度,我定义了一个常数,该常数设置了每小时的最小公里数,另一个常数使用该第一个常数表示以米/秒为单位的相同速度。

val MIN_ALERT_KMPH:Float = 10.0f
val  MIN_ALERT_MPS:Float = MIN_ALERT_KMPH*1000.0f/(60.0f*60.0f)

检测器将接收有关车辆当前速度的更新。对于用于调试和测试的测试接口,速度将通过代码设置,而不取决于车辆的实际运动。

与其持续向用户发出危险警告,不如在发出另一条警告之前有一段冷却时间。当我们尝试发出警报时,首先要检查是否存在尚未到期的警报。如果没有超过到期时间,则不会发出警报。尝试发出警报还会重置冷却时间。

var coolDownExpiry:Long = 0
val COOL_DOWN_TIME = 10000

fun resetCooldown() {
   coolDownExpiry = Date().time + COOL_DOWN_TIME
}
fun hasCooldownExpired():Boolean {
   val now = Date().time
   return now > coolDownExpiry
}



fun alert(direction: Int) {
   // using the when statement to filter out invalid
   // values should they be passed to this function
   if(hasCooldownExpired() && currentSpeedMPS>MIN_ALERT_MPS) {
       when (direction) {
           ALARM_CENTER, ALARM_RIGHT, ALARM_LEFT -> {
               soundPlayer = MediaPlayer.create(context, direction)
               soundPlayer!!.start()
           }
       }
   }
   resetCooldown()
}

该应用程序所需的大多数功能现已就绪。最后要添加的内容是具有紧急警报的崩溃检测,以及使应用程序使用实时摄像机流而不是用户选择的图像。在本系列的下一篇文章中,我们将研究崩溃检测和通知。

https://www.codeproject.com/Articles/5291391/Alerting-the-Driver-with-AI-Hazard-Detection-on-An

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值