簡體   English   中英

ChainerCV 輸入圖像數據格式

[英]ChainerCV input image data format

我有一個包含 250 個形狀(3、320、240)圖像和 250 個注釋文件的圖像集。 我使用 ChainerCV 來檢測和識別圖像中的兩個類:球和球員。 這里我們使用在 ImageNet 數據集上預訓練的 SSD300 模型。

編輯:創建數據集對象的類

bball_labels = ('ball','player')
class BBall_dataset(VOCBboxDataset):
  def _get_annotations(self, i):
    id_ = self.ids[i]
    anno = ET.parse(os.path.join(self.data_dir, 'Annotations', id_ + 
'.xml'))
    bbox = []
    label = []
    difficult = []
    for obj in anno.findall('object'):
      bndbox_anno = obj.find('bndbox')
      bbox.append([int(bndbox_anno.find(tag).text) - 1 for tag in ('ymin', 
'xmin', 'ymax', 'xmax')])
      name = obj.find('name').text.lower().strip()
      label.append(bball_labels.index(name))
    bbox = np.stack(bbox).astype(np.float32)
    label = np.stack(label).astype(np.int32)
    difficult = np.array(difficult, dtype=np.bool)
    return bbox, label, difficult

下載預訓練模型

import chainer
from chainercv.links import SSD300
from chainercv.links.model.ssd import multibox_loss

class MultiboxTrainChain(chainer.Chain):
    def __init__(self, model, alpha=1, k=3):
        super(MultiboxTrainChain, self).__init__()
        with self.init_scope():
            self.model = model
        self.alpha = alpha
        self.k = k
    def forward(self, imgs, gt_mb_locs, gt_mb_labels):
        mb_locs, mb_confs = self.model(imgs)
        loc_loss, conf_loss = multibox_loss(
            mb_locs, mb_confs, gt_mb_locs, gt_mb_labels, self.k)
        loss = loc_loss * self.alpha + conf_loss

        chainer.reporter.report(
            {'loss': loss, 'loss/loc': loc_loss, 'loss/conf': conf_loss},
            self)
        return loss

model = SSD300(n_fg_class=len(bball_labels), pretrained_model='imagenet')
train_chain = MultiboxTrainChain(model)

TRANSFORM DATASET 導入必要的庫

class Transform(object):
  def __init__(self, coder, size, mean):
    self.coder = copy.copy(coder)
    self.coder.to_cpu()

    self.size = size
    self.mean = mean
  def __call__(self, in_data):
    img, bbox, label = in_data
    img = random_distort(img)
    if np.random.randint(2):
      img, param = transforms.random_expand(img, fill=self.mean, 
 return_param=True)
      bbox = transforms.translate_bbox(bbox, y_offset=param['y_offset'], 
x_offset=param['x_offset'])
      img, param = random_crop_with_bbox_constraints(img, bbox, 
return_param=True)
      bbox, param = transforms.crop_bbox(bbox, y_slice=param['y_slice'], 
x_slice=param['x_slice'],allow_outside_center=False, return_param=True)
      label = label[param['index']]

    _, H, W = img.shape
    img = resize_with_random_interpolation(img, (self.size, self.size))
    bbox = transforms.resize_bbox(bbox, (H, W), (self.size, self.size))

    img, params = transforms.random_flip(img, x_random=True, 
return_param=True)
    bbox = transforms.flip_bbox(bbox, (self.size, self.size), 
x_flip=params['x_flip'])

    img -= self.mean
    mb_loc, mb_label = self.coder.encode(bbox, label)

    return img, mb_loc, mb_label
    transformed_train_dataset = TransformDataset(train_dataset, 
    Transform(model.coder, model.insize, model.mean))

    train_iter = 
    chainer.iterators.MultiprocessIterator(transformed_train_dataset, 
batchsize)
    valid_iter = chainer.iterators.SerialIterator(valid_dataset, 
batchsize, 
    repeat=False, shuffle=False) 

在訓練期間,它會引發以下錯誤:

Exception in thread Thread-4:
Traceback (most recent call last):
  File "/usr/lib/python3.6/threading.py", line 916, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.6/threading.py", line 864, in run
    self._target(*self._args, **self._kwargs)
  File "/usr/local/lib/python3.6/dist- 
packages/chainer/iterators/multiprocess_iterator.py", line 401, in 
fetch_batch
    batch_ret[0] = [self.dataset[idx] for idx in indices]
  File "/usr/local/lib/python3.6/dist-
........................................................................
packages/chainer/iterators/multiprocess_iterator.py", line 401, in 
<listcomp>
    batch_ret[0] = [self.dataset[idx] for idx in indices]
  File "/usr/local/lib/python3.6/dist- 
packages/chainer/dataset/dataset_mixin.py", line 67, in __getitem__
    return self.get_example(index)
  File "/usr/local/lib/python3.6/dist- 
packages/chainer/datasets/transform_dataset.py", line 51, in get_example
    in_data = self._dataset[i]
  File "/usr/local/lib/python3.6/dist- 
packages/chainer/dataset/dataset_mixin.py", line 67, in __getitem__
    return self.get_example(index)
  File "/usr/local/lib/python3.6/dist-- 
packages/chainercv/utils/image/read_image.py", line 120, in read_image
    return _read_image_cv2(path, dtype, color, alpha)
  File "/usr/local/lib/python3.6/dist- 
packages/chainercv/utils/image/read_image.py", line 49, in _read_image_cv2
    if img.ndim == 2:
AttributeError: 'NoneType' object has no attribute 'ndim'
    TypeError: 'NoneType' object is not iterable

我想知道是什么原因造成的。 在這種情況下,輸入數據格式是否不正確? 以及如何解決這種情況。

這個問題是由於一個小的被忽視的情況,當圖像列表被剪切、復制和粘貼到同一文件中時,文本文件有間隙。 文本文件是在記事本中創建的。 在記事本中索引是不可見的,但是一旦您查看 github 中的文本文件,其中初始索引仍然存在並且索引仍然存在,即使列表的大小被縮小,間隙也是可見的。 例如,首先創建了一個包含 182 個圖像的列表,但后來減少到 170 個。因此,當我們使用 Dataset Creation 對象時,代碼讀取文本文件的所有行,即它將讀取 182 個而不是 170 個。這影響了模型的訓練使用錯誤讀取的數據集。 為訓練、驗證和測試創建了一組新的文本文件,現在訓練正確進行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM