实时目标检测一直是yolo系列的追求之一,从yolo v1开始,作者就在论文中强调real-time。在后期的v2和v3的发展过程中,慢慢在P&R(尤其是recall rate)上下不少功夫。同时,计算量的增大也牺牲了yolo的实时性

tiny-yolo是轻量级的yolo,在不那么要求mAP的场景下,tiny-yolo可以作为v2甚至v3的代替结构。事实上,对于无GPU的设备来讲,tiny-yolo依然很难达到实时

北卡的研究者针对无GPU的情况下,研究了一种实时性的yolo改进版本——yolo-lite。实验证明,yolo-lite速度比tiny-yolo v2快8.8倍


github地址:https://github.com/reu2018DL/YOLO-LITE

论文地址:https://uncw.edu/math/REU/jonathan_pedoeem-reduced.pdf


作者想研究一种non-GPU的实时检测算法,所以需要选择一种基准算法,在基准算法上进行实时性优化。毫无疑问,选择本来就在速度上占据很大优势的one-stage检测算法yolo是理所应当的。这就是所谓的,站在巨人的肩膀上。

以yolo为起点,所以这个算法的名字叫yolo-lite。其研发团队与最开始的yolo团队并无什么联系。

yolo lite网络结构

整个结构就像简化版的yolo v2,用一个通体的CNN来做目标检测。其实没啥好重点研究的,还是采用主流的leaky relu作为主要的激活函数,保留了v2的最大池化来调整张量尺寸,而不是用的v3那种通过卷积步长来调整尺寸。是一个中规中矩的卷积神经网络。

有以下几点改进:

 1. 把416x416的输入尺寸替换成224x224的输入尺寸;输入尺寸更小意味着需要的FLOP量也越小;

2. 更少的层数以及更浅的网络;删繁就简,大大减少weights数量;

3. 去除BN层yolo-tiny都是保留有BN层的,而yolo-lite却完全去除了BN层。BN层能够在训练时加快收敛,同时,能够提高训练效果。读过yolo v2论文的童鞋可以发现,BN层的加入直接使得yolo v2的mAP上升了5%BN一度被认为是神器,Joseph团队自从v2使用了BN之后,就再也没抛弃BN了。而yolo-lite的研究者发现BN层并不能很大幅度的提升算法性能,尤其是在模型网络层数很浅的情况下但是BN层却会增加很多计算开销,于是yolo lite的作者直接去掉了BN层。


实验结果

mAP是被吊打了,但帧率却大大提高。

作者表示,还可以做以下改进:

1. 可以加入shuffle-net中的depth-wise卷积;

2. 可以使用Image-net的预训练模型;

3. 可以用减枝算法进一步压缩模型;


总结

yolo-lite带来的启示是“删繁就简”,如果不是为了刷榜(COCO),而是在实际项目中,这种“就简”的思维用处很大。首先,COCO数据集是检测80分类,然而我们实际项目中往往用不到这么多类别的检测。直接用人家在COCO数据集上训练出来的模型,其实有很多冗余。对于简单的项目,丢简单的模型,反而不容易造成过拟合。

BN层可能对小模型的帮助并没有那么大如果在小任务如单目标检测上,可以考虑去掉BN层。