目标检测一直是计算机视觉中比较热门的研究领域,有一些常用且成熟的算法得到业内公认水平,比如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。下面看看整个训练集中总共有多少张图像和不同类型的数量。

# 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.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_imagestest_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源码相关推荐

  1. 深度学习目标检测系列:RCNN系列算法图解

    在生活中,经常会遇到这样的一种情况,上班要出门的时候,突然找不到一件东西了,比如钥匙.手机或者手表等.这个时候一般在房间翻一遍各个角落来寻找不见的物品,最后突然一拍大脑,想到在某一个地方,在整个过程中 ...

  2. python实现目标检测源代码包_深度学习目标检测系列:faster RCNN实现|附python源码...

    摘要: 本文在讲述RCNN系列算法基本原理基础上,使用keras实现faster RCNN算法,在细胞检测任务上表现优异,可动手操作一下. 目标检测一直是计算机视觉中比较热门的研究领域,有一些常用且成 ...

  3. 【论文解读】深度学习目标检测的开山鼻祖 |R-CNN详解 | 两阶段目标检测代表

    目录 前言 目标检测近年里程碑 深度学习目标检测 1 R-CNN简介 1.1 何为R-CNN? 1.2 摘要 1.2.1 论文综述 1.2.2 优点汇总 1.2.3 缺点汇总 2. RCNN网络结构解 ...

  4. 深度学习目标检测系列:一文弄懂YOLO算法|附Python源码

    在之前的文章中,介绍了计算机视觉领域中目标检测的相关方法--RCNN系列算法原理,以及Faster RCNN的实现.这些算法面临的一个问题,不是端到端的模型,几个构件拼凑在一起组成整个检测系统,操作起 ...

  5. python目标识别算法_深度学习目标检测系列:一文弄懂YOLO算法|附Python源码

    摘要: 本文是目标检测系列文章--YOLO算法,介绍其基本原理及实现细节,并用python实现,方便读者上手体验目标检测的乐趣. 在之前的文章中,介绍了计算机视觉领域中目标检测的相关方法--RCNN系 ...

  6. 计算机视觉与深度学习 | 目标检测综述(RCNN、RPN、YOLOv1 v2 v3、FPN、Mask RCNN、SSD代码类)

    博主github:https://github.com/MichaelBeechan 博主CSDN:https://blog.csdn.net/u011344545 github链接:https:// ...

  7. 深度学习项目:泰坦尼克号生存预测【附完整源码】

    文章目录 一.建模基本流程 二.结构化数据建模流程 2.1 泰塔尼克号数据 2.2 数据处理 2.3 建立模型 2.4 训练模型 2.5 评估模型 2.6 模型预测 27 保存模型 一.建模基本流程 ...

  8. 深度学习项目:男女性别识别【附完整源码】

    性别分类对于人机交互应用和计算机辅助生理或心理分析等商业领域的许多应用至关重要,因为它包含有关男女特征差异的广泛信息. 本次案例收集了接近二十万的男女数据集图片. 文章目录 性别分类简介 使用 Pyt ...

  9. 深度学习目标检测之RCNN、SPP-net、Fast RCNN、Faster RCNN

    一.目标检测介绍 目标检测(目标提取)是一种基于目标几何和统计特征的图像分割,将目标的分割和识别合二为一,主要是明确从图中看到了什么物体.它们分别在什么位置.传统的目标检测方法一般分为三个阶段:首先在 ...

最新文章

  1. Linux进程查看与管理
  2. 排序算法c语言和oc实现的,几种常用的排序算法,OC实现
  3. ORA-07445导致实例崩溃的解决【The solution of instance crush by ORA-07445】
  4. opengl加载显示3D模型lxo类型文件
  5. opc 多点位一次性读_如何使用Excel通过OPC访问WinCC的实时数据
  6. google地图android版,google地图
  7. 宇视科技的录像机添加海康的摄像头提示用户名或密码错误
  8. robots文件对网站优化有哪些作用
  9. Flash鼠绘入门第四课:绘制漂亮的梅花-梅花Flash鼠绘方法一
  10. Android Binder 之 ServiceManager (基于android 12.0/S)
  11. Android版添加phonegap-百度社会化分享插件教程
  12. 基于vi构建强大的IDE
  13. 华为机试—手机号码验证
  14. java中ioc作用_Spring中的IOC是什么意思,为什么要用IOC而不是New来创建实例?
  15. python excel画图_python读取excel数据并且画图
  16. html怎么电视连电脑,电脑怎么投屏到电视?图文讲解电脑投屏具体方法步骤
  17. 你的下一台电脑又何必是电脑?【电子爱穿搭】
  18. 2018南昌java工资_【帆软软件工资】java开发工程师待遇-看准网
  19. 软件测试理论与经验-第1章(测试员的角色)-第2章(按测试员的方式思考)-阅读笔记
  20. 第二章 模态命题:必然、可能

热门文章

  1. aop注解配置切点 spring_Spring通过自定义注解灵活配置AOP切点
  2. 曲线积分与曲面积分总结_高数下册||知识点总结
  3. jdba访问mysql_mysql连接出现问题记录
  4. chrome控制台如何把vw显示成px_你可能不知道的chrome调试技巧
  5. java 反射机制 视频_【视频笔记】Java反射机制笔记
  6. 吸血鬼 java_吸血鬼数
  7. java开源服务框架_Java框架服务
  8. 单身狗有福了!斯坦福教授化身丘比特,AI算法之箭帮你配真命爱侣
  9. 清华大学霸榜计算机学科第一!2022 USNews世界大学排名出炉,计算机前50中国占19个...
  10. 只用一周的业余时间,这位逆天博士生解决了困扰数学界数十年的难题