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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

4860閲覧

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

Mattcha

総合スコア8

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/10/09 11:56

編集2019/10/09 13:06

前提・実現したいこと

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.

該当のソースコード

GoogleColaboratory

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

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

Python

1import os 2import cv2 3import h5py 4import parmap 5import argparse 6import numpy as np 7from pathlib import Path 8from tqdm import tqdm as tqdm 9import matplotlib.pylab as plt 10 11 12def format_image(img_path, size, nb_channels): 13 """ 14 Load img with opencv and reshape 15 """ 16 17 if nb_channels == 1: 18 img = cv2.imread(img_path, 0) 19 img = np.expand_dims(img, axis=-1) 20 else: 21 img = cv2.imread(img_path) 22 img = img[:, :, ::-1] # GBR to RGB 23 24 w = img.shape[1] 25 26 # Slice image in 2 to get both parts 27 img_full = img[:, :w // 2, :] 28 img_sketch = img[:, w // 2:, :] 29 30 img_full = cv2.resize(img_full, (size, size), interpolation=cv2.INTER_AREA) 31 img_sketch = cv2.resize(img_sketch, (size, size), interpolation=cv2.INTER_AREA) 32 33 if nb_channels == 1: 34 img_full = np.expand_dims(img_full, -1) 35 img_sketch = np.expand_dims(img_sketch, -1) 36 37 img_full = np.expand_dims(img_full, 0).transpose(0, 3, 1, 2) 38 img_sketch = np.expand_dims(img_sketch, 0).transpose(0, 3, 1, 2) 39 40 return img_full, img_sketch 41 42 43def build_HDF5(jpeg_dir, nb_channels, data_dir, size=256): 44 """ 45 Gather the data in a single HDF5 file. 46 """ 47 48 data_dir = os.path.join(data_dir, 'processed') 49 50 # Put train data in HDF5 51 file_name = os.path.basename(jpeg_dir.rstrip("/")) 52 hdf5_file = os.path.join(data_dir, "%s_data.h5" % file_name) 53 with h5py.File(hdf5_file, "w") as hfw: 54 55 for dset_type in ["train", "test", "val"]: 56 57 list_img = [img for img in Path(jpeg_dir).glob('%s/*.jpg' % dset_type)] 58 list_img = [str(img) for img in list_img] 59 list_img.extend(list(Path(jpeg_dir).glob('%s/*.png' % dset_type))) 60 list_img = list(map(str, list_img)) 61 list_img = np.array(list_img) 62 63 data_full = hfw.create_dataset("%s_data_full" % dset_type, 64 (0, nb_channels, size, size), 65 maxshape=(None, 3, size, size), 66 dtype=np.uint8) 67 68 data_sketch = hfw.create_dataset("%s_data_sketch" % dset_type, 69 (0, nb_channels, size, size), 70 maxshape=(None, 3, size, size), 71 dtype=np.uint8) 72 73 num_files = len(list_img) 74 chunk_size = 100 75 num_chunks = num_files / chunk_size 76 arr_chunks = np.array_split(np.arange(num_files), num_chunks) 77 78 for chunk_idx in tqdm(arr_chunks): 79 80 list_img_path = list_img[chunk_idx].tolist() 81 output = parmap.map(format_image, list_img_path, size, nb_channels, pm_parallel=False) 82 83 arr_img_full = np.concatenate([o[0] for o in output], axis=0) 84 arr_img_sketch = np.concatenate([o[1] for o in output], axis=0) 85 86 # Resize HDF5 dataset 87 data_full.resize(data_full.shape[0] + arr_img_full.shape[0], axis=0) 88 data_sketch.resize(data_sketch.shape[0] + arr_img_sketch.shape[0], axis=0) 89 90 data_full[-arr_img_full.shape[0]:] = arr_img_full.astype(np.uint8) 91 data_sketch[-arr_img_sketch.shape[0]:] = arr_img_sketch.astype(np.uint8) 92 93def check_HDF5(jpeg_dir, nb_channels): 94 """ 95 Plot images with landmarks to check the processing 96 """ 97 98 # Get hdf5 file 99 file_name = os.path.basename(jpeg_dir.rstrip("/")) 100 hdf5_file = os.path.join(data_dir, "%s_data.h5" % file_name) 101 102 with h5py.File(hdf5_file, "r") as hf: 103 data_full = hf["train_data_full"] 104 data_sketch = hf["train_data_sketch"] 105 for i in range(data_full.shape[0]): 106 plt.figure() 107 img = data_full[i, :, :, :].transpose(1,2,0) 108 img2 = data_sketch[i, :, :, :].transpose(1,2,0) 109 img = np.concatenate((img, img2), axis=1) 110 if nb_channels == 1: 111 plt.imshow(img[:, :, 0], cmap="gray") 112 else: 113 plt.imshow(img) 114 plt.show() 115 plt.clf() 116 plt.close() 117 118 119if __name__ == '__main__': 120 121 parser = argparse.ArgumentParser(description='Build dataset') 122 parser.add_argument('jpeg_dir', type=str, help='path to jpeg images') 123 parser.add_argument('nb_channels', type=int, help='number of image channels') 124 parser.add_argument('--img_size', default=256, type=int, 125 help='Desired Width == Height') 126 parser.add_argument('--do_plot', action="store_true", 127 help='Plot the images to make sure the data processing went OK') 128 parser.add_argument('--data_dir', default='../../data', type=str, help='Data directory') 129 args = parser.parse_args() 130 131 build_HDF5(args.jpeg_dir, 132 args.nb_channels, 133 args.data_dir, 134 size=args.img_size) 135 136 if args.do_plot: 137 check_HDF5(args.jpeg_dir, args.nb_channels) 138 139

試したこと

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

2019-10-10 (追補)

Python3

1 num_files = len(list_img) 2 chunk_size = 100 3 num_chunks = num_files / chunk_size 4 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 (初回)

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

Python3

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

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

Python3

1During handling of the above exception, another exception occurred:

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

Python3

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

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

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

投稿2019/10/09 12:58

編集2019/10/09 22:19
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Mattcha

2019/10/09 13:07

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

2019/10/10 07:05 編集

※追記 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 11:47

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

2019/10/10 14:26

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問