回答編集履歴

1

tiitoi

tiitoi score 16706

2018/10/16 14:03  投稿

```
ValueError: Error when checking input: expected conv2d_1_input to have 4 dimensions, but got array with shape (0, 1)
```
`got array with shape (0, 1)` と出ているので、モデルに与えられた入力データがおかしいというエラーです。
画像の読み込みもしくは顔の検出ができていないのではないでしょうか?
あと、以下はおかしいと思います。dsize=(128, 128) のようにリサイズするサイズを指定するべきです。
```
cv2.resize(faceImg,None, fx=float(size/faceImg.shape[0]),fy=float(size/faceImg.shape[1]))
```
以下、確認したパスから画像を読み込み、顔を切り出してバッチで取得するコードです。
```python
import os
import cv2
import matplotlib.pyplot as plt
import numpy as np
from keras.models import Sequential, load_model
from keras.preprocessing.image import load_img, img_to_array
class FaceExtractor:
   def __init__(self):
       assert os.path.isfile('./haarcascade_frontalface_alt.xml'), 'カスケード定義ファイルがない'
       self.detector = cv2.CascadeClassifier('./haarcascade_frontalface_alt.xml')
       
   def extract(self, path, size):
       # 画像を読み込む。
       img = cv2.imread(path)
       # 検出する。
       rects = self.detector.detectMultiScale(
           img, scaleFactor=1.1, minNeighbors=1, minSize=(1, 1))
       # BGR -> RGB
       img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
       # 顔画像を切り出す。
       face_imgs = []
       for x, y, w, h in rects:
           face_img = img[y:y + h, x: x + w]
           face_img = cv2.resize(face_img, size)
           face_imgs.append(face_img)
       return np.array(face_imgs)
extractor = FaceExtractor()
face_imgs = extractor.extract('nogizaka.jpg', size=(128, 128))
print(face_imgs.shape) # (7, 128, 128, 3)
fig, axes = plt.subplots(2, 3, figsize=(8, 5))
for ax, img in zip(axes.ravel(), face_imgs):
   ax.imshow(img)
   ax.axis('off')
plt.show()
```
![イメージ説明](8c5640d7061ff6353b4ddbc39cdd47ad.png)
切り出し結果
切り出し結果
あとここもおかしいです。
astype() は配列のコピーを作成し、型を変換して返す関数なので、
以下のようにしても、imgarray 自体の型は変わりません。
```
imgarray.astype('float32')
```
上記に記載したサンプルコードのあとに以下のようにすると、(7, 128, 128, 3) の float32 型 numpy 配列が得られるのでこの x を predict() に流してください。
バッチサイズは指定しなくていいです。
```
x = np.array(face_imgs) / 255.
x = x.astype(np.float32)
y_pred = model.predict(x)
```

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る