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

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

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

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

OpenCV

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

427閲覧

Pythonのkeras, tensorflowによるグレースケール画像からカラー画像の生成

dundee_dance

総合スコア2

Keras

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

OpenCV

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2024/01/16 16:13

編集2024/01/20 12:44

実現したいこと

今は次のような流れでプログラムしています。
最終的に、与えたグレースケール画像から学習データで与えたようなカラー画像を生成してほしいです。

①カラー画像を与えて、その画像を塗り絵をする前のような画像(被写体の色と色の境界線が残るような感じ、以降グレースケール画像と呼ぶ)を生成する。
②グレースケール画像を入力、カラー画像を出力としてデータ設定
③畳み込みニューラルネットワークの設定
④モデルのコンパイル及び学習
⑤グレースケール画像のテストデータを入力として、カラー画像を生成する

発生している問題・分からないこと

わからないことは2点あります。(初めて自分で機械学習プログラムを作っているのでわからないことばかりですが)

①まず、Sequential()モデルの定義において、畳み込み層はあるがプーリング層の実装をしていない。
普通だと畳み込み層→プーリング層を繰り返して全結合層という流れだと思うのですが、プーリング層をするとサイズが縮小されるため、入力サイズが256x256から変化してしまう(Upsampling2D等を用いて2倍にすればいいのでしょうか??)。
プーリング層を実装する際、MaxPool2D→UpSampling2Dを用いて元のサイズを変化させないという流れでも大丈夫なのでしょうか?

②最終結果(カラー画像の生成結果)が一色しか塗られない(メイン)
最終的にはグレースケール画像を与えて学習データで与えたようなカラー画像を生成してほしいのですが、被写体に近い色一色で薄く塗りつぶしているような感じの画像が出てきます(元のグレースケール画像の境界線は見える)。
これを複数の色を使ってカラー画像を再現するようにしてほしいです。

epochs = 20, batch_size = 30となっています。(画像のサンプル数が少ないことも少し考えました)
①、②の問題についてわかる方、回答よろしくお願いします。

該当のソースコード

Python

1#PS C:\Users\owner\.vscode\code\Python\ml\programs> 内で実行する 2 3import os 4os.environ['TF_ENABLE_ONEDNN_OPTS'] = '0' 5 6import numpy as np 7import tensorflow as tf 8import cv2 9import glob 10import matplotlib.pyplot as plt 11from icrawler.builtin import BingImageCrawler 12from sklearn.model_selection import train_test_split 13from keras.models import Sequential 14from keras.layers import Conv2D, UpSampling2D, InputLayer, MaxPool2D, Dropout, BatchNormalization, Activation 15from tensorflow.python.keras.optimizers import adam_v2 16 17# カラー画像と白黒画像のペアを用意する関数 18def prepare_data(img_paths, img_size=(96, 96)): 19 color_imgs = [] 20 gray_imgs = [] 21 22 for img_path in img_paths: 23 # カラー画像 24 color_img = cv2.imread(img_path) 25 color_img = cv2.cvtColor(color_img, cv2.COLOR_BGR2RGB) 26 color_img = cv2.resize(color_img, img_size) 27 28 # 白黒画像 29 30 gray_img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE) 31 gray_img = cv2.resize(gray_img, img_size) 32 gray_img = np.expand_dims(gray_img, axis=-1) # チャンネル次元を追加 33 34 35 ''' 36 img = cv2.imread(img_path) 37 img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 38 39 neiborhood = np.ones((5, 5), dtype=np.uint8) 40 dilated = cv2.dilate(img, neiborhood, iterations=5) 41 42 diff = cv2.absdiff(dilated, img) 43 44 #5. 白黒反転 45 gray_img = 255 - diff 46 47 gray_img = cv2.resize(gray_img, img_size) 48 gray_img = np.expand_dims(gray_img, axis=-1) # チャンネル次元を追加 49 ''' 50 51 color_imgs.append(color_img) 52 gray_imgs.append(gray_img) 53 54 gray_imgs = np.array(gray_imgs) / 255.0 55 color_imgs = np.array(color_imgs) / 255.0 56 57 #return np.array(color_imgs), np.array(gray_imgs) 58 return color_imgs, gray_imgs 59 60# データセットのパス 61dataset_paths = glob.glob('Python/ml/image3/slime2/*.png') 62 63# カラー画像と白黒画像のペアを用意 64color_images, gray_images = prepare_data(dataset_paths) 65 66# データを訓練データとテストデータに分割 67X_train, X_test, y_train, y_test = train_test_split(gray_images, color_images, test_size=0.2, random_state=42) 68 69# モデルの定義 70model = Sequential() 71 72#モデルの初期化 73model.add(InputLayer(shape=(96, 96, 1))) 74 75model.add(Conv2D(3, (3, 3), padding='same', strides=1)) 76model.add(BatchNormalization(momentum=0.9, epsilon=1e-5)) 77model.add(Activation('relu')) 78model.add(Dropout(0.5)) 79 80model.add(Conv2D(64, (3, 3), padding='same', strides=1)) 81model.add(BatchNormalization(momentum=0.9, epsilon=1e-5)) 82model.add(Activation('relu')) 83model.add(Dropout(0.5)) 84 85model.add(Conv2D(128, (3, 3), padding='same', strides=1)) 86model.add(BatchNormalization(momentum=0.9, epsilon=1e-5)) 87model.add(Activation('relu')) 88model.add(Dropout(0.5)) 89 90model.add(Conv2D(256, (3, 3), padding='same', strides=1)) 91model.add(BatchNormalization(momentum=0.9, epsilon=1e-5)) 92model.add(Activation('relu')) 93model.add(Dropout(0.5)) 94 95model.add(Conv2D(128, (3, 3), padding='same', strides=1)) 96model.add(BatchNormalization(momentum=0.9, epsilon=1e-5)) 97model.add(Activation('relu')) 98model.add(Dropout(0.5)) 99 100model.add(Conv2D(64, (3, 3), padding='same', strides=1)) 101model.add(BatchNormalization(momentum=0.9, epsilon=1e-5)) 102model.add(Activation('relu')) 103model.add(Dropout(0.5)) 104 105model.add(Conv2D(3, (3, 3), padding='same', strides=1)) # Sigmoid から Linear に変更 106model.add(BatchNormalization(momentum=0.9, epsilon=1e-5)) 107model.add(Activation('sigmoid')) 108 109# モデルのコンパイル 110#初期値:0.0002 111optimizer = tf.keras.optimizers.Adam(learning_rate=0.002) 112model.compile(optimizer=optimizer, loss='mae', metrics=['accuracy']) 113 114 115print(model.summary()) 116 117# モデルの学習 118history = model.fit(X_train, y_train, epochs=20, batch_size=150, validation_data=(X_test, y_test)) 119 120# 学習過程の損失と精度の情報を取得 121train_loss = history.history['loss'] 122val_loss = history.history['val_loss'] 123train_accuracy = history.history['accuracy'] 124val_accuracy = history.history['val_accuracy'] 125 126# Epochごとのグラフを描画 127epochs = range(1, len(train_loss) + 1) 128 129# 損失のグラフ 130plt.figure(figsize=(12, 4)) 131plt.subplot(1, 2, 1) 132plt.plot(epochs, train_loss, 'bo-', label='Training Loss') 133plt.plot(epochs, val_loss, 'ro-', label='Validation Loss') 134plt.title('Training and Validation Loss') 135plt.xlabel('Epochs') 136plt.ylabel('Loss') 137plt.legend() 138 139# 精度のグラフ 140plt.subplot(1, 2, 2) 141plt.plot(epochs, train_accuracy, 'bo-', label='Training Accuracy') 142plt.plot(epochs, val_accuracy, 'ro-', label='Validation Accuracy') 143plt.title('Training and Validation Accuracy') 144plt.xlabel('Epochs') 145plt.ylabel('Accuracy') 146plt.legend() 147 148plt.show() 149 150# ある白黒データに対する予測 151input_gray_image = X_test[0].reshape(1, 96, 96, 1) 152predicted_color_image = model.predict(input_gray_image) 153 154# 結果の表示 155plt.subplot(1, 3, 1) 156plt.title('Input Grayscale Image') 157plt.imshow(X_test[0].reshape(96, 96), cmap='gray') # グレースケール画像なので256x256に修正 158 159plt.subplot(1, 3, 2) 160plt.title('Input RGB Image') 161plt.imshow(y_test[0]) 162 163plt.subplot(1, 3, 3) 164plt.title('Predicted Color Image') 165plt.imshow((predicted_color_image[0] * 255).astype(np.uint8)) 166 167plt.show() 168

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

画像のサンプル数を増やすとうまくいくのかと思いましたが結果は変わりませんでした。(50程度です)
モデルの損失関数をmse, mae, categorical_crossentropyなど試しましたが変化なしです。

補足

それぞれのバージョン

Python : 3.9.13

tensorflow 2.15.0
tensorflow-estimator 2.15.0
tensorflow-intel 2.15.0
tensorflow-io-gcs-filesystem 0.31.0

keras 2.15.0

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

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

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

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

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

meg_

2024/01/16 16:31

> (初めて自分で機械学習プログラムを作っているのでわからないことばかりですが) 初めての機械学習で「グレースケール画像からカラー画像の生成」は難易度高いと思いますが何故その課題設定をされたのでしょうか?
dundee_dance

2024/01/16 17:23

学校の課題で機械学習の授業があって各自で機械学習を作ってみようってなったんですけどそのテーマが全然思いつかなくてこのテーマに決めたんですよね。他に何も思い浮かばなかったので…
meg_

2024/01/17 00:18

teratailで類似の質問が最近ありましたので流行っているんですかね?
meg_

2024/01/17 00:20 編集

> 被写体に近い色一色で薄く塗りつぶしているような感じの画像が出てきます ・画像全体が一色ってことですか? ・学習自体は進んでいるのでしょうか?(lossは下がっていっているのか?)
dundee_dance

2024/01/17 00:31

ちょっとここの説明が難しいんですよね… 塗り絵をする前の画像(色と色との境界線が描かれた画像)、は保たれた状態で被写体に使われている色が全体に塗られている状態です。画像全体が1色という訳では無いです。 学習自体はlossが下がり続けているのでできていると思います。
meg_

2024/01/17 00:48

> 学習自体はlossが下がり続けているのでできていると思います。 下がり切ってはいないということですが?もしそうであれば学習が足りないのではないでしょうか?
dundee_dance

2024/01/17 01:22

昨日グラフを見た感じ下がりきってないかもしれないです。 家に帰ったら確認してみます。 ありがとうございます。
meg_

2024/01/17 01:41

おそらく20エポックでは足りないでしょう。
dundee_dance

2024/01/17 01:57

ありがとうございます。 エポック数やサンプル数などの変更も試してみます。
dundee_dance

2024/01/17 13:26

>meg_様  返信が遅れてすいません。現在30と50エポック、30サンプルで試したところlossがどちらも0.1あたりで収束しました。 >jbpb0様  参考サイトありがとうございます。一度見て参考になるところがないか調べてみます。
dundee_dance

2024/01/17 15:14

すいません、言い忘れていたのですが毎回実行すると以下のような警告文が出てきます。バージョンやAPIのアップデートを行えとのことなのですがこれによって機械学習のモデルの予測結果がおかしくなったりするのでしょうか? WARNING:tensorflow:From C:\Users\owner\AppData\Local\Programs\Python\Python39\lib\site-packages\keras\src\losses.py:2976: The name tf.losses.sparse_softmax_cross_entropy is deprecated. Please use tf.compat.v1.losses.sparse_softmax_cross_entropy instead. WARNING:tensorflow:From C:\Users\owner\AppData\Local\Programs\Python\Python39\lib\site-packages\keras\src\backend.py:873: The name tf.get_default_graph is deprecated. Please use tf.compat.v1.get_default_graph instead. 2024-01-18 00:11:59.688916: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations. To enable the following instructions: SSE SSE2 SSE3 SSE4.1 SSE4.2 AVX2 AVX_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags. WARNING:tensorflow:From c:\Users\owner\.vscode\code\Python\ml\programs\rgb_to_gray copy.py:84: The name tf.train.AdamOptimizer is deprecated. Please use tf.compat.v1.train.AdamOptimizer instead. WARNING:tensorflow:From C:\Users\owner\AppData\Local\Programs\Python\Python39\lib\site-packages\keras\src\utils\tf_utils.py:492: The name tf.ragged.RaggedTensorValue is deprecated. Please use tf.compat.v1.ragged.RaggedTensorValue instead. WARNING:tensorflow:From C:\Users\owner\AppData\Local\Programs\Python\Python39\lib\site-packages\keras\src\engine\base_layer_utils.py:384: The name tf.executing_eagerly_outside_functions is deprecated. Please use tf.compat.v1.executing_eagerly_outside_functions instead.
meg_

2024/01/17 15:51

> 警告文が出てきます。バージョンやAPIのアップデートを行えとのことなのですがこれによって機械学習のモデルの予測結果がおかしくなったりするのでしょうか? 例えば、tf.losses.sparse_softmax_cross_entropyは非推奨になったのでtf.compat.v1.losses.sparse_softmax_cross_entropyを使ってください、という警告なのでコードを書き替えましょう。今は警告でも近いうちに以前の関数はエラーになることが予想されます。
dundee_dance

2024/01/18 01:46

ありがとうございます。meg_様が指摘してくださった警告以外のものはpip --upgradeでなくなったので試してみたいと思います。 また改良したら報告します。
dundee_dance

2024/01/18 15:29

現在警告文はすべて消えて実行しています。 ただ学習用データとテスト用データでの精度なのですがlossは減少して収束するのに対して制度は急に上がったり下がったりして不安定になります。 これを防ぐために正則化としてDropoutやBatchNormalizationなども試してみましたが併用すると過学習を起こし、Dropoutのみだと精度が急に上がったり下がったりする状況です。 そして出力データは一色でしか色塗りをしてくれません。 以下に精度が不安定な時のグラフと画像の出力結果例を載せておきます。 https://photos.app.goo.gl/acVmtKCMpx9ZkeCY8
dundee_dance

2024/01/18 16:23

ありがとうございます。試してみます。 私も先ほど検索した結果kerasやtensorflowを使っているのはあまり見つからなかったんですよね・・・ 少し試してからきつそうだったらPytorchに切り替える方向も考えてみます。
dundee_dance

2024/01/18 16:37

少し改良を加えてみたところほかの色がぼんやりとですが塗られるようになりました! サンプル数やエポック数などを調整してみます! 本当にありがとうございます!!
dundee_dance

2024/01/20 09:03

再度失礼します。 現在画像はぼんやりと色が塗られるようにはなったのですが、精度が安定しません。 学習データでは上がりきっても0.5ほどで収束してしまったり、上がったり下がったりなど... テストデータでは0.4ほどまでしか上がらなく... 損失はどちらも0.1~0.15ほどまで下がります サンプルの画像はblenderで作成した同じ被写体をいろいろな角度から撮ったもの40枚ほど+その画像に反転、少しだけノイズを加えたもの、明るさ調整を加えたものなど合計200枚ほどです。 アルゴリズム自体を見直した方がいいのかサンプル数を増やした方がいいかなど現在わからない状況です。
dundee_dance

2024/01/20 09:04

また精度を上げるうえでほかにも調整することなどありますか?
meg_

2024/01/20 11:38

> 現在画像はぼんやりと色が塗られるようにはなったのですが、精度が安定しません。 コードは掲載のコードを実行しているのでしょうか?
dundee_dance

2024/01/20 12:45

失礼しました。コードを現在使用しているものに変更しました。
meg_

2024/01/20 13:09

dropoutを多用してますが理由がありますか?
dundee_dance

2024/01/20 13:25

前のプログラムでグラフ表示させたときに過学習している感じがあったのでそれを防ぐためにレイヤーごとに入れたって感じですね。
meg_

2024/01/20 13:52

> 前のプログラムでグラフ表示させたときに過学習している感じがあった 現在のプログラムでも同様なのでしょうか?
dundee_dance

2024/01/20 14:29

過学習している感じはなく、学習データは最初上がったあとに少しずつ減少、テストデータは急に上がってすぐに減少、その後少しずつ上がるといった挙動が不安定な状況です。
meg_

2024/01/20 14:34

> 過学習している感じはなく、 dropout層がない状態での学習傾向について質問しました。もしも必要がないのに入れているのであれば学習が進まない理由では?と思いました。
meg_

2024/01/20 14:37

> 学校の課題で機械学習の授業があって各自で機械学習を作ってみようってなったんですけどそのテーマが全然思いつかなくてこのテーマに決めたんですよね。 難しい課題に挑戦されていると思うので、一度今のコードで指導教員にアドバイスを仰いではどうでしょうか?
dundee_dance

2024/01/20 15:07

失礼しました。Dropoutがない状態でも精度自体はあまり変わらなかったのですがテストデータの精度が振動してしまいました。 いろいろとアドバイスありがとうございます。 指導教員にも一度質問してみます。
meg_

2024/01/20 15:46

質問者さんのおっしゃる「精度」とはどういう計算の元の数値でしょうか?分類問題ではないので 正解数/データ数 とはならないかと思います。kerasはどういう計算してるんでしょうね。
dundee_dance

2024/01/20 16:21

確かに精度の計算に関してはあまり考えていませんでした。画像の中の各画素に対して行われているんですかね...行われていたとしても小数点以下どの値まであっていればいいのかとか...そのあたりも改めて考える必要がありそうですね...
dundee_dance

2024/01/23 12:55

返信が遅れて申し訳ありません。 今回はkerasモデルが示す精度は用いずに自分の目で精度を確かめることにします。授業担当の先生もあまり気にしなくていいといわれたこともあるので(画像生成についてはやってないからか)、自分の納得する結果を出せたので今回は終了しようと思います。 いろいろと回答ありがとうございました。 ベストアンサーに選択したいので何か回答してもらってもよろしいですか?
meg_

2024/01/23 13:47

質問の①、②について適切なアドバイスはできませんでしたので、今回は質問者さんがどのようにモデルを変更して色が付くようになったのかを自己回答として投稿していただくのがベストかと思います。その方が後で質問を見た人にとっても役に立つと思います。
dundee_dance

2024/01/23 14:02

わかりました。いろいろとありがとうございました。
guest

回答1

0

自己解決

①プーリング層→全結合層に関して
プーリング層は画像を圧縮し、全結合層は1次元ベクトルに変換するものであるため、画像分類にしか使用されないのではないかと考え、今回の画像生成には必要ないと考えました。

②最終結果のカラー画像の生成について
おそらく畳み込み層で特徴の正規化などを行っていなかったため薄い畳み込み層での軽い特徴しか得られず、背景の色を被写体の色と勘違いしてしまったのではないかと考えました。
畳み込み層をだんだん厚くしていき、次にだんだん薄くしたことによって細かい特徴をとらえつつ全体の特徴もとらえ、過学習を防ぐという感じにすること、バッチ正規化を行うことによって期待していたカラー画像の生成が出来たのではないかと考えました。

アドバイスを下さった方、本当にありがとうございました。

投稿2024/01/23 14:07

dundee_dance

総合スコア2

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問