使用keras训练一个的识别数字神经网络在神经计算棒2上运行

材料:

windows Anaconda环境下的  tensorflow-1.10.0 / keras-2.2.4 / python3.6

ubuntu 下的 openVINO

基本流程:

>数据准备

>训练 

>模型转换

>测试

在windows环境下数据准备及训练:

>数据准备(0-64)

数据是自己手动生成的,首先用画图工具生成一个128*128的画布,填充背景为蓝色。

 然后用文字工具在画布的中间写数字,我选用的字体是白色,黑体,48,然后保存到文件夹num_data中,并命名为1.png。照这样子画1-64个数字。

>扩充数据

到这里为止我们就准备好了原始的数字图片了,但这么少的数字样本肯定不够,我们可以借助keras里面的图片生成器ImageDataGenerator产生多的训练样本。首先在工程目录下建一个data文件夹,用来放生成的训练和测试图片,然后编写image_create.py脚本。

image_create.py脚本运行效果:

这个代码主要是构建一个图片生成器,然后生成经过变形的1-64数字图片:

在data文件夹下我们可以看到有两个子文件夹,分别是train和validatin

>模训练(keras)

这次训练采用的是类似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环境下:

>模型转换(keras>tensorflow>openvino)

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_DIR>/deployment_tools/model_optimizer/install_prerequisites文件夹,为openVINO安装模型优化框架 

 $  install_prerequisites_tf.sh

b>进行模型转换

找到<INSTALL_DIR>/deployment_tools/model_optimizer文件夹,目录下有转换脚本mo_tf.py

$  ./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 ]

>测试 写Python文件调用二代加速棒进行推理

$ 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

发布了11 篇原创文章 · 获赞 8 · 访问量 9770

猜你喜欢

转载自blog.csdn.net/liwuxin1/article/details/89067686
今日推荐