CarND-Vehicle-Detection, 在 21FPS 运行的Keras中,使用YOLO进行车辆检测

分享于 

12分钟阅读

GitHub

  繁體 雙語
Vehicle detection using YOLO in Keras
  • 源代码名称:CarND-Vehicle-Detection
  • 源代码网址:http://www.github.com/xslittlegrass/CarND-Vehicle-Detection
  • CarND-Vehicle-Detection源代码文档
  • CarND-Vehicle-Detection源代码下载
  • Git URL:
    git://www.github.com/xslittlegrass/CarND-Vehicle-Detection.git
    Git Clone代码到本地:
    git clone http://www.github.com/xslittlegrass/CarND-Vehicle-Detection
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/xslittlegrass/CarND-Vehicle-Detection
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    车辆检测项目

    这是一个Udacity自驾驶汽车Nanodegree程序的。 本课题的目的是在短距离摄像机视频中检测车辆。 项目的实现在文件 vehicle_detection.ipynb. 中,这个实现可以实现 21FPS 而不进行批处理处理。 最后的视频输出是在这里。

    在本文中,将详细解释管道中的每一步。

    对象检测简介

    在视频流中检测车辆是一个目标检测。 目标检测问题既可以是分类问题,也可以是回归问题。 作为分类问题,图像被划分为小的补丁,每一个都通过分类器来确定是否存在对象。 然后将边界框分配给包含对象高概率高概率的补丁。 在回归方法中,整个图像通过卷积神经网络运行,直接生成图像中对象的一个或者多个边框。

    分类回归
    对图像部分进行分类以确定目标,为具有正分类结果的区域生成边界框。在整个图像上生成边界框的回归
    1.滑动窗口+ pig 2. 滑动窗口+ CNN 3。 区域建议+ CNN直接从CNN生成边界框坐标
    RCNN,快速 RCNN,快速 RCNNSSD,YOLO

    在这个项目中,我们将使用小型 yolo v1,因为它易于实现并且非常快。

    微型 yolo-v1

    基于的卷积神经网络结构

    微型 YOLO v1由 9个卷积层和 3全连接层组成。 每个卷积层由卷积。漏ReLU和最大池操作组成。 可以理解第 9个卷积层作为特征提取器,而最后3 个完全连接的层可以理解为预测边界框的"回归头"。

    model

    模型中总共有 45,089,374参数,该结构的详细信息在这里表中的列表中

    
    ____________________________________________________________________________________________________
    
    
    Layer (type) Output Shape Param # Connected to 
    
    
    ====================================================================================================
    
    
    convolution2d_1 (Convolution2D) (None, 16, 448, 448) 448 convolution2d_input_1[0][0] 
    
    
    ____________________________________________________________________________________________________
    
    
    leakyrelu_1 (LeakyReLU) (None, 16, 448, 448) 0 convolution2d_1[0][0] 
    
    
    ____________________________________________________________________________________________________
    
    
    maxpooling2d_1 (MaxPooling2D) (None, 16, 224, 224) 0 leakyrelu_1[0][0] 
    
    
    ____________________________________________________________________________________________________
    
    
    convolution2d_2 (Convolution2D) (None, 32, 224, 224) 4640 maxpooling2d_1[0][0] 
    
    
    ____________________________________________________________________________________________________
    
    
    leakyrelu_2 (LeakyReLU) (None, 32, 224, 224) 0 convolution2d_2[0][0] 
    
    
    ____________________________________________________________________________________________________
    
    
    maxpooling2d_2 (MaxPooling2D) (None, 32, 112, 112) 0 leakyrelu_2[0][0] 
    
    
    ____________________________________________________________________________________________________
    
    
    convolution2d_3 (Convolution2D) (None, 64, 112, 112) 18496 maxpooling2d_2[0][0] 
    
    
    ____________________________________________________________________________________________________
    
    
    leakyrelu_3 (LeakyReLU) (None, 64, 112, 112) 0 convolution2d_3[0][0] 
    
    
    ____________________________________________________________________________________________________
    
    
    maxpooling2d_3 (MaxPooling2D) (None, 64, 56, 56) 0 leakyrelu_3[0][0] 
    
    
    ____________________________________________________________________________________________________
    
    
    convolution2d_4 (Convolution2D) (None, 128, 56, 56) 73856 maxpooling2d_3[0][0] 
    
    
    ____________________________________________________________________________________________________
    
    
    leakyrelu_4 (LeakyReLU) (None, 128, 56, 56) 0 convolution2d_4[0][0] 
    
    
    ____________________________________________________________________________________________________
    
    
    maxpooling2d_4 (MaxPooling2D) (None, 128, 28, 28) 0 leakyrelu_4[0][0] 
    
    
    ____________________________________________________________________________________________________
    
    
    convolution2d_5 (Convolution2D) (None, 256, 28, 28) 295168 maxpooling2d_4[0][0] 
    
    
    ____________________________________________________________________________________________________
    
    
    leakyrelu_5 (LeakyReLU) (None, 256, 28, 28) 0 convolution2d_5[0][0] 
    
    
    ____________________________________________________________________________________________________
    
    
    maxpooling2d_5 (MaxPooling2D) (None, 256, 14, 14) 0 leakyrelu_5[0][0] 
    
    
    ____________________________________________________________________________________________________
    
    
    convolution2d_6 (Convolution2D) (None, 512, 14, 14) 1180160 maxpooling2d_5[0][0] 
    
    
    ____________________________________________________________________________________________________
    
    
    leakyrelu_6 (LeakyReLU) (None, 512, 14, 14) 0 convolution2d_6[0][0] 
    
    
    ____________________________________________________________________________________________________
    
    
    maxpooling2d_6 (MaxPooling2D) (None, 512, 7, 7) 0 leakyrelu_6[0][0] 
    
    
    ____________________________________________________________________________________________________
    
    
    convolution2d_7 (Convolution2D) (None, 1024, 7, 7) 4719616 maxpooling2d_6[0][0] 
    
    
    ____________________________________________________________________________________________________
    
    
    leakyrelu_7 (LeakyReLU) (None, 1024, 7, 7) 0 convolution2d_7[0][0] 
    
    
    ____________________________________________________________________________________________________
    
    
    convolution2d_8 (Convolution2D) (None, 1024, 7, 7) 9438208 leakyrelu_7[0][0] 
    
    
    ____________________________________________________________________________________________________
    
    
    leakyrelu_8 (LeakyReLU) (None, 1024, 7, 7) 0 convolution2d_8[0][0] 
    
    
    ____________________________________________________________________________________________________
    
    
    convolution2d_9 (Convolution2D) (None, 1024, 7, 7) 9438208 leakyrelu_8[0][0] 
    
    
    ____________________________________________________________________________________________________
    
    
    leakyrelu_9 (LeakyReLU) (None, 1024, 7, 7) 0 convolution2d_9[0][0] 
    
    
    ____________________________________________________________________________________________________
    
    
    flatten_1 (Flatten) (None, 50176) 0 leakyrelu_9[0][0] 
    
    
    ____________________________________________________________________________________________________
    
    
    dense_1 (Dense) (None, 256) 12845312 flatten_1[0][0] 
    
    
    ____________________________________________________________________________________________________
    
    
    dense_2 (Dense) (None, 4096) 1052672 dense_1[0][0] 
    
    
    ____________________________________________________________________________________________________
    
    
    leakyrelu_10 (LeakyReLU) (None, 4096) 0 dense_2[0][0] 
    
    
    ____________________________________________________________________________________________________
    
    
    dense_3 (Dense) (None, 1470) 6022590 leakyrelu_10[0][0] 
    
    
    ====================================================================================================
    
    
    Total params: 45,089,374
    
    
    Trainable params: 45,089,374
    
    
    Non-trainable params: 0
    
    
    ____________________________________________________________________________________________________
    
    
    
    

    在这个项目中,我们将使用Keras构建YOLO模型。

    后处理

    这个网络的输出是 1470矢量,它包含预测的边界框的信息。 这些信息按以下方式组织

    1470矢量输出分为三个部分,给出概率。置信度和方框坐标。 这三个部分又进一步划分为 49个小区域,对应于每一个单元的预测。 在后处理步骤中,我们从网络中获取 1470向量输出,以生成概率高于某个阈值的盒子。 这些步骤的细节在 utili 类中的yolo_net_out_to_car_boxes 函数中。

    使用pretrained权重

    培训YOLO网络是浪费时间。 我们将从这里下载pretrained权重,并将它的加载到我们的Keras模型。 权重加载函数在实用类中的load_weight 函数中

    
    load_weights(model,'./yolo-tiny.weights')
    
    
    
    

    请注意,tensorflow在这个项目中用于后台。

    结果

    下面显示了一些具有 0.17个阈值的测试图像的结果。 我们可以看到汽车被检测到:

    png

    这里的是将同一管道应用到视频的结果。

    讨论

    已知YOLO是快速的。 在最初的论文中,微型yolo被报告在一个强大的桌面GPU上工作近 200秒。 在这个项目中,视频是在 Nvidia 1070处处理的,而不是批处理的速率约为 21FS。

    引用


    Detect  检测  
    相关文章