我们如何开发一种用于监视驾驶员注意力的设备。 体验Yandex.Taxi



出租车应该舒适安全。 这不仅取决于汽车和服务的质量,还取决于驾驶员在过度劳累时的注意力集中程度。 因此,在服务水平上,我们限制了驾驶员花在方向盘上的时间。

但是有时候,驾驶员在上线时已经很累了-例如,一个人整天忙于另一项工作,晚上决定“转向”。 怎么办呢? 如何理解驾驶员在不改变睡眠的情况下进行干预? 例如,您可以尝试评估他对道路的监视程度,并根据眨眼的性质确定疲劳的迹象。 听起来简单吗? 一切都比看起来复杂。

今天,我们将首先告诉哈勃(Habr)的读者,我们是如何想到并开发出可以做到这一点的相机的。

因此,给出:眨眼的频率和持续时间取决于疲劳程度。 当我们感到疲倦时,头部的活动度降低,凝视的方向改变的频率降低,眨眼的频率增加,并且长时间闭眼-差异可以以几分之一秒或几度的旋转度来衡量,但这种差异确实存在。 我们的任务是设计一种设备,使我们能够分析眨眼以及视线,打哈欠和头部运动的方向,以评估驾驶员的注意力和疲劳程度。

首先,我们决定:让我们制作一个笔记本电脑应用程序,将其放在员工中间的志愿者身上,并将使用内置摄像头来跟踪我们所需的标志吗? 因此,我们将立即收集大量信息进行分析,并迅速检验我们的假设。

剧透:什么都没发生! 很快,很明显,大多数人在计算机上工作时都会不断注视键盘并歪头。 也就是说,眼睛是看不见的,甚至不清楚是闭合还是睁开,一个人眨眼,或者只是从屏幕看向键盘,反之亦然。



然后我们意识到,即使要制造原型,我们也需要某种设备。 我们购买了第一个可用的IP摄像机型号,该型号可在红外范围内工作。

为什么我们需要红外线? 照明可能会有所不同,有时用户在树荫下,有时是从背后,从上方或根本没有灯光。 如果我们制造一个测量设备,那么它在任何条件下都应能工作。

为了进行实验,小米推出了一款颇受欢迎的相机-CHUANGMI。



事实证明,她以每秒15帧的频率拍摄,而我们需要的频率是原来的两倍:闪烁持续30到150毫秒,以每秒15帧的速度,我们冒着眨眼不超过60-70毫秒的风险。 因此,我们必须修改其固件以强制打开红外照明,直接访问视频流并每秒获取必要的30帧。 将摄像机连接到笔记本电脑并配置为通过RTSP协议接收视频流后,我们开始记录第一个视频。 相机被放置在笔记本电脑相机下方15厘米处,这使得更好地“看到”用户的眼睛成为可能。

成功吗 再说一次。 收集了数百个视频后,我们意识到什么都没发生。 笔记本电脑用户在白天的行为与驾驶员的行为不同:一个人可以随时起床,下车吃饭,散步和热身,而驾驶员在坐姿上要花费更多的时间。 因此,此类数据不适合我们。

显然,唯一的方法是制造或购买合适的相机并将其安装在汽车上。

似乎一切都很基本:我们购买DVR,转向驾驶员,系上汽车,每周一次,我们会拿起带有录像的SD卡。 但实际上,事实并非如此简单。

首先,要找到具有红外照明的DVR非常困难,我们需要看清面部,尤其是在晚上。

其次,所有DVR都具有广角镜,因此驾驶员面部的面积很小,因此您无法分辨出任何记录。 是的,镜头的扭曲几乎破坏了对头部位置和视线方向的分析。

第三,这家企业在十台,一百台或更多台机器上的伸缩性不佳。 我们需要从不同的驱动程序中收集大量数据,以便对其进行分析并得出结论。 每周或每天在一百台计算机上手动更换存储卡是浪费大量时间。 我们甚至试图找到一种可以将视频上传到云的相机,但是市场上没有类似的东西。

甚至有一个想法是用Raspberry Pi(带有红外照明和安装座的摄像机)制作“自己的DVR”。



结果与我们预期的不太一样:麻烦,无法将相机与计算机分开安装。 事实是,如果电缆长度超过50厘米,则会出现信号问题,并且CSI电缆本身非常脆弱,太宽,因此不太适合安装在机器中。

我们决定去香港。 这次旅行的目的非常抽象:了解不同的制造商在分析驾驶员行为方面进行的工作,购买发现的产品样本,寻找可以安装在汽车上的合适的技术解决方案/组件。

我们立即去了两个受欢迎的电子和零部件展览。 在汽车电子展馆中,我们看到了录像机,后视摄像头和ADAS系统的空前优势,但几乎没有人从事驾驶员行为的分析。 几家制造商的原型确定要入睡,分心,吸烟和打电话,但没人想到疲劳。

结果,我们购买了一些相机和单板计算机样品。 显而易见的是:1)没有适合我们的成品; 2)必须将计算机和照相机分开,以免遮挡驾驶员的视线。 因此,我们拍摄了一个带有USB接口的相机板,作为一个计算单元,是一个单板Banana Pi计算机,同时还使用了多个基于Amlogic处理器的Android播放器。



“为什么是球员?” -你问。 实际上, S912甚至S905在性能方面都非常强大,即使在现场进行图像分析,它们也可以轻松实现我们的视频录制。 为了不将整个视频流发送到服务器,需要进行现场图像分析。

让我们数一数:以640×480(30 FPS)的H.264分辨率压缩一分钟的视频至少需要5兆字节。 因此,在一小时内将有300兆字节,而对于标准的8小时轮班-大约2-3 GB。

每天使用LTE调制解调器上传3 GB的视频是非常“昂贵”的。 因此,我们决定定期录制5分钟的视频,并分析那里汽车中发生的所有事件,并将其以经过分析的事件流的形式上传到我们的服务器中:一组面部点,一个视角,一个头部转向等。

我们以愉快的心情从展览中回来,带来了一堆必要的(和不必要的)垃圾,并意识到我们将如何继续制作原型。

我们在香港发现的USB摄像头几乎适合我们:尺寸38×38毫米,标准镜头(12毫米),可以将红外照明器直接焊接到板上的能力。



因此,我们立即要求制造商为我们提供具有必要组件的原型。 现在我们明白了:我们需要一个带背光的USB摄像头和一个用于视频处理的单板PC。 我们决定尝试市场上提供的所有产品,并安排了速卖通上的购物会议。 我们购买了四十二个不同的相机,十二个单板PC,Android播放器,一组12mm镜头和许多其他奇怪的设备。



硬件问题已解决。 那软件呢?

我们很快就获得了一个基于OpenCV的简单原型,该原型可以编写视频,查找驾驶员的面部,对其进行分析,在面部上标记68个关键点,识别眨眼,打哈欠,转头等。

下一个任务是使我们的原型在单板PC上运行。 Raspberry PI立即掉线:很少有内核,一个较弱的处理器,每秒不能超过7帧。 关于如何同时编写视频,识别人脸并对其进行分析,这毫无疑问。 出于同样的原因,Allwinner(H2,H3,H5),Amlogic S905和Rockchip RK3328上的机顶盒和单板计算机也不适合我们,尽管后者非常接近理想的性能。 结果,我们仍然有两个潜在的SoC:Amlogic S912和Rockchip RK3399。

在Amlogic,设备的选择很小:电视盒或Khadas VIM2。 在电视盒和Khadas上,一切工作都相同,但是冷却电视机顶盒尚需时日,而在它们上面设置Linux常常不是让心虚的人做的事情:使Wi-Fi,BT正常工作,使OS看到所有内存, -时间长,困难且不可预测。 因此,我们选择了Khadas VIM2:它具有标准的冷却散热器,并且电路板非常紧凑,可以将其隐藏在机器的仪表板后面。



到这个时候,相机板的制造商已经向我们发送了一百个测试批,我们渴望战斗:制造原型,将其放入汽车中并收集数据。

我们有一个摄像头,有一个软件,有一个单板PC,但丝毫没有想到如何将所有这些部件放入汽车并将其连接到车载电源的想法。

显然,相机需要机身和底座。 我们一次购买了两台3D打印机来打印零件,承包商则为我们制作了该表壳的第一个原始模型。



现在出现了艰难的选择任务:将摄像机安装在汽车上的位置以获得清晰的图像,但又不会遮挡驾驶员的视线。 共有三种选择:

  1. 在挡风玻璃中间。
  2. 在左机架。
  3. 在后视镜上。



那时,在我们看来,最好将相机直接安装到后视镜上:它始终对准驾驶员的脸部,因此相机可以准确地拍摄我们所需的东西。 不幸的是,后视镜的制造商不能确保可以方便,可靠地将某些东西固定在后视镜上。 相机不稳固,掉落并关闭了评论。



尽管如此,我们还是装备了几台机器,并开始从中收集数据。 显然,该设计是不完美的,并且在同时记录和分析面部的同时,与性能和发热有关的问题不断攀升。

然后,我们决定将摄像头安装在左机架的视线高度:我们减少了检查的距离,并为摄像头提供了良好的角度,以便可以看到驾驶员。 情况必须重做,因为带有铰链的紧固件极其不可靠:摇晃时会断裂,断裂,吸盘会从玻璃上脱落。



我们认为,对于原型和数据收集,最好将摄像机牢固地固定在玻璃上,以免晃动和外部影响改变摄像机的位置。 我们对外壳进行了一些改动,同时使用特殊的双面胶带对设备进行了负载测试。 为了进行测试,使用了复杂且高精度的设备。



由于性能问题,我们决定将SoC更改为功能更强大的SoC,因此我们选择了Rockchip RK3399处理器上的NanoPI M4单板PC。

与Khadas VIM2相比,它的生产率高出三分之一左右,具有硬件压缩和视频解码功能,并且在困难的温度条件下表现得更加稳定。 是的,我们试图在冷冻机中运行相机和电路板,在烤箱中对其进行加热,并进行了许多其他非人为的测试。



由于我们不仅录制视频,而且录制全天动态信息,因此准确记录设备上的系统时间非常重要。 不幸的是,大多数单板计算机都没有配备自供电时钟。 我们很幸运,我们的NanoPI具有电池连接器。

我必须为计算机设计外壳,以对其进行物理保护,并充当WiFi和BT天线的支架。 在那里,我们还提供了一个用于安装带有支架的手表电池的地方。



此外,我们计划为100台机器配备原型,该原型将记录视频并将所有遥测信息在线传输到云端:是否有驾驶员,他多久和长时间眨眼,打哈欠,从道路上分散注意力,转过头等等?所有这些(并且不仅是这些参数,还使我们能够训练一个模型,该模型可以评估驾驶员在路上的注意力集中程度,无论他是否分心或疲劳。 为了直接在汽车上的设备上完成所有这些操作,我们必须完全重写代码,进行硬件视频压缩,轮换日志和视频记录,定期将其发送到服务器,远程更新软件等等。

同时,对我们来说很清楚,我们的计算和算法通过更准确的基本面部分析可以更好地工作。 在第一个原型中,我们使用了基于haar级联模型的 OpenCV中内置的面部检测器,以及基于dlib库标记68个面部点的模型。 我们通过计算面部点在焦平面上投影来自己计算头部的位置。 用于面部识别和标记的开源解决方案在面部被正面或侧面照的框架上效果很好,但是在中间条件下,它们通常会被误认为。

因此,我们决定许可使用良好的第三方面部识别和标记解决方案VisionLabs SDK。 与以前的算法相比,该算法耗费更多资源,但是可以显着提高人脸识别和标记的质量,从而可以更准确地提取机器学习因素。 在VisionLabs同事的帮助下,我们能够快速切换到他们的SDK,并获得所需的性能:30帧/秒。 分辨率为640x480。

VisionLabs SDK使用神经网络进行人脸识别。 该技术处理每个帧,找到驾驶员的脸,并给出眼睛,鼻子,嘴巴和其他关键点的坐标。 所获得的数据用于创建尺寸为250x250的归一化框架,其中人脸严格位于中心。 该框架已经可以用于计算沿三个轴以度数表示的头部位置:偏航,俯仰和横滚。 为了跟踪驾驶员眼睛的状态,系统会分析眼睛的图像,并为每只眼睛决定其闭合还是睁开。 该系统能够使用IR Liveness技术确定有生命的人在相机前面还是驾驶员附有照片。 为了进行分析,使用了归一化的帧,并且在输出端我们得到的结果是活跃的或有效的。

结论


当我们重写和调试软件时,我们的3D打印机白天和黑夜都会打印相机和单板PC的外壳。 打印套件(相机机身+ PC盒)需要大约3-4个小时的打印机操作时间,因此我们不得不扩大生产能力:我们使用了四台打印机。 但是我们设法按时完成了所有工作。



在两周内,我们已经为多个出租车队的Yandex.Taxi合作伙伴配备了前百辆汽车。 现在,在他们的帮助下,我们收集了视频,分析了驾驶员的行为,疲劳迹象,改进了算法并训练了评估注意力和疲劳程度的模型。 只有在那之后(考虑所有数据,驾驶员和乘客的反馈),我们才可以进入下一阶段-批量生产和实施。

不幸的是,由于多种原因,为了扩展到数千或数万的安装,当前的技术解决方案不是很合适。 我们在本文中讨论的只是一个快速实验,其目的是快速学习如何直接从机器收集数据以训练模型。 对我们而言,下一个重要阶段是开发并开始生产具有相同尺寸但由一个单元组成的设备:摄像头,传感器和调制解调器将放置在一个紧凑的外壳中,我们将在机器中批量安装该设备。

Source: https://habr.com/ru/post/zh-CN461137/


All Articles