使用快速R-CNN算法进行目标检测实例(附Python代码)

时间:2024-05-19 22:23:15

R-CNN介绍

R-CNN是一种目标检测的常用算法,该算法使用选择性搜索从给定图像中提取出一系列区域,然后检查这些区域是否包含对象。我们首先提取这些区域,对于每个区域,CNN都被用来提取特定的特征。最后,这些特性用于检测对象。不幸的是,R-CNN变得相当慢,因为这个过程涉及到多个步骤。

使用快速R-CNN算法进行目标检测实例(附Python代码)

另一方面,Fast R-CNN将整个图像传递给ConvNet,产生感兴趣的区域(而不是从图像中提取区域)。此外,它也不使用三种不同的模型(正如我们在R-CNN中看到的那样),而是使用单一模型从区域中提取特征,将它们分类为不同的类,并返回边界框。所有这些步骤都是同时完成的,因此与R-CNN相比,它的执行速度更快。然而,快速的R-CNN在应用于大型数据集时速度不够快,因为它还使用选择性搜索来提取区域。

使用快速R-CNN算法进行目标检测实例(附Python代码)

快速的R-CNN通过替换区域建议网络(RPN)来解决选择性搜索的问题。我们首先使用ConvNet从输入图像中提取feature map,然后将这些映射通过RPN传递,RPN返回对象建议。最后对这些映射进行分类,并对边界框进行预测。

 

使用快速R-CNN算法进行目标检测实例(附Python代码)

下面我们来练习一个实例,该示例是将解决血细胞检测问题。我们的任务是检测每幅显微图像中所有的红细胞(红细胞)、白细胞(白细胞)和血小板。

使用快速R-CNN算法进行目标检测实例(附Python代码)

细胞分类是我们分析血液中红细胞、白细胞和血小板的密度提供了许多关于免疫系统和血红蛋白的信息。这可以帮助我们潜在地确定一个人是否健康,如果在他们的血液中发现任何差异,可以迅速采取行动来诊断。通过显微镜手工观察样品是一个繁琐的过程。而这正是深度学习模式发挥如此重要作用的地方。他们可以从显微镜图像中精确地对血细胞进行分类和检测。

数据集地址:https://github.com/Shenggan/BCCD_Dataset

安装库

本次示例需要pandas、matplotlib、tensorflow、keras – 2.0.3、numpy、opencv-python、sklearn、h5py等库,大家可以通过pip自行安装。

数据集分析

首先研究我们拥有的数据总是一个好主意(坦率地说,这是一个强制性步骤)。这不仅帮助我们发现隐藏的模式,而且帮助我们对正在处理的事情有一个有价值的全面了解。我从整个数据集创建的三个文件是:
train_images:我们将用于训练模型的图像。我们在这个文件夹中有类和每个类的实际包围框。
test_images:该文件夹中的图像将用于使用经过训练的模型进行预测。这个集合缺少这些类的类和包围框。
train.csv:包含每个图像的名称、类和边框坐标。一个图像可以有多个行,因为一个图像可以有多个对象。
训练并测试Faster R-CNN

首先我们要在github中克隆frcnn文件具体代码如下:

git clone https://github.com/kbardool/keras-frcnn.git

第二步需要转换数据格式,将图像转换成filepath,x1,y1,x2,y2,class_name类型,其中filepath是训练映像的路径、x1是包围框的xmin坐标、y1是包围盒的ymin坐标、x2是包围框的xmax坐标、y2是包围框的ymax坐标、class_name是那个包围框中的类的名称。转换代码如下:

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使培训阶段更快。您还可以尝试减少作为替代选项的划时代次数。要改变时代的数量,请访问train_frcnn。复制存储库中的py文件,并相应地更改num_epochs参数。

当模型训练完成后,我们开始测试模型效果。

python test_frcnn.py -p test_images

测试结果

使用快速R-CNN算法进行目标检测实例(附Python代码)

结语:

更多机器学习算法的学习欢迎关注我们。对机器学习感兴趣的同学欢迎大家转发&转载本公众号文章,让更多学习机器学习的伙伴加入公众号《python练手项目实战》,在实战中成长。

使用快速R-CNN算法进行目标检测实例(附Python代码)