【代码学习记录】deep-person-reid(Python)(自留)

看deep=person-reid的代码记录:代码链接
虽然之前学过python,但是这一看发现还存在许多知识漏洞,加之一些库的实现也不知道(pytorch(PYTORCH中文官方文档),PIL等等),因此看的速度十分缓慢。特此记录看代码时不懂的地方,以及一些小总结。
加之第一次看工程型的文件集合,程序之间的函数调用关系比较复杂,有些也很隐蔽,因此一遍阅读还不够,还需多读几遍已发现更多的细节,并掌握这种文件集合的阅读方法和写法。
阅读&记录顺序如下:
一开始读的文件为"train_img_model_xent.py",遇到跳转时跳转到相关文件。

记录:

1.from _future_ import print_function

注释
Python 2.7可以通过 import _future_ 来将2.7版本的print语句移除,让你可以Python3.x的print()功能函数的形式。

2.from future import absolute_import

注释
在 3.0 以前的旧版本中启用绝对导入等特性所必须的 future 语句。
相对导入:在不指明 package 名的情况下导入自己这个 package 的模块,比如一个 package 下有 a.pyb.py 两个文件,在 a.py 里 from . import b 即是相对导入 b.py
绝对导入:指明顶层 package 名。比如 import a,Python 会在 sys.path里寻找名为 a 的模块。

3.parser = argparse.ArgumentParser(description=‘Train image model with cross entropy loss’)

注释:创建一个解析器对象(外链-命令行选项与参数解析

4.parser.add_argument(’-a’, ‘–arch’, type=str, default=‘resnet50’, choices=models.get_names())

注释
add_argument的使用格式(外链-add_argument使用):

ArgumentParser.add_argument(name or flags…[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])

Mark几个有必要记录的参数:
type: 使用这个参数,转换输入参数的具体类型,这个参数可以关联到某个自定义的处理函数,这种函数通常用来检查值的范围,以及合法性
choices: 这个参数用来检查输入参数的范围
action:store_true&store_false(Action详细解释): 保存相应的布尔值。这两个动作被用于实现布尔开关。
工作流程:默认的动作是保存参数值。在这种情况下,如果提供一个类型,那么在存储之前会先把该参数值转换成该类型。如果提供 dest 参数,参数值就保存为命令行参数解析时返回的命名空间对象中名为该 dest 参数值的一个属性。

5.__xx 双下划线开头

注释(各种下划线的区别):
双下划线开头,是为了不让子类重写该属性方法.通过类的实例化时自动转换,在类中的双下划线开头的属性方法前加上”_类名”实现.

6.args = parser.parse_args()

parse_args() 的返回值是一个命名空间,包含传递给命令的参数。该对象将参数保存其属性。

7.torch.manual_seed(args.seed)

注释
CPU设置种子用于生成随机数,以使得结果是确定的
GPU设置随机种子:
torch.cuda.manual_seed(args.seed)#为当前GPU设置随机种子;如果使用多个GPU,应该使用torch.cuda.manual_seed_all()为所有的GPU设置种子。

8.os.environ[‘CUDA_VISIBLE_DEVICES’] = args.gpu_devices

注释:
使用哪些GPU。如:命令行中输入–gpu-devices 0,1,2,3.则使用4块GPU编号为0,1,2,3.

9.sys.stdout = Logger(osp.join(args.save_dir, ‘log_train.txt’))

注释:
这一整句的含义是:
组合输入的save_dir路径与’log_train.txt’,用这个组合路径初始化utils文件中的Logger类.然后重定向到这个文件路径.(拿什么传递的文件路径这个参数?)
接下来解释几个操作的含义:
osp.join:将多个路径组合,生成一个路径串.(此处将save_dir(命令行输入的)的路径和’log_train.txt组合’,即最终路径为"save_dir/log_train.txt")
Logger:在文件Utils里.输出命令行中的输出到外部文件中.
sys.stdout:从控制台重定向到文件!重定向后, print 调用的就是文件对象的 write 方法

10.os.path.dirname(filename)

注释:去掉脚本的文件名,返回目录。

11.cudnn.benchmark = True

注释:
补全后torch.backends.cudnn.benchmark= True.在程序刚开始加这条语句可以提升一点训练速度,没什么额外开销。这是一个特殊的flag.(何使需要添加)

12.*与**的区别

注释:

  1. 加了(*)的变量名会存放所有未命名的变量参数,不能存放dict
  2. 加了(**)的变量名会存放所有未命名的变量参数

13.Image.BILINEAR

注释:
这是PIL(python image library)库中的一个Image类,作用是:
这里写图片描述

14.特殊调用函数_call_()

注释:这个特殊的函数写在类中,可以将类的实例当作函数调用.调用方法如下:

Fib已定义好,含有\__call__
>>> f = Fib()
>>> print f(10)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

15.img_paths = glob.glob(osp.join(dir_path, ‘*.jpg’))

注释
dir_path之前已经join了一次,现在继续join即我们日常的双击图片操作。
glob.glob()函数返回所有匹配的文件路径列表(文件路径,以字符串形式,构成的 list)。它只有一个参数pathname,定义了文件路径匹配规则,这里可以是绝对路径,也可以是相对路径。
在这里,将所有的.jpg图像文件的路径全部返回到img.path里。

16.pattern = re.compile(r’([-\d]+)_c(\d)’)#正则
pid, _ = map(int, pattern.search(img_path).groups())#复杂语句

注释
·正则表达式compile()函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。
这一句正则表达式的功能
因为数据集文件命名规则如下:"0001_c1s1_001051_00.jpg","0001_c1s1_001051_00.jpg"做如下解释:行人身份_摄像头编号&拍摄到的序列的编号_帧数号_边框号。因此写正则匹配式([-\d]+)_c(\d),匹配并获取行人身份号和摄像头编号,得到的结果为:(行人ID号,摄像机编号)

·map() 会根据提供的函数对指定序列做映射。第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
如下:
>>> map(lambda x: x ** 2, [1, 2, 3, 4, 5]) # 使用 lambda 匿名函数
[1, 4, 9, 16, 25]
>>> map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
[3, 7, 11, 15, 19]
但在这里,map(int,******)是生成一个列表(因为前面(加粗)正则生成的是元组)

***将元组转换成list***
>>> map(int, (1,2,3))
[1, 2, 3]
***将字符串转换成list***
>>> map(int, '1234')
[1, 2, 3, 4]
***提取字典的key,并将结果存放在一个list中***
>>> map(int, {1:2,2:3,3:4})
[1, 2, 3]

·groups()函数返回一个包含所有小组字符串的元

  • 17
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
deep-person-reid是一个用于行人重识别的开源库,它基于PyTorch深度学习框架实现。在使用deep-person-reid进行行人重识别之前,需要进行以下步骤: 1.安装deep-person-reid库 ``` pip install deep-person-reid ``` 2.准备数据集 deep-person-reid支持Market1501、DukeMTMC-reID、CUHK03等多个数据集。你需要先准备好数据集并按照要求的文件夹结构进行组织。 3.配置文件 在deep-person-reid中,模型的配置信息是通过yaml文件进行配置的。你需要创建一个yaml文件,指定数据集路径、模型类型、训练参数等信息。以下是一个示例配置文件: ``` data: sources: ['market1501'] targets: ['market1501'] height: 256 width: 128 combineall: False transforms: ['random_flip', 'color_jitter'] model: name: resnet50 pretrained: True num_classes: 751 loss: name: triplet margin: 0.3 weight_t: 1 weight_x: 1 weight_reg: 0.0005 optimizer: name: adam lr: 0.0003 weight_decay: 5e-04 lr_scheduler: name: step step_size: 40 gamma: 0.1 train: start_epoch: 0 max_epoch: 60 batch_size: 32 workers: 4 print_freq: 10 test: batch_size: 100 workers: 4 ``` 在这个示例配置文件中,我们指定了使用Market1501数据集,使用resnet50模型,使用triplet loss进行训练,使用adam优化器进行优化等等。 4.训练模型 使用deep-person-reid训练模型非常简单,只需要执行以下命令即可: ``` python train.py --config-file /path/to/config.yml ``` 其中,`/path/to/config.yml`指定了你的配置文件路径。 5.测试模型 在训练完成后,你可以使用以下命令测试模型: ``` python test.py --config-file /path/to/config.yml ``` 这个命令会输出模型在测试集上的准确率等指标。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值