AttributeError: \'NoneType\' object has no attribute \'astyp
这几天在调R-C3D的模型,记录一下自己遇到的一些问题,以及自己在这个过程中的成长和收获。
在Github上放出的代码,可能会有很多细节的问题,加上编译环境的不同,所以在复现代码时会遇到很多问题,像我这种小白级的会先去浏览一下issue里有没有相关的问题以及解决办法,再就是去google,Baidu等各种论坛搜索。对于一般性的问题,会与很多解决办法。然而科研问题更多的是这种针对性的问题,而非普适性的问题,这个时候我就会向实验室里能力强的同学请教,顺便学习一下。
Bug如下:
Traceback (most recent call last):
File "./experiments/thumos14/train_net.py", line 97, in <module>
max_iters=args.max_iters)
File "/Deeplearning/R-C3D/experiments/thumos14/../../lib/tdcnn/train.py", line 159, in train_net
model_paths = sw.train_model(max_iters)
File "/Deeplearning/R-C3D/experiments/thumos14/../../lib/tdcnn/train.py", line 100, in train_model
self.solver.step(1)
File "/Deeplearning/R-C3D/experiments/thumos14/../../lib/roi_data_layer/layer.py", line 124, in forward
blobs = self._get_next_minibatch()
File "/Deeplearning/R-C3D/experiments/thumos14/../../lib/roi_data_layer/layer.py", line 48, in _get_next_minibatch
return get_minibatch(minibatch_db, self._num_classes)
File "/Deeplearning/R-C3D/experiments/thumos14/../../lib/roi_data_layer/minibatch.py", line 31, in get_minibatch
video_blob = _get_video_blob(roidb, random_scale_inds)
File "/Deeplearning/R-C3D/experiments/thumos14/../../lib/roi_data_layer/minibatch.py", line 73, in _get_video_blob
cfg.TRAIN.CROP_SIZE, random_idx)
File "/Deeplearning/R-C3D/experiments/thumos14/../../lib/utils/blob.py", line 33, in prep_im_for_blob
im = im.astype(np.float32, copy=False)
AttributeError: 'NoneType' object has no attribute 'astype'
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
(1) 第一步:查找错误,分析原因。AttributeError: ‘NoneType’ object has no attribute ‘astype’
关于产生这个问题的原因参考OpenCV: Resolving NoneType errors
归为两类:
Case#1:cv2.imread
导致NoneTypeerror的原因是因为在使用OpenCV读取图片时,路径错误:cv2.imread并不会报出路径不存在的问题,它只会将其处理成NoneType error。
还有一种原因:在确保路径正确的情况下,你需要重新编译OpenCV使它支持JPEG、JPG等图片格式的输入。
Case#2:cv2.VideoCapture
OpenCV使用cv2.VideoCapture来读入视频流,在读入过程中,同样会导致NoneType error的问题出现,原因
①The path to your input video file (it’s probably incorrect).
②Not having the proper video codecs installed, in which case you’ll need to install the codecs, followed by re-compiling and re-installing OpenCV (see this page for a complete list of tutorials).
③Your webcam not being accessible via OpenCV. This could be for any number of reasons, including missing drivers, an incorrect index passed to cv2.VideoCapture , or simply your webcam is not properly attached to your system.
(2) 第二步:将错误定位,重点关注im相关的内容。
①将出错的地方由下往上逐个定位
File "/Deeplearning/R-C3D/experiments/thumos14/../../lib/utils/blob.py", line 33, in prep_im_for_blob
im = im.astype(np.float32, copy=False)
我们首先打开逐个文件,找到该条信息:im = im.astype(np.float32, copy=False),将im的信息打印出来:添加语句 print im,发现该条信息输出为none
这条语句是定义在函数def prep_im_for_blob(im, pixel_means, target_size, crop_size, random_idx):下面的,而逐个函数又在minibatch.py中被调用,于是就有了下面这个提示信息:
②
File "/Deeplearning/R-C3D/experiments/thumos14/../../lib/roi_data_layer/minibatch.py", line 73, in _get_video_blob
cfg.TRAIN.CROP_SIZE, random_idx)
在这个文件中_get_video_blob(roidb,scale_inds)函数下,调用了prep_im_for_blob函数,语句如下:
frame = cv2.imread('%s/imag_%s.jpg'%(prefix,str(idx+1).zfill(5)))
frame = prep_im_for_blob(frame, cfg.PIXEL_MEANS, tuple(cfg.TRAIN.FRAME_SIZE[::-1]),
cfg.TRAIN.CROP_SIZE, random_idx)
到这一步我们已经看到了有cv2.imread,我们在前面分析的出错的原因,可能就是因为opencv读取图片导致的问题,所以,在这里我们将信息打印
print '%s/img_%s.jpg'%(prefix,str(idx+1).zfill(6))
发现输出的路径并不是我存储图片的位置,找到出错的源头了,就是图片路径找不到,使得opencv在读取图片的时候提示:NoneType error信息。这个prefix信息又是什么内容呢?
prefix = item['fg_name'] if video_info[0] else item['bg_name']
可以看到这个函数_get_video_blob(roidb, scale_inds)是通过读取roidb得到video的信息。这个roidb的生成中是不是有路径需要修改的地方我们没有设置正确呢?
心得:在这个过程,我们可以看到好多定义的文件之间是相互寄存的关系,出错的地方要从底到上将问题定位,找到出错的根源,这样才能将问题解决。我一开始看到这个问题的时候就觉得怎么这么多.py文件都出错,而且每个文件里面代码都很长,到底是哪里的问题,其实它在提示错误的时候已经将出错的地方定位到了具体的语句,只要耐心分析,问题是不难解决的。