目录
1 学习pytorch进行图像处理的四个必用链接:
2 运行Mask R-CNN例程时的问题点
2.1 在哪儿下载 engine.py transforms.py utils.py?
Github下载xxx.py文件的方法
2.2 安装pycocotools
2.3 手动输入代码时出现的一些问题
2.4 CPU模式下运行代码的小BUG
3 个人对于tensorflow caffe pytorch的浅显体会
先附上pytorch的中文和英文版教程链接,Pytorch API手册,以及github图像库链接:
中文:http://pytorch123.com/
英文:https://pytorch.org/tutorials/index.html
API:https://pytorch.org/docs/stable/index.html
vision:https://github.com/pytorch/vision
学习Pytorch中,在windows下运行教程中的例子,发现还有一些地方存在不明白的,现总结如下。
教程里没有给出链接,是在github上pytorch的torchvision repository里面:
https://github.com/pytorch/vision/tree/master/references/detection
当然,运行的时候还是会提示各种错误,那是因为一些依赖的.py没有,依然可以从上面的链接中找到,特别的:
coco_utils.py coco_eval.py
将上述.py都下载下来,拷贝到例程所在的文件夹下。
话说如何下载?之前我没有github账号的时候,右边都有clone download的按钮,现在登录了,却没有了下载的按钮,或者它就没有打包。。。百度后发现了下载的方法:
点开需要下载的那个.py文件,然后代码的右上角有个“Raw”的标签,右键->链接保存为 ,,即可下载了。
再运行,就会出现终极错误。找不到pycocotools,请继续步骤2
直接pip install pycocotools是会报错的,参考下面链接的方法:
https://blog.csdn.net/u012128777/article/details/100973199?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
发现没有git,然后又参考 https://blog.csdn.net/qq_32786873/article/details/80570783 进行安装,但是github很不稳定,网速很慢,就在csdn上搜了一个需要积分的下载下来,40多M。安装好后,添加环境变量,然后在之前的cmd里面执行git --version,提示依然没有git。
好像是没有更新吧,关闭命令行窗口,重新打开后,git就出现了!然后按照刚才的链接,开始下载pycocotools。我是等了好一会儿,才安装好。
由于代码是我手动输入的,出现了很多小错误。
在编写PennFudanDataset时,方法__getitem__函数忘记添加 return:
在PennFudanDataset里,masks误写为mask
写完最后一个main方法后,没有添加执行 main:
以及出现这种错误:
RuntimeError: Given transposed=1, weight of size 1024 256 2 2, expected input[78, 256, 14, 14] to have 1024 channels, but got 256 channels instead
有一种说法是没有将图像转化为“RGB’,查看代码后发现已经转化了,那问题在哪儿呢?
很明显是该层的输入通道与实际得到的通道数不匹配,再次检测代码,是这里错了,
model.roi_heads.mask_predictor = MaskRCNNPredictor(in_features,
hidden_layer,
num_classes)
是输入特征数错了,改成in_features_mask,一切就OK啦
in_features_mask = model.roi_heads.mask_predictor.conv5_mask.in_channels
发现了一个小bug,这个代码本意是想能在GPU和CPU上都兼容运行的,但是个人认为作者仅在GPU上跑通,CPU上运行很慢,而且在evaluate()的时候会报错。
engine.py的86行:
torch.cuda.synchronize()
这句话就默认了当前是GPU模式,没有GPU的话这里就报错了,因此,个人给添加了一句话:
if torch.cuda.is_available(): torch.cuda.synchronize()
这样在没有GPU的时候,bypass了CUDA同步的操作。问题解决!下面是evaluate的运行结果:
Test: [ 0/50] eta: 0:13:53 model_time: 16.3845 (16.3845) evaluator_time: 0.2324 (0.2324) time: 16.6657 data: 0.0489
Test: [49/50] eta: 0:00:13 model_time: 13.2440 (13.5054) evaluator_time: 0.1157 (0.1208) time: 14.0909 data: 0.0177
Test: Total time: 0:11:22 (13.6521 s / it)
Averaged stats: model_time: 13.2440 (13.5054) evaluator_time: 0.1157 (0.1208)
Accumulating evaluation results...
DONE (t=0.06s).
Accumulating evaluation results...
DONE (t=0.04s).
IoU metric: bbox
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.001
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.008
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.000
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.000
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.005
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.001
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.010
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.136
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.060
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.144
IoU metric: segm
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.000
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.000
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.000
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.000
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.000
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.000
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.000
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.017
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = -1.000
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.020
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.017
总结一下学习Pytorch的体会:
1. 与python原生风格贴合紧密,用起来很顺手,就像numpy一样。
2.与tensorflow相比,可以及时调试,发现问题,不像tensorflow那样,虽然有eger模式,但还是不习惯那种with session,更不习惯花大力气去维护变量,要知道起名还是很难为人的,虽然tensorflow有slim版本,但是在也不愿意去委屈自己,天天升级习惯。
3.跟caffe比起来,pytorch简直是明了许多,不用再去看好几千行的caffemodel文件了,改一个模型,名字就得换半天,太焦心了,而且还得使用各种shell命令去训练和评估模型。特别的,使用这个脚本from engine import train_one_epoch, evaluate,可以使用简单的几行代码进行训练,特别方便。
4.pytorch将神经网络的主体规范化,做到十分明了。而最让人头疼的数据集加载方面,还是比较出色的,用python的风格来加载数据,入手很快,也容易理解,debug模式很容易找到问题所在。
总之,在简单使用了三个流行的深度学习平台后,很推荐新手使用pytorch入门。