原博客地址:https://www.2cto.com/kf/201707/659331.html
#coding=utf-
8
#作用:可以用来批处理图片进行分类
import
os
import
caffe
import
numpy as np
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
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) #保存