目标检测算法系列:faster RCNN实现|附python源码!
off999 2024-10-10 07:50 29 浏览 0 评论
目标检测一直是计算机视觉中比较热门的研究领域,有一些常用且成熟的算法得到业内公认水平,比如RCNN系列算法、SSD以及YOLO等。如果你是从事这一行业的话,你会使用哪种算法进行目标检测任务呢?在我寻求在最短的时间内构建最精确的模型时,我尝试了其中的R-CNN系列算法,如果读者们对这方面的算法还不太了解的话,建议阅读 《目标检测算法图解:一文看懂RCNN系列算法》 。在掌握基本原理后,下面进入实战部分。
本文将使用一个非常酷且有用的数据集来实现faster R-CNN,这些数据集具有潜在的真实应用场景。
私信菜鸟007即可获取惊喜大礼包!嘻嘻嘻
问题陈述
数据来源于医疗相关数据集,目的是解决血细胞检测问题。任务是通过显微图像读数来检测每张图像中的所有红细胞(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 xmax ymin ymax
下面打印出一张图片来展示正在处理的图像:
# 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实现
为了实现 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后预测几个样本获得的结果:
结果1
结果2
结果3
结果4
总结
R-CNN算法确实是用于对象检测任务的变革者,改变了传统的做法,并开创了深度学习算法。近年来,计算机视觉应用的数量突然出现飙升,而R-CNN系列算法仍然是其中大多数应用的核心。
Keras_frcnn 也被证明是一个很好的对象检测工具库,在本系列的下一篇文章中,将专注于更先进的技术,如YOLO,SSD等。
相关推荐
- 阿里云国际站ECS:阿里云ECS如何提高网站的访问速度?
 - 
        
TG:@yunlaoda360引言:速度即体验,速度即业务在当今数字化的世界中,网站的访问速度已成为决定用户体验、用户留存乃至业务转化率的关键因素。页面加载每延迟一秒,都可能导致用户流失和收入损失。对...
 
- 高流量大并发Linux TCP性能调优_linux 高并发网络编程
 - 
        
其实主要是手里面的跑openvpn服务器。因为并没有明文禁p2p(哎……想想那么多流量好像不跑点p2p也跑不完),所以造成有的时候如果有比较多人跑BT的话,会造成VPN速度急剧下降。本文所面对的情况为...
 
- 性能测试100集(12)性能指标资源使用率
 - 
        
在性能测试中,资源使用率是评估系统硬件效率的关键指标,主要包括以下四类:#性能测试##性能压测策略##软件测试#1.CPU使用率定义:CPU处理任务的时间占比,计算公式为1-空闲时间/总...
 
- Linux 服务器常见的性能调优_linux高性能服务端编程
 - 
        
一、Linux服务器性能调优第一步——先搞懂“看什么”很多人刚接触Linux性能调优时,总想着直接改配置,其实第一步该是“看清楚问题”。就像医生看病要先听诊,调优前得先知道服务器“哪里...
 
- Nginx性能优化实战:手把手教你提升10倍性能!
 - 
        
关注△mikechen△,十余年BAT架构经验倾囊相授!Nginx是大型架构而核心,下面我重点详解Nginx性能@mikechen文章来源:mikechen.cc1.worker_processe...
 
- 高并发场景下,Spring Cloud Gateway如何抗住百万QPS?
 - 
        
关注△mikechen△,十余年BAT架构经验倾囊相授!大家好,我是mikechen。高并发场景下网关作为流量的入口非常重要,下面我重点详解SpringCloudGateway如何抗住百万性能@m...
 
- Kubernetes 高并发处理实战(可落地案例 + 源码)
 - 
        
目标场景:对外提供HTTPAPI的微服务在短时间内收到大量请求(例如每秒数千至数万RPS),要求系统可弹性扩容、限流降级、缓存减压、稳定运行并能自动恢复。总体思路(多层防护):边缘层:云LB...
 
- 高并发场景下,Nginx如何扛住千万级请求?
 - 
        
Nginx是大型架构的必备中间件,下面我重点详解Nginx如何实现高并发@mikechen文章来源:mikechen.cc事件驱动模型Nginx采用事件驱动模型,这是Nginx高并发性能的基石。传统...
 
- Spring Boot+Vue全栈开发实战,中文版高清PDF资源
 - 
        
SpringBoot+Vue全栈开发实战,中文高清PDF资源,需要的可以私我:)SpringBoot致力于简化开发配置并为企业级开发提供一系列非业务性功能,而Vue则采用数据驱动视图的方式将程序...
 
- Docker-基础操作_docker基础实战教程二
 - 
        
一、镜像1、从仓库获取镜像搜索镜像:dockersearchimage_name搜索结果过滤:是否官方:dockersearch--filter="is-offical=true...
 
- 你有空吗?跟我一起搭个服务器好不好?
 - 
        
来人人都是产品经理【起点学院】,BAT实战派产品总监手把手系统带你学产品、学运营。昨天闲的没事的时候,随手翻了翻写过的文章,发现一个很严重的问题。就是大多数时间我都在滔滔不绝的讲理论,却很少有涉及动手...
 
- 部署你自己的 SaaS_saas如何部署
 - 
        
部署你自己的VPNOpenVPN——功能齐全的开源VPN解决方案。(DigitalOcean教程)dockovpn.io—无状态OpenVPNdockerized服务器,不需要持久存储。...
 
- Docker Compose_dockercompose安装
 - 
        
DockerCompose概述DockerCompose是一个用来定义和管理多容器应用的工具,通过一个docker-compose.yml文件,用YAML格式描述服务、网络、卷等内容,...
 
- 京东T7架构师推出的电子版SpringBoot,从构建小系统到架构大系统
 - 
        
前言:Java的各种开发框架发展了很多年,影响了一代又一代的程序员,现在无论是程序员,还是架构师,使用这些开发框架都面临着两方面的挑战。一方面是要快速开发出系统,这就要求使用的开发框架尽量简单,无论...
 
- Kubernetes (k8s) 入门学习指南_k8s kubeproxy
 - 
        
Kubernetes(k8s)入门学习指南一、什么是Kubernetes?为什么需要它?Kubernetes(k8s)是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用程序。它...
 
欢迎 你 发表评论:
- 一周热门
 - 
                    
- 
                            
                                                                
抖音上好看的小姐姐,Python给你都下载了
 - 
                            
                                                                
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
 - 
                            
                                                                
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
 - 
                            
                                                                
python入门到脱坑 输入与输出—str()函数
 - 
                            
                                                                
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
 - 
                            
                                                                
Python三目运算基础与进阶_python三目运算符判断三个变量
 - 
                            
                                                                
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
 - 
                            
                                                                
慕ke 前端工程师2024「完整」
 - 
                            
                                                                
失业程序员复习python笔记——条件与循环
 - 
                            
                                                                
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
 
 - 
                            
                                                                
 
- 最近发表
 
- 标签列表
 - 
- python计时 (73)
 - python安装路径 (56)
 - python类型转换 (93)
 - python进度条 (67)
 - python吧 (67)
 - python的for循环 (65)
 - python格式化字符串 (61)
 - python静态方法 (57)
 - python列表切片 (59)
 - python面向对象编程 (60)
 - python 代码加密 (65)
 - python串口编程 (77)
 - python封装 (57)
 - python写入txt (66)
 - python读取文件夹下所有文件 (59)
 - python操作mysql数据库 (66)
 - python获取列表的长度 (64)
 - python接口 (63)
 - python调用函数 (57)
 - python多态 (60)
 - python匿名函数 (59)
 - python打印九九乘法表 (65)
 - python赋值 (62)
 - python异常 (69)
 - python元祖 (57)
 
 
