Faster RCNN代码解读(一)

代码库:https://github.com/rbgirshick/py-faster-rcnn
直接亮代码:

if __name__ == '__main__':
    args = parse_args()

    print('Called with args:')
    print(args)
    待续.....

我们从demo.py文件开始看,第一个调用的子函数parse_args()。
先贴一段今天解析的代码:

def parse_args():
    """Parse input arguments."""
    parser = argparse.ArgumentParser(description='Faster R-CNN demo')
    parser.add_argument('--gpu', dest='gpu_id', help='GPU device id to use [0]',
                        default=0, type=int)
    parser.add_argument('--cpu', dest='cpu_mode',
                        help='Use CPU mode (overrides --gpu)',
                        action='store_true')
    parser.add_argument('--net', dest='demo_net', help='Network to use [vgg16]',
                        choices=NETS.keys(), default='vgg16')

    args = parser.parse_args()

    return args

本段代码主要是 ‘argparse’ 这个包的使用。

argparse 在官方解释中为:命令行选项与参数解析(译),说点人话就是为程序提供一些可选择的参数保存便于调用修改等等。

这是一段无输入的代码。先解析子程序中的第一句(略过注释)

parser = argparse.ArgumentParser(description='Train a Faster R-CNN network')

在使用argparse时首先要定义一个解析器类ArgumentParser(这是必要的),输入一个描述这个argparse类定义后的作用。
在代码中描述了这个parser里面后面写的描述是用来训练一个Faster R-CNN网络的(Train a Faster R-CNN network)

第二段代码“add_argument”

parser.add_argument('--gpu', dest='gpu_id',
                            help='GPU device id to use [0]',
                            default=0, type=int)

在add_argument中有许多参数需要设置,也有默认参数。在默认参数中有action,action可选的参数有:(1)保存参数(逐个地,或保存到列表中)(2)当解析到某参数时保存一个常量值(3)统计某个参数出现的次数(4)以及调用一个回调函数。默认的action是保存参数值。本段代码中采用默认的action。

在前面的’–gpu’是选项参数或者是位置参数,如果是位置参数那么就是一串文件名,在本段程序中都是选项参数。
可选参数“type”,当设定一个type时程序在存储之前会把这个参数值转换为该类型的数据。
可选参数“dest”,设定“dest”后参数值就保存为命名空间对象中的一个名为“dest” 参数值的一个属性。
“help”是网络的一个帮助描述,用于理解这个参数
“default”是默认参数在这段子程序中没有设置各个参数值,全部使用默认参数。

parser.add_argument('--set', dest='set_cfgs',
                            help='set config keys', default=None,
                            nargs=argparse.REMAINDER)

在这段代码中多了一个讨论的参数“nargs”。
nargs - 应该读取的命令行参数数目。当选项后接受多个或者0个参数时需要这个来指定。来看一个例子:

parser.add_argument('-u',nargs=3)  
parser.parse_args('-u a b c'.split())  
Namespace(u=['a', 'b','c'])  

-u选项接受3个参数,”nargs”可选参数还有‘+’ ‘?’‘*’ 等具体不做多讨论。
在本程序中主要是argparse.REMAINDER.作用是:所有剩余的命令行参数都被收集到一个列表中。我们做个代码地测试即可理解这段代码地作用,并且看看这段代码最后的输出是什么。

在做程序测试之前我们来解读下最后一段代码

if len(sys.argv) == 1:
            parser.print_help()
            sys.exit(1)

sys.argv是程序本身的路径。当然sys.argv还有很多调用的用法,比如sys.argv[0],sys.argv[1],sys.argv[2:]等等这里不做讨论。
sys.exit(1)为退出程序。

import argparse
import sys
def parse_args():
    """
    Parse input arguments
    """
    parser = argparse.ArgumentParser(description='Train a Faster R-CNN network')
    parser.add_argument('--gpu', dest='gpu_id',
                        help='GPU device id to use [0]',
                        default=0, type=int)
    parser.add_argument('--net_name', dest='net_name',
                        help='network name (e.g., "ZF")',
                        default=None, type=str)
    parser.add_argument('--weights', dest='pretrained_model',
                        help='initialize with pretrained model weights',
                        default=None, type=str)
    parser.add_argument('--cfg', dest='cfg_file',
                        help='optional config file',
                        default=None, type=str)
    parser.add_argument('--imdb', dest='imdb_name',
                        help='dataset to train on',
                        default='voc_2007_trainval', type=str)
    parser.add_argument('--set', dest='set_cfgs',
                        help='set config keys', default=None,
                        nargs=argparse.REMAINDER)

    if len(sys.argv) == 1:
        parser.print_help()
        #sys.exit(1)

    args = parser.parse_args()
    return args

if __name__ == '__main__':
    args = parse_args()

    print('Called with args:')
    print("args:",args)

程序输出如下:
在这里插入图片描述
可以看到由于参数没有设置值,故所有的值都是默认值。
parser.print_help()输出了所讨论参数的help描述。

本段子程序parse_args()的解析到此结束

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值