about 3 years ago

在使用caffe的過程中,不管是做visualization或是將某層的feature拿出來用SVM做training,常常會需要將我們的CNN中的某層Layer的activation拿出來看看,所以如何將model中的某層feature取出來便是十分的重要了。

要將某層的feature萃取出來,必須要用到caffe中幫我們寫好的一個tool,就放在$CAFFE_DIR/build/tools裡。

$CAFFE_DIR/build/tools/extract_features.bin

要怎麼用這個executable呢,可參照caffe官方網站的教學: http://caffe.berkeleyvision.org/gathered/examples/feature_extraction.html

其中要注意的是,教學中的下面這行

build/tools/extract_features.bin examples/imagenet/caffe_reference_imagenet_model examples/_temp/imagenet_val.prototxt fc7 examples/_temp/features 10

其中的fc7是我們要抽的那層layer的名字,10這邊是代表mini batch的數字,mini batch的意義是,每次會extract batch_szie(在imagenet_val.prototxt中定義的)乘上mini batch這麼多張image的feature。

而最後萃取出來的feature會以leveldb的形式儲存,需要透過一些方法將他拿出來,下面是個用python寫成的簡單sample。

readDB.py
#!/usr/bin/env python

import leveldb
import binascii
import numpy as np
import caffe
import sys
from caffe.proto import caffe_pb2

// parse input argument
dbName = sys.argv[1]

# open leveldb files

db = leveldb.LevelDB(dbName)

# get db iterator

it = db.RangeIter()

for key,value in it:
    # convert string to datum

    datum = caffe_pb2.Datum.FromString(db.Get(key))
    
    # convert datum to numpy string

    arr = caffe.io.datum_to_array(datum)[0]
    
    i = 0
    tmpS = ''
    
    # convert to svm format

    for i in range(0, len(arr)):
        tmpS += str(i+1) + ':' + str(arr[i].tolist()[0]) + ' '
    print tmpS

← [Django] How to install Django