keras框架:目標檢測Faster-RCNN思想及代碼

Faster-RCNN(RPN + CNN + ROI)概念

Faster RCNN可以分為4個主要內容:

  1. Conv layers:作為一種CNN網絡目標檢測方法,Faster RCNN首先使用一組基礎的conv+relu+pooling層提取 image的feature maps。該feature maps被共享用于后續 RPN層和全連接層。
  2. Region Proposal Networks:RPN網絡用于生成region proposals。通過softmax判斷anchors屬于positive或者 negative,再利用bounding box regression修正anchors 獲得精確的proposals。
  3. Roi Pooling:該層收集輸入的feature maps和proposals, 綜合這些信息后提取proposal feature maps,送入后續 全連接層判定目標類別。
  4. Classification:利用proposal feature maps計算 proposal的類別,同時再次bounding box regression獲 得檢測框最終的精確位置。
    在這里插入圖片描述

整體流程:

在這里插入圖片描述

Faster-RCNN:conv layer

Conv layers包含了conv,pooling,relu三種層。共有13個conv層,13個relu層,4個pooling層。
在Conv layers中:

  1. 所有的conv層都是:kernel_size=3,pad=1,stride=1
  2. 所有的pooling層都是:kernel_size=2,pad=1,stride=2

在Faster RCNN Conv layers中對所有的卷積都做了pad處理( pad=1,即填充一圈0),導致原圖 變為 (M+2)x(N+2)大小,再做3x3卷積后輸出MxN 。正是這種設置,導致Conv layers中的conv層 不改變輸入和輸出矩陣大小。
在這里插入圖片描述
類似的是,Conv layers中的pooling層kernel_size=2,stride=2。 這樣每個經過pooling層的MxN矩陣,都會變為(M/2)x(N/2)大小。
綜上所述,在整個Conv layers中,conv和relu層不改變輸入輸出大小,只有pooling層使輸出長 寬都變為輸入的1/2。
那么,一個MxN大小的矩陣經過Conv layers固定變為(M/16)x(N/16)。 這樣Conv layers生成的feature map都可以和原圖對應起來。

Faster-RCNN:Region Proposal Networks(RPN)

區域生成網絡Region Proposal Networks(RPN)

經典的檢測方法生成檢測框都非常耗時。直接使用RPN生成檢測框,是Faster R-CNN的巨大優勢,能極大提升檢測框的生成速度。
在這里插入圖片描述
? 可以看到RPN網絡實際分為2條線:

  1. 上面一條通過softmax分類anchors獲得positive和negative分類;
  2. 下面一條用于計算對于anchors的bounding box regression偏移量,以獲得精確的proposal。

? 而最后的Proposal層則負責綜合positive anchors和對應bounding box regression偏移量獲取 proposals,同時剔除太小和超出邊界的proposals。
? 其實整個網絡到了Proposal Layer這里,就完成了相當于目標定位的功能。

anchors

RPN網絡在卷積后,對每個像素點,上采樣映射到原始圖像一個區域,找到這 個區域的中心位置,然后基于這個中心 位置按規則選取9種anchor box。
9個矩形共有3種面積:128,256,512; 3種形狀:長寬比大約為1:1, 1:2, 2:1。 (不是固定比例,可調) 每行的4個值表示矩形左上和右下角點坐標。
在這里插入圖片描述
遍歷Conv layers獲得的feature maps,為每一個點都 配備這9種anchors作為初始的檢測框。
在這里插入圖片描述
這些anchor box都是對應于原圖的尺寸,可以直接使用標記的候選框和分類結果進行訓練。其中:

  1. 把每個標定的ground-truth box與其重疊最大的anchor box記為正樣本。(保證每個ground-truth box 至少對應一個正樣本anchor)
  2. 剩余的anchor box與某個ground-truth box重疊大于0.7的記為正樣本。(每個ground-truth box可能 會對應多個正樣本anchor。但每個正樣本anchor只可能對應一個grand-truth box)
  3. 與任意一個標記ground-truth box重疊小于0.3的anchor box記為負樣本。
  4. 其余的舍棄。 這樣做獲得檢測框很不準確,通過后面的2次bounding box regression可以修正檢測框位置。

softmax判定positive與negative

其實RPN最終就是在原圖尺度上,設置了密密麻麻的候選Anchor。然后用cnn去判斷哪些Anchor是里面 有目標的positive anchor,哪些是沒目標的negative anchor。所以,僅僅是個二分類而已。
在這里插入圖片描述
可以看到其num_output=18,也就是經過該卷積的輸出圖像為WxHx18大小。
這也就剛好對應了feature maps每一個點都有9個anchors,同時每個anchors又有可能是positive和 negative,所有這些信息都保存在WxHx(9*2)大小的矩陣。
注意這里的18,后面之所以reshape成為18也是因為對應這18個元素的原因
為何這樣做?
后面接softmax分類獲得positive anchors,也就相當于初步提取了檢測目標候選區域box (一般認為目標在positive anchors中)。

那么為何要在softmax前后都接一個reshape layer?
其實只是為了便于softmax分類。 前面的positive/negative anchors的矩陣,其在caffe中的存儲形式為[1, 18, H, W]。而在softmax 分類時需要進行positive/negative二分類,所以reshape layer會將其變為[1, 2, 9xH, W]大小,即 單獨“騰空”出來一個維度以便softmax分類,之后再reshape回復原狀。

對proposals進行bounding box regression

在這里插入圖片描述
可以看到其 num_output=36,即經過該卷積輸出圖像為WxHx36。 這里相當于feature maps每個點都有9個anchors,每個anchors又都有4個用于回歸的變換量:
在這里插入圖片描述

Proposal Layer

Proposal Layer負責綜合所有變換量和positive anchors,計算出精準的proposal,送入后續RoI Pooling Layer。
Proposal Layer有4個輸入:

  1. positive vs negative anchors分類器結果rpn_cls_prob_reshape,
  2. 對應的bbox reg的變換量rpn_bbox_pred,
  3. im_info
  4. 參數feat_stride=16

im_info:對于一副任意大小PxQ圖像,傳入Faster RCNN前首先reshape到固定MxN,im_info=[M, N, scale_factor]則保存了此次縮放的所有信息。
輸入圖像經過Conv Layers,經過4次pooling變為WxH=(M/16)x(N/16)大小,其中feature_stride=16則保 存了該信息用于計算anchor偏移量。

Proposal Layer 按照以下順序依次處理:

  1. 利用變換量對所有的anchors做bbox regression回歸
  2. 按照輸入的positive softmax scores由大到小排序anchors,提取前pre_nms_topN(e.g. 6000)個anchors, 即提取修正位置后的positive anchors。
  3. 限定超出圖像邊界的positive anchors為圖像邊界,防止后續roi pooling時proposal超出圖像邊界。
  4. 剔除尺寸非常小的positive anchors。
  5. 對剩余的positive anchors進行NMS(non-maximum suppression)。
  6. 之后輸出proposal。

注意,由于在第三步中將anchors映射回原圖判斷是否超出邊界,所以這里輸出的proposal是對應MxN輸 入圖像尺度的,這點在后續網絡中有用。
嚴格意義上的檢測應該到此就結束了,后續部分應該屬于識別了。

RPN網絡結構就介紹到這里,總結起來就是:

生成anchors -> softmax分類器提取positvie anchors -> bbox reg回歸positive anchors -> Proposal Layer生成proposals

Faster-RCNN:Roi pooling

RoI Pooling概念

RoI Pooling層則負責收集proposal,并計算出proposal feature maps,送入后續網絡。
Rol pooling層有2個輸入:

  1. 原始的feature maps
  2. RPN輸出的proposal boxes(大小各不相同)

為何需要RoI Pooling?
對于傳統的CNN(如AlexNet和VGG),當網絡訓練好后輸入的圖像尺寸必須是固定值,同時網絡輸出也 是固定大小的vector or matrix。如果輸入圖像大小不定,這個問題就變得比較麻煩。
有2種解決辦法:

  1. 從圖像中crop一部分傳入網絡將圖像(破壞了圖像的完整結構)
  2. warp成需要的大小后傳入網絡(破壞了圖像原始形狀信息在這里插入圖片描述

RoI Pooling原理

新參數pooled_w、pooled_h和spatial_scale(1/16)
RoI Pooling layer forward過程:

  1. 由于proposal是對應MN尺度的,所以首先使用spatial_scale參數將其映射回(M/16)(N/16)大小 的feature map尺度;
  2. 再將每個proposal對應的feature map區域水平分為poold_w * pooled_h的網格;
  3. 對網格的每一份都進行max pooling處理。

這樣處理后,即使大小不同的proposal輸出結果都是poold_w * pooled_h固定大小,實現了固定長度輸出。
在這里插入圖片描述

Faster-RCNN: Classification

Classification部分利用已經獲得的proposal feature maps,通過full connect層與softmax計算每個proposal具體屬于那個類別(如人,車,電視等),輸出cls_prob概率向量;
同時再次利用bounding box regression獲得每個proposal的位置偏移量bbox_pred,用于回歸更加精確的目標檢測框。
在這里插入圖片描述
從RoI Pooling獲取到poold_w * pooled_h大小的proposal feature maps后,送入后續網絡,做了如下2 件事:

  1. 通過全連接和softmax對proposals進行分類,這實際上已經是識別的范疇了
  2. 再次對proposals進行bounding box regression,獲取更高精度的預測框

全連接層InnerProduct layers:
在這里插入圖片描述
輸入X和輸出Y是固定大小。所以,這也就印證了之前Roi Pooling的 必要性
在這里插入圖片描述

代碼實現:

因為代碼非常多,所以放在資源里面。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/389462.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/389462.shtml
英文地址,請注明出處:http://en.pswp.cn/news/389462.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

算法偏見是什么_算法可能會使任何人(包括您)有偏見

算法偏見是什么在上一篇文章中,我們展示了當數據將情緒從動作中剝離時會發生什么 (In the last article, we showed what happens when data strip emotions out of an action) In Part 1 of this series, we argued that data can turn anyone into a psychopath, …

大數據筆記-0907

2019獨角獸企業重金招聘Python工程師標準>>> 復習: 1.clear清屏 2.vi vi xxx.log i-->edit esc-->command shift:-->end 輸入 wq 3.cat xxx.log 查看 --------------------------- 1.pwd 查看當前光標所在的path 2.家目錄 /boot swap / 根目錄 起始位置 家…

Tensorflow框架:目標檢測Yolo思想

Yolo-You Only Look Once YOLO算法采用一個單獨的CNN模型實現end-to-end的目標檢測: Resize成448448,圖片分割得到77網格(cell)CNN提取特征和預測:卷積部分負責提取特征。全鏈接部分負責預測:過濾bbox(通過nms&#…

線性回歸非線性回歸_了解線性回歸

線性回歸非線性回歸Let’s say you’re looking to buy a new PC from an online store (and you’re most interested in how much RAM it has) and you see on their first page some PCs with 4GB at $100, then some with 16 GB at $1000. Your budget is $500. So, you es…

樸素貝葉斯和貝葉斯估計_貝葉斯估計收入增長的方法

樸素貝葉斯和貝葉斯估計Note from Towards Data Science’s editors: While we allow independent authors to publish articles in accordance with our rules and guidelines, we do not endorse each author’s contribution. You should not rely on an author’s works wi…

numpy統計分布顯示

import numpy as np from sklearn.datasets import load_iris dataload_iris()petal_lengthnumpy.array(list(len[2]for len in data[data]))#取出花瓣長度數據 print(np.max(petal_length))#花瓣長度最大值 print(np.mean(petal_length))#花瓣長度平均值 print(np.std(petal_l…

python數據結構:進制轉化探索

*********************************第一部分******************************************************************************************************************************************************************************************# 輸入excel的行號,…

Keras框架:人臉檢測-mtcnn思想及代碼

人臉檢測-mtcnn 概念: MTCNN,英文全稱是Multi-task convolutional neural network,中文全稱是多任務卷積神經網絡, 該神經網絡將人臉區域檢測與人臉關鍵點檢測放在了一起。 從工程實踐上,MTCNN是一種檢測速度和準確率…

python中格式化字符串_Python中所有字符串格式化的指南

python中格式化字符串Strings are one of the most essential and used datatypes in programming. It allows the computer to interact and communicate with the world, such as printing instructions or reading input from the user. The ability to manipulate and form…

Javassist實現JDK動態代理

提到JDK動態代理,相信很多人并不陌生。然而,對于動態代理的實現原理,以及如何編碼實現動態代理功能,可能知道的人就比較少了。接下一來,我們就一起來看看JDK動態代理的基本原理,以及如何通過Javassist進行模…

數據圖表可視化_數據可視化如何選擇正確的圖表第1部分

數據圖表可視化According to the World Economic Forum, the world produces 2.5 quintillion bytes of data every day. With so much data, it’s become increasingly difficult to manage and make sense of it all. It would be impossible for any person to wade throug…

Keras框架:實例分割Mask R-CNN算法實現及實現

實例分割 實例分割(instance segmentation)的難點在于: 需要同時檢測出目標的位置并且對目標進行分割,所以這就需要融合目標檢測(框出目標的位置)以及語義分割(對像素進行分類,分割…

機器學習 缺陷檢測_球檢測-體育中的機器學習。

機器學習 缺陷檢測🚩 目標 (🚩Objective) We want to evaluate the quickest way to detect the ball in a sport event in order to develop an Sports AI without spending a million dollars on tech or developers. Quickly we find out that detec…

莫煩Pytorch神經網絡第二章代碼修改

import torch import numpy as np""" Numpy Torch對比課程 """ # #tensor與numpy格式數據相互轉換 # np_data np.arange(6).reshape((2,3)) # print(np_data) # # torch_data torch.from_numpy(np_data) # print(\n,torch_data) # # tensor2ar…

自定義字符類

當 VC不使用MFC,無法使用屬于MFC的CString,為此自定義一個,先暫時使用,后續完善。 頭文件: #pragma once#define MAX_LOADSTRING 100 // 最大字符數class CString {public:char *c_str, cSAr[MAX_LOADSTRING];WCHAR *w…

使用python和javascript進行數據可視化

Any data science or data analytics project can be generally described with the following steps:通常可以通過以下步驟來描述任何數據科學或數據分析項目: Acquiring a business understanding & defining the goal of a project 獲得業務理解并定義項目目…

Android 事件處理

事件就是用戶對圖形的操作,在android手機和平板電腦上,主要包含物理按鍵事件和觸摸屏事件兩類。物理按鍵事件包含:按下、抬起、長按等;觸摸屏事件主要包含按下、抬起、滾動、雙擊等。 在View中提供了onTouchEvent()方法&#xff0…

莫煩Pytorch神經網絡第三章代碼修改

3.1Regression回歸 import torch import torch.nn.functional as F from torch.autograd import Variable import matplotlib.pyplot as plt""" 創建數據 """x torch.unsqueeze(torch.linspace(-1,1,100),dim1) y x.pow(2) 0.2*torch.rand(x…

為什么餅圖有問題

介紹 (Introduction) It seems as if people are split on pie charts: either you passionately hate them, or you are indifferent. In this article, I am going to explain why pie charts are problematic and, if you fall into the latter category, what you can do w…

New Distinct Substrings(后綴數組)

New Distinct Substrings&#xff08;后綴數組&#xff09; 給定一個字符串&#xff0c;求不相同的子串的個數。\(n<50005\)。 顯然&#xff0c;任何一個子串一定是后綴上的前綴。先&#xff08;按套路&#xff09;把后綴排好序&#xff0c;對于當前的后綴\(S_i\)&#xff0…