

teratailにても投稿済です  
<https://teratail.com/questions/225527>

# 概要

物体検出プログラム作成時、独自データセットの中を見ようとして  
（first_datum = train_dataset[0]）  
エラー。参考サイトのプログラムでは動作したため、データセットの中身がおかしい？とかんがえられます。まったくわからないため教えていただきたいです。よろしくお願いします。

# エラーの出たプログラム

[code]

    import chainer
    import cupy
    import chainercv
    import matplotlib
    import os
    import xml.etree.ElementTree as ET
    
    import numpy as np
    
    from chainercv.datasets import VOCBboxDataset
    
    
    bccd_labels = ('ROCK', 'MOUNTAIN')#変更箇所
    
    
    class BCCDDataset(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(bccd_labels.index(name))
                print(bccd_labels.index(obj.find('name').text.lower().strip()))
            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
    train_dataset = BCCDDataset('rock_detect_dataset/BCCD', 'train')
    valid_dataset = BCCDDataset('rock_detect_dataset/BCCD', 'val')
    test_dataset = BCCDDataset('rock_detect_dataset/BCCD', 'test')
    print('Number of images in "train" dataset:', len(train_dataset))
    print('Number of images in "valid" dataset:', len(valid_dataset))
    print('Number of images in "test" dataset:', len(test_dataset))
    first_datum = train_dataset[0]
    
[/code]

# 参考サイト・コード

<https://japan-medical-ai.github.io/medical-ai-course-
materials/notebooks/06_Blood_Cell_Detection.html>

[code]

    !pip install chainercv  # ChainerCVのインストール
    
    import chainer
    import cupy
    import chainercv
    import matplotlib
    !if [ ! -d BCCD_Dataset ]; then git clone https://github.com/Shenggan/BCCD_Dataset.git; fi
    
    import os
    import xml.etree.ElementTree as ET
    
    import numpy as np
    
    from chainercv.datasets import VOCBboxDataset
    
    
    bccd_labels = ('rbc', 'wbc', 'platelets')
    
    
    class BCCDDataset(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(bccd_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
    
    train_dataset = BCCDDataset('BCCD_Dataset/BCCD', 'train')
    valid_dataset = BCCDDataset('BCCD_Dataset/BCCD', 'val')
    test_dataset = BCCDDataset('BCCD_Dataset/BCCD', 'test')
    
    first_datum = train_dataset[0]
    
    
[/code]

# xml例

[code]

    <annotation>
        <folder>JPGImages</folder>
        <filename>hogehoge.jpg</filename>
        <path>hogehoge</path>
        <source>
            <database>Unknown</database>
        </source>
        <size>
            <width>720</width>
            <height>1080</height>
            <depth>3</depth>
        </size>
        <segmented>0</segmented>
        <object>
            <name>MOUNTAIN</name>
            <pose>Unspecified</pose>
            <truncated>0</truncated>
            <difficult>0</difficult>
            <bndbox>
                <xmin>242.6123427801162</xmin>
                <ymin>279.4234910191407</ymin>
                <xmax>720</xmax>
                <ymax>706.8194993286604</ymax>
            </bndbox>
        </object>
    </annotation>
    
[/code]

# エラーコード

[code]

    ValueErrorTraceback (most recent call last)
    <ipython-input-59-8cd07929f6af> in <module>
    ----> 1 first_datum = train_dataset[0]
          2 print(first_datum[0].shape, first_datum[0].dtype)
    
    /usr/local/lib/python3.6/dist-packages/chainer/dataset/dataset_mixin.py in __getitem__(self, index)
         65             return [self.get_example(i) for i in index]
         66         else:
    ---> 67             return self.get_example(index)
         68 
         69     def __len__(self):
    
    /usr/local/lib/python3.6/dist-packages/chainercv/chainer_experimental/datasets/sliceable/sliceable_dataset.py in get_example(self, index)
         96         if isinstance(self.keys, tuple):
         97             return self.get_example_by_keys(
    ---> 98                 index, tuple(range(len(self.keys))))
         99         else:
        100             return self.get_example_by_keys(index, (0,))[0]
    
    /usr/local/lib/python3.6/dist-packages/chainercv/chainer_experimental/datasets/sliceable/getter_dataset.py in get_example_by_keys(self, index, key_indices)
         87             _, getter_index, key_index = self._keys[key_index]
         88             if getter_index not in cache:
    ---> 89                 cache[getter_index] = self._getters[getter_index](index)
         90             if key_index is None:
         91                 example.append(cache[getter_index])
    
    <ipython-input-55-501a46a571b5> in _get_annotations(self, i)
         33                 for tag in ('ymin', 'xmin', 'ymax', 'xmax')])
         34             name = obj.find('name').text.lower().strip()
    ---> 35             label.append(bccd_labels.index(name))
         36             print(bccd_labels.index(obj.find('name').text.lower().strip()))
         37         bbox = np.stack(bbox).astype(np.float32)
    
    ValueError: tuple.index(x): x not in tuple
    
[/code]


CC BY-SA 4.0
2019-11-26T02:35:07.107
60845
2019-11-26T04:28:01.813
2020-06-17T08:14:45.997
-1
35094
question
chainer
物体検出の独自データセット作成時のエラー<ValueError: tuple.index(x): x not in tuple>


エラーコードの最初の行に"ValueErrorTraceback (most recent call
last)[直訳：ValueErrorの追跡(最近の呼び出しは最後に)]とあるので、最後の行を見ます。

そうすると、"ValueError: tuple.index(x): x not in tuple"と書かれていて、その上のコード部分に  
"---> 35 label.append(bccd_labels.index(name))"とエラー発生個所が示されています。

この行のコード"label.append(bccd_labels.index(name))" を、エラー"tuple.index(x): x not in
tuple"に対応付ければ、  
『変数bccd_labelsというtapleに、変数nameの内容が含まれていなかった』のがエラーの原因だと判ります。

エラーが起きたところから、各変数の値がどのように変化してきたかを遡っていくと、問題の原因に辿り着けるのではないでしょか。

がんばってみてください。


CC BY-SA 4.0
2019-11-26T04:28:01.813
60847
2019-11-26T04:28:01.813
217
60845
answer