首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >咖啡的特征提取太慢了吗?caffe.Classifier或caffe.Net

咖啡的特征提取太慢了吗?caffe.Classifier或caffe.Net
EN

Stack Overflow用户
提问于 2016-04-04 14:38:11
回答 1查看 1.5K关注 0票数 4

我训练过一个有图像的模特。现在希望将fc-6特性提取到.npy文件中。我使用caffe.set_mode_gpu()运行caffe.Classifier并提取特性。

而不是每帧提取和保存特征。我将文件夹的所有功能保存到临时变量中,将完整视频的结果保存到npy文件(减少磁盘写入操作的次数)。

我还听说我可以使用Caffe.Net,然后传递一批图像。但我不确定需要做什么预处理,这是否更快?

代码语言:javascript
复制
import os
import shutil
import sys
import glob
from multiprocessing import Pool
import numpy as np
import os, sys, getopt
import time


def keep_fldrs(path,listr):
    ll =list()
    for x in listr:
        if os.path.isdir(path+x):
            ll.append(x)
    return ll

def keep_img(path,listr):
    ll = list()
    for x in listr:
        if os.path.isfile(path+str(x)) & str(x).endswith('.jpg'):
            ll.append(x)
    return ll
def ifdir(path):
    if not os.path.isdir(path):
        os.makedirs(path)

# Main path to your caffe installation
caffe_root = '/home/anilil/projects/lstm/lisa-caffe-public/python'

# Model prototxt file
model_prototxt = '/home/anilil/projects/caffe2tensorflow/deploy_singleFrame.prototxt'

# Model caffemodel file
model_trained = '/home/anilil/projects/caffe2tensorflow/snapshots_singleFrame_flow_v2_iter_55000.caffemodel'
sys.path.insert(0, caffe_root)
import caffe
caffe.set_mode_gpu()
net = caffe.Classifier(model_prototxt, model_trained,
                           mean=np.array([128, 128, 128]),
                           channel_swap=(2,1,0),
                           raw_scale=255,
                           image_dims=(255, 255))

Root='/media/anilil/Data/Datasets/UCf_scales/ori_mv_vis/Ori_MV/'
Out_fldr='/media/anilil/Data/Datasets/UCf_scales/ori_mv_vis/feat_fc6/'
allcalsses=keep_fldrs(Root,os.listdir(Root))
for classin in allcalsses:
    temp_class=Root+classin+'/'
    temp_out_class=Out_fldr+classin+'/'
    ifdir(temp_out_class)
    allvids_folders=keep_fldrs(temp_class,os.listdir(temp_class))
    for each_vid_fldr in allvids_folders:
        temp_pres_dir=temp_class+each_vid_fldr+'/'
        temp_out_pres_dir=temp_out_class+each_vid_fldr+'/'
        ifdir(temp_out_pres_dir)
        all_images=keep_img(temp_pres_dir,os.listdir(temp_pres_dir))
        frameno=0
        if os.path.isfile(temp_out_pres_dir+'video.npy'):
            continue
        start = time.time()
        temp_npy= np.ndarray((len(all_images),4096),dtype=np.float32)
        for each_image in all_images:
            input_image = caffe.io.load_image(temp_pres_dir+each_image)
            prediction = net.predict([input_image],oversample=False)
            temp_npy[frameno,:]=net.blobs['fc6'].data[0]
            frameno=frameno+1
        np.save(temp_out_pres_dir+'video.npy',temp_npy)
        end = time.time()
        print "lenght of imgs {} and time taken is {}".format(len(all_images),(end - start))
    print ('Class {} done'.format(classin))

输出

代码语言:javascript
复制
lenght of imgs 426 and time taken is 388.539139032
lenght of imgs 203 and time taken is 185.467905998

每幅图像所需的时间约为0.9秒-

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-05 09:39:31

我在这个帖子。找到了最好的答案

直到现在我还用了一个

代码语言:javascript
复制
net = caffe.Classifier(model_prototxt, model_trained,
                           mean=np.array([128, 128, 128]),
                           channel_swap=(2,1,0),
                           raw_scale=255,
                           image_dims=(255, 255))

初始化模型并获取每个图像的输出。但是这种方法非常慢,每幅图像大约需要.9秒。

最好的方法是传递一批图像(可能是100,200,250)。取决于您在GPU上有多少内存。

为此,我将caffe.set_mode_gpu()设置为有一个,当您发送大批时,速度会更快。用你训练过的模型初始化模型。

代码语言:javascript
复制
net=caffe.Net(model_prototxt,model_trained,caffe.TEST)

创建一个转换器,并确保设置均值和其他值取决于你如何训练你的模型。

代码语言:javascript
复制
transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})
transformer.set_transpose('data', (2,0,1)) # height*width*channel -> channel*height*width
mean_file = np.array([128, 128, 128])
transformer.set_mean('data', mean_file) #### subtract mean ####
transformer.set_raw_scale('data', 255) # pixel value range
transformer.set_channel_swap('data', (2,1,0)) # RGB -> BGR
data_blob_shape = net.blobs['data'].data.shape
data_blob_shape = list(data_blob_shape)

读取一组图像并转换为网络输入。

代码语言:javascript
复制
net.blobs['data'].reshape(len(all_images), data_blob_shape[1], data_blob_shape[2], data_blob_shape[3])
images = [temp_pres_dir+str(x) for x in all_images]
net.blobs['data'].data[...] = map(lambda x: 
transformer.preprocess('data',caffe.io.load_image(x)), images)

通过网络传递批次图像。

代码语言:javascript
复制
out = net.forward()

您可以根据自己的意愿使用此输出。

每幅图像的速度现在是20毫秒。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36405677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档