深度学习笔记(一)简单的迁移学习
接触机器学习已经三个多月了,以此文做个小总结
机器人的视觉抓取
看了好多篇相关的文章,这个领域的研究已经比较深入了,大致上分为基于视觉检测的抓取和基于像素到动作映射的抓取
基于目标检测的抓取
这种方向又分两种不同的思路:
一种是结构化输出抓取配置,就是给定一张图片,直接输出机械臂配置(configuration),配置包括了机械臂末端的三维空间坐标、转角以及机械爪张开的大小等参数。这种方法通常使用sliding windows的方法对整张图像进行采样,通过将抓取问题转换成回归或者分类问题进行处理。习惯上用一种矩形表示法来表示这种配置,矩形的高度和宽度分别表征机械爪的宽度和机械爪两端点之间的距离,矩形的中心二维坐标表示机械爪两爪中心点的二维坐标。
另一种思路是让网络学习一种Robustness function,实际上是给定了图像和抓取的配置,在该抓取配置下抓取成功的成功率,实际上是一种二分类器
基于像素到动作映射的抓取
这种方法被称为是visual motor control,也被称作Image to action,简单地解释就是求取输入图像到动作的直接映射,而不经过生成抓取配置这一中间步骤,目前主要是强化学习的方法。
二维空间内的抓取
基于以上的调研,选择了一篇题为《Supersizing Self-supervision: Learning to Grasp from 50K Tries and 700 Robot Hours》的论文进行复现,该作者即论文的信息可参见
Lerrel Pinto
该项目的测试代码详见
grasp-detector
作者只给出了测试的代码,故将训练的代码进行了补全,并使用作者给出的数据集进行了训练,数据集的获取详见
dataset
本文使用的是12年提出的alexnet,源码比较容易找到,在训练过程中出现了一些问题,比如loss函数不下降等等,采用了加载Imagenet上预训练的模型可以很好地解决这一问题。
RGB图像到灰度图像的迁移
由于实验室机械臂的摄像头是黑白的,将原来在RGB图像上进行训练的模型迁移到灰度图像上以适应机械臂的使用。由于原输入是227×227×3,灰度图片只有一个通道,为了保持网络结构不变,将训练集转化为灰度图以后,将灰度图片拓展成三通道
def img2tensor(self, img):
img_array = np.asarray(img)
img_array = np.array([img_array,img_array,img_array])
reshape = np.resize(img_array,(227,227))
output = np.zeros((227,227,3))
output[:,:,0] = reshape
output[:,:,1] = reshape
output[:,:,2] = reshape
image_tensor = tf.convert_to_tensor(output)
训练过程中,我们希望保留网络提取的高层次特征,故将网络的第一层卷积层和全部的fc层设置为可训练,将剩余的卷积层冻结;训练适当的epoch以后,将训练得到的ckpt文件加载到测试模块中,得到比较好的测试结果,如下图:
可以看到fine-turning后的模型预测情况还是比较准确的,没有出现严重的过拟合现象。