简 介: ※利用经典的LeNet深度学习网络,可以完成对于智能车竞赛中智能视觉组对搬运物品分类的要求。虽然实际比赛中还会包含有五种交通工具,那么利用LeNet仍然是可以完成小类别的识别与定位的。仅仅使用标准的数据库训练的样本,还是无法满足实际要求,后面还需要: 进一步增加数据库,使得模型能够适应实际环境下所采集到的的图片数据; 进一步对LeNet的网络参数进行精简,毕竟将来改模型需要部署在NXP单片机中,过大的神经网络会使得单片机识别速度降低。

关键词MNISTNXP智能车竞赛

#mermaid-svg-L4uQnz9NhzWaDa39 .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-L4uQnz9NhzWaDa39 .label text{fill:#333}#mermaid-svg-L4uQnz9NhzWaDa39 .node rect,#mermaid-svg-L4uQnz9NhzWaDa39 .node circle,#mermaid-svg-L4uQnz9NhzWaDa39 .node ellipse,#mermaid-svg-L4uQnz9NhzWaDa39 .node polygon,#mermaid-svg-L4uQnz9NhzWaDa39 .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-L4uQnz9NhzWaDa39 .node .label{text-align:center;fill:#333}#mermaid-svg-L4uQnz9NhzWaDa39 .node.clickable{cursor:pointer}#mermaid-svg-L4uQnz9NhzWaDa39 .arrowheadPath{fill:#333}#mermaid-svg-L4uQnz9NhzWaDa39 .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-L4uQnz9NhzWaDa39 .flowchart-link{stroke:#333;fill:none}#mermaid-svg-L4uQnz9NhzWaDa39 .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-L4uQnz9NhzWaDa39 .edgeLabel rect{opacity:0.9}#mermaid-svg-L4uQnz9NhzWaDa39 .edgeLabel span{color:#333}#mermaid-svg-L4uQnz9NhzWaDa39 .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-L4uQnz9NhzWaDa39 .cluster text{fill:#333}#mermaid-svg-L4uQnz9NhzWaDa39 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-L4uQnz9NhzWaDa39 .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-L4uQnz9NhzWaDa39 text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-L4uQnz9NhzWaDa39 .actor-line{stroke:grey}#mermaid-svg-L4uQnz9NhzWaDa39 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-L4uQnz9NhzWaDa39 .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-L4uQnz9NhzWaDa39 #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-L4uQnz9NhzWaDa39 .sequenceNumber{fill:#fff}#mermaid-svg-L4uQnz9NhzWaDa39 #sequencenumber{fill:#333}#mermaid-svg-L4uQnz9NhzWaDa39 #crosshead path{fill:#333;stroke:#333}#mermaid-svg-L4uQnz9NhzWaDa39 .messageText{fill:#333;stroke:#333}#mermaid-svg-L4uQnz9NhzWaDa39 .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-L4uQnz9NhzWaDa39 .labelText,#mermaid-svg-L4uQnz9NhzWaDa39 .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-L4uQnz9NhzWaDa39 .loopText,#mermaid-svg-L4uQnz9NhzWaDa39 .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-L4uQnz9NhzWaDa39 .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-L4uQnz9NhzWaDa39 .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-L4uQnz9NhzWaDa39 .noteText,#mermaid-svg-L4uQnz9NhzWaDa39 .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-L4uQnz9NhzWaDa39 .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-L4uQnz9NhzWaDa39 .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-L4uQnz9NhzWaDa39 .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-L4uQnz9NhzWaDa39 .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-L4uQnz9NhzWaDa39 .section{stroke:none;opacity:0.2}#mermaid-svg-L4uQnz9NhzWaDa39 .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-L4uQnz9NhzWaDa39 .section2{fill:#fff400}#mermaid-svg-L4uQnz9NhzWaDa39 .section1,#mermaid-svg-L4uQnz9NhzWaDa39 .section3{fill:#fff;opacity:0.2}#mermaid-svg-L4uQnz9NhzWaDa39 .sectionTitle0{fill:#333}#mermaid-svg-L4uQnz9NhzWaDa39 .sectionTitle1{fill:#333}#mermaid-svg-L4uQnz9NhzWaDa39 .sectionTitle2{fill:#333}#mermaid-svg-L4uQnz9NhzWaDa39 .sectionTitle3{fill:#333}#mermaid-svg-L4uQnz9NhzWaDa39 .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-L4uQnz9NhzWaDa39 .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-L4uQnz9NhzWaDa39 .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-L4uQnz9NhzWaDa39 .grid path{stroke-width:0}#mermaid-svg-L4uQnz9NhzWaDa39 .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-L4uQnz9NhzWaDa39 .task{stroke-width:2}#mermaid-svg-L4uQnz9NhzWaDa39 .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-L4uQnz9NhzWaDa39 .taskText:not([font-size]){font-size:11px}#mermaid-svg-L4uQnz9NhzWaDa39 .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-L4uQnz9NhzWaDa39 .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-L4uQnz9NhzWaDa39 .task.clickable{cursor:pointer}#mermaid-svg-L4uQnz9NhzWaDa39 .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-L4uQnz9NhzWaDa39 .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-L4uQnz9NhzWaDa39 .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-L4uQnz9NhzWaDa39 .taskText0,#mermaid-svg-L4uQnz9NhzWaDa39 .taskText1,#mermaid-svg-L4uQnz9NhzWaDa39 .taskText2,#mermaid-svg-L4uQnz9NhzWaDa39 .taskText3{fill:#fff}#mermaid-svg-L4uQnz9NhzWaDa39 .task0,#mermaid-svg-L4uQnz9NhzWaDa39 .task1,#mermaid-svg-L4uQnz9NhzWaDa39 .task2,#mermaid-svg-L4uQnz9NhzWaDa39 .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-L4uQnz9NhzWaDa39 .taskTextOutside0,#mermaid-svg-L4uQnz9NhzWaDa39 .taskTextOutside2{fill:#000}#mermaid-svg-L4uQnz9NhzWaDa39 .taskTextOutside1,#mermaid-svg-L4uQnz9NhzWaDa39 .taskTextOutside3{fill:#000}#mermaid-svg-L4uQnz9NhzWaDa39 .active0,#mermaid-svg-L4uQnz9NhzWaDa39 .active1,#mermaid-svg-L4uQnz9NhzWaDa39 .active2,#mermaid-svg-L4uQnz9NhzWaDa39 .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-L4uQnz9NhzWaDa39 .activeText0,#mermaid-svg-L4uQnz9NhzWaDa39 .activeText1,#mermaid-svg-L4uQnz9NhzWaDa39 .activeText2,#mermaid-svg-L4uQnz9NhzWaDa39 .activeText3{fill:#000 !important}#mermaid-svg-L4uQnz9NhzWaDa39 .done0,#mermaid-svg-L4uQnz9NhzWaDa39 .done1,#mermaid-svg-L4uQnz9NhzWaDa39 .done2,#mermaid-svg-L4uQnz9NhzWaDa39 .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-L4uQnz9NhzWaDa39 .doneText0,#mermaid-svg-L4uQnz9NhzWaDa39 .doneText1,#mermaid-svg-L4uQnz9NhzWaDa39 .doneText2,#mermaid-svg-L4uQnz9NhzWaDa39 .doneText3{fill:#000 !important}#mermaid-svg-L4uQnz9NhzWaDa39 .crit0,#mermaid-svg-L4uQnz9NhzWaDa39 .crit1,#mermaid-svg-L4uQnz9NhzWaDa39 .crit2,#mermaid-svg-L4uQnz9NhzWaDa39 .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-L4uQnz9NhzWaDa39 .activeCrit0,#mermaid-svg-L4uQnz9NhzWaDa39 .activeCrit1,#mermaid-svg-L4uQnz9NhzWaDa39 .activeCrit2,#mermaid-svg-L4uQnz9NhzWaDa39 .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-L4uQnz9NhzWaDa39 .doneCrit0,#mermaid-svg-L4uQnz9NhzWaDa39 .doneCrit1,#mermaid-svg-L4uQnz9NhzWaDa39 .doneCrit2,#mermaid-svg-L4uQnz9NhzWaDa39 .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-L4uQnz9NhzWaDa39 .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-L4uQnz9NhzWaDa39 .milestoneText{font-style:italic}#mermaid-svg-L4uQnz9NhzWaDa39 .doneCritText0,#mermaid-svg-L4uQnz9NhzWaDa39 .doneCritText1,#mermaid-svg-L4uQnz9NhzWaDa39 .doneCritText2,#mermaid-svg-L4uQnz9NhzWaDa39 .doneCritText3{fill:#000 !important}#mermaid-svg-L4uQnz9NhzWaDa39 .activeCritText0,#mermaid-svg-L4uQnz9NhzWaDa39 .activeCritText1,#mermaid-svg-L4uQnz9NhzWaDa39 .activeCritText2,#mermaid-svg-L4uQnz9NhzWaDa39 .activeCritText3{fill:#000 !important}#mermaid-svg-L4uQnz9NhzWaDa39 .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-L4uQnz9NhzWaDa39 g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-L4uQnz9NhzWaDa39 g.classGroup text .title{font-weight:bolder}#mermaid-svg-L4uQnz9NhzWaDa39 g.clickable{cursor:pointer}#mermaid-svg-L4uQnz9NhzWaDa39 g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-L4uQnz9NhzWaDa39 g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-L4uQnz9NhzWaDa39 .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-L4uQnz9NhzWaDa39 .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-L4uQnz9NhzWaDa39 .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-L4uQnz9NhzWaDa39 .dashed-line{stroke-dasharray:3}#mermaid-svg-L4uQnz9NhzWaDa39 #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-L4uQnz9NhzWaDa39 #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-L4uQnz9NhzWaDa39 #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-L4uQnz9NhzWaDa39 #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-L4uQnz9NhzWaDa39 #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-L4uQnz9NhzWaDa39 #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-L4uQnz9NhzWaDa39 #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-L4uQnz9NhzWaDa39 #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-L4uQnz9NhzWaDa39 .commit-id,#mermaid-svg-L4uQnz9NhzWaDa39 .commit-msg,#mermaid-svg-L4uQnz9NhzWaDa39 .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-L4uQnz9NhzWaDa39 .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-L4uQnz9NhzWaDa39 .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-L4uQnz9NhzWaDa39 g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-L4uQnz9NhzWaDa39 g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-L4uQnz9NhzWaDa39 g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-L4uQnz9NhzWaDa39 g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-L4uQnz9NhzWaDa39 g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-L4uQnz9NhzWaDa39 g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-L4uQnz9NhzWaDa39 .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-L4uQnz9NhzWaDa39 .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-L4uQnz9NhzWaDa39 .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-L4uQnz9NhzWaDa39 .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-L4uQnz9NhzWaDa39 .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-L4uQnz9NhzWaDa39 .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-L4uQnz9NhzWaDa39 .edgeLabel text{fill:#333}#mermaid-svg-L4uQnz9NhzWaDa39 .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-L4uQnz9NhzWaDa39 .node circle.state-start{fill:black;stroke:black}#mermaid-svg-L4uQnz9NhzWaDa39 .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-L4uQnz9NhzWaDa39 #statediagram-barbEnd{fill:#9370db}#mermaid-svg-L4uQnz9NhzWaDa39 .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-L4uQnz9NhzWaDa39 .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-L4uQnz9NhzWaDa39 .statediagram-state .divider{stroke:#9370db}#mermaid-svg-L4uQnz9NhzWaDa39 .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-L4uQnz9NhzWaDa39 .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-L4uQnz9NhzWaDa39 .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-L4uQnz9NhzWaDa39 .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-L4uQnz9NhzWaDa39 .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-L4uQnz9NhzWaDa39 .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-L4uQnz9NhzWaDa39 .note-edge{stroke-dasharray:5}#mermaid-svg-L4uQnz9NhzWaDa39 .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-L4uQnz9NhzWaDa39 .error-icon{fill:#522}#mermaid-svg-L4uQnz9NhzWaDa39 .error-text{fill:#522;stroke:#522}#mermaid-svg-L4uQnz9NhzWaDa39 .edge-thickness-normal{stroke-width:2px}#mermaid-svg-L4uQnz9NhzWaDa39 .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-L4uQnz9NhzWaDa39 .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-L4uQnz9NhzWaDa39 .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-L4uQnz9NhzWaDa39 .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-L4uQnz9NhzWaDa39 .marker{fill:#333}#mermaid-svg-L4uQnz9NhzWaDa39 .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-L4uQnz9NhzWaDa39 {color: rgba(0, 0, 0, 0.75);font: ;}

faMNIST图片库
文章目录
背景
三种MNIST数据集合
LeNet网络
背景
图片分类
训练对比
识别总结

§01 faMNIST图片库


1.1 背景

  在 第十六届全国大学生智能车竞赛AI视觉组 中,要求车模在NXP嵌入式平台上完成对于赛道上的数字、Apriltag、动物(五种)、水果(五种)的识别。在新的一届智能车竞赛中,要求对于动物、水果(总共10种)进行子类的识别,即对具体哪一种动物(牛、狗、猪、猫、马)、水果(榴莲、橙子、苹果、葡萄、香蕉)进行分类。至于 子类中 的细分就不再要求了。

▲ 图1.1.1 智能视觉组中的动物与水果

▲ 图1.1 智能车模在进行图片任务识别

1.2 三种“MNIST”数据集合

1.2.1 MNIST

  在深度学习中, MNIST数据集合 是一种基本图片集合,是进行模式识别与深度学习中的“Hello World ”数据集合。可以在 YANN.LECUN : http://yann.lecun.com/exdb/mnist/ 网站获取。它包括有训练和测试样本总共有60000个。

▲ 图1.2.1 MNIST数据库

1.2.2 Fashion-MNIST

  Fashion-MNIST 是一个替代 MNIST 手写数字集 的图像数据集。 它是由 Zalando(一家德国的时尚科技公司)旗下的研究部门提供。其涵盖了来自 10 种类别的共 7 万个不同商品的正面图片。

  FashionMNIST 的大小、格式和训练集/测试集划分与原始的 MNIST 完全一致。60000/10000 的训练测试数据划分,28x28 的灰度图片。你可以直接用它来测试你的机器学习和深度学习算法性能,且不需要改动任何的代码。

▲ 图1.2.2 Fashion-MNIST数据集合

1.2.3 faMNIST

  在 第十六届智能汽车竞赛AI视觉组分赛区数据集 包含了906张 283×283彩色动物和水果的数据集合,原本 用于智能车竞赛中智能视觉组嵌入式识别的训练集合,在 LeNet对于水果与动物进行分类 被转换成语MNIST相同的尺寸格式。这样可以用于神经网络初学者学习CNN的测试集合。

faMNIST10图片库:
种类:10大类
色彩:灰度
尺寸:32×32

  下面是faMNIST10中的部分图片样本。

▲ 图1.2.3 faMNIST10-gray 中部分图片样本

  在 飞桨AI Studio - 人工智能学习与实训社区 : https://aistudio.baidu.com/aistudio/datasetdetail/121924 可以下载带改数据集合。其中包括有五个目录:

├─famnist-all :283×283彩色图片
├─famnist10 :32×32彩色图片
├─famnist10-64 :64×64彩色图片
├─famnist10-64-gray :64×64灰度图片
└─famnist10-gray :32×32灰度图片

  这个集合会随着智能车竞赛同学们的搜集逐步丰富起来。

§02 LeNet网络


2.1 背景

  LeNet神经网络 由深度学习三巨头之一的Yan LeCun提出,他同时也是卷积神经网络 (CNN,Convolutional Neural Networks)之父。LeNet主要用来进行手写字符的识别与分类,并在美国的银行中投入了使用。

  LeNet的实现确立了CNN的结构,现在神经网络中的许多内容在LeNet的网络结构中都能看到,例如卷积层,Pooling层,ReLU层。虽然LeNet早在20世纪90年代就已经提出了,但由于当时缺乏大规模的训练数据,计算机硬件的性能也较低,因此LeNet神经网络在处理复杂问题时效果并不理想。虽然LeNet网络结构比较简单,但是刚好适合神经网络的入门学习。

▲ 图2.1.1 LeNET神经网络结构

▲ 图2.1.2 手写体字符数据

2.2 图片分类

  无论是手写体字符,还是普通的图片,在计算机中都是有数字组成的矩阵。同样的CNN网络也可以进行分类。下面就利用LeNet来对于faMNIST数据集合进行分类。

  测试分类环境就利用百度的PaddlePaddle中的 AI Studio ,利用AI Studio就无需在自己的电脑上安装复杂的深度学习环境,只要电脑能够联网就可以在任何一个接入点完成深度学习网络的搭建与训练。百度 已经是连续第三年对全国大学生智能车竞赛竞赛进行赞助 了,免费的培训和算力卡更是帮助同学们对车模作品注入更多的人工智能。

2.2.1 读入图像数据

  从子目录 /home/studio/data/famnist/famnist10-gray中读入灰度图片数据,并根据文件名称生成图片的标号。文件名的第一个字母对应的数字与动物、水果对应关系参加下面python 字典中的说。

afname = {'cat':0, 'cow':1, 'dog':2, 'horse':3, 'pig':4,'apple':5, 'banana':6, 'durian':7, 'grape':8, 'orange':9}
import cv2import paddle
import paddle.nn.functional as F
from paddle import to_tensor as TT
from paddle.nn.functional import square_error_cost as sqrcfamnist = '/home/aistudio/data/famnist'
imgdir = 'famnist10-gray'#------------------------------------------------------------
def loadimgdata(imgdir):'''loadimgdata: Load test image data into RAMParam imgdir: Directory for storing the image picture .Return: imgdata,imglabel'''imgfile = os.listdir(imgdir)imgdata = []imglabel = []for f in imgfile:img = cv2.imread(os.path.join(imgdir, f))imgdata.append(img.T[0][newaxis,:])imglabel.append(int(f[:1]))return array(imgdata), array(imglabel)imgdata,imglabel = loadimgdata(os.path.join(famnist,imgdir))

2.2.2 构建训练数据加载函数

  为了后面对网络进行训练,根据paddle技术文档说明,构建如下的数据加载函数。它本质上需要完成以下两个函数的重载:

  • getitem :返回有参数 index指定下表的图片数据和对应的标号。数据类型为Tensor(‘float32’)以及Tensor(‘int64’)。
  • len :返回训练数据的总数。
class famnist(paddle.io.Dataset):def __init__(self, num_samples):super(famnist, self).__init__()self.num_samples = num_samplesdef __getitem__(self, index):data = imgdata[index]/255label = imglabel[index]return TT(data, dtype='float32'), TT(label, dtype='int64')def __len__(self):return self.num_samples_dataset = famnist(len(imglabel))
train_loader = paddle.io.DataLoader(_dataset, batch_size=100, shuffle=True)

  最终有 paddle.io.DataLoader函数进行封装,提供批训练的数据块,以及对数据进行随机打乱。

2.2.3 构建LeNet网络

imageSize = 32
ks = 5
in_channel=1
L = ((imageSize-ks+1)//2-ks+1)//2class mnist(paddle.nn.Layer):def __init__(self, ):super(mnist, self).__init__()self.conv1 = paddle.nn.Conv2D(in_channels=in_channel, out_channels=6, kernel_size=ks, stride=1, padding=0)self.conv2 = paddle.nn.Conv2D(in_channels=6, out_channels=16, kernel_size=ks, stride=1, padding=0)self.mp1    = paddle.nn.MaxPool2D(kernel_size=2, stride=2)self.mp2    = paddle.nn.MaxPool2D(kernel_size=2, stride=2)self.L1     = paddle.nn.Linear(in_features=16*L*L, out_features=120)self.L2     = paddle.nn.Linear(in_features=120, out_features=86)self.L3     = paddle.nn.Linear(in_features=86, out_features=10)def forward(self, x):x = self.conv1(x)x = F.relu(x)x = self.mp1(x)x = self.conv2(x)x = F.relu(x)x = self.mp2(x)x = paddle.flatten(x, start_axis=1, stop_axis=-1)x = self.L1(x)x = F.relu(x)x = self.L2(x)x = F.relu(x)x = self.L3(x)return x

  这是标准的LeNet网络结构。是由两个卷积-Pooling层,三个全连接层组成。卷积核尺寸为5。
  下面是由 paddle.summary()函数给出的网络基本参数。

---------------------------------------------------------------------------Layer (type)       Input Shape          Output Shape         Param #
===========================================================================Conv2D-7      [[100, 1, 32, 32]]    [100, 6, 28, 28]         156      MaxPool2D-7    [[100, 6, 28, 28]]    [100, 6, 14, 14]          0       Conv2D-8      [[100, 6, 14, 14]]   [100, 16, 10, 10]        2,416     MaxPool2D-8   [[100, 16, 10, 10]]    [100, 16, 5, 5]           0       Linear-10        [[100, 400]]          [100, 120]          48,120     Linear-11        [[100, 120]]          [100, 86]           10,406     Linear-12        [[100, 86]]           [100, 10]             870
===========================================================================
Total params: 61,968
Trainable params: 61,968
Non-trainable params: 0
---------------------------------------------------------------------------
Input size (MB): 0.39
Forward/backward pass size (MB): 6.18
Params size (MB): 0.24
Estimated Total Size (MB): 6.80
---------------------------------------------------------------------------

  网络的运算参数,可以由paddle.flops函数给出。下表显示了卷积核尺寸为5的情况下,对应的每层的计算量。可以看到前面两层的卷积运算占了整个网络运算量的86%,减少卷积运算是提高网络速度的关键。

+--------------+-------------------+-------------------+--------+----------+
|  Layer Name  |    Input Shape    |    Output Shape   | Params |  Flops   |
+--------------+-------------------+-------------------+--------+----------+
|   conv2d_6   |  [100, 1, 32, 32] |  [100, 6, 28, 28] |  156   | 12230400 |
|   conv2d_7   |  [100, 6, 14, 14] | [100, 16, 10, 10] |  2416  | 24160000 |
| max_pool2d_6 |  [100, 6, 28, 28] |  [100, 6, 14, 14] |   0    |    0     |
| max_pool2d_7 | [100, 16, 10, 10] |  [100, 16, 5, 5]  |   0    |    0     |
|   linear_9   |     [100, 400]    |     [100, 120]    | 48120  | 4800000  |
|  linear_10   |     [100, 120]    |     [100, 86]     | 10406  | 1032000  |
|  linear_11   |     [100, 86]     |     [100, 10]     |  870   |  86000   |
+--------------+-------------------+-------------------+--------+----------+
Total Flops: 42308400     Total Params: 61968
paddle.summary(net, input_size=(100,in_channel,imageSize,imageSize))
paddle.flops(net, input_size=(100, in_channel, imageSize, imageSize), print_detail=True)

2.2.4 网络训练

  下面就是对该网络进行100循环的训练。

net = mnist()
EPOCH_NUM = 100
optimizer = paddle.optimizer.Adam(learning_rate=0.01, parameters=net.parameters())for epoch in range(EPOCH_NUM):for batchid, data in enumerate(train_loader()):out = net(data[0])loss = F.cross_entropy(out, data[1])acc = paddle.metric.accuracy(out, data[1])loss.backward()optimizer.step()optimizer.clear_grad()if batchid %100==0:print("Pass:{}, Loss:{}, Acc:{}".format(epoch,loss.numpy(), acc.numpy()))

  训练过程中网络的损失函数和分类精度变化曲线由下图所示。可以看到经过30个循环的训练网络基本上就达到了100%的识别性能。

▲ 图2.2.1 LeNet在faMNIST训练收敛情况

2.3 训练对比

  LeNet作为一个简单的CNN,虽然对于复杂的问题来说,它的分类能力有限。但对于faMNIST数据集合,它还是具有很强的识别性能。

2.3.1 卷积核尺寸

  在 对于FAMNIST中的十种动物和水果进行识别测试 对比了不同的卷积核尺寸大小对于faMNIST数据集合分类效果对比。除了卷积核不能够为 1 之外,其他尺寸的卷积核对于识别能力影响不大。卷积核尺寸越小,网络的运算量就越小。

  下面给出了卷积核的尺寸为2和7两种情况下网络训练收敛情况,两种情况差别不大。

▲ 图2.3.1 卷积核尺寸为2 对应的训练收敛曲线

▲ 图2.3.2 卷积核尺寸为7对应的训练收敛曲线

2.3.2 学习速率

  学习速率是网络训练过程中的调节参数(Super-Parameters,超参)。在LeNet对faMNIST训练集合上,学习速率 lr 在小于0.05的情况下都可以使得网络很快收敛。而且lr 越大,网络收敛越快。

▲ 图2.3.3 不同的学习速率对应的网络收敛情况

  一旦学习速率超过0.05,网络训练就会不收敛。网络识别的精度一直很低。

▲ 图2.3.4 网络收敛情况会随着学习速率大于0.05而发生突变

2.3.3 不同训练集合

  LeNet网络对于faMNIST五种不同的规格都可以很好的分类,无论是黑白还是彩色图片,无论尺寸是32×32,还是64×64,识别效果差不多。甚至对于原始的283×283也能够很好的识别。

  之所以这样,最主要的原因是:

  • 图片的质量比较好,没有实际环境光线的影响;
  • 样本数量比较少;

  因为,为了将来能够使得训练模型能够适应不同环境下、不同视角下、不同距离下采集到的的图片识别,需要通过一定的数据增强的方法来扩展训练集合。

※ 识别总结 ※


  利用经典的LeNet深度学习网络,可以完成对于智能车竞赛中智能视觉组对搬运物品分类的要求。虽然实际比赛中还会包含有五种交通工具,那么利用LeNet仍然是可以完成小类别的识别与定位的。

  仅仅使用标准的数据库训练的样本,还是无法满足实际要求,后面还需要:

  • 进一步增加数据库,使得模型能够适应实际环境下所采集到的的图片数据;
  • 进一步对LeNet的网络参数进行精简,毕竟将来改模型需要部署在NXP单片机中,过大的神经网络会使得单片机识别速度降低。

■ 相关文献链接:

  • 第十六届智能汽车竞赛AI视觉组分赛区数据集发布
  • 这些动物,你认识几个呢
  • MNIST数据集合
  • YANN.LECUN
  • Fashion-MNIST
  • MNIST 手写数字集
  • 2021年人工神经网络第四次作业-第一题:LeNet对于水果与动物进行分类
  • 飞桨AI Studio - 人工智能学习与实训社区
  • LeNet神经网络
  • 本机安装PaddlePaddle - 安装指南
  • 第十七届全国大学生智能汽车竞赛创意组-百度智慧交通 “丝绸之路”比赛规则
  • 对于FAMNIST中的十种动物和水果进行识别测试

● 相关图表链接:

  • 图1.1.1 智能视觉组中的动物与水果
  • 图1.1 智能车模在进行图片任务识别
  • 图1.2.1 MNIST数据库
  • 图1.2.2 Fashion-MNIST数据集合
  • 图1.2.3 faMNIST10-gray 中部分图片样本
  • 图2.1.1 LeNET神经网络结构
  • 图2.1.2 手写体字符数据
  • 图2.2.1 LeNet在faMNIST训练收敛情况
  • 图2.3.1 卷积核尺寸为2 对应的训练收敛曲线
  • 图2.3.2 卷积核尺寸为7对应的训练收敛曲线
  • 图2.3.3 不同的学习速率对应的网络收敛情况
  • 图2.3.4 网络收敛情况会随着学习速率大于0.05而发生突变

利用LeNet识别十种动物和水果相关推荐

  1. 对于FAMNIST中的十种动物和水果进行识别测试

    简 介: 对于有五中动物和五中水果组成的FAMNIST10(Fruit-Animal MNSIT数据集合),利用LeNet进行识别进行了测试.测试了不同的卷积核尺寸,不同的学习速率以及不同的数据集合的 ...

  2. 东京奥运会将利用 AI 识别可疑人员

    东京奥运会将利用 AI 识别可疑人员 2020 年东京奥运会和残奥会期间,日本的核心目标之一就是展示世界上最先进的技术. 这些活动将为日本公司提供利用其尖端技术吸引全球关注的绝佳机会. 两项即将推出的 ...

  3. Android利用RecognizerIntent识别语音并简单实现打电话动作

    关于Android利用RecognizerIntent识别语音并简单实现打电话,具体看实现代码如下: package com.example.recognizerintentactivity;impo ...

  4. python新闻联播分类_如何利用人脸识别自动切分视频

    前些天被问到这样一个问题,能不能做视频分镜头,更确切的是自动切分视频片段.拿央视的新闻联播来说,30分钟的新闻联播,可能包含十多个新闻话题,希望能够自动把这10多个话题进行切分. 这个问题蛮有意思的, ...

  5. 利用python识别身份证号后获取年龄和性别信息

    利用python识别身份证号后获取年龄和性别信息 1. 实验目的 利用python识别身份证号后,从身份证号中获取年龄和性别信息 2. 主代码 1. 身份证号码识别 # !/usr/bin/pytho ...

  6. python zxing 识别条码_详解利用python识别图片中的条码(pyzbar)及条码图片矫正和增强...

    前言 这周和大家分享如何用python识别图像里的条码.用到的库可以是zbar.希望西瓜6辛苦码的代码不要被盗了.(zxing的话,我一直没有装好,等装好之后再写一篇) 具体步骤 前期准备 用open ...

  7. 【玩转华为云】手把手教你利用ModelArts识别偶像的声音

    本篇推文共计2000个字,阅读时间约3分钟. 华为云-华为公司倾力打造的云战略品牌,2011年成立,致力于为全球客户提供领先的公有云服务,包含弹性云服务器.云数据库.云安全等云计算服务,软件开发服务, ...

  8. 利用机器学习识别验证码(从0到1)

    最近喜欢先把测试结果图放前面.大家可以先看下效果. 识别速度并不是很快,代码并没有进一步优化. 本篇主要讲的是 从制作验证码开始,到我们利用机器学习识别出来结果的过程. 利用机器学习识别验证码的思路是 ...

  9. Animals-10 数据集下载,十种动物

    kaggle上的一个数据集 十种动物 狗,猫,马,大象,蝴蝶,鸡,牛,羊,蜘蛛,松鼠 每个种类一两千图片, 也有四五千的. 格式.jpeg 官方下载地址:https://www.kaggle.com/ ...

最新文章

  1. elasticsearch health yellow
  2. SqlServer 中的临时表与表变量
  3. boost::spirit::classic相关的测试程序
  4. JVM内存结构|本地方法栈和堆
  5. ESP8266等模块
  6. 彩票抽奖(洛谷P2550题题解,Java语言描述)
  7. 两百个jQuery插件集合
  8. 面向接口的开发到面向对象的编程
  9. DT大数据梦工厂 第67讲
  10. 在自动驾驶技术上,一向自信满满的马斯克也承认了特斯拉的不足
  11. VScode保存快捷键(ctrl+s)失效
  12. GeoTools-WKT\GeoJson相互转换
  13. 钢筋穿入女子太阳穴 消防及时破拆将其营救
  14. SQL链接EXCEL文件
  15. 黑猴子的家:Scala 常用类型
  16. Bugku_Misc_Licking dog diary
  17. 我的token鉴权机制hanhan
  18. Omorn - NJ301-1100 AND NX102-9000 - Socket - TCP 通讯
  19. Cortex-A15 Processor 简介
  20. Linux DPDK UIO

热门文章

  1. postman测试post请求
  2. vc++ 6.0对话框上无法显示中文(乱码)
  3. 【Django】@login_required用法简介
  4. asp.net core 教程(七)-异常处理、静态文件
  5. Caffe Windows版本的编译
  6. string之substring的用法
  7. Python数组合并
  8. linux中的FTP服务配置详解
  9. 4.12 《硬啃设计模式》 第29章 行为型设计模式小结
  10. 淘宝分布式框架Fourinone2.0正式版发布