質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.12%

自作のデータセットを用いて、pix2pixによる機械学習をGoogleColaboratoryで実現

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 53

Mattcha

score 1

前提・実現したいこと

GoogleColaboratoryでpix2pixを導入し、自作のデータセットを用いて機械学習を実現させようと取り組んでいます。あらかじめ作られているデータセットをダウンロードして学習させることはできたのですが、自作のデータセットで行うと以下のようなエラーが発生しました。このエラーの原因と対策について考えていきたいです。

自作のデータセットは、アプリケーションを用いてある動画を1フレーム毎区切りってモノクロにし、編集ソフトを用いて元の画像(jpg,256×256)とモノクロの画像(jpg,256×256)をつなぎ合わせて1枚の画像(jpg,512×256)にしたものです。

発生している問題・エラーメッセージ

100% 1/1 [00:00<00:00,  2.02it/s]
Traceback (most recent call last):
  File "/usr/local/lib/python3.6/dist-packages/numpy/lib/shape_base.py", line 748, in array_split
    Nsections = len(indices_or_sections) + 1
TypeError: object of type 'float' has no len()

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "make_dataset.py", line 134, in <module>
    size=args.img_size)
  File "make_dataset.py", line 76, in build_HDF5
    arr_chunks = np.array_split(np.arange(num_files), num_chunks)
  File "/usr/local/lib/python3.6/dist-packages/numpy/lib/shape_base.py", line 754, in array_split
    raise ValueError('number sections must be larger than 0.')
ValueError: number sections must be larger than 0.

該当のソースコード

!python make_dataset.py ../../datasets/facades/ 3 --img_size 256


※ソースコードを追加しました。(make_dataset.py)

import os
import cv2
import h5py
import parmap
import argparse
import numpy as np
from pathlib import Path
from tqdm import tqdm as tqdm
import matplotlib.pylab as plt


def format_image(img_path, size, nb_channels):
    """
    Load img with opencv and reshape
    """

    if nb_channels == 1:
        img = cv2.imread(img_path, 0)
        img = np.expand_dims(img, axis=-1)
    else:
        img = cv2.imread(img_path)
        img = img[:, :, ::-1]  # GBR to RGB

    w = img.shape[1]

    # Slice image in 2 to get both parts
    img_full = img[:, :w // 2, :]
    img_sketch = img[:, w // 2:, :]

    img_full = cv2.resize(img_full, (size, size), interpolation=cv2.INTER_AREA)
    img_sketch = cv2.resize(img_sketch, (size, size), interpolation=cv2.INTER_AREA)

    if nb_channels == 1:
        img_full = np.expand_dims(img_full, -1)
        img_sketch = np.expand_dims(img_sketch, -1)

    img_full = np.expand_dims(img_full, 0).transpose(0, 3, 1, 2)
    img_sketch = np.expand_dims(img_sketch, 0).transpose(0, 3, 1, 2)

    return img_full, img_sketch


def build_HDF5(jpeg_dir, nb_channels, data_dir, size=256):
    """
    Gather the data in a single HDF5 file.
    """

    data_dir = os.path.join(data_dir, 'processed')

    # Put train data in HDF5
    file_name = os.path.basename(jpeg_dir.rstrip("/"))
    hdf5_file = os.path.join(data_dir, "%s_data.h5" % file_name)
    with h5py.File(hdf5_file, "w") as hfw:

        for dset_type in ["train", "test", "val"]:

            list_img = [img for img in Path(jpeg_dir).glob('%s/*.jpg' % dset_type)]
            list_img = [str(img) for img in list_img]
            list_img.extend(list(Path(jpeg_dir).glob('%s/*.png' % dset_type)))
            list_img = list(map(str, list_img))
            list_img = np.array(list_img)

            data_full = hfw.create_dataset("%s_data_full" % dset_type,
                                           (0, nb_channels, size, size),
                                           maxshape=(None, 3, size, size),
                                           dtype=np.uint8)

            data_sketch = hfw.create_dataset("%s_data_sketch" % dset_type,
                                             (0, nb_channels, size, size),
                                             maxshape=(None, 3, size, size),
                                             dtype=np.uint8)

            num_files = len(list_img)
            chunk_size = 100
            num_chunks = num_files / chunk_size
            arr_chunks = np.array_split(np.arange(num_files), num_chunks)

            for chunk_idx in tqdm(arr_chunks):

                list_img_path = list_img[chunk_idx].tolist()
                output = parmap.map(format_image, list_img_path, size, nb_channels, pm_parallel=False)

                arr_img_full = np.concatenate([o[0] for o in output], axis=0)
                arr_img_sketch = np.concatenate([o[1] for o in output], axis=0)

                # Resize HDF5 dataset
                data_full.resize(data_full.shape[0] + arr_img_full.shape[0], axis=0)
                data_sketch.resize(data_sketch.shape[0] + arr_img_sketch.shape[0], axis=0)

                data_full[-arr_img_full.shape[0]:] = arr_img_full.astype(np.uint8)
                data_sketch[-arr_img_sketch.shape[0]:] = arr_img_sketch.astype(np.uint8)

def check_HDF5(jpeg_dir, nb_channels):
    """
    Plot images with landmarks to check the processing
    """

    # Get hdf5 file
    file_name = os.path.basename(jpeg_dir.rstrip("/"))
    hdf5_file = os.path.join(data_dir, "%s_data.h5" % file_name)

    with h5py.File(hdf5_file, "r") as hf:
        data_full = hf["train_data_full"]
        data_sketch = hf["train_data_sketch"]
        for i in range(data_full.shape[0]):
            plt.figure()
            img = data_full[i, :, :, :].transpose(1,2,0)
            img2 = data_sketch[i, :, :, :].transpose(1,2,0)
            img = np.concatenate((img, img2), axis=1)
            if nb_channels == 1:
                plt.imshow(img[:, :, 0], cmap="gray")
            else:
                plt.imshow(img)
            plt.show()
            plt.clf()
            plt.close()


if __name__ == '__main__':

    parser = argparse.ArgumentParser(description='Build dataset')
    parser.add_argument('jpeg_dir', type=str, help='path to jpeg images')
    parser.add_argument('nb_channels', type=int, help='number of image channels')
    parser.add_argument('--img_size', default=256, type=int,
                        help='Desired Width == Height')
    parser.add_argument('--do_plot', action="store_true",
                        help='Plot the images to make sure the data processing went OK')
    parser.add_argument('--data_dir', default='../../data', type=str, help='Data directory')
    args = parser.parse_args()  

    build_HDF5(args.jpeg_dir,
               args.nb_channels,
               args.data_dir,
               size=args.img_size)

    if args.do_plot:
        check_HDF5(args.jpeg_dir, args.nb_channels)

試したこと

データセットの作り方に問題があると考え調べてみたところ、データセットの画像には何かしら意味付けがされているのではないか、単に編集アプリで作るだけではいけないのではないかと考えました。が、理解が浅く、どうすればよいのか分からない状態です。

補足情報(FW/ツールのバージョンなど)

自分はPythonと機械学習、共に初心者です。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

2019-10-10 (追補)

            num_files = len(list_img)
            chunk_size = 100
            num_chunks = num_files / chunk_size
            arr_chunks = np.array_split(np.arange(num_files), num_chunks)


ここで、エラーについて

  1. arr_chunks = np.array_split(np.arange(num_files), num_chunks)np.array_split(np.arange(10), 0)のようなことが起きた
  2. 続いてNsections = len(indices_or_sections) + 1len(0.5)のようなことが起きた
    と思われます。

もう少しさかのぼると、num_chunks = num_files / chunk_sizeとありますが、chunk_sizeは100なので、num_filesが空っぽかもしれません。

対策:num_files = len(list_img)でnum_filesにちゃんと思った値が入っているか確認ください。入っていなければlist_imgのリストが空っぽか何かです。

2019-10-09 (初回)

コードがないと皆様指摘も難しいかと思います。
投稿されている断片で分かる範囲で回答します。

100% 1/1 [00:00<00:00,  2.02it/s]
Traceback (most recent call last):
  File "/usr/local/lib/python3.6/dist-packages/numpy/lib/shape_base.py", line 748, in array_split
    Nsections = len(indices_or_sections) + 1
TypeError: object of type 'float' has no len()


これは小数点付きの数字に対してlen()をしてエラーが出ています。
例えば、len(0.5)のようなことがNsections = len(indices_or_sections) + 1で起きているわけです。

During handling of the above exception, another exception occurred:


上記のエラーが起きる前に、何か他の例外も起きていた旨の通知です。

  File "make_dataset.py", line 76, in build_HDF5
    arr_chunks = np.array_split(np.arange(num_files), num_chunks)
  File "/usr/local/lib/python3.6/dist-packages/numpy/lib/shape_base.py", line 754, in array_split
    raise ValueError('number sections must be larger than 0.')


ここでは、np.array_split(np.arange(10), 0)のようなことが起きていてエラーが発生している、ということを示しています。
つまり、num_chunksが0でこけているのでは?とPythonは訴えかけています。

全体のコードがあるともっと詳しい回答が付くかもしれません。
もうひと踏ん張り該当部分のコードを提示ください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/09 22:07

    丁寧な回答ありがとうございます。
    該当部分のコードを提示しました。よろしくお願いします。
    回答については、時間をかけて理解に努めます。ありがとうございます。

    キャンセル

  • 2019/10/10 15:01 編集

    ※追記 2019/10/10 16:03
    datasets/facades/の中にあるtest,train,valの画像をすべて同じ100枚にしたらエラーがなく学習まで実行できました。(よくはないと思いますが...)
    原因はなんだったのでしょうか...
    ------------------------------------------------------------------------------------------------------------

    追記の方ありがとうございます。

    値を調べてみたところ、
    list_img = []
    num_files=0
    でした。

    上にさかのぼってみたところ、
    ```python
    def format_image(img_path, size, nb_channels):
    ```
    に対して、
    ```GoogleColaboratory
    !python make_dataset.py ../../datasets/facades/ 3  --img_size 256
    ```
    で実行していたので、引数の順番が違うのではないかと考え、
    ```GoogleColaboratory
    !python make_dataset.py ../../datasets/facades/ --img_size 256  3
    ``` 
    で実行してみました。すると、実行結果は
    (list_imgとnum_filesの値は表示させるように追記しました。)
    ```
    list_img=
    ['../../datasets/facades/train/066.jpg'
    '../../datasets/facades/train/040.jpg'
    '../../datasets/facades/train/099.jpg'
    '../../datasets/facades/train/070.jpg'
    '../../datasets/facades/train/069.jpg'
    '../../datasets/facades/train/021.jpg'
    '../../datasets/facades/train/027.jpg'
    '../../datasets/facades/train/071.jpg'
    '../../datasets/facades/train/092.jpg'
    '../../datasets/facades/train/044.jpg'
    '../../datasets/facades/train/063.jpg'
    '../../datasets/facades/train/081.jpg'
    '../../datasets/facades/train/090.jpg'
    '../../datasets/facades/train/037.jpg'
    '../../datasets/facades/train/048.jpg'
    '../../datasets/facades/train/024.jpg'
    '../../datasets/facades/train/056.jpg'
    '../../datasets/facades/train/086.jpg'
    '../../datasets/facades/train/019.jpg'
    '../../datasets/facades/train/062.jpg'
    '../../datasets/facades/train/031.jpg'
    '../../datasets/facades/train/012.jpg'
    '../../datasets/facades/train/016.jpg'
    '../../datasets/facades/train/080.jpg'
    '../../datasets/facades/train/003.jpg'
    '../../datasets/facades/train/011.jpg'
    '../../datasets/facades/train/028.jpg'
    '../../datasets/facades/train/075.jpg'
    '../../datasets/facades/train/017.jpg'
    '../../datasets/facades/train/055.jpg'
    '../../datasets/facades/train/076.jpg'
    '../../datasets/facades/train/043.jpg'
    '../../datasets/facades/train/091.jpg'
    '../../datasets/facades/train/088.jpg'
    '../../datasets/facades/train/093.jpg'
    '../../datasets/facades/train/097.jpg'
    '../../datasets/facades/train/054.jpg'
    '../../datasets/facades/train/006.jpg'
    '../../datasets/facades/train/089.jpg'
    '../../datasets/facades/train/049.jpg'
    '../../datasets/facades/train/052.jpg'
    '../../datasets/facades/train/074.jpg'
    '../../datasets/facades/train/045.jpg'
    '../../datasets/facades/train/033.jpg'
    '../../datasets/facades/train/095.jpg'
    '../../datasets/facades/train/065.jpg'
    '../../datasets/facades/train/057.jpg'
    '../../datasets/facades/train/060.jpg'
    '../../datasets/facades/train/046.jpg'
    '../../datasets/facades/train/001.jpg'
    '../../datasets/facades/train/009.jpg'
    '../../datasets/facades/train/008.jpg'
    '../../datasets/facades/train/005.jpg'
    '../../datasets/facades/train/014.jpg'
    '../../datasets/facades/train/068.jpg'
    '../../datasets/facades/train/061.jpg'
    '../../datasets/facades/train/020.jpg'
    '../../datasets/facades/train/051.jpg'
    '../../datasets/facades/train/087.jpg'
    '../../datasets/facades/train/084.jpg'
    '../../datasets/facades/train/004.jpg'
    '../../datasets/facades/train/100.jpg'
    '../../datasets/facades/train/059.jpg'
    '../../datasets/facades/train/096.jpg'
    '../../datasets/facades/train/041.jpg'
    '../../datasets/facades/train/039.jpg'
    '../../datasets/facades/train/058.jpg'
    '../../datasets/facades/train/079.jpg'
    '../../datasets/facades/train/018.jpg'
    '../../datasets/facades/train/030.jpg'
    '../../datasets/facades/train/015.jpg'
    '../../datasets/facades/train/022.jpg'
    '../../datasets/facades/train/098.jpg'
    '../../datasets/facades/train/013.jpg'
    '../../datasets/facades/train/077.jpg'
    '../../datasets/facades/train/072.jpg'
    '../../datasets/facades/train/029.jpg'
    '../../datasets/facades/train/025.jpg'
    '../../datasets/facades/train/032.jpg'
    '../../datasets/facades/train/010.jpg'
    '../../datasets/facades/train/002.jpg'
    '../../datasets/facades/train/078.jpg'
    '../../datasets/facades/train/034.jpg'
    '../../datasets/facades/train/064.jpg'
    '../../datasets/facades/train/007.jpg'
    '../../datasets/facades/train/026.jpg'
    '../../datasets/facades/train/050.jpg'
    '../../datasets/facades/train/036.jpg'
    '../../datasets/facades/train/035.jpg'
    '../../datasets/facades/train/053.jpg'
    '../../datasets/facades/train/067.jpg'
    '../../datasets/facades/train/085.jpg'
    '../../datasets/facades/train/083.jpg'
    '../../datasets/facades/train/094.jpg'
    '../../datasets/facades/train/038.jpg'
    '../../datasets/facades/train/047.jpg'
    '../../datasets/facades/train/023.jpg'
    '../../datasets/facades/train/073.jpg'
    '../../datasets/facades/train/042.jpg'
    '../../datasets/facades/train/082.jpg']
    num_files=
    100
    100% 1/1 [00:00<00:00, 2.15it/s]
    list_img=
    ['../../datasets/facades/test/040.jpg'
    '../../datasets/facades/test/021.jpg'
    '../../datasets/facades/test/027.jpg'
    '../../datasets/facades/test/044.jpg'
    '../../datasets/facades/test/063.jpg'
    '../../datasets/facades/test/037.jpg'
    '../../datasets/facades/test/048.jpg'
    '../../datasets/facades/test/024.jpg'
    '../../datasets/facades/test/056.jpg'
    '../../datasets/facades/test/019.jpg'
    '../../datasets/facades/test/062.jpg'
    '../../datasets/facades/test/031.jpg'
    '../../datasets/facades/test/012.jpg'
    '../../datasets/facades/test/016.jpg'
    '../../datasets/facades/test/011.jpg'
    '../../datasets/facades/test/028.jpg'
    '../../datasets/facades/test/017.jpg'
    '../../datasets/facades/test/055.jpg'
    '../../datasets/facades/test/043.jpg'
    '../../datasets/facades/test/054.jpg'
    '../../datasets/facades/test/049.jpg'
    '../../datasets/facades/test/052.jpg'
    '../../datasets/facades/test/045.jpg'
    '../../datasets/facades/test/033.jpg'
    '../../datasets/facades/test/057.jpg'
    '../../datasets/facades/test/060.jpg'
    '../../datasets/facades/test/046.jpg'
    '../../datasets/facades/test/014.jpg'
    '../../datasets/facades/test/061.jpg'
    '../../datasets/facades/test/020.jpg'
    '../../datasets/facades/test/051.jpg'
    '../../datasets/facades/test/059.jpg'
    '../../datasets/facades/test/041.jpg'
    '../../datasets/facades/test/039.jpg'
    '../../datasets/facades/test/058.jpg'
    '../../datasets/facades/test/018.jpg'
    '../../datasets/facades/test/030.jpg'
    '../../datasets/facades/test/015.jpg'
    '../../datasets/facades/test/022.jpg'
    '../../datasets/facades/test/013.jpg'
    '../../datasets/facades/test/029.jpg'
    '../../datasets/facades/test/025.jpg'
    '../../datasets/facades/test/032.jpg'
    '../../datasets/facades/test/010.jpg'
    '../../datasets/facades/test/034.jpg'
    '../../datasets/facades/test/026.jpg'
    '../../datasets/facades/test/050.jpg'
    '../../datasets/facades/test/036.jpg'
    '../../datasets/facades/test/035.jpg'
    '../../datasets/facades/test/053.jpg'
    '../../datasets/facades/test/038.jpg'
    '../../datasets/facades/test/047.jpg'
    '../../datasets/facades/test/023.jpg'
    '../../datasets/facades/test/042.jpg']
    num_files=
    54
    Traceback (most recent call last):
    File "/usr/local/lib/python3.6/dist-packages/numpy/lib/shape_base.py", line 748, in array_split
    Nsections = len(indices_or_sections) + 1
    TypeError: object of type 'float' has no len()

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
    File "make_dataset.py", line 143, in <module>
    size=args.img_size)
    File "make_dataset.py", line 85, in build_HDF5
    arr_chunks = np.array_split(np.arange(num_files), num_chunks)
    File "/usr/local/lib/python3.6/dist-packages/numpy/lib/shape_base.py", line 754, in array_split
    raise ValueError('number sections must be larger than 0.')
    ValueError: number sections must be larger than 0.
    ```
    となっていました。datasets/facades/val にある画像がセットされていないので、これは datasets/facades/val に対してエラーが発生しているということでよろしいですか?

    キャンセル

  • 2019/10/10 20:47

    もうほぼ正解かもしれませんね。
    https://docs.scipy.org/doc/numpy/reference/generated/numpy.array_split.html
    引数の中身をnum_chunks に従って分割する関数です。
    リストが100だとうまくいくのは、100で割っているからですね。100の倍数ではないリストが来ると小数点以下が発生します。そうなると、上のURLのnum_chunks にあたる部分は整数じゃないとダメだよ、を満たせなくなります。

    なので、リストの中身を常に100の倍数にすればOKだと思います。
    端数は切り捨てるのようなしょりもいるかもしれませんね。

    キャンセル

  • 2019/10/10 23:26

    よく分かりました!ありがとうございました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる