一、项目介绍
在这个项目中,将创建一个卷积神经网络,使用Waymo的数据集来检测和分类物体。您将获得一个城市环境图像数据集,其中包含带标注的骑自行车者、行人和车辆。
首先,执行广泛的数据分析,包括标签分布的计算,样本图像的显示,并检查对象遮挡。
来自Waymo数据集的夜间图像示例,带有针对车辆和行人的标注
使用此分析决定哪些增强对该项目有意义;然后,训练一个神经网络来检测和分类对象。
使用TensorBoard监控训练,并决定何时结束。最后,尝试使用不同的超参数来提高模型的性能。
这个项目将包括使用TensorFlow对象检测API(TensorFlow Object Detection API),在此可以部署模型来获得对发送到API的图像的预测;还会提供相关代码,用于创建模型预测的短视频。
二、环境配置
建立项目
本地设置:使用以下的说明来创建Docker容器,使用本地GPU,或者在云提供商的GPU实例上创建一个类似的环境。
项目文件
首先,从相关的Github存储库获取项目文件 (https://github.com/udacity/nd013-c1-vision-starter)
。
Docker安装
对于本地安装,如果你有自己的Nvidia GPU,可以在starter代码的构建目录中使用提供的Dockerfile和需求。
下面的说明也包含在starter代码的构建(Build)目录中。
需求
构建(Build)
使用以下指令:
docker build -t project-dev -f Dockerfile .
创建一个容器:
docker run --gpus all -v
以及对系统有用的任何其他标志(例如,——shm-size)。
设置
一旦进入容器,需要安装gsutil,通过运行:
Curl https://sdk.cloud.google.com | bash
一旦安装了gsutil并将其添加到您的路径中,可以使用以下命令进行验证:
gcloud auth login
调试(Debug)
三、项目说明
城市环境中的目标检测(GitHub - udacity/nd013-c1-vision-starter: Starter Code for the Course 1 project of the Udacity Self-Driving Car Engineer Nanodegree Program)
对于本地安装,如果你有自己的Nvidia GPU,可以使用build目录中(https://github.com/udacity/nd013-c1-vision-starter/tree/main/build)提供的Dockerfile和需求。
按照其中的README(nd013-c1-vision-starter/build/README.md at main · udacity/nd013-c1-vision-starter · GitHub)创建docker容器并安装所有先决条件。
对于这个项目,我们将使用data来自 Waymo Open dataset.
这些文件可以直接从网站以tar文件的形式下载,也可以来自 Google Cloud Bucket 作为个体 tf records.。
这个项目的第一个目标是将数据从Waymo的谷歌云存储下载到本地机器上。对于这个项目,我们只需要提供数据的一个子集(例如,不需要使用Lidar数据)。因此,我们将下载并立即修剪每个文件。在download_process.py
, 可以查看create_tf_example函数,它将执行此处理。 该函数获取Waymo Tf record组件,并将其保存为Tf对象检测api格式(Tf Object Detection api)。下面描述一个这样的函数的例子(Training Custom Object Detector — TensorFlow 2 Object Detection API tutorial documentation)。 我们已经提供了label_map.pbtxt
文件。
运行脚本的命令如下:
python download_process.py --data_dir {processed_file_location} --size {number of files you want to download}
下载100个文件 (除非改变size参数) ! 脚本完成后,可以查看data_dir文件夹,看看文件是否已经下载并正确处理。
结构
数据
将用于训练、验证和测试的数据可以组织如下:
通过完成并执行create_split .py文件,将把下载的数据分成训练集、验证集和测试集。
实验
实验文件夹将按如下方式组织:
experiments/
- pretrained_model/
- exporter_main_v2.py
- to create an inference model
- model_main_tf2.py
- to launch training
- reference/
- reference training with the unchanged config file
- experiment0/
- create a new folder for each experiment you run
- experiment1/
- create a new folder for each experiment you run
- experiment2/
- create a new folder for each experiment you run
- label_map.pbtxt
...
步骤1a -探索性数据分析(EDA)
使用/home/workspace/data/目录中已经存在的数据来探索数据集!这是任何机器学习项目中最重要的任务。
display_images函数的期望输出
参考这个分析来创建不同的测试(训练和验证集)。
步骤1b -创建训练-验证分割
我们讨论了交叉验证以及创建有意义的训练和验证分割的重要性。对于这个项目,必须使用位于/home/workspace/data/中的文件创建相关训练、验证和测试集。create_split .py文件中的split函数执行以下操作:
创建三个子文件夹:/home/workspace/data/train/、/home/workspace/data/val/和/home/workspace/data/test/
函数实现后,使用以下命令运行脚本:
python create_splits.py --data-dir /home/workspace/data
还可以使用任何其他方法将数据划分为训练、验证和测试。
步骤2—编辑配置文件
现在可以开始训练,Tf对象检测API依赖于配置文件。在这个项目中使用的配置是pipeline. config,为Resnet 50 640x640型号的SSD设备配置。可以在这里(https://arxiv.org/pdf/1512.02325.pdf)了解更多关于单发探测器的信息。
cd /home/workspace/experiments/pretrained_model/
wget http://download.tensorflow.org/models/object_detection/tf2/20200711/ssd_resnet50_v1_fpn_640x640_coco17_tpu-8.tar.gz
tar -xvzf ssd_resnet50_v1_fpn_640x640_coco17_tpu-8.tar.gz
rm -rf ssd_resnet50_v1_fpn_640x640_coco17_tpu-8.tar.gz
我们需要编辑配置文件来更改训练和验证文件的位置,以及预训练权重的label_map文件的位置。我们还需要调整 batch size。为此,执行以下命令:
cd /home/workspace/
python edit_config.py --train_dir /home/workspace/data/train/ --eval_dir /home/workspace/data/val/ --batch_size 2 --checkpoint /home/workspace/experiments/pretrained_model/ssd_resnet50_v1_fpn_640x640_coco17_tpu-8/checkpoint/ckpt-0 --label_map /home/workspace/experiments/label_map.pbtxt
一个名为pipeline_new. config的新配置文件将在/home/workspace/目录下创建。将该文件移动到/home/workspace/experiments/reference/目录下。
步骤3 -模型训练和评估
启动训练流程:
python experiments/model_main_tf2.py --model_dir=experiments/reference/ --pipeline_config_path=experiments/reference/pipeline_new.config
要监视训练,可以通过运行python -m tensorboard. main --logdir experiments/reference/启动一个tensorboard实例。在书面报告中报告你的发现。日志如下图所示:
Tensorboard训练日志
训练结束后,启动评估流程。与训练过程并行启动评估过程将导致工作空间中的OOM错误。
python experiments/model_main_tf2.py --model_dir=experiments/reference/ --pipeline_config_path=experiments/reference/pipeline_new.config --checkpoint_dir=experiments/reference/
默认情况下,评估脚本只运行一个epoch。因此,Tensorboard中的eval日志将看起来像一个蓝点。
注意:两个进程都会显示一些Tensorflow警告,可以忽略。您可能必须使用CTRL+C手动终止评估脚本。
步骤4 -提升表现
最有可能的是,这个最初的实验没有产生最佳结果。但是,您可以对配置文件进行多次更改以改进此模型。
一个明显的变化是改进了数据增强策略。preprocessor. proto(https://github.com/tensorflow/models/blob/master/research/object_detection/protos/preprocessor.proto)文件包含Tf对象检测API中可用的不同数据增强方法。为了帮助可视化这些增强,提供了一个notebook:Explore augments .ipynb。使用该notebook,尝试不同的数据增强组合,并选择认为最适合的数据集的组合。在书面陈述中证明你的选择是正确的。
请记住,以下也是可用的:
创建动画视频
导出训练好的模型
修改以下函数的参数,使其适应你的模型:
python experiments/exporter_main_v2.py --input_type image_tensor --pipeline_config_path experiments/reference/pipeline_new.config --trained_checkpoint_dir experiments/reference/ --output_directory experiments/reference/exported/
这将创建一个新的文件夹experiments/reference/exported/saved_model。可以在这里(https://www.tensorflow.org/guide/saved_model)阅读更多关于Tensorflow SavedModel格式的内容。
最后,可以为任何tf记录文件创建模型推理的视频。为此,运行以下命令(将其修改到您的文件中):
python inference_video.py --labelmap_path label_map.pbtxt --model_path experiments/reference/exported/saved_model --tf_record_path data/test/segment-12200383401366682847_2552_140_2572_140_with_camera_labels.tfrecord --config_path experiments/reference/pipeline_new.config --output_path animation.gif
提交模板
项目概述
这一部分应该包含项目的简要描述和我们正在努力实现的目标。为什么物体检测是自动驾驶汽车系统的重要组成部分?
设置
本节应该包含运行此存储库代码所需遵循的步骤的简要描述。
数据集
数据集分析
本节应包含数据集的定量和定性描述。它应该包括图像,图表和其他可视化。
交叉验证
本节应该详细说明交叉验证策略并证明您的方法是正确的。
参考实验
本节应详细说明参考实验的结果。它应该包括训练指标和算法性能的详细解释。
改进参考
本节将重点介绍您为改进模型所采用的不同策略。它应该包含你的发现的相关数据和细节。
参考代码---
GitHub - jeffnd/nd013-c1-vision-starter: Starter Code for the Course 1 project of the Udacity Self-Driving Car Engineer Nanodegree Program