MXNet的Faster R-CNN(基于区域提议网络的实时目标检测)《6》

news2024/11/30 14:38:22

我们在看Faster R-CNN源码(MXNet版本)的时候,除了下面这些我们遇到的常见的参数解析

import argparse
import ast
parser = argparse.ArgumentParser(description='Demonstrate a Faster R-CNN network',formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument('--network', type=str,default='vgg16', help='base network')

之外,我们发现如下,有一个不一样的代码:

args = parser.parse_args()
args.img_pixel_means = ast.literal_eval(args.img_pixel_means)

出现ast.literal_eval这样的一个执行方法,看起来跟我们学到的eval方法很类似,确实如此,用法到没什么区别,主要区别体现在安全方面,我们先来熟悉下eval方法,再比较下就明白了。

eval方法

# 列表
a = '[2,4,6,7]'
print(type(a), a)  # <class 'str'> [2,4,6,7]
a1 = eval(a)
print(type(a1), a1)  # <class 'list'> [2, 4, 6, 7]

# 元组
b = '(1,22,33)'
print(type(b), b)  # <class 'str'> (1,22,33)
b1 = eval(b)
print(type(b1), b1)  # <class 'tuple'> (1, 22, 33)

# 字典
c = '{"object":"image","width":300,"height":400}'
print(type(c), c)  # <class 'str'> {"object":"image","width":300,"height":400}
c1 = eval(c)
# <class 'dict'> {'object': 'image', 'width': 300, 'height': 400}
print(type(c1), c1)

v=eval(input("输入操作符也能执行:"))
#输入操作符也能执行:1+2
print(v)#3

既然eval可以执行很多操作,那么下面这样的系统命令也是可以执行的__import__('os').system('dir')
然后再输入查看文件内容的命令:open("t.py",r).read()
这样可以查看到想要查看的东西了,更关键的是这样的输入如果是删除命令或其他恶意代码呢?照样执行不误!那就很不安全了!!

literal_eval方法

为了防止出现这样的恶意代码执行,在源码中我们看到的就是用literal_eval方法,如下:

import argparse
import ast
args = parser.parse_args()
args.img_pixel_means = ast.literal_eval(args.img_pixel_means)
args.img_pixel_stds = ast.literal_eval(args.img_pixel_stds)
args.rpn_anchor_scales = ast.literal_eval(args.rpn_anchor_scales)
args.rpn_anchor_ratios = ast.literal_eval(args.rpn_anchor_ratios)
args.rcnn_pooled_size = ast.literal_eval(args.rcnn_pooled_size)
args.rcnn_bbox_stds = ast.literal_eval(args.rcnn_bbox_stds)

这样的ast.literal_eval一种执行里面操作的方法,是做了安全处理的,这个方法的具体代码实现,大家可以转到定义去看下。
我们来看下执行上面1+2和一些命令看会发生什么情况。

import ast

ast.literal_eval('1+2')
ast.literal_eval("__import__('os').system('dir')")

Exception has occurred: ValueError
malformed node or string: <_ast.Call object at 0x0000020ECE612D88>

这样的形式涉及到安全问题,都不会执行,会报错,也就是说只能是Python类型才会执行,其余的都会引发错误。

a = ast.literal_eval('[2,3,4,5]')
print(type(a), a)#<class 'list'> [2, 3, 4, 5]

像上面那些属于Python类型的都是安全的,可以执行,没有问题。
所以在选择这两种的情况时,需要注意它们的安全问题,尤其是开放性的执行,最好就是用ast.literal_eval,不得已用eval执行的,就要控制好输入了。

ROIPooling

感兴趣区域(ROI,region of interest)的池化,其目的是对输入执行最大池化以获得固定大小的特征图,大多使用在对象检测的Fast R-CNN网络。输入是4维的数组,将区域提议作为roi,然后它在输入的子区域上汇集,并生成固定大小的输出,无论roi大小如何。
换句话说就是经过卷积层之后的特征图变小多少倍(下采样,这个跟我们上一篇讲的转置卷积是上采样,刚好相反),ROI也要缩小这么多倍(没被整除,取整操作就存在量化误差)映射回特征图上对应位置,这种ROI是各种尺寸不一的,然后划分成N x N的区域,每个区域做最大池化的操作,这样最终就获得了N x N的输出。
通过改变参数"rois""spatial_scale",可以调整边界框坐标的大小,通过标准最大池化操作将裁剪的特征图合并为固定大小的输出由"pooled_size"参数指示。batch_size将更改为区域数"ROIPooling"之后的边界框。

先来看下MXNet中的ROI池化的原函数:

#对输入数组执行感兴趣区域(ROI)池化
(function) ROIPooling(data: Any | None = None, rois: Any | None = None, pooled_size: _NullType | Any = _Null, spatial_scale: _NullType | Any = _Null, name: Any | None = None, attr: Any | None = None, out: Any | None = None, **kwargs: Any) -> tuple[Literal[0]]

data(Symbol类型):输入数组到池化操作符,一个4维的特征映射
rois(Symbol类型):[[batch_index, x1, y1, x2, y2]]的2维数组,其中(x1, y1)和(x2, y2)是指定感兴趣区域的左上角和右下角的坐标。'batch_index'表示输入数组中对应图像的索引

我们具体来看下这个池化操作与池化之后的形状会怎么样,由于这里使用的是符号式编程,所以我们需要定义的是变量与设计出计算图,然后我们使用一个工具将其可视化看下:

import mxnet as mx
from mxnet import nd

x = mx.sym.var('inputarr')
y = mx.sym.var('rois')
'''
x1 = nd.array([[[[  0.,   1.,   2.,   3.,   4.,   5.],
             [  6.,   7.,   8.,   9.,  10.,  11.],
             [ 12.,  13.,  14.,  15.,  16.,  17.],
             [ 18.,  19.,  20.,  21.,  22.,  23.],
             [ 24.,  25.,  26.,  27.,  28.,  29.],
             [ 30.,  31.,  32.,  33.,  34.,  35.],
             [ 36.,  37.,  38.,  39.,  40.,  41.],
             [ 42.,  43.,  44.,  45.,  46.,  47.]]]])
y1 = nd.array([[0,0,0,4,4]])
'''
net = mx.sym.ROIPooling(data=x, rois=y, pooled_size=(2, 2), spatial_scale=1.0, name="roi_pool_2x2")
digraph = mx.viz.plot_network(net, shape={'inputarr': (1, 1, 8, 6), 'rois': (1, 5)})
digraph.view()

print(net.list_arguments(), net.list_outputs())# ['inputarr', 'rois'] ['roi_pool_2x2_output']
arg_shape, out_shape, _ = net.infer_shape(inputarr=(1, 1, 8, 6), rois=(1, 5))
print(arg_shape, out_shape)  # [(1, 1, 8, 6), (1, 5)] [(1, 1, 2, 2)]

 如果报下面的错误:

failed to execute 'dot', make sure the Graphviz executables are on your systems' PATH

就是说在运行plot_network这个函数需要先安装这个Graphviz可视化计算图的程序,应该是没有安装,下载地址:Graphviz可视化计算图
安装完毕之后重启下VSCode然后再次执行,将会生成一个pdf的文件,里面展示的就是一张"计算图"的可视化的有向图。 

我们可以看到通过推断形状,输入(inputarr)的是4维的形状,感兴趣区域rois的是2维形状,最终的输出形状是4维的2x2尺寸(由pooled_size决定),然后你将pooled_size的大小修改成其他形状看下,输出的尺寸是不是也更改了。
另外需要注意的是,如果将spatial_scale修改成其他,比如0.7,那么这个输出的形状不变,里面的值有变化,从自带的示例中,将会由[[[[ 14.,  16.],[ 26.,  28.]]]]变成[[[[  7.,   9.],[ 19.,  21.]]]]

可视化计算图

我们再来熟悉下这个Graphviz可视化计算图的工具,接着上面的来看下,这个计算图设计好了,我们想得到具体的输出结果,如何做呢?
好的,去掉x1和y1的注释,我们来看下经过ROI池化之后的结果是不是示例中的结果:

ex = net.bind(ctx=mx.cpu(), args={'inputarr' : x1, 'rois' : y1})
ex.forward()
print(ex.outputs)
'''
[
[[[[14. 16.]
   [26. 28.]]]]
<NDArray 1x1x2x2 @cpu(0)>]
'''

计算结果是正确的,将spatial_scale修改成0.7,运行结果也是正确的。
这个就是计算图做好之后,做个绑定,然后做前向计算可以看到具体的输出结果。

接着来看几个例子,再次巩固下这个计算图的计算与可视化的操作

1、普通计算

import mxnet as mx
a = mx.sym.Variable('a_data')
b = mx.sym.Variable('b_data')
c = a + b
d = a * b
e = mx.sym.dot(a, b)
f = mx.sym.Reshape(d+e, shape=(1, 4))
g = mx.sym.broadcast_to(f, shape=(2, 4))
mx.viz.plot_network(symbol=g).view()

 

2、多层神经网络

既然是MXNet的特色,那肯定最常见的就是对神经网络的计算,我们来看下几个层的连接的运行,全连接层+激活函数层+全连接层+Softmax输出层

import mxnet as mx
net = mx.sym.Variable('input_data')
net = mx.sym.FullyConnected(data=net, name='fc1', num_hidden=128)
net = mx.sym.Activation(data=net, name='relu1', act_type="relu")
net = mx.sym.FullyConnected(data=net, name='fc2', num_hidden=10)
net = mx.sym.SoftmaxOutput(data=net, name='out')
digraph = mx.viz.plot_network(net, shape={'input_data':(100,200)},node_attrs={"fixedsize":"false"})
digraph.view()#有向图的显示

3、Group组合

还可以将多个输出做一个组合,通过mx.sym.Group结合起来,如下:

import mxnet as mx

net = mx.sym.Variable('input_data')
fc1 = mx.sym.FullyConnected(data=net, name='fc1', num_hidden=128)
net = mx.sym.Activation(data=fc1, name='relu1', act_type="relu")
#这里是两个输出,将其组合
out1 = mx.sym.SoftmaxOutput(data=net, name='softmax')
out2 = mx.sym.LinearRegressionOutput(data=net, name='regression')
group = mx.sym.Group([out1, out2])
print(group.list_arguments())#['input_data', 'fc1_weight', 'fc1_bias', 'softmax_label', 'regression_label']
print(group.list_outputs())#['softmax_output', 'regression_output']

digraph = mx.viz.plot_network(group)
digraph.view()

有兴趣的伙伴们可以回过来看下本人以前写的关于符号式编程的两篇文章:

MXNet中的命令式编程和符号式编程的优缺点https://blog.csdn.net/weixin_41896770/article/details/125370472

计算性能的提升之混合式编程(MXNet)https://blog.csdn.net/weixin_41896770/article/details/127400770

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

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

相关文章

【操作系统系统/Golang】实验5:磁盘调度(FCFS,SSTF,SCAN与循环SCAN)

1 实验问题描述设计程序模拟先来先服务FCFS&#xff0c;最短寻道时间优先SSTF&#xff0c;SCAN和循环SCAN算法&#xff08;对应其他参考书的LOOK和C-LOOK&#xff09;的工作过程。假设有trackNum个磁道号所组成的磁道访问序列&#xff0c;给定开始磁道号initTrackNum和磁头移动…

Java项目管理工具:Maven介绍

Maven 简介下载与环境配置Maven仓库仓库类型本地仓库配置简介 Maven ,一款跨平台的项目管理工具。它主要服务于基于 Java 平台的项目构建与依赖管理。即可以将项目的开发和管理过程抽象成一个项目对象模型(POM),开发人员只需要做一些简单的配置,Maven 便可自动完成项目构建…

HRNet源码阅读笔记(4),庞大的PoseHighResolutionNet模块-stage1

一、图和代码上一讲的图中&#xff0c;有stage1图例如下;关键是看pose_hrnet.py中PoseHighResolutionNet模块的forward函数相关部分如下&#xff1a;def forward(self, x):x self.conv1(x)x self.bn1(x)x self.relu(x)x self.conv2(x)x self.bn2(x)x self.relu(x)x self…

一辈子干好一件事,你就了不起

人生的道路和轨迹&#xff0c;就像是射出去的箭。假如左拐右拐&#xff0c;不但不能射中靶心&#xff0c;达不到目标&#xff0c;还有可能拐弯回到原点&#xff0c;原地踏步。日复一日&#xff0c;年复一年&#xff0c;没有成长和收获&#xff0c;这很可怕。 短暂的2022年&…

设计测试用例的万能公式 + 6大具体方法 = 面试就像聊天?

目录 一、设计测试用例的万能公式 二、设计测试用例的具体方法 2.1、等价类 2.2、边界值 2.3、判定表&#xff08;因果图的另一种形式&#xff09; 2.4、场景设计法 2.5、正交法&#xff08;用的少&#xff0c;基本不可见&#xff09; 2.4.1、使用allparis构建正交表 2.…

算法之动态规划理论

目录 前言 一个模型三个特征理论讲解 1.最优子结构 2.无后效性 3.重复子问题 一个模型三个特征实例剖析 两种动态规划解题思路总结 1.状态转移表法 2.状态转移方程法 四种算法思想比较分析 总结&#xff1a; 参考资料 前言 本篇博文主要讲解动态规划的理论&am…

行业分析| 交通综合执法对讲系统

随着社会的经济发展&#xff0c;人口的增加城市的不断壮大&#xff0c;城市交通情况越来越复杂&#xff0c;交警承担的执法任务越来越重&#xff0c;通信作为交警综合执法对讲调度的重要组成部分&#xff0c;也随之提出了更高的要求。综合执法对讲系统的出现使执法变得高效规范…

【Redis】高级进阶

&#x1f31f;个人博客&#xff1a;www.hellocode.top&#x1f31f; &#x1f31f;Java知识导航&#xff1a;Java-Navigate&#x1f31f; ⭐想获得更好的阅读体验请前往Java-Navigate &#x1f525;本文专栏&#xff1a;《流行框架》 &#x1f31e;如没有JavaWEB基础&#xff0…

【ZooKeeper】第三章 集群搭建

【ZooKeeper】第三章 集群搭建 文章目录【ZooKeeper】第三章 集群搭建一、ZooKeeper 集群介绍1.Leader 选举2.集群角色二、搭建 ZooKeeper 集群1.安装2.配置集群3.启动集群三、故障模拟一、ZooKeeper 集群介绍 1.Leader 选举 Serviceid&#xff1a;服务器 ID 比如有三台服务器…

分享84个NET源码,总有一款适合您

分享84个NET源码&#xff0c;总有一款适合您 链接&#xff1a;https://pan.baidu.com/s/1r7_yrTfQrg-5whL7AYJiLA?pwdeem6 提取码&#xff1a;eem6 import os from time import sleepimport requests from bs4 import BeautifulSoup from docx import Document from docx.sh…

iOS ReplayKit 屏幕共享,屏幕直播实现

使用replayKit iOS12 之后相关 api 完成系统/app 内 屏幕采集直播视频数据, 采用 socket进行进程间Broadcast Unload Extension 向 宿主 app 传输数据, 后台保活持续采集屏幕数据, 摄像头采集, 数据编码解码 编译环境 Xcode14.2, iOS12 系统屏幕数据采集app 内屏幕共享使用so…

FPGA与数字IC求职知识准备 - 数字电路知识总结

前言 本文整理了数字电路课程中的相关基本的知识点和较为重要的知识点&#xff0c;用于求职的数电部分的知识准备&#xff0c;差缺补漏。 二进制数的算术运算 无符号二进制数的算术运算 加法&#xff1a;同十进制加法&#xff0c;逢二进一&#xff0c;无符号二进制数的加法…

Redis源码篇(8)——集群模式

1、集群模式的启动和初始化 当开启了cluster-enabled&#xff0c;在初始化服务initServer方法中会调用clusterInit方法将redis带入cluster模式。 clusterInit void clusterInit(void) {int saveconf 0;//初始化clusterState结构 server.cluster zmalloc(sizeof(clusterSta…

LaTeX代码宏包listings的使用

LaTeX代码宏包listings的使用 文章目录LaTeX代码宏包listings的使用1 需求2 verbatim环境简介3 listings设置代码高亮4 代码样式和颜色5 为listings添加题注6 listings支持的语言格式7 附录 listings样式的自定义参数1 需求 LaTeX\LaTeXLATE​X适合用来进行结构化文档的编辑。如…

[5]. 最长回文子串

[5]. 最长回文子串题目算法设计&#xff1a;双指针算法设计&#xff1a;Manacher 算法题目 传送门&#xff1a;https://leetcode.cn/problems/longest-palindromic-substring/ 算法设计&#xff1a;双指针 检查回文串的通用解决方案是&#xff0c;双指针。 寻找回文串的思…

什么是地理围栏

一、地理围栏算法简介 地理围栏&#xff08;Geo-fencing&#xff09;是LBS的一种典型应用&#xff0c;就是用一个虚拟的栅栏围出一个虚拟地理边界。地理围栏更侧重于对区域边界的界定&#xff0c;不再是以某点为圆心向外等距离画圆&#xff0c;而是准确勾勒出小区、写字楼等特…

wpf实现FFmpeg获取摄像头实时画面

gitee地址如下源码地址如何获取摄像头验证码和ip首先获取摄像头底部的验证码及ip(测试使用的是萤石摄像头&#xff0c;需要PC下载萤石客户端查看ip)未连接之前可以通过VLC进行测试在左上角&#xff08;媒体&#xff09;--》&#xff08;流&#xff09;--》&#xff08;网络&…

openGauss中Schema赋权小试

目录 概述 1.关于public的权限要点&#xff1a; 2.关于用户同名的schema的权限要点&#xff1a; 3.关于普通schema的权限要点&#xff1a; 概述 下面是openGauss官网对Schema的介绍&#xff1a; Schema又称作模式。通过管理Schema&#xff0c;允许多个用户使用同一数据库而…

MATLAB-二维线性插值运算

二维插值在图像处理和数据可视化方面得到了大量的应用&#xff0c;二维插值的基本原理与一维插值一样&#xff0c;但二维插值是对两个变量进行函数的插值。在MATLAB中&#xff0c;主要使用interp2()函数进行二维插值的实现&#xff0c;其调用格式如下&#xff0c;zi interp2(z,…

Nodejs也能做文本数据处理了,快来看看吧!

随着汉语言的广泛应用&#xff0c;中文信息处理成了一个重要的研究课题&#xff0c;常见于搜索引擎&#xff1a;信息检索、中外文自动翻译、数据挖掘技术、自然语言处理等领域。在处理的过程中&#xff0c;中文分词是最基础的一环。 nodejieba 简介 nodeJieba 是结巴中文分词…