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

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

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

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

Python

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

Q&A

解決済

2回答

1766閲覧

SSD(物体検出)のコードでのエラー

0afnjosa

総合スコア7

OpenCV

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

Python

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

0グッド

0クリップ

投稿2021/11/11 04:07

編集2021/11/11 06:42

#現状
SSDを用いた物体検出を現在行っています。(初心者です)
コードは「物体検出とGAN、オートエンコーダー、画像処理入門」という本のダウンロードサービスから拝借しています。
#エラーが出たコード

Python

1%%time 2''' 38. VOC2012データセットをSSDモデルで学習 4''' 5num_epochs= 50 # 学習回数(エポック数)は50 6 7train(net, # SSDモデル 8 dataloaders_dict, # データローダー 9 criterion, # 損失関数 10 optimizer, # オプティマイザー 11 num_epochs=num_epochs) # エポック数 12

ここでtrainは以下のコードで定義しています。

Python

1''' 27. SSDモデルの学習(パラメーターの更新)を行う関数 3''' 4import time 5import pandas as pd 6 7def train(net, dataloaders_dict, criterion, optimizer, num_epochs): 8 ''' 9 Parameters: 10 net(object): SSDモデル 11 dataloaders_dict(objectのdict): データーローダー 12 criterion(object): 損失関数 13 optimizer(object): オプティマイザー 14 num_epochs(object): 学習回数 15 ''' 16 # SSDモデルでGPUを使用 17 net.to(device) 18 19 # ネットワークの構成に対して最適なアルゴリズムを見つけて高速化させる 20 torch.backends.cudnn.benchmark = True 21 22 iteration = 1 # イテレーション(ステップ)カウンター 23 epoch_train_loss = 0.0 # 訓練1エポックごとの損失和 24 epoch_val_loss = 0.0 # 検証1エポックごとの損失和 25 logs = [] # 損失のログを記録するリスト 26 27 # 学習、または検証のエポックごとのループ 28 for epoch in range(num_epochs): 29 # 開始時刻を保存 30 t_epoch_start = time.time() 31 t_iter_start = time.time() 32 33 # 現在のエポック数を出力 34 print('---------------------------------------') 35 print('Epoch {}/{}'.format(epoch+1, num_epochs)) 36 print('---------------------------------------') 37 38 # エポック10回につき検証を1回行う 39 for phase in ['train', 'val']: 40 # エポックが10回に達するまではモデルを訓練モードにする 41 if phase == 'train': 42 net.train() # モデルを訓練モードにする 43 else: 44 # エポックが10回に達していたらモデルを検証モードにして検証開始 45 if((epoch+1) % 10 == 0): 46 net.eval() # モデルを検証モードにする 47 print('---------------------------------------') 48 print('(validation)') 49 else: 50 # 10回に達していなければ次のエポックに進む 51 continue 52 53 # 1ステップにおけるミニバッチを使用した学習または検証 54 # データローダーをイテレートしてミニバッチを抽出 55 for images, targets in dataloaders_dict[phase]: 56 # 画像データにデバイスを割り当てる 57 images = images.to(device) 58 # 教師データ(正解BBoxのアノテーション情報) 59 # (バッチサイズ, 物体数, 5[xmin, ymin, xmax, ymax, label_index]) 60 # にデバイスを割り当てる 61 targets = [ann.to(device) for ann in targets] 62 63 # optimizerが保持する勾配を0で初期化(累積しないように) 64 optimizer.zero_grad() 65 66 # 順伝搬(forward)とバックプロパゲーション(訓練時のみ) 67 with torch.set_grad_enabled(phase == 'train'): 68 # 順伝搬(forward)を行って(loc, conf, dbox_list)を取得 69 # ・locの出力(バッチサイズ, 8732, 4[Δcx, Δcy, Δw, Δh]) 70 # ・confの出力(バッチサイズ, 8732, 21) 71 # ・DBoxの情報(8732, 4[cx, cy, width, height]) 72 outputs = net(images) 73 74 # Positive DBoxのオフセット情報の損失平均 75 # ミニバッチにおけるPositive DBoxの確信度の損失平均 76 loss_l, loss_c = criterion(outputs, targets) 77 # 2つの損失を合計する 78 loss = loss_l + loss_c 79 80 # 訓練時はバックプロパゲーションによるパラメーター更新を行う 81 if phase == 'train': 82 loss.backward() # バックプロパゲーション 83 84 # 勾配が大きすぎると不安定になるので 85 # clipで勾配の上限を2.0に制限する 86 nn.utils.clip_grad_value_(net.parameters(), 87 clip_value=2.0) 88 # 勾配降下法の更新式を適用してバイアス、重みを更新 89 optimizer.step() 90 91 # ミニバッチを10個処理(10ステップ)ごとに損失を出力 92 if (iteration % 10 == 0): 93 # 10ステップの所要時間を取得 94 t_iter_finish = time.time() 95 duration = t_iter_finish - t_iter_start 96 # ステップ数、損失、所要時間を出力 97 print('ステップ( {} ) loss: {:.4f} -- time: {:.4f} sec.'.format( 98 iteration, loss.item(), duration)) 99 t_iter_start = time.time() 100 101 # エポックの損失をepoch_train_lossに加算する 102 epoch_train_loss += loss.item() 103 # ステップ数を1増やす 104 iteration += 1 105 106 # 検証モードでは順伝播後の損失の記録のみを行う 107 else: 108 epoch_val_loss += loss.item() 109 110 # epochのphaseごとのlossと正解率 111 # エポック終了時の時刻を取得 112 t_epoch_finish = time.time() 113 print('---------------------------------------') 114 # 訓練データの損失と検証データの損失を出力 115 print('train_loss: {:.4f} - val_loss(Every 10 epochs): {:.4f}'.format( 116 epoch_train_loss, epoch_val_loss)) 117 # エポック終了までに要した時間を取得 118 print('time: {:.4f} sec.'.format(t_epoch_finish - t_epoch_start)) 119 # 次のエポックの開始時刻を取得 120 t_epoch_start = time.time() 121 122 # エポックごとに損失をdictオブジェクトに保存 123 log_epoch = {'epoch': epoch+1, 124 'train_loss': epoch_train_loss, 125 'val_loss': epoch_val_loss} 126 # ログのリストに追加 127 logs.append(log_epoch) 128 # ログのリストをデータフレームに変換 129 df = pd.DataFrame(logs) 130 # ログファイルに保存 131 df.to_csv('/content/drive/MyDrive/Colab Notebooks/ObjectDetection/epoch_loss.csv') 132 133 # 訓練時の損失和を0で初期化 134 epoch_train_loss = 0.0 135 # 検証時の損失和を0で初期化 136 epoch_val_loss = 0.0 137 138 # 1エポック終了ごとにモデルのパラメーター値を保存 139 if ((epoch+1) % 10 == 0): 140 torch.save( 141 net.state_dict(), 142 '/content/drive/MyDrive/Colab Notebooks/ObjectDetection/weights/ssd_weights' + 143 str(epoch+1) + '.pth') 144 print('--saved weights--')

#出たエラー

Python

1/usr/local/lib/python3.7/dist-packages/IPython/core/interactiveshell.py in run_cell_magic(self, magic_name, line, cell) 2 2115 magic_arg_s = self.var_expand(line, stack_depth) 3 2116 with self.builtin_trap: 4-> 2117 result = fn(magic_arg_s, cell) 5 2118 return result 6 2119 7 8<decorator-gen-53> in time(self, line, cell, local_ns) 9 10/usr/local/lib/python3.7/dist-packages/IPython/core/magic.py in <lambda>(f, *a, **k) 11 186 # but it's overkill for just that one bit of state. 12 187 def magic_deco(arg): 13--> 188 call = lambda f, *a, **k: f(*a, **k) 14 189 15 190 if callable(arg): 16 17/usr/local/lib/python3.7/dist-packages/IPython/core/magics/execution.py in time(self, line, cell, local_ns) 18 1191 else: 19 1192 st = clock2() 20-> 1193 exec(code, glob, local_ns) 21 1194 end = clock2() 22 1195 out = None 23 24<timed exec> in <module>() 25 26<ipython-input-8-dd6592475800> in train(net, dataloaders_dict, criterion, optimizer, num_epochs) 27 53 # 1ステップにおけるミニバッチを使用した学習または検証 28 54 # データローダーをイテレートしてミニバッチを抽出 29---> 55 for images, targets in dataloaders_dict[phase]: 30 56 # 画像データにデバイスを割り当てる 31 57 images = images.to(device) 32 33/usr/local/lib/python3.7/dist-packages/torch/utils/data/dataloader.py in __next__(self) 34 519 if self._sampler_iter is None: 35 520 self._reset() 36--> 521 data = self._next_data() 37 522 self._num_yielded += 1 38 523 if self._dataset_kind == _DatasetKind.Iterable and \ 39 40/usr/local/lib/python3.7/dist-packages/torch/utils/data/dataloader.py in _next_data(self) 41 559 def _next_data(self): 42 560 index = self._next_index() # may raise StopIteration 43--> 561 data = self._dataset_fetcher.fetch(index) # may raise StopIteration 44 562 if self._pin_memory: 45 563 data = _utils.pin_memory.pin_memory(data) 46 47/usr/local/lib/python3.7/dist-packages/torch/utils/data/_utils/fetch.py in fetch(self, possibly_batched_index) 48 42 def fetch(self, possibly_batched_index): 49 43 if self.auto_collation: 50---> 44 data = [self.dataset[idx] for idx in possibly_batched_index] 51 45 else: 52 46 data = self.dataset[possibly_batched_index] 53 54/usr/local/lib/python3.7/dist-packages/torch/utils/data/_utils/fetch.py in <listcomp>(.0) 55 42 def fetch(self, possibly_batched_index): 56 43 if self.auto_collation: 57---> 44 data = [self.dataset[idx] for idx in possibly_batched_index] 58 45 else: 59 46 data = self.dataset[possibly_batched_index] 60 61/content/drive/MyDrive/Colab Notebooks/ObjectDetection/voc.py in __getitem__(self, index) 62 256 # pull_item()にイメージのインデックスを渡して前処理 63 257 # 処理後のイメージデータとBBoxとラベルの2次元配列を返す 64--> 258 im, bl, _, _ = self.pull_item(index) 65 259 return im, bl 66 260 67 68/content/drive/MyDrive/Colab Notebooks/ObjectDetection/voc.py in pull_item(self, index) 69 275 img_path = self.img_list[index] # インデックスを指定してイメージのパスを取得 70 276 img = cv2.imread(img_path) # OpenCV2でイメージの[高さ,幅,[B,G,R]]を取得 71--> 277 height, width, _ = img.shape # 配列要素数を数えて高さ,幅のみを取得 72 278 73 279 # アノテーションデータのリストを取得 74 75AttributeError: 'NoneType' object has no attribute 'shape'

#知りたいこと
このエラーはどういう意味か。
どうすれば動くようになるか。
#その他
長くなってしまい申し訳ありません。
非常に見づらくなってしまいましたが、回答をいただけるとありがたいです。
よろしくお願い致します。

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

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

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

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

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

jbpb0

2021/11/11 06:00

pythonのコードの一番最初の行のすぐ上に ```python だけの行を追加してください また、pythonのコードの一番最後の行のすぐ下に ``` だけの行を追加してください または、 https://teratail.storage.googleapis.com/uploads/contributed_images/56957fe805d9d7befa7dba6a98676d2b.gif を見て、そのようにしてみてください 現状、コードがとても読み辛いです 質問にコードを載せる際に上記をやってくれたら、他人がコードを読みやすくなり、コードの実行による現象確認もやりやすくなるので、回答されやすくなります
0afnjosa

2021/11/11 06:43

頂いた内容の通り、修正を行いました。 アドバイスありがとうございました。
jbpb0

2021/11/11 09:18 編集

> 276 img = cv2.imread(img_path) # OpenCV2でイメージの[高さ,幅,[B,G,R]]を取得 --> 277 height, width, _ = img.shape # 配列要素数を数えて高さ,幅のみを取得 'NoneType' object has no attribute 'shape' 「cv2.imread」で画像を読み込んで、そのデータが入ってるはずの「img」が「NoneType」ということは、画像が読み込めてない、ということです データセットの準備は、ちゃんとやってますよね?
0afnjosa

2021/11/12 00:10

ご返信ありがとうございます。 同じディレクトリの中に入れているとは思うのですが、パスなどが違うのかもしれないのでもう1度確認してみます。
0afnjosa

2021/11/12 07:16

そこのルートパスも取得して、データローダーの作成のコードでエラーは出ていないのであっていると思います。
jbpb0

2021/11/12 07:23

「img = cv2.imread(img_path)」のすぐ上に print(img_path) を追加して実行して、読み込もうとしてるパスを表示させて、それがどこになってるのかを確認したら、何か手がかりが分かるかもしれません
0afnjosa

2021/11/12 14:56

vocモジュールにprint(img_path)を追加しましたが、出力は変わりませんでした。 どこかに追加してパスを表示させてみようと思います。
guest

回答2

0

自己解決

読み込んだデータが穴あきになっており、該当するデータの部分がダウンロードできておりませんでした。
助言をくださった方々、ありがとうございました。

投稿2021/12/03 05:17

0afnjosa

総合スコア7

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

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

0

このエラーはどういう意味か。

「cv2.imread」で画像を読み込んで、そのデータが入ってるはずの「img」が「NoneType」ということは、画像が読み込めてない、ということです

どうすれば動くようになるか。

データセットの設定が怪しいので、見直してみてください

投稿2021/11/15 06:49

jbpb0

総合スコア7651

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問