摘要: 本文在講述RCNN系列算法基本原理基礎上,使用keras實現faster RCNN算法,在細胞檢測任務上表現優異,可動手操做一下。
目標檢測一直是計算機視覺中比較熱門的研究領域,有一些經常使用且成熟的算法獲得業內公認水平,好比RCNN系列算法、SSD以及YOLO等。若是你是從事這一行業的話,你會使用哪一種算法進行目標檢測任務呢?在我尋求在最短的時間內構建最精確的模型時,我嘗試了其中的R-CNN系列算法,若是讀者們對這方面的算法還不太瞭解的話,建議閱讀《目標檢測算法圖解:一文看懂RCNN系列算法》。在掌握基本原理後,下面進入實戰部分。python
本文將使用一個很是酷且有用的數據集來實現faster R-CNN,這些數據集具備潛在的真實應用場景。git
數據來源於醫療相關數據集,目的是解決血細胞檢測問題。任務是經過顯微圖像讀數來檢測每張圖像中的全部紅細胞(RBC)、白細胞(WBC)以及血小板。最終預測效果應以下所示:github
選擇該數據集的緣由是咱們血液中RBC、WBC和血小板的密度提供了大量關於免疫系統和血紅蛋白的信息,這些信息能夠幫助咱們初步地識別一我的是否健康,若是在其血液中發現了任何差別,咱們就能夠迅速採起行動來進行下一步的診斷。算法
經過顯微鏡手動查看樣品是一個繁瑣的過程,這也是深度學習模式可以發揮重要做用的地方,一些算法能夠從顯微圖像中分類和檢測血細胞,而且達到很高的精確度。架構
本文采用的血細胞檢測數據集能夠從這裏下載,本文稍微修改了一些數據:框架
這裏使用流行的Keras框架構建本文模型。svn
在真正進入模型構建階段以前,須要確保系統已安裝正確的庫和相應的框架。運行此項目須要如下庫:工具
對於已經安裝了Anaconda和Jupyter的電腦而言,上述這些庫大多數已經安裝好了。建議從此連接下載requirements.txt文件,並使用它來安裝剩餘的庫。在終端中鍵入如下命令來執行此操做:學習
pip install -r requirement.txt
系統設置好後,下一步是進行數據處理。測試
首先探索所擁有的數據老是一個好開始(坦率地說,這是一個強制性的步驟)。對數據熟悉有助於挖掘隱藏的模式,還能夠得到對總體的洞察力。本文從整個數據集中建立了三個文件,分別是:
train_images
:用於訓練模型的圖像,包含每一個圖像的類別和實際邊界框;test_images
:用於模型預測的圖像,該集合缺乏對應的標籤;train.csv
:包含每一個圖像的名稱、類別和邊界框座標。一張圖像能夠有多行數據,由於單張圖像可能包含多個對象;讀取.csv
文件並打印出前幾行:
# importing required libraries import pandas as pd import matplotlib.pyplot as plt %matplotlib inline from matplotlib import patches # read the csv file using read_csv function of pandas train = pd.read_csv(‘train.csv’) train.head()
訓練文件中總共有6列,其中每列表明的內容以下:
image_names
:圖像的名稱;cell_type
:表示單元的類型;xmin
:圖像左下角的x座標;xmax
:圖像右上角的x座標;ymin
:圖像左下角的y座標;ymax
:圖像右上角的y座標;下面打印出一張圖片來展現正在處理的圖像:
# reading single image using imread function of matplotlib image = plt.imread('images/1.jpg') plt.imshow(image)
上圖就是血細胞圖像的樣子,其中,藍色部分表明WBC,略帶紅色的部分表明RBC。下面看看整個訓練集中總共有多少張圖像和不一樣類型的數量。
# Number of classes train['cell_type'].value_counts()
結果顯示訓練集有254張圖像。
# Number of classes train['cell_type'].value_counts()
結果顯示有三種不一樣類型的細胞,即RBC,WBC和血小板。最後,看一下檢測到的對象的圖像是怎樣的:
fig = plt.figure() #add axes to the image ax = fig.add_axes([0,0,1,1]) # read and plot the image image = plt.imread('images/1.jpg') plt.imshow(image) # iterating over the image for different objects for _,row in train[train.image_names == "1.jpg"].iterrows(): xmin = row.xmin xmax = row.xmax ymin = row.ymin ymax = row.ymax width = xmax - xmin height = ymax - ymin # assign different color to different classes of objects if row.cell_type == 'RBC': edgecolor = 'r' ax.annotate('RBC', xy=(xmax-40,ymin+20)) elif row.cell_type == 'WBC': edgecolor = 'b' ax.annotate('WBC', xy=(xmax-40,ymin+20)) elif row.cell_type == 'Platelets': edgecolor = 'g' ax.annotate('Platelets', xy=(xmax-40,ymin+20)) # add bounding boxes to the image rect = patches.Rectangle((xmin,ymin), width, height, edgecolor = edgecolor, facecolor = 'none') ax.add_patch(rect)
上圖就是訓練樣本示例,從中能夠看到,細胞有不一樣的類及其相應的邊界框。下面進行模型訓練,本文使用keras_frcnn
庫來訓練搭建的模型以及對測試圖像進行預測。
爲了實現 faster R-CNN算法,本文遵循此Github存儲庫中提到的步驟。所以,首先請確保克隆好此存儲庫。打開一個新的終端窗口並鍵入如下內容以執行此操做:
git clone https://github.com/kbardool/keras-frcnn.git
並將train_images
和test_images
文件夾以及train.csv
文件移動到該存儲庫目錄下。爲了在新數據集上訓練模型,輸入的格式應爲:
filepath,x1,y1,x2,y2,class_name
其中:
這裏須要將.csv
格式轉換爲.txt
文件,該文件具備與上述相同的格式。建立一個新的數據幀,按照格式將全部值填入該數據幀,而後將其另存爲.txt
文件。
data = pd.DataFrame() data['format'] = train['image_names'] # as the images are in train_images folder, add train_images before the image name for i in range(data.shape[0]): data['format'][i] = 'train_images/' + data['format'][i] # add xmin, ymin, xmax, ymax and class as per the format required for i in range(data.shape[0]): data['format'][i] = data['format'][i] + ',' + str(train['xmin'][i]) + ',' + str(train['ymin'][i]) + ',' + str(train['xmax'][i]) + ',' + str(train['ymax'][i]) + ',' + train['cell_type'][i] data.to_csv('annotate.txt', header=None, index=None, sep=' ')
下一步進行模型訓練,使用train_frcnn.py
文件來訓練模型。
cd keras-frcnn python train_frcnn.py -o simple -p annotate.txt
因爲數據集較大,須要一段時間來訓練模型。若是條件知足的話,可使用GPU來加快訓練過程。一樣也能夠嘗試減小num_epochs
參數來加快訓練過程。
模型每訓練好一次(有改進時),該特定時刻的權重將保存在與「model_frcnn.hdf5」相同的目錄中。當對測試集進行預測時,將使用到這些權重。
根據機器的配置,可能須要花費大量時間來訓練模型並得到權重。建議使用本文訓練大約500個時期的權重做爲初始化。能夠從這裏下載這些權重,並設置好相應的路徑。
所以,當模型訓練好並保存好權重後,下面進行預測。Keras_frcnn
對新圖像進行預測並將其保存在新文件夾中,這裏只需在test_frcnn.py
文件中進行兩處更改便可保存圖像:
從該文件的最後一行刪除註釋:
在此文件的倒數第二行和第三行添加註釋:
使用下面的代碼進行圖像預測:
python test_frcnn.py -p test_images
最後,檢測到對象的圖像將保存在「results_imgs」文件夾中。如下是本文實現faster R-CNN後預測幾個樣本得到的結果:
R-CNN算法確實是用於對象檢測任務的變革者,改變了傳統的作法,並開創了深度學習算法。近年來,計算機視覺應用的數量忽然出現飆升,而R-CNN系列算法仍然是其中大多數應用的核心。
Keras_frcnn
也被證實是一個很好的對象檢測工具庫,在本系列的下一篇文章中,將專一於更先進的技術,如YOLO,SSD等。
本文爲雲棲社區原創內容,未經容許不得轉載。