用训练好的caffemodel分类图片并生成混淆矩阵

一、deploy.prototxt文件

跟train.prototxt有一些差别,data层和softmax层做了修改

1、data层:删掉原来的数据层,换成一下代码

name: "CaffeNet"

layer {
  name: "data"
  type: "Input"
  top: "data"
  input_param { shape: { dim: 1 dim: 3 dim: 63 dim: 63 } }

}

2、softmax层:删掉accuracy和softmaxwithloss层,换成一下代码

layer {

  name: "prob"
  type: "Softmax"
  bottom: "fc8"
  top: "prob"

}

二、均值文件mean.binaryproto转成mean.npy文件

import numpy as np
import sys,caffe
root='/home/ths/6_operation_32_data/'  
mean_proto_path=root+'6_operation_32_nearest2_test_lmdbmean.binaryproto'    
mean_npy_path=root+'6_operation_32_nearest2_test_lmdbmean.npy'              
blob=caffe.proto.caffe_pb2.BlobProto()     
data=open(mean_proto_path,'rb').read()     
blob.ParseFromString(data)                
array=np.array(caffe.io.blobproto_to_array(blob))  

mean_npy=array[0]                         

np.save(mean_npy_path,mean_npy)

三、synset_words.txt

这个文件是标签和对应的索引值,要与训练过程时的标签和索引保持一致

0 ORIGINAL

1 AVE_5

2 CE

3 GAUSSIAN_5

4 JPEG_70

5 MF_5  

6 RESAMPLING_2

四、准备待分类图片的标签文件,这个最后生成混淆矩阵的时候会用到,命名为label.log。注意!!要删掉多余的空行哦!不然会报错!


就只写标签就可以了,因为我把同类图片放到一起了所以我的标签长成这样了。

五、分类:以下代码得到log文件显示的是分类的标签,可根据个人需要更改输出。最后的log文件也要删掉多余的空行!

注意!!!!!这个代码不仅可以分类彩色图片而且可以分类灰度图片,因为caffe在处理单通道的灰度图片的时候会自动把它转成三通道的图片!!!!

#coding=utf-8
#作用:可以用来批处理图片进行分类
import os
import caffe
import numpy as np
import sys
root='E:/class1/' #根目录
temp='E:/class1/'
deploy=root+'net.prototxt'      #deploy文件的路径
caffe_model=temp+'6_operation_64input_iter_54000.caffemodel'  #caffe_model的路径
mean_file=temp+'6_operation_32_nearest2_train_lmdbmean.npy'     #mean_file的路径--注意,在python中要将mean.binaryproto转换为mean.npy格式
labels_filename=root+'synset_words.txt'  #sysset_words.txt的路径
#预读待分类的图片pyth
import os
dir=root+'100JPEGC70/'
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)) #减去均值
#print 'mean-subtracted values:',zip('BGR',np.load(mean_file).mean(1).mean(1))#打印mean的维度
transformer.set_raw_scale('data',255)  #缩放到[0,255]之间
transformer.set_channel_swap('data',(2,1,0))  #交换通道,将图片由RGB变成BGR
import logging
logging.basicConfig(filename='predict.log', filemode="w", level=logging.DEBUG)
#加载图片
for i in range(0,len(filelist)):
    img=filelist[i]   #获取当前图片的路径
    print filenames[i]    #打印当前图片的名称
    #logging.info(filenames[i])
    
    im=caffe.io.load_image(img) #加载图片
    #logging.info(im.shape)
    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  
    print labels[index1],'--',prob[index1]   #输出label--prob
    #logging.info(labels[index1])#输出标签和标签对应的类别
    logging.info(index1)#只输出标签
    #logging.info(prob[index1])   #logging.info在终端不输出,在脚本输出,,本张图片属于此类型的概率

    得到一个predict.log文件,内容如下


最后生成混淆矩阵只需要最后的数字,ctrl+H查找替换,删掉INFO:root:,全部替换


替换完成的效果:


六、生成混淆矩阵

离最后的成功就差这一哆嗦了,哈哈哈!

confusion_matrix.py

# -*- coding: utf-8 -*-
import os
import shutil
from collections import defaultdict
import pandas as pd
import numpy as np
from pandas import Series,DataFrame
import argparse
import logging
logging.basicConfig(filename='matrix.log', filemode="w", level=logging.DEBUG)
if __name__ == "__main__":
parser = argparse.ArgumentParser(
            description = "Plot the detection results output by ssd_detect.")
parser.add_argument("label_file",
            help = "A file which contains all labels.")
parser.add_argument("predict_file",
            help = "A file which contains all results")

args = parser.parse_args()

file_label = args.label_file
file_predict = args.predict_file

  label_list=[]
predict_list=[]

with open(file_label) as m:
   for line in m:
label =  line.split('\r').pop(0)
       temp = label.split()[0]
label_list.append(temp)

with open(file_predict) as n:
   for line in n:
s = line.split('\r').pop(0)
temp = s.split()[0]
predict_list.append(temp)
matrix = [[0 for col in range(7)] for row in range(7)]#这个代码中唯一需要改的地方,要生成几行几列就改成几
print len(label_list)
print len(predict_list)
for i in range(len(label_list)):
   level = int(label_list[i])
   predict = int(predict_list[i])
   matrix[level][predict] +=1
        logging.info(matrix)#只在log文件中显示

#print matrix#只在终端输出

最后在命令行输入python confusion_matrix.py label.log predict.log


如果要得到百分比,就把对应的数字除以该类图像的总数就可以了。



猜你喜欢

转载自blog.csdn.net/qq_37254336/article/details/80728812