1. 程式人生 > >使用Caffe完成圖像目標檢測 和 caffe 全卷積網絡

使用Caffe完成圖像目標檢測 和 caffe 全卷積網絡

-h alt avi 5.0 type multi 序號 forward lin

一、【用Python學習Caffe】2. 使用Caffe完成圖像目標檢測

標簽: pythoncaffe深度學習目標檢測ssd 技術分享 分類:

目錄(?)[+]

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 測試圖像預處理

預處理主要包含兩個部分:

  1. 減去均值
  2. 調整大小
    # 加載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 運行網絡

  1. 導入輸入數據
  2. 通過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 技術分享 分類:

目錄(?)[+]

論文: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.txttest.txt,並3進行訓練
  • 如果顯存超過限制,則需要減小訓練的batchsize
  • 轉換caffemodel並按照教程裏的方式進行測試,可以實時顯示原圖、groudtruth與網絡輸出圖像
  • 原代碼中使用的是plt.show(),需要關閉之後才能繼續運行,為更方便的顯示,可以結合opencvimshowwaitKey

使用Caffe完成圖像目標檢測 和 caffe 全卷積網絡