###概要
物体検出アルゴリズム(SSD:Single Shot MultBox Detecter)を学習させてみる
の記事を参考に、プログラムの中身についてはほぼ理解が出来ておりませんが、自前で用意した画像を用いて物体検出をしたいと考えております。
使用しているプログラムは
ssd_keras
を自分のPCにクローンして使用しております。
また、教師データは
The PASCAL Visual Object Classes Homepage
でダウンロードしたVOC2012のデータセットを使用して学習が出来ることを確認致しました。
(※学習に3ヶ月かかるようで学習を最後まで終えていないので、VOC2012で最後まで学習出来るかは試しておりません。)
そこで、自前で用意した10枚の画像で学習が最後まで出来るか試そうと、自前で用意した画像からxmlファイルと、それらを1つにまとめたpklファイルを作成しました。
そして、このpklファイル(ssd_keras/)や画像ファイル(ssd_keras/WEB_design/JPEGImage/)をこのSSDの訓練用ネットワークtrain.pyに渡してパラメータの学習を試みました。
すると、train.pyを実行することで学習は始まるのですが、下記のような途中の部分で停止してしまいました。(使用しているライブラリのバージョンの関係で本質問の内容におそらく関係ないと思われるWarning文が出力されてしまっておりますが、念の為、省略せずに提示しておきます。)
In [1]: runfile('/Users/user/研究/ssd_keras/train.py', wdir='/Users/user/研究/ssd_keras') Using TensorFlow backend. WARNING:tensorflow:From /Users/user/研究/ssd_keras/ssd_utils.py:37: The name tf.Session is deprecated. Please use tf.compat.v1.Session instead. WARNING:tensorflow:From /Users/user/研究/ssd_keras/ssd_utils.py:37: The name tf.ConfigProto is deprecated. Please use tf.compat.v1.ConfigProto instead. ~~~割愛~~~ Epoch 1/100 /Users/user/研究/ssd_keras/train.py:190: DeprecationWarning: `imread` is deprecated! `imread` is deprecated in SciPy 1.0.0, and will be removed in 1.2.0. Use ``imageio.imread`` instead. img = imread(img_path).astype('float32') /Users/user/研究/ssd_keras/train.py:194: DeprecationWarning: `imresize` is deprecated! `imresize` is deprecated in SciPy 1.0.0, and will be removed in 1.3.0. Use Pillow instead: ``numpy.array(Image.fromarray(arr).resize())``. img = imresize(img, self.image_size).astype('float32') 7/8 [=========================>....] - ETA: 9s - loss: 5.2499 /Users/user/opt/anaconda3/envs/py37/lib/python3.7/site-packages/keras/utils/data_utils.py:718: UserWarning: An input could not be retrieved. It could be because a worker has died.We do not have any information on the lost sample. UserWarning)
また、そのまま1日ほど放置し再度コンソールを見てみると先のエラー文のすぐ下から新しく次のような出力がされておりました。
Traceback (most recent call last): File "/Users/user/研究/ssd_keras/train.py", line 258, in <module> nb_worker=1) ~~~割愛~~~ File "/Users/user/opt/anaconda3/envs/py37/lib/python3.7/site-packages/keras/engine/training_generator.py", line 365, in evaluate_generator generator_output = next(output_generator) StopIteration Error in callback <bound method AutoreloadMagics.post_execute_hook of <autoreload.AutoreloadMagics object at 0x7f8d5dd26e50>> (for post_execute): Traceback (most recent call last): File "/Users/user/opt/anaconda3/envs/py37/lib/python3.7/site-packages/IPython/extensions/autoreload.py", line 538, in post_execute_hook _, pymtime = self._reloader.filename_and_mtime(sys.modules[modname]) ~~~割愛~~~ File "<frozen importlib._bootstrap_external>", line 916, in get_data OSError: [Errno 23] Too many open files in system: '/Users/user/opt/anaconda3/envs/py37/lib/python3.7/site-packages/tensorflow_core/contrib/framework/python/ops/__init__.py'
以上を踏まえて、以下の2点をご教授頂きたいです。
・学習が停止してしまう原因と解決方法について
・学習を途中で停止せずに進めるには追加で出力された文のエラー
StopIteration
Error in callback <bound method AutoreloadMagics.post_execute_hook of <autoreload.AutoreloadMagics object at 0x7f8d5dd26e50>> (for post_execute):
Traceback (most recent call last):)
と
OSError: [Errno 23] Too many open files in system: '/Users/user/opt/anaconda3/envs/py37/lib/python3.7/site-packages/tensorflow_core/contrib/framework/python/ops/init.py'
を解決しなければいけないのでしょうか?
###やったこと
初めの出力文の最後の方の「UserWarning: An input could not be retrieved. It could be because a worker has died.We do not have any information on the lost sample.」で検索をかけてみました。
trainGenerator gets stuckという記事を見つけたので、自分のPC上で次の一文
train_generator = zip(image_generator, mask_generator)
がヒットした3つのファイル
・image_data_generator.py(/Users/user/opt/anaconda3/pkgs/keras-preprocessing-1.1.2-pyhd3eb1b0_0/site-packages/keras_preprocessing/image/image_data_generator.py)
・image.py(/Users/user/opt/anaconda3/envs/py37/lib/python3.7/site-packages/tensorflow_core/python/keras/preprocessing/image.py)
・image.py(/Users/user/opt/anaconda3/pkgs/tensorflow-base-2.0.0-mkl_py37h66b1bf0_0/lib/python3.7/site-packages/tensorflow_core/python/keras/preprocessing/image.py)
のそれぞれに1箇所ずつ含んでおりました。
これら3つのファイル全てにおいて上の一文を下記のように置換しました。
train_generator = itertools.izip(image_generator, mask_generator)
その後、train.pyを再度実行してみましたが、学習はやはり進みませんでした。(コンソールに出力されたエラー文もおそらく同じ。)
また、他にヒットした記事を複数読むと、この現象に陥った方の多くがGoogle Colabにおける現象のようで、その原因としてはGoogle Driveをマウントし、ドライブからデータを読み込みCNNを回していたことで、Colabolatoryのファイルストリームが学習速度に追いついていないということが原因のようでした。(→参考)
つまりその解決方法としては使用する教師データセットを全てローカルに保存するというものなのですが、私の場合、使用している教師データセット(VOC2012や自前データセット)は全て私のPC内に保存しているものなので、私の状況においてはこの方法が有効な解決法とはなりませんでした。
###環境など
PC:MacOS BigSur11.6
プロセッサ:3.1 GHz デュアルコアIntel Core i5
IDE:Anaconda spyder=5.0.5
AnacondaのPython環境:Python3.7.11
上記の環境下において道中のエラーの解決を含め手動でインストールした主要なライブラリのバージョンは現在以下の通りです。
- keras=2.3.1
- opencv=3.4.2
- scipy=1.2.0
- tensorflow=1.15.0
- tensorflow-estimator=1.15.1
また、ssd_kerasのフルパスは
/Users/user/研究/ssd_keras
となっております。
回答1件
あなたの回答
tips
プレビュー