又鸽了好几个月,因为要准备考研,不过这个系列肯定会完成,现在也仅仅是一个初稿,以后还要整体完善一下的。这个小项目的设计思路大致分为三部分,数据采集、神经网络训练和加载模型三部分,本篇文章就讲一下怎样采集数据。

我制作了一个“8“字型的跑道,这种跑道同时具有”左转“、”右转”、“前进”等,相对复杂一些。

“8”字形跑道

样本采集的思路为按下某个按键时,同时记录当前画面,并对其添加该按键的标签,比如按下“左转“键时,记录下当前画面,并加入一个”左转“的标签。其他方向同理,这里只用三个标签,分别是:”前进“、”左转“、”右转“。而为了减少画面中的干扰,对画面进行一些处理,大致过程为:滤波-转为灰度-二值化,最终使用二值化后的图像作为样本。

接下来从各个部分对数据采集的过程进行讲解。

结合上一篇文章,遥控小车已经可以遥控行驶,只需要再调用摄像头采集前方跑道的图像就可以了。要遥控小车采集数据,需要在上一篇代码的基础上添加新的功能。

图像处理就要用到OpenCV来作为工具,那么第一步先调用摄像头,因为树莓派性能做实时处理还有些难度,所以将采集的图像像素进行压缩,具体代码如下:

import cv2self.cap = cv2.VideoCapture(0)   #调用video0self.cap.set(3,320)              #设置像素宽度self.cap.set(4,240)      #设置像素高度

这样,就会将摄像头采集的图像设置为320*240像素。而调用过后还需要读取摄像头,所以使用函数:

ret, cam = self.cap.read() 

摄像头画面

这个cam变量就可以看作摄像头,每次使用摄像头只需要调用cam就可以。在实际的操作中,摄像头中的画面基本只有下半部分是地面,上半部分没有什么用,所以只选取下半部分作为我们感兴趣的区域,这样既减少硬件的运算,又减少非地面部分的干扰。这里就更加简单了,只需要非常短的代码:

roi = cam[120:240, :]

roi画面

那么直接取得的画面该如何进行处理呢?在OpenCV中同样非常简单,只需要几行代码就可以,比如进行滤波操作,只需要一行代码:

gauss = cv2.GaussianBlur(roi,(5,5),0)

滤波处理图像

同理,灰度和二值化同样只需要两行代码:

gray = cv2.cvtColor(gauss,cv2.COLOR_RGB2GRAY)
ret,th3 = cv2.threshold(gray,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)

大津二值化图像

可以看到,这里调用的变量是环环相扣的,先调用cam获得图像,再对cam进行一系列的滤波,灰度,二值化的处理。(其实这里仅使用灰度图像就可以,我对比了使用灰度和二值化后图像分别进行训练,还是二值化过后的训练准确率要高一些,而且多一步操作显得高端一些嘛233)。

图像的本质是一个大号像素矩阵,其中每个像素的灰度颜色在0~255变化(本项目使用二值化图,所以只有0和255了),这里就要用到Python中的numpy模块了,numpy模块是专门用于矩阵运算的数学运算模块,使用numpy可以非常方便的将图像像素矩阵重塑成一维数组,而为什么要转化成一维数组呢?因为设计的神经网络很简单,而且使用OpenCV自己的ML函数,需要将所有的像素值输入到网络中去,作为输入层。

以下为采集程序的大概思路:

1.创建一个图像空矩阵(1行, 38400列)和一个标签空矩阵(1行,3列)。

image_array = np.zeros((1, 38400))
label_array = np.zeros((1, 3), 'float')

2.在小车行驶的过程中,将实时处理过的图像数据放置在一个临时矩阵中。

temp_array = th3.reshape(1,38400).astype(np.float32)

3.每当按下前进和左右键时,将临时矩阵中的数据存放在先前创建的空矩阵中,并赋予标签矩阵一个标签值。

image_array = np.vstack((image_array, temp_array))
label_array = np.vstack((label_array, self.k[0])) #k[0] k[1] k[2]

4.将每一次写入的图像矩阵和标签矩阵保存在train和train_label中。

train = image_array[1:, :]
train_labels = label_array[1:, :]

5.最后将数据文件保存。

这个程序有一个缺点就是不能实时存储并释放内存,每次占用内存超过300M以后就开始运行拖慢,大概是存入240个数据的时候,这时候需要一个停止程序的按键,将采集的数据从内存存入硬盘,重新运行采集程序。

我大概采集了4000个数据用于训练(算上之前不要的数据得有15000差不多),这个过程很枯燥,不过最后看到小车自己可以跑的时候很欣慰,这枯燥的时间并没有白费。

有一些细节问题没有细讲,因为实在是太细了,比如按键停止程序、按键保存图像、屏幕显示当前实时图像、标签创建、文件保存等等。我把整段程序在后面贴上来,这些点应该一看就明白了。

这部分就写到这里吧,下一部分准备写神经网络,可能又会鸽段时间,望请见谅~

往期文章:

丶冬沐:自动驾驶小车——(零)从零开始​zhuanlan.zhihu.com

丶冬沐:自动驾驶小车——(一)软件准备​zhuanlan.zhihu.com

丶冬沐:自动驾驶小车——(二)硬件准备​zhuanlan.zhihu.com

丶冬沐:自动驾驶小车——(三)小车!出发!​zhuanlan.zhihu.com

小车自动驾驶测试https://www.zhihu.com/video/1165309530451177472

import numpy as np
import cv2
import pygame
from pygame.locals import *
import time
import os
import  RPi.GPIO as GPIOclass CollectData(object):def __init__(self):# set IO and GPIO modGPIO.cleanup()# pygame initpygame.init()self.PWMA = 18self.AIN1 = 22self.AIN2 = 27self.PWMB = 23self.BIN1 = 25self.BIN2 = 24GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM)GPIO.setup(self.AIN2,GPIO.OUT)GPIO.setup(self.AIN1,GPIO.OUT)GPIO.setup(self.PWMA,GPIO.OUT)GPIO.setup(self.BIN1,GPIO.OUT)GPIO.setup(self.BIN2,GPIO.OUT)GPIO.setup(self.PWMB,GPIO.OUT)self.L_Motor=GPIO.PWM(self.PWMA,100)self.L_Motor.start(0)self.R_Motor=GPIO.PWM(self.PWMB,100)self.R_Motor.start(0)self.save_img = Trueself.cap = cv2.VideoCapture(0)  self.cap.set(3,320)self.cap.set(4,240)# create labelsself.k = np.zeros((3, 3), 'float')for i in range(3):self.k[i, i] = 1self.temp_label = np.zeros((1, 3), 'float')screen=pygame.display.set_mode((320,240))self.collect_image()def t_up(self,speedL,speedR):self.L_Motor.ChangeDutyCycle(speedL)GPIO.output(self.AIN2,False)#AIN2GPIO.output(self.AIN1,True) #AIN1self.R_Motor.ChangeDutyCycle(speedR)GPIO.output(self.BIN2,False)#BIN2GPIO.output(self.BIN1,True) #BIN1       def t_stop(self,t_time):self.L_Motor.ChangeDutyCycle(0)GPIO.output(self.AIN2,False)#AIN2GPIO.output(self.AIN1,False) #AIN1self.R_Motor.ChangeDutyCycle(0)GPIO.output(self.BIN2,False)#BIN2GPIO.output(self.BIN1,False) #BIN1time.sleep(t_time)def t_down(self,speedL,speedR):self.L_Motor.ChangeDutyCycle(speedL)GPIO.output(self.AIN2,True)#AIN2GPIO.output(self.AIN1,False) #AIN1self.R_Motor.ChangeDutyCycle(speedR)GPIO.output(self.BIN2,True)#BIN2GPIO.output(self.BIN1,False) #BIN1def t_left(self,speedL,speedR):self.L_Motor.ChangeDutyCycle(speedL)GPIO.output(self.AIN2,True)#AIN2GPIO.output(self.AIN1,False) #AIN1self.R_Motor.ChangeDutyCycle(speedR)GPIO.output(self.BIN2,False)#BIN2GPIO.output(self.BIN1,True) #BIN1def t_right(self,speedL,speedR):self.L_Motor.ChangeDutyCycle(speedL)GPIO.output(self.AIN2,False)#AIN2GPIO.output(self.AIN1,True) #AIN1self.R_Motor.ChangeDutyCycle(speedR)GPIO.output(self.BIN2,True)#BIN2GPIO.output(self.BIN1,False) #BIN1def collect_image(self):frame = 1saved_frame = 0total_frame = 0label_0 =0label_1 =1label_2 =2# collect images for trainingprint('Start collecting images...')e1 = cv2.getTickCount()image_array = np.zeros((1, 38400))label_array = np.zeros((1, 3), 'float')# collect cam framestry:while self.save_img:ret, cam = self.cap.read()    roi = th3[120:240, :]                            #image = cv2.imdecode(np.fromstring(cam,dtype=np.uint8),cv2.CV_LOAD_IMAGE_GRAYSCALE)gauss = cv2.GaussianBlur(roi,(5,5),0)gray = cv2.cvtColor(cam,cv2.COLOR_RGB2GRAY)#dst = cv2.Canny(gray,50,50)#ret,thresh1 = cv2.threshold(gray,90,255,cv2.THRESH_BINARY)  ret,th3 = cv2.threshold(gray,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)                #cv2.imwrite('./training_images/frame{:>05}.jpg'.format(frame),dst)#cv2.imshow('cam',cam)#cv2.imshow('dst',dst)#cv2.imshow('gray',gray)#cv2.imshow('roi',roi)#cv2.imshow('thresh1',thresh1)#cv2.imshow('th3',th3)temp_array = roi.reshape(1,38400).astype(np.float32)frame += 1          total_frame += 1if cv2.waitKey(1) & 0xFF == ord('l'): print("exit")  breakfor event in pygame.event.get():if event.type == KEYDOWN:keys = pygame.key.get_pressed()if keys[pygame.K_w]:                          image_array = np.vstack((image_array, temp_array))label_array = np.vstack((label_array, self.k[0]))saved_frame += 1self.t_up(100,100)cv2.imwrite('./training_images/{:1}_frame{:>05}.jpg'.format(label_0,saved_frame),th3)                          print("forward")print(saved_frame)elif keys[pygame.K_q]:image_array = np.vstack((image_array, temp_array))label_array = np.vstack((label_array, self.k[1]))saved_frame += 1self.t_up(50,100)cv2.imwrite('./training_images/{:1}_frame{:>05}.jpg'.format(label_1,saved_frame),th3)print("left")print(saved_frame)elif keys[pygame.K_e]:image_array = np.vstack((image_array, temp_array))label_array = np.vstack((label_array, self.k[2]))saved_frame += 1self.t_up(100,50)cv2.imwrite('./training_images/{:1}_frame{:>05}.jpg'.format(label_2,saved_frame),th3)print("right")print(saved_frame)elif keys[pygame.K_UP]:                                                     self.t_up(100,100)print("forward")elif keys[pygame.K_s]:self.t_down(100,100)                           print("back")elif keys[pygame.K_DOWN]:self.t_down(100,100)                           print("back")elif keys[pygame.K_LEFT]:self.t_up(50,100)print("left")elif keys[pygame.K_RIGHT]:self.t_up(100,50)                      print("right")                      elif keys[pygame.K_a]:self.t_left(100,100)print("turn left")elif keys[pygame.K_d]:self.t_right(100,100)print("turn right")elif keys[pygame.K_z]:self.t_down(50,100)print("left back")elif keys[pygame.K_c]:                          self.t_down(100,50)print("right back")elif keys[pygame.K_p]:print('exit')self.save_img = False                               breakelif event.type == KEYUP:self.t_stop(0)               print("stop")# save training images and labels train = image_array[1:, :]train_labels = label_array[1:, :]# save training data as a numpy filefile_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=train, train_labels=train_labels)except IOError as e:print(e)e2 = cv2.getTickCount()time0 = (e2 - e1) / cv2.getTickFrequency()print('Video duration:', time0)print('Streaming duration:', time0)print((train.shape))print((train_labels.shape))print('Total frame:', total_frame)print('Saved frame:', saved_frame)print('Dropped frame', total_frame - saved_frame)finally:                     self.cap.release()cv2.destroyAllWindows()    if __name__ == '__main__':CollectData()

vb.net label 不要自动换行_自动驾驶小车——(四)数据采集相关推荐

  1. 基于linux的智能小车_商汤首款原创机器人SenseRover X自动驾驶小车斩获Red Dot Award...

    创建于1955年的德国Red Dot Award红点产品设计奖,是世界三大设计奖之一,是设计品质的象征,每年7月份都会在德国埃森举办盛大的Red Dot产品设计奖颁奖典礼. 60多年来,从计算机时代, ...

  2. arduino控制小车转向_利用XECU和激光雷达快速搭建入门级的自动驾驶小车

    利用XECU和激光雷达快速搭建入门级的自动驾驶小车 1 简介 如果关注过我们之前的推文和视频演示,相信大家对我们的XECU应该已经很熟悉了.那么今天就向大家介绍一下,如何利用我们的XECU和激光雷达快 ...

  3. 树莓派智能小车python论文_基于树莓派的自动驾驶小车,利用树莓派和tensorflow实现小车在赛道的自动驾驶...

    self_drive 基于树莓派的人工智能自动驾驶小车 Artificial intelligence automatic driving car based on raspberry pie git ...

  4. Arduino毕业设计——基于Arduino+PID+AI的自动驾驶小车控制系统设计与实现(毕业论文+程序源码)——自动驾驶小车控制系统

    基于Arduino+PID+AI的自动驾驶小车控制系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于Arduino+PID+AI的自动驾驶小车控制系统设计与实现,文章末尾附有本毕业设计的 ...

  5. 球30家厂商角逐自动驾驶汽车 四年后1000万辆上路

    球30家厂商角逐自动驾驶汽车 四年后1000万辆上路 2016年04月23日01:13 分享 BI中文站 4月23日报道 当前,自动驾驶汽车领域的市场竞争进入白热化阶段. 调研公司CB Insight ...

  6. 亚马逊自动驾驶小车上线啦:才卖1700元,请叫它“强化学习玩具”

    晓查 发自 凹非寺  量子位 出品 | 公众号 QbitAI 原价399美元的自动驾驶小车,现在预订,只要249美元就能抱回家! 亚马逊的自动驾驶汽车DeepRacer上线啦,不过你并不能坐进去,它只 ...

  7. 湖南阿波罗智行L4级低速自动驾驶小车亮相 湖南自动驾驶“朋友圈”再添新成员

    10月16日,长沙国际会展中心,湖南阿波罗智行科技有限公司举行BOBO·GO低速自动驾驶产品推介会,由湖南湘江新区本土企业自主设计研发的首款L4级低速自动驾驶售卖小车BOBO·GO(波波购)正式亮相. ...

  8. 基于树莓派搭建自动驾驶小车;Donkey Car组装硬件DIY

    还是想朝着人工智能方向靠一靠,之前研究图像有关的分类.识别,还是觉得太枯燥了.后来结合自己接触较多的Unity引擎,发现有自动驾驶用Unreal或者Unity之类的游戏引擎进行虚拟训练.接着发现了微软 ...

  9. ADAS辅助驾驶_自动驾驶_技术点列表

    0 ADAS 汽车电子及ADAS安全部分相关测试标准 汽车总线特性简述 短距离车间通信V2X简述 先进驾驶辅助系统ADAS接口协议ADASIS v2简介 ADAS在车载导航设备上的应用 先进驾驶辅助系 ...

最新文章

  1. INSTALL_FAILED_INVALID_APK
  2. 转:TestLink1.9.3测试用例:Excel转换XML工具二实现代码
  3. 鼠标划过表格行变色效果JS
  4. Flutter之导url_launcher包提示 A dependency may only have one source.
  5. 用百度AI的OCR文字识别结合PHP实现了图片的文字识别功能
  6. 修复Cydia红字 flAbsPath on /var/lib/dpkg/status failed
  7. 批量重命名文件夹中的文件(python)
  8. 安装 配置BlackBerry Push Service SDK v1.1.0
  9. 爬虫抓包问题全面分析
  10. 阿里云服务器为何价格比较贵?
  11. Matlab之绘制瀑布图
  12. Primeng PrimeFlex 的使用总结 (Angular 10)
  13. 独立同分布的大样本OLS回归
  14. python word转pdf linux_Linux下使用LibreOffice+python将doc/docx/wps格式的文档转成html/txt/docx等格式...
  15. java doc 合并单元格_AsposeWords操作表格合并单元格
  16. Linux系统安全和应用
  17. WindowsAPI自绘按钮
  18. 【解决方案】企业远程行政会议协同办公视频会议EasyRTC如何实现远程办公?
  19. The method xxx of type xxx must override a superclass method
  20. 微信转化接口(2018-06-14)

热门文章

  1. 【iOS QR Code】集成ZXingWidget(XCode Version 4.5.2,iOS 6.0 SDK)
  2. GNU make manual 翻译(三十)
  3. 《并行计算的编程模型》一1.10 MPI开发心得
  4. 协议 - 收藏集 - 掘金
  5. listview复用机制研究
  6. C#中反射的使用(How to use reflect in CSharp)(3)Emit的使用
  7. 交换与路由第一章 网络技术基础
  8. GitHub 在 “tar” 和 npm CLI 中发现7个高危的代码执行漏洞
  9. 你敢信?FBI 的190万条恐怖分子监控名单竟无密码保护且不慎遭暴露
  10. Flutter实战5 -- 天气查询APP重构之状态管理(ScopedModel)