Home Keras Image classifier for CoreML image input asks MultiArray instead of Image
Reply: 1

Keras Image classifier for CoreML image input asks MultiArray instead of Image

Tarak Shah
Tarak Shah Published in 2018-02-13 18:33:28Z

I'm new to machine learning and I built my first neural network using help of code and guidance from https://www.pyimagesearch.com/2017/12/11/image-classification-with-keras-and-deep-learning

Now, when I try to convert the model generated by this network, it asks me MultiArray input instead of image input like other models that Apple has introduced. Where 'am I losing the track? My training code is below:

# python train_network.py --dataset images --model santa_not_santa.model

# set the matplotlib backend so figures can be saved in the background
import matplotlib

# import the necessary packages
from keras.preprocessing.image import ImageDataGenerator
from keras.optimizers import Adam
from sklearn.model_selection import train_test_split
from keras.preprocessing.image import img_to_array
from keras.utils import to_categorical
from pyimagesearch.lenet import LeNet
from imutils import paths
import matplotlib.pyplot as plt
import numpy as np
import argparse
import random
import cv2
import os

# construct the argument parse and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-d", "--dataset", required=True,
    help="path to input dataset")
ap.add_argument("-m", "--model", required=True,
    help="path to output model")
ap.add_argument("-p", "--plot", type=str, default="peacock.png",
    help="path to output loss/accuracy plot")
args = vars(ap.parse_args())

# initialize the number of epochs to train for, initia learning rate,
# and batch size
INIT_LR = 1e-3
BS = 32

# initialize the data and labels
print("[INFO] loading images...")
data = []
labels = []

# grab the image paths and randomly shuffle them
imagePaths = sorted(list(paths.list_images(args["dataset"])))

# loop over the input images
for imagePath in imagePaths:
    # load the image, pre-process it, and store it in the data list
    image = cv2.imread(imagePath)
    image = cv2.resize(image, (28, 28))
    image = img_to_array(image)

    # extract the class label from the image path and update the
    # labels list
    label = imagePath.split(os.path.sep)[-2]
    label = 1 if label == "santa" else 0

# scale the raw pixel intensities to the range [0, 1]
data = np.array(data, dtype="float") / 255.0
labels = np.array(labels)

# partition the data into training and testing splits using 75% of
# the data for training and the remaining 25% for testing
(trainX, testX, trainY, testY) = train_test_split(data,
    labels, test_size=0.25, random_state=42)

# convert the labels from integers to vectors
trainY = to_categorical(trainY, num_classes=2)
testY = to_categorical(testY, num_classes=2)

# construct the image generator for data augmentation
aug = ImageDataGenerator(rotation_range=30, width_shift_range=0.1,
    height_shift_range=0.1, shear_range=0.2, zoom_range=0.2,
    horizontal_flip=True, fill_mode="nearest")

# initialize the model
print("[INFO] compiling model...")
model = LeNet.build(width=28, height=28, depth=3, classes=2)
opt = Adam(lr=INIT_LR, decay=INIT_LR / EPOCHS)
model.compile(loss="binary_crossentropy", optimizer=opt,

# train the network
print("[INFO] training network...")
H = model.fit_generator(aug.flow(trainX, trainY, batch_size=BS),
    validation_data=(testX, testY), steps_per_epoch=len(trainX) // BS,
    epochs=EPOCHS, verbose=1)

# save the model to disk
print("[INFO] serializing network...")

import coremltools

# coremll = coremltools.converters.keras.convert(args["model"], output_names='bool',image_input_names='camera frame', is_bgr= True)
coremll = coremltools.converters.keras.convert('/home/tarak/Documents/keras_image_classifier/peacocknopeacock.model', image_input_names='camera', is_bgr= True, output_names='Output_names')
# coremll.input_description['camera frame'] = 'A 28x28 pixel Image'
# coremll.output_description['bool'] = 'A one-hot Multiarray were the index with the biggest float value (0-1) is the recognized digit. '
print('MLmodel converted')

# plot the training loss and accuracy
plt.plot(np.arange(0, N), H.history["loss"], label="train_loss")
plt.plot(np.arange(0, N), H.history["val_loss"], label="val_loss")
plt.plot(np.arange(0, N), H.history["acc"], label="train_acc")
plt.plot(np.arange(0, N), H.history["val_acc"], label="val_acc")
plt.title("Training Loss and Accuracy on Peacock/Not Peacock")
plt.xlabel("Epoch #")
plt.legend(loc="lower left")
Matthijs Hollemans
Matthijs Hollemans Reply to 2018-02-14 12:17:52Z

When converting your model to Core ML you also need to add input_names='camera frame' when you call coremltools.converters.keras.convert(), in addition to image_input_names='camera frame'. Otherwise coremltools won't see this input and doesn't know you want to treat it as an image.

You need to login account before you can post.

About| Privacy statement| Terms of Service| Advertising| Contact us| Help| Sitemap|
Processed in 0.332227 second(s) , Gzip On .

© 2016 Powered by mzan.com design MATCHINFO