YOLO:模型分析 - zhonglong/TPV GitHub Wiki

VOC & COCO & YOLO9000

Android客户端目前支持三种模型,分别是基于Pascal VOC和COCO数据集训练的两个YOLOv3 tiny模型,以及基于COCO和ImageNet数据集训练的YOLO9000模型,除了VOC是厦门自己训练的,其余两个都是官方预训练模型。

三个模型对比如下:

yolov3-tiny-voc yolov3-tiny yolo9000
数据集 Pascal VOC COCO COCO + ImageNet
YOLO版本 v3 tiny v3 tiny v2
模型大小 33.2 MB 33.7 MB 186 MB
物体种类 20 80 9418
检测时间 约0.9s 约0.9s 4~5s
训练时间 约21h

要了解各个模型的差异,主要是看cfg目录下对应的xxx.cfg文件,同样基于v3 tiny的VOC和COCO模型,网络结构是一样的,虽然识别的物体种类相差4倍,但模型大小和识别时间相差并不大。

分别运行:

./darknet detect cfg/voc.data cfg/yolov3-tiny-voc.cfg yolov3-tiny-voc.weights
./darknet detect cfg/coco.data cfg/yolov3-tiny.cfg yolov3-tiny.weights

打印出二者的网络结构,网络层数和类型是相同的,只有两个卷积层的filter不同(对应物体种类),这会影响该层的参数,进而影响模型大小。 再看最后一列,BFLOPs中的B代表Billion,BFLOPs也就是GFLOPs的意思,这是对计算量的预估。物体种类只相差4倍的话,对模型计算量的影响很小,导致检测时间相差不大。如果物体种类相差较多(如80种对9000种),则GFLOPs差异就会很大,实际检测时间也会相差数倍。

检测时间

YOLO模型的另一个特点是时间和精度是可调的,最重要的影响因子是分辨率。模型训练过程中,会动态缩放图片,从320到608共10种分辨率(32的整数倍),但检测默认采用416的分辨率。 将分辨率调小可以得到更快的速度,将分辨率调大可以得到更好的精度。以dog.jpg为例,测试过程中发现,将分辨率调小甚至可以将检测时间减少一半,同样能正确识别物体。

内存用量

内存用量同样与各模型的网络结构有关,尤其是input和output两列,加载模型时会根据这两列分配对应的内存,若网络层数多,分辨率大则占用的内存也越多。

加速

分CPU和GPU两种环境讨论(数据为个人主观感受):

OpenMP & OpenBLAS & NNPACK

CPU主要有三种加速方案,以X588手机为例,若将原始版本的检测速度定义为1,则OpenMP可以达到3~4,OpenBLAS可以达到6,NNPACK可以达到10以上,加速效果越来越好。

CUDA

GPU只支持CUDA,但效果非常明显,以GTX 1060对比Xeon E5-269x,检测速度可提升10倍左右,训练速度可提升60倍左右。