kkmehta03 / AutRcCar

Autonomous RC car using Raspberry Pi. Uses picamera data, OpenCV for processing, along with ultrasonic sensor data to drive autonomously.
14 stars 5 forks source link

How to fix prediction error [0], [0].... in AutoRC car? #2

Closed aplusc98 closed 5 years ago

aplusc98 commented 6 years ago

Can you please specify how to fix the prediction error occuring in AutoRCcar, After training im getting 57 percent accuracy but during test im getting only [0].. (ie left) can please let me know about the changes made in the NN model?

import cv2 import numpy as np import glob import sys from sklearn.model_selection import train_test_split

print 'Loading training data...' t0 = cv2.getTickCount()

load training data

image_array = np.zeros((1, 76800)) label_array = np.zeros((1, 4), 'float') training_data = glob.glob('trainin_data/1524310354.npz')

if no data, exit

if not training_data: print "No training data in directory, exit" sys.exit()

for single_npz in training_data: with np.load(single_npz) as data: train_temp = data['train'] train_labels_temp = data['train_labels']
image_array = np.vstack((image_array, train_temp)) label_array = np.vstack((label_array, train_labels_temp))

X = image_array[1:, :] y = label_array[1:, :] print 'Image array shape: ', X.shape print 'Label array shape: ', y.shape

t00 = cv2.getTickCount() time0 = (t00 - t0)/ cv2.getTickFrequency() print 'Loading image duration:', time0

train test split, 7:3

train, test, train_labels, test_labels = train_test_split(X, y, test_size=0.3)

set start time

t1 = cv2.getTickCount()

create MLP

layer_sizes = np.int32([76800, 32, 4]) model = cv2.ml.ANN_MLP_create() model.setLayerSizes(layer_sizes) criteria = (cv2.TERM_CRITERIA_COUNT | cv2.TERM_CRITERIA_EPS, 500, 0.0001)

criteria2 = (cv2.TERM_CRITERIA_COUNT, 100, 0.001)

params = dict(term_crit = criteria, train_method = cv2.ml.ANN_MLP_BACKPROP, bp_dw_scale = 0.01, bp_moment_scale = 0.0 )

print 'Training MLP ...' num_iter = model.train(np.float32(X), cv2.ml.ROW_SAMPLE, np.float32(y))

set end time

t2 = cv2.getTickCount() time = (t2 - t1)/cv2.getTickFrequency() print 'Training duration:', time

print 'Ran for %d iterations' % num_iter

train data

ret_0, resp_0 = model.predict(train) prediction_0 = resp_0.argmax(-1) true_labels_0 = train_labels.argmax(-1)

train_rate = np.mean(prediction_0 == true_labels_0) print 'Train accuracy: ', "{0:.2f}%".format(train_rate * 100)

test data

ret_1, resp_1 = model.predict(test) prediction_1 = resp_1.argmax(-1) true_labels_1 = test_labels.argmax(-1)

test_rate = np.mean(prediction_1 == true_labels_1) print 'Test accuracy: ', "{0:.2f}%".format(test_rate * 100)

save model

model.save('mlp_xml/mlp.xml')

kkmehta03 commented 6 years ago

Hi check out the latest file. It has incorporated open CV 3.4 changes. All you have to do is first check your version of open CV. If it's 2 or something then remove it and install 3.4 and the code will run just fine.