动手学无人驾驶(2):车辆检测

上一篇博客介绍了无人驾驶中深度学习在交通标志识别中的应用(动手学无人驾驶(1):交通标志识别)。

本文介绍如何使用深度学习进行车辆检测,使用到的模型是YOLO模型,关于YOLO模型的具体检测原理,可以参考吴恩达老师的深度学习课程视频。课程链接是:https://www.deeplearning.ai/deep-learning-specialization/。

之前的一篇博客中也对YOLO的原理进行了详细介绍:13.深度学习练习:Autonomous driving - Car detection(YOLO实战)

目录

1.导入库和数据

2.分类过滤

3.非最大抑制

4.评估模型

5.测试

1)模型输出转换为可用边界框张量

2)选取最佳框

3)车辆检测

6.参考资料


1.导入库和数据

在本文中我们将使用到一个预训练模型,用它来检测数据集上的车辆

文件“ coco_classes.txt”和“ yolo_anchors.txt”中收集了有关80个类和5个定位框的信息。

首先是加载这些信息,同时为了方便处理,对图片进行了预处理(图片尺寸大小为720x1280)。

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.models.keras_yolo import yolo_head, yolo_boxes_to_corners, preprocess_true_boxes, yolo_loss, yolo_body%matplotlib inlineclass_names = read_classes("model_data/coco_classes.txt")
anchors = read_anchors("model_data/yolo_anchors.txt")
image_shape = (720., 1280.)    

2.分类过滤

因为最终输出为80个分类的预测,这里需要对其进行过滤,即选取预测概率值前五的类别。

yolo_filter_boxes函数中定义了以下参数:阈值这里为0.6

  • box_confidence:形状为含有pc的张量(19x19,5,1),pc表示所预测的5个boxes中含有目标;
  • boxes: 形状为含有(bx,by,bh,bw)的张量(19x19,5,4);
  • box_class_probs: 形状为含有(c1,c2,...,c80)的张量(19×19,5,80), c1,c2,...c80表示为预测类别的概率。
def yolo_filter_boxes(box_confidence, boxes, box_class_probs, threshold = .6):"""返回值:scores -- 得分boxes --  最终选出的锚盒classes -- 预测类别"""# Step 1: 计算得分box_scores = box_confidence * box_class_probs# Step 2: 根据得分选取类别box_classes = K.argmax(box_scores, axis = -1)box_class_scores = K.max(box_scores, axis = -1)# Step 3:根据阈值设置maskfiltering_mask = (box_class_scores > threshold )# Step 4: 最终预测结果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

3.非最大抑制

在上一节的阈值过滤后,会存在许多相互重叠的框,如下图所示。 为了选择最正确的目标框这里需要用到第二个过滤器:即非最大抑制(NMS)。

非最大抑制使用名为IOU的函数:

在此代码中,我们使用以下约定:(0,0)是图像的左上角,(1,0)是右上角,(1,1)是右下角。

def iou(box1, box2):"""参数s:box1 -- first box, list object with coordinates (x1, y1, x2, y2)box2 -- second box, list object with coordinates (x1, y1, x2, y2)"""# 重叠区域面积xi1 = np.maximum(box1[0], box2[0])yi1 = np.maximum(box1[1], box2[1])xi2 = np.minimum(box1[2], box2[2])yi2 = np.minimum(box1[3], box2[3])inter_area = (xi2 - xi1)*(yi2 - yi1)# 整个区域面积box1_area = (box1[2] - box1[0]) * (box1[3] - box1[1])box2_area = (box2[2] - box2[0]) * (box2[3] - box2[1])union_area = box2_area + box1_area - inter_area# 输出IOUiou = inter_area / union_areareturn iou

现在对上一节输出的结果进行非最大值抑制:

def yolo_non_max_suppression(scores, boxes, classes, max_boxes = 10, iou_threshold = 0.5):"""参数:scores -- tensor of shape (None,), output of yolo_filter_boxes()boxes -- tensor of shape (None, 4), output of yolo_filter_boxes() that have been scaled to the image size (see later)classes -- tensor of shape (None,), output of yolo_filter_boxes()max_boxes -- integer, maximum number of predicted boxes you'd likeiou_threshold -- real value, "intersection over union" threshold used for NMS filtering返回值:scores -- tensor of shape (, None), predicted score for each boxboxes -- tensor of shape (4, None), predicted box coordinatesclasses -- tensor of shape (, None), predicted class for each box"""max_boxes_tensor = K.variable(max_boxes, dtype='int32')     # tensor to be used in tf.image.non_max_suppression()K.get_session().run(tf.variables_initializer([max_boxes_tensor])) # initialize variable max_boxes_tensor# Use tf.image.non_max_suppression() to get the list of indices corresponding to boxes you keepnms_indices = tf.image.non_max_suppression(boxes, scores, max_boxes, iou_threshold)# Use K.gather() to select only nms_indices from scores, boxes and classesscores = K.gather(scores, nms_indices)boxes = K.gather(boxes, nms_indices)classes = K.gather(classes, nms_indices)return scores, boxes, classes

4.评估模型

运用之前编写的函数进行模型评估。

def yolo_eval(yolo_outputs, image_shape = (720., 1280.), max_boxes=10, score_threshold=.6, iou_threshold=.5):""" 参数s:yolo_outputs -- output of the encoding model (for image_shape of (608, 608, 3)), contains 4 tensors:box_confidence: tensor of shape (None, 19, 19, 5, 1)box_xy: tensor of shape (None, 19, 19, 5, 2)box_wh: tensor of shape (None, 19, 19, 5, 2)box_class_probs: tensor of shape (None, 19, 19, 5, 80)image_shape -- tensor of shape (2,) containing the input shape, in this notebook we use (608., 608.) (has to be float32 dtype)max_boxes -- integer, maximum number of predicted boxes you'd likescore_threshold -- real value, if [ highest class probability score < threshold], then get rid of the corresponding boxiou_threshold -- real value, "intersection over union" threshold used for NMS filtering返回值:scores -- tensor of shape (None, ), predicted score for each boxboxes -- tensor of shape (None, 4), predicted box coordinatesclasses -- tensor of shape (None,), predicted class for each box"""# YOLO模型的输出box_confidence, box_xy, box_wh, box_class_probs = yolo_outputs# 输出boxesboxes = yolo_boxes_to_corners(box_xy, box_wh)# 阈值过滤scores, boxes, classes = yolo_filter_boxes(box_confidence, boxes, box_class_probs, score_threshold)# Scale boxes back to original image shape.boxes = scale_boxes(boxes, image_shape)# 非最大值抑制scores, boxes, classes = yolo_non_max_suppression(scores, boxes, classes, max_boxes, iou_threshold)return scores, boxes, classes

5.测试

训练YOLO模型需要花费很长时间,并且需要带有目标类别的标记边界框的数据集。

这里选择加载存储在“ yolo.h5”中的现有预训练的Keras YOLO模型。 (这些权重来自YOLO官方网站,并使用Allan Zelener编写的函数进行了转换。)

yolo_model = load_model("model_data/yolov2.h5")yolo_model.summary()

1)模型输出转换为可用张量

yolo_model的输出是(m,19,19,5,85)张量。

yolo_outputs = yolo_head(yolo_model.output, anchors, len(class_names))

2)选取最佳框

yolo_outputs以正确格式提供了yolo_model的所有预测框。 现在,可以执行过滤并仅选择最佳框。

scores, boxes, classes = yolo_eval(yolo_outputs, image_shape)

3)车辆检测

下面是整个的处理过程:

  •      yolo_model.input被赋予yolo_model。 该模型用于计算输出yolo_model.output
  •      yolo_model.output由yolo_head处理。 给出yolo_outputs
  •      yolo_outputs通过过滤功能yolo_eval。 它输出预测:分数,方框,类

下面给出预测代码,以及检测结果。

def predict(sess, image_file):"""  参数:sess -- your tensorflow/Keras session containing the YOLO graphimage_file -- name of an image stored in the "images" folder.返回:out_scores -- tensor of shape (None, ), scores of the predicted boxesout_boxes -- tensor of shape (None, 4), coordinates of the predicted boxesout_classes -- tensor of shape (None, ), class index of the predicted boxes"""# 图片预处理image, image_data = preprocess_image("images/" + image_file, model_image_size = (608, 608))out_scores, out_boxes, out_classes = sess.run([scores, boxes, classes], feed_dict = {yolo_model.input:image_data, K.learning_phase(): 0})# 打印预测信息print('Found {} boxes for {}'.format(len(out_boxes), image_file))# Generate colors for drawing bounding boxes.colors = generate_colors(class_names)# Draw bounding boxes on the image filedraw_boxes(image, out_scores, out_boxes, out_classes, class_names, colors)# Save the predicted bounding box on the imageimage.save(os.path.join("out", image_file), quality=90)# Display the results in the notebookoutput_image = scipy.misc.imread(os.path.join("out", image_file))imshow(output_image)return out_scores, out_boxes, out_classes


6.参考资料

  • Joseph Redmon, Santosh Divvala, Ross Girshick, Ali Farhadi - You Only Look Once: Unified, Real-Time Object Detection (2015)
  • Joseph Redmon, Ali Farhadi - YOLO9000: Better, Faster, Stronger (2016)
  • Allan Zelener - YAD2K: Yet Another Darknet 2 Keras
  • The official YOLO website (YOLO: Real-Time Object Detection)
     

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/439781.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《操作系统真象还原》-阅读笔记(下)

第十一章 任意进程的页目录表第0~767个页目录项属于用户空间&#xff0c;指向用户页表。第768~1023个页目录项指向内核页表。每创建一个新的用户进程,就将内核页目录项复制到用户进程的页目录表&#xff0c;其次需要把用户页目录表中最后一个页目录项更新为用户进程自己的页目…

Apollo进阶课程㊱丨Apollo ROS深入介绍

原文链接&#xff1a;进阶课程㊱丨Apollo ROS深入介绍 ROS是一个强大而灵活的机器人编程框架&#xff0c;从软件构架的角度说&#xff0c;它是一种基于消息传递通信的分布式多进程框架。ROS本身是基于消息机制的&#xff0c;可以根据功能把软件拆分成为各个模块&#xff0c;每…

一步步编写操作系统 31 cpu的分支预测 下

让我们说说预测的算法吧。 对于无条件跳转&#xff0c;没啥可犹豫的&#xff0c;直接跳过去就是了。所谓的预测是针对有条件跳转来说的&#xff0c;因为不知道条件成不成立。最简单的统计是根据上一次跳转的结果来预测本次&#xff0c;如果上一次跳转啦&#xff0c;这一次也预…

Apollo进阶课程㊲丨Apollo自动驾驶架构介绍

原文链接&#xff1a;进阶课程㊲丨Apollo自动驾驶架构介绍 自动驾驶硬件架构&#xff1a;一般采用激光雷达作为主要感知传感器&#xff0c;同时结合摄像头、GPS/IMU、毫米波雷达、超声波雷达等&#xff0c;以NVIDIA Drive PX2 或 Xavier作为主要计算平台&#xff0c;在工业PC机…

Apollo进阶课程㊳丨Apollo平台的快速入门

原文链接&#xff1a;进阶课程㊳丨Apollo平台的快速入门 Apollo是向汽车行业及自动驾驶领域的合作伙伴提供一个开放、完整、安全的软件平台&#xff0c;帮助他们结合车辆和硬件系统&#xff0c;快速搭建一套属于自己的完整的自动驾驶系统。 上周阿波君为大家详细介绍了「进阶课…

一步步编写操作系统 33 利用bios中断0x15子功能0xe820获取内存

咱们先介绍0xE820子功能&#xff0c;这是最灵活的内存获取方式。 bios中断 0x15的子功能0xE820能够获取系统的内存布局&#xff0c;由于系统内存各部分的类型属性不同&#xff0c;bios就按照类型属性来划分这片系统内存&#xff0c;所以这种查询则呈迭代式&#xff0c;每次bio…

16.深度学习练习:Building your Recurrent Neural Network - Step by Step

本文节选自吴恩达老师《深度学习专项课程》编程作业&#xff0c;在此表示感谢。课程链接&#xff1a;https://www.deeplearning.ai/deep-learning-specialization/Building your Recurrent Neural Network - Step by Step1 - Forward propagation for the basic Recurrent Neur…

【2019icpc徐州站】Random Access Iterator(概率dp,有坑,tricks)

题干&#xff1a; Recently Kumiko learns to use containers in C standard template library. She likes to use the std::vector very much. It is very convenient for her to do operations like an ordinary array. However, she is concerned about the random-access…

一步步编写操作系统 34 内核利用bios中断获取物理内存大小

接上文&#xff0c;另一个获取内存容量的方法是bios 0x15中断的子功能0xE801。 此方法虽然简单&#xff0c;但功能也不强大&#xff0c;最大只能识别4G内存&#xff0c;不过这对咱们32位地址总线足够了。稍微有点不便的是&#xff0c;此方法检测到的内存是分别存放到两组寄存器…

17.深度学习练习:Character level language model - Dinosaurus land

本文节选自吴恩达老师《深度学习专项课程》编程作业&#xff0c;在此表示感谢。 课程链接&#xff1a;https://www.deeplearning.ai/deep-learning-specialization/ 文章目录1 - Problem Statement1.1 - Dataset and Preprocessing1.2 - Overview of the model2 - Building blo…

Apollo进阶课程㊴丨Apollo安装过程概述

原文链接&#xff1a;进阶课程㊴丨Apollo安装过程概述 Apollo是一个自动驾驶的平台&#xff0c;推荐的参考运行环境为&#xff1a;ThinkPAD X240、CPU&#xff1a;i5 、四核 、内存 8G、 硬盘容量40G以上。 上周阿波君为大家详细介绍了「进阶课程㊳丨Apollo平台的快速入门」。 …

UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)

继承、实现、依赖、关联、聚合、组合的联系与区别 分别介绍这几种关系&#xff1a; 继承 指的是一个类&#xff08;称为子类、子接口&#xff09;继承另外的一个类&#xff08;称为父类、父接口&#xff09;的功能&#xff0c;并可以增加它自己的新功能的能力&#xff0c;继…

CS231n(1):图片分类笔记与KNN编程作业

声明&#xff1a;本博客笔记部分为CS231n官网笔记&#xff0c;这里对其进行引用&#xff0c;在此表示感谢。 课程官网地址为&#xff1a;http://vision.stanford.edu/teaching/cs231n/syllabus.html 本次课程对应B站教学视频为&#xff1a; https://www.bilibili.com/video/av5…

【HDU - 6557】Justice(思维,模拟,套路,SETset)

题干&#xff1a; On the table there are n weights. On the body of the i-th weight carved a positive integer kiki , indicating that its weight is 12ki12ki gram. Is it possible to divide the n weights into two groups and make sure that the sum of the weight…

Apollo进阶课程㊵丨Azure仿真平台使用

原文链接&#xff1a;进阶课程㊵丨Azure仿真平台使用 Azure是一种灵活和支持互操作的平台&#xff0c;它可以被用来创建云中运行的应用或者通过基于云的特性来加强现有应用。它开放式的架构给开发者提供了Web应用、互联设备的应用、个人电脑、服务器、或者提供最优在线复杂解决…

java 泛型详解-绝对是对泛型方法讲解最详细的,没有之一

对java的泛型特性的了解仅限于表面的浅浅一层&#xff0c;直到在学习设计模式时发现有不了解的用法&#xff0c;才想起详细的记录一下。本文参考java 泛型详解、Java中的泛型方法、 java泛型详解 1. 概述 泛型在java中有很重要的地位&#xff0c;在面向对象编程及各种设计模式…

动手学无人驾驶(3):基于激光雷达3D多目标追踪

上一篇博客介绍了无人驾驶中的车辆检测算法&#xff08;YOLO模型&#xff09;&#xff0c;该检测是基于图像进行的2D目标检测。在无人驾驶环境感知传感器中还有另一种重要的传感器&#xff1a;激光雷达。今天就介绍一篇无人驾驶中基于激光雷达目标检测的3D多目标追踪论文&#…

换种方法学操作系统,轻松入门Linux内核

计算机已成为现代人日常工作、学习和生活中必不可少的工具。操作系统是计算机之魂&#xff0c;作为用户使用计算机的接口&#xff0c;它负责调度执行各个用户程序&#xff0c;使计算机完成特定的任务&#xff1b;作为计算机硬件资源的管理者&#xff0c;它负责协调计算机中各类…

Apollo进阶课程㊶丨Apollo实战——本机演示实战

原文链接&#xff1a;进阶课程㊶丨Apollo实战——本机演示实战 Apollo是一个开放的、完整的、安全的平台&#xff0c;将帮助汽车行业及自动驾驶领域的合作伙伴结合车辆和硬件系统&#xff0c;快速搭建一套属于自己的自动驾驶系统。 上周阿波君为大家详细介绍了「进阶课程㊵丨A…

java常见异常类图(分类了Error/RuntimeExecption、check Exception)

Error&#xff1a;表示由JVM所侦测到的无法预期的错误&#xff0c;由于这是属于JVM层次的严重错误&#xff0c;导致JVM无法继续执行&#xff0c;因此&#xff0c;这是不可捕捉到的&#xff0c;无法采取任何恢复的操作&#xff0c;顶多只能显示错误信息。Exception&#xff1a;表…