想入行智能汽车领域,请问有哪些学习的资料吗?
我需要学习哪些知识?掌握哪些技能?
8578 位酷友已加入
计算机圈子中包含常用的技术文档、源代码、模型、数据集、学习教程、技术报告等干货资料,加入圈子可以上传、下载资料,也可以使用提问来寻求资料或分享你认为有价值的站外链接~
我需要学习哪些知识?掌握哪些技能?
有没有比较好用的降重软件?
1 引言 本项目是复旦大学大数据学院2019年春季学期《大规模分布式系统》的期末课程设计项目,目的在于利用在本课程中学到的分布式系统的相关知识和技术去分析和利用现实生活中的大数据。 受到老师提供的纽约出租车数据的启发,本项目选择了与我们生活息息相关的上海出租车大数据作为研究的对象,基于Spark平台开发了一个具有丰富功能和可视化效果的上海出租车信息查询系统,并在此系统的基础上分析了上海群众出租车出行的时空和轨迹特征,提出了自己的解释并从多个方面提出了建议。 1.1 项目背景 当代的社会正逐步走向一个数据驱动的智能社会,更加完善的数据获取方式,更加系统的数据整合和储存手段,让我们息息相关的生活中能取得的数据逐渐成为了真正的大数据。指数级增长的数据量给数据的处理和分析带来了更多的困难,但是也带来了更多的可能性,从数据挖掘的角度,更多的样本量意味着更不容易过拟合,更小的方差和置信度更高的结论。所以利用合适的大规模处理框架去处理与生活息息相关的大数据将为我们带来更多启发,对社会现象更准确的分析结果和更深入的理解。其中,基数巨大且频率较高的交通数据作为一个最典型的大数据来源之一,其背后巨大的大数据价值正等待我们去发掘。 进入21世纪以来,应我国交通系统发展的需求,智慧交通的建设进入了高速发展期。基于移动计算技术和全球定位系统(GPS)以及其他形式的位置获取技术,可收集到大量移动交通对象的轨迹数据。通过对这些轨迹数据的分析挖掘,可以提取大量有效信息,服务于智慧交通建设,服务于人们日常生活。 在多种多样的交通方式中出租车在人们的日常出行中扮演了重要角色,是交通数据分析中不可缺少的组成部分。出租车有别于公交车、地铁等公共交通,具有没有固定线路和站点的特点,为个人出行提供定制化服务。因此出租车轨迹信息数据能够较为清晰反映出城市交通的状况,可挖掘分析人们的出行特点等信息。 1.2 项目意义 出租车作为一种普遍而广泛的出行方式深受人们的青睐,作为一种交通形式而言,研究出租车数据能方便我们深入了解其在城市里的具体特征和出租车行业在该地区的发展状态。同样的,出租车的数据在一定程度上反映了该地区人口的流动性情况,出租车的行车轨迹与方式在一定程度上也能反映全市的整体的情况。而城市的道路和交通情况被称为一座城市的心跳与脉搏,深入理解出租车数据也有助于我们去分析城市内部与出租交通息息相关的特征与因素,从而在某些层面上为未来的城市改进提供了方向。 对于出租车数据的分析结果可用于城市规划,交通建设等多个方面,具有较强的应用意义。例如,提取热点轨迹,反映车辆行驶运动规律,可帮助政府了解城市道路情况,对于道路与交通路线规划和交通治理有重要价值,对个人了解出行的合适时间与费用以及交通服务质量也有积极作用; 提取出租车轨迹数据中的载客点和卸客点,可反映人们的出行习惯,乘车需求分布等信息,对车辆调度分配、运营策略调整等方面有较为有效的帮助; 对于车速和占用率的分析结果可以反映出租车行业在各个时间段和不同地区的分区差异,帮助改进部分道路设计和帮助出租车公司和司机寻找更好的工作方式。 对于个人而言,通过训练出的模型估计到达目的地所需的时间,帮助顾客(地图使用者)更好地评估所需时间和计算出发的时间以避免迟到等等。 1.3 报告组成 本篇报告的剩余部分将分为五个部分,报告的第二、三部分对我们使用的数据集,我们项目的代码框架以及在代码框架里主要使用的工具和技术做了简单地介绍,给读者一个关于数据集所包含信息的大致映像,同时方便读者更好地理解本项目的工作流程和方式; 报告的第四部分将细致地根据不同的分类介绍我们的信息检索系统提供的功能和交互结果的展示,并且在每一个功能展示后,我们将会对功能展示出的结果做出自己的分析,也有助于读者理解每一个模块具体想要提供什么样的信息和背后设计的思想; 在第五部分中我们将总结整篇报告中的分析和结果,对上海市的出租车交通情况做一个大致的总结。并根据我们的数据和已有的成果从城市规划、道路设计和行人出行等方面提出了一些合理的建议。 报告的最后部分将是我们小组的分工介绍。 2 数据集介绍 2.1 数据来源 启发自纽约出租车数据集的分析,我们尝试对我们生活的上海的出租车数据进行分析和挖掘,最终我们通过SODA(上海开放数据创新应用大赛)平台得到了上海强生出租车公司提供的出租车数据。上海强生出租车公司作为上海主要的出租车运营和管理公司之一,其提供的出租车数据基数大,发送频率高,能在一定程度上反映上海市的出租车交通的生态情况。 强生出租车公司的出租车每过10s会向公司数据总部发送一个信号,信号主要包括当前汽车所处的经纬度坐标、行车方向、速度、是否被占用(载客)、是否踩了刹车等等有关汽车或者GPS微型当前状况的属性。经过大致的统计,强生出租车公司在一天内收到的数据大约体量在1亿条以上。 2.2 原始数据概览 数据根据不同的年月日,小时存放在不同的目录中,在同一个小时内,每个分钟段的数据被存放到同一个txt文件里,其命名就是对应的时间,比如’1804/01/23/1804012305.txt’文件就存放的是所有发出在2018年4月1日23时05分内的信号,每一行为一条信号,每一条信号里的不同信息段用’|’分隔,这里展示几条样例数据: 2.3 数据特点与难点 相比于纽约出租车的数据(主要是上客和下客纪录),我们得到的数据相对而言不太一样,一个是数据频率更高,另一个是相对而言信息更多了,在保存数据的时候需要考虑筛去无效(不感兴趣)的信息,而且为了方便做类似于纽约出租车的上下客的相关分析和查询,我们决定从我们当前的数据表中提取出上客下客表,具体格式将会在下一部分介绍; 相较于纽约出租车的数据,我们更为准确地度量在一定特定的时间段内(时间段长度足够段代表时间点)的车辆分布情况和车辆相关状态的时空分布,比如速度,占用率等等,而这些我们感兴趣的信息都需要基于一个合理的数据和处理框架; 这里用一个动图来动态的展现车辆在时空的分布,这里的时间以一个小时为更新频率展现了上海市2018年4月1日的车辆分布和流动情况 (点击下图查看动态效果) 3 项目框架与使用技术介绍 因为当前并不存在一个用于完成类似于我们的出租车信息的查询与可视化框架去学习,所以我们基于 Spark 的大规模数据处理框架,自主设计了我们的项目的代码框架,在本部分里,将详细介绍我们使用的技术和数据存放格式,代码框架的设计: 3.1 使用技术 基本框架是 Spark,Spark 提供了对数据的读入,序列化以及一系列操作; 同时使用了两种各有优劣的 RDD 和 DataFrame 存储不同的数据表,基于两种变量类型完成查询,排序,展示等结果; 主要的处理方式是基于 Spark 提供的对序列化数据集的操作接口(如 map, filer 等),主要的处理方式是 MapReduce; 基于 matplotlib 的统计图表可视化(折现趋势图和柱状分布图),还包括了使用 FuncAnimation 进行的动画(gif)制作; 基于 Basemap 和 folium 的地理信息可视化; 基于 Django 的网页前端实现; 基于 Python3 脚本的类的封装。 3.2 数据表存放格式 对于一个数据表,会同时维护一个 RDD 和一个 DataFrame ,因为相对而言 DataFrame 的运行速度稍微快一些,而RDD支持的基本操作类型更多,为了方便后续操作,在初始化过程中对原始数据集所在的RDD按照时间进行排序; 从一个司机的角度出发,我们需要考虑在某时刻某地将乘客放下后下一次接到单所需要的时间,所以建立了一个下客记录表( GroupByKey 后遍历值数组来找到出租车从有客人到没客人的记录和下一次拉客的信息),其 Schema 如下: 从一个乘客的角度出发,我么你需要考虑的是在某时某刻在某地乘上一辆出租车到达目的地所需要的时间长度,所以我们又建立了一个上客记录表(同样是 GroupByKey 后遍历值数组来找到客人上车的记录和该乘客的下车信息),其 Schema 如下: 对于原始的数据我们也是一样保存了有 RDD 和 DataFrame 的变量,一方面是因为我们的一些查询语句在原数据集上更快更直接,另外一方面是保存完整的血源图的祖先结点的信息,保证代码的完整性; 3.3 代码框架结构 基于面向对象的思想,我们希望将我们的对于数据集的操作,查询,可视化的一系列操作包装成一个面向对象的类 Query,在使用的时候需要首先声明实例化一个 Query 类的变量,然后通过提供的接口进行对应的操作,这里对于 Query 类提供的主要成员和主要方法做一个简单的说明: Query: Member: self.sc , self.spark :保存用于与Spark服务器通信的spark context和spark session变量; self.data , self.df :存放分割后的原始数据的RDD和有Schema的DF self.upRecord , self.downRecord : 保存处理后的上下客记录表,使用前需要调用self.init_updown来对两个表 Method: self.init_updown():用来初始化上下客表,未调用前均为None self.GetAverageWaitTime():输入两个对角的坐标限制出一个矩形区域和时间,计算该时间空间内部司机下客后平均需要的等待下一单时间 self.AverageWaitTimePlot():将上述结果以1min为频率展现为折现趋势图 …… 其他的类似的查询有关方法 self.drawOneCar():使用Basemap可视化某车辆在一天的行驶轨迹并储存png self.drawAllCars():可视化在某个小时内所有车辆的分布 self.carHotMap():产生车辆分布的热力图(粒度和阈值已调整到合适位置) …… 其他的轨迹可视化与热力图可视化 self.tourTimePredict_train():训练预测所需乘车时间的模型 self.tourTimePredict() :基于模型进行预测 以上就是Query类提供部分重要的成员和方法,比较相同的部分就选择了一到两个函数作为罗列,其余的比较类似。基于Django的UI代码框架相对而言比较难以理解,将在第四部分结合着我们最终的用户界面进行介绍。 4 具体功能介绍及分析 本项目的UI是基于Django开发的基于网页的UI,在这里将选取几个主要且我们比较感兴趣的功能进行界面和结果截图展示,对于一些结果还加上了简要的进行分析和阐述自己的理解; 4.1 主界面 在主界面中,首先我们为用户提供了四类信息的查询和可视化接口和一类信息预测查询,分别为: 单车轨迹查询:单个车辆全区域轨迹查询可视化; 全车辆相关信息查询:全体车辆全区域信息可视化,含轨迹和平均等待时间; 区域平均速度查询:对于区域定位的平均速度相关信息可视化,含基本折线图柱状图及热力图展示; 区域平均占用率查询:对于区域定位的平均占用率相关信息可视化(含基本折线图柱状图及热力图展示); 出行时间预测:对于给定起止点和上车时间的出行时间预测。 下面会分别展示和分析这五个部分。 4.2 单车轨迹查询与可视化 对于单车辆的轨迹查询和现实,可以通过输入对应的车辆的ID然后系统自动产生在该天内的运行轨迹,在这里没有输入车辆ID的话会使用默认的值作为选择的车辆,可以看出该车辆在一天之内几乎就是沿着某一条路一直往返,可能是因为该车辆当天的运营时间比较短,就顺着这条路完成了几次拉载客。 通过观察多辆出租车的一日轨迹特征我们发现,其实绝大多数出租车在一天以内的活动范围都是比较有限的,说明司机都比较了解哪些地方容易拉到客人,而且前往的地点也比较集中,而且往往一次拉客的过程平均不会太长,在局部模式化明显。 4.3 多车辆轨迹查询与可视化 在此我们对单日上海地区全部出租车数据进行了轨迹可视化(实为动态展示,见2.3中的gif图片)和等待时间分析。可以看出车辆轨迹基本呈现夜晚由市中心向外扩散,而在清晨从外向市中心集中的变化情况。车辆等待时间较为明显的低谷出现在凌晨时间段,此时间段的出租车需求小于出租车供给;较明显的波峰出现在早高峰时期,此时间段的出租车需求大于出租车供给。 4.4 平均速度查询 通过输入希望查询的地图区域经纬度坐标,输出该区域的平均车辆速度的相关信息。分析全区域车辆平均运行速度相关信息,可得到初步结论。从时间角度分析:出租车运行速度波谷为2-4点,此状态下一般为出租车空车状态较多,印证符合前两项分析结论。;其余时间无明显差别。从地理空间角度分析(由热力图可见):平均行驶速度与地区路况有较为明显的联系,在高架路高速路等区域明显呈现高平均速度状态。 (点击图片可查看动态效果) 4.5 平均占用率统计查询 通过输入希望查询的地图区域经纬度坐标,输出该区域的平均占用率的相关信息。分析全区域占用率相关信息,可得到初步结论:占用率基本波动于50%;较为明显的博古波谷出现在凌晨2-4点,波峰出现在7-8点,这也印证了在等待时间中的分析。占用率基本呈现与等待时间成反比的状态,符合现实认知中的供给需求关系。热力图和4.4相似,此处略。 4.6 出行时间预测 通过机器学习获得出租车出行时间预测的模型(模型对空间和时间采用onehot编码并进行岭回归,详见代码):输入出行的起止点,输出基于上海市出租车数据情况的对于出行时间的预测结果(以min为单位)。这里我们选用车辆密度较大的区域和晚高峰进行测试,发现出行时间明显变长,与实际情况相一致。 5 结论与建议 在观察车辆分布和轨迹的可视化动态图或静态图中,我们发现了很多的规律,这些规律和上海市的人口分布和人口流动特性息息相关;而平均占用率,平均速度所随时间变化的折线趋势图则为我们提供了更多对于出租车生态,甚至是交通系统的特点的估计;同样的,用于表现出现的集中程度或者是属性高低分布的热力图则帮助我们探索了交通系统中某些属性的时空分布,在本部分中,我们将对之前的分析和发现进行精炼和总结,最后提出我们的几点建议。 首先是几点最重要的发现: 观察出租车分布的动态图可以看出出租车的分布随时间的变化非常规律,即夜晚由市中心向外扩散,而在清晨从外向市中心集中,白天则主要围绕着二环以内区域进行小幅度的变化; 夜间出租车向外扩散时,宝山区附近(北上方区域)出租车很集中,白天则很少,说明很多出租车夜晚凌晨倾向于开到宝山区附近进行休息,可能是因为宝山区主要是生活区,司机们很多人家住在该区域; 观察起止点的分布图可以看出,上车点和下车点都呈现很小的簇状结构,也就是在一些小范围的区域会打车点众多且密集,这些点在23点更加明显得集中,也就是上车点集中在商圈和娱乐场所,下车点相对没那么密集,集中在生活区,也说明下车点选择更多样化; 从热力图可以看出虹桥火车站和浦东国际机场是在几乎所有时间点都是热门的打车和出租车集中的位置,而相对而言这样稳定的点在市内几乎没有(市内无稳定热门打车点); 一天内的平均车速呈现了三个局部波谷的特点,通过观察时间易知是一天的凌晨(出租车休息),早晚高峰,而观察速度的热力图可以看出平均速度和该区域的路况有关,有高架的高速路多数时间呈现红色(高平均速度); 一天内的平均占用率波动相对较大,不过也能观察到三个明显的局部最小点,分别是凌晨(休息,乘客少),下午2-3点(工作),晚上8点作业(很少出门); 对于司机下客后距离下一次接单平均所需的等待时间则波动较大,总体的表现上来看,凌晨最高,白天内差异不大,在接近24点的时候迅速下降(娱乐等活动结束后的回家潮); 上海的出租车司机常常会有一些接远单的现象,比如将乘客送到苏州等 借此,我们可以大致给出一些简单的结论: 上海市的出租车的运行分布规律性很强,其随时间的流动规律代表了人口在市内的主要流动趋势(上班,下班,娱乐,回家等流动大潮); 存在很多的显著热门打车点或者是出租车集中点,比如机场,火车站,凌晨的宝山区,接近24点的娱乐中心,模式性很强; 白天(9:00-17:00)时间段上海的人口流动量相对少; 通过以上的讨论,我们从上海市出租车管理局、乘客、出租车司机三个角度提出了几条建议: 作为出租车管理局,效仿在虹桥火车站、浦东机场的出租车站台的模式,可以在市中心多增加一些这样的点(可以选点在我们的上车点的聚集簇中心),这样有助于集中打车人和出租车,降低混乱度,同时也方便出租车司机去一些特定目的地拉客而不是浪费时间;可以适当地多研究分析平均车速都比较低的点,这些点说明交通状况经常不容乐观,值得去改善;分析人口流动的趋势和时间点来重新规划高速路开放时间,红绿灯时间优化; 作为乘客,我们可以利用之前找到的几个峰值点来帮助我们有效避开高峰,比如在娱乐场所接近24点前早一些离开打车;在和司机信息对等的情况下(都知道热门的打车点)的情况下可以多去这些点打车; 作为出租车司机,在可能的情况下,要尽量多地前往一些热门打车点去寻找客单,如果接近机场或者火车站,前往接单是个好主意;尽量选择高速路防止拥堵或者是路况不佳导致效率降低;如果有时间和精力可以自己规划出最适合自己的一块运营区域(打车点多且容易连续接单)。 来源https://github.com/zhangyilang/ShanghaiTaxiAnalysis
👼求一个编程代码~~~
最近在做分析泊松噪声的工作,我需要一定量包含泊松噪声的图像。 我知道怎么在MATLAB中给图片添加泊松噪声,但是如何在Python中添加呢?
本教程源自book/image_classification,初次使用请您参考Book文档使用说明。 背景介绍 图像相比文字能够提供更加生动、容易理解及更具艺术感的信息,是人们转递与交换信息的重要来源。在本教程中,我们专注于图像识别领域的一个重要问题,即图像分类。 图像分类是根据图像的语义信息将不同类别图像区分开来,是计算机视觉中重要的基本问题,也是图像检测、图像分割、物体跟踪、行为分析等其他高层视觉任务的基础。图像分类在很多领域有广泛应用,包括安防领域的人脸识别和智能视频分析等,交通领域的交通场景识别,互联网领域基于内容的图像检索和相册自动归类,医学领域的图像识别等。 一般来说,图像分类通过手工特征或特征学习方法对整个图像进行全部描述,然后使用分类器判别物体类别,因此如何提取图像的特征至关重要。在深度学习算法之前使用较多的是基于词袋(Bag of Words)模型的物体分类方法。词袋方法从自然语言处理中引入,即一句话可以用一个装了词的袋子表示其特征,袋子中的词为句子中的单词、短语或字。对于图像而言,词袋方法需要构建字典。最简单的词袋模型框架可以设计为底层特征抽取、特征编码、分类器设计三个过程。 而基于深度学习的图像分类方法,可以通过有监督或无监督的方式学习层次化的特征描述,从而取代了手工设计或选择图像特征的工作。深度学习模型中的卷积神经网络(Convolution Neural Network, CNN)近年来在图像领域取得了惊人的成绩,CNN直接利用图像像素信息作为输入,最大程度上保留了输入图像的所有信息,通过卷积操作进行特征的提取和高层抽象,模型输出直接是图像识别的结果。这种基于"输入-输出"直接端到端的学习方法取得了非常好的效果,得到了广泛的应用。 本教程主要介绍图像分类的深度学习模型,以及如何使用PaddlePaddle训练CNN模型。 效果展示 图像分类包括通用图像分类、细粒度图像分类等。图1展示了通用图像分类效果,即模型可以正确识别图像上的主要物体。 图1. 通用图像分类展示 图2展示了细粒度图像分类-花卉识别的效果,要求模型可以正确识别花的类别。 图2. 细粒度图像分类展示 一个好的模型既要对不同类别识别正确,同时也应该能够对不同视角、光照、背景、变形或部分遮挡的图像正确识别(这里我们统一称作图像扰动)。图3展示了一些图像的扰动,较好的模型会像聪明的人类一样能够正确识别。 图3. 扰动图片展示[22] 模型概览 图像识别领域大量的研究成果都是建立在PASCAL VOC、ImageNet等公开的数据集上,很多图像识别算法通常在这些数据集上进行测试和比较。PASCAL VOC是2005年发起的一个视觉挑战赛,ImageNet是2010年发起的大规模视觉识别竞赛(ILSVRC)的数据集,在本章中我们基于这些竞赛的一些论文介绍图像分类模型。 在2012年之前的传统图像分类方法可以用背景描述中提到的三步完成,但通常完整建立图像识别模型一般包括底层特征学习、特征编码、空间约束、分类器设计、模型融合等几个阶段。 底层特征提取: 通常从图像中按照固定步长、尺度提取大量局部特征描述。常用的局部特征包括SIFT(Scale-Invariant Feature Transform, 尺度不变特征转换) [1]、HOG(Histogram of Oriented Gradient, 方向梯度直方图) [2]、LBP(Local Bianray Pattern, 局部二值模式) [3] 等,一般也采用多种特征描述子,防止丢失过多的有用信息。 特征编码: 底层特征中包含了大量冗余与噪声,为了提高特征表达的鲁棒性,需要使用一种特征变换算法对底层特征进行编码,称作特征编码。常用的特征编码包括向量量化编码 [4]、稀疏编码 [5]、局部线性约束编码 [6]、Fisher向量编码 [7] 等。 空间特征约束: 特征编码之后一般会经过空间特征约束,也称作特征汇聚。特征汇聚是指在一个空间范围内,对每一维特征取最大值或者平均值,可以获得一定特征不变形的特征表达。金字塔特征匹配是一种常用的特征聚会方法,这种方法提出将图像均匀分块,在分块内做特征汇聚。 通过分类器分类: 经过前面步骤之后一张图像可以用一个固定维度的向量进行描述,接下来就是经过分类器对图像进行分类。通常使用的分类器包括SVM(Support Vector Machine, 支持向量机)、随机森林等。而使用核方法的SVM是最为广泛的分类器,在传统图像分类任务上性能很好。 这种方法在PASCAL VOC竞赛中的图像分类算法中被广泛使用 [18]。NEC实验室在ILSVRC2010中采用SIFT和LBP特征,两个非线性编码器以及SVM分类器获得图像分类的冠军 [8]。 Alex Krizhevsky在2012年ILSVRC提出的CNN模型 [9] 取得了历史性的突破,效果大幅度超越传统方法,获得了ILSVRC2012冠军,该模型被称作AlexNet。这也是首次将深度学习用于大规模图像分类中。从AlexNet之后,涌现了一系列CNN模型,不断地在ImageNet上刷新成绩,如图4展示。随着模型变得越来越深以及精妙的结构设计,Top-5的错误率也越来越低,降到了3.5%附近。而在同样的ImageNet数据集上,人眼的辨识错误率大概在5.1%,也就是目前的深度学习模型的识别能力已经超过了人眼。 图4. ILSVRC图像分类Top-5错误率 CNN 传统CNN包含卷积层、全连接层等组件,并采用softmax多类别分类器和多类交叉熵损失函数,一个典型的卷积神经网络如图5所示,我们先介绍用来构造CNN的常见组件。 图5. CNN网络示例[20] 卷积层(convolution layer): 执行卷积操作提取底层到高层的特征,发掘出图片局部关联性质和空间不变性质。 池化层(pooling layer): 执行降采样操作。通过取卷积输出特征图中局部区块的最大值(max-pooling)或者均值(avg-pooling)。降采样也是图像处理中常见的一种操作,可以过滤掉一些不重要的高频信息。 全连接层(fully-connected layer,或者fc layer): 输入层到隐藏层的神经元是全部连接的。 非线性变化: 卷积层、全连接层后面一般都会接非线性变化层,例如Sigmoid、Tanh、ReLu等来增强网络的表达能力,在CNN里最常使用的为ReLu激活函数。 Dropout [10] : 在模型训练阶段随机让一些隐层节点权重不工作,提高网络的泛化能力,一定程度上防止过拟合。 另外,在训练过程中由于每层参数不断更新,会导致下一次输入分布发生变化,这样导致训练过程需要精心设计超参数。如2015年Sergey Ioffe和Christian Szegedy提出了Batch Normalization (BN)算法 [14] 中,每个batch对网络中的每一层特征都做归一化,使得每层分布相对稳定。BN算法不仅起到一定的正则作用,而且弱化了一些超参数的设计。经过实验证明,BN算法加速了模型收敛过程,在后来较深的模型中被广泛使用。 接下来我们主要介绍VGG,GoogleNet和ResNet网络结构。 VGG 牛津大学VGG(Visual Geometry Group)组在2014年ILSVRC提出的模型被称作VGG模型 [11] 。该模型相比以往模型进一步加宽和加深了网络结构,它的核心是五组卷积操作,每两组之间做Max-Pooling空间降维。同一组内采用多次连续的3X3卷积,卷积核的数目由较浅组的64增多到最深组的512,同一组内的卷积核数目是一样的。卷积之后接两层全连接层,之后是分类层。由于每组内卷积层的不同,有11、13、16、19层这几种模型,下图展示一个16层的网络结构。VGG模型结构相对简洁,提出之后也有很多文章基于此模型进行研究,如在ImageNet上首次公开超过人眼识别的模型[19]就是借鉴VGG模型的结构。 图6. 基于ImageNet的VGG16模型 GoogleNet GoogleNet [12] 在2014年ILSVRC的获得了冠军,在介绍该模型之前我们先来了解NIN(Network in Network)模型 [13] 和Inception模块,因为GoogleNet模型由多组Inception模块组成,模型设计借鉴了NIN的一些思想。 NIN模型主要有两个特点: 引入了多层感知卷积网络(Multi-Layer Perceptron Convolution, MLPconv)代替一层线性卷积网络。MLPconv是一个微小的多层卷积网络,即在线性卷积后面增加若干层1x1的卷积,这样可以提取出高度非线性特征。 传统的CNN最后几层一般都是全连接层,参数较多。而NIN模型设计最后一层卷积层包含类别维度大小的特征图,然后采用全局均值池化(Avg-Pooling)替代全连接层,得到类别维度大小的向量,再进行分类。这种替代全连接层的方式有利于减少参数。 Inception模块如下图7所示,图(a)是最简单的设计,输出是3个卷积层和一个池化层的特征拼接。这种设计的缺点是池化层不会改变特征通道数,拼接后会导致特征的通道数较大,经过几层这样的模块堆积后,通道数会越来越大,导致参数和计算量也随之增大。为了改善这个缺点,图(b)引入3个1x1卷积层进行降维,所谓的降维就是减少通道数,同时如NIN模型中提到的1x1卷积也可以修正线性特征。 图7. Inception模块 GoogleNet由多组Inception模块堆积而成。另外,在网络最后也没有采用传统的多层全连接层,而是像NIN网络一样采用了均值池化层;但与NIN不同的是,池化层后面接了一层到类别数映射的全连接层。除了这两个特点之外,由于网络中间层特征也很有判别性,GoogleNet在中间层添加了两个辅助分类器,在后向传播中增强梯度并且增强正则化,而整个网络的损失函数是这个三个分类器的损失加权求和。 GoogleNet整体网络结构如图8所示,总共22层网络:开始由3层普通的卷积组成;接下来由三组子网络组成,第一组子网络包含2个Inception模块,第二组包含5个Inception模块,第三组包含2个Inception模块;然后接均值池化层、全连接层。 图8. GoogleNet[12] 上面介绍的是GoogleNet第一版模型(称作GoogleNet-v1)。GoogleNet-v2 [14] 引入BN层;GoogleNet-v3 [16] 对一些卷积层做了分解,进一步提高网络非线性能力和加深网络;GoogleNet-v4 [17] 引入下面要讲的ResNet设计思路。从v1到v4每一版的改进都会带来准确度的提升,介于篇幅,这里不再详细介绍v2到v4的结构。 ResNet ResNet(Residual Network) [15] 是2015年ImageNet图像分类、图像物体定位和图像物体检测比赛的冠军。针对训练卷积神经网络时加深网络导致准确度下降的问题,ResNet提出了采用残差学习。在已有设计思路(BN, 小卷积核,全卷积网络)的基础上,引入了残差模块。每个残差模块包含两条路径,其中一条路径是输入特征的直连通路,另一条路径对该特征做两到三次卷积操作得到该特征的残差,最后再将两条路径上的特征相加。 残差模块如图9所示,左边是基本模块连接方式,由两个输出通道数相同的3x3卷积组成。右边是瓶颈模块(Bottleneck)连接方式,之所以称为瓶颈,是因为上面的1x1卷积用来降维(图示例即256->64),下面的1x1卷积用来升维(图示例即64->256),这样中间3x3卷积的输入和输出通道数都较小(图示例即64->64)。 图9. 残差模块 图10展示了50、101、152层网络连接示意图,使用的是瓶颈模块。这三个模型的区别在于每组中残差模块的重复次数不同(见图右上角)。ResNet训练收敛较快,成功的训练了上百乃至近千层的卷积神经网络。 图10. 基于ImageNet的ResNet模型 数据准备 通用图像分类公开的标准数据集常用的有CIFAR、ImageNet、COCO等,常用的细粒度图像分类数据集包括CUB-200-2011、Stanford Dog、Oxford-flowers等。其中ImageNet数据集规模相对较大,如模型概览一章所讲,大量研究成果基于ImageNet。ImageNet数据从2010年来稍有变化,常用的是ImageNet-2012数据集,该数据集包含1000个类别:训练集包含1,281,167张图片,每个类别数据732至1300张不等,验证集包含50,000张图片,平均每个类别50张图片。 由于ImageNet数据集较大,下载和训练较慢,为了方便大家学习,我们使用CIFAR10数据集。CIFAR10数据集包含60,000张32x32的彩色图片,10个类别,每个类包含6,000张。其中50,000张图片作为训练集,10000张作为测试集。图11从每个类别中随机抽取了10张图片,展示了所有的类别。 图11. CIFAR10数据集[21] Paddle API提供了自动加载cifar数据集模块 paddle.dataset.cifar。 通过输入 python train.py,就可以开始训练模型了,以下小节将详细介绍 train.py 的相关内容。 模型结构 Paddle 初始化 让我们从导入 Paddle Fluid API 和辅助模块开始。 本教程中我们提供了VGG和ResNet两个模型的配置。 VGG 首先介绍VGG模型结构,由于CIFAR10图片大小和数量相比ImageNet数据小很多,因此这里的模型针对CIFAR10数据做了一定的适配。卷积部分引入了BN和Dropout操作。 VGG核心模块的输入是数据层,vgg_bn_drop 定义了16层VGG结构,每层卷积后面引入BN层和Dropout层,详细的定义如下: 首先定义了一组卷积网络,即conv_block。卷积核大小为3x3,池化窗口大小为2x2,窗口滑动大小为2,groups决定每组VGG模块是几次连续的卷积操作,dropouts指定Dropout操作的概率。所使用的 img_conv_group 是在 paddle.networks 中预定义的模块,由若干组 Conv->BN->ReLu->Dropout 和 一组 Pooling 组成。 五组卷积操作,即 5个conv_block。 第一、二组采用两次连续的卷积操作。第三、四、五组采用三次连续的卷积操作。每组最后一个卷积后面Dropout概率为0,即不使用Dropout操作。 最后接两层512维的全连接。 通过上面VGG网络提取高层特征,然后经过全连接层映射到类别维度大小的向量,再通过Softmax归一化得到每个类别的概率,也可称作分类器。 ResNet ResNet模型的第1、3、4步和VGG模型相同,这里不再介绍。主要介绍第2步即CIFAR10数据集上ResNet核心模块。 先介绍 resnet_cifar10 中的一些基本函数,再介绍网络连接过程。 conv_bn_layer : 带BN的卷积层。 shortcut : 残差模块的"直连"路径,"直连"实际分两种形式:残差模块输入和输出特征通道数不等时,采用1x1卷积的升维操作;残差模块输入和输出通道相等时,采用直连操作。 basicblock : 一个基础残差模块,即图9左边所示,由两组3x3卷积组成的路径和一条"直连"路径组成。 bottleneck : 一个瓶颈残差模块,即图9右边所示,由上下1x1卷积和中间3x3卷积组成的路径和一条"直连"路径组成。 layer_warp : 一组残差模块,由若干个残差模块堆积而成。每组中第一个残差模块滑动窗口大小与其他可以不同,以用来减少特征图在垂直和水平方向的大小。 resnet_cifar10 的连接结构主要有以下几个过程。 底层输入连接一层 conv_bn_layer,即带BN的卷积层。 然后连接3组残差模块即下面配置3组 layer_warp ,每组采用图 10 左边残差模块组成。 最后对网络做均值池化并返回该层。 注意:除过第一层卷积层和最后一层全连接层之外,要求三组 layer_warp 总的含参层数能够被6整除,即 resnet_cifar10 的 depth 要满足 $(depth - 2) % 6 == 0$ 。 Infererence Program 配置 网络输入定义为 data_layer (数据层),在图像分类中即为图像像素信息。CIFRAR10是RGB 3通道32x32大小的彩色图,因此输入数据大小为3072(3x32x32)。 Train Program 配置 然后我们需要设置训练程序 train_program。它首先从推理程序中进行预测。 在训练期间,它将从预测中计算 avg_cost。 在有监督训练中需要输入图像对应的类别信息,同样通过 fluid.layers.data 来定义。训练中采用多类交叉熵作为损失函数,并作为网络的输出,预测阶段定义网络的输出为分类器得到的概率信息。 注意: 训练程序应该返回一个数组,第一个返回参数必须是 avg_cost。训练器使用它来计算梯度。 Optimizer Function 配置 在下面的 Adam optimizer,learning_rate 是训练的速度,与网络的训练收敛速度有关系。 训练模型 Trainer 配置 现在,我们需要配置 Trainer。Trainer 需要接受训练程序 train_program, place 和优化器 optimizer_func。 Data Feeders 配置 cifar.train10() 每次产生一条样本,在完成shuffle和batch之后,作为训练的输入。 Event Handler 可以使用 event_handler 回调函数来观察训练过程,或进行测试等, 该回调函数是 trainer.train 函数里设定。 event_handler 用来在训练过程中输出文本日志 训练 通过 trainer.train 函数训练: 注意: CPU,每个 Epoch 将花费大约15~20分钟。这部分可能需要一段时间。请随意修改代码,在GPU上运行测试,以提高训练速度。 一轮训练log示例如下所示,经过1个pass, 训练集上平均 Accuracy 为0.59 ,测试集上平均 Accuracy 为0.6 。 图13是训练的分类错误率曲线图,运行到第200个pass后基本收敛,最终得到测试集上分类错误率为8.54%。 图13. CIFAR10数据集上VGG模型的分类错误率 应用模型 可以使用训练好的模型对图片进行分类,下面程序展示了如何使用 fluid.contrib.inferencer.Inferencer 接口进行推断,可以打开注释,更改加载的模型。 生成预测输入数据 dog.png is an example image of a dog. Turn it into an numpy array to match the data feeder format. Inferencer 配置和预测 Inferencer 需要一个 infer_func 和 param_path 来设置网络和经过训练的参数。 我们可以简单地插入前面定义的推理程序。 现在我们准备做预测。 总结 传统图像分类方法由多个阶段构成,框架较为复杂,而端到端的CNN模型结构可一步到位,而且大幅度提升了分类准确率。本文我们首先介绍VGG、GoogleNet、ResNet三个经典的模型;然后基于CIFAR10数据集,介绍如何使用PaddlePaddle配置和训练CNN模型,尤其是VGG和ResNet模型;最后介绍如何使用PaddlePaddle的API接口对图片进行预测和特征提取。对于其他数据集比如ImageNet,配置和训练流程是同样的,大家可以自行进行实验。 参考文献 [1] D. G. Lowe, Distinctive image features from scale-invariant keypoints. IJCV, 60(2):91-110, 2004. [2] N. Dalal, B. Triggs, Histograms of Oriented Gradients for Human Detection, Proc. IEEE Conf. Computer Vision and Pattern Recognition, 2005. [3] Ahonen, T., Hadid, A., and Pietikinen, M. (2006). Face description with local binary patterns: Application to face recognition. PAMI, 28. [4] J. Sivic, A. Zisserman, Video Google: A Text Retrieval Approach to Object Matching in Videos, Proc. Ninth Int'l Conf. Computer Vision, pp. 1470-1478, 2003. [5] B. Olshausen, D. Field, Sparse Coding with an Overcomplete Basis Set: A Strategy Employed by V1?, Vision Research, vol. 37, pp. 3311-3325, 1997. [6] Wang, J., Yang, J., Yu, K., Lv, F., Huang, T., and Gong, Y. (2010). Locality-constrained Linear Coding for image classification. In CVPR. [7] Perronnin, F., Sánchez, J., & Mensink, T. (2010). Improving the fisher kernel for large-scale image classification. In ECCV (4). [8] Lin, Y., Lv, F., Cao, L., Zhu, S., Yang, M., Cour, T., Yu, K., and Huang, T. (2011). Large-scale image clas- sification: Fast feature extraction and SVM training. In CVPR. [9] Krizhevsky, A., Sutskever, I., and Hinton, G. (2012). ImageNet classification with deep convolutional neu- ral networks. In NIPS. [10] G.E. Hinton, N. Srivastava, A. Krizhevsky, I. Sutskever, and R.R. Salakhutdinov. Improving neural networks by preventing co-adaptation of feature detectors. arXiv preprint arXiv:1207.0580, 2012. [11] K. Chatfield, K. Simonyan, A. Vedaldi, A. Zisserman. Return of the Devil in the Details: Delving Deep into Convolutional Nets. BMVC, 2014。 [12] Szegedy, C., Liu, W., Jia, Y., Sermanet, P., Reed, S., Anguelov, D., Erhan, D., Vanhoucke, V., Rabinovich, A., Going deeper with convolutions. In: CVPR. (2015) [13] Lin, M., Chen, Q., and Yan, S. Network in network. In Proc. ICLR, 2014. [14] S. Ioffe and C. Szegedy. Batch normalization: Accelerating deep network training by reducing internal covariate shift. In ICML, 2015. [15] K. He, X. Zhang, S. Ren, J. Sun. Deep Residual Learning for Image Recognition. CVPR 2016. [16] Szegedy, C., Vanhoucke, V., Ioffe, S., Shlens, J., Wojna, Z. Rethinking the incep-tion architecture for computer vision. In: CVPR. (2016). [17] Szegedy, C., Ioffe, S., Vanhoucke, V. Inception-v4, inception-resnet and the impact of residual connections on learning. arXiv:1602.07261 (2016). [18] Everingham, M., Eslami, S. M. A., Van Gool, L., Williams, C. K. I., Winn, J. and Zisserman, A. The Pascal Visual Object Classes Challenge: A Retrospective. International Journal of Computer Vision, 111(1), 98-136, 2015. [19] He, K., Zhang, X., Ren, S., and Sun, J. Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification. ArXiv e-prints, February 2015. [20] http://deeplearning.net/tutorial/lenet.html [21] https://www.cs.toronto.edu/~kriz/cifar.html [22] http://cs231n.github.io/classification/ 来源https://github.com/yanjingang/pigimgclassification
最好有直观地窗口展示~
一、目的 养殖过程中,实现数据方便地自动化采集,减少人为数据的录入和修改,是食品安全溯源信息可信赖的重要环节。 二、流程 1.鱼转塘流程 鱼苗入塘流程 在鱼苗入塘前,操作人员扫描鱼塘二维码信息,系统记录鱼塘信息和操作人员、操作时间等信息,将某批次的鱼苗与鱼塘关联,用于日后鱼的管理。 转塘流程 在转出前,操作人员扫描转出鱼塘二维码信息,系统记录鱼塘信息和操作人员、操作时间等信息。 在转入新鱼塘时,操作人员扫描转出鱼塘二维码信息,系统记录鱼塘信息和操作人员、操作时间等信息。 2.饲料使用流程 在饲料入库后,给每批饲料分配该批次的二维码。 在使用饲料时,操作人员扫描饲料二维码+鱼塘二维码,系统记录饲料信息和鱼塘信息,操作人员、操作时间等信息。 3.药品使用流程 在药品入库后,给每批药品分配该批次的二维码。 在使用药品时,操作人员扫描药品二维码+鱼塘二维码,系统记录药品信息和鱼塘信息,操作人员、操作时间等信息。 4.巡塘流程 在巡塘人员巡塘是,操作人员扫描鱼塘二维码+拍照,系统记录鱼塘信息和相片信息,操作人员、操作时间等信息。 三、采用技术 本项目采用移动应用技术、二维码技术和数据交换技术,实现养殖过程中鱼的管理、饲料管理和药品管理的数据自动采集与处理。 四、系统界面效果 关于本项目更详细的介绍在文件夹Doc中, SCT 3044-2014 养殖水产品可追溯编码规程.pdf 水产品质量溯源系统-业务系统截图.docx 水产品质量溯源系统-养殖过程数据采集流程.doc 水产品质量溯源系统-数据结构说明书.doc 水产品质量溯源系统-数据编码说明 v1.2.doc 水产品质量溯源系统需求说明书1.3.doc 池塘、饲料、药品二维码定义规则.docx 来源https://github.com/codBo/aquatic/tree/master/Doc
开发环境:JDK 1.8 + MySQL 5.7 + Tomcat 8.0.53 数据库名:proj_hospitalizationmansys_ssm 项目&数据库编码集:UTF-8 技术栈: JQuery + Ajax + SpringMVC + Spring + Mybatis + MySQL + Echarts + log4j 体验地址:http://123.56.109.28/HIMS/ 患者服务大厅账户/密码:service/service 医生账户/密码:doctor/doctor 系统管理员账户/密码:manager/manager 护士账户/密码:nurse/nurse 患者账户/密码:患者入院身份证/123456 登录体验请不要修改密码😐 登录 主页 说明书 用户特征曲线 科室占比 床位使用率 运行日志 数据回显 添加新病房类型 参数化 体征曲线 来源https://github.com/yzqyfly/HospitalizationManSys