Точность обучения колеблется, но не улучшается, и прогнозы bbox всегда равны нулю - PullRequest
0 голосов
/ 08 апреля 2019

Я новичок в cnn и пытаюсь построить регрессор ограничивающего прямоугольника для моих входных данных. У меня есть видео с несколькими объектами, но я хочу обучать / отслеживать только один конкретный объект. так как у меня есть только один класс, выходные данные моей сети - 4 числа, представляющие верхние левые координаты (x, y) и высоту и ширину. Я сгенерировал данные с моей машиной и сгенерировал связанный CSV-файл. Но когда я пытаюсь запустить код, у меня появляется ошибка, связанная с «acc», поэтому я прокомментировал часть «acc» и запустил код. Однако ошибка вывода вообще не уменьшается, и предопределенные ограничивающие рамки для тестового изображения всегда равны нулю. Я не использовал никакой активации после плотного, потому что я хочу фактические координаты поля во входном изображении. Код, который я использовал, как показано ниже

Я пытался изменить количество эпох, но безрезультатно. И я не вижу никаких других параметров, которые я могу изменить. Я не могу отладить проблему и мне нужна помощь.

# Import libraries
import os,cv2
import numpy as np
import matplotlib.pyplot as plt
import pandas as PD
import CSV

from sklearn.utils import shuffle
from sklearn.model_selection import train_test_split

from keras import backend as K
K.set_image_dim_ordering('th')

from keras.utils import np_utils
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation, Flatten
from keras.layers.convolutional import Convolution2D, MaxPooling2D
from keras.optimizers import SGD,RMSprop,adam

PATH = os.getcwd()
# Define data path
data_path = PATH + '/frames'
data_dir_list = os.listdir(data_path)

img_rows=128
img_cols=128
num_channel=1
num_epoch=20

num_classes = 1

img_data_list=[]

# note I have to give two folder structure for this code to work so "frames/dzire"
for dataset in data_dir_list:
    img_list=os.listdir(data_path+'/'+ dataset)
    print ('Loaded the images of dataset-'+'{}\n'.format(dataset))
    for img in img_list:
        input_img=cv2.imread(data_path + '/'+ dataset + '/'+ img )
        input_img=cv2.cvtColor(input_img, cv2.COLOR_BGR2GRAY)
        input_img_resize=cv2.resize(input_img,(128,128))
        img_data_list.append(input_img_resize)

print(img_data_list[0].shape)
img_data = np.array(img_data_list)
img_data = img_data.astype('float32')
img_data /= 255
print (img_data.shape)

if num_channel==1:
    if K.image_dim_ordering()=='th':
        img_data= np.expand_dims(img_data, axis=1) 
        print (img_data.shape)
    else:
        img_data= np.expand_dims(img_data, axis=4) 
        print (img_data.shape)

else:
    if K.image_dim_ordering()=='th':
        img_data=np.rollaxis(img_data,3,1)
        print (img_data.shape)

#%%
USE_SKLEARN_PREPROCESSING=False

# Define the number of classes
num_classes = 1

num_of_samples = img_data.shape[0]
labels = np.ones((num_of_samples,),dtype='int64')

labels[0:1600]=0



names = ['dzire']

# convert class labels to on-hot encoding
#Y = np_utils.to_categorical(labels, num_classes)
Y = np.zeros((1601,4))

#print(np.shape(Y))



Y[0][:] = [904,661,120,67]

for i in range(1,10):
    df = pd.read_csv("dezire_v1_test.csv",skiprows =i-1,nrows = 1)
    Y[i][:] = df
    #print(df)

#print(np.shape(Y))
#print(Y[0:9][:])
x,y = shuffle(img_data,Y, random_state=2)
# Split the dataset
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=2)

#%%
# Defining the model
input_shape=img_data[0].shape

model = Sequential()

model.add(Convolution2D(32, 3,3,border_mode='same',input_shape=input_shape))
model.add(Activation('relu'))
model.add(Convolution2D(32, 3, 3))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.5))

model.add(Convolution2D(64, 3, 3))
model.add(Activation('relu'))
#model.add(Convolution2D(64, 3, 3))
#model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.5))

model.add(Flatten())
model.add(Dense(4))

model.compile(loss="mean_squared_error",optimizer="Adam",metrics=[])

model.summary()
model.get_config()
model.layers[0].get_config()
model.layers[0].input_shape         
model.layers[0].output_shape            
model.layers[0].get_weights()
np.shape(model.layers[0].get_weights()[0])
model.layers[0].trainable

#%%
# Training
hist = model.fit(X_train, y_train, batch_size=16, nb_epoch=num_epoch, verbose=1, validation_data=(X_test, y_test))

from keras import callbacks

filename='model_train_new.csv'
csv_log=callbacks.CSVLogger(filename, separator=',', append=False)

early_stopping=callbacks.EarlyStopping(monitor='val_loss', min_delta=0, patience=0, verbose=0, mode='min')

filepath="Best-weights-my_model-{epoch:03d}-{loss:.4f}"

checkpoint = callbacks.ModelCheckpoint(filepath, monitor='val_loss', verbose=1, save_best_only=True, mode='min')

callbacks_list = [csv_log,early_stopping,checkpoint]

hist = model.fit(X_train, y_train, batch_size=16, nb_epoch=num_epoch, verbose=1, validation_data=(X_test, y_test),callbacks=callbacks_list)


# visualizing losses and accuracy
#train_loss=hist.history['loss']
#val_loss=hist.history['val_loss']
#train_acc=hist.history['acc']
#val_acc=hist.history['val_acc']
#xc=range(num_epoch)

#plt.figure(3,figsize=(7,5))
#plt.plot(xc,train_loss) #xc was giving error so removed it ck
#plt.plot(xc,val_loss)

#plt.plot(num_epoch,train_loss)
#plt.plot(num_epoch,val_loss)

#plt.xlabel('num of Epochs')
#plt.ylabel('loss')
#plt.title('train_loss vs val_loss')
#plt.grid(True)
#plt.legend(['train','val'])
#print plt.style.available # use bmh, classic,ggplot for big pictures
#plt.style.use(['classic'])

#plt.figure(1,figsize=(7,5))
#plt.plot(xc,train_loss) #xc was giving error so removed it ck
#plt.plot(xc,val_loss)

#plt.plot(train_loss)
#plt.plot(val_loss)

#plt.xlabel('num of Epochs')
#plt.ylabel('loss')
#plt.title('train_loss vs val_loss')
#plt.grid(True)
#plt.legend(['train','val'])
#print plt.style.available # use bmh, classic,ggplot for big pictures
#plt.style.use(['classic'])

#plt.figure(2,figsize=(7,5))
#plt.plot(xc,train_acc) #xc was giving error so removed it ck
#plt.plot(xc,val_acc)
#plt.plot(train_acc)
#plt.plot(val_acc)
#plt.xlabel('num of Epochs')
#plt.ylabel('accuracy')
#plt.title('train_acc vs val_acc')
#plt.grid(True)
#plt.legend(['train','val'],loc=4)
#print plt.style.available # use bmh, classic,ggplot for big pictures
#plt.style.use(['classic'])

#%%

# Evaluating the model

#score = model.evaluate(X_test, y_test, show_accuracy=True, verbose=0) #original line
score = model.evaluate(X_test, y_test, verbose=0)


#print('Test Loss:', score[0])
#print('Test accuracy:', score[1])

test_image = X_test[0:1]
#print (test_image.shape)

#plt.imshow(X_test[0])
#plt.show()

print(model.predict(test_image))
print(model.predict_classes(test_image))
print(y_test[0:1])

Ожидаемые результаты - это ограничивающие прямоугольные координаты (x, y, высота, ширина) цели на изображении, которое в данном случае является автомобилем, но фактические результаты всегда [0,0,0,0]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...