材料:
windows - Anaconda环境下的 tensorflow-1.10.0 / keras-2.2.4 / python3.6
ubuntu 下的 openVINO
基本流程:
>数据准备
>训练
>模型转换
>测试
在windows环境下数据准备及训练:
> 数据是自己手动生成的,首先用画图工具生成一个128*128的画布,填充背景为蓝色。
然后用文字工具在画布的中间写数字,我选用的字体是白色,黑体,48,然后保存到文件夹num_data中,并命名为1.png。照这样子画1-64个数字。
>扩充数据
到这里为止我们就准备好了原始的数字图片了,但这么少的数字样本肯定不够,我们可以借助keras里面的图片生成器ImageDataGenerator产生多的训练样本。首先在工程目录下建一个data文件夹,用来放生成的训练和测试图片,然后编写image_create.py脚本。
image_create.py脚本运行效果:
这个代码主要是构建一个图片生成器,然后生成经过变形的1-64数字图片:
在data文件夹下我们可以看到有两个子文件夹,分别是train和validatin
这次训练采用的是类似VGG的卷积神经网络搭建的模型,通过数据流的方式生成训练样本,这样就可以用cpu来生成数据,用GPU来训练,具体可以参考:flow_from_directory(directory): 以文件夹路径为参数,生成经过数据提升/归一化后的数据,在一个无限循环中无限产生batch数据。图片的大小是128*128彩色图片,
具体的代码:train.py
生成的VGG网络大概是这样子的:
D:\Anaconda2\envs\py36\python.exe F:/keras/number/train.py
Using TensorFlow backend.
Found 12774 images belonging to 64 classes.
Found 6494 images belonging to 64 classes.
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_1 (Conv2D) (None, 126, 126, 32) 896
_________________________________________________________________
conv2d_2 (Conv2D) (None, 124, 124, 32) 9248
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 62, 62, 32) 0
_________________________________________________________________
dropout_1 (Dropout) (None, 62, 62, 32) 0
_________________________________________________________________
conv2d_3 (Conv2D) (None, 60, 60, 64) 18496
_________________________________________________________________
conv2d_4 (Conv2D) (None, 58, 58, 64) 36928
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 29, 29, 64) 0
_________________________________________________________________
dropout_2 (Dropout) (None, 29, 29, 64) 0
_________________________________________________________________
flatten_1 (Flatten) (None, 53824) 0
_________________________________________________________________
dense_1 (Dense) (None, 256) 13779200
_________________________________________________________________
dropout_3 (Dropout) (None, 256) 0
_________________________________________________________________
dense_2 (Dense) (None, 64) 16448
=================================================================
Total params: 13,861,216
Trainable params: 13,861,216
Non-trainable params: 0
_________________________________________________________________
接下来就是漫长的训练咯:
Epoch 1/5
18/1000 [..............................] - ETA: 32:29 - loss: 0.1091 - acc: 0.9635
。。。。。。
到后面我们可以得到差不多0.98的正确率。在训练过程每一个epoch会保存一次最佳的训练权重到tmp目录下weights.hdf5
接下拷贝生成的 weights.hdf5 来转到安装好openVINO的ubuntu环境下:
1>Keras to TensorFlow(.hf5文件转成.pb)
转换脚本下载:https://github.com/amir-abdi/keras_to_tensorflow
使用示例:
$ python keras_to_tensorflow.py
--input_model="path/to/keras/model.h5" [.hdf5 or h5]
--output_model="path/to/save/model.pb"
2> TensorFlow to openVINO(.pb文件转成.bin和.xml)
a> 模型优化框架配置
找到
$ install_prerequisites_tf.sh
b>进行模型转换
找到
$ ./mo_tf.py --input_model /home/ubuntu/kears/weights.pb --data_type FP16 --output_dir /home/ubuntu/kears --input_shape "[1,128,128,3]"
--input_model /home/ubuntu/kears/weights.pb 指定要转换的模型文件
--data_type FP16 加速棒需要的是FTP16格式,需要手动将命令行参数改成FTP16,转换成FTP16格式的.xml和.bin
--output_dir /home/ubuntu/kears 指定要转换后的模型存放路径
--input_shape "[1,128,128,3]" 指定输入模型形状信息 [ 1 , w , h , 3 ]
$ python3.5 test.py
$ ~/kears$ python3.5 test.py
打印输出:
>n:1 c:3 h:128 w:128
>64
>float32
>[[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
> 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0.
>0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]
打印的数组输出了64位数字,其中第43位为1。测试输入的图片是"42",算上"0", 可知分类输出正确。
1>import 导入不了openVINO库
2>训练模型时出现错误
raise ImportError('Could not import PIL.Image. ' ImportError: Could not import PIL.Image. The use of `array_to_img` requires PIL.
1>保证系统环境注册成功,打开终端有显示(如果要使用PythonIDE软件,也必须从注册了openVino环境的命令行打开)
[setupvars.sh] OpenVINO environment initialized
ubuntu@lwx:~$
2>pip install pillow
链接:https://pan.baidu.com/s/14vxkyOHy2vDFdwZV-jXcOw
提取码:hg63
代码实现参考网站:
python下神经计算棒推理示例代码: https://software.intel.com/en-us/articles/transitioning-from-intel-movidius-neural-compute-sdk-to-openvino-toolkit#inpage-nav-13
Python下OpenVINO-InferEngine类使用说明: https://software.intel.com/en-us/articles/OpenVINO-InferEngine
使用神经计算棒二代在OpenVino下推理基于Keras转换的TensorFlow 模型:https://blog.csdn.net/jsjytc/article/details/86016668
使用keras训练自己的神经网络并在树莓派上运行: https://blog.csdn.net/weixin_40707450/article/details/79689333