Giter Club home page Giter Club logo

vehicle-detection's Introduction

自动驾驶车辆检测

客观的

车辆检测系统演示:使用单目摄像头检测车辆。

gif_演示1 gif_演示1

(2) City Drive(仅车辆检测)(点击查看完整视频)

gif_演示2 gif_演示2


代码和文件

1.我的项目包含以下文件


其他与车道偏离警告系统存储库中的相同:

2. 依赖关系和我的环境

Anaconda 用于管理我的依赖项

  • 您可以使用提供的environment-gpu.yml来安装依赖项。
  • OpenCV3、Python3.5、张量流、CUDA8
  • 操作系统:Ubuntu 16.04

3.如何运行代码

(1)下载YOLO的权重

您可以从此处下载权重并将其保存到权重文件夹中。

(2) 如果你想运行demo,你可以简单地运行:

python main.py

4. 发布历史

  • 0.1.1

    • 修复两个小bug并更新文档
    • 日期 2017 年 4 月 18 日
  • 0.1.0

    • 第一次正确发布
    • 日期 2017 年 3 月 31 日

两种方法:线性 SVM 与神经网络

1. 线性SVM方法

svm_pipeline.py包含 svm 管道的代码。

脚步:

  • 对带标签的图像训练集执行定向梯度直方图 (HOG) 特征提取并训练分类器 线性 SVM 分类器
  • 对图像应用颜色变换,并将分箱颜色特征以及颜色直方图附加到 HOG 特征向量。
  • 标准化您的特征并随机选择训练和测试。
  • 实现滑动窗口技术并使用 SVM 分类器来搜索图像中的车辆。
  • 在视频流上运行管道,并逐帧创建重复检测的热图,以拒绝异常值并跟踪检测到的车辆。
  • 估计检测到的车辆的边界框。

1.1 从训练图像中提取定向梯度直方图(HOG)

此步骤的代码包含extract_featuressvm_pipeline.py. 如果SVM分类器存在,则直接加载。

除此之外,我首先阅读所有vehiclenon-vehicle图像,每个类别大约 8000 张图像。这些数据集由取自GTI 车辆图像数据库KITTI 视觉基准套件的图像组成。vehicle以下是每个和类之一的示例non-vehicle

替代文本

然后我探索了不同的色彩空间和不同的skimage.hog()参数(orientationspixels_per_cellcells_per_block)。我从两个类中的每一个中抓取了随机图像并显示它们以了解输出的样子skimage.hog()

以下是使用、和 的RGB颜色空间和 HOG 参数的示例:orientations=9pixels_per_cell=(8, 8)cells_per_block=(2, 2)

替代文本 替代文本

为了优化HoG提取,我只为整个图像提取一次HoG特征。然后保存整个 HoG 图像以供进一步处理。(参见第 319 至 321 行 svm_pipeline.py

1.2 HOG参数、空间特征和颜色直方图的最终选择。

我尝试了各种参数组合并选择最终组合如下(参见第 16-27 行svm_pipeline.py):

  • YCrCb色彩空间
  • orient = 9 # HOG 方向
  • pix_per_cell = 8 # 每个单元的 HOG 像素
  • cell_per_block = 2 # 每个块的 HOG 单元,可以处理阴影等
  • hog_channel = "ALL" # 可以是 0、1、2 或 "ALL"
  • Spatial_size = (32, 32) # 空间分箱维度
  • hist_bins = 32 # 直方图箱的数量
  • Spatial_feat = True # 空间特征打开或关闭
  • hist_feat = True # 直方图功能打开或关闭
  • hog_feat = True # HOG 功能打开或关闭

所有特征均由 中的第 511 至 513 行进行归一化svm_pipeline.py,这是关键的一步。否则,分类器可能会对权重较高的特征有一定的偏向。

1.3. 如何训练分类器

我随机选择 20% 的图像进行测试,其他图像进行训练,并使用线性 SVM 作为分类器(参见 中的第 520 到 531 行svm_pipeline.py

1.4 滑动窗口搜索

对于这种基于 SVM 的方法,我使用两个尺度的搜索窗口(64x64 和 128x128,请参见第 41 行),并且仅在 y 轴的 [400, 656] 之间搜索(请参见 中的第 32 行svm_pipeline.py)。我为每个尺度的搜索窗口选择 75% 的重叠(参见 中的第 314 行svm_pipeline.py)。

对于每个窗口,SVM 分类器用于预测它是否包含汽车。如果是,则保存该窗口(参见 中的第 361 至 366 行svm_pipeline.py)。最后,获得包含检测到的汽车的窗口列表。

替代文本

1.5 创建检测车辆的热图

在获得可能包含汽车的窗口列表后,使用名为generate_heatmap(在第 565 行中 )的函数来生成热图。svm_pipeline.py然后使用阈值来过滤掉误报。

热图 热图

1.6 图像与视频实现

对于 image,我们可以直接使用过滤热图的结果来创建检测到的车辆的边界框。

对于视频,我们可以进一步利用相邻帧来过滤误报,以及平滑边界框的位置。

  • 累积前 N 帧的热图。
  • 将权重应用于 N 个先前帧:较旧的帧使用较小的权重(第 398 至 399 行svm_pipeline.py)。
  • 然后,我应用阈值并用于scipy.ndimage.measurements.label()识别热图中的各个斑点。
  • 然后,我假设每个斑点对应于一辆车辆,并构造边界框以覆盖检测到的每个斑点的区域。

测试图像示例

替代文本


2. 神经网络方法(YOLO)

yolo_pipeline.py包含 yolo 管道的代码。

YOLO是一个基于神经网络的目标检测管道。与之前使用分类器执行检测的对象检测工作相比,YOLO 将对象检测视为空间分离的边界框和相关类概率的回归问题。单个神经网络在一次评估中直接从完整图像预测边界框和类别概率。由于整个检测管道是单个网络,因此可以直接在检测性能上进行端到端优化。

替代文本

使用YOLO进行检测的步骤:

  • 将输入图像大小调整为 448x448
  • 在图像上运行单个卷积网络
  • 根据模型的置信度设置检测结果的阈值

替代文本

yolo_pipeline.py是基于YOLO的这个tensorflow实现进行修改和集成的。由于 YOLO 已知“汽车”,因此我直接使用预先计算的权重并将其应用于整个输入帧。

测试图像示例

替代文本


讨论

对于基于 SVM 的方法,精度很好,但速度(2 fps)是一个问题,因为滑动窗口方法非常耗时!我们可以使用图像下采样、多线程或 GPU 处理来提高速度。但是,可能需要完成很多工程工作才能使其实时运行。另外,在这个应用程序中,我限制垂直搜索范围以控制搜索窗口的数量,并避免一些误报(例如树上的汽车)。

对于基于YOLO的方法,它实现了实时性并且准确率相当令人满意。仅在某些情况下,可能无法检测到远处的小车缩略图。我的直觉是,原始输入图像的分辨率为 1280x720,需要缩小到 448x448,因此远处的汽车会很小,并且在缩小后的图像 (448x448) 中可能会相当扭曲。为了正确识别远处的汽车,我们可能需要裁剪图像而不是直接缩小图像,或者重新训练网络。

vehicle-detection's People

Contributors

junshengfu avatar yuanzhongqiao avatar

Stargazers

Sun Shuwei avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.