python使用训练出的caffemodel模型

环境

模型:训练出的caffemodel模型
标签:synset_word.txt
mean:train_mean.npy

使用

上一篇我们训练出了caffemodel模型,来给c++程序调用。本篇表述使用该模型,python语言。

Caffe均值文件mean.binaryproto转mean.npy

分享代码如下:https://blog.csdn.net/hyman_yx/article/details/51732656

import caffe
import numpy as np

MEAN_PROTO_PATH = 'mean.binaryproto'               # 待转换的pb格式图像均值文件路径
MEAN_NPY_PATH = 'mean.npy'                         # 转换后的numpy格式图像均值文件路径

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)

synset_words.txt

这是类别的标签文件,根据例子更改如下:

0 blue
1 red
2 orange
....

分类

在程序中读取模型文件处理测试图片,代码如下:https://blog.csdn.net/baterforyou/article/details/71430284

    # -*- coding: UTF-8 -*-  
    import os  
    import caffe  
    import numpy as np  
    root='/home/zf/caffe/'#指定根目录  
    deploy=root+'models/bvlc_reference_caffenet/deploy.prototxt'#结构文件  
    caffe_model=root + 'models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel'  
    #已经训练好的model  

    dir =root+'examples/images/'#保存测试图片的集合  
    filelist=[]  
    filenames=os.listdir(dir)  
    for fn in filenames:  
            fullfilename = os.path.join(dir,fn)  
            filelist.append(fullfilename)  
    #filelist.append(fn)  
    def Test(img):  
    #加载模型  
            net = caffe.Net(deploy,caffe_model,caffe.TEST)  

    # 加载输入和配置预处理  
            transformer = caffe.io.Transformer({'data':net.blobs['data'].data.shape})  
            transformer.set_mean('data', np.load('/home/zf/caffe/python/caffe/imagenet/ilsvrc_2012_mean.npy').mean(1).mean(1))  
            transformer.set_transpose('data', (2,0,1))  
            transformer.set_channel_swap('data', (2,1,0))  
            transformer.set_raw_scale('data', 255.0)  

    #注意可以调节预处理批次的大小  
    #由于是处理一张图片,所以把原来的10张的批次改为1  
            net.blobs['data'].reshape(1,3,227,227)  

    #加载图片到数据层  
            im = caffe.io.load_image(img)  
            net.blobs['data'].data[...] = transformer.preprocess('data', im)  

    #前向计算  
            out = net.forward()  

    # 其他可能的形式 : out = net.forward_all(data=np.asarray([transformer.preprocess('data', im)]))  

    #预测分类  
            print out['prob'].argmax()

    #打印预测标签  
            labels = np.loadtxt("/home/zf/caffe/data/ilsvrc12/synset_words.txt", str, delimiter='\t')  
            top_k = net.blobs['prob'].data[0].flatten().argsort()[-1]  
            print 'the class is:',labels[top_k]  
            f=file("/home/zhengfeng/caffe/examples/zf/label.txt","a")  
            f.writelines(img+' '+labels[top_k]+'\n')  
    labels_filename=root +'data/ilsvrc12/synset_words.txt'  
    #循环遍历文件夹root+'examples/images/'下的所有图片  
    for i in range(0,len(filelist)):  
            img=filelist[i]  
            Test(img)  

其他

error: * Error parsing text-format caffe.NetParameter: 7:15: Message type “caffe.LayerParameter” has no field named “input_param”

在faster-rcnn体系中使用标准caffe训练出的模型,其deploy.txt文件格式已经发生了稍微改变,改动如下:

# caffe deploy.txt
name:"GoogleNet"
layer{
name:"data"
type:"Input"
top:"data"
input_param{shape:{dim:1 dim:3 dim:224 dim:224}}
}


# py-faster-rcnn caffe 没有deploy.txt,这里使用原模型的deploy.txt(进行如下更改)
input:"data"
input_shape{
dim:1
dim:3
dim:224
dim:224
}
input:"im_info"
input_shape{
dim:1
dim:3
}
发布了54 篇原创文章 · 获赞 17 · 访问量 4万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章