Hello there
I am building a OpenCv2 self driving RC car and want to train it With CNN (neural Network) first.The camera input is from a wireless Ip camera stream.The car has to move in different directions by tagging each frame with a control. eg:- left, right, forward and backward.
The problem is that when I execute the code I get the following error:-
Start collecting images... init done opengl support available doneu Traceback (most recent call last): File "collect_training_data.py", line 159, in <module> CollectTrainingData() File "collect_training_data.py", line 30, in __init__ self.collect_image() File "collect_training_data.py", line 66, in collect_image temp_array = roi.reshape(1, 38400).astype(np.float32) ValueError: total size of new array must be unchanged Segmentation fault (core dumped)
Here the Code:-
__author__ = 'zhengwang'
import urllib2 import numpy as np import cv2 import serial import pygame from pygame.locals import *
class CollectTrainingData(object):
def __init__(self):
self.stream = urllib2.Request('http://192.168.42.129:8080/video')
self.response = urllib2.urlopen(self.stream)
self.bytes = bytes()
# connect to a seral port
self.ser = serial.Serial('/dev/ttyUSB0', 115200, timeout=1)
self.send_inst = True
# create labels
self.k = np.zeros((4, 4), 'float')
for i in range(4):
self.k[i, i] = 1
self.temp_label = np.zeros((1, 4), 'float')
pygame.init()
self.collect_image()
def collect_image(self):
saved_frame = 0
total_frame = 0
# collect images for training
print('Start collecting images...')
e1 = cv2.getTickCount()
image_array = np.zeros((1, 38400))
label_array = np.zeros((1, 4), 'float')
# stream video frames one by one
try:
self.bytes = ' '
frame = 1
while self.send_inst:
self.bytes += self.response.read(1024)
first = self.bytes.find('\xff\xd8')
last = self.bytes.find('\xff\xd9')
if first != -1 and last != -1:
jpg = self.bytes[first:last + 2]
self.bytes = self.bytes[last + 2:]
image = cv2.imdecode(np.fromstring(jpg, dtype=np.uint8), cv2.CV_LOAD_IMAGE_GRAYSCALE)
# select lower half of the image
roi = image[120:240, :]
# save streamed images
cv2.imwrite('training_images/frame{:>05}.jpg'.format(frame), image)
#cv2.imshow('roi_image', roi)
cv2.imshow('image', image)
# reshape the roi image into one row array
temp_array = roi.reshape(1, 38400).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")
image_array = np.vstack((image_array, temp_array))
label_array = np.vstack((label_array, self.k[1]))
saved_frame += 1
self.ser.write(chr(6))
elif key_input[pygame.K_UP] and key_input[pygame.K_LEFT]:
print("Forward Left")
image_array = np.vstack((image_array, temp_array))
label_array = np.vstack((label_array, self.k[0]))
saved_frame += 1
self.ser.write(chr(7))
elif key_input[pygame.K_DOWN] and key_input[pygame.K_RIGHT]:
print("Reverse Right")
self.ser.write(chr(8))
elif key_input[pygame.K_DOWN] and key_input[pygame.K_LEFT]:
print("Reverse Left")
self.ser.write(chr(9))
# simple orders
elif key_input[pygame.K_UP]:
print("Forward")
saved_frame += 1
image_array = np.vstack((image_array, temp_array))
label_array = np.vstack((label_array, self.k[2]))
self.ser.write(chr(1))
elif key_input[pygame.K_DOWN]:
print("Reverse")
saved_frame += 1
image_array = np.vstack((image_array, temp_array))
label_array = np.vstack((label_array, self.k[3]))
self.ser.write(chr(2))
elif key_input[pygame.K_RIGHT]:
print("Right")
image_array = np.vstack((image_array, temp_array))
label_array = np.vstack((label_array, self.k[1]))
saved_frame += 1
self.ser.write(chr(3))
elif key_input[pygame.K_LEFT]:
print("Left")
image_array = np.vstack((image_array, temp_array))
label_array = np.vstack((label_array, self.k[0]))
saved_frame += 1
self.ser.write(chr(4))
elif key_input[pygame.K_x] or key_input[pygame.K_q]:
print('exit')
self.send_inst = False
self.ser.write(chr(0))
break
elif event.type == pygame.KEYUP:
self.ser.write(chr(0))
# save training images and labels
train = image_array[1:, :]
train_labels = label_array[1:, :]
# save training data as a numpy file
np.savez('training_data_temp/test08.npz', train=train, train_labels=train_labels)
e2 = cv2.getTickCount()
# calculate streaming duration
time0 = (e2 - e1) / cv2.getTickFrequency()
print('Streaming duration:'), time0
print(tra.shape)
print(train_labels.shape)
print('Total frame:'), total_frame
print('Saved frame:'), saved_frame
print('Dropped frame'), total_frame - saved_frame
finally:
print 'doneu'
if __name__ == '__main__': CollectTrainingData()