# --------------------------------------------------------
# Faster R-CNN
# Copyright (c) 2015 Microsoft
# Licensed under The MIT License [see LICENSE for details]
# Written by Ross Girshick and Xinlei Chen
# --------------------------------------------------------
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import os
from model.config import cfg
import numpy as np
import numpy.random as npr
from utils.bbox import bbox_overlaps
from model.bbox_transform import bbox_transform
import torch
# 解读faster rcnn重要的几个文件之anchor_target_layer.py文件
# https://github.com/ruotianluo/pytorch-faster-rcnn
"""
这个程序里的东西都是为训练服务的,而训练好后前向出来后topn,NMS等操作在proposal_layer.py
因为是为训练服务的,所以其中有赋label的过程,还有为了计算loss而提供的rpn_bbox_inside_weights等数据
rpn_bbox_inside_weights即loss中为了让loss只计算前景的框位置回归而设置的tensor
用法类似于(delta - gt)点乘rpn_bbox_inside_weights,,即得到了边框loss。
anchor_target_layer是入口,此时有2W个原始anchor
处理步骤为:
-->首先赋label:总的锚点为all_anchors,去除边框外的框
-->只算在边界内的框,这些框的下标inds_inside,框为anchors,分类为label=-1,三者行数都相等。
-->将threshhold>0.7的label=1,<0.3的label=0。
-->还需要把与gt的overlap最大的框赋label=1。gt_argmax_overlaps是gt依次对应的第几个anchor。
-->各从前背景label 1 0中选取128个,其余重新设置label=-1
-->内部权重bbox_inside_weights 为坐标前乘的系数,格式为[[0,0,0,0或1111],...刚开始为内部框个,后来是全部all_anchors个]
外部权重bbox_outside_weights 为正负区别的系数,格式同上,不过非0数字为1/N_sample,正负权重可以设置(focal Loss论文中会设置)
-->前面都是在边界内anchor上计算的,
然后用_unmap函数把label,bbox_targets, bbox_inside_weights,bbox_outside_weights这几个参数扩展到
全部anchor的shape尺度,对于边界外的anchor,label填充的是-1,其他三个填充的是0.(列数不变)
-->然后相当于有all_anchors个信息,这些信息的排序方式通过label.reshape((1, height, width, A))可以看出是
联系特征图,先是A(K=9)个anchor为一组,按行排列,排列完一行另起一行。这样height, width, A就解释通了。
数字1应该是1张图片
然后.transpose(0,3,1,2),可以把k理解为通道(只是假设理解),即先填充了一个通道的W×H吗,然后再填第二个通道
最后.reshape((1, 1, A * height, width))顺序应该没变,只是括号[]前后位置变了
其余3个返回值应该还是k-W-H-图的理解方式,只不过元素个数×4,也就是4-k-W-H-图
.reshape((1, height, width, A * 4))
"""
def anchor_target_layer(rpn_cls_score, gt_boxes, im_info, _feat_stride,
all_anchors, num_anchors):
"""Same as the anchor target layer in original Fast/er RCNN """
A = num_anchors # 单尺度anchor个数
total_anchors = all_anchors.shape[0] # 多尺度,总anchor个数
K = total_anchors / num_anchors
# allow boxes to sit over the edge by a small amount
# 边框可以踩一点界,这里是0,即不允许
_allowed_border = 0
# map of shape (..., H, W)
height, width = rpn_cls_score.shape[1:3]
# only keep anchors inside the image 只保留在图像内的框
inds_inside = np.where( # np.where(condition)
(all_anchors[:, 0] >= -_allowed_border) &
(all_anchors[:, 1] >= -_allowed_border) &
(all_anchors[:, 2] < im_info[1] + _allowed_border) & # width
(all_anchors[:, 3] < im_info[0] + _allowed_border) # height
)[0]
# all_anchors的格式的[[x,y,w,h],...]?
# keep only inside anchors
anchors = all_anchors[inds_inside, :] # 从所有的anchor只保留不踩界的
# label: 1 is positive, 0 is negative, -1 is dont care
labels = np.empty((len(inds_inside), ), dtype=np.float32) # 长度
# 只给不跨边界的anchor赋label=0,1,-1 ?
labels.fill(-1) # 用1填充
# overlaps between the anchors and the gt boxes
# overlaps (ex, gt)
overlaps = bbox_overlaps(
np.ascontiguousarray(anchors, dtype=np.float),
np.ascontiguousarray(gt_boxes, dtype=np.float))
# 返回了anchors个行,gt_boxes个列。因为有view,所以得ascontiguousarray
argmax_overlaps = overlaps.argmax(axis=1) # 最大值的下标,每一行的最大值
# anchor匹配的是第几个gt框
max_overlaps = overlaps[np.arange(len(inds_inside)), argmax_overlaps]
# 格式应该是[0.5,0.3,...]
gt_argmax_overlaps = overlaps.argmax(axis=0) # argmax输出格式[1,2,3]
# 与每个gt框最大值的anchor,argmax的shape=anchor的列数,即gt个数
# 有了行,下面的arange是取对应的列,即第一个gt框对应的最大overlap
gt_max_overlaps = overlaps[gt_argmax_overlaps,
np.arange(overlaps.shape[1])]
# overlaps.shape[1]是gt个数
# gt_max_overlaps最后格式 [0.7,0.9,....共gt个]
gt_argmax_overlaps = np.where(overlaps == gt_max_overlaps)[0]
if not cfg.TRAIN.RPN_CLOBBER_POSITIVES:
# assign bg labels first so that positive labels can clobber them
# first set the negatives
labels[max_overlaps < cfg.TRAIN.RPN_NEGATIVE_OVERLAP] = 0 # 0.3负类label=0
# fg label: for each gt, anchor with highest overlap 每个gt最大重叠的框为正
labels[gt_argmax_overlaps] = 1
# fg label: above threshold IOU 大于阈值的框为正
labels[max_overlaps >= cfg.TRAIN.RPN_POSITIVE_OVERLAP] = 1
if cfg.TRAIN.RPN_CLOBBER_POSITIVES:
# assign bg labels last so that negative labels can clobber positives
labels[max_overlaps < cfg.TRAIN.RPN_NEGATIVE_OVERLAP] = 0
# subsample positive labels if we have too many
num_fg = int(cfg.TRAIN.RPN_FG_FRACTION * cfg.TRAIN.RPN_BATCHSIZE)
fg_inds = np.where(labels == 1)[0] # 这个[0]是什么?符合条件的第一个维度值
if len(fg_inds) > num_fg: # 随机挑选anchor,选出来剩下的赋label=-1
disable_inds = npr.choice( # numpy.random.choice ,replace表示是否重用元素,默认True
fg_inds, size=(len(fg_inds) - num_fg), replace=False)
labels[disable_inds] = -1
# subsample negative labels if we have too many
num_bg = cfg.TRAIN.RPN_BATCHSIZE - np.sum(labels == 1) # label=1是前景anchor
bg_inds = np.where(labels == 0)[0] # label=0是背景anchor
if len(bg_inds) > num_bg:
disable_inds = npr.choice(
bg_inds, size=(len(bg_inds) - num_bg), replace=False)
labels[disable_inds] = -1
bbox_targets = np.zeros((len(inds_inside), 4), dtype=np.float32)
# shape=[在边界里的anchor的数目,4]
bbox_targets = _compute_targets(anchors, gt_boxes[argmax_overlaps, :])
# _compute_targets函数:把绝对坐标转换成offset
# 第一个是anchor的坐标,第二个参数是anchors与第几个gt匹配
# 返回的是anchors与gt框的offset,即训练的真实值tx,ty,tw,th.
bbox_inside_weights = np.zeros((len(inds_inside), 4), dtype=np.float32)
# bbox_inside_weights的shape是[边界内anchor个数,4坐标]
# 这里的weight和具体分类时的维度不同,那里的列数是4*类别数
# only the positive ones have regression targets
bbox_inside_weights[labels == 1, :] = np.array(
cfg.TRAIN.RPN_BBOX_INSIDE_WEIGHTS) # (1.0, 1.0, 1.0, 1.0)
# 只让选出来的正类sample计算回归loss
bbox_outside_weights = np.zeros((len(inds_inside), 4), dtype=np.float32)
# bbox_outside_weights 的shape和bbox_inside_weights 同
if cfg.TRAIN.RPN_POSITIVE_WEIGHT < 0: # RPN_POSITIVE_WEIGHT =-1
# uniform weighting of examples (given non-uniform sampling)
num_examples = np.sum(labels >= 0) # 样本的数目
positive_weights = np.ones((1, 4)) * 1.0 / num_examples # 这里即公式里的N_clss,要放到outweight中
negative_weights = np.ones((1, 4)) * 1.0 / num_examples # 正负权重可以设置
else:
assert ((cfg.TRAIN.RPN_POSITIVE_WEIGHT > 0) &
(cfg.TRAIN.RPN_POSITIVE_WEIGHT < 1))
positive_weights = (
cfg.TRAIN.RPN_POSITIVE_WEIGHT / np.sum(labels == 1))
negative_weights = (
(1.0 - cfg.TRAIN.RPN_POSITIVE_WEIGHT) / np.sum(labels == 0))
bbox_outside_weights[labels == 1, :] = positive_weights
bbox_outside_weights[labels == 0, :] = negative_weights
# 外部权重=1/样本个数
# map up to original set of anchors映射到原始total_anchor
# 接下来都使用了_unmap函数,这个函数的作用是从在框内的anchor又扩展回了全部anchor尺度,fill参数代表那些在边界外的anchor要填充的数字
# 虽然拓展到了原来total_anchor行,但是其中非0还是sample个行
labels = _unmap(labels, total_anchors, inds_inside, fill=-1)
# _unmap由把label从只有在边界里的anchor还原到了total_anchors尺度。即正1,负0,不关心-1
# 但是1和0的总数还是256个
bbox_targets = _unmap(bbox_targets, total_anchors, inds_inside, fill=0)
bbox_inside_weights = _unmap(
bbox_inside_weights, total_anchors, inds_inside, fill=0)
bbox_outside_weights = _unmap(
bbox_outside_weights, total_anchors, inds_inside, fill=0)
# labels # 原labels=[1,0,-1,1,1,0,0.....2W个]
labels = labels.reshape((1, height, width, A)).transpose(0, 3, 1, 2)
# 原来的label是[1,0,-1,1,1,0,0.....2W个],顺序是9个为一组,宽为一组,高为一组,图为1组
# 1个张图片,宽,高,A=k=9。转成看一张图片,k,高,宽?这样?
# 联想通道图(实际k不是通道),之前是先从通道方向上方,转置之后是先放完一个通道的整张图,再放第二个通道代表的图
labels = labels.reshape((1, 1, A * height, width))
# 我猜是换成了 宽-高-k为一组,一张图为一组,一个batch为一组
rpn_labels = labels
# bbox_targets # bbox_targets=[[tx,ty,tw,wh],...2W个]
bbox_targets = bbox_targets \
.reshape((1, height, width, A * 4))
rpn_bbox_targets = bbox_targets
# bbox_inside_weights #原bbox_inside_weights=[[1,1,1,1],[0,0,0,0]...1或0形成2W个 ]
bbox_inside_weights = bbox_inside_weights \
.reshape((1, height, width, A * 4))
rpn_bbox_inside_weights = bbox_inside_weights
# bbox_outside_weights
bbox_outside_weights = bbox_outside_weights \
.reshape((1, height, width, A * 4))
rpn_bbox_outside_weights = bbox_outside_weights
return rpn_labels, rpn_bbox_targets, rpn_bbox_inside_weights, rpn_bbox_outside_weights
def _unmap(data, count, inds, fill=0):
""" Unmap a subset of item (data) back to the original set of items (of
size count) """
if len(data.shape) == 1: # data(label)是一维的,如[1,2,3,4]
# 例_unmap(labels, total_anchors, inds_inside, fill=-1)
ret = np.empty((count, ), dtype=np.float32)
ret.fill(fill)
ret[inds] = data # ret[inds_inside] = labels
else:
#例2: _unmap(data=bbox_targets, count=total_anchors, inds=inds_inside, fill=0)
ret = np.empty((count, ) + data.shape[1:], dtype=np.float32)
# 单纯第data.shape[1]是一个数,但是data.shape[1:]是一个元组(2,)
# np.empty((2,)+(3,))是2行3列的空矩阵
ret.fill(fill)
ret[inds, :] = data
return ret
def _compute_targets(ex_rois, gt_rois):
# 这个函数的意思是验证一下维度,实际起作用的是另外一个函数bbox_transform
"""Compute bounding-box regression targets for an image."""
assert ex_rois.shape[0] == gt_rois.shape[0] # gt已经是赋完label的anchor了
# 这里gtbox的格式还需要根据其他地方研究
assert ex_rois.shape[1] == 4 # [[x,y,x,y],...]
assert gt_rois.shape[1] == 5 #gt[[x,y,x,y,类],...]
return bbox_transform( # 把绝对坐标转换成offset坐标
torch.from_numpy(ex_rois), torch.from_numpy(gt_rois[:, :4])).numpy()
相关推荐
5. VGGnet_train.py ( Faster-RCNN_TF代码解读)
5. /lib/networks/VGGnet_train.py 本文件是整个faster网络结构。从VGG到RPN,到RoI Proposal,最后是RCNN。 网络结构如下: 调用函数链接: 本文件调用的函数,如feed(), conv(), softmax()等都在network.py中。 ‘rpn-data’层所用到的函数:anchor_target_layer ‘rpn...
Faster Rcnn 代码解读之 anchor_target_layer.py
# -------------------------------------------------------- # Faster R-CNN # Copyright (c) 2015 Microsoft # Licensed under The MIT License [see LICENSE for details] # Written by Ross Girshick and Xinl...
6. network.py ( Faster-RCNN_TF代码解读)
6. /lib/networks/network.py 本文件是/lib/networks/VGGnet_train.py的支持文件,提供各种函数。 调用函数链接: ‘rpn-data’层所用到的函数:anchor_target_layer ‘rpn-rois’层所用到的函数:proposal_layer ‘roi-data’层所用到的函数:proposal_target_layer ...
rpnnp的matlab,faster-rcnn的rpn网络源码解析(转)
解析的FasterR-CNN代码是tensorflow版本的,链接地址https://github.com/kevinjliang/tf-Faster-RCNN首先,在faster_rcnn_resnet50ish.py文件中,我们看一下训练时数据层输出的是:# Train dataself.x['TRAIN'] = tf.placeholder(tf.float32, [1, None, Non...
Faster RCNN.pdf
Faster RCNN 网络结构,详细解读Faster RCNN的各个网络模块,有助于对two stage模型的理解
制造业批次管理中双计量单位动态转换的实践指南
本文详细介绍了制造业批次管理中双计量单位动态转换的实践指南,特别是在SAP系统中的配置与操作步骤。通过实际案例展示了如何解决采购与生产部门计量单位不一致的问题,提升物料管理效率。重点讲解了批次特性配置、移动类型调整及常见问题排查方法,适用于金属加工、化工等多个行业。
rpnnp的matlab,详细的Faster R-CNN源码解析之RPN源码解析
在阔别了将近三个月之后,笔者又准备更新博客了。对于前两个多月的未及时更新,笔者在此向大家表示歉意,请大家原谅。本次博客的更新是关于Faster R-CNN的源码。首先说一下笔者为什么要更新Faster R-CNN的源码解析,有以下两个原因:1. 笔者的研究方向和目标检测有一些关系。虽然不是纯做目标检测,但是像Faster R-CNN这样的经典框架必须做出比较深度的了解,尤其是像RPN这样的革命性算...
用Python的fengwo模块复刻通达信筹码峰(COST/WINNER),选股效率提升10倍
本文介绍了如何使用Python的fengwo模块高效复刻通达信的筹码峰(COST/WINNER)计算,显著提升选股效率。通过C++内核与多线程优化,fengwo模块将传统Python实现的数小时计算压缩至分钟级,解决了量化交易中的性能瓶颈问题。文章详细解析了筹码峰计算原理、fengwo模块的技术架构及实战应用,助力量化开发者构建高效选股系统。
py最大值的索引的用法_faster R-CNN代码解读之anchor_target_layer.py
# -------------------------------------------------------- # Faster R-CNN # Copyright (c) 2015 Microsoft # Licensed under The MIT License [see LICENSE for details] # Written by Ross Girshick and Xinle...
【AI开源】Understand-Anything 完整使用教程(2026最新版)
Understand-Anything是一款基于交互式知识图谱的AI学习与开发平台,能够将代码库转化为可视化知识结构,支持语义搜索、上下文问答和全流程开发。核心功能包括代码知识图谱化、AI辅助学习和多编码代理集成。支持TypeScript/JavaScript、Python等多种语言,要求Node.js 20+和16GB以上内存。提供NPM、Docker和源码三种安装方式,支持增量更新和团队知识共享。与同类产品相比,在交互式图谱、语义搜索和AI集成方面更具优势。适用于代码学习、大型项目维护和团队协作等场景。
【STM32项目】基于Stm32c8t6-镭射激光打印机的设计(完整工程资料源码)
随着打印技术的快速发展,镭射打印技术也开始得到越来越广泛的应用。这种技术可以被用于在木材、塑料、皮革、织物等各种材料上进行图形打印,并且通常比传统机器更快、更准确和更灵活。
最详细的Faster-RCNN代码解读Pytorch版 (二) RPN部分
回顾 读懂Pytorch版本的Faster-RCNN代码 (一) generate_anchors.py 上一篇博客简单讲述了Faster RCNN的构成和原理,以及RPN模块的generate_anchors.py的代码部分,回顾一下generate_anchors的主要作用是根据一个base anchor来生成9个不同尺度和纵横比的待选框,如下图所示: ...
Vibe coding 氛围编程:编程就像聊天一样,低代码开发时代来了?
Vibe coding:编程就像聊天一样,低代码开发时代来了!
7. anchor_target_layer_tf.py ( Faster-RCNN_TF代码解读)
7. /lib/rpn_msr/anchor_target_layer_tf.py 本文件将anchors分配给gt targets,产生anchor classification labels和bounding-box regression targets. 思路如下: # ------------------------------------------------------...
【06】新国都——新国都 嵌入式笔试,校招,题目记录及解析
本文总结了新国都嵌入式校招笔试题目及解析,内容涵盖C语言基础、Linux系统、数据结构与算法等多个方面。主要包括:1)不定项选择题10道,涉及字符串常量、蓝牙与GPRS区别、编译错误识别等;2)判断题10道,考察Linux权限、循环控制、内存管理等;3)填空题5道,包括编码计算、逻辑运算、宏定义等;4)简答题2道,解析全局变量引用和进程线程区别。题目难度适中,重点考察嵌入式开发基础知识和编程能力,并提供详细解析和扩展知识链接,对准备嵌入式相关笔试具有参考价值。
【电机应用控制】——直流有刷电机&驱动板/编码器介绍&PID算法&实操代码思路
声明:学习笔记来自正点原子B站教程,仅供学习交流!!玩具车、平衡车、无人机、印刷机、打印机、手机振动马达等电机即电动机(motor),也叫作马达,电能转化为机械能。按电源:直流、交流按用途:驱动用、控制用按运转速度:高速、低速、恒速、调速直流电机(有刷、无刷)、舵机、步进电机、伺服电机1、直流有刷电机(Brushed DC Motor,简称BDC)是内含电刷装置的将直流电能转化为机械能的电动机。例如四驱赛车四个马达操控方便、成本低、维护时换电刷即可;
Faster-RCNN_TF代码解读17:anchor_target_layer_tf.py
# -------------------------------------------------------- # Faster R-CNN # Copyright (c) 2015 Microsoft # Licensed under The MIT License [see LICENSE for details] # Written by Ross Girshick and Sean B
目标跟踪与视频时序分析基础
两帧均有目标,却因快速移动导致检测框无重叠,仅靠交并比(IoU)无法维持身份关联。本文通过手算与纯Python实现最小跟踪流程,揭示IoU仅为位置线索,不能应对快速位移或遮挡。实验表明,即使目标真实存在,低重叠也会触发新编号。强调跟踪需结合运动预测、外观特征与阈值验证,避免误判。
py-faster-rcnn源码解读系列
转载自:http://blog.csdn.net/sunyiyou9/article/details/52207486 train_faster_rcnn_alt_opt.py 前言: 本文主要功能是实现Alternating optimization的训练方法,在NIPS的那篇paper上仅有较为简略的介绍,所以我认为通过源码来学习是很有必要的。 其他主要模块的解读也会在后续陆
温度PID控制PLC程序
温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值
廖雪峰Python教程[完整版]
廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白
faster rcnn 主要代码解读
转载自: py-faster-rcnn源码解读系列(一)——train_faster_rcnn_alt_opt.py - sunyiyou9的博客 - 博客频道 - 优快云.NET http://blog.csdn.Net/sunyiyou9/article/details/52207486 py-faster-rcnn源码解读系列(二)——pascol_voc.p
迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)
迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)
读懂每一行超参数:Faster-RCNN-TensorFlow-Python3配置文件深度解读与调优清单
Faster-RCNN-TensorFlow-Python3 是一个基于 **TensorFlow 实现的 Faster R-CNN 目标检测模型**,支持 Python 3,提供完整的预训练模型下载脚本与训练代码。整个项目的"大脑"只有一个文件:[lib/config/config.py](https://link.gitcode.com/i/6fc2fb814506cc44f88f103b95
faster rcnn 源码学习-------数据读入及RoIDataLayer相关模块解读
参考博客:::https://www.cnblogs.com/Dzhen/p/6845852.html 非常全面的解读参考:::https://blog.csdn.net/DaVinciL/article/details/81812454 下面我和大家一起从训练最开始学习作者如何将原始数据读入并通过RoIDataLayer转化成网络训练所需的数据的总体过程。 训练从./tool...
caffe-fasterrcnn程序理解
faster-rcnn 结构杂谈 参考博客:::https://www.cnblogs.com/longriyao/p/5832274.html http://www.cnblogs.com/chaofn/p/9310912.html https://blog.csdn.net/u014380165/article/details/80303040 https://blog.c...
Faster R-CNN源码阅读之十二:写在最后
写在最后 毫无疑问,Faster RCNN(以及Faster RCNN的各种变体)作为当前目标检测方面的先锋,在这方面确实贡献巨大。下一步计划对one-stage的目标检测方法进行学习。由于给的源码中,关于数据准备的代码过于复杂,不具有一定的普适性,实际上,完全可以根据自己的项目工程进行数据准备代码的编写,即简单又直观,因此,在这里就省略了数据准备方面的代码的分享,还请各位大佬们原谅! ...
Faster RCNN 源码解读(1) -- 文件结构分析
基本介绍Faster RCNN 在目标检测及其相关领域得到了广泛的运用。其原型RCNN是将CNN引入到目标检测的开山之作,此外基于region proposal是一种十分值得学习的思想。因此将在后续的系列章节中,基于源码,对Faster RCNN进行深入的剖析。代码结构从github上的源码看上去就是这个样子:接下来将对各个文件夹的功能进行详细的分析:caffe-fast-rcnnFaster RC
MMRotate训练遥感目标检测模型:从数据裁剪到模型测试的完整配置清单(附代码)
本文详细介绍了使用MMRotate框架训练遥感目标检测模型的完整流程,包括环境配置、数据预处理、模型选择与优化、训练调优及部署技巧。通过自定义数据集和旋转目标检测技术,帮助开发者高效实现高精度遥感图像分析,适用于卫星图像、城市规划等应用场景。
1289



被折叠的 条评论
为什么被折叠?



