(1) 高速公路行驶(带车道偏离警告)(点击查看完整视频)
(2) City Drive(仅车辆检测)(点击查看完整视频)
- main.py是demo的主要代码
- svm_pipeline.py是带有 SVM 的汽车检测管道
- yolo_pipeline.py是带有深网YOLO(You Only Look Once)的汽车检测管道
- Visualization.py是添加visalization的函数
其他与车道偏离警告系统存储库中的相同:
- Calibration.py包含校准相机并保存校准结果的脚本
- Lane.py包含车道类
- 示例文件夹包含示例图像和视频
Anaconda 用于管理我的依赖项。
- 您可以使用提供的environment-gpu.yml来安装依赖项。
- OpenCV3、Python3.5、张量流、CUDA8
- 操作系统:Ubuntu 16.04
(1)下载YOLO的权重
(2) 如果你想运行demo,你可以简单地运行:
python main.py
-
0.1.1
- 修复两个小bug并更新文档
- 日期 2017 年 4 月 18 日
-
0.1.0
- 第一次正确发布
- 日期 2017 年 3 月 31 日
svm_pipeline.py
包含 svm 管道的代码。
脚步:
- 对带标签的图像训练集执行定向梯度直方图 (HOG) 特征提取并训练分类器 线性 SVM 分类器
- 对图像应用颜色变换,并将分箱颜色特征以及颜色直方图附加到 HOG 特征向量。
- 标准化您的特征并随机选择训练和测试。
- 实现滑动窗口技术并使用 SVM 分类器来搜索图像中的车辆。
- 在视频流上运行管道,并逐帧创建重复检测的热图,以拒绝异常值并跟踪检测到的车辆。
- 估计检测到的车辆的边界框。
此步骤的代码包含extract_features
在svm_pipeline.py
. 如果SVM分类器存在,则直接加载。
除此之外,我首先阅读所有vehicle
和non-vehicle
图像,每个类别大约 8000 张图像。这些数据集由取自GTI 车辆图像数据库和
KITTI 视觉基准套件的图像组成。vehicle
以下是每个和类之一的示例non-vehicle
:
然后我探索了不同的色彩空间和不同的skimage.hog()
参数(orientations
、pixels_per_cell
和cells_per_block
)。我从两个类中的每一个中抓取了随机图像并显示它们以了解输出的样子skimage.hog()
。
以下是使用、和 的RGB
颜色空间和 HOG 参数的示例:orientations=9
pixels_per_cell=(8, 8)
cells_per_block=(2, 2)
为了优化HoG提取,我只为整个图像提取一次HoG特征。然后保存整个 HoG 图像以供进一步处理。(参见第 319 至 321 行 svm_pipeline.py
)
我尝试了各种参数组合并选择最终组合如下(参见第 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
,这是关键的一步。否则,分类器可能会对权重较高的特征有一定的偏向。
我随机选择 20% 的图像进行测试,其他图像进行训练,并使用线性 SVM 作为分类器(参见 中的第 520 到 531 行svm_pipeline.py
)
对于这种基于 SVM 的方法,我使用两个尺度的搜索窗口(64x64 和 128x128,请参见第 41 行),并且仅在 y 轴的 [400, 656] 之间搜索(请参见 中的第 32 行svm_pipeline.py
)。我为每个尺度的搜索窗口选择 75% 的重叠(参见 中的第 314 行svm_pipeline.py
)。
对于每个窗口,SVM 分类器用于预测它是否包含汽车。如果是,则保存该窗口(参见 中的第 361 至 366 行svm_pipeline.py
)。最后,获得包含检测到的汽车的窗口列表。
在获得可能包含汽车的窗口列表后,使用名为generate_heatmap
(在第 565 行中
)的函数来生成热图。svm_pipeline.py
然后使用阈值来过滤掉误报。
对于 image,我们可以直接使用过滤热图的结果来创建检测到的车辆的边界框。
对于视频,我们可以进一步利用相邻帧来过滤误报,以及平滑边界框的位置。
- 累积前 N 帧的热图。
- 将权重应用于 N 个先前帧:较旧的帧使用较小的权重(第 398 至 399 行
svm_pipeline.py
)。 - 然后,我应用阈值并用于
scipy.ndimage.measurements.label()
识别热图中的各个斑点。 - 然后,我假设每个斑点对应于一辆车辆,并构造边界框以覆盖检测到的每个斑点的区域。
yolo_pipeline.py
包含 yolo 管道的代码。
YOLO是一个基于神经网络的目标检测管道。与之前使用分类器执行检测的对象检测工作相比,YOLO 将对象检测视为空间分离的边界框和相关类概率的回归问题。单个神经网络在一次评估中直接从完整图像预测边界框和类别概率。由于整个检测管道是单个网络,因此可以直接在检测性能上进行端到端优化。
使用YOLO进行检测的步骤:
- 将输入图像大小调整为 448x448
- 在图像上运行单个卷积网络
- 根据模型的置信度设置检测结果的阈值
yolo_pipeline.py
是基于YOLO的这个tensorflow实现进行修改和集成的。由于 YOLO 已知“汽车”,因此我直接使用预先计算的权重并将其应用于整个输入帧。
对于基于 SVM 的方法,精度很好,但速度(2 fps)是一个问题,因为滑动窗口方法非常耗时!我们可以使用图像下采样、多线程或 GPU 处理来提高速度。但是,可能需要完成很多工程工作才能使其实时运行。另外,在这个应用程序中,我限制垂直搜索范围以控制搜索窗口的数量,并避免一些误报(例如树上的汽车)。
对于基于YOLO的方法,它实现了实时性并且准确率相当令人满意。仅在某些情况下,可能无法检测到远处的小车缩略图。我的直觉是,原始输入图像的分辨率为 1280x720,需要缩小到 448x448,因此远处的汽车会很小,并且在缩小后的图像 (448x448) 中可能会相当扭曲。为了正确识别远处的汽车,我们可能需要裁剪图像而不是直接缩小图像,或者重新训练网络。