1.项目介绍
在此项目中,我们要构建语义分割网络,对其进行培训,验证并将其部署在Follow Me项目中,使用自己的神经网络跟踪单个目标!

项目步骤:
1.设置本地环境。
2.有关模拟器如何工作及其基本控件的简要概述。
3.从模拟器收集数据以训练网络。
4.建立神经网络。
5.相关程序编写。
6.训练网络。
7.使用Follow Me!模拟器测试模型。
2. 环境设置
安装依赖项
OS X和Linux(Ubuntu)
source activate RoboND
pip install tensorflow==1.2.1
pip install socketIO-client
pip install transforms3d
pip install PyQt5
pip install pyqtgraph
windows
source activate RoboND
# if the above throws an error, you can run "activate RoboND" instead
pip install tensorflow==1.2.1
pip install socketIO-client
pip install transforms3d
pip install PyQt5
pip install pyqtgraph
克隆存储库
$ git clone https://github.com/udacity/RoboND-DeepLearning-Project.git
下载QuadSim
要将神经网络与QuadSim模拟器连接,必须使用针对该项目量身定制的QuadSim版本。
模拟器文件可以在这里下载。
获取数据
将以下三个文件保存到克隆存储库的data文件夹中。
3.模拟器介绍
启动模拟器:

模拟器提供两个选择:(1)DL Training 和(2)Follow Me!
DLTraining 用于收集培训数据-稍后会详细介绍。
Follow Me! 选项是评估受过训练的网络的质量。
在模拟器中处于活动状态时,可以使用以下键盘控件:
L:打开和关闭带有控制信息的图例
H:启用和禁用四边形的本地控制
WSAD /箭头:启用本地控制后,四边形会移动
E / Q:分别将四边形顺时针和逆时针旋转
Space / C:在启用本地控制时增大和减小四边形的推力
滚轮:放大和缩小相机
鼠标右键(拖动):围绕四边形旋转相机
鼠标右键(单击):重置相机
鼠标中键:切换巡逻和跟随模式
G:重置四边形方向
F5:循环质量设置
/:路径显示开/关
ESC:退出主菜单
Crtl-Q:退出
4.数据收集
在这个项目的存储库中提供了一个简单的培训数据集。如果你对提高你的分数感兴趣,则需要收集额外的训练数据。要做到这一点,请参阅以下步骤。
数据目录组织如下:
data/runs - contains the results of prediction runs
data/train/images - contains images for the training set
data/train/masks - contains masked (labeled) images for the training set
data/validation/images - contains images for the validation set
data/validation/masks - contains masked (labeled) images for the validation set
data/weights - contains trained TensorFlow models
data/raw_sim_data/train/run1
data/raw_sim_data/validation/run1
data/runs - 包含预测运行的结果
data/train/images - 包含训练集的图像
data/train/masks - 包含训练集的掩码(标记)图像
data/validation/images - 包含验证集的图像
data/validation/masks - 包含用于验证集的屏蔽(标记)图像
data/weights - 包含经过训练的TensorFlow模型
data/raw_sim_data/train/run1
data/raw_sim_data/validation/run1
训练集
- 运行QuadSim
- 点击
DL Training按钮 - 设置patrol points, path points,,spawn points ,具体步骤见下收集指南
- 模拟器运行后,按“r”开始记录。
- 在文件选择菜单中,记录到
data/raw_sim_data/train/run1目录 - 可选:按“9”键可加快数据采集速度(1-9键会减慢采集速度)
- 收集完数据后,按“r”停止记录。
- 要重置模拟器,点击“”
- 要收集多次运行,请创建目录
data/raw_sim_data/train/run2、data/raw_sim_data/train/run3并重复上述步骤。
验证集
要收集验证集,使用目录data/raw_sim_data/validation,重复上述两组步骤。
图像预处理
在对网络进行训练之前,首先需要对图像进行预处理。预处理步骤将深度掩码从sim转换为适合训练神经网络的二进制掩码。它还将图像从.png转换为.jpeg,以创建缩小大小的数据集。
进行预处理:
python preprocess_ims.py
注意:如果数据是按照上面的步骤存储的,那么这个脚本应该没有错误地运行。
以上为课程提示,但是我在实际使用过程中,因为版本问题,还是报了如下错误:
TypeError: numpy boolean subtract, the-operator, is deprecated, use the bitwise_xor, the^operator, or the logical_xor function instead.
按照程序提示所作更改后,将程序内容使用bitwise_xor替换掉,错误解决。
重要提示1:
运行preprocess_ims.py不会删除processed_data文件夹中的文件。这意味着,如果将图像留在处理过的数据中,并收集一个新的数据集,processed_data中的一些数据将被覆盖,而另一些则保持原样。建议在使用一组新收集的数据运行preprocess_ims.py之前,删除processed_data(或整个文件夹)中的train和validation文件夹。
重要提示2:
notebook和代码假设用于培训/验证的数据在data/train中和data/validation中。在运行preprocess_ims.py之后,processed_ims中可能会有新的培训和验证文件夹。
重命名或移动data/train和data/validation,然后将data/processed_ims/train移动到data/中,将data/processed_ims/validationalso移动到data/中
重要提示3:
合并多个train或validation可能比较困难,建议根据在raw_sim_data/train/run1中包含的内容来决定数据选择,在目录中可能有许多不同的运行。可以在data/中创建临时文件夹,并存储当前不想使用的原始运行数据,但这可能对以后有用。选择要在raw_sim_data/train和raw_sim_data/validation中包含哪些run_x文件夹,然后从code/目录中运行preprocess_ams .py来生成新的培训和验证集。
5. 收据收集指南
打开quad sim,在Spawn crowd处打勾,然后点击DL training

本地控制模式
该四边形将以巡逻模式开始,但是由于我们尚未添加任何航点,因此它无处可去。要添加航点,您必须先通过H键切换到本地控制。
查看和导航
- 要缩小四轴飞行器,可以使用mouse wheel。
- 要在训练过程中随时更改观看角度,请right click在屏幕上移动鼠标。
- 使用WASD键向前,向左,向后和向右移动四边形
- 使用和C推力上下
- 使用QE键将四边形向左或向右旋转
- 按G将其重置为起始姿势。
- 要查找这些命令和其他命令,请按L图例键
管理数据收集
可以控制数据收集过程的3个主要方面,以便确定收集的数据类型。这些如下:
- 四边形在巡逻时将采用的路径。
- 跟踪对象走的路。课程中称跟踪对象为’Hero’ 。
- 干扰行人生成的位置。
设置巡逻点
按下P键设置巡逻点。绿色的巡逻点将出现在无人机的位置上。
移动到另一个位置,然后再次按P在附近的某个地方添加一个巡逻点。
现在,可以通过按H将Quad置于巡检模式。要切换回本地控制,请再次按H。
要删除所有已设置的巡逻点,请按 L。
设置跟踪对象路径点
要设置跟踪对象路径点,请在本地控制模式下按O。跟踪对象路径点与巡逻点非常相似,除了它们总是放在地面上。按下C键来降低四轴飞行器的高度,以便更好地观察你正在设置的点。与巡逻点类似,所有的跟踪对象路径点都可以通过按k删除。跟踪对象将从创建的第一个点开始,并在路径上行走。当到达终点时,跟踪对象会在重新出现在道路的起点。
设置生成点hh
模拟器中除跟踪对象外的所有角色将在30-50秒后在其中一个生成点重新生成。您可以通过放置的生成点的数量和位置来控制给定区域中的人数。可以通过按键I在当前的四边形x,y位置设置生成点。蓝色标记将出现在生成位置。可以通过按J删除所有生成点
设置数据收集运行
对于设置生成和跟踪对象路径点,旋转摄像机很有帮助,因此您可以从上方直接查看四边形。
首先,让我们创建一个小型收集实验。通常情况下,需要运行多个收集数据,并让每个运行针对特定的数据类l型。还需要拥有包含跟踪对象的大量数据样本。如果创建了很大的巡逻路径和跟踪对象路径,那么收集包含跟踪对象的图像的可能性就很小。
开始收集运行
当你对巡逻路径,跟踪对象路径和生成点的放置方式感到满意时,请按M让行人们开始生成。
要开始记录数据,请R按键。保存到“ raw_sim_data/train/target。我们使用目标目录,因为我们选择让跟踪对象出现在这个集合运行中。或者,随机选择的人可以扮演跟踪对象的角色。在这种情况下,为了正确地准备数据,应该选择non_target文件夹。
另一个导入说明。在尝试设置另一个数据收集运行之前,最好重新启动模拟器(非常推荐)
target/non_target文件夹内可以有任意数量的run文件夹。多次使用同一运行文件夹将导致第一次运行的数据被删除,并被第二次运行的数据替换。按下select按钮,屏幕顶部的指示器应变为绿色,这表示正在收集数据。
按下H以使Quad进入巡逻模式。要加快数据收集过程,请9按键。该运行中的数据将存储在所选择的文件夹中。
数据收集完毕后,可以再次按R停止记录。尽管不建议在运行数据收集时添加/删除跟踪对象路径/生成点,但是可以删除巡逻路径并根据需要进行修改。
要重置模拟器,请按 <Esc>
数据收集最佳实践
在记录此项目的数据时,让我们花一些时间介绍最佳做法。
从应该收集的数据开始:
- 通过在非常密集的人群中追踪对象来收集数据。
- 在巡逻期间,数据在追踪对象上方直接之字形巡逻。
- 在四轴飞行器进行标准巡逻时收集的数据。
(1)用data collectionrun收集数据:
收集额外数据的最简单方法是简单地进行DL训练,然后按开始生成。然后开始记录,即使添加很多图像也不会对得分有太大的改善。
(2)以关注模式收集数据
三分之一的评分数据基于跟随目标人员时的质心准确度。
为了收集将为神经网络做好准备的数据,我们创建了两个自定义数据收集运行。
要开始运行模拟器并选择DL训练模式。然后按“ j”,“ k”,然后按“ l”以清除任务航路点。
(3)尝试使用巡逻获取跟踪对象的所有角度:
为此,我们将有两个巡逻点。然后直接在巡逻路径下,
为跟踪对象创建锯齿形路径。由于万向摄像机的角度,将巡逻路径移到跟踪对象路径的边界之外很有帮助。
(4)从完整路径收集数据:
在保存数据的同时,我还将开始从完整的巡逻路径收集一些数据。
此数据中将没有跟踪对象,但这一点很重要,因此网络可以学习解释看起来像跟踪对象的对象。
(5)将跟踪对象数据的收集集中在人群中
之后使用python preprocess_ims.py命令来处理所收集到的数据,将之转换成训练神经网络所需的数据。将之拷入/train文件夹中

6.建立分割网络
import os
import glob
import sys
import tensorflow as tf
from scipy import misc
import numpy as np
from tensorflow.contrib.keras.python import keras
from tensorflow.contrib.keras.python.keras import layers, models
from tensorflow import image
from utils import scoring_utils
from utils.separable_conv2d import SeparableConv2DKeras, BilinearUpSampling2D
from utils import data_iterator
from utils import plotting_tools
from utils import model_tools
def separable_conv2d_batchnorm(input_layer, filters, strides=1):
output_layer = SeparableConv2DKeras(filters=filters, kernel_size=3, strides=strides,
padding='same', activation='relu')(input_layer)
output_layer = layers.BatchNormalization()(output_layer)
return output_layer
def conv2d_batchnorm(input_layer, filters, kernel_size=3, strides=1):
output_layer = layers.Conv2D(filters=filters, kernel_size=kernel_size, strides=strides,
padding='same', activation='relu')(input_layer)
output_layer = layers.BatchNormalization()(output_layer)
return output_layer
def bilinear_upsample(input_layer):
output_layer = BilinearUpSampling2D((2,2))(input_layer)
return output_layer
# # 建立模型
# 使用separable_conv2d_batchnorm()函数创建一个可分离的卷积层。
# 该filters参数定义输出层的大小或深度。例如32或64。
def encoder_block(input_layer, filters, strides

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



