深度学习目标检测系列: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。下面看看整个训练集中总共有多少张图像和不同类型的数量。

# 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等。

 

原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/520262.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql冷热数据LRU_浅析MySQL的lru链表

一、简述传统的lru链表lru:least recently used相信大家对lru链表是不陌生的,它算是一种基础的数据结构吧,而且想必面试时也被问到过什么是lru链表,甚至是让你手写一个lru链表。想必你已经知道了mysql的buffer pool机制以及mysql组…

报应!GitHub上线围剿Python计划,已有4万人跟进,你呢?

人红是非多,最近Python就遇到了这样的问题。与国际技术社区上一片「形势大好」对比鲜明的是,国内技术圈却一直存在对Python,「力挺」和「吃瓜」两派阵营,针锋相对,最近就悄然上线一个争议性疑问:围剿Python…

生物智能与AI——关乎创造、关乎理解(上)

几百万年前,第一次人类智能的星火出现在非洲大陆,并且持续发展,最终在大约10万年前在智人的大脑中达到顶峰。作为现代人类,我们只能想象我们的古代祖先在窥视夜空时所经历的事情,以思考物理现实的本质,以及…

linux7基础——给用户添加sudo权限

文章目录1. 切换到超级用户2. 修改sudoers文件内容1. 切换到超级用户 命令:su 密码:******** 此处的密码是root用户的密码2. 修改sudoers文件内容 默认的sudoers文件不具有写权限 a) 给文件sudoers 增加write权限 命令: #chmod uw /etc/sud…

Spring Cloud Config 规范

Spring Cloud Config 规范 首先Spring Cloud 是基于 Spring 来扩展的,Spring 本身就提供当创建一个Bean时可从Environment 中将一些属性值通过Value的形式注入到业务代码中的能力。那Spring Cloud Config 要解决的问题就是: 如何将配置加载到 Environm…

RabbitMQ开机启动 Centos7环境

文章目录8.1. 创建启动脚本8.2. 赋予启动脚本可执行权限8.3. 加入开机启动并指定用户8.4. 赋予可执行权限8.5. 重启MQ服务器测试8.6. 查看MQ服务运行状态8.7. 浏览器验证MQ管控台8.1. 创建启动脚本 操作说明:使用fismq用户操作,使用root用户权限的地方我…

微信几亿人在线的点赞、取消点赞系统,用Redis如何实现?

戳蓝字“CSDN云计算”关注我们哦!作者 | solocoder责编 | 阿秃点赞功能大家都不会陌生,像微信这样的社交产品中都有,但别看功能小,想要做好需要考虑的东西还挺多的,如海量数据的分布式存储、分布式缓存、多IDC的数据一…

java 16进制数组 字符串_byte数组转换成16进制字符串和字符数组的方法

byte数组转换成16进制字符串String&#xff1a;public class CommonUtil {/*** byte数组转换成16进制字符串* param src* return*/public static String bytesToHexString(byte[] src){StringBuilder stringBuilder new StringBuilder();if (src null || src.length < 0) …

年度大盘点:机器学习开源项目及框架

我们先来看看Mybridge AI 中排名靠前的顶级开源项目&#xff0c;再聊聊机器学习今年都有哪些发展&#xff0c;最后探寻下新的一年中会有哪些有值得我们期待的事情。 顶级的开源项目 BERT BERT&#xff0c;全称为Bidirectional Encoder Representations from Transformers&am…

centos7以普通用户开机启动某个服务或者指定脚本

文章目录1. 执行命令格式规范2. 添加到/etc/rc.d/rc.local3. 赋予可执行权限扩展知识&#xff1a;开头添加这句 source /etc/profile 原因为 下面几点1. 执行命令格式规范 #开机切换到fismq用户执行/app/start.sh su fismq -c "/app/rabbitmq_server-3.8.3/sbin/start_ra…

Andrew Ng教你如何引领公司进入AI时代

AI&#xff08;人工智能&#xff09;技术就像100年前的电力一样&#xff0c;正准备改变每个行业。从现在到2030年&#xff0c;它将创造约13万亿美元的GDP增长。虽然它已经在谷歌&#xff0c;阿里巴巴&#xff0c;微软等领先的科技公司中创造了巨大的价值&#xff0c;但其他许多…

IBM Cloud Paks:云端追光者也!

作者&#xff1a;阿秃 现如今&#xff0c;“企业上云”已毫无争议。 据知名云管理服务商RightScale 发布的2019年全球云计算市场调查显示&#xff0c;在众多云平台中混合云的采用率比重最高&#xff0c;达到了惊人的58%。可以想见&#xff0c;市场对混合云的庞大需求正吸引越…

java 装配_Spring 通过Java代码装配bean

1. 背景尽管在很多场景下通过组件扫描和自动装配实现Spring的自动化扫描配置是更为推荐的方式&#xff0c;但在有些情况下自动化扫描的方案行不通&#xff0c;如想要将第三方库中的组件装配到自己的应用中。在这种情况下必须通过显示 装配的方式。显示装配有两种可选方案&#…

生物智能与AI——关乎创造、关乎理解(下)

无监督学习&#xff0c;迁移学习和工程设计 AI系统与人类学习之间的另一个主要差异在于AI系统所需的大量标记数据才可以达到人类级别的性能。例如&#xff0c;最近的语音识别系统在11940小时的语音训练后才能对齐转录。如果我们每天大声地听到另一个人类阅读文本两个小时&…

如何利用tcpdump抓包?

文章目录一、基本使用1. 安装tcpdump2. 使用方法二、案例实战2.1. 企业案例背景2.2. 抓包实战三、网卡接口获取3.1. centos7.x使用3.2. centos6.x使用一、基本使用 1. 安装tcpdump yum install tcpdump -y2. 使用方法 tcpdump -i 网卡接口 协议 -n 注&#xff1a;协议可以接…

Gartner 发布2019年超融合魔力象限:新增深信服一员!

近日&#xff0c;国际权威研究分析机构Gartner公布了2019全球《超融合基础设施魔力象限》报告。 报告显示国内仅有三家云计算厂商进入2019超融合基础设施魔力象限&#xff0c;分别是深信服、华为、华云数据。其中深信服超融合&#xff08;sangfor aCloud&#xff09;凭借技术优…

java对象组合_java并发编程(三): 对象的组合

对象的组合&#xff1a;如何将现有的线程安全组件&#xff0c;组合成我们想要的更大规模的程序。设计线程安全的类&#xff1a;设计线程安全类的三个要素&#xff1a;1.找出构成对象状态的所有变量&#xff1b;2.找出约束状态变量的不变性条件&#xff1b;3.建立对象状态的并发…

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

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

Keepalived时主备负载均衡器都有VIP的问题:VRRP协议问题

文章目录一、企业案例背景二、异常现象三、分析结论解决思路3.1. 分析结论3.2. 解决思路四、SElinux 处理4.1. 查看SElinux的状态&#xff1a;4.2. 关闭SElinux五、Firewalld防火墙配置5.1. 开启vrrp 协议5.2. 重新启动防火墙5.3. 查看启动日志5.4. 虚拟ip验证5.5. 停止master节…

数据不足,如何进行迁移学习?

现在&#xff0c;人工智能的发展处于跳跃式阶段&#xff0c;我们也对AI在大型数据集的应用进展感到吃惊。更重要的是&#xff0c;那些我们没有跟踪的数十亿张照片或餐厅的评论并没有被遗漏掉&#xff1a;迁移学习技术让收集数据变得更加“容易”。另外&#xff0c;得益于PyTorc…