前提・実現したいこと
ここに質問の内容を詳しく書いてください。
(例)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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/26 00:54