自动驾驶-汽车检测(YOLO)

本文基于吴恩达的深度学习课程,利用YOLO算法进行车辆检测。介绍了YOLO模型的细节,包括模型结构、置信度阈值设置、非极大值抑制等,并详细阐述了测试YOLO算法的过程,从加载预训练模型到图像处理和边界框绘制。
摘要由CSDN通过智能技术生成

本文是基于吴恩达《深度学习》卷积神经网络第三周习题而做,通过建立YOLO模型进行目标检测。

所需的第三方库如下,可点击此处下载。

import argparse
import os
import matplotlib.pyplot as plt
from matplotlib.pyplot import imshow
import scipy.io
import scipy.misc
import numpy as np
import pandas as pd
import PIL
import tensorflow as tf
from keras import backend as K
from keras.layers import Input, Lambda, Conv2D
from keras.models import load_model, Model
from yolo_utils import read_classes, read_anchors, generate_colors, preprocess_image, draw_boxes, scale_boxes
from yad2k.model.keras_yolo import yolo_head, yolo_boxes_to_corners, preprocess_true_boxes, yolo_loss, yolo_body

Tips:from keras import backend as K意思是在使用keras函数时,需要以K.function(...)的形式表达。

1.问题描述

在自动驾驶项目中,首先需要建立的是车辆识别系统,通常收集数据的方式是通过装设在车顶的摄像头每个数秒拍摄一张路况照片。本程序数据有drive.ai提供。 对于每个样本图像都画出边界框标识出图中车辆位置,如下图所示:

如果需要识别的类型有80中,我们需要将c设置为一个整数,取值1-80;或者设置为一个80维向量。在该程序中,我们将了解到YOLO是如何工作,然后让该算法应用到车辆检测中,由于YOLO计算成本比较大,我们直接load事先训练好的网络权重。

2.YOLO算法 

YOLO的全称为You Only Look Once, 该算法是非常流行的算法,因为在实际应用中能够取得很高的精确度。该算法在预测时仅仅需要一次前向传播过程,在非极大值抑制处理后输出识别的标签和边界框。

2.1. 模型细节

  • 输入的shape是(m,608,608,3),是m个 (608,608,3)图像;
  • 输出为识别类和边界框的列表,每一个边界框由6个元素组成[P_c, b_x, b_y, b_h, b_w, c],如果将c展开成80维则边界框由85个元素组成
  • anchor boxes 数量为5,由宽和高的尺寸来定义
  • YOLO的结构:IMAGE(m, 608,608,3)-> Deep CNN -> Encoding(m, 19,19,5,85)

如果目标的中心落在某个格子中,那该格子负责识别目标。由于我们有5个anchor boxes ,且将输入图像分成19x19个格子,因此输出为(19,19,5,85),可将最后两维flatten得到深度卷积神经网络的最终输出维度为(19,19,425)。

因此对于每个格子中的每个anchor box值进行元素乘积,得到一个包含该目标为各类的概率值向量,如下图所示:

  •   可视化YOLO算法可视化方法一:根据预测值score给每个格子着色

  •    可视化YOLO算法可视化方法二:根据输出值画出边界框

第二种可视化方法会输出太多的边界框,因此需要进行非最大值抑制,分两步:

(1)去除低score值的框,即该框中检测到物体的概率不足信;

(2)当一个目标被多个框标识时,只保留最大的那个。

2.2 为score值设置阈值

 在YOLO算法中我们希望能够去除那些类的score值小于设定值的边框。模型输出值时19x19x5x85个数字,每个anchor box由85个数字描述,为了便于计算我们将输出的(19,19,5,85)的矩阵拆分成下述三个矩阵:

- box_confidence(19,19,5,1):19x19个cell中有5个anchor box,该变量存储其中各anchor box的P_c值;

- boxes(19,19,5,4):存储anchor box的4个尺寸参数,(b_x, b_y, b_h, b_w);

- box_class_probs(19,19,5,80):存储每个anchor box对80个类的预测值;

def yolo_filter_boxes(box_confidence, boxes, box_class_probs, threshold = .6):

    #setp1:compute box scores
    box_scores = box_confidence * box_class_probs

    #setp2:find the box_classes thanks to max box_scores, keep track of the corresponding scores
    box_classes = K.argmax(box_scores, axis = -1)
    box_class_scores = K.max(box_scores, axis = -1, keepdims=False)

    #step3:create a filtering mask
    filtering_mask = box_class_scores >= threshold

    #step4:apply the mask to scores, boxes and classes
    scores = tf.boolean_mask(box_class_scores, filtering_mask)
    boxes = tf.boolean_mask(boxes, filtering_mask)
    classes = tf.boolean_mask(box_classes, filtering_mask)

    return scores, boxes, classes
with tf.Session() as test_a:
    box_confidence = tf.random_normal([19, 19, 5, 1], mean=1, stddev=4, seed = 1)
    boxes = tf.random_normal([19, 19, 5, 4], mean=1, stddev=4, seed = 1)
    box_class_probs = tf.random_normal([19, 19, 5, 80], mean=1, stddev=4, seed = 1)
    scores, boxes, classes = yolo_filter_boxes(box_confidence, boxes, box_class_probs, threshold = 0.5)
    print("scores[2] = " + str(scores[2].eval()))
    print("boxes[2] = " + str(boxes[2].eval()))
    print("classes[2] = " + str(classes[2].eval()))
    print("scores.shape = " + str(scores.shape))
    print("boxes.shape = " + str(boxes.shape))
    print("classes.shape = " + str(classes.shape))
scores[2] = 10.750582
boxes[2] = [ 8.426533   3.2713668 -0.5313436 -4.9413733]
classes[2] = 7
scores.shape = (?,)
boxes.shape = (?, 4)
classes.shape = (?,)

2.3非极大值抑制

在上一步的过滤之后,我们仍剩下许多重复的边界框,因此我们需要使用non-max suppression进行第二次过滤。

在非极大值抑制算法中最重要的函数时交并比IoU,如下图所示:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值