def __init__(self, host, port, serial_port, input_size): #self.server_socket = socket.socket() #self.server_socket.bind((host, port)) #self.server_socket.listen(0) # accept a single connection #self.connection = self.server_socket.accept()[0].makefile('rb') # connect to a seral port self.car = Motor() self.send_inst = True self.input_size = input_size # create labels self.k = np.zeros((4, 4), 'float') for i in range(4): self.k[i, i] = 1 pygame.init() pygame.display.set_mode((250, 250))
class RCControl(object): def __init__(self, serial_port): self.car = Motor() def steer(self, prediction): if prediction == 2: self.car.forward(speed) print("Forward") elif prediction == 0: self.car.forward_left(speed) print("Left") elif prediction == 1: self.car.forward_right(speed) print("Right") else: self.stop() def stop(self): self.car.stop()
def __init__(self, serial_port): self.car = Motor()
class CollectTrainingData(object): def __init__(self, host, port, serial_port, input_size): #self.server_socket = socket.socket() #self.server_socket.bind((host, port)) #self.server_socket.listen(0) # accept a single connection #self.connection = self.server_socket.accept()[0].makefile('rb') # connect to a seral port self.car = Motor() self.send_inst = True self.input_size = input_size # create labels self.k = np.zeros((4, 4), 'float') for i in range(4): self.k[i, i] = 1 pygame.init() pygame.display.set_mode((250, 250)) def collect(self): saved_frame = 0 total_frame = 0 # collect images for training print("Start collecting images...") print("Press 'q' or 'x' to finish...") start = cv2.getTickCount() X = np.empty((0, self.input_size)) y = np.empty((0, 4)) # stream video frames one by one try: stream_bytes = b' ' frame = 1 while self.send_inst: #stream_bytes += self.connection.read(1024) #first = stream_bytes.find(b'\xff\xd8') #last = stream_bytes.find(b'\xff\xd9') ret, frame = cap.read() if True: image = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) #jpg = stream_bytes[first:last + 2] #stream_bytes = stream_bytes[last + 2:] #image = cv2.imdecode(np.frombuffer(jpg, dtype=np.uint8), cv2.IMREAD_GRAYSCALE) # select lower half of the image if image.any(): height, width = image.shape else: continue roi = image[int(height / 2):height, :] cv2.imshow('image', image) # reshape the roi image into a vector temp_array = roi.reshape(1, int(height / 2) * width).astype( np.float32) frame += 1 total_frame += 1 # get input from human driver for event in pygame.event.get(): if event.type == KEYDOWN: key_input = pygame.key.get_pressed() # complex orders if key_input[pygame.K_UP] and key_input[ pygame.K_RIGHT]: print("Forward Right") X = np.vstack((X, temp_array)) y = np.vstack((y, self.k[1])) saved_frame += 1 self.car.forward_right() elif key_input[pygame.K_UP] and key_input[ pygame.K_LEFT]: print("Forward Left") X = np.vstack((X, temp_array)) y = np.vstack((y, self.k[0])) saved_frame += 1 self.car.forward_left() elif key_input[pygame.K_DOWN] and key_input[ pygame.K_RIGHT]: print("Reverse Right") elif key_input[pygame.K_DOWN] and key_input[ pygame.K_LEFT]: print("Reverse Left") # simple orders elif key_input[pygame.K_UP]: print("Forward") saved_frame += 1 X = np.vstack((X, temp_array)) y = np.vstack((y, self.k[2])) self.car.forward() elif key_input[pygame.K_DOWN]: print("Reverse") self.car.backward() elif key_input[pygame.K_RIGHT]: print("Right") X = np.vstack((X, temp_array)) y = np.vstack((y, self.k[1])) saved_frame += 1 self.car.right() elif key_input[pygame.K_LEFT]: print("Left") X = np.vstack((X, temp_array)) y = np.vstack((y, self.k[0])) saved_frame += 1 self.car.left() elif key_input[pygame.K_x] or key_input[ pygame.K_q]: print("exit") self.send_inst = False self.car.stop() break else: self.car.stop() elif event.type == pygame.KEYUP: self.car.stop() #self.car.forward(50) pass if cv2.waitKey(1) & 0xFF == ord('q'): break # save data as a numpy file file_name = str(int(time.time())) directory = "training_data" if not os.path.exists(directory): os.makedirs(directory) try: np.savez(directory + '/' + file_name + '.npz', train=X, train_labels=y) except IOError as e: print(e) end = cv2.getTickCount() # calculate streaming duration print("Streaming duration: , %.2fs" % ((end - start) / cv2.getTickFrequency())) print(X.shape) print(y.shape) print("Total frame: ", total_frame) print("Saved frame: ", saved_frame) print("Dropped frame: ", total_frame - saved_frame) finally: pass