您的位置:首页 > 移动开发 > Objective-C

AttributeError: 'NoneType' object has no attribute 'astyp

2018-03-28 16:41 1471 查看
  这几天在调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) 第一步:查找错误,分析原因。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文件都出错,而且每个文件里面代码都很长,到底是哪里的问题,其实它在提示错误的时候已经将出错的地方定位到了具体的语句,只要耐心分析,问题是不难解决的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: