一、单个图片进行分类
这个比较简单,在*.bat文件中输入以下代码:
@echo off set BIN_DIR=D:\caffe\caffe-windows\Build\x64\Release set DEPLOY_DIR=D:\gaokun\caffe_train_test_tool set CAFFEMODEL_DIR=D:\ChineseCharacterdata\caffemodel\HCL_1_800_HWDB_Train_3232 set MEAN_DIR=D:\ChineseCharacterdata\HCL_1_800_HWDB_Train_3232 set LABEL_DIR=D:\gaokun\caffe_train_test_tool set IMG_DIR=D:\gaokun\testImg\Img echo "run classification caffe ... !" %BIN_DIR%/classification.exe %DEPLOY_DIR%\*.prototxt %CAFFEMODEL_DIR%\*.caffemodel %MEAN_DIR%\mean.binaryproto %LABEL_DIR%\synset_words.txt %IMG_DIR%\*.png
设置好相关路径后,双击*.bat文件即可运行。
二、批量对图片进行分类
在对单个图片进行分类就想知道如何批量对图片进行分类。自己搜索了一些资料,发现需要调用python,使用python文件实现目的。
下面是批量对图片进行分类的代码(自己修改):
#coding=utf-8 #作用:可以用来批处理图片进行分类 import os import caffe import numpy as np root='C:/Users/Administrator/Desktop/' #根目录 deploy=root+'11/alexnet.prototxt' #deploy文件的路径 caffe_model=root+'11/HCL_1_800_HWDB_Train_3232_iter_480000.caffemodel' #caffe_model的路径 mean_file=root+'11/mean.npy' #mean_file的路径--注意,在python中要将mean.binaryproto转换为mean.npy格式 labels_filename=root+'11/synset_words.txt' #sysset_words.txt的路径 #预读待分类的图片 import os dir=root+'Img/' filelist=[] filenames=os.listdir(dir) #返回指定目录下的所有文件和目录名 for fn in filenames: fullfilename=os.path.join(dir,fn) #os.path.join--拼接路径 filelist.append(fullfilename) #filelist里存储每个图片的路径 net=caffe.Net(deploy,caffe_model,caffe.TEST) #加载model和network #图片预处理设置 transformer=caffe.io.Transformer({'data':net.blobs['data'].data.shape}) #设定图片的格式(1,3,28,28) transformer.set_transpose('data',(2,0,1)) #改变维度的顺序,由原始图片(28,28,3)变为(3,28,28) transformer.set_mean('data',np.load(mean_file).mean(1).mean(1)) #减去均值 transformer.set_raw_scale('data',255) #缩放到[0,255]之间 transformer.set_channel_swap('data',(2,1,0)) #交换通道,将图片由RGB变成BGR #加载图片 for i in range(0,len(filelist)): img=filelist[i] #获取当前图片的路径 print filenames[i] #打印当前图片的名称 im=caffe.io.load_image(img) #加载图片 net.blobs['data'].data[...]=transformer.preprocess('data',im) #执行上面的预处理操作,并将图片载入到blob中 #执行测试 out=net.forward() labels=np.loadtxt(labels_filename,str,delimiter='/t') #读取类别名称文件 prob=net.blobs['prob'].data[0].flatten() #取出最后一层(prob)属于某个类标的概率值,'prob'为最后一层的名称 #print prob index1=prob.argsort()[-1] #获取最大概率值对应的index index2=prob.argsort()[-2] #获取第二大概率值对应的index index3=prob.argsort()[-3] #获取第三大概率值对应的index index4=prob.argsort()[-4] #获取第四大概率值对应的index print labels[index1],'--',prob[index1] #输出label--prob print labels[index2],'--',prob[index2] print labels[index3],'--',prob[index3] print labels[index4],'--',prob[index4]
在这里需要注意是:
(1) "import caffe"的前提是需要编译了pycaffe,具体可以看我的caffe小问题汇总(持续更新)第5个问题
(2) 在这里均值文件mean.binaryproto需要转换为mean.npy文件,其python代码如下:
#!/usr/bin/env python--将mean.binaryproto文件转为python可以使用的mean.npy文件 import numpy as np import sys,caffe root='C:/Users/Administrator/Desktop/11/' #设置根目录 mean_proto_path=root+'mean.binaryproto' #mean.binaryproto路径 mean_npy_path=root+'mean.npy' #mean.npy路径 blob=caffe.proto.caffe_pb2.BlobProto() #创建protobuf blob data=open(mean_proto_path,'rb').read() #读入mean.binaryproto文件内容 blob.ParseFromString(data) #解析文件内容到blob array=np.array(caffe.io.blobproto_to_array(blob)) #将blob中的均值转换称numpy格式,array的shape(mean_number,channel,hight,width) mean_npy=array[0] #一个array中可以有多组均值存在,故需要通过下标选择一组均值 np.save(mean_npy_path,mean_npy) #保存
如此,只要设定相关的路径,即可利用训练好的caffemodel对图片进行批量分类。