从Faster RCNN开始学python(三)

今天准备解析的代码如下:

import multiprocessing as mp
# queue for communicated results between processes
mp_queue = mp.Queue()
# solves, iters, etc. for each training stage
solvers, max_iters, rpn_test_prototxt = get_solvers(args.net_name)

print '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
print 'Stage 1 RPN, init from ImageNet model'
print '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'

cfg.TRAIN.SNAPSHOT_INFIX = 'stage1'
mp_kwargs = dict(
        queue=mp_queue,
        imdb_name=args.imdb_name,
        init_model=args.pretrained_model,
        solver=solvers[0],
        max_iters=max_iters[0],
        cfg=cfg)
p = mp.Process(target=train_rpn, kwargs=mp_kwargs)
p.start()
rpn_stage1_out = mp_queue.get()
p.join()

在Faster RCNN中使用的是多进程的方式,multiprocessing是使用多进程的一个包。
在multiprocessing中Queue是mp库当中用来提供多进程对象交换的方式,它将对象从一个进程传输的另一个进程,就好比两个不相干的通道突然有一个小小的分支,这个分支会筛选想要的东西前往另一个通道。具体的内容太多不做详细解释,大家有需要时再去详细了解。

这个时候mp_queue即是一个多进程的对象交换的一个方法了(mp_queue = mp.Queue())。

从 args.net_name 中得到变量solvers, max_iters, rpn_test_prototxt的值,使用函数为(solvers, max_iters, rpn_test_prototxt = get_solvers(args.net_name))

解析子程序:get_solvers(net_name)

def get_solvers(net_name):
    # Faster R-CNN Alternating Optimization
    n = 'faster_rcnn_alt_opt'
    # Solver for each training stage
    solvers = [[net_name, n, 'stage1_rpn_solver60k80k.pt'],
               [net_name, n, 'stage1_fast_rcnn_solver30k40k.pt'],
               [net_name, n, 'stage2_rpn_solver60k80k.pt'],
               [net_name, n, 'stage2_fast_rcnn_solver30k40k.pt']]
    solvers = [os.path.join(cfg.MODELS_DIR, *s) for s in solvers]
    # Iterations for each training stage
    max_iters = [80000, 40000, 80000, 40000]
    # max_iters = [100, 100, 100, 100]
    # Test prototxt for the RPN
    rpn_test_prototxt = os.path.join(
        cfg.MODELS_DIR, net_name, n, 'rpn_test.pt')
    return solvers, max_iters, rpn_test_prototxt

在此处省略解析前面简单的赋值语句。

os模块是python中的一个常用标准库。它允许一个程序在编写后不需要任何改动,就可以在不同系统下运行。
os.path.join()是路径拼接的函数,在下列这句语句中,我们先查看下cfg.MODELS_DIR的设置。

solvers = [os.path.join(cfg.MODELS_DIR, *s) for s in solvers]

cfg.MODELS_DIR的设置:

import os.path as osp
__C.ROOT_DIR = osp.abspath(osp.join(osp.dirname(__file__), '..', '..'))
__C.MODELS_DIR = osp.abspath(osp.join(__C.ROOT_DIR, 'models', 'pascal_voc'))

其中:
os.path.abspath(path) #返回绝对路径
os.path.dirname(path) #返回文件路径
cfg.MODELS_DIR最后得到的是一个绝对路径,通过简单编程测试可以很好理解这个路径的设置,不做赘述。

在程序中使用了for s in solvers则是将solvers中的每个都提取出来依次改变solvers的内容为地址。

整个solvers最后改变为各个进程的路径文件 file 的绝对路径。

设置各个阶段迭代的次数:

max_iters = [80000, 40000, 80000, 40000]

最后依旧是简单的路径连接:

rpn_test_prototxt = os.path.join(
            cfg.MODELS_DIR, net_name, n, 'rpn_test.pt')

get_solvers(net_name)这个子程序较为简单,不做过多解释。

cfg.TRAIN.为字典,给其中的键名SNAPSHOT_INFIX 赋值(cfg.TRAIN.SNAPSHOT_INFIX = ‘stage1’)

mp_kwargs = dict(
        queue=mp_queue,
        imdb_name=args.imdb_name,
        init_model=args.pretrained_model,
        solver=solvers[0],
        max_iters=max_iters[0],
        cfg=cfg)
p = mp.Process(target=train_rpn, kwargs=mp_kwargs)
p.start()
rpn_stage1_out = mp_queue.get()
p.join()

在multiprocessing模块中提供了一个Process类来代表一个进程对象。
使用mp.Process()设置了一个进程,此时进程并没有运行,当执行p.start()时进程才开始运行,p.join()是等进程运行结束后再运行下面的程序。
先主要解析下列语句

p = mp.Process(target=train_rpn, kwargs=mp_kwargs)

该语句主要将目标执行了子程序train_rpn,输入参数为mp_kwargs(之前定义好的字典,用于多输入)。
子函数train_rpn是用来训练一个区域建议网络,作为Faster RCNN算法的一个重要组成部分,我们将其另做介绍。至此这篇从Faster RCNN开始学python(三) 到此结束。下篇从Faster RCNN开始学python(四)开始解读区域建议网络的部分train_rpn。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值