1. 程式人生 > >Faster RCNN演算法解析(附原始碼,可以直接執行)

Faster RCNN演算法解析(附原始碼,可以直接執行)

一、前言知識

1、基於Region Proposal(候選區域)的深度學習目標檢測演算法

Region Proposal(候選區域),就是預先找出圖中目標可能出現的位置,通過利用影象中的紋理、邊緣、顏色等資訊,保證在選取較少視窗(幾千個甚至幾百個)的情況下保持較高的召回率(IoU,Intersection-over-Union)。

2、什麼是IoU?

Intersection over Union是一種測量在特定資料集中檢測相應物體準確度的一個標準。我們可以在很多物體檢測挑戰中,例如PASCAL VOC challenge中看多很多使用該標準的做法。

通常我們在 HOG + Linear SVM object detectors 和 Convolutional Neural Network detectors (R-CNN, Faster R-CNN, YOLO, etc.)中使用該方法檢測其效能。注意,這個測量方法和你在任務中使用的物體檢測演算法沒有關係。

IoU是一個簡單的測量標準,只要是在輸出中得出一個預測範圍(bounding boxex)的任務都可以用IoU來進行測量。為了可以使IoU用於測量任意大小形狀的物體檢測,我們需要:
1、 ground-truth bounding boxes(人為在訓練集影象中標出要檢測物體的大概範圍);
2、我們的演算法得出的結果範圍。

也就是說,這個標準用於測量真實和預測之間的相關度,相關度越高,該值越高。

如下圖:

這裡寫圖片描述

下圖展示了ground-truth和predicted的結果,綠色標線是人為標記的正確結果,紅色標線是演算法預測出來的結果,IoU要做的就是在這兩個結果中測量演算法的準確度。

這裡寫圖片描述

Region Proposal方法比傳統的滑動視窗方法獲取的質量要更高。比較常用的Region Proposal方法有:SelectiveSearch(SS,選擇性搜尋)、Edge Boxes(EB)。

二、R-CNN、Fast R-CNN、Faster R-CNN三者關係

Faster R-CNN是基於R-CNN和Fast R-CNN來進行改進的。

這裡寫圖片描述
三者關係 這裡寫圖片描述
三者比較

關於R-CNN和Fast R-CNN更多細節請看R-CNN和Fast R-CNN

三、Faster R-CNN目標檢測

3.1 Faster R-CNN的思想

Faster R-CNN可以簡單地看做“區域生成網路RPNs + Fast R-CNN”的系統,用區域生成網路代替FastR-CNN中的Selective Search方法。Faster R-CNN這篇論文著重解決了這個系統中的三個問題:
1. 如何設計區域生成網路;
2. 如何訓練區域生成網路;
3. 如何讓區域生成網路和Fast RCNN網路共享特徵提取網路。

在整個Faster R-CNN演算法中,有三種尺度:
1. 原圖尺度:原始輸入的大小。不受任何限制,不影響效能。

  1. 歸一化尺度:輸入特徵提取網路的大小,在測試時設定,原始碼中opts.test_scale=600。anchor在這個尺度上設定。這個引數和anchor的相對大小決定了想要檢測的目標範圍。
  2. 網路輸入尺度:輸入特徵檢測網路的大小,在訓練時設定,原始碼中為224*224。

3.2 Faster R-CNN框架介紹

Input Image–生成候選區域–特徵提取–分類–位置精修
這裡寫圖片描述
Faster R-CNN模型

Faster R-CNN演算法由兩大模組組成:
1.PRN候選框提取模組;
2.Fast R-CNN檢測模組。
其中,RPN是全卷積神經網路,用於提取候選框;Fast R-CNN基於RPN提取的proposal檢測並識別proposal中的目標。

3.3 RPN介紹

3.3.1背景

目前最先進的目標檢測網路需要先用區域建議演算法推測目標位置,像SPPnet和Fast R-CNN這些網路雖然已經減少了檢測網路執行的時間,但是計算區域建議依然耗時較大。所以,在這樣的瓶頸下,RBG和Kaiming He一幫人將Region Proposal也交給CNN來做,這才提出了RPN(Region Proposal Network)區域建議網路用來提取檢測區域,它能和整個檢測網路共享全圖的卷積特徵,使得區域建議幾乎不花時間。

RCNN解決的是,“為什麼不用CNN做classification呢?”

Fast R-CNN解決的是,“為什麼不一起輸出bounding box和label呢?”

Faster R-CNN解決的是,“為什麼還要用selective search呢?”

3.3.2 RPN核心思想

RPN的核心思想是使用CNN卷積神經網路直接產生Region Proposal,使用的方法本質上就是滑動視窗(只需在最後的卷積層上滑動一遍),因為anchor機制和邊框迴歸可以得到多尺度多長寬比的Region Proposal。

RPN網路也是全卷積網路(FCN,fully-convolutional network),可以針對生成檢測建議框的任務端到端地訓練,能夠同時預測出object的邊界和分數。只是在CNN上額外增加了2個卷積層(全卷積層cls和reg)。

①將每個特徵圖的位置編碼成一個特徵向量(256dfor ZF and 512d for VGG)。

②對每一個位置輸出一個objectness score和regressedbounds for k個region proposal,即在每個卷積對映位置輸出這個位置上多種尺度(3種)和長寬比(3種)的k個(3*3=9)區域建議的物體得分和迴歸邊界。

RPN網路的輸入可以是任意大小(但還是有最小解析度要求的,例如VGG是228*228)的圖片。如果用VGG16進行特徵提取,那麼RPN網路的組成形式可以表示為VGG16+RPN。

VGG16:參考

因為我們的最終目標是和Fast R-CNN目標檢測網路共享計算,所以假設這兩個網路共享一系列卷積層。在論文的實驗中,ZF有5個可共享的卷積層, VGG有13個可共享的卷積層。

RPN的具體流程如下:使用一個小網路在最後卷積得到的特徵圖上進行滑動掃描,這個滑動網路每次與特徵圖上n*n(論文中n=3)的視窗全連線(影象的有效感受野很大,ZF是171畫素,VGG是228畫素),然後對映到一個低維向量(256d for ZF / 512d for VGG),最後將這個低維向量送入到兩個全連線層,即bbox迴歸層(reg)和box分類層(cls)。sliding window的處理方式保證reg-layer和cls-layer關聯了conv5-3的全部特徵空間。

reg層:預測proposal的anchor對應的proposal的(x,y,w,h)

cls層:判斷該proposal是前景(object)還是背景(non-object)。

這裡寫圖片描述
RPN框架

在上圖中,要注意,3*3卷積核的中心點對應原圖(re-scale,原始碼設定re-scale為600*1000)上的位置(點),將該點作為anchor的中心點,在原圖中框出多尺度、多種長寬比的anchors。所以,anchor不在conv特徵圖上,而在原圖上。對於一個大小為H*W的特徵層,它上面每一個畫素點對應9個anchor,這裡有一個重要的引數feat_stride = 16, 它表示特徵層上移動一個點,對應原圖移動16個畫素點(看一看網路中的stride就明白16的來歷了)。把這9個anchor的座標進行平移操作,獲得在原圖上的座標。之後根據ground truth label和這些anchor之間的關係生成rpn_lables,具體的方法論文中有提到,根據overlap來計算,這裡就不詳細說明了,生成的rpn_labels中,positive的位置被置為1,negative的位置被置為0,其他的為-1。box_target通過_compute_targets()函式生成,這個函式實際上是尋找每一個anchor最匹配的ground truth box, 然後進行論文中提到的box座標的轉化。

這裡寫圖片描述
九種anchor(三種尺度[128x128;256x256;512x512],三種比例[1:1;1:2;2:1]) 這裡寫圖片描述
Faster R-CNN卷積流程圖

原圖600*1000經CNN卷積後,在CNN最後一層(conv5)得出的是40*60大小的特徵圖,對應文中說的典型值為2400。若特徵圖大小為W*H,則需要W*H*K個anchor,本文中需要40*60*9≈2k個。

在RPN網路中,我們需要重點理解其中的anchors概念,Loss fucntions計算方式和RPN層訓練資料生成的具體細節。

3.4 RPN的平移不變性

在計算機視覺中的一個挑戰就是平移不變性:比如人臉識別任務中,小的人臉(24*24的解析度)和大的人臉(1080*720)如何在同一個訓練好權值的網路中都能正確識別。若是平移了影象中的目標,則建議框也應該平移,也應該能用同樣的函式預測建議框。

傳統有兩種主流的解決方式:
第一、對影象或feature map層進行尺度\寬高的取樣;
第二、對濾波器進行尺度\寬高的取樣(或可以認為是滑動視窗).

但Faster R-CNN解決該問題的具體實現是:通過卷積核中心(用來生成推薦視窗的Anchor)進行尺度、寬高比的取樣,使用3種尺度和3種比例來產生9種anchor。

3.5 視窗分類和位置精修

分類層(cls_score)輸出每一個位置上,9個anchor屬於前景和背景的概率。

視窗迴歸層(bbox_pred)輸出每一個位置上,9個anchor對應視窗應該平移縮放的引數(x,y,w,h)。

對於每一個位置來說,分類層從256維特徵中輸出屬於前景和背景的概率;視窗迴歸層從256維特徵中輸出4個平移縮放參數。

需要注意的是:並沒有顯式地提取任何候選視窗,完全使用網路自身完成判斷和修正。

3.6 學習區域建議損失函式

3.6.1 標籤分類規定

為了訓練RPN,需要給每個anchor分配的類標籤{目標、非目標}。對於positive label(正標籤),論文中給瞭如下規定(滿足以下條件之一即可判為正標籤):
1.與GT包圍盒最高IoU重疊的anchor
2.與任意GT包圍盒的IoU大於0.7的anchor

注意,一個GT包圍盒可以對應多個anchor,這樣一個GT包圍盒就可以有多個正標籤。

事實上,採用第②個規則基本上可以找到足夠的正樣本,但是對於一些極端情況,例如所有的Anchor對應的anchor box與groud truth的IoU不大於0.7,可以採用第一種規則生成。

negative label(負標籤):與所有GT包圍盒的IoU都小於0.3的anchor。

對於既不是正標籤也不是負標籤的anchor,以及跨越影象邊界的anchor我們給予捨棄,因為其對訓練目標是沒有任何作用的。

3.6.2 多工損失(來自Fast R-CNN)

這裡寫圖片描述
multi-task資料結構

這裡一共涉及到兩種損失:分類和迴歸(具體內容可參考論文)
關於迴歸可以參考R-CNN和Fast R-CNN,在這裡不在多述

3.7 非極大值抑制

極大值抑制是用來提出多餘的檢測框,關於該演算法可以參考NMS演算法

4.原始碼

在這裡使用的是谷歌開源的object detection api程式碼,關於該程式碼的安裝配置谷歌物體檢測框架配置教程
在這裡已經配置完成,可以直接執行原始碼!!!
下面是利用訓練好的模型直接檢測物體,除了檢測單幅影象,程式碼中還包括檢測視訊中的物體。

import numpy as np
import os
import six.moves.urllib as urllib
import sys
import tarfile
import tensorflow as tf
import zipfile

from collections import defaultdict
from io import StringIO
from matplotlib import pyplot as plt
from PIL import Image
import cv2

## This is needed to display the images.
#%matplotlib inline

# This is needed since the notebook is stored in the object_detection folder.
sys.path.append("..")

from utils import label_map_util

from utils import visualization_utils as vis_util

# What model to download.
#在官網上下載訓練好的模型
MODEL_NAME = 'faster_rcnn_resnet101_coco_11_06_2017'
MODEL_FILE = MODEL_NAME + '.tar.gz'
DOWNLOAD_BASE = 'http://download.tensorflow.org/models/object_detection/'

# Path to frozen detection graph. This is the actual model that is used for the object detection.
PATH_TO_CKPT = MODEL_NAME + '/frozen_inference_graph.pb'

# List of the strings that is used to add correct label for each box.
PATH_TO_LABELS = os.path.join('data', 'mscoco_label_map.pbtxt')

NUM_CLASSES = 90

#download model
opener = urllib.request.URLopener()
#下載模型,如果已經下載好了下面這句程式碼可以註釋掉
#opener.retrieve(DOWNLOAD_BASE + MODEL_FILE, MODEL_FILE)
tar_file = tarfile.open(MODEL_FILE)
for file in tar_file.getmembers():
  file_name = os.path.basename(file.name)
  if 'frozen_inference_graph.pb' in file_name:
    tar_file.extract(file, os.getcwd())

#Load a (frozen) Tensorflow model into memory.    
detection_graph = tf.Graph()
with detection_graph.as_default():
  od_graph_def = tf.GraphDef()
  with tf.gfile.GFile(PATH_TO_CKPT, 'rb') as fid:
    serialized_graph = fid.read()
    od_graph_def.ParseFromString(serialized_graph)
    tf.import_graph_def(od_graph_def, name='')
#Loading label map    
label_map = label_map_util.load_labelmap(PATH_TO_LABELS)
categories = label_map_util.convert_label_map_to_categories(label_map, max_num_classes=NUM_CLASSES, use_display_name=True)
category_index = label_map_util.create_category_index(categories)
#Helper code
def load_image_into_numpy_array(image):
  (im_width, im_height) = image.size
  return np.array(image.getdata()).reshape(
      (im_height, im_width, 3)).astype(np.uint8)


# For the sake of simplicity we will use only 2 images:
# image1.jpg
# image2.jpg
# If you want to test the code with your images, just add path to the images to the TEST_IMAGE_PATHS.
#測試影象的路徑
PATH_TO_TEST_IMAGES_DIR = 'test_images'
TEST_IMAGE_PATHS = [ os.path.join(PATH_TO_TEST_IMAGES_DIR, 'image{}.jpg'.format(i)) for i in range(1, 4) ]

# Size, in inches, of the output images.
IMAGE_SIZE = (12, 8)

with detection_graph.as_default():
  with tf.Session(graph=detection_graph) as sess:
    for image_path in TEST_IMAGE_PATHS:
      image = Image.open(image_path)
      # the array based representation of the image will be used later in order to prepare the
      # result image with boxes and labels on it.
      image_np = load_image_into_numpy_array(image)
      # Expand dimensions since the model expects images to have shape: [1, None, None, 3]
      image_np_expanded = np.expand_dims(image_np, axis=0)
      image_tensor = detection_graph.get_tensor_by_name('image_tensor:0')
      # Each box represents a part of the image where a particular object was detected.
      boxes = detection_graph.get_tensor_by_name('detection_boxes:0')
      # Each score represent how level of confidence for each of the objects.
      # Score is shown on the result image, together with the class label.
      scores = detection_graph.get_tensor_by_name('detection_scores:0')
      classes = detection_graph.get_tensor_by_name('detection_classes:0')
      num_detections = detection_graph.get_tensor_by_name('num_detections:0')
      # Actual detection.
      (boxes, scores, classes, num_detections) = sess.run(
          [boxes, scores, classes, num_detections],
          feed_dict={image_tensor: image_np_expanded})
      # Visualization of the results of a detection.
      vis_util.visualize_boxes_and_labels_on_image_array(
          image_np,
          np.squeeze(boxes),
          np.squeeze(classes).astype(np.int32),
          np.squeeze(scores),
          category_index,
          use_normalized_coordinates=True,
          line_thickness=8)
      plt.figure(figsize=IMAGE_SIZE)
      plt.imshow(image_np)

實驗結果

這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述

相關推薦

Faster RCNN演算法解析原始碼可以直接執行

一、前言知識 1、基於Region Proposal(候選區域)的深度學習目標檢測演算法 Region Proposal(候選區域),就是預先找出圖中目標可能出現的位置,通過利用影象中的紋理、邊緣、顏色等資訊,保證在選取較少視窗(幾千個甚至幾百個)的情況下保

Hibernate入門原始碼jar包

1. 安裝eclipse hibernate 外掛 http://download.jboss.org/jbosstools/updates/stable/ 選擇   JBoss Application Development    的     Hibernate T

CVPR論文《100+ Times FasterWeighted Median Filter (WMF)》的實現和解析(附原始碼)。 任意半徑中值濾波擴充套件至百分比濾波器O(1)時間複雜度演算法的原理、實現及效果 任意半徑中值濾波擴充套件至百分比濾波器O(1)時間複雜度演算法的原理、實現及

  四年前第一次看到《100+ Times FasterWeighted Median Filter (WMF)》一文時,因為他附帶了原始碼,而且還是CVPR論文,因此,當時也對程式碼進行了一定的整理和解讀,但是當時覺得這個演算法雖然對原始速度有不少的提高,但是還是比較慢。因此,沒有怎麼在意,這幾天有幾位朋友

福利!NodeJs爬取網路教程並生成PDF檔案以阮一峰JavaScript教程和ES6教程為例原始碼和PDF檔案

前言 你想一夜暴富嗎?你想一夜成名嗎?你想開蘭博基尼泡妞嗎?你想拿鈔票點菸嗎?你想成為世界主宰嗎?那麼,趕緊往下看吧,雖然它不能達成前面所說的任 何一個夢想,但是,你將獲得: 通過命令列將某網站的內容轉成PDF檔案 通過NodeJS爬蟲將某網路教程(例如阮一峰的JavaScript教程和ES6教

tensorflow+faster rcnn程式碼解析:anchor_target_layer、proposal_target_layer、proposal_layer

接在tensorflow+faster rcnn程式碼理解(一):構建vgg前端和RPN網路之後,對於每張輸入影象(600×800)RPN會產生17100個anchor,構建RPN後會輸出4個tensor,維度如下: rpn_cls_prob:(1,38,50,18) rpn_bbo

CVPR論文《100+ Times FasterWeighted Median Filter (WMF)》的實現和解析原始碼

      四年前第一次看到《100+ Times FasterWeighted Median Filter (WMF)》一文時,因為他附帶了原始碼,而且還是CVPR論文,因此,當時也對程式碼進行了一定的整理和解讀,但是當時覺得這個演算法雖然對原始速度有不少的提高,但是還是比較慢。因此,沒有怎麼在意,這幾天有

深度學習 影象分割開原始碼連結超級全

轉自github,感謝作者mrgloom的整理 Awesome Semantic Segmentation Networks by architecture Semantic segmentation Instance aware segmentation

SpringMVC增刪改查原始碼新手學SpringMVC最好的辦法就是自己寫一套增刪改查

最近在自學SpringMVC,有Spring的基礎,但不是很深,僅存在於表面。當前在手書籍有《SpringMVC學習指南》 個人認為學習一種MVC框架時,當入了個門之後可以自己寫一套增刪改查,這樣可以

Python 資料結構與演算法——列表連結串列linked list

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

《機器學習實戰》第2章閱讀筆記2 K近鄰演算法實現詳細程式碼及註釋

虛擬碼如下: 對未知類別屬性的資料集中的每個點一次執行以下操作: (1)計算已知類別資料集中的點與當前點之間的距離; (2)按照距離遞增次序排序; (3)選取與當前點距離最小的k個點; (4)確定前k個點所在類別出現的頻率 (5)返回前k個點出現頻率最高的類

OpenGL陰影Shadow Volumes源程式使用 VCGlib

轉載自:http://www.cnblogs.com/liangliangh/p/4165228.html 實驗平臺:Win7,VS2010 先上結果截圖:     本文是我前一篇部落格:OpenGL陰影,Shadow Mapping(附源程式)的下篇,描

java Timer定時任務。每天的某個時刻開啟親測有效直接執行

這是管理類:import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import ja

Faster RCNN演算法訓練程式碼解析2

接著上篇的部落格,我們獲取imdb和roidb的資料後,就可以搭建網路進行訓練了。 我們回到trian_rpn()函式裡面,此時執行完了roidb, imdb = get_roidb(imdb_name),取得了imdb和roidb資料。 先進入第一階段的訓練:   print

Faster RCNN演算法訓練程式碼解析3

四個層的forward函式分析: RoIDataLayer:讀資料,隨機打亂等 AnchorTargetLayer:輸出所有anchors(這裡分析這個) ProposalLayer:用產生的anchors平移整圖,裁剪出界、移除低於閾值的的anchors,排序後使用nms,返回頂部排名的anchors

faster rcnn pytorch 系列:generate_anchors原始碼解析

目錄 首先,新增print,然後直接執行py檔案,生成anchor結果 1.總函式,輸入包括:特徵圖對應於原圖的大小,ratios長寬比,scales放大

教你分分鐘爬取百度貼吧新手可操作原始碼解析

不要以為這個教程很難,其實非常容易上手。並且講解非常詳細。 原理:通過檢視原始碼扣出關鍵資料,然後將其儲存到本地txt檔案下。(一通百通 ,原理大多一樣。) 【新建一個BugBaidu.py檔案,然後將程式碼複製到裡面後,雙擊執行。將貼吧中樓主釋出的內容打包txt儲存到本地。】 學

乾貨原始碼 | 爬取一萬條b站評論分析9.7分的新番憑啥這麼火?

7月番《工作細胞》最終話在十一前放出。這部動漫在b站上評分高達9.7。除了口碑之外,熱度也居高不下,更值得關注的是連很多平時不關注動漫的小夥伴也加入了追番大軍。這次我們的目標是爬取b站上的所有短評進行分析,用資料說明為什麼這部動漫會如此受歡迎。 01 工作細胞 《工作細胞》

安卓識別身份證自動提取身份證資訊功能實現原始碼

原始碼下載地址:注:原始碼裡沒有騰訊優圖的賬號需要填寫自己的 下載地址 先講幾下.首先我們需要去騰訊優圖申請一個賬號,因為身份證識別需要用到第三方介面如圖所示 我申請的是掃描身份證,當然還有其他的功能,比如掃描銀行卡,營業執照,車牌等等  ,大家可以去研究一下

《機器學習實戰》第2章閱讀筆記3 使用K近鄰演算法改進約會網站的配對效果—分步驟詳細講解1——資料準備:從文字檔案中解析資料詳細程式碼及註釋

 本篇使用的資料存放在文字檔案datingTestSet2.txt中,每個樣本資料佔據一行,總共有1000行。 樣本主要包含以下3中特徵: (1)每年獲得飛行常客里程數 (2)玩視訊遊戲所耗時間百分比 (3)每週消費的冰淇淋公升數 在使用分類器之前,需要將處理的檔案格式

最新VIP視訊解析網站搭建教程原始碼

今天交大家搭建一個VIP視訊解析網站,另贈送原始碼,毫無保留的奉獻給大家。 這是演示站:www.wuyyb.com 這個VIP視訊解析網站可以解析優酷、愛奇藝、騰訊視訊、樂視視訊等等,要VIP會員才可以看的電視劇、電影。用此神器看VIP視訊不需要花錢,也不需要註冊,非常簡單好用。下面我就交大家怎麼搭建。1