KCF算法优点:
速度快、准确率相对较好、相对于目前更为精确的深度学习类跟踪算法,对设备要求不高
KCF算法不足:
在遮挡,尤其是大面积/长时间遮挡后,原目标难以寻回(原因是KCF算法本质上是一种模板匹配算法,当模板改变不大或变化不大时效果较好,KCF跟踪器每更新一次,模板也更新一次,当经过大面积/长时间遮挡后,原有需要的模板便消失了)
KCF算法有尺度不变性,即跟踪区域的大小一经确定,便无法改变(实际使用中感觉KCF的跟踪区域有收缩一方面是精度转换问题、另一方面是算法设计时为了防止数值越界,进行了定义)。因此,在跟踪对象的尺度变化时,效果不好,容易因为累计误差的原因逐渐丢失目标
需求分析:
设备的算力有限,配置的跟踪算法需要尽量轻量化;由于是给随行机器人使用,一定程度上可以减轻尺度变化的影响;在实际使用中,对帧率(实时性)要求较高
KCF算法在此基础上主要需要解决的问题:
大面积/长时间的遮挡后的目标寻回以及自主判断目标是否丢失
解决方法:
对peak_value的值进行约束并结合人脸识别
**对peak_value的值进行约束**:经过多次测试发现,在无遮挡的情况下,无论是用户进行了形变还是背景的变化,peak_value的值极少低于0.4。而一旦有大面积的遮挡,peak_value的值骤降,以此为条件可以增加约束进行判断是否被遮挡<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/25956621/1649944439385-33c22f3b-ffdd-4d28-b747-0603f70cad44.png#clientId=ufc9e4313-b897-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=ue6fccfbd&margin=%5Bobject%20Object%5D&name=image.png&originHeight=480&originWidth=640&originalType=url&ratio=1&rotation=0&showTitle=false&size=40036&status=done&style=none&taskId=udb2630ff-e0b8-4773-ab92-20047b2c3bd&title=)<br /> **人脸识别:**通过dlib库提供的模型,在图片中可以抽取出使用者人脸的128D的特征向量,然后进行欧氏距离计算。经过测试,欧式距离小于0.4时可以认定为是同一个人。这种方法基于纯计算,效率比较高,且只要人脸特征点能找到就可以,并不一定需要使用者脸部正面对着摄像头
还需要微调整的地方:
在找回人脸时,根据人脸的位置重新设置跟踪框大小,跟踪框大小对帧率有很大影响(KCF是种模板匹配算法,跟踪框越小,需要循环移位匹配的次数会变多,帧率就下降)。目前设置的是宽度为人脸宽度的3倍,高度为人脸高度的8倍,显得略大,可以再进行调整 【在kcftracker.py中找到reset方法即可】
当跟踪框为整个身体时,人脸部分因为占比较小,所以即使遮挡了对peak_value的影响也不大,因此在极少数情况下可能会跟错人(比如体型相似且衣服配色一致),因此可以设置每隔固定帧进行一次跟踪框内的人脸识别来判断是否跟丢,但识别会造成掉帧(整体影响不大,但体验不好)
人脸识别相关函数的关系
关于与机器上现有的人脸识别程序、深度摄像头结合: