diff --git a/Detect/detect.py b/Detect/detect.py index 961a93a4adbc094e23f51b5a23aaf2bf0f69ac4d..dfcf070c33319ee8e4c11bcac6bdc03e4928fadc 100644 --- a/Detect/detect.py +++ b/Detect/detect.py @@ -1,4 +1,4 @@ -#/!usr/bin/python +#!/usr/bin/python import numpy as np #import rospy @@ -35,7 +35,7 @@ def detect_edge(pic): # pic: original image to apply the pre-set region of interest too def ROI(pic): height = pic.shape[0] - triangle = np.array([[(100, height), (600, height), (350, 100)]]) + triangle = np.array([[(250, height), (1100, height), (550, 250)]]) mask = np.zeros_like(pic) cv2.fillPoly(mask, triangle, 255) roi = cv2.bitwise_and(pic, mask) @@ -46,7 +46,7 @@ def ROI(pic): # pic: original image to apply the pre-set region of interest too def ROI_real(pic): height = pic.shape[0] - triangle = np.array([[(0, height), (620, height), (430, 250), (150, 250)]]) + triangle = np.array([[(0, height), (145, 300), (475, 300), (600, height)]], dtype=np.int32) mask = np.zeros_like(pic) cv2.fillPoly(mask, triangle, 255) roi = cv2.bitwise_and(pic, mask) @@ -56,7 +56,7 @@ def ROI_real(pic): # params # edge_pic: the image with the edge detection performed def getLines(edge_pic): - return cv2.HoughLinesP(edge_pic, 1, np.pi / 180, 100, maxLineGap=80, minLineLength=20) + return cv2.HoughLinesP(edge_pic, 1, np.pi / 180, 50, maxLineGap=80, minLineLength=10) # Apply the passed in lines the the original picture # params @@ -82,6 +82,35 @@ def applyLines(original_pic, lines): return original_pic +def find_middle(leftPoints, rightPoints): + + middle_lines = [[],[]] + + if(leftPoints[1] is None or rightPoints[1] is None + ): + print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Caught the empty list~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~") + return 0 + + else: + print(leftPoints[1]) + print(rightPoints[1]) + for x in range(150): + + #print("Right x point: " + str(rightPoints[0][x])) + #print("Left x point: " + str(leftPoints[0][x])) + #print("Right Y point: " + str(rightPoints[1][x])) + #print("Left Y point: " + str(leftPoints[1][x])) + + midPoint = (rightPoints[0][149-x] + leftPoints[0][x]) / 2 + #print("midPoint X: " + str(midPoint)) + #print("midPoint Y: " + str(leftPoints[1][x])) + middle_lines[1].append(leftPoints[1][x]) + middle_lines[0].append(midPoint) + + return middle_lines + + + # Find the two average lines given the set of lines # params # pic: the original image @@ -168,13 +197,13 @@ def find_average_lane(pic, lines): for line in lines: x1, y1, x2, y2 = line[0] parameters = np.polyfit((x1, x2), (y1, y2), 1) - print("Slope, intercept") - print(parameters) + #print("Slope, intercept") + #print(parameters) slope = parameters[0] intercept = parameters[1] if(slope < 0): - print("Left insert") + #print("Left insert") left_lines.append((slope, intercept)) left_lines_points[0].append(x1) left_lines_points[0].append(x2) @@ -182,7 +211,7 @@ def find_average_lane(pic, lines): left_lines_points[1].append(y2) else: - print("Right insert") + #print("Right insert") right_lines.append((slope, intercept)) right_lines_points[0].append(x1) right_lines_points[0].append(x2) @@ -190,34 +219,34 @@ def find_average_lane(pic, lines): right_lines_points[1].append(y2) if not left_lines: - print("Left is empty") + #print("Left is empty") left_line = [0, 0, 0, 0] else: left_average = np.average(left_lines, axis=0) left_line = make_coordinates(pic, left_average) - print("Left Line: ") - print(left_line) + #print("Left Line: ") + #print(left_line) if not right_lines: - print("Right is emtpy") + #print("Right is emtpy") right_line = [0, 0, 0, 0] else: right_average = np.average(right_lines, axis=0) right_line = make_coordinates(pic, right_average) - print("Right line : ") - print(right_line) + #print("Right line : ") + #print(right_line) - print("Left fit") - print(left_line) + #print("Left fit") + #print(left_line) - print("\nRight fit") - print(right_line) + #print("\nRight fit") + #print(right_line) return np.array([left_line, right_line]) def make_coordinates(image, line_parameters): - print(line_parameters) + #print(line_parameters) slope, intercept = line_parameters y1 = image.shape[0] y2 = int(y1*(1/2)) @@ -227,7 +256,7 @@ def make_coordinates(image, line_parameters): def detectDeparture(left, car, right): a = 9999999 - b = 999999 + b = 999999 try: parametersLeft = np.polyfit((left[0][0], left[0][-1]), (left[1][0], left[1][-1]), 1) leftEq = np.poly1d(parametersLeft) @@ -257,28 +286,30 @@ def detectDeparture(left, car, right): -#video = cv2.VideoCapture("test2.mp4") +video = cv2.VideoCapture("test2.mp4") #video = cv2.VideoCapture("highway.mp4") -video = cv2.VideoCapture(1) +#video = cv2.VideoCapture(1) plt.ion() while True: ret, frame = video.read() # gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) + # frame = cv2.imread("../frame.jpeg") frame_edge = detect_edge(frame) if not ret: - video = cv2.VideoCapture(0) + video = cv2.VideoCapture(1) continue new_img = formatImg(frame) wEdges = detect_edge(new_img) - cropped = ROI_real(wEdges) - + #cropped = ROI_real(wEdges) + cropped = ROI(wEdges) + lines = getLines(cropped) @@ -287,14 +318,18 @@ while True: else: Rpoints, Lpoints = find_poly_lane(new_img, lines) + + Mpoints = find_middle(Lpoints, Rpoints) + #(type(Rpoints[0][0])) plt.cla() plt.clf() plt.scatter(Rpoints[0], Rpoints[1]) plt.scatter(Lpoints[0], Lpoints[1]) + plt.scatter(Mpoints[0], Mpoints[1]) - plt.scatter(310, 300) + #plt.scatter(310, 300) plt.imshow(frame, zorder=0) @@ -305,9 +340,9 @@ while True: lane = applyLines(frame, lines) - cv2.imshow("edges", wEdges) - cv2.imshow("cropped", cropped) - cv2.imshow("frame", lane) + #cv2.imshow("edges", wEdges) + #cv2.imshow("cropped", cropped) + #cv2.imshow("frame", lane) key = cv2.waitKey(25) if key == 27: @@ -315,27 +350,3 @@ while True: video.release() cv2.destroyAllWindows() - -''' -# Load image -img = cv2.imread('lol_image.jpg') - - -new_img = formatImg(img) - -wEdges = detect_edge(new_img) -cropped = ROI(wEdges) -lines = getLines(cropped) - -#lanes = applyLines(img, lines) - -average_lines = find_average_lane(img, lines) - -average_lanes = applyLines(img, average_lines) -cv2.imshow("edges", wEdges) -#cv2.imshow("with lines", lanes) -cv2.imshow("Average", average_lanes) -cv2.waitKey(0) -cv2.destroyAllWindows() - -''' \ No newline at end of file diff --git a/Neural_Network_Development/resnet/resnet_predict.py b/Neural_Network_Development/resnet/resnet_predict.py new file mode 100644 index 0000000000000000000000000000000000000000..d21777a630f07de8cbb3a4087d0c60f4f5ab6580 --- /dev/null +++ b/Neural_Network_Development/resnet/resnet_predict.py @@ -0,0 +1,40 @@ +from keras.models import load_model +from keras.preprocessing import image +import numpy as np +import os +from keras.applications.resnet50 import preprocess_input, decode_predictions +from keras.applications.resnet50 import ResNet50 + +# image folder +#folder_path = 'data/test/' +img_path = 'data/test/stop_1405371717.avi_image7.png' +# path to model +#model_path = 'resnet_stop.h5' +model = ResNet50(weights='imagenet') + +model.summary() +# dimensions of images +img_width, img_height = 224, 224 + +# load the trained model +#model = load_model(model_path) +model = load_model(model) +model.compile(loss='sparse_categorical_crossentropy',optimizer='sgd',metrics=['accuracy']) +""" +#images = [] +for img in os.listdir(folder_path): + img = image.load_img(folder_path + img, target_size=(img_width, img_height)) + img = image.img_to_array(img) + img = np.expand_dims(img, axis=0) + img = preprocess_input(img) + preds = model.predict(img) + print('Predicted:', decode_predictions(preds, top=3)[0]) +""" + +img = image.load_img(img_path, target_size=(224, 224)) +x = image.img_to_array(img) +x = np.expand_dims(x, axis=0) +x = preprocess_input(x) + +preds = model.predict(x) +print('Predicted:', decode_predictions(preds, top=3)[0]) diff --git a/Neural_Network_Development/resnet/resnet_train.py b/Neural_Network_Development/resnet/resnet_train.py new file mode 100644 index 0000000000000000000000000000000000000000..7a90f2acf92420a739d62d5444abb9f9d14dc474 --- /dev/null +++ b/Neural_Network_Development/resnet/resnet_train.py @@ -0,0 +1,84 @@ +from keras import applications +from keras.preprocessing.image import ImageDataGenerator +from keras import optimizers +from keras.models import Sequential, Model +from keras.layers import Dropout, Flatten, Dense, GlobalAveragePooling2D +from keras import backend as k +from keras.callbacks import ModelCheckpoint, LearningRateScheduler, TensorBoard, EarlyStopping + +img_width, img_height = 224, 224 +train_data_dir = "data/train" +validation_data_dir = "data/valid" +nb_train_samples = 745 +nb_validation_samples = 181 +batch_size = 16 +epochs = 5 + +model = applications.ResNet50(include_top=False, weights='imagenet', input_shape=(img_width, img_height, 3),classes=1001) +model.summary() + +# Freeze the layers which you don't want to train. +for layer in model.layers[:]: + layer.trainable = False + +# Adding custom Layer +# We only add +x = model.output +x = Flatten()(x) +# Adding even more custom layers +# x = Dense(1024, activation="relu")(x) +# x = Dropout(0.5)(x) +# x = Dense(1024, activation="relu")(x) +predictions = Dense(2, activation="softmax")(x) + +# creating the final model +model_final = Model(model.input, predictions) + +# compile the model +model_final.compile(loss = "sparse_categorical_crossentropy", optimizer="sgd", metrics=["accuracy"]) +#optimizer = optimizers.SGD(lr=0.0001, momentum=0.9), metrics=["accuracy"]) + +# Initiate the train and test generators with data Augumentation +train_datagen = ImageDataGenerator( + rescale = 1./255, + horizontal_flip = True, + fill_mode = "nearest", + zoom_range = 0.1, + width_shift_range = 0.1, + height_shift_range=0.1, + rotation_range=10) + +test_datagen = ImageDataGenerator( + rescale = 1./255, + horizontal_flip = True, + fill_mode = "nearest", + zoom_range = 0.1, + width_shift_range = 0.1, + height_shift_range=0.1, + rotation_range=10) + +train_generator = train_datagen.flow_from_directory( + train_data_dir, + target_size = (img_height, img_width), + batch_size = batch_size, + class_mode = "categorical",shuffle=True) + +validation_generator = test_datagen.flow_from_directory( + validation_data_dir, + target_size = (img_height, img_width), + class_mode = "categorical", shuffle=True) + +# Save the model according to the conditions +checkpoint = ModelCheckpoint("resnet_stop.h5", monitor='val_acc', verbose=1, save_best_only=True, save_weights_only=False, mode='auto', period=1) +early = EarlyStopping(monitor='val_acc', min_delta=0, patience=10, verbose=1, mode='auto') + + +# Train the model +model_final.fit_generator( + train_generator, + steps_per_epoch = nb_train_samples/batch_size, + epochs = epochs, + validation_data = validation_generator, + validation_steps = nb_validation_samples/batch_size, + callbacks = [checkpoint, early]) +