Caffe SSD的resize過程解析

2021-09-08 23:01:26 字數 2111 閱讀 8283

問題描述

在windows平台上,本地訓練ssd_512得到了對應的權值引數檔案,載入模型進行前向測試的時候,發現呼叫caffe.io.transformer中的resize處理函式速度太慢,打算用opencv的resize做替換,因此更改了輸入到模型中的預處理過程,使用caffe.io.transformer進行預處理的過程如下:

import numpy as np 

import sys,os

# 設定當前的工作環境在caffe下

caffe_root = '/home/***/caffe/'

# 我們也把caffe/python也新增到當前環境

sys.path.insert(0, caffe_root + 'python')

import caffe

os.chdir(caffe_root)#更換工作目錄

# 設定網路結構

net_file=caffe_root + 'models/bvlc_reference_caffenet/deploy.prototxt'

# 新增訓練之後的引數

caffe_model=caffe_root + 'models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel'

# 均值檔案

mean_file=caffe_root + 'python/caffe/imagenet/ilsvrc_2012_mean.npy'

# 這裡對任何乙個程式都是通用的,就是處理

# 把上面新增的兩個變數都作為引數構造乙個net

net = caffe.net(net_file,caffe_model,caffe.test)

# 得到data的形狀,這裡的是預設matplotlib底層載入的

transformer = caffe.io.transformer()

# matplotlib載入的image是畫素[0-1],的資料格式[weight,high,channels],rgb

# caffe載入的需要的是[0-255]畫素,資料格式[channels,weight,high],bgr,那麼就需要轉換

# channel 放到前面

transformer.set_transpose('data', (2,0,1))

transformer.set_mean('data', np.load(mean_file).mean(1).mean(1))

# 畫素放大到[0-255]

transformer.set_raw_scale('data', 255)

# rgb-->bgr 轉換

transformer.set_channel_swap('data', (2,1,0))

# 這裡才是載入

# 用上面的transformer.preprocess來處理剛剛載入

net.blobs['data'].data[...] = transformer.preprocess('data',im)

#注意,網路開始向前傳播啦

out = net.forward()

# 最終的結果: 當前這個的屬於哪個物體的概率(列表表示)

output_prob = output['prob'][0]

# 找出最大的那個概率

print 'predicted class is:', output_prob.argmax()

用opencv2中的resize函式替換之後,檢測的結果很差,最終通過比較兩種resize方式對同一張處理後結果的差異,發現兩種方式存在不同,雖然說差異很小,但是也會嚴重影響檢測結果,原因可能如下:

模型不夠魯棒

caffe中的resize和opencv中的resize的預設插值方式可能不同,這點需要看原始碼進行確認

在ubuntu上不存在這個問題,猜想可能是在windows下的caffe不是官方提供的,可能處理方式存在差異

最終,全部採用caffe.io.transformer的方式進行的預處理,檢測結果恢復正常。

caffe ssd細節梳理

為期一周結合ssd原始碼對ssd的細節進行梳理,其實有些地方仍然不是很明白,但是還是要對自己一周的工作進行總結。ssd演算法,其英文全名是single shot multibox detector,屬於one stage方法,multibox指明了ssd演算法是多框 是相對於rcnn系列目標檢測演算...

caffe ssd訓練流程

資料處理 1.準備資料集放於 work ssd caffe data traindata裡面jpegimages,annotations 修改引數1 txt.py 裡的 tv 引數,表示 訓練用了多少資料,剩下的就是測試資料。修改引數2 labelmap voc.prototxt裡的標籤 item ...

caffe ssd訓練kitti lisa資料集

目的 將kitti lisa資料集合並,進行訓練 一 資料集準備,將兩種資料集準備成voc格式 kitti資料集 車輛行人等 lisa資料集 47種交通標誌 1 準備kitti資料集 建立vocdevkit traffic,並為其建立子目錄 annotations,imagesets,jpegima...