版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第1章图像处理基础微课视频OpenCV自动驾驶小车内容安排图像处理的基本概念01.图像处理基本操作02.图像卷积和滤波03.综合案例应用:基于OpenCV的自动驾驶小车04.PART01图像处理的基本概念模拟图像是指通过某种光、电物理量的强弱变化来记录亮度信息的图像,例如纸质照片、老式电视机播放的画面等。模拟图像最大的特点就是其物理量的变化是连续的。模拟图像不能直接用计算机来处理,必须首先转化为数字图像。模拟图像图像处理的基本概念01图像数字化就是把模拟图像分割成一个个称为像素的小区域,这个过程称为采样。每个像素的亮度值用一个整数来表示,这个过程称为量化。数字图像图像是人类视觉的基础,是自然景物的客观反映,是人类认识世界和人类本身的重要源泉。“图”是物体反射或透射光的分布,“像“是人的视觉系统所接受的图在人脑中所形成的印象或认识,照片、绘画、剪贴画、地图、书法作品、手写汉字、传真、卫星云图、影视画面、X光片、脑电图、心电图等都是图像。图像是客观对象的一种相似性的、生动性的描述或写真,是人类社会活动中最常用的信息载体。或者说图像是客观对象的一种表示,它包含了被描述对象的有关信息。它是人们最主要的信息源。据统计,一个人获取的信息大约有75%来自视觉图像处理的基本概念01
模拟图像数字化图像处理的基本概念01数字图像常见类型二值图像只有两个值:0或1单通道灰度图像每个像素用8个比特来表示,每个像素有种可能,因此其灰度取值范围是0~255自然界中的绝大部分彩色都可以由三种基色按一定比例混合得到,而每种基色用一个通道表示,合起来称为三通道图像。典型的三通道图像分别对应红(Red)、绿(Green)、蓝(Blue)三种颜色,每种颜色取值范围都在0~255之间。图像处理的基本概念01数字图像常见类型四通道彩色图像图像处理的基本概念01图像去噪图像去雾低光照增强底层处理:基于轮廓、纹理、颜色等底层特征对图像进行滤波和增强。应用方向图像处理的基本概念01目标检测语义分割关键点检测中层处理:基于物体的局部特征对图像进行建模与表达。应用方向图像处理的基本概念01人体属性分析手势识别高层处理:基于图像的完整结构和时空内容对图像进行理解应用方向PART02图像处理基本操作PILMatplotlibOpenCV图像处理基本操作
02图像处理:OpenCV提供了一系列用于处理图像的函数和算法,包括图像滤波、图像变换、图像分割、形态学操作等。特征检测与描述:OpenCV提供了用于检测和描述图像中的特征的函数和算法,例如SIFT、SURF、ORB、FAST等。目标检测与识别:OpenCV提供了用于目标检测和识别的函数和算法,例如HaarCascade分类器、HOG+SVM分类器等。视频处理:OpenCV提供了一些用于处理视频的函数和算法,包括视频捕捉、视频压缩、视频分析等。机器学习:OpenCV提供了一些用于机器学习的函数和算法,例如支持向量机、神经网络、K均值聚类等。OpenCV是一个开源跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和MacOS操作系统上。提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。OpenCV用C++语言编写,它具有C++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和MacOS,OpenCV主要倾向于实时视觉应用,并在可用时利用MMX和SSE指令,如今也提供对于C#、Ch、Ruby,GO的支持。图像处理基本操作----安装OpenCV02本书将下载和使用opencv-python库,对应OpenCV的Python版本,具体安装命令如下:pipinstallopencv-python如果下载速度比较慢可以使用国内镜像源(如百度镜像、清华大学镜像等)来加速下载(这个方法也适用于其他Python库的安装),命令如下:pipinstallopencv-python-i/pypi/simple安装OpenCV图像处理基本操作----图像读取、保存和可视化02#demo1.py#导入OpenCV库importcv2#读取图像img=cv2.imread('./imgs/whale.jpg',cv2.IMREAD_UNCHANGED)#查看图像尺寸print(img.shape)img=cv2.imread('./imgs/whale.jpg',cv2.IMREAD_GRAYSCALE)print(img.shape)图像读取(demo/demo1.py)(480,815,3)(480,815)
输出为:02importcv2img=cv2.imread('./imgs/pepper.png')#读取图像cv2.imwrite('pepper.jpg',img)#保存为JPEG图像图像保存(demo/demo2.py)(a)PNG格式(106KB)(b)JPEG格式(22KB)图像压缩保存(PNGvsJPEG)图像处理基本操作----图像读取、保存和可视化02#图像压缩保存cv2.imwrite('pepper_80.jpg',img,[cv2.IMWRITE_JPEG_QUALITY,80])cv2.imwrite('pepper_5.jpg',img,[cv2.IMWRITE_JPEG_QUALITY,5])图像保存(demo/demo3.py)图像处理基本操作----图像读取、保存和可视化02importcv2#读取图像img=cv2.imread('./imgs/girl.jpg')#定义可视化窗口dWindow('window',cv2.WINDOW_NORMAL)#更改窗口的大小cv2.resizeWindow('window',640,480)#展示可视化窗口cv2.imshow('window',img)#等待按键(按任意键退出)key=cv2.waitKey(0)#关闭所有窗口cv2.destroyAllWindows()图像可视化(demo/demo4.py)图像处理基本操作----图像读取、保存和可视化02图像可视化(demo/demo4.py)图像处理基本操作----图像读取、保存和可视化02#如果使用Notebook中的图片可视化%matplotlibinlineimportmatplotlibimportmatplotlib.pyplotaspltimportmatplotlib.imageasmpimg#设置显示中文importmatplotlib.font_managerasfont_managerfont=font_manager.FontProperties(fname='./ziti/FZSYJW.ttf',size=16)#创建字体对象#采用matplotlib展示图片image=mpimg.imread('./imgs/girl.jpg')plt.imshow(image)plt.xticks([])plt.yticks([])#plt.title("显示结果",fontproperties=font)plt.xlabel("处理后",fontproperties=font)图像可视化(demo/demo4.py)图像处理基本操作----图像读取、保存和可视化02图像可视化(demo/demo4.py)图像处理基本操作----图像读取、保存和可视化02importcv2#读取图像img=cv2.imread('./imgs/cycle.jpg')#修改图像部分区域像素值img[100:200,100:300]=[0,0,0]#保存结果cv2.imwrite('result.jpg',img)直接操作像素值(demo/demo5.py)图像处理基本操作----像素操作02importcv2#按照单通道方式读取图像img=cv2.imread('./imgs/beans.png',cv2.IMREAD_GRAYSCALE)#图像和标量相加img=cv2.add(img,80)#保存结果cv2.imwrite('result.jpg',img)图像亮度调整(demo/demo6.py)图像处理基本操作----像素操作02importcv2#读取图像img=cv2.imread('./imgs/cycle.jpg')#三通道彩色转换为单通道灰度图img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#保存结果cv2.imwrite('result.jpg',img)彩色图与灰度图互转(demo/demo7.py)图像处理基本操作----图像转换02importcv2#读取图像img=cv2.imread('./imgs/elephant.jpg',cv2.IMREAD_GRAYSCALE)#单通道灰度图转换为三通道图像img=cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)#保存结果cv2.imwrite('result.jpg',img)彩色图与灰度图互转(demo/demo8.py)图像处理基本操作----图像转换02img=cv2.cvtColor(img,cv2.COLOR)#四通道图像转灰度图像img=cv2.cvtColor(img,cv2.COLOR_RGBA2BGR)#四通道图像转三通道图像彩色图与灰度图互转常用的彩色图像和灰度图像之间的转换图像处理基本操作----图像转换img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)#BGR转RGBBGR转RGB02importcv2importnumpyasnp#使用numpy创建一个元素值均为50的二维矩阵img=np.ones((200,100))*50#转换成uint8类型img=np.uint8(img)#保存结果cv2.imwrite('result.jpg',img)二值化(demo/demo9.py)图像处理基本操作----图像转换02importcv2#读取图像img=cv2.imread('./imgs/whale_gray.jpg',cv2.IMREAD_GRAYSCALE)#二值化thr=127_,img=cv2.threshold(img,thr,255,cv2.THRESH_BINARY)#保存结果cv2.imwrite('result.jpg',img)图像缩放(demo/demo10.py)图像处理基本操作----图像转换02importcv2#读取图像img=cv2.imread('./imgs/tajmahal.jpg')print(img.shape)#缩放图像height,width,_=img.shapenew_height=int(height/2)new_width=int(width/2)img=cv2.resize(img,(new_width,new_height),cv2.INTER_LINEAR)print(img.shape)#保存结果cv2.imwrite('result.jpg',img)图像缩放(demo/demo11.py)图像处理基本操作----图像缩放02importcv2#读取图像img=cv2.imread('./imgs/eagle.jpg')#定义裁剪区域x,y,w,h=1089,1000,1000,1800#裁剪并保存图片crop=img[y:y+h,x:x+w]#保存结果cv2.imwrite('result.jpg',crop)图像裁剪(demo/demo12.py)图像处理基本操作----图像裁剪02importcv2#读取图像img=cv2.imread('./imgs/fish.jpg')#垂直翻转img_vertical=cv2.flip(img,0)cv2.imwrite('vertical.jpg',img_vertical)#水平翻转img_horizontal=cv2.flip(img,1)cv2.imwrite('horizontal.jpg',img_horizontal)翻转(demo/demo13.py)图像处理基本操作----翻转与旋转02importcv2#读取图像img=cv2.imread('./imgs/fish.jpg')#垂直翻转img_vertical=cv2.flip(img,0)cv2.imwrite('vertical.jpg',img_vertical)#水平翻转img_horizontal=cv2.flip(img,1)cv2.imwrite('horizontal.jpg',img_horizontal)旋转(demo/demo14.py)图像处理基本操作----翻转与旋转PART03图像卷积和滤波03图像卷积和滤波----线性滤波与卷积(1)滤波器的大小应该是奇数,这样它才有一个中心点,例如3×3,5×5或7×7。(2)滤波器矩阵所有的元素之和一般要等于1,这是为了保证滤波前后图像的整体亮度保持不变。(3)对于滤波后的结构,可能会出现负数或者大于255的数值,这种情况下,可以直接截断其值,使其保持在0~255之间。线性滤波是图像处理中最基本的方法之一,以二维滤波器为例,对于图像上的每一个像素点,计算它的邻域像素和滤波器矩阵的对应元素的乘积,然后加起来,作为该像素位置的值03图像卷积和滤波----常见卷积核importcv2#读取图像img=cv2.imread('./imgs/fish.jpg')#垂直翻转img_vertical=cv2.flip(img,0)cv2.imwrite('vertical.jpg',img_vertical)#水平翻转img_horizontal=cv2.flip(img,1)cv2.imwrite('horizontal.jpg',img_horizontal)一个简单的卷积运算(demo/demo15.py)03图像卷积和滤波----常见卷积核importcv2importnumpyasnp#读取图像img=cv2.imread("./imgs/pepper.png")#锐化卷积核kernel=np.array(([-1,-1,-1],[-1,9,-1],[-1,-1,-1]))#执行卷积dst=cv2.filter2D(img,-1,kernel)cv2.imwrite("result.jpg",dst)图像锐化(demo/demo16.py)03图像卷积和滤波----常见卷积核importcv2importnumpyasnp#读取图像img=cv2.imread("./imgs/pepper.png")#边缘检测卷积核kernel=np.array(([-1,-1,-1],[-1,8,-1],[-1,-1,-1]))#执行卷积dst=cv2.filter2D(img,-1,kernel)cv2.imwrite("result.jpg",dst)边缘检测(demo/demo17.py)03图像卷积和滤波----常见卷积核importcv2importnumpyasnp#读取图像img=cv2.imread("./imgs/pepper.png")#均值模糊卷积核kernel=np.array(([1/9,1/9,1/9],[1/9,1/9,1/9],[1/9,1/9,1/9]))#执行卷积dst=cv2.filter2D(img,-1,kernel)cv2.imwrite("result.jpg",dst)均值模糊(demo/demo18.py)03图像卷积和滤波----常见卷积核importcv2importnumpyasnp#读取图像img=cv2.imread("./imgs/pepper.png")#高斯模糊卷积核kernel=(np.array(([1,4,7,4,1],[4,16,26,16,4],[7,26,41,26,7],[4,16,26,16,4],[1,4,7,4,1],))/273.0)#执行卷积dst=cv2.filter2D(img,-1,kernel)cv2.imwrite("result.jpg",dst)高斯模糊(demo/demo19.py)PART04综合案例应用:基于OpenCV的自动驾驶小车04基于OpenCV的自动驾驶小车----任务概述自动驾驶汽车能够减少驾驶疲劳、缓解道路拥堵、提升交通安全,为用户提供更便利的出行体验本节内容将基于OpenCV的图像处理算法来实现一款简易的自动驾驶小车使用纯视觉方案实现一个能够在规定道路上行驶的自动驾驶小车,通过行车记录仪拍摄路面图像,实时分析并规划车辆转向角度本书使用仿真平台来实现。当然,如果有条件的话,可以将相关算法部署到真实的硬件平台上(例如树莓派小车)进行实战演练任务概述04基于OpenCV的自动驾驶小车----安装仿真平台下载并解压后内容模拟器主界面从本书配套资源网站上下载模拟器是下载后就可以直接在Windows平台在模拟器主界面左侧是相关设置菜单,可以设置不同的运行模式、不同的观察视角等。右侧是模拟器提供的各个赛道下载模拟器(DonkeySimWin.zip)04基于OpenCV的自动驾驶小车----安装仿真平台下载并解压后内容先设置左侧的菜单,在paceCar处勾选manualDriving,可以手动操控小车在右侧赛道上,本章选择最简单的赛道generated_road,因为这个赛道没有障碍物,上手比较容易。单击generated_road,进入具体的场景W键表示前进,A键表示左转,D键表示右转,S键表示后退,油门(W和S键)和转向角度(A和D键)模拟器参数设置generated_road赛道运行界面04基于OpenCV的自动驾驶小车----Python控制模拟器首先在Windows上安装git工具通过Python代码来控制模拟器pipinstallsetuptools==65.5.0-i/pypi/simplepipinstall--userwheel==0.38.0-i/pypi/simplepipinstallgit+/binghai228/gym-donkeycar接下来使用下面的命令安装仿真平台的驱动库04基于OpenCV的自动驾驶小车----Python控制模拟器#导入游戏引擎库importgymimportgym_donkeycarimportnumpyasnpimportcv2#设置模拟器环境,选择赛道env=gym.make("donkey-generated-roads-v0")#重置当前场景obv=env.reset()Python代码实现小车的控制(opencv_drive/drive_test.py)04基于OpenCV的自动驾驶小车----Python控制模拟器#运行100帧fortinrange(100):#定义控制动作
action=np.array([0.3,0.5])#0.3表示转向,0.5表示油门
#执行动作
img,reward,done,info=env.step(action)#取一张图像保存
ift==20:img=cv2.cvtColor(img,cv2.COLOR_RGB2BGR)cv2.imwrite('test.jpg',img)#运行完以后重置当前场景obv=env.reset()Python代码实现小车的控制(opencv_drive/drive_test.py)04基于OpenCV的自动驾驶小车----车道线检测感知部分主要通过车道线检测来实现动作规划则通过操控转向角度来实现简化控制变量,对于油门值,可以在运行时保持低匀速,这样只需要控制转向角度感知和动作规划基本思路图像处理领域,针对特定颜色提取问题,使用较多的是HSV颜色空间,比RGB空间更接近人类对色彩的感知经验,可以非常直观地表达色彩的色调、鲜艳程度和明暗程度HSV表达彩色图像的方式由三个部分组成:色调(Hue)、饱和度(Saturation)、明度(Value)色调用角度度量表示,取值范围为0~360,在OpenCV中色调取值范围是[0~180]要提取出黄色线,可以将色调范围控制在30~90,在OpenCV中黄色范围需要缩小1倍,即[15~45]检测白色车道线也是采用类似的原理基于HSV空间的特定颜色区域提取04基于OpenCV的自动驾驶小车----车道线检测importcv2importnumpyasnpimportmath#----------------------1.基于HSV空间的特定颜色区域提取------------------#读取图像并转换到HSV空间frame=cv2.imread('test.jpg')hsv=cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)#黄色线检测lower_blue=np.array([15,40,40])upper_blue=np.array([45,255,255])yellow_mask=cv2.inRange(hsv,lower_blue,upper_blue)cv2.imwrite('yellow_mask.jpg',yellow_mask)基于HSV空间的特定颜色区域提取(opencv_drive/img_analysis.py)04基于OpenCV的自动驾驶小车----车道线检测#白色线检测lower_blue=np.array([0,0,200])upper_blue=np.array([180,30,255])white_mask=cv2.inRange(hsv,lower_blue,upper_blue)#保存中间结果cv2.imwrite('yellow_mask.jpg',yellow_mask)cv2.imwrite('white_mask.jpg',white_mask)基于HSV空间的特定颜色区域提取(opencv_drive/img_analysis.py)04基于OpenCV的自动驾驶小车----车道线检测#黄色线边缘提取yellow_edge=cv2.Canny(yellow_mask,200,400)#白色线边缘提取whitewhite_edge=cv2.Canny(white_mask,200,400)基于高斯模糊的噪声滤除(1)使用高斯滤波器,以平滑图像、滤除噪声;(2)计算图像中每个像素点的梯度强度和方向;(3)应用非极大值抑制(Non-MaximumSuppression,NMS),消除边缘检测带来的杂散响应;(4)应用双阈值检测来确定真实的和潜在的边缘;(5)抑制孤立的弱边缘;Canny边缘检测(从左至右:原图、白色边缘、黄色边缘)04基于OpenCV的自动驾驶小车----车道线检测frame=cv2.imread('test.jpg')frame=cv2.GaussianBlur(frame,(5,5),1)#添加高斯模糊代码基于Canny算子的边缘轮廓提取通过OpenCV提供的现成的高斯模糊函数cv2.GaussianBlur()来实现,在读入图像后立即用高斯模糊操作一下,高斯核大小选择5×5,然后再进行特定颜色提取高斯模糊后特定颜色区域提取(从左至右:原图、白色提取区域、黄色提取区域)04基于OpenCV的自动驾驶小车----车道线检测#----------------------------4.感兴趣区域提取----------------------------defregion_of_interest(edges,color="yellow"):height,width=edges.shapemask=np.zeros_like(edges)#定义感兴趣区域掩码轮廓
ifcolor=='yellow':polygon=np.array([[(0,height*1/2),(width*1/2,height*1/2),(width*1/2,height),(0,height)]],32)else:polygon=np.array([[(width*1/2,height*1/2),(width,height*1/2),(width,height),(width*1/2,height)]],32)感兴趣区域提取很多情况下只需要对部分感兴趣区域(RegionOfInterest,ROI)进行处理。正常情况下,黄色车道线位于图像左下角,白色车道线位于图像右下角,而图像中其他区域并不需要处理04基于OpenCV的自动驾驶小车----车道线检测#填充感兴趣区域掩码
cv2.fillPoly(mask,polygon,255)#提取感兴趣区域
croped_edge=cv2.bitwise_and(edges,mask)returncroped_edge#黄色车道线感兴趣区域提取yellow_croped=region_of_interest(yellow_edge,color="yellow")cv2.imwrite("yellow_croped.jpg",yellow_croped)#白色车道线感兴趣区域提取white_croped=region_of_interest(white_edge,color="white")cv2.imwrite("white_croped.jpg",white_croped)感兴趣区域提取很多情况下只需要对部分感兴趣区域(RegionOfInterest,ROI)进行处理。正常情况下,黄色车道线位于图像左下角,白色车道线位于图像右下角,而图像中其他区域并不需要处理04基于OpenCV的自动驾驶小车----车道线检测感兴趣区域提取很多情况下只需要对部分感兴趣区域(RegionOfInterest,ROI)进行处理。正常情况下,黄色车道线位于图像左下角,白色车道线位于图像右下角,而图像中其他区域并不需要处理感兴趣区域提取(从左至右:原图、白色边缘、黄色边缘)04基于OpenCV的自动驾驶小车----车道线检测可以设置两个坐标系,左边的坐标系表示的是值,对应图像空间(ImageSpace),右边的坐标系表示的是的值,对应参数空间(ParameterSpace),即直线的参数值基于霍夫变换的线段检测霍夫变换(HoughTransform,HT),可以检测图像中的直线、圆等几何图形防止(m,b)取值范围太大,在直线的表示方面可以改用的规范式代替一般直线表达式,参数空间由此变成04基于OpenCV的自动驾驶小车----车道线检测#----------------------------5.基于霍夫变换的直线检测----------------------------rho=1#距离精度:1像素angle=np.pi/180#角度精度:1度min_thr=10#最少投票数white_lines=cv2.HoughLinesP(white_croped,rho,angle,min_thr,np.array([]),minLineLength=8,maxLineGap=8)yellow_lines=cv2.HoughLinesP(yellow_croped,rho,angle,min_thr,np.array([]),minLineLength=8,maxLineGap=8)#输出查看返回的线段print(white_lines)基于霍夫变换的线段检测OpenCV已经封装好了基于霍夫变换的直线线段检测方法cv2.HoughLinesP()输出结果为[[[11287142117]][[9469134119]][[11185137111]][[10784132115]][[11998134117]]]04基于OpenCV的自动驾驶小车----车道线检测#--------------------------------6.小线段聚类------------------------------------defmake_points(frame,line):'''根据直线斜率和截距计算指定高度处的起始坐标'''height,width,_=frame.shapeslope,intercept=liney1=heighty2=int(y1*1/2)x1=int((y1-intercept)/slope)x2=int((y2-intercept)/slope)return[x1,y1,x2,y2]defaverage_lines(frame,lines,direction="left"):"""对小线段进行聚类"""lane_line=[]iflinesisNone:print(direction+"没有检测到线段")returnlane_linefits=[]基于霍夫变换的线段检测对检测出来的小线段做一下聚类和平均,最终生成两条线段04基于OpenCV的自动驾驶小车----车道线检测#计算每条小线段的斜率和截距forlineinlines:forx1,y1,x2,y2inline:#最小二乘法拟合fit=np.polyfit((x1,x2),(y1,y2),1)slope=fit[0]#斜率intercept=fit[1]#截距ifdirection=="left"andslope<0:fits.append((slope,intercept))elifdirection=="right"andslope>0:fits.append((slope,intercept))#计算所有小线段的平均斜率和截距iflen(fits)>0:fit_average=np.average(fits,axis=0)lane_line=make_points(frame,fit_average)returnlane_line基于霍夫变换的线段检测对检测出来的小线段做一下聚类和平均,最终生成两条线段04基于OpenCV的自动驾驶小车----车道线检测#聚合线段yellow_lane=average_lines(frame,yellow_lines,direction="left")white_lane=average_lines(frame,white_lines,direction="right")print(white_lane)基于霍夫变换的线段检测对检测出来的小线段做一下聚类和平均,最终生成两条线段在计算每条车道线的起始坐标时,分别令起始点的纵坐标然后计算对应的横坐标和的值,得到代表线段的起始点坐标04基于OpenCV的自动驾驶小车----车道线检测#----------------------------7.可视化显示检测结果-------------------------------defdisplay_line(frame,line,line_color=(0,0,255),line_width=3):'''在原图上合成展示线段'''line_img=np.zeros_like(frame)x1,y1,x2,y2=linecv2.line(line_img,(x1,y1),(x2,y2),line_color,line_width)line_img=cv2.addWeighted(frame,0.8,line_img,1,1)#图像合成方式显示检测结果returnline_img#显示检测结果img_yellow=display_line(frame,yellow_lane,line_color=(0,0,255),line_width=3)img_white=display_line(frame,white_lane,line_color=(0,0,255),line_width=3)cv2.imwrite("img_yellow.jpg",img_yellow)cv2.imwrite("img_white.jpg",img_white)基于霍夫变换的线段检测04基于OpenCV的自动驾驶小车----车道线检测基于霍夫变换的线段检测车道线检测结果
(从左至右依次为原图、白色线检测结果和黄色线检测结果)04基于OpenCV的自动驾驶小车----动作控制(1)正常检测到2条车道线:这种情况一般是直线车道且车辆稳定运行在车道线内,这时候只需要根据检测出的两条车道线微调角度即可;(2)检测出1条车道线:这种情况在转弯处容易出现,或者在小车开始大范围偏离时出现,这时候的策略应该是向已经检测到的这条车道线方向快速靠近;(3)检测不到车道线:这种情况说明已经失控并冲出了车道,应该立即停下小车。车道线检测结果主要有三种情况04基于OpenCV的自动驾驶小车----动作控制#-------------------------8.动作控制(转向角计算)-------------------------------defcompute_steer_angle(yellow_lane,white_lane,height,width):x_offset=0y_offset=int(height/2)#分情况计算横纵偏移值iflen(yellow_lane)>0andlen(white_lane)>0:#检测到2条线_,_,left_x2,_=yellow_lane_,_,right_x2,_=white_lanemid=int(width/2)x_offset=(left_x2+right_x2)/2-mideliflen(yellow_lane)>0:#只检测到黄色车道线x1,_,x2,_=yellow_lanex_offset=x2-x1eliflen(white_lane)>0:#只检测到白色车道线x1,_,x2,_=white_lanex_offset=x2-x1else:#都没检测到print("检测不到车道线,即将停止")return-1三种动作控制04基于OpenCV的自动驾驶小车----动作控制#计算最终转向角度angle_to_mid_radian=math.atan(x_offset/y_offset)angle_to_mid_deg=int(angle_to_mid_radian*180.0/math.pi)#转换为角度steering_angle=angle_to_mid_deg/45.0#归一化到区间returnsteering_angle#计算转向角height,width,_=frame.shapesteering_angle=compute_steer_angle(yellow_lane,white_lane,height,width)print(steering_angle)三种动作控制最终输出-0.2444444444444444404基于OpenCV的自动驾驶小车importcv2importnumpyasnpimportgymimportgym_donkeycar#导入自定义库fromimg_analysisimportregion_of_interest,average_lines,compute_steer_angle#设置模拟器环境env=gym.make("donkey-generated-roads-v0")obv=env.reset()#开始启动,并获取首帧图像action=np.array([0,0.2])#动作控制,第1个参数为转向值,第2个参数为油门值frame,reward,done,info=env.step(action)完整代码如下(opencv_drive/auto_drive.py)04基于OpenCV的自动驾驶小车#运行2000次动作fortinrange(2000):#高斯滤波去噪frame=cv2.GaussianBlur(frame,(5,5),1)#转换图像到HSV空间height,width,_=frame.shapehsv=cv2.cvtColor(frame,cv2.COLOR_RGB2HSV)#特定颜色区域检测lower_blue=np.array([15,40,40])upper_blue=np.array([45,255,255])yellow_mask=cv2.inRange(hsv,lower_blue,upper_blue)lower_blue=np.array([0,0,200])upper_blue=np.array([180,30,255])white_mask=cv2.inRange(hsv,lower_blue,upper_blue)完整代码如下(opencv_drive/auto_drive.py)04基于OpenCV的自动驾驶小车#边缘检测yellow_edge=cv2.Canny(yellow_mask,200,400)white_edge=cv2.Canny(white_mask,200,400)#感兴趣区域提取yellow_croped=region_of_interest(yellow_edge,color="yellow")white_croped=region_of_interest(white_edge,color="white")#直线检测rho=1#距离精度:1像素angle=np.pi/180#角度精度:1度min_thr=10#最少投票数white_lines=cv2.HoughLinesP(white_croped,rho,angle,min_thr,np.array([]),minLineLength=8,maxLineGap=8)yellow_lines=cv2.HoughLinesP(yellow_croped,rho,angle,min_thr,np.array([]),minLineLength=8,maxLineGap=8)完整代码如下(opencv_drive/auto_drive.py)04基于OpenCV的自动驾驶小车#小线段聚类yellow_lane=average_lines(frame,yellow_lines,direction="left")white_lane=average_lines(frame,white_lines,direction="right")#计算转向角steering_angle=compute_steer_angle(yellow_lane,white_lane,height,width)print(steering_angle)action=np.array([steering_angle,0.2])#油门值恒定#执行动作并重新获取图像frame,reward,done,info=env.step(action)#运行结束后重置当前场景obv=env.reset()完整代码如下(opencv_drive/auto_drive.py)04基于OpenCV的自动驾驶小车打开模拟器,然后运行上述脚本,最终运行效果如下图由于使用的模拟平台每次生成的赛道地图都是随机的,如果当前生成的赛道存在十字交叉路口,那么在运行的时候可能会出现检测失败、跑出赛道等现象。如何规避这个问题,同学们可以自行研究和改进想一想PART05小结05小结那么有没有更加鲁棒、性能更好的算法来处理这种任务呢?答案就是深度学习通过滤波去噪、特定颜色区域检测、感兴趣区域提取、边缘检测、霍夫变换等步骤,基本实现了小车的长时间自动稳定驾驶。每个步骤都需要人工分析图像特征并选择合适的阈值,且各个步骤之间是紧耦合的,每个步骤处理的好坏都会直接影响下一个步骤,需要丰富的经验和人工反复的调参学习内容总结存在的问题解决方法感谢您的观看TSINGHUAUNIVERSITYPRESS微课视频OpenCV自动驾驶小车第2章深度学习基础微课视频PaddlePaddle内容安排深度学习概述01.环境安装02.PaddlePaddle基础03.PaddlePaddle实现机器学习:线性回归投资预测04.PaddlePaddle实现深度学习:自动驾驶小车控制05.PART01深度学习概述深度学习概述----人工智能、机器学习和深度学习01人工智能(ArtificialIntelligence,AI)是最宽泛的概念,是研发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。机器学习(MachineLearning,ML)是当前比较有效的一种实现人工智能的方式。深度学习(DeepLearning,DL)则是机器学习算法中最热门的一个分支,近些年取得了显著的进展,并替代了大多数传统机器学习算法。深度学习概述----
深度学习起源和发展01最早的神经网络数学模型来自于由心理学家McCulloch教授和数学家Pitts教授于1943年提出的模拟人类大脑神经元的McCullochPitt神经元模型,该模型被称为M-P模型。M-P模型被称为人工神经网络的起点,随后出现的神经网络模型均是以该模型为基础的。发展历程深度学习概述----
深度学习起源和发展01发展历程1943年心理学家McCulloch教授和数学家Pitts教授提出的模拟大脑神经元的模型M-P模型被称为人工神经网络的起点1958年感知机模型神经网络研究进入了第一次高潮期1986年反向传播算法进一步发展无法有效的训练深层网络支持向量机2006年《科学》上提出了深度置信网络模型开启了深度神经网络浪潮错误率从26%降到了15%2022年OpenAI公司推出ChatGPT3.52024年初,人工智能文生视频大模型sora深度学习概述----深度学习框架01国外深度学习框架PyTorch(脸书)TensorFlow(谷歌)MXNet(亚马逊)国内深度学习框架PaddlePaddle(百度)MindSpore(华为)PaddlePaddle是百度自主研发的国产深度学习框架,于2016年正式开源推出。相比国内其他框架,其开源最早,社区也更活跃。目前,PaddlePaddle更新到版本2系列,全面支持动态图编程模式,其API与PyTorch非常相近,可以非常方便的在PyTorch和PaddlePaddle之间进行转换PART02环境安装环境安装----安装说明02深度学习的训练和推理需要特定的硬件环境才能满足运算需求,尤其是深度学习训练任务,一般需要GPU环境支持CUDACUDA是英伟达利用GPU平台进行通用并行计算的一种架构,它包含了CUDA指令集架构以及GPU内部的并行计算引擎CUDNN专门用于深度神经网络的SDK库来加速完成相关特定的深度学习操作NCCL是一个实现多GPU通信的软件库,单GPU和Windows系统不需要环境安装----Windows平台02安装英伟达显卡驱动1.Nvidia官网确定显卡是否支持,如果支持则安装驱动2.通过nvidia-smi查看支持的最高版本以及检验是否安装成功环境安装----Windows平台02安装CUDA1.PaddlePaddle官网确认可以使用的CUDA版本环境安装----Windows平台02安装CUDA2.英伟达CUDA官网下载对应版本的CUDA3.测试一下CUDA是否安装成功nvcc-V环境安装----Windows平台02安装CUDNN1.
CUDNN官方下载安装文件2.文件拷贝解压缩,将CUDNN压缩包里面的bin、include、lib文件直接复制到CUDA的安装目录下(C:\ProgramFiles\NVIDIAGPUComputingToolkit\CUDA\v11.8),直接覆盖替换即可环境安装----Windows平台02安装PaddlePaddle1.
PaddlePaddle官网选择好版本以后会自动给出对应的安装命令,使用对应命令安装2.检验是否安装成功importpaddlepaddle.utils.run_check()python-mpipinstallpaddlepaddle-gpu==3.0.0b1-i/packages/stable/cu118/环境安装----Ubuntu平台02安装英伟达显卡驱动nvidia-smi1.检测NVIDIA图形显卡和推荐的驱动程序,在终端输入ubuntu-driversdevices2.根据推荐的显卡驱动包进行安装,具体可以使用类似下面的命令进行安装sudoapt-getinstallnvidia-driver-5353.安装完成后重启系统,然后在终端中输入命令环境安装----Ubuntu平台02安装CUDAsudoshcuda_11.8.0_520.61.05_linux.run1.PaddlePaddle官网确认适配的CUDA版本2.英伟达CUDA官网下载对应版本的CUDA,InstallerType选项上选择runfile[local]3.安装命令如下注意:安装时将驱动Driver选项去掉环境安装----Ubuntu平台02安装CUDAexportPATH=/usr/local/cuda-11.8/bin${PATH:+:${PATH}}exportLD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}4.配置环境变量sudogedit~/.bashrc然后在打开的文件末尾添加代码(这里版本为11.8):exportLD_LIBRARY_PATH=/usr/lib/wsl/lib:$LD_LIBRARY_PATH如果是基于WindowsWSL的Ubuntu双系统,还需要增加:source~/.bashrc保存修改后,使用下面的命令更新环境变量环境安装----Ubuntu平台02安装CUDA5.检查安装信息nvcc-V正常情况输出:环境安装----Ubuntu平台02安装CUDNN1.下载CUDNN,选择LocalInstallerforLinuxx86_64(Tar),版本需遵从PaddlePaddle要求tar-xfcudnn-linux-x86_64-0_cuda11-archive.tar.xzcdcudnn-linux-x86_64-0_cuda11-archivesudocplib/*/usr/local/cuda-11.8/lib64/sudocpinclude/*/usr/local/cuda-11.8/include/2.解压并拷贝:环境安装----Ubuntu平台02安装CUDNN1.下载CUDNN,选择LocalInstallerforLinuxx86_64(Tar),版本需遵从PaddlePaddle要求tar-xfcudnn-linux-x86_64-0_cuda11-archive.tar.xzcdcudnn-linux-x86_64-0_cuda11-archivesudocplib/*/usr/local/cuda-11.8/lib64/sudocpinclude/*/usr/local/cuda-11.8/include/2.解压并拷贝,注意修改为自己的版本环境安装----Ubuntu平台02安装CUDNN3.检验安装版本cat/usr/local/cuda-11.8/include/cudnn_version.h|grepCUDNN_MAJOR-A2环境安装----Ubuntu平台02安装NCCL,如果您的GPU大于1张1.NCCL下载选择NCCL2.16.5forCUDA11.8,展开后单击O/Sagnosticlocalinstaller选项进行下载2.解压与拷贝,注意更换为自己电脑版本tar-xfnccl_2.16.5-1+cuda11.8_x86_64.txzcdnccl_2.16.5-1+cuda11.8_x86_64sudocpinclude/nccl*.h/usr/local/cuda/includesudocp-rlib/*/usr/local/cuda/lib64环境安装----Ubuntu平台02安装PaddlePaddle,与Windows系统安装方法一致1.
PaddlePaddle官网选择好版本以后会自动给出对应的安装命令,使用对应命令安装2.检验是否安装成功importpaddlepaddle.utils.run_check()python-mpipinstallpaddlepaddle-gpu==3.0.0b1-i/packages/stable/cu118/2张显卡会显示PaddlePaddleworkswellon2GPUs环境安装----AIStudio平台02AIStudio是基于PaddlePaddle的人工智能学习社区,提供了在线编程环境,可以免费使用多种GPU资源1.注册和登录2.创建项目,IDE可选Jupyter和VSCode
参照官网说明,可免费使用GPU资源环境安装----AIStudio平台02AIStudio是基于PaddlePaddle的人工智能学习社区,提供了在线编程环境,可以免费使用多种GPU资源3.运行项目
选择合适的GPU或CPU资源环境安装----AIStudio平台02AIStudio是基于PaddlePaddle的人工智能学习社区,提供了在线编程环境,可以免费使用多种GPU资源4.Folk项目在AIStudio上有众多开发者开发的项目,这些项目大部分都是开源的。读者如果喜欢某个项目,那么可以在AIStudio上直接Folk别人的项目,此时会同步该项目运行时所需要的完整环境和代码,Folk完以后可以直接运行别人的项目而无需担心环境不一致。PART03PaddlePaddle基础PaddlePaddle基础----Tensor表示03Tensor,中文意思是张量,其概念可以类比Numpy中的ndarray,本质上就是一个带梯度信息的多维数组,是深度学习中数据表示的最基本形式importpaddletensor_empty=paddle.empty(shape=[5,3],dtype='float32')print(tensor_empty)构建一个5×3的Tensor(demo/demo1.py)输出结果(如果是CPU环境,输出结果略有区别)如下:Tensor(shape=[5,3],dtype=float32,place=Place(gpu:0),stop_gradient=True,[[0.,0.,0.],[0.,0.,0.],[0.,0.,0.],[0.,0.,0.],[0.,0.,0.]])PaddlePaddle基础----Tensor表示03Tensor,中文意思是张量,其概念可以类比Numpy中的ndarray,本质上就是一个带梯度信息的多维数组,是深度学习中数据表示的最基本形式importpaddletensor_empty=paddle.empty(shape=[5,3],dtype='float32')print(tensor_empty)构建一个5×3的Tensor(demo/demo1.py)输出结果(如果是CPU环境,输出结果略有区别)如下:Tensor(shape=[5,3],dtype=float32,place=Place(gpu:0),stop_gradient=True,[[0.,0.,0.],[0.,0.,0.],[0.,0.,0.],[0.,0.,0.],[0.,0.,0.]])包括了shape、dtype、place、stop_gradient等信息PaddlePaddle基础----Tensor表示03paddle.ones()和paddle.zeros()也是常用的Tensor初始化函数tensor_ones=paddle.ones([2,3])print(tensor_ones)tensor_zeros=paddle.zeros([2,3])print(tensor_zeros)paddle.zeros()用于创建元素值全为0的Tensor输出结果为:Tensor(shape=[2,3],dtype=float32,place=Place(gpu:0),stop_gradient=True,[[1.,1.,1.],[1.,1.,1.]])Tensor(shape=[2,3],dtype=float32,place=Place(gpu:0),stop_gradient=True,[[0.,0.,0.],[0.,0.,0.]])PaddlePaddle基础----Tensor表示03paddle.rand()和paddle.randn()是两个常用的随机初始化函数tensor_rand=paddle.rand([5,3])print(tensor_rand)paddle.rand()用于生成服从区间[0,1)均匀分布的随机Tensor输出结果为:Tensor(shape=[5,3],dtype=float32,place=Place(gpu:0),stop_gradient=True,[[0.68210554,0.76153767,0.44551539],[0.69805700,0.31456539,0.98931015],[0.43727642,0.31598026,0.48267344],[0.32874393,0.75220251,0.13546221],[0.05477471,0.40740317,0.67578572]])PaddlePaddle基础----Tensor表示03tensor_randn=paddle.randn([5,3])print(tensor_randn)paddle.randn()用于生成服从均值为0、方差为1正态分布的随机Tensor输出结果为:Tensor(shape=[5,3],dtype=float32,place=Place(gpu:0),stop_gradient=True,[[-0.82212120,-1.80854058,-0.67530596],[0.03965529,0.87011033,0.44460696],[-0.13173500,-0.23574546,0.13501364],[-0.095
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 玩具设计师岗前风险评估考核试卷含答案
- 农产品食品检验员冲突解决水平考核试卷含答案
- 黄酒培菌工岗前认证考核试卷含答案
- 芳烃抽提装置操作工工艺控制测试考核试卷含答案
- 火工品检测工岗位环保责任制竞赛考核试卷含答案
- 化工蒸馏工基础模拟水平考核试卷含答案
- 海洋地质调查员安全操作测试考核试卷含答案
- 货运汽车司机岗位业务能力考核试卷含答案
- 家具设计师价值创造模拟考核试卷含答案
- 醋酸装置操作工7S执行考核试卷含答案
- 少先队知识答题50道(含答案)
- TD/T 1031.6-2011土地复垦方案编制规程第6部分:建设项目
- 霸王茶姬公司管理制度
- 统编版(2024)七年级上册道德与法治《探究与分享+运用你的经验+单元思考与行动》 参考答案
- 医院培训课件:《外科手术部位感染预防与控制》
- 实习生实习证明协议书
- NB/T 11434.5-2023煤矿膏体充填第5部分:胶凝材料技术要求
- 团体心理咨询
- 情景教学法在安全教育中的实践探索
- 数字媒体技术与应用(移动学习版)PPT完整版全套教学课件
- 《无人机组装与调试》第7章 固定翼无人机的调试
评论
0/150
提交评论