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

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

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

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

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

CNN (Convolutional Neural Network)

CNN (Convolutional Neural Network)は、全結合層のみではなく畳み込み層とプーリング層で構成されるニューラルネットワークです。画像認識において優れた性能を持ち、畳み込みニューラルネットワークとも呼ばれています。

OpenCV

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

Python

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

Q&A

解決済

1回答

1272閲覧

CNN-画像のオーバーレイ時のValueError

keita_kkk

総合スコア17

Keras

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

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

CNN (Convolutional Neural Network)

CNN (Convolutional Neural Network)は、全結合層のみではなく畳み込み層とプーリング層で構成されるニューラルネットワークです。画像認識において優れた性能を持ち、畳み込みニューラルネットワークとも呼ばれています。

OpenCV

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

Python

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

0グッド

0クリップ

投稿2021/08/25 05:05

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
(例)pythonでリンゴを認識し、ガイドを表示するシステムを作成しています。
画像のオーバーレイを実装中に以下のエラーメッセージが発生しました。
オーバーレイをしたことで情報が追加されてしまったことが原因だと思われますが、対処法が分かりません。

発生している問題・エラーメッセージ

Traceback (most recent call last): File "c:/Users/Owner/Documents/anaconda_vs/appale_project/camera-test.py", line 129, in <module> name = detect_who(apple_image) File "c:/Users/Owner/Documents/anaconda_vs/appale_project/camera-test.py", line 100, in detect_who result = model.predict(face_image)[0] File "C:\Users\Owner\anaconda3\envs\appale_env\lib\site-packages\keras\engine\training.py", line 1441, in predict x, _, _ = self._standardize_user_data(x) File "C:\Users\Owner\anaconda3\envs\appale_env\lib\site-packages\keras\engine\training.py", line 579, in _standardize_user_data exception_prefix='input') File "C:\Users\Owner\anaconda3\envs\appale_env\lib\site-packages\keras\engine\training_utils.py", line 145, in standardize_input_data str(data_shape)) ValueError: Error when checking input: expected conv2d_1_input to have shape (60, 60, 3) but got array with shape (60, 60, 4)

該当のソースコード

python

1#カメラでテスト 2import cv2 3import numpy as np 4from keras.models import load_model 5import os 6import time 7import datetime 8from PIL import ImageFont, ImageDraw, Image 9 10 11#カテゴリ名 12category = ['maru', 13 'half', 14 '1/4', 15 '1/8', 16 'cutcore', 17 'complete'] 18 19#読み込むモデル 20in_model = 'appale_model_15.h5' 21 22#画像サイズ 23image_size = 60 24 25try: 26 model = load_model('./' + in_model) 27except OSError: 28 print('エラー:./' + in_model + 'が見つかりません。') 29 exit() 30 31#文字表示zone 32# パラメータ 33img_a = [] 34 35# 画面に表示する文字を指定 36moji_1 = f"{'丸:半分に切ってください。'}" 37moji_2 = f"{'半分 : 1/4にしてください。'}" 38moji_3 = f"{'1/4 : 1/8にしてください。'}" 39moji_4 = f"{'1/8 : 芯を取ってください。'}" 40moji_5 = f"{'芯取り後 : 兎型に切ってください。'}" 41moji_6 = f"{'完成 : perfect!'}" 42 43# 文字表示部分を関数化 44def moji(a, text): 45 global img_a 46 47 # フォントファイルとサイズを指定 48 font = ImageFont.truetype("./fonts/meiryo.ttc", 20) 49 50 # 文字の色を指定 51 red = (0, 0, 255) # 赤色 52 53 # ndarrayをImageに変換 54 img_pil_en = Image.fromarray(a) 55 56 # 先ほど変換したImageに文字を書き込む 57 ImageDraw.Draw(img_pil_en).text((350, 30), text, font = font , fill = red) 58 59 # Imageをndarrayに変換 60 img_a = np.array(img_pil_en) 61 62 return img_a 63 64#オーバーレイ関数 65def overlayImage(src, ovly, location): 66 ovly_height, ovly_width = ovly.shape[:2] 67 68 #背景をPILに変換 69 src = cv2.cvtColor(src, cv2.COLOR_BGR2RGB) 70 pil_src = Image.fromarray(src) 71 pil_src = pil_src.convert('RGBA') 72 73 #オーバーレイをPILに変換 74 ovly = cv2.cvtColor(ovly, cv2.COLOR_BGRA2RGBA) 75 pil_ovly = Image.fromarray(ovly) 76 pil_ovly = pil_ovly.convert('RGBA') 77 78 #画像を合成 79 pil_tmp = Image.new('RGBA', pil_src.size, (255, 255, 255, 0)) 80 pil_tmp.paste(pil_ovly, location, pil_ovly) 81 result_image = Image.alpha_composite(pil_src, pil_tmp) 82 83 #opencv形式に変換 84 return cv2.cvtColor(np.asarray(result_image), cv2.COLOR_RGBA2BGRA) 85 86 87#カメラを開始 88cap = cv2.VideoCapture(0) 89 90#分類機の指定 91cascade = cv2.CascadeClassifier(r'C:\Users\Owner\Documents\anaconda_vs\appale_project\cascadeMAX.xml') 92 93def window_fullscreen(frame): 94 cv2.namedWindow('screen', cv2.WINDOW_NORMAL) 95 cv2.setWindowProperty('screen', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN) 96 cv2.imshow('screen', frame) 97 98def detect_which(apple_image): 99 #結果を格納 100 result = model.predict(apple_image)[0] 101 #一番可能性の高い配列の添え字を返す 102 predicted = result.argmax() 103 percentage = int(result[predicted] * 100) 104 #カテゴリ名と確率を表示 105 print('{0} {1}%'.format(category[predicted], percentage)) 106 107 return category[predicted] 108 109#繰り返しカメラ画像を確認 110while cap.isOpened(): 111 ok, frame = cap.read() 112 if not ok: break 113 #画像の反転 114 frame = cv2.flip(frame, 1) 115 116 apple_list = cascade.detectMultiScale(frame, scaleFactor=1.2, minNeighbors=2, minSize=(100, 100)) 117 #リンゴが検出された 118 if len(apple_list) > 0: 119 #リンゴの数だけループ 120 for rect in apple_list: 121 x, y, width, height = rect 122 123 apple_image = frame[rect[1]:rect[1]+rect[3], rect[0]:rect[0]+rect[2]] 124 if frame.shape[0] < 400: 125 continue 126 127 apple_image = cv2.resize(apple_image, (image_size, image_size)) 128 apple_image = np.expand_dims(apple_image, axis= 0) 129 name = detect_which(apple_image) 130 131 cv2.rectangle(frame, tuple(rect[0:2]), tuple(rect[0:2] + rect[2:4]), (0, 0, 255), thickness = 3) 132 cv2.putText(frame, name, (x, y + height + 20), cv2.FONT_HERSHEY_DUPLEX, 1, (0, 0, 255), 2) 133 134 #重ねる画像の読み込み 135 img_kasane = cv2.imread(r'C:\Users\Owner\Documents\anaconda_vs\00032.jpg', cv2.IMREAD_UNCHANGED) 136 137 #画像のオーバーレイ 138 frame = overlayImage(frame, img_kasane, (45, 45)) 139 140 # img_a に日本語を表示させる(戻り値は img_a) 141 if name == 'maru': 142 cv2.line(frame, (int(x) + int(width)//2, y), (x+width - int(width)//2, y+height), color=(0,255,0),thickness= 2) 143 frame = moji(frame, moji_1) 144 elif name == 'half': 145 cv2.line(frame, (int(x) + int(width)//2, y), (x+width - int(width)//2, y+height), color=(0,255,0),thickness= 2) 146 frame = moji(frame, moji_2) 147 elif name == '1/4': 148 cv2.line(frame, (int(x) + int(width)//2, y), (x+width - int(width)//2, y+height), color=(0,255,0),thickness= 2) 149 frame = moji(frame, moji_3) 150 elif name == '1/8': 151 frame = moji(frame, moji_4) 152 elif name == 'cutcore': 153 frame = moji(frame, moji_5) 154 else: 155 frame = moji(frame, moji_6) 156 157 window_fullscreen(frame) 158 159 if cv2.waitKey(1) == 27: break 160 161cap.release() 162cv2.destroyAllWindows()

試したこと

オーバーレイ無しで実行-->実行可能
frame.shapeで中身確認-->1回目は(480, 640, 3),それ以降(480, 640, 4)

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

・keras2.3.1
・matplotlib3.3.4
・opencv3.3.1
・python3.6,13
・anaconda3
・tensorflow2.1.0

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

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

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

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

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

guest

回答1

0

ベストアンサー

実際に走らせていませんので直感での回答です。

起きていること

ValueError: Error when checking input: expected conv2d_1_input to have shape (60, 60, 3) but got array with shape (60, 60,

値の異常:入力のチェック中に異常が発生: conv2d_1_input では (60, 60, 3)を予期していましたが、実際練られた配列のshapeは (60, 60, 4)でした。

つまり、60px四方の3ch(BGR)を期待していたのに、60px四方の4ch(RGBA)が入力されていると怒っているわけです。

対象のコードは

Python3

1 #opencv形式に変換 2 return cv2.cvtColor(np.asarray(result_image), cv2.COLOR_RGBA2BGRA)

です。

対策

ここで、RGBAをBGRになるように挿げ替えてください。αチャンネルを無効化するということです。使ったことはありませんが以下の定数で動くはずです。

Python3

1 #opencv形式に変換 2 return cv2.cvtColor(np.asarray(result_image), cv2.COLOR_RGBA2BGR)

投稿2021/08/25 21:26

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

keita_kkk

2021/08/26 00:54

回答ありがとうごさいます! 無事解決することが出来ました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問