GluonCV下载模型的源码地址(test.py):
https://gluon-cv.mxnet.io/model_zoo/segmentation.html
记录这个,是因为每次使用gluoncv的模型,系统 总是默认地址为
C:\Users\Administrator/.mxnet
而C盘使用时间一长,就不堪重负,所以我把模型地址设为MXNET_HOME。
比如:MXNET_HOME的环境变量的内容设置为地址 D:\MXNet_HOME,这个地址将是要下载的模型所放置的地方。不建的话,就要看有没有‘HOME’‘USERPROFILE’‘HOMEPATH’'HOMEDRIVE'等环境变量来确定最后的地址了。
gluonCV是通过gluoncv\model_zoo\model_store.py中的get_model_file函数来确认模型地址的。看一下其源码,不难理解其路径设置的方式了,
例如,主程序是这样获取路径的,
if prog is None:
prog = _os.path.basename(_sys.argv[0])
这里,_sys.argv[0]就是你运行的主程序(假设名字叫test.py吧)的路径,如 ‘d:\\mxNet\\gluon_cv_tests\\ADE20K\\test.py'
prog就是得到的文字名称,这里是'test.py'
os.environ 表示计算机当前的全部路径,例如下面这句,表示如果环境变量中有MXNET_HOME这个地址的话,root就选用该地址
if 'MXNET_HOME' in os.environ:
root = os.path.join(os.environ['MXNET_HOME'], 'models')
如果没有MXNET_HOME这个环境变量的话,就会通过os.path.expanduser寻找用户的默认目录,
root = os.path.expanduser(root)
其中,包括‘HOME’‘USERPROFILE’‘HOMEPATH’'HOMEDRIVE'等常见指定目录的参数。函数具体实现可参考expanduser函数源码。例如,假设用户的默认文档上当是:'c:\\documents\\user',那么root的路径就是'c:\\documents\\user/.mxnet/models'。
函数expanduser源码如下,
def expanduser(path):
"""Expand ~ and ~user constructs.
If user or $HOME is unknown, do nothing."""
path = os.fspath(path)
if isinstance(path, bytes):
tilde = b'~'
else:
tilde = '~'
if not path.startswith(tilde):
return path
i, n = 1, len(path)
while i < n and path[i] not in _get_bothseps(path):
i += 1
if 'HOME' in os.environ:
userhome = os.environ['HOME']
elif 'USERPROFILE' in os.environ:
userhome = os.environ['USERPROFILE']
elif not 'HOMEPATH' in os.environ:
return path
else:
try:
drive = os.environ['HOMEDRIVE']
except KeyError:
drive = ''
userhome = join(drive, os.environ['HOMEPATH'])
if isinstance(path, bytes):
userhome = os.fsencode(userhome)
if i != 1: #~user
userhome = join(dirname(userhome), path[1:i])
return userhome + path[i:]
最后,
params_path = os.path.join(root, file_name + '.params')
设定最终模型参数的存放位置。例如,如果已经根据前面的设定建立了MXNET_HOME的位置,那这个文件的位置就是,
'D:\\MXNet_HOME\\models\\resnet101_v1s-bd93a83c.params'
下面是一些路径操作的基本函数,贴到这里备查吧。
3.4版本之前使用os.path模块,3.4版本之后建议使用pathlib模块
方法 | 解释 |
---|---|
path.join | 拼接一个路径出来 |
path.exists | 判断该路径是否存在 |
path.split | 将路径切割成头和尾的一个元组 |
path.abspath | 返回一个绝对路径 |
path.dirname | 返回‘目录’ |
path.basename | 返回路径的最后一部分 |
from pathlib import Path
Path中返回的是一个Path对象,而os.path中返回的是一个字符串。
初始化:
属性 | 解释 |
---|---|
parts | 返回路径中的每一个部分 |
joinpath | 连接多个字符串到Path对象中 |
parent | 目录的逻辑父目录 |
parents | 父目录序列,索引0是直接的父 |
name | 目录中的最后一部分 |
suffix | 目录中的最后一部分的扩展名 |
stem | 目录的最后一个部分,没有后缀 |
suffixes | 返回多个扩展名列表 |
with_suffix(suffix) | 补充扩展名到路径的尾部,返回新的路径,扩展名存在则无效 |
with_name(name) | 替换目录最后一个部分并返回一个新的路径 |
属性 | 解释 |
---|---|
cwd() | 返回当前工作目录 |
home() | 返回当前家目录 |
is_dir() | 是否是目录 |
is_file() | 是否是普通文件 |
is_symlink() | 是否是软链接 |
is_socket() | 是否是socket文件 |
is_block_device() | 是否是块设备 |
is_absolute() | 是否是绝对路径 |
resolve() | 返回一个新的路径,该路径是当前Path的绝对路径,如果是软连接则被解析 |
absolute() | 获取绝对路径,推荐使用resolve() |
exists() | 目录或者文件是否存在 |
rmdir() | 删除空目录,没有提供判断目录为空的方法 |
touch() | 创建一个文件 |
as_uri() | 将路径解析成url |
mkdir() | 创建目录 |
通配符匹配:
查看文件或者目录属性信息
open(mode='r', buffering=-1, encoding=None, errors=None, newline=None
如何内建的open,返回一个文件对象。shutil模块提供了对文件的高级操作,特别是针对文件的复制和移动。
rm -rf
一样