VGG16提取图像特征 (torch7)
下载pretrained model,保存到当前目录下
- th> caffemodel_url = 'http://www.robots.ox.ac.uk/~vgg/software/very_deep/caffe/VGG_ILSVRC_16_layers.caffemodel'
- th> proto_url='https://gist.github.com/ksimonyan/211839e770f7b538e2d8#file-vgg_ilsvrc_16_layers_deploy-prototxt'
- th> os.execute('wget VGG_ILSVRC_16_layers.caffemodel' .. caffemodel_url)
- th> os.execute('wget VGG_ILSVRC_16_layers_deploy.prototxt' .. proto_url)
使用loadcaffe提取图像特征
-
- require 'torch' -- 使用th命令,可忽略
- require 'nn' -- 修改model用到nn包
- require 'loadcaffe' -- 加在caffe训练的包
- require 'image' -- 加载图像,处理图像,可以使用cv中函数替代
-
- local loadSize = {3,256,256} -- 加载图像scale尺寸
- local sampleSize = {3,224,224} -- 样本尺寸,其实就是选取scale后图像的中间一块
-
- local function loadImage(input)
- -- 将图像缩放到loadSize尺寸,为了保证aspect ratio不变,将短边缩放后,长边按比例缩放
- if input:size(3) < input:size(2) then
- input = image.scale(input,loadSize[2],loadSize[3]*input:size(2)/input:size(3))
- -- 注意image.scale(src,width,height),width对应的是input:size[3],height对应的是input:size[2]
- else
- input = image.scale(input,loadSize[2]*input:size(3)/input:size(2),loadSize[3])
- end
- return input
- end
-
- local bgr_means = {103.939,116.779,123.68} --VGG预训练中的均值
- local function vggPreProcessing(img)
- local img2=img:clone()
- img2[{{1}}] =img2[{{3}}] -- image.load 加载图像是rgb格式,需转化维bgr
- img2[{{3}}] = img[{{1}}]
- img2:mul(255) -- image.load()加载的图像 pixel value in [0,1]
- for i=1,3 do
- img2[i]:add(-bgr_means[i]) -- 中心化
- end
- return img2
- end
-
- local function centerCrop(input)
- local oH = sampleSize[2]
- local oW = sampleSize[3]
- local iW = input:size(3)
- local iH = input:size(2)
- local w1 = math.ceil((iW-oW)/2)
- local h1 = math.ceil((iH-oH)/2)
- local out = image.crop(input,w1,h1,w1+oW,h1+oH)
- return out
- end
-
- local function getPretrainedModel()
- local proto = 'VGG_ILSVRC_16_layers_deploy.prototxt'
- local caffemodel = '/home/zwzhou/modelZoo/VGG_ILSVRC_16_layers.caffemodel'
-
- local model = loadcaffe.load(proto,caffemodel,'nn') -- 加载pretrained model
- for i=1,3 do -- 将最后3层舍掉
- model.modules[#model.modules]=nil
- end
- -- 删除pretrained model的一些层官方方法
- -- ==========================
- -- for i= 40,38,-1 do
- -- model:remove(i)
- -- end
- -- ==========================
- model:add(nn.Normalize(2)) -- 添加一层正则化层,将输出向量归一化
-
- model:evaluate() -- self.training=false ,非训练,让网络参数不变
- return model
- end
-
- torch.setdefaulttensortype('torch.FloatTensor')
- model = getPretrainedModel()
-
- filepath = '/home/zwzhou/MOT16/train/MOT16-02/img1/000001.jpg'
- local img1=image.load(filepath) -- rgb图像
- local input = image.crop(img1,910,480,910+97,480+110) -- 里面参数时选择原图像的一个区域,boundingbox
-
- input = loadImage(input)
- local vggPreProcessed = vggPreProcessing(input)
- local out = centerCrop(vggPreProcessed)
-
- local outputs = model:forward(out)
-
- print(outputs)
- print(#outputs)