DF_Charles 发表于 2019-8-9 18:11:27

人工智能(障)——麦昆人体识别与追踪(二)

人工智能(障)——麦昆人体识别与追踪(二)            
         
在人工智能(障)——麦昆人体识别与追踪(一)项目贴中,我们尝试使用Mind+实时模式,通过micro:bit无线通信方式将识别到的人体坐标信息,动态显示在Mind+界面上。直观的坐标数据呈现出小麦昆人体识别的效果,为实现人体追踪做足了准备。这一贴我们来一步一步地实现小麦昆人体追踪。无线传输变量数据包
   
在努力实现麦昆追踪之前,我们先来完成上一贴遗留的内容:解析麦昆(发送端)和Mind+实时模式(接收端)无线数据传输。为后面的小MU摄像头的追踪人体的参数标定做好准备。   定义数据传输格式

小麦昆(发送端)程序:   在初始化程序配置好小MU以后,通过条件判断语句,循环检查小MU是否检测到人体。当检测到人体后,通过四个变量存放:      1. 人体在小MU眼里的位置:X轴、Y轴坐标;    2. 人体在小MU眼里的大小:人像宽度width、高度hight。   最后通过无线发送功能模块,将四个数据发送到实时模式的micro:bit。由于数据的默认格式为Double,而坐标的数据为0-100的整数格式,所以我们可以先把四个变量转换为整数后再发送。同时为了方便接收端将四个数据进行区分和提取,在四个变量之间加入逗号隔开。最终发送的数据为接收端数据处理   
参数提取               
micro:bit实时模式程序(接收端):
当micro:bit无线接收到数据时,通过四个变量x_pos、y_pos、width、hight来存放小麦昆(发射端)传送的数据。这和发送端传输的数据保持一致。经过测试发现,小MU识别人体后,横向和纵向的坐标数值大小均为两位数,在区间0-9和100的位置几乎没有,所以我们使用变量提取坐标值时,默认提取两位数字。    如何才能将无线传输的数值提取出来呢?    在Mind+的运算符功能模块,可以调用获取字符指令,将无线接收的数据,按照发送端发出的位置顺序提取出来,并存放在变量中。例如提取检测到人体后X轴的坐标值:当然这里也可以使用直接获取相邻的字符进行提取,       提示:接收到的“无线数据”模块,可以通过移动鼠标到“无线数据”位置,右键复制得到。最终可以将X轴、Y轴坐标,高度宽度参数都提取出来。   坐标变换
   
在Mind+实时模式的舞台窗口中,也是通过X、Y坐标来显示图案,绘制图形。但是舞台坐标的起点不是在左上角,而是在窗口的中心,如下图:如果直接将提取出来的坐标值在Mind+实时模式的舞台窗口中显示,那么会带来2个问题:         1. 坐标点只会在舞台窗口的X轴和Y轴正方向右上角区域显示,即使小麦昆检测到人体,人像的坐标变换情况也不是很直观;      2. 舞台窗口的Y轴为从上到下,而小MU视野中的Y轴为从下到下,两者正好相反,这样会带来检测到人体图像运动方向和实时模式显示相反的问题;
为了解决上述问题,在接收端程序中简单做了坐标中心变换处理:           将提取出来的X轴坐标值先减去50,用50减去提取的Y轴坐标值,从而把小MU眼中的坐标原点和Mind+实时模式舞台窗口中的坐标原点相对应。这样Mind+实时模式舞台窗口会以小MU的视角,显示检测到的人体图像位置信息。   中心点调整重合以后,为了充分利用整个窗口空间,便于我们观察人像坐标的变化,将X轴、Y轴按比例放大:       Mind+实时模式舞台窗口长款比约为4:3,X轴范围为(-285,285),Y轴范围为(-210,210),为了更充分利用舞台空间,将X轴坐标放大4倍,Y轴放大3倍,以放大后的坐标点为中心点,用画笔绘制十字标记,配合图案移动,这样人像在小MU眼中的细微变化得到更加明显直观的显示。   无线接收部分程序功能在于,只要接收到无线数据就会显示坐标。但是小MU在实际使用中并不是一直都能检测到人体,所以在主循环需要对没有检测到的人体的状态进行处理。处理的机制很简单:   
    1.检测到人体时,直接刷新显示坐标;       2.没有检测到时,显示最后一次检测到人体的坐标,以此来避免图像闪烁;       3.连续多次没有检测到人体,直接隐藏图案。
无线发送数据小结:

      1.Mind+实时模式,创建的变量可以存取不同类型的数据:数字类型变量和字符变量都可以。而上传模式变量类型区分为数字变量和字符变量。上传模式无线发送的字符和数字变量,实时模式可以直接存取。         2.无线发送不仅可以发送单个字符,还可以发送数据包。在接收端需要对数据包进行数据提取后才能使用。   小麦昆人体追踪
   
前面通过大量的内容实现了人体识别的坐标获取,并通过Mind+实时模式无线显示,目的就是为了实现无线调试!再也不用拉着数据线跑来跑去进行标定了。下面我们开始最终的追踪调试。    追踪方案探索
   
坐标信息获取了,那么如何使用坐标从而让麦昆实现追踪呢?追踪的条件又是什么呢?      追踪可以分为2步:   方向跟随:小麦昆识别到人体,并保持一直面对着检测到的人体。小麦昆左右旋转运动,可以让人像的坐标保持在小MU的视野中央。如果不在中间,那就要调节麦昆的左后两个轮子差速转动。动态调整起来就像麦昆追着人一样。   
距离追踪:当人像保持在视野中央后,由于小MU识别人像的算法为识别人体上半身和头部的整体特征,且人体的上半身差异性相对不是很大,能否通过人像的大小反推换算出人体和麦昆之间的距离?从而通过人像的大小控制小麦昆前进后退从而保持和人体之间稳定的距离呢?追踪方案验证:方向跟随
   
首先通过X轴坐标保证人像在小麦昆的视野中间。这一点其实很简单,可以直接利用检测到人体的X轴坐标,获取到人像在小麦昆面前的方位,根据方位控制两个轮子的转动。   
大致思路是这样,结合具体程序改如何实现呢?在小MU视野中,X轴中间位置为50,检测到的X轴坐标为变量X,可以通过简单的作差:变量X – 50,得到人像和视野中间的偏差center_error。如果偏差为正值,说明检测到的人体在小麦昆右边,那么控制麦昆右转可实现人像保持在小MU视野中央;如果偏差负值,说明检测到的人体在小麦昆的左边,控制小麦昆左转,实现人体在小麦昆右边。   
转动幅度该如何控制呢?这时候我们无线调试的界面就派上用场了。界面上的 x_pos = center_error,小麦昆左右轮子可以直接结合该数值对电机PWM数值进行调整。      
经过几次简单的测试和标定发现,检测到人像后,center_error数值大多数在(-15,15),所以如果在(-50,-16)和(16,50)之间,可以让小麦昆以较大的速度进行纠正;在(-15,7)和(7,15)区间,为了避免差速转向“过冲”,即转过头的现象,需要降低差速速度;在(-7,7)区间范围,已经接近中心区域,直接让麦昆停止转动。过简单的数值拟合,对小麦昆的转速有了以下关系:(7,15)区间,PWM转速 = 10+3.5 *center_error,(15,50)区间,PWM转速 = 30+0.02 * center_error *center_error。 负半轴和正半轴对称。方向跟随函数为:在主循环程序中调用方向跟随函数,跟随效果如视频,跟随的效果还是可以的。https://www.bilibili.com/video/av62775095
增加距离追踪

当小麦昆经过方向跟随函数左右转动,控制人体坐标保持在视野中心范围后,再前进后退调整他和人体的距离。在方案探索阶段,准备使用检测到的人像宽度反推距离。经过简单的标定测试发现,检测到人体时,宽度的最小值大概为20,因此我们直接以20为基准值,通过:宽度Width-基准值20=宽度差值scale_error,来调节人体和麦昆之间的距离。距离越小,sacle_error数值越小;距离越大,scale_error数值越小。基于这种关系,参照方向跟随的调速方法,也可拟合出PWM速度输出和宽度的关系。   
程序如下:并在方向跟随函数中,在人像已经在小麦昆的视野中间区域时,调用距离跟随函数,
主循环增加scale_error变量,
将完整程序下载到小麦昆后,当我远离小麦昆时,小麦昆大胆的往前走;当小麦昆走到我面前,我继续靠近小麦昆时,它有羞涩的往后退。整体实现了小麦昆识别追踪的效果。https://www.bilibili.com/video/av62774887

方案总结

       1.在距离追踪部分,我们使用的是宽度信息反推距离,是否还有其他的方案?比如通过检测到的Y轴坐标信息进行跟踪?甚至融合使用Y轴坐标信息和宽度信息?          2.在整个验证阶段发现坐标轴的数据和宽度信息都会有突发性的变化,导致小麦昆有点“抽抽”,有没有稳定的方案,避免小麦昆颤抖呢?
在后续的项目中,我们一起探索学习,稳定的控制方法。
小麦昆方向跟随&距离跟踪程序:



页: [1]
查看完整版本: 人工智能(障)——麦昆人体识别与追踪(二)