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

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

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

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

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

Q&A

解決済

1回答

1574閲覧

plt.imshowでは正しいものが見れるのに、保存すると真っ黒になる

退会済みユーザー

退会済みユーザー

総合スコア0

Keras

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

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

0グッド

0クリップ

投稿2022/10/26 08:59

編集2022/10/26 19:17

前提

作成したUnetのモデルを適応させた画像を保存したい。
私が作ったモデルには入力が4チャンネルになっています。(画像(RGB)+trimap(1chan)を入力)
この学習に使った画像をpredictに適応させたいのですが、もともとが3チャンネルであるのでうまく適応できません。

実現したいこと

学習結果をファイル一括でmodel.predictを使って適応させ、保存したい。

試したこと

image = test_DS[0][np.newaxis, :, :, :]
print(image.shape)>>>(1, 128, 128, 4)
image = model.predict(image)
print(image.shape)>>>(1, 128, 128, 1)
image = image.squeeze()#サイズ1の次元を削除
print(image.shape)>>>(128, 128)
plt.imshow(image, cmap = "gray")
で1枚ずつならGoogle Colabでは出力できるようになりましたが、visual studioでは真っ黒になります。
ここからどのようにして保存すれば良いのかが分かりません。
どうやら、plt.imshowでは正しいものが見れるのに、cv2.imshow()だと黒い画像になるようです。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

jbpb0

2022/10/26 09:11 編集

> 私が作ったモデルには入力が4チャンネルになっています。 そのモデルの学習に使った画像も4チャンネルですよね? 画像のshapeはモデルの入力に合ってないといけないので つまり、 > この学習に使った画像をpredictに適応させたい 「この学習に使った画像」は、4チャンネルですよね? 「学習に使った画像」だから > もともとが3チャンネルであるのでうまく適応できません。 の意味が分りません 「学習に使った画像」も、モデルも、どちらも4チャンネルで、「学習に使った画像」で「predict」を実行したいのですよね? 画像もモデルもどちらも4チャンネルなら、問題無いですよね? 「もともと」って、何のことでしょうか?
退会済みユーザー

退会済みユーザー

2022/10/26 09:14

学習に使ったデータセットの入力は元画像にトライマップを合わせたものになります。 元画像は(RGB)の3chan、トライマップ(グレースケール)の1chanです。 この2つを合わせて入力のshapeが(13500, 128, 128, 4)という形になっております。ので学習に使っている画像はもともと3chanになります。
jbpb0

2022/10/26 09:16

もしかして、 ・学習は RGB+trimap の4チャンネルで行った ・「predict」はRGBだけの3チャンネルで行いたい ということでしょうか?
退会済みユーザー

退会済みユーザー

2022/10/26 09:18

ご回答ありがとうございます。その通りになります。 入力したデータセットが4chanなのでpredictに使う画像もそこに合わせられるかなと考えています。
jbpb0

2022/10/26 09:32 編集

そのAIはtrimap有りの状態で正しい出力がされるように学習されたのだから、trimap無しで正しい出力がされるとは思えないのですが
退会済みユーザー

退会済みユーザー

2022/10/26 09:27 編集

ありがとうございます。 学習では、 #Dataset(テストと訓練に分割)、Combineが元画像 Trimap = Trimap[..., tf.newaxis] GT = GT[..., tf.newaxis] DS = tf.concat([Combine,Trimap],3) という形で行っているのでDSから上手く取り出せればpredictが使えるということでしょうか?
jbpb0

2022/10/26 09:35

> DS = tf.concat([Combine,Trimap],3) の「DS」が、 > (画像(RGB)+trimap(1chan)を入力) のことですか? すなわち、学習時のAIの入力データですか?
退会済みユーザー

退会済みユーザー

2022/10/26 09:37

はい。その通りです。
jbpb0

2022/10/26 09:39

> この学習に使った画像をpredictに適応させたい の「この学習に使った画像」は、 > DS = tf.concat([Combine,Trimap],3) の「DS」の中に入ってるのですか?
退会済みユーザー

退会済みユーザー

2022/10/26 09:44

その通りです。 一度、コード全文を載せさせていただきますのでレビューをお願いします。
jbpb0

2022/10/26 09:54 編集

それなら、「DS」で「predict」を行ったらいいと思うのですが そうすれば、「DS」内の全ての画像に対する、ネットワークの出力が得られます 「DS」を丸ごと使ったらメモリー不足で落ちるなら、落ちない程度に「DS」を分割して「predict」を行います 学習時のバッチサイズと同じ枚数以下なら、大丈夫なはず もちろん、「DS」から一枚だけ画像(trimap有りの4チャンネル)を取り出して、それだけで「predict」を行うこともできます ただしその場合も、shapeを合わせる必要があります 画像一枚でも、shapeを (1, 128, 128, 4) みたいに、先頭の次元も付けます
退会済みユーザー

退会済みユーザー

2022/10/26 09:55

model.predict(DS[1])を試してみると、 ValueError: Input 0 of layer "model_3" is incompatible with the layer: expected shape=(None, 128, 128, 4), found shape=(32, 128, 4) と表示されてしまうのですが、何が足りないのでしょうか?
jbpb0

2022/10/26 10:02 編集

一つ前のコメントにも書きましたが、「predict」に入れるデータのshapeは、ネットワークに合わせて (画像枚数, 128, 128, 4) である必要があります たとえ画像が一枚でも (1, 128, 128, 4) である必要がありますので、次元が足りなければ追加してください
退会済みユーザー

退会済みユーザー

2022/10/26 10:25 編集

ご回答ありがとうございます。 丁寧に教えていただき。理解できました。 最終的には、ファイル一括で適応させたいのですが、 from google.colab.patches import cv2_imshow for i in range(len(test_DS)): sss = model.predict(test_DS[i])←ここの先頭に1の次元を追加するという形は可能なのでしょうか? cv2_imshow(sss)
退会済みユーザー

退会済みユーザー

2022/10/26 11:30

ありがとうございます。 a=1 xxx = np.insert(a, test_DS[1]) で先頭に1を追加したかったのですが、これがエラーなのはなぜですか?
jbpb0

2022/10/26 11:40

それではダメです 要素を追加するのではなく、次元を追加しないといけません 私の一つ前のコメントに書いたWebページに、次元を追加する方法が書かれてますので、その通りにやってください
退会済みユーザー

退会済みユーザー

2022/10/26 13:16 編集

np.newaxisを使って、 image = test_DS[0][np.newaxis, :, :, :] print(image.shape)>>>(1, 128, 128, 4) image = model.predict(image) print(image.shape)>>>(1, 128, 128, 1) image = image.squeeze()#サイズ1の次元を削除 print(image.shape)>>>(128, 128) plt.imshow(image) にしたのですが、出力画像が黄色くなってしました。 pillowで開いているのですが、これは画像がRGBの順では出力されていないということですか?
退会済みユーザー

退会済みユーザー

2022/10/26 13:30

ありがとうございます。後はファイル一括に挑戦してみます。
退会済みユーザー

退会済みユーザー

2022/10/26 13:40

何度も申し訳ございません。 image = model.predict(image) print(image.shape)>>>(1, 128, 128, 1) 例えば、この状態で先頭の1だけを削除するような方法はありますか?
jbpb0

2022/10/26 14:40 編集

> print(image.shape)>>>(1, 128, 128, 1) 例えば、この状態で先頭の1だけを削除するような方法はありますか? image2 = image.squeeze(0) 参考 https://note.nkmk.me/python-numpy-squeeze/
退会済みユーザー

退会済みユーザー

2022/10/26 16:21 編集

count = 1 for i in range(0,len(DS)): count2 = str(count) image1 = DS[i][np.newaxis, :, :, :]#(1, 128, 128, 4) image1 = model.predict(image1)#(1, 128, 128, 1) image1 = image1.squeeze()#(128, 128) im = Image.fromarray(image1) #im.save(str(to_dir) + '/' + 'pred_alpha_'+ str(count2) + '.png', cmap="gray") im.convert("L").save(str(to_dir) + '/' + 'pred_alpha_'+ str(count2) + '.png') #plt.imshow(image1,cmap = "gray") print(i) count += 1 を作ったのですが、 colabではグレーの画像だったのに、visual studioでは真っ黒な画像になってしまいました。
guest

回答1

0

ベストアンサー

plt.imsave()で無事に解決できました。

投稿2022/10/26 20:09

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

jbpb0

2022/10/26 22:58

> plt.imshowでは正しいものが見れるのに、cv2.imshow()だと黒い画像になる predictの結果(ネットワークの出力)は浮動小数点数だと思いますが、その場合はcv2は0.0を黒で1.0を白としますが、pltは最小値を黒で最大値を白とします cv2で黒く見えるのなら、predictの結果が、1.0に対してすごく小さいのではありませんか?
jbpb0

2022/10/26 23:35

pltが自動的に最小値〜最大値を黒〜白に表示してくれるのは便利な場合もありますが、別の画像を比較する際に画素値の絶対値比較にはならない(違う画素値が同じ明るさに見える)ので、気を付けてください 画素値の絶対値比較をする場合等、黒と白になる値を固定したければvminとvmaxを指定します 参考 https://pystyle.info/matplotlib-display-opencv-image/#outline__3 の「OpenCV のグレースケール画像を表示する場合」
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問