使用Caffe完成圖像目標檢測 和 caffe 全卷積網絡
一、【用Python學習Caffe】2. 使用Caffe完成圖像目標檢測
標簽: pythoncaffe深度學習目標檢測ssd 2017-06-22 22:08 207人閱讀 評論(0) 收藏 舉報 分類:版權聲明:本文為博主原創文章,未經博主允許不得轉載。
目錄(?)[+]
2. 使用Caffe完成圖像目標檢測
本節將以一個快速的圖像目標檢測網絡SSD作為例子,通過Python Caffe來進行圖像目標檢測。
必須安裝windows-ssd版本的Caffe,或者自行在caffe項目中添加SSD的新增相關源代碼.
圖像目標檢測網絡同圖像分類網絡的大體原理及結構很相似,不過原始圖像再經過深度網絡後,並不是得到一組反映不同分類種類下概率的向量,而得到若幹組位置信息,其反映不同目標在圖像中的位置及相應分類等信息。但與分類網絡的總體實施結構是一致的。
關於SSD的原理,可以參見其論文:Liu W, Anguelov D, Erhan D, et al. SSD : Single shot multibox detector[C]. In Proc. European Conference on Computer Vision (ECCV). 2016: 21-37.
2.1 準備文件
deploy.prototxt
: 網絡結構配置文件VGG_VOC0712_SSD_300x300_iter_60000.caffemodel
: 網絡權重文件labelmap_voc.prototxt
: 數據集分類名稱- 測試圖像
本文的SSD是在
VOC0712
數據集下進行訓練的,labelmap_voc.prototxt
也是該數據庫下的各目標的名稱,該文件對於目標檢測網絡的訓練任務是必須的,在下節中,我們將重點介紹如何生成LMDB數據庫及Labelmap文件。
2.2 加載網絡
加載網絡的方法,目標檢測網絡同目標分類網絡都是一致的。
caffe_root = ‘../../‘ # 網絡參數(權重)文件 caffemodel = caffe_root + ‘models/SSD_300x300/VGG_VOC0712_SSD_300x300_iter_60000.caffemodel‘ # 網絡實施結構配置文件 deploy = caffe_root + ‘models/SSD_300x300/deploy.prototxt‘ labels_file = caffe_root + ‘data/VOC0712/labelmap_voc.prototxt‘ # 網絡實施分類 net = caffe.Net(deploy, # 定義模型結構 caffemodel, # 包含了模型的訓練權值 caffe.TEST) # 使用測試模式(不執行dropout)
2.3 測試圖像預處理
預處理主要包含兩個部分:
- 減去均值
- 調整大小
# 加載ImageNet圖像均值 (隨著Caffe一起發布的) mu = np.load(caffe_root + ‘python/caffe/imagenet/ilsvrc_2012_mean.npy‘) mu = mu.mean(1).mean(1) # 對所有像素值取平均以此獲取BGR的均值像素值 # 圖像預處理 transformer = caffe.io.Transformer({‘data‘: net.blobs[‘data‘].data.shape}) transformer.set_transpose(‘data‘, (2,0,1)) transformer.set_mean(‘data‘, mu) transformer.set_raw_scale(‘data‘, 255) transformer.set_channel_swap(‘data‘, (2,1,0))
2.4 運行網絡
- 導入輸入數據
- 通過forward()運行結果
# 加載圖像
im = caffe.io.load_image(img)
# 導入輸入圖像
net.blobs[‘data‘].data[...] = transformer.preprocess(‘data‘, im)
start = time.clock()
# 執行測試
net.forward()
end = time.clock()
print(‘detection time: %f s‘ % (end - start))
2.5 查看目標檢測結果
SSD網絡的最後一層名為‘detection_out‘
,該層輸出Blob結構‘detection_out‘
中包含了多組元組結構,每個元組結構包含7個參數,其中第2參數表示分類類別序號,第3個參數表示概率置信度,第4~7個參數分別表示目標區域左上及右下的坐標,而元組的個數表明該圖像中可能的目標個數。
當然可能不同網絡模型的結構不一樣,可能會有不同的設置,但至少對於SSD是這樣設置的。
# 查看目標檢測結果 # 打開labelmap_voc.prototxt文件 file = open(labels_file, ‘r‘) labelmap = caffe_pb2.LabelMap() text_format.Merge(str(file.read()), labelmap) # 得到網絡的最終輸出結果 loc = net.blobs[‘detection_out‘].data[0][0] confidence_threshold = 0.5 for l in range(len(loc)): if loc[l][2] >= confidence_threshold: # 目標區域位置信息 xmin = int(loc[l][3] * im.shape[1]) ymin = int(loc[l][4] * im.shape[0]) xmax = int(loc[l][5] * im.shape[1]) ymax = int(loc[l][6] * im.shape[0]) # 畫出目標區域 cv2.rectangle(im, (xmin, ymin), (xmax, ymax), (55 / 255.0, 255 / 255.0, 155 / 255.0), 2) # 確定分類類別 class_name = labelmap.item[int(loc[l][1])].display_name cv2.putText(im, class_name, (xmin, ymax), cv2.cv.CV_FONT_HERSHEY_SIMPLEX, 1, (55, 255, 155), 2)
2.6 目標檢測結果展示
2.7 具體代碼下載
GitHub倉庫Caffe-Python-Tutorial中的detection.py
項目地址:https://github.com/tostq/Caffe-Python-Tutorial
二、caffe 全卷積網絡
標簽: caffe全卷積網絡fcnsegnet 2017-05-20 17:03 158人閱讀 評論(0) 收藏 舉報 分類:
版權聲明:本文為博主原創文章,未經博主允許不得轉載。
目錄(?)[+]
論文:Long_Fully_Convolutional_Networks
簡介
- 全卷積網絡相對於之前的cnn,是對圖像中的每個像素點進行分類
- 常用於圖像的語義分割中
參考
- https://github.com/shelhamer/fcn.berkeleyvision.org
- 該github的代碼是基於caffe實現了voc的分類,而且給出了很多的caffemodel
- https://zhuanlan.zhihu.com/p/22976342
- 本文主要參考,詳細介紹了fcn,以及其論文等
測試
- 需要下載
pascalVoc
的數據集 -
下載代碼之後,在其根目錄下新建py文件如下
import numpy as np from PIL import Image import matplotlib.pyplot as plt caffe_root = ‘/home/gry/libs/caffe/‘ import sys sys.path.insert(0,caffe_root + ‘python/‘) import caffe fn = ‘data/pascal/VOCdevkit/VOC2012/JPEGImages/2007_000129.jpg‘ im = Image.open( fn ) # im = im.resize([500,500],Image.ANTIALIAS) # im.save("1.jpg","JPEG") npimg = np.array( im, dtype=np.float32 ) print( ‘max val of the npimg is : %f‘%(npimg.max()) ) npimg -= np.array((104.00698793,116.66876762,122.67891434)) npimg.shape npimg = npimg.transpose( (2,0,1) ) # load net # net = caffe.Net( ‘voc-fcn8s/deploy.prototxt‘,‘voc-fcn8s/fcn8s-heavy-pascal.caffemodel‘, caffe.TEST ) net = caffe.Net( ‘voc-fcn16s/deploy.prototxt‘,‘voc-fcn16s/fcn16s-heavy-pascal.caffemodel‘, caffe.TEST ) # shape for input (data blob is N x C x H x W), set data # note : the H X W is not necessary to be equal with the network H X W # but the channel must be equal net.blobs[‘data‘].reshape(1, *npimg.shape) net.blobs[‘data‘].data[...] = npimg # net.blobs[‘data‘].data.shape # run net and take argmax for prediction net.forward() out = net.blobs[‘score‘].data[0].argmax(axis=0) plt.imshow(out,cmap=‘autumn‘);plt.axis(‘off‘) plt.savefig(‘test.png‘) plt.show() print(‘end now‘)
-
用不同的caffemodel得到的結果如下
- 原圖
- voc-fcn8s
- voc-fcn16s
- voc-fcn32s
- 原圖
SegNet
簡介
- 基於caffe
參考鏈接
- https://github.com/alexgkendall/SegNet-Tutorial
- https://github.com/TimoSaemann/caffe-segnet-cudnn5
- https://github.com/alexgkendall/SegNet-Tutorial/blob/master/Example_Models/segnet_model_zoo.md
- https://github.com/alexgkendall/caffe-segnet
*http://mi.eng.cam.ac.uk/projects/segnet/tutorial.html
測試
- 下載基於cudnn5的segnet代碼與segnet-tutorial的代碼,按照參考鏈接裏的教程組織文件結構
- 修改
trian.txt
與test.txt
,並3進行訓練 - 如果顯存超過限制,則需要減小訓練的
batchsize
- 轉換caffemodel並按照教程裏的方式進行測試,可以實時顯示原圖、groudtruth與網絡輸出圖像
- 原代碼中使用的是
plt.show()
,需要關閉之後才能繼續運行,為更方便的顯示,可以結合opencv
的imshow
與waitKey
。
使用Caffe完成圖像目標檢測 和 caffe 全卷積網絡