跑retinaNet代码&pytorch的过程和那些坑

跑retinaNet代码&pytorch的过程和那些坑

写在前面

1.这篇文章是自己作为一个初学者(或者说什么都不会)在复现yhenon的pytorch-retinaNet代码的整个过程记录,以及遇到的各种问题,文中大量引用了别人的博客或文章内容,都给了详细的网址,作为注释和学习参考。
2.目前为止,对于retinaNet个人觉得对于帮助我的理解最大的一篇文章:
网址:https://blog.csdn.net/qq_43284847/article/details/98472472
3.后期可能有部分更新,可查看以下网址:https://www.yuque.com/yanyu-thlhi/en60s1/nyyi2f

一、复现步骤

步骤一:下载源码

下载retinaNet的代码,网址如下:https://github.com/yhenon/pytorch-retinanet
下载完成后放到一个project中。

步骤二:下载package(下面默认都是再新环境下执行命令)

1.建立新环境

首先,建立一个新的环境,在anaconda的控制台下:
跑retinaNet代码&pytorch的过程和那些坑_第1张图片
输入命令,创建一个新的环境

conda env list  #查看已有的环境

conda create --name your_env_name #创建一个名为your_env_name的新环境

conda activate your_env_name  #进入创建的新环境中

conda deactivate  #退出环境

conda命令的使用入门和anaconda安装可以看下面的网址:

https://www.jianshu.com/p/742dc4d8f4c5

2.安装pytorch

法一:在上述的环境中输入命令:

conda install pytorch torchvision cudatoolkit=10.1 -c pytorch	

注:(1)该命令来自于pytorch官网,时不断更新的

官网地址:https://pytorch.org/get-started/locally/

(2)第一次用正常安装会很慢,安装过程可参照下面的文章:

地址:https://www.yuque.com/yanyu-thlhi/aro3o2/xw9rwr

3.安装其他的package

方法一:可以在pycharm中直接通过点击(代码旁的红色错误警告:一个灯的形状)下载安装
方法二:在控制台(anaconda进入环境或者pycharm下的terminal都可以),通过

pip install package_name
#或者

conda install package_name

4.安装coco数据集的package(这是一个坑)

这个的安装花费了很长的时间

说明:通过pip install 或者conda install 都失败了,根据了解,是这个数据集的作者明确表示不开通windows的使用,但是又牛人在git上写了在windows上的应用,网址如下:https://github.com/philferriere/cocoapi,这个的下方介绍了如何使用,但是我试了这个上面的方法,失败了(但不是一定失败,我有同学试过,是可以直接按git给的方式成功安装的),并在网上找了很多的方式,都失败了,但其中有一个方法是可以的,网址如下:http://www.mamicode.com/info-detail-2660241.html。下面给出可能的解决方案。

 #git原网上的安装方式(要求windows安装过visual c++ build tool,
 #但是我安装了也不行,可以先试试命令可不可以)
 pip install git+https://github.com/philferriere/cocoapi.git#subdirectory=PythonAPI
 
 #我的解决方式
 #(1)直接网址下载coco文件,放到项目文件夹下,或者使用以下命令:
 #最好在pycharm的terminal中输入,目的是使文件在项目文件中
 git clone https://github.com/pdollar/coco.git
 
 cd coco/PythonAPI
 
 #(2)控制台操作:
 python setup.py build_ext --inplace
 
 python setup.py build_ext install

在控制台第一个命名执行后,可能会出错,则使用一下的方式:报错的话如果是cl: 命令行 error D8021 :无效的数值参数“/Wno-cpp” 和 cl: 命令行 error D8021 :无效的数值参数“/Wno-unused-function”,不用担心,打开上面的setup.py文件,直接删除这两个参数就可以:
跑retinaNet代码&pytorch的过程和那些坑_第2张图片
然后再按照上面的两个命令运行就可以了,安装完成后可以再将删去的代码再次加回去就可以了。

步骤三:下载coco数据集

coco数据集的官方链接是可以直接用的,但是使用chrome下载时网速几乎为零,根本不动,而coco数据集很大,后来找到了解决方案,使用迅雷下载,这样基本可以按正常网速下载了,下面提供2017coco数据集的链接:
(1)train2017:http://images.cocodataset.org/zips/train2017.zip
(2)val2017:http://images.cocodataset.org/zips/val2017.zip
(3)test2017:http://images.cocodataset.org/zips/test2017.zip
(4)trainval2017:http://images.cocodataset.org/annotations/annotations_trainval2017.zip
(5)trainval2017:http://images.cocodataset.org/annotations/stuff_annotations_trainval2017.zip
(6)image_info_test2017:http://images.cocodataset.org/annotations/image_info_test2017.zip

下载后解压放到coco文件夹下。

步骤四:按git所给的方式运行训练coco数据集的命令

在pycharm的terminal下运行如下命令:

python train.py --dataset coco --coco_path ..coco --depth 50

1.错误:ImportError: cannot import name ‘PILLOW_VERSION’ from ‘PIL’ (E:\Anaconda\lib\site-packages\PIL_init_.py)

image.png

原因:torchvision在运行时要调用PIL模块的PILLOW_VERSION函数。但是PILLOW_VERSION在Pillow 7.0.0之后的版本被移除了,Pillow 7.0.0之后的版本使用__version__函数代替PILLOW_VERSION函数。

解决方案:打开最后的一个文件链接,定位错误处,再用__version__函数代替PILLOW_VERSION函数。

参考网址:https://blog.csdn.net/Lee_lg/article/details/103901632

2.ModuleNotFoundError: No module named ‘pycocotools’(实际已安装的情况下)

解决方案:再次安装。

3.下载.pth文件速度太慢

地址:https://download.pytorch.org/models/resnet50-19c8e357.pth
跑retinaNet代码&pytorch的过程和那些坑_第3张图片

解决方案:根据网址使用迅雷下载,下载后放到train的同名文件夹下即可。

4.路径不存在:

E:\py-learn\pytorch-retinanet\coco\images\train2017

原因:数据集train2017直接放在了coco目录下

解决方案:更正目录即可

5.错误:BrokenPipeError: [Errno 32] Broken pipe

参考网址:https://blog.csdn.net/qq_33666011/article/details/81873217

原因:该问题的产生是由于windows下多线程的问题,和DataLoader类有关

解决方案:修改调用torch.utils.data.DataLoader()函数时的 num_workers 参数,修改num_works参数为 0 ,只启用一个主进程加载数据集,避免在windows使用多线程即可。

注:num_works设置为0可能对速度影响很大,建议改小一些试试

6.提示:CUDA out of memory

可能原因:batch的值大了

解决方案:将batch的值设小一些,但是batch小了,会影响迭代和io,进而影响整体的速度(且影响很大)

二、代码分析

1.获取数据集,transform()函数和Rrsizer(), Augmenter(), Normalizer()

image.png

其中,transform:Python中图像数据读入一般都是 nChanns x H x W的numpy数组。常规的做法是使用Dataset中的transform对数据进行转换,输出torch类型的数组。
在目标检测中,一般将图像进行缩放,使其尺寸满足一定要求,具体可以参考之前的博客。也就是要实现一个Resizer()的类进行变换。此外,通常要对图像进行标准化处理,以及水平翻转等变换。因此,在实现Dataset时要实现的变换有三个: Resizer()、Normalizer()和Augmenter()。
详细内容,参考网址:https://www.cnblogs.com/zi-wang/p/9972102.html

2.DataLoader()和AspectRatioBasedSampler()

跑retinaNet代码&pytorch的过程和那些坑_第4张图片

AspectRatioBasedSampler()函数:位于dataloader.py文件中:

跑retinaNet代码&pytorch的过程和那些坑_第5张图片
该函数的目的是为给DataLoad()函数传递batch_sample参数,所以其内参数介绍放在下面的DataLoader()函数中,

sampler(Sampler, optional): 自定义从数据集中取样本的策略,如果指定这个参数,那么shuffle必须为False
batch_sampler(Sampler, optional): 与sampler类似,但是一次只返回一个batch的indices(索引),需要注意的是,一旦指定了这个参数,那么batch_size,shuffle,sampler,drop_last就不能再制定了(互斥——Mutually exclusive)

DataLoad()函数:

首先简单介绍一下DataLoader,它是PyTorch中数据读取的一个重要接口,该接口定义在dataloader.py中,只要是用PyTorch来训练模型基本都会用到该接口(除非用户重写…),该接口的目的:将自定义的Dataset根据batch size大小、是否shuffle等封装成一个Batch Size大小的Tensor,用于后面的训练。
官方对DataLoader的说明是:“数据加载由数据集和采样器组成,基于python的单、多进程的iterators来处理数据。”关于iterator和iterable的区别和概念请自行查阅,在实现中的差别就是iterators有__iter__和__next__方法,而iterable只有__iter__方法。

DataLoad()的参数介绍:

 dataset(Dataset): 传入的数据集
    batch_size(int, optional): 每个batch有多少个样本
    shuffle(bool, optional): 在每个epoch开始的时候,对数据进行重新排序
    sampler(Sampler, optional): 自定义从数据集中取样本的策略,如果指定这个参数,那么shuffle必须为False
    batch_sampler(Sampler, optional): 与sampler类似,但是一次只返回一个batch的indices(索引),需要注意的是,一旦指定了这个参数,那么batch_size,shuffle,sampler,drop_last就不能再制定了(互斥——Mutually exclusive)
    num_workers (int, optional): 这个参数决定了有几个进程来处理data loading。0意味着所有的数据都会被load进主进程。(默认为0)
    collate_fn (callable, optional): 将一个list的sample组成一个mini-batch的函数
    pin_memory (bool, optional): 如果设置为True,那么data loader将会在返回它们之前,将tensors拷贝到CUDA中的固定内存(CUDA pinned memory)中.

    drop_last (bool, optional): 如果设置为True:这个是对最后的未完成的batch来说的,比如你的batch_size设置为64,而一个epoch只有100个样本,那么训练的时候后面的36个就被扔掉了…
    如果为False(默认),那么会继续正常执行,只是最后的batch_size会小一点。

    timeout(numeric, optional): 如果是正数,表明等待从worker进程中收集一个batch等待的时间,若超出设定的时间还没有收集到,那就不收集这个内容了。这个numeric应总是大于等于0。默认为0
    worker_init_fn (callable, optional): 每个worker初始化函数 If not None, this will be called on each
    worker subprocess with the worker id (an int in [0, num_workers - 1]) as
    input, after seeding and before data loading. (default: None) 

详细内容,参考网址:https://www.cnblogs.com/ranjiewen/p/10128046.html

注2:训练神经网络中最基本的三个概念:Epoch, Batch, Iteration

网址:https://zhuanlan.zhihu.com/p/29409502
重点:https://blog.csdn.net/qq_39521554/article/details/84480429

3.retinaNet package下的model.resnet

跑retinaNet代码&pytorch的过程和那些坑_第6张图片

三、模型

1.retinaNet模型图

跑retinaNet代码&pytorch的过程和那些坑_第7张图片
第一步:resnet模型,降低网络深度增加带来的梯度消失的负影响
第二步:FPN模型,整合不同维度特征
第三步:SubNet,分类和回归,得到一系列的anchor
第四步:Focal loss,分析误差,降低“类别极为不平衡”的负面影响
。。。待完善。

你可能感兴趣的:(python)