原文来源:sermanet.github.io
作者:Pierre Sermanet,Corey Lynch,Yevgen Chebotar,Jasmine Hsu,Eric Jang,Stefan Schaal,Sergey Levine
「雷克世界」编译:嗯~阿童木呀、哆啦A亮
这个项目是大规模的自监督模仿学习项目(https://sermanet.github.io/imitation/)的一部分。它通过强化学习和更多真实的机器人扩展了TCN项目。
论文(https://arxiv.org/abs/1704.06888)
视频(https://www.youtube.com/watch?v=b1UTUQpxPSY)
数据集(https://sites.google.com/site/brainrobotdata/home/multiview-pouring)
代码(https://github.com/tensorflow/models/tree/master/research/tcn)
摘要
我们提出了一个自监督的方法,可以完全从多视角记录的未标记视频中学习表征和机器人行为,并研究改如何在两个机器人模仿设置中使用这种表征:模仿人类视频的目标交互行为和人类姿势。模仿人的行为需要一个视角不变的表征,用来捕捉末端执行者(手或机器人机械爪)与环境、目标属性和身体姿态之间的关系。我们使用triplet loss函数来训练我们的表征,其中在嵌入空间中的同一观察的多个同时观察点是非常受欢迎的,但却被通常视觉上相似而在功能上不同的时间邻近(temporal neighbors)所排斥。这个信号使得我们的模型能够发现不随着视角改变而改变的属性,但它会随着时间的改变而改变,同时还会忽略遮挡、运动模糊、光照和背景等干扰变量。我们证明这种表示可以被机器人用来直接模仿人类的姿势而没有显式的对应关系,并且它可以用作强化学习算法中的奖励函数。当这种学习是从一个没有标注的任务相关视频集合中进行学习时,诸如浇注,这样的机器人行为,是通过观看人类的一个第三方示范演示进行学习的。通过模仿已学习表征下的人类行为示范获得的奖励函数,能够实现高效强化学习,从而对于现实世界中机器人系统的学习是非常适用的。
自监督模仿
方法
该教程实现了“时间对比网络”(https://arxiv.org/abs/1704.06888),它是更大的自我监督模仿学习(https://sermanet.github.io/imitation/)项目的一部分。
联系方式
TCN的维护者:
?Corey Lynch:github(https://github.com/coreylynch)、twitter(https://twitter.com/coreylynch)
?Pierre Sermanet:github(https://github.com/sermanet)、twitter(https://twitter.com/psermanet)
入门
安装依赖
?构建Tensorflow nightly(https://pypi.python.org/pypi/tf-nightly-gpu)或通过pip installtf-nightly-gpu构建。
?Bazel(https://docs.bazel.build/versions/master/install.html)
?matplotlib
?sklearn
?OpenCV
下载预训练的InceptionV3检查点
运行脚本以下载预训练的InceptionV3检查点:
cd tensorflow-models/tcn
pythondownload_pretrained.py
运行测试:
bazel test :all
概念
多视角网络摄像视频
我们提供实用程序以便用来在dataset/ webcam.py中收集你自己的多视图视频。有关如何收集多视图网络摄像数据并将其转换为该库所期望的TFRecord格式的结束示例,请参阅该端到端网络摄像教程。
数据管道
我们使用tf.data.Dataset API来构建输入管道,用于训练、评估和可视化过程的馈送。这些管道在data_providers.py中进行定义。
评估器
我们使用tf.estimator.Estimator API来定义训练、评估和推理行为。请参阅estimators/mvtcn_estimator.py,以了解如何实施多视图TCN训练、评估和推理。
模型
很多不同的嵌入式体系结构偶可以在model.py中实现。我们在浇注实验(pouring experiments)中使用了InceptionConvSSFCEmbedder,但我们也在评估Resnet嵌入器。
损失
我们使用tf.contrib.losses.metric_learning库实现triplet loss函数,其中具有semi-hardnegative mining和npairs损失。在我们的实验中,npairs损失具有更好的经验收敛性,并能够产生最好的定性可视化,并可能成为未来实验的选择。有关算法的详细信息,请参阅论文(http://www.nec-labs.com/uploads/images/Department-Images/MediaAnalytics/papers/nips16_npairmetriclearning.pdf)。
推理
我们支持3种用于训练TCN模型的推理模式:
?模式1:输入是一个tf.Estimatorinput_fn,输出是一个关于嵌入和附加元数据的迭代器。有关使用示例,请参阅labeled_eval.py。
?模式2:输入是TFRecord或(或TFRecords列表)。这将返回一个关于元组(embeddings、raw_image_strings、sequence_name)的迭代器,其中embeddings是[num views, sequence length, embedding size] numpy数组,包含完整嵌入序列(对于所有视图),raw_image_strings是[num views,sequencelength]字符串数组,持有编码为jpeg的原始图像字符串,sequence_name是序列的名称。有关使用示例,请参阅generate_videos.py。
?模式3:输入是一个大小为[numimages, height, width, num channels]的numpy数组。这将返回一个元组(embeddings,raw_image_strings),其中embeddings是一个2D float32numpy数组,其中包含[num_images,embedding_size]图像嵌入,raw_image_strings是一个1D字符串numpy数组,其中包含大小为[batch_size],编码为jpeg的图像字符串。这可以按如下进行使用:
images = np.random.uniform(0, 1, size=(batch_size, 1080, 1920, 3))
embeddings, _ = estimator.inference(images, checkpoint_path=checkpoint_path)
查阅
estimators/base_estimator.py
以了解更多详情。
配置
数据管道、训练、评估和可视化都使用传递作为YAML文件的键值参数进行配置。配置可以嵌套,例如:
learning:
optimizer: 'adam'
learning_rate: 0.001
T目标
YAML配置转换为类似于LuaTable的T目标(请参阅utils / luatables.py),其行为类似于python dict,但允许使用点符号访问(嵌套)键。例如,我们可以通过config.learning.learning_rate访问上面的配置代码段中的学习速率。
多个配置
可以通过--config_paths标志将可以将多个配置文件传递给不同的二进制文件,作为一个由逗号分隔的配置路径列表。这使我们可以指定一个适用于所有实验的默认配置(例如,写一个检查点的频率、默认嵌入式超参数),以及每个实验的一个配置,它只持有特定于实验的“超级参数”(路径到数据,等等以及每个实验的一个配置,它只持有特定于实验的超参数(到达数据的路径等)。
请参阅configs/tcn_default.yml,以获取默认配置示例;参阅configs / pouring.yml,查看有关我们如何定义浇注实验的示例
从左到右的应用配置如下。例如,考虑两个配置文件:
default.yml
learning:
learning_rate: 0.001# Default learning rate.
optimizer: 'adam'
myexperiment.yml
learning:
learning_rate: 1.0# Experiment learning rate (overwrites default).
data:
training: '/path/to/myexperiment/training.tfrecord'
运行
bazel run train.py --config_paths='default.yml,myexperiment.yml'
最后一个合并配置中的结果称为final_training_config.yml
learning:
optimizer: 'adam'
learning_rate: 1.0
data:
training: '/path/to/myexperiment/training.tfrecord'
这是自动创建的,并与模型检查点和张量板摘要一起存储在实验日志目录中。这给了我们每个试验中确切配置的记录。
监测训练
我们通常在训练期间查看两个验证度量:knn分类误差和多视图对齐。
KNN分类误差
在我们标记验证数据的情况下,我们可以在验证集中所有嵌入标记图像上计算平均交叉序列KNN分类错误(1.0 - recall@k=1)。请参阅labeled_eval.py。
多视图对齐
在没有标记验证数据的情况下,我们可以查看模型对相同嵌入式验证序列的多个视图的对齐情况。也就是说,对于每一个嵌入式验证序列,对于所有的交叉视图对,我们计算的是对照标准时间索引与knn时间索引之间的扩展性绝对距离。请参阅alignment.py。
可视化
我们通过两种方式将从我们模型中学到的嵌入空间进行可视化:最近邻模仿视频和PCA / T-SNE。
最近邻模仿视频(Nearest Neighbor Imitation Videos)
评估模型理解程度的最简单方法之一就是观察模型在嵌入空间中,通过最近邻算法在语义上对齐两个视频的好坏程度。
考虑到这样一种情况,我们有多个验证演示视频,其中的人或机器人执行相同的任务。例如,在浇注实验中,我们收集了一个人将一个容器内的物体倒入另一个容器内,然后放下容器的多个不同的多视图验证视频。如果我们希望看到我们的嵌入在多个视角上、目标/智能体外观和背景之间的泛化能力如何,我们可以一个称之为“最近邻模仿”的视频,通过在其中嵌入来自视图1的一些验证查询序列i,然后在从视图1拍摄的一些嵌入式目标序列j中为每个查询框架找到最近邻。此处是最终生成品的示例(https://sermanet.github.io/tcn/docs/figs/pouring_human.mov.gif)。
有关详细信息,请参阅generate_videos.py。
PCA和T-SNE可视化
我们还可以嵌入一组从验证视频中随机抽取的图像,并使用PCA投影和T-SNE在tensorboard投影仪中对嵌入空间进行可视化。有关详细信息,请参阅visualize_embeddings.py。
教程第一部分:收集多视角摄像视频
在这里,我们给出一个端到端的示例,说明该如何收集你自己的多视角网络摄像视频,并把它们转换成训练期望的TFRecord格式。
注意:这是在多达8并发的Logitech c930e网络摄像头(https://www.logitech.com/en-us/product/c930e-webcam)下进行测试的,它扩展与可插拔5米(16英尺)USB 2.0中继器延伸电缆。
收集网络摄像头视频
去往 dataset/webcam.py
1.插入你的摄像头并运行
ls -ltrh/dev/video*
你应该看到一个列出每个已连接摄像头的设备。
2.定义一些描述你正在收集的数据集的环境变量。
dataset=tutorial # Name of the dataset.
mode=train # E.g. 'train', 'validation', 'test', 'demo'.
num_views=2 # Number of webcams.
viddir=/tmp/tcn/videos# Outputdirectory for the videos.
tmp_imagedir=/tmp/tcn/tmp_images# Temp directoryto hold images.
debug_vids=1 # Whether or not to generateside-by-side debug videos.
export DISPLAY=:0.0 # This allows real time matplotlib display.
3.运行 webcam.py script.
bazel build -copt --copt=-mavx webcam && \
bazel-bin/webcam\
--dataset$dataset \
--mode $mode \
--num_views$num_views \
--tmp_imagedir$tmp_imagedir \
--viddir $viddir\
--debug_vids 1
4.完成收集后按Ctrl-C,然后脚本将为每个视图编译视频,并可选择一个连接多个同步视图的调试视频。
5.如果没有设置--seqname标志,脚本将命名第一个序列为'0',第二个序列为'1',等等(这意味着你可以继续重新运行步骤3)。完成后,你应该看到具有以下结构的输出viddir:
videos/0_view0.mov
videos/0_view1.mov
videos/0_viewM.mov
videos/1_viewM.mov
videos/N_viewM.mov
for N sequences and M webcam views.
创建TFRecords
使用dataset/videos_to_tfrecords.py将视频目录转换为TFRecords文件目录,每个多视图序列具有一个文档。
viddir=/tmp/tcn/videos
dataset=tutorial
mode=train
videos=$viddir/$dataset
bazel build -copt videos_to_tfrecords && \
bazel-bin/videos_to_tfrecords--logtostderr \
--input_dir$videos/$mode \
--output_dir ~/tcn_data/$dataset/$mode \
--max_per_shard400
设置---max_per_shard> 0将使得你能够分割训练数据。我们已经观察到,就全局全局步长/秒而言,分割长训练序列将能够提供更好的性能表现。
对于验证/测试数据,这应该保留为默认值0。
你现在应该有一个TFRecords文件的目录,结构如下:
output_dir/0.tfrecord
...
output_dir/N.tfrecord
1 TFRecord file for each of N multi-view sequences.
现在我们准备进入第二部分:训练、评估和可视化。
教程第二部分:训练、评估和可视化
在这里,我们给出一个端到端的示例,说明该如何训练、评估和可视化用TCN模型学习到的嵌入空间。
下载数据
我们将使用'Multiview Pouring'数据集,可以使用download.sh脚本进行下载。
本教程的其余部分将假设你已经将数据下载到~/tcn_data文件夹中。
mkdir ~/tcn_data
mv ~/Downloads/download.sh ~/tcn_data
./download.sh
你现在应该具有包含所有数据的以下路径:
ls ~/tcn_data/multiview-pouring
labels README.txt tfrecords videos
下载预训练的Inception检查点
如果你还没有下载,请运行下载预训练的InceptionV3检查点的脚本:
pythondownload_pretrained.py
定义一个配置
对于我们的实验,我们创建了2个配置:
?python download_pretrained.py:这包含所有默认的超参数,这些超参数在实验中通常不会改变。
?configs/pouring.yml:这包含所有特定用于浇注实验的超参数。
有关configs/pouring.yml的重要说明:
?data.eval_cropping:我们使用“pad200”作为浇注实验的数据集,这与在iphone上拍摄的照片非常接近。对于在网络摄像头拍摄的数据来说一个更好的选择可能是“crop_center”。有关选项,请参阅preprocessing.py。
训练
运行训练二进制文件:
logdir=/tmp/tcn/pouring
c=configs
configs=$c/tcn_default.yml,$c/pouring.yml
bazel build -c opt --copt=-mavx --config=cuda train && \
bazel-bin/train \
--config_paths $configs --logdir $logdir
评估
运行计算运行验证丢失的二进制文件。设置exportCUDA_VISIBLE_DEVICES=在CPU上运行。
bazel build -c opt --copt=-mavx eval&& \
bazel-bin/eval \
--config_paths $configs --logdir $logdir
运行计算运行验证交叉视图序列比对的二进制文件。设置exportCUDA_VISIBLE_DEVICES=在CPU上运行。
bazel build -c opt --copt=-mavx alignment && \
bazel-bin/alignment \
--config_paths $configs --checkpointdir $logdir --outdir $logdir
运行计算运行标记的KNN验证错误的二进制文件。设置exportCUDA_VISIBLE_DEVICES=在CPU上运行。
bazel build -c opt --copt=-mavx labeled_eval && \
bazel-bin/labeled_eval \
--config_paths $configs --checkpointdir $logdir --outdir $logdir
检测训练
运行tensorboard --logdir = $ logdir。经过一些训练之后,你应该看到如下所示的曲线:
训练损失
验证损失
验证对齐
平均验证KNN分类错误
独立验证KNN分类错误
可视化
为了可视化模型所学的嵌入空间,我们可以:
生成模仿视频