手把手教你用python写脚本看caffe训练好的网络测试单张图片的输出

来源:互联网 发布:科比0506赛季数据 编辑:程序博客网 时间:2024/04/30 22:39

    因为参加比赛的缘故,要在linux下用caffe对数据集中的人脸进行分类训练,训练一个网络,然后主办方在后期放出测试集之后,我用训练好的网络对测试集里面的图片进行测试分类。


    我先介绍下打大体流程:

    首先训练的数据集是CCPR主办方给的,然后我分为8类,在ubuntu下用nvidia公司推出的digits2.0傻瓜软件把训练集转换为caffe需要的mdb格式,然后在上面用两块GPU训练一个googlenet网络,最后得到一个网络结构文件,多个迭代权值(选最后一个)文件,还有一个图像均值文件,然后再需要一张图片,用caffe的python接口,编写简单脚本,就可以用这几个文件构建训练好的网络,来测试特定的单张图片,然后得到具体的标签结果。


    表情数据集是比赛官方提供的,我先在windows下用matlab把比赛提供的12W张图片分成了要求的8类,然后加上CK(一个小的表情库),总共接近13W张图片,放在8个文件夹中,然后用FTP传到ubuntu服务器上,具体位置放在/home/qi66/CCPR/CCPRTem/train_choseAndCK/目录下,如下图所示


     

    然后,我们用nvidia官方出品的digits2.0,将图片做成caffe训练所需要的mdb文件,digits2.0使用教程,大家可以百度,我这边就不详细说了,很简单的,需要注意的是,生成数据集的时候,url要写你已经分类好的数据集的上层文件路径,比如我的数据集放在/home/qi66/CCPR/CCPRTem/train_choseAndCK/下,digits2.0会自动识别这个目录下面有8个文件夹,自动生成8类,8个标签0-7,但是这个标签label的序号和文件夹并不是对应的,这个点大家注意,也就是说,angray不一定是0,这个ubuntu下面和windows下面不一样的。生成好的数据集如下所示:


   

    数据集的路径,就在那个digits2.0文件夹的底层jobs文件夹里,前面的那个路径是固定的。这个数据包括train,val,test三个部分,还有一个东西很重要,我们要用到的是mean.binaryproto,这个文件是所有样本图片的均值,因为CNN训练时候,训练集减去均值之后,训练速度会变快,所以会生成这个,后面我们测试的时候也要用到这个东西。

生成数据集之后,再用digits2.0选择网络和设置参数进行训练,我这个数据集,用alexnet训练了2个多小时吧,完成之后在digits2.0的网页界面上有可以测试单张,和多张图片的选择,其中测试多张的时候,会遇到,点分类按键半天没反应,其实电脑已经开始检测,只是多张数量比较多,会卡一会儿,你等一会儿之后再看,就有结果了。


   

    完成训练之后,我们要找到caffe训练好的网络的参数在哪儿,不用找了,就在digits2.0文件夹下面的那个jobs里面,如图:


   

    我们要用到的就是网络结构deploy.prototxt,和训练好的权值参数—图中黑色的都是的,他们的区别是迭代训练的次数不一样,我们一般选择迭代次数最大的。把这两个文件和上面提到的图像均值文件,一起copy到一个文件夹下面,如图:


   

    图中红色标记的是本次实验需要用到的,其他的请忽略,跟本次实验没关系。好了,现在所有的原材料都已经备齐了,我们测试一张图片需要4个东西:

    (1)网络结构描述文件,deploy.prototxt。

    (2)网络训练好的权值参数文件,图中那个黑色的后缀名是caffemodel的文件。

    (3) 图像的均值文件,这个文件,是不能直接拿来用的,因为python调用的话,需要转换成后缀是npy的均值文件,所以我们要把这个mea文件转换一下。

    (4)输入网络的图片,这个很简单了,你随便找一张图片就可以了。

    首先我们要将均值文件转换一下,转换程序图中的createNpy.py脚本,调用方法,终端进入该目录下,输入代码:

Python createNpy.py mean.binaryproto mean.npy

    运行结果如下:

     

      好了,现在是所有的文件已经备齐了,直接运行该目录下的old_test.py就可以出结果了,还是先上图:

    我们看运行结果,就是先构建网络,然后导入外部权值参数(如图中的第一个标记处),然后进行网络前向计算,最后得出top5结果,标签分别为0,3,7,2,5,其实网络输出最大值是0,也就是说网络认为这是第一类图片,至于有的同学会问,你前面说过这个标签是不对应的,那么如何知道0代表什么意思呢? 我采用的方法是这样的,这个标签我确实不知道,但是digits知道,如下图所示,加入我们在前面digits界面和python代码测试同一张图片,那么前top5的标签我们就对应出来了,0-happy……


    当然,这个方法有点low,苦于楼主目前还是个渣渣,先实现再说,好了,目前流程我们已经走通了,看起来步骤还是蛮简单的,当然digits这部分使用教程我没具体说,这个真的很简单,大家百度一大推。现在我们来看下python代码是如何实现的。贴出代码:


大家别急,听我逐行解释(完全手把手啊):

#1 和前面两行是导入科学计算包 numpy和一个画图的(其实没用到),还有sys包

#2 设置caffe的根文件夹路径

#3 把caffe根文件下的python接口文件夹路径加入系统路径

#4 有个#3之后就可以导入caffe的python接口了(不然不行)

#5 略
#6 设置GPU运行(boss给买了两块泰坦x显卡,物尽其用)

#7 设置网络结构描述文件的绝对路径咯

#8 设置权值文件路径

#9 设置均值文件的路径—就是刚才生成的

#10 构造网络,看其中的参数不就是刚才设置的那俩路径么,模式设置成TEST

#11 调用caffe的io导入权值文件,其实这个我也不太懂(渣渣楼主)大概是这个意思吧,等我后续补充,先实现的

#12 不懂…..

#13 导入mean.npy文件

#14 进行归一化,因为图像像素值是0-255,所以要除以255

#15 不懂…...

#16 导入图片了,这个图像随便选了,大小无所谓

#17 把图像预处理一下,比如要减去均值,然后归一化,然后导入网络的输入端

#18 这个很low拉,就是调用网络前向计算了,结果放在out里面,当然到这一步,大家就可以print一下out看看了,结果已经出来了。

#19 我取了top5的结果放在listtop_k里面

#20 循环打印出结果了

好了,测试代码已经完成了,当然这个是最基本的,测试一张图片的,大家可以根据自己的需要写其他批量测试文件。下面放出npy的转换代码了。createNpy.py代码如下:


    代码如图了,这个就不解释了,没什么需要注意的,按照这个套路,直接调用就可以了。




0 0
原创粉丝点击