34

I have probem with this code , why ?

the code :

import cv2
import numpy as np
from PIL import Image
import os
import numpy as np
import cv2
import os
import h5py
import dlib
from imutils import face_utils
from keras.models import load_model
import sys
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D,Dropout
from keras.layers import Dense, Activation, Flatten
from keras.utils import to_categorical
from keras import backend as K 
from sklearn.model_selection import train_test_split
from Model import model
from keras import callbacks

# Path for face image database
path = 'dataset'

recognizer = cv2.face.LBPHFaceRecognizer_create()
detector = cv2.CascadeClassifier("haarcascade_frontalface_default.xml");


def downsample_image(img):
    img = Image.fromarray(img.astype('uint8'), 'L')
    img = img.resize((32,32), Image.ANTIALIAS)
    return np.array(img)



# function to get the images and label data
def getImagesAndLabels(path):
    
    path = 'dataset'
    imagePaths = [os.path.join(path,f) for f in os.listdir(path)]     
    faceSamples=[]
    ids = []

    for imagePath in imagePaths:
        
        #if there is an error saving any jpegs
        try:
            PIL_img = Image.open(imagePath).convert('L') # convert it to grayscale
        except:
            continue    
        img_numpy = np.array(PIL_img,'uint8')

        id = int(os.path.split(imagePath)[-1].split(".")[1])
        faceSamples.append(img_numpy)
        ids.append(id)
    return faceSamples,ids

print ("\n [INFO] Training faces now.")
faces,ids = getImagesAndLabels(path)

K.clear_session()
n_faces = len(set(ids))
model = model((32,32,1),n_faces)
faces = np.asarray(faces)
faces = np.array([downsample_image(ab) for ab in faces])
ids = np.asarray(ids)
faces = faces[:,:,:,np.newaxis]
print("Shape of Data: " + str(faces.shape))
print("Number of unique faces : " + str(n_faces))


ids = to_categorical(ids)

faces = faces.astype('float32')
faces /= 255.

x_train, x_test, y_train, y_test = train_test_split(faces,ids, test_size = 0.2, random_state = 0)

checkpoint = callbacks.ModelCheckpoint('trained_model.h5', monitor='val_acc',
                                           save_best_only=True, save_weights_only=True, verbose=1)
                                    
model.fit(x_train, y_train,
             batch_size=32,
             epochs=10,
             validation_data=(x_test, y_test),
             shuffle=True,callbacks=[checkpoint])
             

# Print the numer of faces trained and end program
print("enter code here`\n [INFO] " + str(n_faces) + " faces trained. Exiting Program")

the output:
------------------
File "D:\my hard sam\ماجستير\سنة ثانية\البحث\python\Real-Time-Face-Recognition-Using-CNN-master\Real-Time-Face-Recognition-Using-CNN-master\02_face_training.py", line 16, in <module>
    from keras.utils import to_categorical
ImportError: cannot import name 'to_categorical' from 'keras.utils' (C:\Users\omar\PycharmProjects\SnakGame\venv\lib\site-packages\keras\utils\__init__.py)
Innat
  • 16,113
  • 6
  • 53
  • 101
omar abd
  • 443
  • 1
  • 4
  • 7
  • what's your `tf` version? – Innat Apr 09 '21 at 09:03
  • 7
    how about migrating your code to tensorflow2? Keras aren't maintained anymore and they have move to tensorflow. You just need to install tensorflow, and change the import statement from "from keras.utils import to_categorical" to "from tensorflow.keras.utils import to_categorical". Apply this change to all the keras import to tensorflow.keras – Vinson Ciawandy Apr 09 '21 at 09:07
  • I recommend that you reinstall keras, somehow your keras installation is missing files, This is a common problem in Anaconda. – Dr. Snoopy Apr 09 '21 at 10:15

4 Answers4

91

Keras is now fully intregrated into Tensorflow. So, importing only Keras causes error.

It should be imported as:

from tensorflow.keras.utils import to_categorical

Avoid importing as:

from keras.utils import to_categorical

It is safe to use from tensorflow.keras. instead of from keras. while importing all the necessary modules.

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D,Dropout
from tensorflow.keras.layers import Dense, Activation, Flatten
from tensorflow.keras.utils import to_categorical
from tensorflow.keras import backend as K 
from sklearn.model_selection import train_test_split
from tensorflow.keras import callbacks
Prakash Dahal
  • 4,388
  • 2
  • 11
  • 25
  • 2
    This worked for me too, after quite a bit research, since Keras is now taken over by TensorFlow, putting tensorflow. or tf. is necessary :) – Ishwor Bhusal Jun 09 '21 at 02:59
7

Alternatively, you can use:

from keras.utils.np_utils import to_categorical

Please note the np_utils after keras.uitls

disajoh
  • 430
  • 4
  • 5
0

First thing is you can install this keras.utils with

$!pip install keras.utils 

or another simple method just import to_categorical module as

$ tensorflow.keras.utils import to_categorical

because keras comes under tensorflow package

Reza Rahemtola
  • 1,182
  • 7
  • 16
  • 30
0
y_train = tensorflow.keras.utils.to_categorical(y_train, num_classes)
y_test = tensorflow.keras.utils.to_categorical(y_test, num_classes)

It solves my problem!

Syscall
  • 19,327
  • 10
  • 37
  • 52