前提
アニメ動画に対してセマンティックセグメンテーションを用いた
キャラクター画像の顔パーツ検出を行いたいと考えています。
その過程で詰まってしまったので、どなたかアドバイスをいただきたく存じます…
尚、機械学習完全素人なので、温かい目で閲覧してやってください。
できたこと
現状達成できたこととしては
- labelmeを用いた自前ラベルの作成。(.json)
- 教師画像から学習を行い、学習モデルの生成。(.pb, .h5)
- 学習モデルを用いて、任意画像に対する顔パーツ検出。
- opencvを用いて、任意のアニメ動画から画像を取得。(30fpsの動画の場合、30秒であれば900枚の画像を取得)
の4点になります。
やりたいこと
初期の考えとしては、3. が達成できたので、アニメ動画像リスト(900枚の画像)を作成し、その1枚1枚の要素に対して顔パーツの検出を行うループ処理を考えていました。以上の処理が終わり、顔パーツが検出された900枚の画像を再構成し、検出されたラベルのみが表示される動画の出力を目的としていました。
モデルの読み込みと利用のプログラム
python
1#モデルを読み込み 2model = load_model('AnimeImageLearn.h5', compile=False) 3 4#画像のリサイズ 5x_image_size = 320 #インプット画像のサイズ 6y_image_size = 224 #インプット画像のサイズ 7 8#画像表示の関数 9def visualize(**images): 10 n = len(images) 11 plt.figure(figsize=(32, 16)) 12 for i, (name, image) in enumerate(images.items()): 13 plt.subplot(1, n, i + 1) 14 plt.xticks([]) 15 plt.yticks([]) 16 plt.title(' '.join(name.split('_')).title()) 17 plt.imshow(image) 18 plt.show() 19 20#任意の画像が格納されているディレクトリへのパス 21%cd C:\Users\XXXX\Desktop\TestImage 22 23#判別したい画像群用配列 24TestImgArray = [] 25 26#TestImageディレクトリ内の画像をTestImgArrayに格納していく 27dir = 'C:/Users/XXXX/Desktop/TestImage' 28dir_NumSum = glob.glob(dir+"/*.png") 29for i, file in enumerate(dir_NumSum): 30 image = Image.open(file) #画像の読み込み 31 image = image.convert("RGB") #RGBに変換 32 image = image.resize((x_image_size, y_image_size)) #サイズ変更 33 data = np.asarray(image) #画像データを配列へ変更 34 TestImgArray.append(data) #画像データを繰返し追加 35TestImgArray = np.array(TestImgArray) 36 37#リスト単位で検出したい 38for i in TestImgArray: 39 image = TestImgArray[i] 40 image = np.expand_dims(image, axis=0) 41 pr_mask = model.predict(image) 42 43 visualize( 44 image=image.squeeze(), 45 A_Prediction=pr_mask[..., 1].squeeze(), 46 B_Prediction=pr_mask[..., 2].squeeze(), 47 )
発生している問題・エラーメッセージ
900枚もの画像を含んだリストをループで処理しようとした結果、メモリエラーが発生してしまい、動画を作成するための材料の準備ができない状況になってしまいました。
python
1MemoryError Traceback (most recent call last) 2~\AppData\Local\Temp\ipykernel_32008\349585566.py in <module> 3 1 #リスト単位で判別したい 4 2 for i in TestImgArray: 5----> 3 image = TestImgArray[i] 6 4 image = np.expand_dims(image, axis=0) 7 5 pr_mask = model.predict(image) 8 9MemoryError: Unable to allocate 43.1 GiB for an array with shape (224, 320, 3, 224, 320, 3) and data type uint8
試したこと
画像サイズの変更などは試したのですが、最終的に動画として見れるものにしたいので断念しました。動画に対するセグメンテーション?や、TFRecordなどの解決の手がかりは見つかったのですが、如何せん素人なのでその先の処理が分かりません。現状持っているデータ(学習済みモデル.pb, .h5)を用いて、動画に対してセグメンテーションする方法や、900枚の画像をメモリエラーを発生させずに処理できる方法などをご存じの方がいらっしゃれば、是非ともお力をお貸しください…
補足情報(FW/ツールのバージョンなど)
実行環境
・CPU:windows11
・GPU:RTX3060
・メモリ:16GB
構築環境
・CUDA 11.0
・cuDNN 8.0
・tensorflow-gpu == 2.4.0
・python 3.7
備考
・利用モデルはSegmentation models
・Jupyter notebook上での動作を想定
参考サイト
・トマトの画像をマルチクラス分類してみた【Segmentation models】
https://farml1.com/multiclass_classification/
・DeepLab v3+でオリジナルデータを学習してセマンティックセグメンテーションする
https://qiita.com/otakoma/items/2f40e583980013acb2f7
・【技術解説】DeepLabのセマンティックセグメンテーションとTouchDesignerを用いた映像制作
https://note.com/thedesignium/n/nf4245f419441
回答1件
あなたの回答
tips
プレビュー