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) 第一步:查找错误,分析原因。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文件都出错,而且每个文件里面代码都很长,到底是哪里的问题,其实它在提示错误的时候已经将出错的地方定位到了具体的语句,只要耐心分析,问题是不难解决的。

  • 15
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值