首页 > 其他 > 详细

用训练好的caffemodel对图片进行分类

时间:2017-01-22 12:17:03      阅读:422      评论:0      收藏:0      [点我收藏+]

一、单个图片进行分类

  这个比较简单,在*.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对图片进行批量分类。

 

用训练好的caffemodel对图片进行分类

原文:http://www.cnblogs.com/yyxf1413/p/6339655.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!