1. 程式人生 > 其它 >如何使用Faster R-CNN來計算物件個數

如何使用Faster R-CNN來計算物件個數

準確地在給定的影象或視訊幀中計算物件個數的例項是機器學習中很難解決的問題。儘管許多解決方案已經被開發出來,用來計算人、汽車和其他物體的數量,但是沒有一個是完美的辦法。當然,我們這裡討論的是影象處理,所以神經網路對於這項工作來說似乎是一個很好的工具。

你可以在下面的神經網路物件計數域中找到不同方法、常見問題、挑戰和最新解決方案的描述。作為概念的證明,Faster R-CNN網路的現有模型將被用來計算街道上的物體數量,並在文章的最後給出視訊示例。

挑戰

對於計算物件個數的問題,找到一個合適的解決方案取決於許多因素。除了一些與神經網路影象處理有關的挑戰,例如訓練資料的大小,它的質量等等。下面是對計數物件個數問題的具體挑戰:

  • 要計算的物件型別
  • 重疊
  • 透檢視
  • 檢測到的物件的最小尺寸
  • 訓練和測試速度

用來計算公路上的汽車數量或是體育場上的人群的這些方法,通常大多數物件重疊,並且透檢視通常也是允許遙遠距離中很小的物件的。

同時,在一個單一圖片中計算物件數量的解決方案可以不同於在一個實時視訊中計算物件數量的解決方案。

簡單的需求,簡單的解決方案

在這篇文章中,我將嘗試解決在街道上計算物件數量的問題,使用多個物件同時可見的示例視訊。為了處理擁擠場景的影象或交通堵塞,以準確地計算物體數量的例項,我建議深入研究該領域的最新研究:“Towards perspective-free object counting with deep learning(利用深度學習進行無透視物件的數量計算)”。這篇論文的結果可以用GitHub上的程式碼進行復制。

在上述的論文中,像CCNN和Hydra CNN這樣的方法在給定不同型別的物件的情況下表現不佳,因此需要採取不同的方法。

在機器學習領域(特別是卷積神經網路的深度學習)中,有一種非常有趣的方法,叫做基於區域的卷積神經網路(R-CNN),我們可以在一個給定的影象上識別多個物體及其位置。

為了我們的概念驗證工作,我將使用“Faster R-CNN”的Keras實現來處理視訊檔案,並使用給定類的檢測物件來對影象進行註釋。

FAST和FASTER

有許多方法可以把找到物件位置和識別物件的方法結合起來,以提高速度和準確性。多年來,我們已經從使用標準的RCNN網路,通過Fast R-CNN,到Faster R-CNN,來解決我們簡單的計算問題。 Fast R-CNN建立在之前的工作上,以有效地利用深度卷積網路對物件提議進行分類。與R-CNN相比,Fast R-CNN引入了一些改進訓練和測試速度的創新,以及檢測的準確性。

在多階段管道(multi-stage pipelines)中使用R-CNN訓練模型的方法(首先檢測物件邊界,然後執行識別)是相當慢的,不適合實時處理。這種方法的缺點主要是它的速度,無論是在訓練過程中,還是在實際測試期間。當物件檢測被執行的時候, 使用著名的VGG16,一個標準的R-CNN的訓練過程:GPU需要花費兩天半的時間來完成5000張的影象,並且需要幾百GB的儲存空間。在測試時檢測物件使用一個GPU來花費47s處理出一張圖片。這主要是由於在沒有共享計算的情況下,對每個物件提議進行了卷積網路的正向傳遞。

Fast R-CNN通過引入一種單階段訓練演算法來改進R-CNN,該演算法將物件和它們的空間位置在一個處理階段進行分類。Fast R-CNN的改進是:

  • 更高的檢測質量
  • 在單一階段使用多工損失進行訓練
  • 訓練可以更新所有網路層
  • 特性快取不需要磁碟儲存

Faster R-CNN引入了一個區域提議網路(RPN),它與檢測網路共享完整影象的卷積特性,支援幾乎沒有成本的區域建議。這個解決方案的RPN元件指出了統一的網路在哪裡可以檢視。對於同樣的VGG-16模型, Faster R-CNN在GPU上的幀速率為5 fps,同時達到了最先進的目標檢測精度。RPN是一種完全的卷積網路,可以針對生成檢測方案的任務進行端到端訓練,並被設計用來有效地預測具有廣泛範圍和縱橫比的區域提議。

Faster R-CNN在去年被Pinterest用作一種解決方案,可以在他們的網站上進行視覺搜尋,可以在下面的PoC描述中看到我們檢測和計算樣本視訊中的物件。

概念驗證

為了解決我們的想象問題,我們將使用前面提到的Faster R-CNN模型,和在一個GPU可行的AWS例項上的Keras。我們處於一個舒適的位置,可以下載已經預先訓練好的模型,最適合我們的需求和選擇的框架。當然,你可以使用所提供的Python指令碼對模型進行訓練,請記住,它可能需要花費許多時間。

對於Faster R-CNN來說,它存在多重實現,包括Caffe,TensorFlow等等。我們將在後端使用TensorFlow和Keras(v.2.0.3)。這段程式碼可以作為GitHub上最初的Keras F R-CNN實現的一個復刻(fork)。

測試網路的指令碼被修改,這樣它就可以處理視訊檔案,併為檢測到的物件(有可能性)新增適當的資料,並對已計數物件的摘要進行註釋。我使用opencv來處理視訊和已經訓練過的模型(可在這裡下載),同時處理幀。

有許多用於處理視訊的實用方法,例如:

def convert_to_images(): 

cam = cv2.VideoCapture(input_video_file) 

counter = 0 

while True: 

flag, frame = cam.read() 

if flag: 

cv2.imwrite(os.path.join(img_path, str(counter) + '.jpg'),frame) 

counter = counter + 1 

else: 

break if cv2.waitKey(1) == 27: 

break 

# press esc to quit 

cv2.destroyAllWindows()

並將視訊從經過處理的幀中儲存:

def save_to_video(): list_files = sorted(get_file_names(output_path), key=lambda var:[int(x) if x.isdigit() else x for x in re.findall(r'[^0-9]|[0-9]+', var)]) 

img0 = cv2.imread(os.path.join(output_path,'0.jpg')) 

height , width , layers = img0.shape 

# fourcc = cv2.cv.CV_FOURCC(*'mp4v') fourcc = cv2.VideoWriter_fourcc(*'mp4v') 

#fourcc = cv2.cv.CV_FOURCC(*'XVID') videowriter = cv2.VideoWriter(output_video_file,fourcc, frame_rate, (width,height)) 

for f in list_files: 

print("saving..." + f) 

img = cv2.imread(os.path.join(output_path, f)) videowriter.write(img) 

videowriter.release() 

cv2.destroyAllWindows()

當物件檢測在測試期間進行時,我正在建立一個帶有檢測物件類和第1號的元組列表,這一列表在之後會減少為特定物件類的出現次數:

for jk in range(new_boxes.shape[0]): 

(x1, y1, x2, y2) = new_boxes[jk,:] 

cv2.rectangle(img_scaled,(x1, y1), (x2, y2), class_to_color[key],2) 

textLabel = '{}: {}'.format(key,int(100*new_probs[jk])) 

all_dets.append((key,100*new_probs[jk])) 

all_objects.append((key, 1))

減少的方法:

def accumulate(l): it = itertools.groupby(l, operator.itemgetter(0)) 

for key, subiter in it: 

yield key, sum(item[1] for item in subiter)

指令碼引數是自描述型的

  • “–input_file”,輸入視訊檔案的路徑。
  • “–output_file”,輸出視訊檔案的路徑。
  • “–input_dir”, 輸入工作目錄的路徑,在該目錄中儲存了經過處理的幀。
  • “–output_dir” 路徑到輸出工作目錄,其中有帶註釋的處理框架儲存。
  • “–frame_rate” 幀率在構建視訊輸出時使用幀率。

使用示例:

python test_frcnn_count.py --input_file ~/videos/MVI_6848.mp4 --output_file ~/output4.mp4 --frame_rate=25

指令碼處理的幾個例子:

視訊地址

https://www.youtube.com/watch?v=z2wQBNDYRXg

https://www.youtube.com/watch?v=n4vQxAFncKA

https://www.youtube.com/watch?v=YqoGPpFfQi