学习笔记:Pytorch 搭建自己的Faster-RCNN目标检测平台

B站学习视频
up主的csdn博客

1、什么是Faster R-CNN

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、pytorch-gpu环境配置(跳过)

3、Faster R-CNN整体结构介绍

在这里插入图片描述
Faster-RCNN可以采用多种的主干特征提取网络,常用的有VGG,Resnet,Xception等等。
Faster-RCNN对输入进来的图片尺寸没有固定,但一般会把输入进来的图片短边固定成600.

4、Resnet50-主干特征提取网络介绍

具体学习见:Resnet50

import mathimport torch.nn as nn
from torch.hub import load_state_dict_from_urlclass Bottleneck(nn.Module):expansion = 4 #最后一个卷积层输出通道数相对于输入通道数的倍数def __init__(self, inplanes, planes, stride=1, downsample=None):'''inplanes:输入通道数planes:卷积层输出的通道数stride:卷积的步长,默认为1downsample:是否对输入进行下采样'''super(Bottleneck, self).__init__()#使用1*1卷积核,压缩通道数self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=1, stride=stride, bias=False)#二维卷积层self.bn1 = nn.BatchNorm2d(planes)#二维批归一化层#使用3*3卷积核,特征提取,padding=1,在输入的周围使用1个零填充,以保持特征图的尺寸self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=1, padding=1, bias=False)self.bn2 = nn.BatchNorm2d(planes)#使用1*1卷积核,扩张通道数self.conv3 = nn.Conv2d(planes, planes * 4, kernel_size=1, bias=False)self.bn3 = nn.BatchNorm2d(planes * 4)self.relu = nn.ReLU(inplace=True)self.downsample = downsampleself.stride = stridedef forward(self, x):residual = x#残差out = self.conv1(x)out = self.bn1(out)out = self.relu(out)out = self.conv2(out)out = self.bn2(out)out = self.relu(out)out = self.conv3(out)out = self.bn3(out)if self.downsample is not None:residual = self.downsample(x)out += residualout = self.relu(out)return outclass ResNet(nn.Module):def __init__(self, block, layers, num_classes=1000):#-----------------------------------##   假设输入进来的图片是600,600,3#-----------------------------------#self.inplanes = 64 #初始化ResNet模型的通道数为64super(ResNet, self).__init__()# 600,600,3 -> 300,300,64self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3, bias=False)self.bn1 = nn.BatchNorm2d(64)self.relu = nn.ReLU(inplace=True)# 300,300,64 -> 150,150,64 最大池化层,用于降低特征图的空间分辨率self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=0, ceil_mode=True)#构建4个残差块组成的特征提取部分,每个部分的通道数和空间分辨率逐渐增加# 150,150,64 -> 150,150,256self.layer1 = self._make_layer(block, 64, layers[0])# 150,150,256 -> 75,75,512self.layer2 = self._make_layer(block, 128, layers[1], stride=2)# 75,75,512 -> 38,38,1024 到这里可以获得一个38,38,1024的共享特征层self.layer3 = self._make_layer(block, 256, layers[2], stride=2)# self.layer4被用在classifier模型中self.layer4 = self._make_layer(block, 512, layers[3], stride=2)self.avgpool = nn.AvgPool2d(7)#全局平均池化层 池化核7*7#将最终的特征映射到类别数量的空间self.fc = nn.Linear(512 * block.expansion, num_classes) #全连接层for m in self.modules():if isinstance(m, nn.Conv2d):n = m.kernel_size[0] * m.kernel_size[1] * m.out_channelsm.weight.data.normal_(0, math.sqrt(2. / n))elif isinstance(m, nn.BatchNorm2d):m.weight.data.fill_(1)m.bias.data.zero_()def _make_layer(self, block, planes, blocks, stride=1):downsample = None#-------------------------------------------------------------------##   当模型需要进行高和宽的压缩的时候,就需要用到残差边的downsample#-------------------------------------------------------------------#if stride != 1 or self.inplanes != planes * block.expansion:downsample = nn.Sequential(nn.Conv2d(self.inplanes, planes * block.expansion,kernel_size=1, stride=stride, bias=False),nn.BatchNorm2d(planes * block.expansion),)layers = []layers.append(block(self.inplanes, planes, stride, downsample))self.inplanes = planes * block.expansionfor i in range(1, blocks):layers.append(block(self.inplanes, planes))return nn.Sequential(*layers)def forward(self, x):x = self.conv1(x)x = self.bn1(x)x = self.relu(x)x = self.maxpool(x)x = self.layer1(x)x = self.layer2(x)x = self.layer3(x)x = self.layer4(x)x = self.avgpool(x)x = x.view(x.size(0), -1)x = self.fc(x)return xdef resnet50(pretrained = False):model = ResNet(Bottleneck, [3, 4, 6, 3])if pretrained:state_dict = load_state_dict_from_url("https://download.pytorch.org/models/resnet50-19c8e357.pth", model_dir="./model_data")model.load_state_dict(state_dict)#----------------------------------------------------------------------------##   获取特征提取部分,从conv1到model.layer3,最终获得一个38,38,1024的特征层#----------------------------------------------------------------------------#features    = list([model.conv1, model.bn1, model.relu, model.maxpool, model.layer1, model.layer2, model.layer3])#----------------------------------------------------------------------------##   获取分类部分,从model.layer4到model.avgpool#----------------------------------------------------------------------------#classifier  = list([model.layer4, model.avgpool])features    = nn.Sequential(*features)classifier  = nn.Sequential(*classifier)return features, classifier

5、RPN-建议框网络构建

在这里插入图片描述
在这里插入图片描述

6、Anchors-先验框详解

import numpy as np#--------------------------------------------#
#   生成基础的先验框
#--------------------------------------------#
def generate_anchor_base(base_size=16, ratios=[0.5, 1, 2], anchor_scales=[8, 16, 32]):'''base_size:基础框的大小,默认为16ratios:生成锚框的宽高比,默认为[0.5,1,2]anchor_scales:生成锚框的尺度,默认为[8,16,32]'''#创建一个形状为((len(ratios) * len(anchor_scales), 4)的全零数组,用于存储生成的基础先验框的坐标信息#每个先验框由4个坐标值表示anchor_base = np.zeros((len(ratios) * len(anchor_scales), 4), dtype=np.float32)for i in range(len(ratios)):for j in range(len(anchor_scales)):#使用两个嵌套的循环遍历宽高比和尺度的所有组合,宽高比定义+面积不变性h = base_size * anchor_scales[j] * np.sqrt(ratios[i])w = base_size * anchor_scales[j] * np.sqrt(1. / ratios[i])index = i * len(anchor_scales) + janchor_base[index, 0] = - h / 2.anchor_base[index, 1] = - w / 2.anchor_base[index, 2] = h / 2.anchor_base[index, 3] = w / 2.return anchor_base#--------------------------------------------#
#   对基础先验框进行拓展对应到所有特征点上
#--------------------------------------------#
def _enumerate_shifted_anchor(anchor_base, feat_stride, height, width):#---------------------------------##   计算网格中心点#---------------------------------#'''anchor_base 表示基础先验框的坐标信息;feat_stride 特征点间距步长height 和 width 表示特征图的高度和宽度。'''shift_x             = np.arange(0, width * feat_stride, feat_stride)shift_y             = np.arange(0, height * feat_stride, feat_stride)shift_x, shift_y    = np.meshgrid(shift_x, shift_y)shift               = np.stack((shift_x.ravel(), shift_y.ravel(), shift_x.ravel(), shift_y.ravel(),), axis=1)#---------------------------------##   每个网格点上的9个先验框#---------------------------------#A       = anchor_base.shape[0]K       = shift.shape[0]anchor  = anchor_base.reshape((1, A, 4)) + shift.reshape((K, 1, 4))#---------------------------------##   所有的先验框#---------------------------------#anchor  = anchor.reshape((K * A, 4)).astype(np.float32)return anchorif __name__ == "__main__":import matplotlib.pyplot as pltnine_anchors = generate_anchor_base()print(nine_anchors)height, width, feat_stride  = 38,38,16anchors_all                 = _enumerate_shifted_anchor(nine_anchors, feat_stride, height, width)print(np.shape(anchors_all))fig     = plt.figure()ax      = fig.add_subplot(111)plt.ylim(-300,900)plt.xlim(-300,900)shift_x = np.arange(0, width * feat_stride, feat_stride)shift_y = np.arange(0, height * feat_stride, feat_stride)shift_x, shift_y = np.meshgrid(shift_x, shift_y)plt.scatter(shift_x,shift_y)box_widths  = anchors_all[:,2]-anchors_all[:,0]box_heights = anchors_all[:,3]-anchors_all[:,1]for i in [108, 109, 110, 111, 112, 113, 114, 115, 116]:rect = plt.Rectangle([anchors_all[i, 0],anchors_all[i, 1]],box_widths[i],box_heights[i],color="r",fill=False)ax.add_patch(rect)plt.show()

在这里插入图片描述

在这里插入图片描述

7、模型训练及测试结果

结合博客及视频,完成VOC2007数据集的训练及预测,对faster rcnn原理及如何使用有了初步的认识。train.py frcnn.py predict.py get_map.py 相关结果如下:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

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

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

相关文章

IPv6地址介绍

当前我国的网络正在快速向IPv6升级中,从网络基础设施如运营商骨干网、城域网,到互联网服务商如各类云服务,以及各类终端设备厂商如手机、电脑、路由器、交换机等。 一、网络IP地址 IP地址是英文Internet Protocol的缩写,是网络之…

Parasoft:正确的静态应用程序安全测试 (SAST) 解决方案

随着软件开发从Web应用扩展到工业物联网(IIoT)设备,静态应用安全测试(SAST)越来越有必要从根本上帮助确保软件的功能安全。根据 Forrester Research的研究,网络攻击是近两年安全漏洞的主要来源。因此&#…

行业研究:2023年建筑涂料市场需求及发展方向分析

目前绿色化经济成为社会经济主旋律,涂料行业作为高污染行业,国家层面出台了一系列政策规划引导行业向绿色、安全、环保发展。例如,禁止使用高VOCs含量的溶剂型涂料,推广水性涂料等低VOCs含量涂料,鼓励外商投资高性能涂…

14.docker部署应用的两种企业实践

1.介绍 1.1 说明 这里仅仅说明一下在企业应用的两种简单实践,并不包含自动化这套东西。这里说的两种实践,是我在工作中不同公司使用的两种部署方式,仅供大家参考。 1.2 两种部署方式 第一种:是把环境和app都一起打成一个镜像&…

MongoDB快速入门及其SpringBoot实战

MongoDB快速入门及其SpringBoot实战 MongoDB简介 MongoDB 是一个基于分布式文件存储的数据库。由 C 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个开源、高性能、无模式的文档型数据库,当初的设计就是用于简化开发和方便扩展&am…

单体架构demo

idea 新建maven项目 1、外层pom.xml 2、jar 包pom.xml 3、主要pom.xml 这个打包插件放在有main 启动模块中 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifact…

Windows系统IIS服务配置与网站搭建,结合内网穿透实现公网访问

文章目录 1.前言2.Windows网页设置2.1 Windows IIS功能设置2.2 IIS网页访问测试 3. Cpolar内网穿透3.1 下载安装Cpolar内网穿透3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5.结语 1.前言 在网上各种教程和介绍中&#xff0c;搭建网页都会借助各种软件的帮助&#xf…

玻色量子企业荣誉

2023年 2023.7 玻色量子创始人&COO马寅荣获“优秀共产党员”荣誉称号 2023.4 斩获“双金”&#xff01;玻色量子在中国移动第七届创客马拉松大赛脱颖而出 2023.1 再创佳绩&#xff01;玻色量子荣膺2022年德勤中国“朝阳明日之星” 2023.1 玻色量子荣为第二届朝阳区“…

Vue基本使用(一)

&#x1f4d1;前言 本文主要是【Vue】——Vue基本使用的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一句&#x…

CVE-2023-25573:MeterSphere 任意文件下载漏洞复现[附POC]

文章目录 MeterSphere 任意文件下载&#xff08;CVE-2023-25573&#xff09;漏洞复现[附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 MeterSphere 任意文件下载&#xff08;CVE-2023-25573&#xff09;漏洞…

图扑软件受邀出席高交会-全球清洁能源创新博览会

“相聚鹏城深圳&#xff0c;共享能源盛宴” 第二十五届中国国际高新技术成果交易会(简称“高交会”)于 11 月 15-18 日在深圳盛大开幕。高交会由商务部、科学技术部、工业和信息化部、国家发展改革委、农业农村部、国家知识产权局、中国科学院、中国工程院和深圳市人民政府共同…

Android性能优化- 从SharedPreferences到MMKV

前言 前面Android性能优化 - 从SharedPreferences跨越到DataStore一文主要介绍了DataStore的实现原理&#xff0c;以及DataStore相对于SharedPreferences的提升&#xff0c;本文主要简述MMKV相对于SharedPreferences存储的使用及优劣势&#xff0c;以及MMKV原理&#xff0c;以…

海光信息荣获ESG金牛科技引领奖!

11月24日&#xff0c;由中国证券报、中国国新控股有限责任公司、南通市人民政府联合主办的”2023金牛企业可持续发展论坛暨第一届国新杯ESG金牛奖颁奖典礼”在江苏南通举行&#xff0c;“国新杯ESG金牛奖”多项获奖名单同期揭晓。海光信息凭借卓越的技术创新实力与行业影响力&a…

6.显示评论 + 添加评论

1.显示评论 数据层&#xff1a;根据实体查询一页评论数据、根据实体查询评论的数量业务层&#xff1a;处理查询评论的业务、处理查询评论数量的业务表现层&#xff1a;显示帖子详情数据时&#xff0c;同时显示该帖子所有的评论数据 1.1 数据访问层 entity_type&#xff1a;实体…

DV、OV、EV证书

在保护您的网站并建立用户信任时&#xff0c;SSL证书起着关键作用。不同的SSL认证级别提供了不同的安全性和验证程度。在选择SSL证书时&#xff0c;了解DV&#xff08;域名验证&#xff09;、OV&#xff08;组织验证&#xff09;和EV&#xff08;扩展验证&#xff09;证书的差异…

<Linux>(极简关键、省时省力)《Linux操作系统原理分析之存储管理(3)》(16)

《Linux操作系统原理分析之存储管理&#xff08;3&#xff09;》&#xff08;16&#xff09; 5 存储管理5.6 分段存储管理&#xff08;1&#xff09; 地址结构&#xff08;2&#xff09; 段表&#xff08;3&#xff09; 地址变换机构&#xff08;4&#xff09; 存储共享&#x…

【JMeter】菜单栏介绍

【菜单栏】 1. Tools 导入curl接口信息 作用&#xff1a;快速导入接口信息&#xff0c;响应头和缓存信息等 Log level临时修改日志等级 作用&#xff1a; 从勾选的level开始往更高等级level抓取log日志等级优先级&#xff1a; ALL < TRACE < DEBUG <INFO<WA…

RT_Thread_msh_系统msh命令、使用msh时过滤ulog日志、添加msh命令(不带/带参)

1、msh配置 msh功能是自动开启的&#xff0c;配置如下&#xff0c;可以在“RT-Thread Settings”里去修改。 调试过程中遇到msh不能使用&#xff0c;理解msh也是一个线程&#xff0c;有自己的优先级20&#xff0c;高优先级的线程&#xff08;比如main是10&#xff09;如果一直…

软件测试 —— 冒烟测试(Smoke Test,ST)

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

Android帝国之进程杀手--lmkd

本文概要 这是Android系统启动的第三篇文章&#xff0c;本文以自述的方式来讲解lmkd进程&#xff0c;通过本文您将了解到lmkd进程在安卓系统中存在的意义&#xff0c;以及它是如何杀进程的。&#xff08;文中的代码是基于android13&#xff09; 我是谁 init&#xff1a;“大…