深度学习目标检测系列:faster RCNN实现|附python源码
目標檢測一直是計算機視覺中比較熱門的研究領域,有一些常用且成熟的算法得到業內公認水平,比如RCNN系列算法、SSD以及YOLO等。如果你是從事這一行業的話,你會使用哪種算法進行目標檢測任務呢?在我尋求在最短的時間內構建最精確的模型時,我嘗試了其中的R-CNN系列算法,如果讀者們對這方面的算法還不太了解的話,建議閱讀《目標檢測算法圖解:一文看懂RCNN系列算法》。在掌握基本原理后,下面進入實戰部分。
? ? ? ?本文將使用一個非常酷且有用的數據集來實現faster R-CNN,這些數據集具有潛在的真實應用場景。
問題陳述
? ? ? ?數據來源于醫療相關數據集,目的是解決血細胞檢測問題。任務是通過顯微圖像讀數來檢測每張圖像中的所有紅細胞(RBC)、白細胞(WBC)以及血小板。最終預測效果應如下所示:
? ? ? ?選擇該數據集的原因是我們血液中RBC、WBC和血小板的密度提供了大量關于免疫系統和血紅蛋白的信息,這些信息可以幫助我們初步地識別一個人是否健康,如果在其血液中發現了任何差異,我們就可以迅速采取行動來進行下一步的診斷。
? ? ? ?通過顯微鏡手動查看樣品是一個繁瑣的過程,這也是深度學習模式能夠發揮重要作用的地方,一些算法可以從顯微圖像中分類和檢測血細胞,并且達到很高的精確度。
? ? ? ?本文采用的血細胞檢測數據集可以從這里下載,本文稍微修改了一些數據:
- 邊界框已從給定的.xml格式轉換為.csv格式;
- 隨機劃分數據集,得到訓練集和測試集;
這里使用流行的Keras框架構建本文模型。
系統設置
? ? ? ?在真正進入模型構建階段之前,需要確保系統已安裝正確的庫和相應的框架。運行此項目需要以下庫:
- pandas
- matplotlib
- tensorflow
- keras – 2.0.3
- numpy
- opencv-python
- sklearn
- h5py
? ? ? ?對于已經安裝了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。下面看看整個訓練集中總共有多少張圖像和不同類型的數量。
? ? ? ?結果顯示訓練集有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.xminxmax = row.xmaxymin = row.yminymax = row.ymaxwidth = xmax - xminheight = ymax - ymin# assign different color to different classes of objectsif 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 imagerect = patches.Rectangle((xmin,ymin), width, height, edgecolor = edgecolor, facecolor = 'none')ax.add_patch(rect)?
? ? ? ?上圖就是訓練樣本示例,從中可以看到,細胞有不同的類及其相應的邊界框。下面進行模型訓練,本文使用keras_frcnn庫來訓練搭建的模型以及對測試圖像進行預測。
faster R-CNN實現
? ? ? ?為了實現 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其中:
- filepath是訓練圖像的路徑;
- x1是邊界框的xmin坐標;
- y1是邊界框的ymin坐標;
- x2是邊界框的xmax坐標;
- y2是邊界框的ymax坐標;
- 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文件中進行兩處更改即可保存圖像:
-
從該文件的最后一行刪除注釋:
- cv2.imwrite('./ results_imgs / {}。png'.format(idx),img);
-
在此文件的倒數第二行和第三行添加注釋:
- #cv2.imshow('img',img) ;
- #cv2.waitKey(0);
? ? ? ?使用下面的代碼進行圖像預測:
python test_frcnn.py -p test_images? ? ? ?最后,檢測到對象的圖像將保存在“results_imgs”文件夾中。以下是本文實現faster R-CNN后預測幾個樣本獲得的結果:
?
?
?
總結
? ? ? ?R-CNN算法確實是用于對象檢測任務的變革者,改變了傳統的做法,并開創了深度學習算法。近年來,計算機視覺應用的數量突然出現飆升,而R-CNN系列算法仍然是其中大多數應用的核心。
? ? ? ?Keras_frcnn也被證明是一個很好的對象檢測工具庫,在本系列的下一篇文章中,將專注于更先進的技術,如YOLO,SSD等。
?
原文鏈接
本文為云棲社區原創內容,未經允許不得轉載。
總結
以上是生活随笔為你收集整理的深度学习目标检测系列:faster RCNN实现|附python源码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 完爆 Best Fit,看阿里如何优化
- 下一篇: 阿里开发者招聘节 | 面试题08:NAS