摘要: 本文在讲述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等。
本文为云栖社区原创内容,未经容许不得转载。