faster-rcnn fancy数据结构

easydict

1
2
3
4
5
6
7
8
9
10
>>> from easydict import EasyDict as edict
>>> d = edict({'foo':3, 'bar':{'x':1, 'y':2}})
>>> d.foo
3
>>> d.bar.x
1

>>> d = edict(foo=3)
>>> d.foo
3

https://github.com/makinacorpus/easydict

argparse

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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')

args = parser.parse_args()

return args

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

os.path

获得当前路径

1
2
3
4
import os.path as osp

if __name__ == '__main__':
print(osp.abspath(osp.dirname(__file__)))

yml使用

语法

大小写敏感
缩进时不允许使用Tab键,只允许使用空格。

python

数组操作

1
2
for k, v in zip(cfg_list[0::2], cfg_list[1::2]):
pass

文件不存在

1
2
3
if not os.path.isfile(caffemodel):                                                  
raise IOError(('{:s} not found.\nDid you run ./data/script/'
'fetch_faster_rcnn_models.sh?').format(caffemodel))

format

用 {} .format 代替 %s %

1
2
3
print '\n\nLoaded network {:s}'.format(caffemodel)
print ('Detection took {:.3f}s for {:d} object proposals')
.format(timer.total_time, boxes.shape[0])

读文件

1
cv2.imread(im_file)

1维度添加一个维度

1
2
3
4
cls_scores
(300,)
cls_scores[:, np.newaxis]
(300, 1)

排序和反排序

1
2
order = scores.argsort()
order = scores.argsort()[::-1]

transpose

1
im = im[:, :, (2, 1, 0)]

copy=true

1
im_orig = im.astype(np.float32, copy=True)

resize

1
im = cv2.resize(im_orig, None, None, fx=im_scale, fy=im_scale,interpolation=cv2.INTER_LINEAR)

每一个维度取最大

1
max_shape = np.array([im.shape for im in ims]).max(axis=0) # 每一位取最大的

os.path.join

solvers = [[net_name, n, ‘stage1_rpn_solver60k80k.pt’],
[net_name, n, ‘stage1_fast_rcnn_solver30k40k.pt’]]
solvers = [os.path.join(cfg.MODELS_DIR, *s) for s in solvers]

随机数

1
2
3
# fix the random seeds (numpy and caffe) for reproducibility
np.random.seed(cfg.RNG_SEED)
caffe.set_random_seed(cfg.RNG_SEED)

split

1
2
3
for year in ['2007', '2012']:
for split in ['train', 'val', 'trainval', 'test']:
name = 'voc_{}_{}'.format(year, split)

_class_to_ind

1
self._class_to_ind = dict(zip(self.classes, xrange(self.num_classes)))

path.exists

1
2
assert os.path.exists(image_set_file), \
'Path does not exist: {}'.format(image_set_file)

readline

1
with open(image_set_file) as f:

caffe

1
net = caffe.Net(prototxt, caffemodel, caffe.TEST)

blob

Blob是Caffe的基本数据结构,具有CPU和GPU之间同步的能力,它是4维的数组(Num, Channels, Height, Width)
访问data或diff有两种方法:

1
2
const Dtype* cpu_data() const; //不修改值
Dtype* mutable_cpu_data(); //修改值

dump

1
2
with open(cache_file, 'wb') as fid:
cPickle.dump(gt_roidb, fid, cPickle.HIGHEST_PROTOCOL)

pretrained model

1
2
self.solver = caffe.SGDSolver(solver_prototxt)
self.solver.net.copy_from(pretrained_model)

bash

1
2
3
4
5
6
7
8
set -x 输出执行的命令
set -e 错误就停止
${foo,} lowercase the first letter
${foo,,} lowercase all the letters
${foo^^} uppercase all the letters
${string/regexp/replacement}
`date +'%Y-%m-%d_%H-%M-%S'`
time
请作者喝一杯咖啡☕️