Lesson 3.2: 基于深度学习的数字识别 (LeNet) 实践部分

建议操作系统: ubuntu
开发语言: python
开发工具: docker

这篇文章小编教大家如何识别这种带噪音的图片:

mnist007

docker是一个非常方便的工具,尤其在linux下面,安装的成本几乎为零,而且启动的实例 (container)可以跟主机共享内存(其实就是一个虚拟机)。

所以这里也是用docker安装caffe,小编常用的的操作系统是Ubuntu,所以这里只在ubuntu下面测试。我想Ubuntu占有服务器开发60%以上市场。

docker下面如何安装caffe是非常迅速的,这里不介绍docker如何在各个平台的安装了,大家可以参考官网如何安装:
https://docs.docker.com/

如何安装caffe

一个相对复杂的方法(其实也不是很复杂),按照官网所说一步一步走:

http://caffe.berkeleyvision.org/installation.html

另外一个就是利用docker (caffe docker),小编最喜欢的部署方法。

caffe官网的Dockerfile没有自动同步到docker hub,所以这里自动拉我的docker hub中的repo。

很有可能出现以下错误信息,很正常。

上面是会自动从网上自动安装caffe和运行caffe查看版本(version)。下面的命令可以让用户进入命令行模式,并且把当前目录($pwd)投影到container(虚拟机)中 /workspace。

如何训练

caffe的位置在

而LeNet的例子在

网络的格式使用prototxt定义。跟上一节的理论介绍有少许不一样。下面的网络定义用于训练:

下面的代码是修改GPU到CPU:

下载数据和启动训练:

大致可以获取到相类似的训练信息:

其中loss = 0.00318437的信息比较重要,如果经常不稳定,而且太高的话(譬如一直大于0.1)。应该考虑一下预处理是否有问题。我的笔记本CPU花了20分钟训练完毕(10000 iterations会结束),如果用GPU会快上100倍以上吧(小编比较穷)。

由上面的log可以看到最后测试部分的识别率是

很不错了~~~

如何调用训练好的网络

所我们需要构造一个类,此类用于调用caffe生成的模型文件。请继续使用上面的Dockerfile生成的container(虚拟机)。

项目文件在虚拟机的 /opt/deep_ocr/lessons/lesson3.1.call_mnist.py 中。

我们开始import一些需要的库。

构造识别器的init

self.net 保存 caffe 的实例。 self.width 和 self.height 统一输入caffe的大小。is_mode_cpu 默认为cpu模式。

下面的代码是识别部分:

识别部分我写得比较特殊。cv2_imgs 是输入一个图片数据(numpy的数组)。 每次只识别从pos_start到pos_end。有两个原因这么做:

1,当在GPU模式下,可以减少CPU和GPU的内存交换次数,达到加速的作用
2,当然,如果输入的图片数量过多,内存不够的话,可以用pos_start和pos_end分次识别。

接着是用户使用的识别接口:

这是用户的接口,其中第一个函数的参数step是控制每次cpu和gpu图片交换的数量,要看显卡的内存有多大。然后我们可以用下面代码测试:

用上面的docker识别下面4个图片:

mnist001.png
mnist001

mnist002.png
mnist002

mnist003.png
mnist003

mnist004.png
mnist004

mnist005.png
mnist005

mnist006.png
mnist006

mnist007.png
mnist007

可以获得以下结果:

注意上面那些caffe的调试信息可以忽略。结论是上面的识别结果都对了。

如果得到下面错误信息,需要运行上面的训练部分代码,因为系统找不到模型。

这章节的完整源代码在 这里

看上面的案例,全部识别成功, 这种方法对抗噪很好

微信公众号 changdata

wechat: changdata
wechat: changdata

发表评论

电子邮件地址不会被公开。 必填项已用*标注