分一分演算法
㈠ 目標檢測演算法的分步介紹(第 1 部分)
英文原文: https://www.analyticsvidhya.com/blog/2018/10/a-step-by-step-introction-to-the-basic-object-detection-algorithms-part-1/
對原文的表達有部分改動
在本文中,我們將更深入地研究可用於目標檢測的各種演算法。我們將從 RCNN 家族的演算法開始,即 RCNN、Fast RCNN 和 Faster RCNN。在本系列即將發布的文章中,我們將介紹更高級的演算法,如 YOLO、SSD 等。
下圖是說明目標檢測演算法如何工作的一個流行示例。圖像中的每個物體,從一個人到一隻風箏,都以一定的精度被定位和識別。
讓我們從最簡單的深度學習方法開始,也是一種廣泛使用的方法,用於檢測圖像中的目標——卷積神經網路( CNN)。CNN 的內部工作原理如下:
我們將圖像傳遞給網路,然後通過各種卷積和池化層處理,發送給全連接層。最後,我們以目標類別的形式獲得輸出。這相當簡單,不是嗎?對於每個輸入圖像,我們得到一個相應的類作為輸出。我們可以使用這種技術來檢測圖像中的各種目標嗎?讓我們看看如何使用 CNN 解決一般的目標檢測問題。
使用這種方法的問題在於圖像中的目標可能具有不同的縱橫比和空間位置。例如,在某些情況下,目標可能覆蓋圖像的大部分,而在某些情況下,目標可能僅覆蓋圖像的一小部分。目標的形狀也可能不同(在現實生活中經常發生)。由於這些因素,我們將需要大量的區域,從而導致大量的計算時間。因此,為了解決這個問題並減少區域數量,我們可以使用基於區域的 CNN,它使用提案法選擇區域。讓我們了解這個基於區域的 CNN 可以為我們做什麼。
與在大量區域上工作不同的是,RCNN 演算法是在圖像中選取一堆框並檢查這些框中是否有任何一個包含任何目標。 RCNN 使用 selective search 從圖像中提取這些框(這些框稱為 regions)。
讓我們首先了解什麼是 selective search 以及它如何識別不同的 regions。基本上四個模式可以構成一個物體:不同的尺度、顏色、紋理和外殼。selective search 識別圖像中的這些模式,並在此基礎上提出各種regions。以下是selective search 工作原理的簡要概述:
舉個例子:
到目前為止,我們已經看到了 RCNN 如何實現目標檢測。但是這種技術有其自身的局限性。由於以下步驟,訓練 RCNN 模型既昂貴又緩慢:
所有這些過程結合起來使 RCNN 非常慢。對每張新圖像進行預測大約需要 40-50 秒,這實質上使得模型在面對龐大的數據集時變得笨重且幾乎無法構建。
好消息是——我們有另一種目標檢測技術,它修復了我們在 RCNN 中看到的大部分問題。
我們還能做些什麼來減少 RCNN 演算法通常需要的計算時間?我們是否可以每張圖像只運行一次並獲取所有感興趣的區域(包含某個目標的區域)。
RCNN 的作者 Ross Girshick 提出了這個想法,即每張圖像只運行一次 CNN,然後找到一種方法在 2,000 個區域之間共享該計算。在 Fast RCNN 中,我們將輸入圖像提供給 CNN,後者反過來生成卷積特徵圖。使用這些地圖,提取提議的區域。然後我們使用 RoI 池化層將所有提議的區域重塑為固定大小,以便可以將其饋入全連接網路。
讓我們將其分解為簡化概念的步驟:
因此,Fast RCNN 不是使用三個不同的模型(如 RCNN),而是使用單個模型從區域中提取特徵,將它們分成不同的類,並同時返回識別類的邊界框。
為了進一步分解,我將對每個步驟進行可視化。
這就是 Fast RCNN 如何解決 RCNN 的兩個主要問題,1. 將每個圖像的一個而不是 2,000 個區域傳遞給 ConvNet。2. 使用一個而不是三個不同的模型來提取特徵、分類和生成邊界框。
但即使是 Fast RCNN 也存在某些問題。它還使用 selective search 作為尋找感興趣區域的建議方法,這是一個緩慢且耗時的過程。每張圖像檢測目標大約需要 2 秒,這與 RCNN 相比要好得多。但是當我們考慮大型現實生活數據集時,即使是 Fast RCNN 看起來也不那麼快了。
Faster RCNN 是 Fast RCNN 的修改版本。它們之間的主要區別在於 Fast RCNN 使用 selective search 來生成感興趣的區域,而 Faster RCNN 使用 Region Proposal Network ,又名 RPN。 RPN 將圖像特徵圖作為輸入並生成一組目標提議,每個提議的目標以分數作為輸出。
Faster RCNN 方法通常遵循以下步驟:
讓我簡要解釋一下這個區域提議網路(RPN)實際上是如何工作的。
首先,Faster RCNN 從 CNN 獲取特徵圖並將它們傳遞給區域提議網路。 RPN 在這些特徵圖上使用一個滑動窗口,在每個窗口,它生成 k 個不同形狀和大小的 Anchor 框:
Anchor 框是固定大小的邊界框,它們放置在整個圖像中,具有不同的形狀和大小。對於每個 Anchor,RPN 預測兩件事:
我們現在有不同形狀和大小的邊界框,它們被傳遞到 RoI 池化層。在 RPN 步驟之後,有可能存在沒有分配給它們的類別提議。我們可以獲取每個建議並對其進行裁剪,以便每個建議都包含一個目標。這就是 RoI 池化層所做的。它為每個錨點提取固定大小的特徵圖:
然後將這些特徵圖傳遞到具有 softmax 和線性回歸層的全連接層。它最終對目標進行分類並預測已識別目標的邊界框。
到目前為止,我們討論的所有目標檢測演算法都使用區域來識別目標。網路不會一次性查看完整圖像,而是依次關注圖像的各個部分。這會造成兩個並發症:
㈡ java實現整數拆分演算法,例如輸入一個4會輸出4 , 3 1, 2 2, 2 1
importjava.util.Scanner;//輸入的
publicclassABS{//外面建的點java的文件名必須和這個一樣
publicstaticinta[]=newint[12000];
staticvoidp(intn,intindex)//搜索
{
inti;
if(n<=0)//當n為0的時候輸出這種情況
{
System.out.print(a[0]);
for(i=1;i<index;System.out.print("+"+a[i++]));
System.out.print(" ");
return;//返回到函數調用的地方
手簡畝}
for(i=index>咐橘0&&(n>=a[index-1])?a[index-1]:n;i>0;i--)
{//如果數組下標大於0且n剩餘的值大於等於上一個的值,那麼i就等於上一個的值,否則i就等於n
a[index]=i;
p(n-i,index+1);//在次調用
}
}
publicstaticvoidmain(String[]args){
Scannerin=newScanner(System.in);//從控制台中讀取輸入數據
intt;
t=in.nextInt();//輸入一個整數
if(t>=10000)
{
System.out.println("你輸入的數據超過1萬,太大咯!!!");
return;
}
p(t,0);
in.close();//關閉輸入
return;
}
}
這個只是畢森可以實現10000 以內的數, 如果想大一點 就把數組開大一點局可以了!