首先右键HTCN文件夹,选择open as a Pycharm Project进入到Pycharm界面,观察到左侧workspace内有很多文件夹。我们分别来讨论一下其作用。
1.cfgs(configurations)
这里存放的都是工程的配置文件,所谓配置文件储存的就是工程的一些超参数。单独实现一个cfgs是便于模型的保存与复制。我们点开cfgs文件夹,发现其储存的结构如下:
yml后缀文件是一种配置文件,其储存了resnet以及vgg作为backbone的时候各种网络的参数。yml与json文件类似,都是用于配置的文件类型。其数据格式通常为 key:value的集合,我们打开一个yml文件为例:其储存了训练以及测试所需要的各种超参数名称(key)以及值(value)
在使用的时候,我们可以借助with open命令读取这些超参数
with open("data.json", 'r') as load_f:
data=json.load(load_f)
print(data)
然后在argparser文件中使用。
2.lib文件夹
lib文件夹实际上储存了所有我们事先所需要的模型、提前写好的函数等等。其目的就是方便我们直接import某些预先写好的模型或者函数,将其分成各种文件夹可以将不同功能的代码更加清晰地进行分类,但是这不能改变其本质:为工程服务的各种py文件,py文件的内部就是实现的各种函数或模型。
在需要使用这些py文件的地方,我们可以通过import来实现:
from lib.model.utils import xxx :导入libs下model文件夹内utils.py文件的xxx函数
在import的时候要先查看系统的默认路径在哪里:sys.path的查找路径是什么。这样才可以让系统找到我们的文件。比如上面这个命令,系统的默认路径必须含有"C:\Users\褚峤松\Desktop\迁移学习与小样本学习\code\HTCN-master" 。这是因为我们是from lib开始导入的,而lib文件夹的绝对路径是"C:\Users\褚峤松\Desktop\迁移学习与小样本学习\code\HTCN-master\lib"。如果系统默认路径没有"C:\Users\褚峤松\Desktop\迁移学习与小样本学习\code\HTCN-master",系统就会找不到lib文件夹在哪里,更别说从lib导入包或者py文件了。
我们点开lib文件夹,其结构如下:
我们分别来介绍一下每个文件夹的作用:
(a)datasets
我们发现这里面有我们迁移学习的数据集cityscapes,还有目标检测的数据集coco,pascal_voc等以及它们的处理数据的py文件。这里创建了imdb(image database)并将各种类型的数据集的数据都转化成统一类型的imdb。因为检测任务中数据集比较复杂,还要牵扯roi以及bbox等,所以都比较复杂。
(b)model
由于我们的迁移学习的检测框架是采用faster_rcnn的,因此这里的model都是faster rcnn的各种层以及功能实现,比如roi以及nms等功能。csrc内是cuda设备的脚本。
(c)pycocotools
它是一个针对COCO数据集的开源的一个包,其可用于管理、下载coco数据集。这里不详细进行说明,可以在下面的博客进行详细观看。Py之pycocotools:pycocotools库的简介、安装、使用方法之详细攻略_一个处女座的程序猿-CSDN博客_pycocotoolshttps://blog.csdn.net/qq_41185868/article/details/103897159(d)roi_data_layer
这里是pytorch训练的dataset以及dataloader的定义处,针对检测数据定义了新的roi database。是针对数据集打包成batch的脚本
(e)setup.py 在运行整个程序之前,要先输入这个命令配置faster-rcnn的部署
python setup.py build develop
遇到的问题见https://github.com/chaoqichen/HTCN/issues/7
3.venv虚拟环境
这是采用工程自带的脚本创建的虚拟环境,与前面Pycharm的创建虚拟环境相同。只不过这里没有采用conda进行创建,因此创建的虚拟环境venv没有在anaconda或者miniconda的envs文件夹下,而是直接创建在工程文件夹下方。本质就是一个虚拟的python环境
pytorch也在这个环境内:在sitepackages内的torch
例:from torch.utils.data import dataset 当然要注意我们import的时候注意系统的路径在哪里
4.初始化路径 _init_path.py:(在setup后需要配置初始路径) 实现了自己的添加路径的函数
我们在import文件时,sys.path包含了当前路径以及环境文件夹下site-packages的路径。因此pip安装的包都可以在site-packages下被正确找到,可以正确import。但是lib文件夹并不在sys.path中,因此无法正确导入。因此我们在工程文件夹下方添加了一个_init_paths.py文件来把lib加入到sys.path中。下面来看_init_paths.py的代码:
import os.path as osp
import sys
#定义函数add_path,将路径加入到sys.path中
def add_path(path):
if path not in sys.path:
sys.path.insert(0, path)
print(sys.path)
print(__file__) #借助_file__打印当前_init_paths.py文件的路径
>>>C:/Users/褚峤松/Desktop/迁移学习与小样本学习/code/HTCN-master/_init_paths.py
this_dir = osp.dirname(__file__) #通过__file__找到当前路径(工程文件的路径)
print(this_dir) #dirname是返回_init_paths.py的上一级目录,即当前目录
>>>C:/Users/褚峤松/Desktop/迁移学习与小样本学习/code/HTCN-master
# 将lib文件夹的路径添加到sys.path中
lib_path = osp.join(this_dir, 'lib')
add_path(lib_path)
print(lib_path)
>>>C:/Users/褚峤松/Desktop/迁移学习与小样本学习/code/HTCN-master\lib
通过代码我们可以发现为什么要单独写一个_init_paths.py文件。原因在于:这个工程在每个人的电脑或者服务器存放的位置都是不同的,因此我们需要用_file__来找到_init_paths.py的路径,并通过dirname来找到工程文件的绝对路径,而lib就在工程文件夹下,出于这个考虑,才把_init_paths.py与lib放在一个目录下。这样就可以添加lib的绝对路径到sys.path下,import操作才不会出错。因此我们必须首先运行_init_paths.py修改sys.path,后续的代码才可以正常运行。
(g) 其它部分
README是每个工程文件都会有的,在运行工程之前我们首先需要阅读这个文件。
requirments.txt是储存了工程环境所需要的所有安装包以及其版本,是配置环境的时候所需要用到的。如果作者写好了配置环境的脚本则pycharm会自动配置环境,没有的安装包也会pip 自动下载。如果作者没有写这个脚本,需要我们自己配置环境,那么我们只需要在自己创建的conda环境内输入命令:pip install -r requirements.txt即可
后面的test_net以及trainval_net是测试新的数据集以及训练+验证的时候的脚本,也是我们需要运行的脚本文件,即这个python工程的main函数。