第八周 2018.09.02-2018.09.08

完成一个手势识别的工程,这是最终的结果。

python opencv 模型 加载 bin opencv读取pytorch模型_摄像头

 

python opencv 模型 加载 bin opencv读取pytorch模型_pytorch_02

也就是打开摄像头,把自己的手势出现在黑框中,然后按下空格键就可以预测手势是什么。一共可以识别五种手势{✋,?,?,✌,?}。

下面实现的步骤:

首先是数据的收集。

用摄像头来收集数据,使用opencv打开摄像头,在屏幕某个位置画一个黑框,把手势放进去,然后按下空格键,就可以保存一张图片到本地中,每种手势收集了大概1000多一点张图片,一共6039张图片。由于处理rgb图像复杂度太高,所以对获取到的图片进一步处理,压缩和二值化,这样最终需要CNN处理的图片的大小就是1通道,宽48,高64的图片。每个图片都放在单独的文件夹来代表不同的类别。

python opencv 模型 加载 bin opencv读取pytorch模型_手势识别_03

第二步是处理成PyTorch可以处理的Tensor。

    使用os,opencv模块从本地读取所有的图片,把标签和图片作为一个元组,方便统一进行打乱顺序。整个数据集就是,图片个数*(图片数据+图片标签)。打乱之后前5000个做为训练集,后1039个做为测试集。在转化成Tensor,打包成批次等等。

第三步是网络结构的设计。

CNN网络的结构,两个卷积层,两个全连接层。输出5个节点,代表5个类别。然后进行网络的训练和测试,一开始发现预测结果全都是同一类,然后学习率调成原来的十分之一之后,训练正常,最后在测试集上实现了0loss,百分之百的准确率。

python opencv 模型 加载 bin opencv读取pytorch模型_摄像头_04

第四步是模型的使用。

    由于每一步都输出了准确率和loss,也保存了整个网络。所以可以选择损失和loss最小的一个迭代保存的网络进行使用。加载保存到本地的模型文件,然后再和之前收集数据类似的步骤,把摄像头标定的黑框中的数据处理送进网络里进行预测,打印出预测结果。虽然收集数据的时候是使用的灰度图,但是进行使用的时候用户界面仍然可以是rgb图像。