forked from FT_DSP/FT_DSP.gitlink.net
766 lines
134 KiB
HTML
766 lines
134 KiB
HTML
|
||
|
||
<!DOCTYPE html>
|
||
<html class="writer-html5" lang="zh-CN" data-content_root="../../">
|
||
<head>
|
||
<meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" />
|
||
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||
<title>GRAY_CNN(图片灰度化处理+图片识别) — MindSpore Signal+ 使用手册 alpha 文档</title>
|
||
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=03e43079" />
|
||
<link rel="stylesheet" type="text/css" href="../../_static/css/theme.css?v=e59714d7" />
|
||
<link rel="stylesheet" type="text/css" href="../../_static/table.css?v=72b86d3e" />
|
||
|
||
|
||
<script src="../../_static/jquery.js?v=5d32c60e"></script>
|
||
<script src="../../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
|
||
<script src="../../_static/documentation_options.js?v=406e4f49"></script>
|
||
<script src="../../_static/doctools.js?v=9bcbadda"></script>
|
||
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
|
||
<script src="../../_static/translations.js?v=beaddf03"></script>
|
||
<script async="async" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
|
||
<script src="../../_static/table.js?v=99ed15ba"></script>
|
||
<script src="../../_static/js/theme.js"></script>
|
||
<link rel="index" title="索引" href="../../genindex.html" />
|
||
<link rel="search" title="搜索" href="../../search.html" />
|
||
<link rel="next" title="DSP应用示例" href="../dsp/index.html" />
|
||
<link rel="prev" title="AI+DSP应用示例" href="index.html" />
|
||
</head>
|
||
|
||
<body class="wy-body-for-nav">
|
||
<div class="wy-grid-for-nav">
|
||
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
|
||
<div class="wy-side-scroll">
|
||
<div class="wy-side-nav-search" >
|
||
|
||
|
||
|
||
<a href="../../index.html" class="icon icon-home">
|
||
MindSpore Signal+ 使用手册
|
||
</a>
|
||
<div role="search">
|
||
<form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
|
||
<input type="text" name="q" placeholder="搜索文档" aria-label="搜索文档" />
|
||
<input type="hidden" name="check_keywords" value="yes" />
|
||
<input type="hidden" name="area" value="default" />
|
||
</form>
|
||
</div>
|
||
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="导航菜单">
|
||
<ul class="current">
|
||
<li class="toctree-l1"><a class="reference internal" href="../../quickstart/index.html">快速入门</a></li>
|
||
<li class="toctree-l1 current"><a class="reference internal" href="../index.html">应用开发示例</a><ul class="current">
|
||
<li class="toctree-l2 current"><a class="reference internal" href="index.html">AI+DSP应用示例</a><ul class="current">
|
||
<li class="toctree-l3 current"><a class="current reference internal" href="#">GRAY_CNN(图片灰度化处理+图片识别)</a><ul>
|
||
<li class="toctree-l4"><a class="reference internal" href="#id1">应用概述</a></li>
|
||
<li class="toctree-l4"><a class="reference internal" href="#id2">开发流程</a></li>
|
||
<li class="toctree-l4"><a class="reference internal" href="#python">python完整代码示例</a></li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li class="toctree-l2"><a class="reference internal" href="../dsp/index.html">DSP应用示例</a></li>
|
||
<li class="toctree-l2"><a class="reference internal" href="../autocodegen/index.html">AI辅助开发示例</a></li>
|
||
</ul>
|
||
</li>
|
||
<li class="toctree-l1"><a class="reference internal" href="../../functionlib/index.html">算子库支持</a></li>
|
||
<li class="toctree-l1"><a class="reference internal" href="../../refdoc/index.html">参考资料</a></li>
|
||
</ul>
|
||
|
||
</div>
|
||
</div>
|
||
</nav>
|
||
|
||
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="移动版导航菜单" >
|
||
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
|
||
<a href="../../index.html">MindSpore Signal+ 使用手册</a>
|
||
</nav>
|
||
|
||
<div class="wy-nav-content">
|
||
<div class="rst-content">
|
||
<div role="navigation" aria-label="页面导航">
|
||
<ul class="wy-breadcrumbs">
|
||
<li><a href="../../index.html" class="icon icon-home" aria-label="Home"></a></li>
|
||
<li class="breadcrumb-item"><a href="../index.html">应用开发示例</a></li>
|
||
<li class="breadcrumb-item"><a href="index.html">AI+DSP应用示例</a></li>
|
||
<li class="breadcrumb-item active">GRAY_CNN(图片灰度化处理+图片识别)</li>
|
||
<li class="wy-breadcrumbs-aside">
|
||
<a href="../../_sources/appdevelop/ai_dsp/gray_cnn.rst.txt" rel="nofollow"> 查看页面源码</a>
|
||
</li>
|
||
</ul>
|
||
<hr/>
|
||
</div>
|
||
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
|
||
<div itemprop="articleBody">
|
||
|
||
<section id="gray-cnn">
|
||
<h1>GRAY_CNN(图片灰度化处理+图片识别)<a class="headerlink" href="#gray-cnn" title="Link to this heading"></a></h1>
|
||
<section id="id1">
|
||
<h2>应用概述<a class="headerlink" href="#id1" title="Link to this heading"></a></h2>
|
||
<blockquote>
|
||
<div><p>这里将以图片灰度化加图片识别来介绍AI+DSP应用开发的开发流程。
|
||
其中图片灰度化可以使用DSP来完成,图片识别则使用AI来完成。
|
||
灰度化处理使用灰度化公式来进行,图片识别使用CNN模型。</p>
|
||
</div></blockquote>
|
||
</section>
|
||
<section id="id2">
|
||
<h2>开发流程<a class="headerlink" href="#id2" title="Link to this heading"></a></h2>
|
||
<section id="id3">
|
||
<h3>1. 定义模型<a class="headerlink" href="#id3" title="Link to this heading"></a></h3>
|
||
<blockquote>
|
||
<div><ul class="simple">
|
||
<li><p><strong>图片灰度化处理过程。</strong></p></li>
|
||
</ul>
|
||
<p>这里实现图片灰度化,使用蓝、绿、红三个通道的值进行加权求和,计算出一个灰度值。
|
||
这里使用的权重分别是0.114、0.587和0.299,这些数值是基于人眼对不同颜色的敏感度来选择的,
|
||
用于将彩色图像转换为灰度图像。公式为:</p>
|
||
<div class="math notranslate nohighlight">
|
||
\[Gray = B \times 0.114 + G \times 0.587 + R \times 0.299\]</div>
|
||
<p>以及定义一个Clip操作,确保灰度值在0到255之间。
|
||
代码示例如下:</p>
|
||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="kn">import</span><span class="w"> </span><span class="nn">mindspore</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">ms</span>
|
||
<span class="linenos"> 2</span><span class="kn">from</span><span class="w"> </span><span class="nn">mindspore.train.serialization</span><span class="w"> </span><span class="kn">import</span> <span class="n">export</span>
|
||
<span class="linenos"> 3</span><span class="kn">import</span><span class="w"> </span><span class="nn">numpy</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">np</span>
|
||
<span class="linenos"> 4</span><span class="kn">from</span><span class="w"> </span><span class="nn">mindspore</span><span class="w"> </span><span class="kn">import</span> <span class="n">nn</span><span class="p">,</span> <span class="n">ops</span>
|
||
<span class="linenos"> 5</span>
|
||
<span class="linenos"> 6</span><span class="k">class</span><span class="w"> </span><span class="nc">Gray</span><span class="p">(</span><span class="n">nn</span><span class="o">.</span><span class="n">Cell</span><span class="p">):</span>
|
||
<span class="linenos"> 7</span> <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="linenos"> 8</span> <span class="nb">super</span><span class="p">(</span><span class="n">Gray</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
|
||
<span class="linenos"> 9</span> <span class="bp">self</span><span class="o">.</span><span class="n">split</span> <span class="o">=</span> <span class="n">ops</span><span class="o">.</span><span class="n">Split</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">output_num</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span>
|
||
<span class="linenos">10</span> <span class="k">def</span><span class="w"> </span><span class="nf">construct</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span>
|
||
<span class="linenos">11</span> <span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
|
||
<span class="linenos">12</span> <span class="n">b</span><span class="p">,</span> <span class="n">g</span><span class="p">,</span> <span class="n">r</span> <span class="o">=</span> <span class="n">x</span>
|
||
<span class="linenos">13</span> <span class="n">x</span> <span class="o">=</span> <span class="p">(</span>
|
||
<span class="linenos">14</span> <span class="n">b</span> <span class="o">*</span> <span class="mf">0.114</span> <span class="o">+</span>
|
||
<span class="linenos">15</span> <span class="n">g</span> <span class="o">*</span> <span class="mf">0.587</span> <span class="o">+</span>
|
||
<span class="linenos">16</span> <span class="n">r</span> <span class="o">*</span> <span class="mf">0.299</span>
|
||
<span class="linenos">17</span> <span class="p">)</span><span class="o">.</span><span class="n">squeeze</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
|
||
<span class="linenos">18</span> <span class="n">x</span> <span class="o">=</span> <span class="n">ops</span><span class="o">.</span><span class="n">clip_by_value</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">255</span><span class="p">)</span>
|
||
<span class="linenos">19</span> <span class="k">return</span> <span class="n">x</span>
|
||
</pre></div>
|
||
</div>
|
||
<ul class="simple">
|
||
<li><p><strong>定义AI模型,用于图片识别。</strong></p></li>
|
||
</ul>
|
||
<p>这里的AI模型是卷积神经网络(CNN)。CNN主要由卷积,池化,激活等算子组成;
|
||
CNN模型架构如下表所示:</p>
|
||
<table class="docutils align-center">
|
||
<colgroup>
|
||
<col style="width: 17.6%" />
|
||
<col style="width: 23.5%" />
|
||
<col style="width: 35.3%" />
|
||
<col style="width: 23.5%" />
|
||
</colgroup>
|
||
<thead>
|
||
<tr class="row-odd"><th class="head"><p><strong>层级</strong></p></th>
|
||
<th class="head"><p><strong>操作类型</strong></p></th>
|
||
<th class="head"><p><strong>参数细节</strong></p></th>
|
||
<th class="head"><p><strong>输出维度</strong></p></th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr class="row-even"><td><p><strong>输入层</strong></p></td>
|
||
<td><p>灰度图像输入</p></td>
|
||
<td><p>1通道,尺寸 H×W</p></td>
|
||
<td><p>H×W×1</p></td>
|
||
</tr>
|
||
<tr class="row-odd"><td><p><strong>卷积块1</strong></p></td>
|
||
<td><p>Conv2d</p></td>
|
||
<td><p>输入通道:1 → 输出通道:32, 卷积核:3×3</p></td>
|
||
<td><p>H×W×32</p></td>
|
||
</tr>
|
||
<tr class="row-even"><td></td>
|
||
<td><p>ReLU激活</p></td>
|
||
<td><p>非线性变换</p></td>
|
||
<td><p>H×W×32</p></td>
|
||
</tr>
|
||
<tr class="row-odd"><td></td>
|
||
<td><p>MaxPool2d</p></td>
|
||
<td><p>窗口:2×2, 步长:2</p></td>
|
||
<td><p>H/2×W/2×32</p></td>
|
||
</tr>
|
||
<tr class="row-even"><td><p><strong>卷积块2</strong></p></td>
|
||
<td><p>Conv2d</p></td>
|
||
<td><p>输入通道:32 → 输出通道:64, 卷积核:3×3</p></td>
|
||
<td><p>H/2×W/2×64</p></td>
|
||
</tr>
|
||
<tr class="row-odd"><td></td>
|
||
<td><p>ReLU激活</p></td>
|
||
<td><p>非线性变换</p></td>
|
||
<td><p>H/2×W/2×64</p></td>
|
||
</tr>
|
||
<tr class="row-even"><td></td>
|
||
<td><p>MaxPool2d</p></td>
|
||
<td><p>窗口:2×2, 步长:2</p></td>
|
||
<td><p>H/4×W/4×64</p></td>
|
||
</tr>
|
||
<tr class="row-odd"><td><p><strong>卷积块3</strong></p></td>
|
||
<td><p>Conv2d</p></td>
|
||
<td><p>输入通道:64 → 输出通道:128, 卷积核:3×3</p></td>
|
||
<td><p>H/4×W/4×128</p></td>
|
||
</tr>
|
||
<tr class="row-even"><td></td>
|
||
<td><p>ReLU激活</p></td>
|
||
<td><p>非线性变换</p></td>
|
||
<td><p>H/4×W/4×128</p></td>
|
||
</tr>
|
||
<tr class="row-odd"><td></td>
|
||
<td><p>MaxPool2d</p></td>
|
||
<td><p>窗口:2×2, 步长:2</p></td>
|
||
<td><p>H/8×W/8×128</p></td>
|
||
</tr>
|
||
<tr class="row-even"><td><p><strong>全连接层</strong></p></td>
|
||
<td><p>Flatten</p></td>
|
||
<td><p>展平多维特征图</p></td>
|
||
<td><p>32768 (H/8×W/8×128)</p></td>
|
||
</tr>
|
||
<tr class="row-odd"><td></td>
|
||
<td><p>Dense</p></td>
|
||
<td><p>输入:32768 → 输出:64, 激活:ReLU</p></td>
|
||
<td><p>64</p></td>
|
||
</tr>
|
||
<tr class="row-even"><td></td>
|
||
<td><p>Dense (输出层)</p></td>
|
||
<td><p>输入:64 → 输出:5, 无激活</p></td>
|
||
<td><p>5</p></td>
|
||
</tr>
|
||
<tr class="row-odd"><td><p><strong>输出层</strong></p></td>
|
||
<td><p>分类结果</p></td>
|
||
<td><p>5类概率分布</p></td>
|
||
<td><p>5</p></td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p>CNN模型用于图片识别,不能直接导出模型,需要训练模型,该部分内容见: <a class="reference internal" href="#model-training"><span class="std std-ref">2. 模型训练</span></a></p>
|
||
<p>定义CNN模型的代码示例如下:</p>
|
||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="kn">import</span><span class="w"> </span><span class="nn">mindspore</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">ms</span>
|
||
<span class="linenos"> 2</span><span class="kn">from</span><span class="w"> </span><span class="nn">mindspore</span><span class="w"> </span><span class="kn">import</span> <span class="n">nn</span>
|
||
<span class="linenos"> 3</span><span class="k">class</span><span class="w"> </span><span class="nc">CNN</span><span class="p">(</span><span class="n">nn</span><span class="o">.</span><span class="n">Cell</span><span class="p">):</span>
|
||
<span class="linenos"> 4</span><span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="linenos"> 5</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
|
||
<span class="linenos"> 6</span> <span class="bp">self</span><span class="o">.</span><span class="n">conv1</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">Conv2d</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">32</span><span class="p">,</span> <span class="n">kernel_size</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">has_bias</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
||
<span class="linenos"> 7</span> <span class="bp">self</span><span class="o">.</span><span class="n">pool1</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">MaxPool2d</span><span class="p">(</span><span class="n">kernel_size</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">stride</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
|
||
<span class="linenos"> 8</span> <span class="bp">self</span><span class="o">.</span><span class="n">conv2</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">Conv2d</span><span class="p">(</span><span class="mi">32</span><span class="p">,</span> <span class="mi">64</span><span class="p">,</span> <span class="n">kernel_size</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">has_bias</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
||
<span class="linenos"> 9</span> <span class="bp">self</span><span class="o">.</span><span class="n">pool2</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">MaxPool2d</span><span class="p">(</span><span class="n">kernel_size</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">stride</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
|
||
<span class="linenos">10</span> <span class="bp">self</span><span class="o">.</span><span class="n">conv3</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">Conv2d</span><span class="p">(</span><span class="mi">64</span><span class="p">,</span> <span class="mi">128</span><span class="p">,</span> <span class="n">kernel_size</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">has_bias</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
||
<span class="linenos">11</span> <span class="bp">self</span><span class="o">.</span><span class="n">pool3</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">MaxPool2d</span><span class="p">(</span><span class="n">kernel_size</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">stride</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
|
||
<span class="linenos">12</span> <span class="bp">self</span><span class="o">.</span><span class="n">flatten</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">Flatten</span><span class="p">()</span>
|
||
<span class="linenos">13</span> <span class="bp">self</span><span class="o">.</span><span class="n">dense1</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">Dense</span><span class="p">(</span><span class="mi">32768</span><span class="p">,</span> <span class="mi">64</span><span class="p">)</span>
|
||
<span class="linenos">14</span> <span class="bp">self</span><span class="o">.</span><span class="n">dense2</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">Dense</span><span class="p">(</span><span class="mi">64</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
|
||
<span class="linenos">15</span> <span class="bp">self</span><span class="o">.</span><span class="n">relu</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">ReLU</span><span class="p">()</span>
|
||
<span class="linenos">16</span>
|
||
<span class="linenos">17</span><span class="k">def</span><span class="w"> </span><span class="nf">construct</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span>
|
||
<span class="linenos">18</span> <span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">relu</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">conv1</span><span class="p">(</span><span class="n">x</span><span class="p">))</span>
|
||
<span class="linenos">19</span> <span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">pool1</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
|
||
<span class="linenos">20</span> <span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">relu</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">conv2</span><span class="p">(</span><span class="n">x</span><span class="p">))</span>
|
||
<span class="linenos">21</span> <span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">pool2</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
|
||
<span class="linenos">22</span> <span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">relu</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">conv3</span><span class="p">(</span><span class="n">x</span><span class="p">))</span>
|
||
<span class="linenos">23</span> <span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">pool3</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
|
||
<span class="linenos">24</span> <span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">flatten</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
|
||
<span class="linenos">25</span> <span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">relu</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dense1</span><span class="p">(</span><span class="n">x</span><span class="p">))</span>
|
||
<span class="linenos">26</span> <span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">dense2</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
|
||
<span class="linenos">27</span> <span class="k">return</span> <span class="n">x</span>
|
||
</pre></div>
|
||
</div>
|
||
</div></blockquote>
|
||
</section>
|
||
<section id="model-training">
|
||
<span id="id4"></span><h3>2. 模型训练<a class="headerlink" href="#model-training" title="Link to this heading"></a></h3>
|
||
<blockquote>
|
||
<div><p>CNN模型需要进行训练才能正确识别,训练需要数据集,这里已经提前准备好数据集,放在Target文件夹下,
|
||
使用MindSpore框架进行模型训练,需要导入相关库和模块,定义数据预处理、模型结构、损失函数和优化器等。
|
||
重新组网时,直接使用 <code class="docutils literal notranslate"><span class="pre">nn.GraphCell()</span></code> 接口会导致权重丢失,
|
||
可以在训练前时使用 <code class="docutils literal notranslate"><span class="pre">ms.save_checkpoint()</span></code> 接口保存成ckpt文件,
|
||
重新组网时,使用 <code class="docutils literal notranslate"><span class="pre">ms.load_checkpoint()</span></code> 接口加载ckpt文件即可。
|
||
以下代码展示了如何加载数据集,进行10次模型训练,以及导出模型。
|
||
训练以及导出模型代码如下:</p>
|
||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="kn">import</span><span class="w"> </span><span class="nn">mindspore</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">ms</span>
|
||
<span class="linenos"> 2</span><span class="kn">from</span><span class="w"> </span><span class="nn">mindspore.train.serialization</span><span class="w"> </span><span class="kn">import</span> <span class="n">export</span>
|
||
<span class="linenos"> 3</span><span class="kn">from</span><span class="w"> </span><span class="nn">mindspore</span><span class="w"> </span><span class="kn">import</span> <span class="n">nn</span><span class="p">,</span> <span class="n">context</span>
|
||
<span class="linenos"> 4</span><span class="kn">import</span><span class="w"> </span><span class="nn">numpy</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">np</span>
|
||
<span class="linenos"> 5</span><span class="kn">from</span><span class="w"> </span><span class="nn">PIL</span><span class="w"> </span><span class="kn">import</span> <span class="n">Image</span>
|
||
<span class="linenos"> 6</span><span class="kn">import</span><span class="w"> </span><span class="nn">mindspore.dataset</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">ds</span>
|
||
<span class="linenos"> 7</span><span class="kn">from</span><span class="w"> </span><span class="nn">mindspore.dataset</span><span class="w"> </span><span class="kn">import</span> <span class="n">py_transforms</span>
|
||
<span class="linenos"> 8</span><span class="kn">import</span><span class="w"> </span><span class="nn">mindspore.dataset.vision</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">CV</span>
|
||
<span class="linenos"> 9</span><span class="kn">from</span><span class="w"> </span><span class="nn">mindspore.train.callback</span><span class="w"> </span><span class="kn">import</span> <span class="n">LossMonitor</span>
|
||
<span class="linenos">10</span>
|
||
<span class="linenos">11</span><span class="n">batch_size</span> <span class="o">=</span> <span class="mi">32</span>
|
||
<span class="linenos">12</span><span class="n">img_size</span> <span class="o">=</span> <span class="p">(</span><span class="mi">128</span><span class="p">,</span> <span class="mi">128</span><span class="p">)</span>
|
||
<span class="linenos">13</span><span class="n">data_path</span> <span class="o">=</span> <span class="s1">'./Target'</span>
|
||
<span class="linenos">14</span>
|
||
<span class="linenos">15</span><span class="c1"># 数据预处理</span>
|
||
<span class="linenos">16</span><span class="k">def</span><span class="w"> </span><span class="nf">rescale_to_0_1</span><span class="p">(</span><span class="n">image</span><span class="p">):</span>
|
||
<span class="linenos">17</span> <span class="k">return</span> <span class="n">image</span> <span class="o">/</span> <span class="mf">255.0</span>
|
||
<span class="linenos">18</span>
|
||
<span class="linenos">19</span><span class="c1"># 自定义函数,添加 color 通道维度</span>
|
||
<span class="linenos">20</span><span class="k">def</span><span class="w"> </span><span class="nf">add_channels</span><span class="p">(</span><span class="n">image</span><span class="p">):</span>
|
||
<span class="linenos">21</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">image</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span> <span class="c1"># 单个图像,没有 cin_channel 维度</span>
|
||
<span class="linenos">22</span> <span class="n">image_four_channels</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">expand_dims</span><span class="p">(</span><span class="n">image</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
|
||
<span class="linenos">23</span> <span class="k">else</span><span class="p">:</span>
|
||
<span class="linenos">24</span> <span class="k">pass</span>
|
||
<span class="linenos">25</span> <span class="k">return</span> <span class="n">image</span>
|
||
<span class="linenos">26</span> <span class="k">return</span> <span class="n">image_four_channels</span>
|
||
<span class="linenos">27</span>
|
||
<span class="linenos">28</span><span class="k">def</span><span class="w"> </span><span class="nf">export_cnn</span><span class="p">():</span>
|
||
<span class="linenos">29</span> <span class="n">context</span><span class="o">.</span><span class="n">set_context</span><span class="p">(</span><span class="n">mode</span><span class="o">=</span><span class="n">context</span><span class="o">.</span><span class="n">PYNATIVE_MODE</span><span class="p">,</span> <span class="n">device_target</span><span class="o">=</span><span class="s2">"CPU"</span><span class="p">)</span>
|
||
<span class="linenos">30</span> <span class="n">resize_op</span> <span class="o">=</span> <span class="n">CV</span><span class="o">.</span><span class="n">Resize</span><span class="p">(</span><span class="n">img_size</span><span class="p">)</span>
|
||
<span class="linenos">31</span> <span class="n">rescale_transform</span> <span class="o">=</span> <span class="n">ms</span><span class="o">.</span><span class="n">dataset</span><span class="o">.</span><span class="n">transforms</span><span class="o">.</span><span class="n">Compose</span><span class="p">([</span><span class="n">rescale_to_0_1</span><span class="p">])</span>
|
||
<span class="linenos">32</span> <span class="n">f32_typecast</span> <span class="o">=</span> <span class="n">ms</span><span class="o">.</span><span class="n">dataset</span><span class="o">.</span><span class="n">transforms</span><span class="o">.</span><span class="n">TypeCast</span><span class="p">(</span><span class="n">ms</span><span class="o">.</span><span class="n">float32</span><span class="p">)</span>
|
||
<span class="linenos">33</span> <span class="c1"># 将读取的 RGB 转为 GRAY 模式</span>
|
||
<span class="linenos">34</span> <span class="n">convert_gray</span> <span class="o">=</span> <span class="n">ms</span><span class="o">.</span><span class="n">dataset</span><span class="o">.</span><span class="n">vision</span><span class="o">.</span><span class="n">ConvertColor</span><span class="p">(</span><span class="n">ms</span><span class="o">.</span><span class="n">dataset</span><span class="o">.</span><span class="n">vision</span><span class="o">.</span><span class="n">ConvertMode</span><span class="o">.</span><span class="n">COLOR_RGB2GRAY</span><span class="p">)</span>
|
||
<span class="linenos">35</span>
|
||
<span class="linenos">36</span> <span class="n">transform</span> <span class="o">=</span> <span class="p">[</span><span class="n">convert_gray</span><span class="p">,</span> <span class="n">resize_op</span><span class="p">,</span> <span class="n">f32_typecast</span><span class="p">,</span> <span class="n">rescale_transform</span><span class="p">,</span> <span class="n">CV</span><span class="o">.</span><span class="n">HWC2CHW</span><span class="p">()]</span>
|
||
<span class="linenos">37</span> <span class="n">train_data</span> <span class="o">=</span> <span class="n">ds</span><span class="o">.</span><span class="n">ImageFolderDataset</span><span class="p">(</span><span class="n">dataset_dir</span><span class="o">=</span><span class="n">data_path</span><span class="p">,</span> <span class="n">decode</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">extensions</span><span class="o">=</span><span class="p">[</span><span class="s2">".JPEG"</span><span class="p">,</span> <span class="s2">".PNG"</span><span class="p">,</span> <span class="s2">".JPG"</span><span class="p">])</span>
|
||
<span class="linenos">38</span> <span class="n">train_data</span> <span class="o">=</span> <span class="n">train_data</span><span class="o">.</span><span class="n">map</span><span class="p">(</span><span class="n">input_columns</span><span class="o">=</span><span class="s2">"image"</span><span class="p">,</span> <span class="n">operations</span><span class="o">=</span> <span class="n">transform</span><span class="p">)</span>
|
||
<span class="linenos">39</span> <span class="n">train_data</span> <span class="o">=</span> <span class="n">train_data</span><span class="o">.</span><span class="n">map</span><span class="p">(</span><span class="n">operations</span><span class="o">=</span><span class="k">lambda</span> <span class="n">image</span><span class="p">:</span> <span class="n">add_channels</span><span class="p">(</span><span class="n">image</span><span class="p">),</span> \
|
||
<span class="linenos">40</span> <span class="n">input_columns</span><span class="o">=</span><span class="p">[</span><span class="s2">"image"</span><span class="p">],</span> \
|
||
<span class="linenos">41</span> <span class="n">output_columns</span><span class="o">=</span><span class="p">[</span><span class="s2">"image"</span><span class="p">])</span>
|
||
<span class="linenos">42</span> <span class="n">train_data</span> <span class="o">=</span> <span class="n">train_data</span><span class="o">.</span><span class="n">batch</span><span class="p">(</span><span class="n">batch_size</span><span class="o">=</span><span class="n">batch_size</span><span class="p">)</span>
|
||
<span class="linenos">43</span> <span class="n">data_iter</span> <span class="o">=</span> <span class="n">train_data</span><span class="o">.</span><span class="n">create_dict_iterator</span><span class="p">()</span>
|
||
<span class="linenos">44</span> <span class="nb">print</span><span class="p">(</span><span class="s2">"数据集加载完成"</span><span class="p">)</span>
|
||
<span class="linenos">45</span>
|
||
<span class="linenos">46</span> <span class="n">my_model</span> <span class="o">=</span> <span class="n">CNN</span><span class="p">()</span>
|
||
<span class="linenos">47</span> <span class="n">loss</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">CrossEntropyLoss</span><span class="p">(</span><span class="n">reduction</span><span class="o">=</span><span class="s1">'mean'</span><span class="p">)</span>
|
||
<span class="linenos">48</span> <span class="n">optimizer</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">Adam</span><span class="p">(</span><span class="n">my_model</span><span class="o">.</span><span class="n">trainable_params</span><span class="p">(),</span> <span class="n">learning_rate</span><span class="o">=</span><span class="mf">0.01</span><span class="p">)</span>
|
||
<span class="linenos">49</span> <span class="n">cnn_model</span> <span class="o">=</span> <span class="n">ms</span><span class="o">.</span><span class="n">Model</span><span class="p">(</span><span class="n">my_model</span><span class="p">,</span> <span class="n">loss_fn</span><span class="o">=</span><span class="n">loss</span><span class="p">,</span> <span class="n">optimizer</span><span class="o">=</span><span class="n">optimizer</span><span class="p">,</span> <span class="n">metrics</span><span class="o">=</span><span class="p">{</span><span class="s1">'Accuracy'</span><span class="p">:</span> <span class="n">nn</span><span class="o">.</span><span class="n">Accuracy</span><span class="p">()})</span>
|
||
<span class="linenos">50</span> <span class="nb">print</span><span class="p">(</span><span class="s2">"网络构建完成"</span><span class="p">)</span>
|
||
<span class="linenos">51</span> <span class="n">num_epoch</span> <span class="o">=</span> <span class="mi">10</span>
|
||
<span class="linenos">52</span> <span class="n">cnn_model</span><span class="o">.</span><span class="n">train</span><span class="p">(</span><span class="n">num_epoch</span><span class="p">,</span> <span class="n">train_data</span><span class="p">,</span><span class="n">callbacks</span><span class="o">=</span><span class="p">[</span><span class="n">LossMonitor</span><span class="p">()],</span><span class="n">dataset_sink_mode</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||
<span class="linenos">53</span> <span class="n">inputs</span> <span class="o">=</span> <span class="n">ms</span><span class="o">.</span><span class="n">Tensor</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">randn</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">128</span><span class="p">,</span> <span class="mi">128</span><span class="p">)</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">float32</span><span class="p">))</span>
|
||
<span class="linenos">54</span> <span class="n">ms</span><span class="o">.</span><span class="n">save_checkpoint</span><span class="p">(</span><span class="n">my_model</span><span class="p">,</span> <span class="s1">'cnn.ckpt'</span><span class="p">)</span>
|
||
<span class="linenos">55</span> <span class="n">export</span><span class="p">(</span><span class="n">my_model</span><span class="p">,</span> <span class="n">inputs</span><span class="p">,</span> <span class="n">file_name</span><span class="o">=</span><span class="s1">'cnn'</span><span class="p">,</span> <span class="n">file_format</span><span class="o">=</span><span class="s2">"MINDIR"</span><span class="p">)</span>
|
||
</pre></div>
|
||
</div>
|
||
</div></blockquote>
|
||
</section>
|
||
<section id="id5">
|
||
<h3>3. 重新组网<a class="headerlink" href="#id5" title="Link to this heading"></a></h3>
|
||
<blockquote>
|
||
<div><p>在前面章节中,我们已经完成了AI的模型的训练和导出。
|
||
需要重新构建成一个新的网络结构,可以使用MindSpore框架的 <code class="docutils literal notranslate"><span class="pre">nn.GraphCell()</span></code> 接口来实现。
|
||
该部分内容包括加载训练好的cnn模型,灰度化处理,重新构建网络结构,并导出新的模型。
|
||
重新组网、导出模型以及测试的代码如下:</p>
|
||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="kn">import</span><span class="w"> </span><span class="nn">cv2</span>
|
||
<span class="linenos"> 2</span><span class="kn">import</span><span class="w"> </span><span class="nn">mindspore</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">ms</span>
|
||
<span class="linenos"> 3</span><span class="kn">from</span><span class="w"> </span><span class="nn">mindspore.train.serialization</span><span class="w"> </span><span class="kn">import</span> <span class="n">export</span>
|
||
<span class="linenos"> 4</span><span class="kn">import</span><span class="w"> </span><span class="nn">numpy</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">np</span>
|
||
<span class="linenos"> 5</span><span class="kn">from</span><span class="w"> </span><span class="nn">mindspore</span><span class="w"> </span><span class="kn">import</span> <span class="n">nn</span><span class="p">,</span> <span class="n">ops</span><span class="p">,</span> <span class="n">context</span>
|
||
<span class="linenos"> 6</span><span class="kn">from</span><span class="w"> </span><span class="nn">CNN</span><span class="w"> </span><span class="kn">import</span> <span class="n">export_cnn</span>
|
||
<span class="linenos"> 7</span><span class="kn">from</span><span class="w"> </span><span class="nn">GRAY</span><span class="w"> </span><span class="kn">import</span> <span class="n">export_gray</span>
|
||
<span class="linenos"> 8</span><span class="kn">from</span><span class="w"> </span><span class="nn">Connection</span><span class="w"> </span><span class="kn">import</span> <span class="n">export_connection</span>
|
||
<span class="linenos"> 9</span>
|
||
<span class="linenos">10</span><span class="n">class_names</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'BRDM_2'</span><span class="p">,</span> <span class="s1">'BTR_60'</span><span class="p">,</span> <span class="s1">'SLICY'</span><span class="p">,</span> <span class="s1">'T62'</span><span class="p">,</span> <span class="s1">'ZSU_23_4'</span><span class="p">]</span>
|
||
<span class="linenos">11</span><span class="n">class_labels</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"装甲侦察车"</span><span class="p">,</span> <span class="s2">"装甲运输车"</span><span class="p">,</span> <span class="s2">"不明"</span><span class="p">,</span> <span class="s2">"坦克"</span><span class="p">,</span> <span class="s2">"自行高炮"</span><span class="p">]</span>
|
||
<span class="linenos">12</span><span class="k">class</span><span class="w"> </span><span class="nc">GrayCNN</span><span class="p">(</span><span class="n">nn</span><span class="o">.</span><span class="n">Cell</span><span class="p">):</span>
|
||
<span class="linenos">13</span> <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="linenos">14</span> <span class="nb">super</span><span class="p">(</span><span class="n">GrayCNN</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
|
||
<span class="linenos">15</span> <span class="bp">self</span><span class="o">.</span><span class="n">split</span> <span class="o">=</span> <span class="n">ops</span><span class="o">.</span><span class="n">Split</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">output_num</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span>
|
||
<span class="linenos">16</span> <span class="bp">self</span><span class="o">.</span><span class="n">conv1</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">Conv2d</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">32</span><span class="p">,</span> <span class="n">kernel_size</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">has_bias</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
||
<span class="linenos">17</span> <span class="bp">self</span><span class="o">.</span><span class="n">pool1</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">MaxPool2d</span><span class="p">(</span><span class="n">kernel_size</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">stride</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
|
||
<span class="linenos">18</span> <span class="bp">self</span><span class="o">.</span><span class="n">conv2</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">Conv2d</span><span class="p">(</span><span class="mi">32</span><span class="p">,</span> <span class="mi">64</span><span class="p">,</span> <span class="n">kernel_size</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">has_bias</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
||
<span class="linenos">19</span> <span class="bp">self</span><span class="o">.</span><span class="n">pool2</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">MaxPool2d</span><span class="p">(</span><span class="n">kernel_size</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">stride</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
|
||
<span class="linenos">20</span> <span class="bp">self</span><span class="o">.</span><span class="n">conv3</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">Conv2d</span><span class="p">(</span><span class="mi">64</span><span class="p">,</span> <span class="mi">128</span><span class="p">,</span> <span class="n">kernel_size</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">has_bias</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
||
<span class="linenos">21</span> <span class="bp">self</span><span class="o">.</span><span class="n">pool3</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">MaxPool2d</span><span class="p">(</span><span class="n">kernel_size</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">stride</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
|
||
<span class="linenos">22</span> <span class="bp">self</span><span class="o">.</span><span class="n">flatten</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">Flatten</span><span class="p">()</span>
|
||
<span class="linenos">23</span> <span class="bp">self</span><span class="o">.</span><span class="n">dense1</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">Dense</span><span class="p">(</span><span class="mi">32768</span><span class="p">,</span> <span class="mi">64</span><span class="p">)</span>
|
||
<span class="linenos">24</span> <span class="bp">self</span><span class="o">.</span><span class="n">dense2</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">Dense</span><span class="p">(</span><span class="mi">64</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
|
||
<span class="linenos">25</span> <span class="bp">self</span><span class="o">.</span><span class="n">relu</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">ReLU</span><span class="p">()</span>
|
||
<span class="linenos">26</span> <span class="bp">self</span><span class="o">.</span><span class="n">cnn</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">GraphCell</span><span class="p">(</span><span class="n">ms</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">file_name</span><span class="o">=</span><span class="s2">"cnn.mindir"</span><span class="p">))</span>
|
||
<span class="linenos">27</span> <span class="k">def</span><span class="w"> </span><span class="nf">construct</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span>
|
||
<span class="linenos">28</span> <span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
|
||
<span class="linenos">29</span> <span class="n">b</span><span class="p">,</span> <span class="n">g</span><span class="p">,</span> <span class="n">r</span> <span class="o">=</span> <span class="n">x</span>
|
||
<span class="linenos">30</span> <span class="n">x</span> <span class="o">=</span> <span class="p">(</span>
|
||
<span class="linenos">31</span> <span class="n">b</span> <span class="o">*</span> <span class="mf">0.114</span> <span class="o">+</span>
|
||
<span class="linenos">32</span> <span class="n">g</span> <span class="o">*</span> <span class="mf">0.587</span> <span class="o">+</span>
|
||
<span class="linenos">33</span> <span class="n">r</span> <span class="o">*</span> <span class="mf">0.299</span>
|
||
<span class="linenos">34</span> <span class="p">)</span><span class="o">.</span><span class="n">squeeze</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
|
||
<span class="linenos">35</span> <span class="n">x</span> <span class="o">=</span> <span class="n">ops</span><span class="o">.</span><span class="n">clip_by_value</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">255</span><span class="p">)</span>
|
||
<span class="linenos">36</span> <span class="n">x</span> <span class="o">=</span> <span class="n">x</span> <span class="o">/</span> <span class="mf">255.0</span> <span class="c1"># 数据归一化</span>
|
||
<span class="linenos">37</span> <span class="n">x</span> <span class="o">=</span> <span class="n">x</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">128</span><span class="p">,</span> <span class="mi">128</span><span class="p">)</span> <span class="c1"># 灰度化处理后结果需要重塑成cnn输入形状</span>
|
||
<span class="linenos">38</span> <span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">cnn</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
|
||
<span class="linenos">39</span> <span class="k">return</span> <span class="n">x</span>
|
||
<span class="linenos">40</span>
|
||
<span class="linenos">41</span><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">"__main__"</span><span class="p">:</span>
|
||
<span class="linenos">42</span> <span class="n">export_cnn</span><span class="p">()</span>
|
||
<span class="linenos">43</span> <span class="n">context</span><span class="o">.</span><span class="n">set_context</span><span class="p">(</span><span class="n">mode</span><span class="o">=</span><span class="n">context</span><span class="o">.</span><span class="n">GRAPH_MODE</span><span class="p">)</span>
|
||
<span class="linenos">44</span> <span class="c1"># 1. 读取图片(保持原始uint8类型)</span>
|
||
<span class="linenos">45</span> <span class="n">color_image</span> <span class="o">=</span> <span class="n">cv2</span><span class="o">.</span><span class="n">imread</span><span class="p">(</span><span class="s2">"image_origin.jpg"</span><span class="p">)</span> <span class="c1"># 默认uint8</span>
|
||
<span class="linenos">46</span> <span class="n">resized_image</span> <span class="o">=</span> <span class="n">cv2</span><span class="o">.</span><span class="n">resize</span><span class="p">(</span>
|
||
<span class="linenos">47</span> <span class="n">color_image</span><span class="p">,</span>
|
||
<span class="linenos">48</span> <span class="p">(</span><span class="mi">128</span><span class="p">,</span> <span class="mi">128</span><span class="p">),</span> <span class="c1"># 目标尺寸(width, height)</span>
|
||
<span class="linenos">49</span> <span class="n">interpolation</span><span class="o">=</span><span class="n">cv2</span><span class="o">.</span><span class="n">INTER_LINEAR</span>
|
||
<span class="linenos">50</span> <span class="p">)</span>
|
||
<span class="linenos">51</span> <span class="n">resized_image</span> <span class="o">=</span> <span class="n">resized_image</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">float32</span><span class="p">)</span>
|
||
<span class="linenos">52</span> <span class="n">resized_image_tensor</span> <span class="o">=</span> <span class="n">ms</span><span class="o">.</span><span class="n">Tensor</span><span class="p">(</span><span class="n">resized_image</span><span class="p">)</span>
|
||
<span class="linenos">53</span>
|
||
<span class="linenos">54</span> <span class="n">my_model</span> <span class="o">=</span> <span class="n">GrayCNN</span><span class="p">()</span>
|
||
<span class="linenos">55</span> <span class="n">param_dict</span> <span class="o">=</span> <span class="n">ms</span><span class="o">.</span><span class="n">load_checkpoint</span><span class="p">(</span><span class="s2">"cnn.ckpt"</span><span class="p">)</span>
|
||
<span class="linenos">56</span> <span class="n">param_not_load</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">ms</span><span class="o">.</span><span class="n">load_param_into_net</span><span class="p">(</span><span class="n">my_model</span><span class="p">,</span> <span class="n">param_dict</span><span class="p">,</span> <span class="n">strict_load</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
||
<span class="linenos">57</span>
|
||
<span class="linenos">58</span> <span class="n">input_tensor</span> <span class="o">=</span> <span class="n">ms</span><span class="o">.</span><span class="n">Tensor</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">ones</span><span class="p">((</span><span class="mi">128</span><span class="p">,</span> <span class="mi">128</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">float32</span><span class="p">))</span>
|
||
<span class="linenos">59</span> <span class="n">export</span><span class="p">(</span><span class="n">my_model</span><span class="p">,</span> <span class="n">input_tensor</span><span class="p">,</span> <span class="n">file_name</span><span class="o">=</span><span class="s1">'gray_cnn'</span><span class="p">,</span> <span class="n">file_format</span><span class="o">=</span><span class="s1">'MINDIR'</span><span class="p">)</span>
|
||
<span class="linenos">60</span>
|
||
<span class="linenos">61</span> <span class="n">reload_cnn</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">GraphCell</span><span class="p">(</span><span class="n">ms</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">file_name</span><span class="o">=</span><span class="s1">'gray_cnn.mindir'</span><span class="p">))</span>
|
||
<span class="linenos">62</span> <span class="n">reload_cnn</span> <span class="o">=</span> <span class="n">ms</span><span class="o">.</span><span class="n">Model</span><span class="p">(</span><span class="n">reload_cnn</span><span class="p">)</span>
|
||
<span class="linenos">63</span> <span class="n">m</span> <span class="o">=</span> <span class="n">reload_cnn</span><span class="o">.</span><span class="n">predict</span><span class="p">(</span><span class="n">resized_image_tensor</span><span class="p">)</span>
|
||
<span class="linenos">64</span> <span class="nb">print</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
|
||
<span class="linenos">65</span> <span class="n">output_np</span> <span class="o">=</span> <span class="n">m</span><span class="o">.</span><span class="n">asnumpy</span><span class="p">()</span>
|
||
<span class="linenos">66</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">output_np</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span> <span class="c1"># 对于分类任务,通常输出是[batch_size, num_classes]</span>
|
||
<span class="linenos">67</span> <span class="n">output_prob</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">exp</span><span class="p">(</span><span class="n">output_np</span><span class="p">)</span> <span class="o">/</span> <span class="n">np</span><span class="o">.</span><span class="n">exp</span><span class="p">(</span><span class="n">output_np</span><span class="p">)</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">keepdims</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
||
<span class="linenos">68</span> <span class="n">predicted_class</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">argmax</span><span class="p">(</span><span class="n">output_prob</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
|
||
<span class="linenos">69</span> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"预测结果: </span><span class="si">{</span><span class="n">class_labels</span><span class="p">[</span><span class="n">predicted_class</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>该代码首先定义了一个新的网络结构GrayCNN,
|
||
在 <code class="docutils literal notranslate"><span class="pre">construct</span></code> 方法中,首先通过gray模型处理输入图像,然后通过归一化和重塑张量,最后cnn模型进行识别。
|
||
在主函数中,首先导出cnn模型。
|
||
然后加载cnn模型参数,并使用MindSpore的 <code class="docutils literal notranslate"><span class="pre">export</span></code> 方法导出新的网络结构。
|
||
最后,使用重新组网后的模型进行预测,并输出结果。</p>
|
||
</div></blockquote>
|
||
</section>
|
||
<section id="id6">
|
||
<h3>4. 转换模型<a class="headerlink" href="#id6" title="Link to this heading"></a></h3>
|
||
<blockquote>
|
||
<div><p>在前面的代码中,我们已经使用了 <code class="docutils literal notranslate"><span class="pre">export</span></code> 方法导出了gray_cnn.mindir模型。
|
||
要将该模型部署到FT78NE平台,需要将MINDIR格式转换成mindspore lite的ms格式模型。
|
||
要将该模型转换为ms格式,可以使用MindSpore的转换工具(converter_lite)。
|
||
该工具已经集成在我们的 <code class="docutils literal notranslate"><span class="pre">YHFT-IDE</span></code> 中,可以直接在IDE中使用。或者也可以使用命令行工具进行转换。</p>
|
||
<p>转换命令如下:</p>
|
||
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>./converter_lite<span class="w"> </span>--fmk<span class="o">=</span>MINDIR<span class="w"> </span>--modelFile<span class="o">=</span>gray_cnn.mindir<span class="w"> </span>--outputFile<span class="o">=</span>gray_cnn
|
||
</pre></div>
|
||
</div>
|
||
<p>转换完成后,会在当前目录下生成gray_cnn.ms模型文件。该模型可以使用可视化工具(netron)可以打开该文件,查看模型结构。
|
||
该工具可以直接在 <code class="docutils literal notranslate"><span class="pre">YHFT-IDE</span></code> 中使用,可以从官网下载使用,也可以在线使用。在线地址为:<a class="reference external" href="https://netron.app/">https://netron.app/</a>。</p>
|
||
<p>该模型文件可视化如图所示:</p>
|
||
<a class="reference internal image-reference" href="../../_images/gray_cnn.png"><img alt="gray_cnn模型结构图" class="align-center" src="../../_images/gray_cnn.png" style="width: 40.0%; height: 2025.0px;" />
|
||
</a>
|
||
</div></blockquote>
|
||
</section>
|
||
<section id="id7">
|
||
<h3>5. 部署和运行程序<a class="headerlink" href="#id7" title="Link to this heading"></a></h3>
|
||
<blockquote>
|
||
<div><ul>
|
||
<li><p>在IDE中新建一个Python项目,将下面的 <a class="reference internal" href="#python-code"><span class="std std-ref">python完整代码示例</span></a> 代码拷贝到项目中,并运行。
|
||
运行成功后,会在当前目录下生成一个名为 <code class="docutils literal notranslate"><span class="pre">gray_cnn.midir</span></code> 的模型文件,以及输出图片的预测结果。
|
||
结果如图所示:</p>
|
||
<a class="reference internal image-reference" href="../../_images/python_gray_cnn_res.png"><img alt="python运行结果" class="align-center" src="../../_images/python_gray_cnn_res.png" style="width: 40.0%; height: 67.5px;" />
|
||
</a>
|
||
<p>将该文件转换为ms格式,并将ms格式模型和测试图片拷贝到FT78NE平台中。</p>
|
||
</li>
|
||
<li><p>打开 <code class="docutils literal notranslate"><span class="pre">YHFT-IDE</span></code> ,新建工程。输入工程名、路径,工程类型选择 <code class="docutils literal notranslate"><span class="pre">Heterogeneous</span></code> ,
|
||
输入交叉编译工具路径,然后点确定。会生成一个异构模板工程。通过修改 <code class="docutils literal notranslate"><span class="pre">data_handler.cc</span></code> 文件中的函数来调整输入输出数据,
|
||
输入改成读取的图片路径;输出改成相应的后处理。在 <code class="docutils literal notranslate"><span class="pre">main</span></code> 函数设置运行后端;修改 <code class="docutils literal notranslate"><span class="pre">CMakeLists.txt</span></code> 文件,
|
||
添加openCV库的lib和include路径, 最后编译该工程,编译成功后将build文件夹下的 <code class="docutils literal notranslate"><span class="pre">main</span></code> 拷贝到FT78NE平台中,
|
||
要和gray_cnn.ms模型同一个文件夹下。</p>
|
||
<p>输入的c++代码示例如下:</p>
|
||
</li>
|
||
</ul>
|
||
<div class="highlight-c++ notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="cp">#include</span><span class="w"> </span><span class="cpf"><opencv2/opencv.hpp></span>
|
||
<span class="linenos"> 2</span><span class="kt">int</span><span class="w"> </span><span class="nf">readImage</span><span class="p">(</span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="n">reslut</span><span class="p">,</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="w"> </span><span class="n">imagePath</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<span class="linenos"> 3</span><span class="w"> </span><span class="n">cv</span><span class="o">::</span><span class="n">Mat</span><span class="w"> </span><span class="n">color_image</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">cv</span><span class="o">::</span><span class="n">imread</span><span class="p">(</span><span class="n">imagePath</span><span class="p">.</span><span class="n">c_str</span><span class="p">(),</span><span class="w"> </span><span class="n">cv</span><span class="o">::</span><span class="n">IMREAD_COLOR</span><span class="p">);</span>
|
||
<span class="linenos"> 4</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">color_image</span><span class="p">.</span><span class="n">empty</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
|
||
<span class="linenos"> 5</span><span class="w"> </span><span class="n">fprintf</span><span class="p">(</span><span class="n">stderr</span><span class="p">,</span><span class="w"> </span><span class="s">"read image failed</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
|
||
<span class="linenos"> 6</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">-1</span><span class="p">;</span>
|
||
<span class="linenos"> 7</span><span class="w"> </span><span class="p">}</span>
|
||
<span class="linenos"> 8</span>
|
||
<span class="linenos"> 9</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">width</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">128</span><span class="p">;</span>
|
||
<span class="linenos">10</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">height</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">128</span><span class="p">;</span>
|
||
<span class="linenos">11</span><span class="w"> </span><span class="n">cv</span><span class="o">::</span><span class="n">Mat</span><span class="w"> </span><span class="n">resized_image</span><span class="p">;</span>
|
||
<span class="linenos">12</span><span class="w"> </span><span class="n">cv</span><span class="o">::</span><span class="n">resize</span><span class="p">(</span><span class="n">color_image</span><span class="p">,</span><span class="w"> </span><span class="n">resized_image</span><span class="p">,</span><span class="w"> </span><span class="n">cv</span><span class="o">::</span><span class="n">Size</span><span class="p">(</span><span class="n">width</span><span class="p">,</span><span class="w"> </span><span class="n">height</span><span class="p">),</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="n">cv</span><span class="o">::</span><span class="n">INTER_LINEAR</span><span class="p">);</span>
|
||
<span class="linenos">13</span><span class="w"> </span><span class="n">resized_image</span><span class="p">.</span><span class="n">convertTo</span><span class="p">(</span><span class="n">resized_image</span><span class="p">,</span><span class="w"> </span><span class="n">CV_32F</span><span class="p">);</span>
|
||
<span class="linenos">14</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">channels</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">resized_image</span><span class="p">.</span><span class="n">channels</span><span class="p">();</span>
|
||
<span class="linenos">15</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">element_count</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">width</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">height</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">channels</span><span class="p">;</span>
|
||
<span class="linenos">16</span>
|
||
<span class="linenos">17</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">height</span><span class="p">;</span><span class="w"> </span><span class="o">++</span><span class="n">i</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<span class="linenos">18</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="n">src_ptr</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">resized_image</span><span class="p">.</span><span class="n">ptr</span><span class="o"><</span><span class="kt">float</span><span class="o">></span><span class="p">(</span><span class="n">i</span><span class="p">);</span>
|
||
<span class="linenos">19</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="n">dst_ptr</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">reslut</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">width</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">channels</span><span class="p">;</span>
|
||
<span class="linenos">20</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">memcpy</span><span class="p">(</span><span class="n">dst_ptr</span><span class="p">,</span><span class="w"> </span><span class="n">src_ptr</span><span class="p">,</span><span class="w"> </span><span class="n">width</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">channels</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="k">sizeof</span><span class="p">(</span><span class="kt">float</span><span class="p">));</span>
|
||
<span class="linenos">21</span><span class="w"> </span><span class="p">}</span>
|
||
<span class="linenos">22</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
|
||
<span class="linenos">23</span><span class="p">}</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>设置后端代码如下:</p>
|
||
<div class="highlight-c++ notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="k">auto</span><span class="w"> </span><span class="n">context</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">make_shared</span><span class="o"><</span><span class="n">mindspore</span><span class="o">::</span><span class="n">Context</span><span class="o">></span><span class="p">();</span>
|
||
<span class="linenos">2</span><span class="k">auto</span><span class="w"> </span><span class="o">&</span><span class="n">device_list</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">context</span><span class="o">-></span><span class="n">MutableDeviceInfo</span><span class="p">();</span>
|
||
<span class="linenos">3</span><span class="n">context</span><span class="o">-></span><span class="n">SetBuiltInDelegate</span><span class="p">(</span><span class="n">mindspore</span><span class="o">::</span><span class="n">DelegateMode</span><span class="o">::</span><span class="n">kPNNA</span><span class="p">);</span>
|
||
<span class="linenos">4</span><span class="k">auto</span><span class="w"> </span><span class="n">cpu_info</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">make_shared</span><span class="o"><</span><span class="n">mindspore</span><span class="o">::</span><span class="n">CPUDeviceInfo</span><span class="o">></span><span class="p">();</span>
|
||
<span class="linenos">5</span><span class="k">auto</span><span class="w"> </span><span class="n">dsp_info</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">make_shared</span><span class="o"><</span><span class="n">mindspore</span><span class="o">::</span><span class="n">FT78NEDeviceInfo</span><span class="o">></span><span class="p">();</span>
|
||
<span class="linenos">6</span><span class="n">device_list</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">dsp_info</span><span class="p">);</span>
|
||
<span class="linenos">7</span><span class="n">device_list</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">cpu_info</span><span class="p">);</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>输出结果后处理代码如下:</p>
|
||
<div class="highlight-c++ notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="kt">float</span><span class="o">></span><span class="w"> </span><span class="n">floatArrayToVector</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="o">*</span><span class="n">array</span><span class="p">,</span><span class="w"> </span><span class="kt">size_t</span><span class="w"> </span><span class="n">size</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<span class="linenos"> 2</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="kt">float</span><span class="o">></span><span class="w"> </span><span class="n">vec</span><span class="p">(</span><span class="n">array</span><span class="p">,</span><span class="w"> </span><span class="n">array</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">size</span><span class="p">);</span>
|
||
<span class="linenos"> 3</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">vec</span><span class="p">;</span>
|
||
<span class="linenos"> 4</span><span class="p">}</span>
|
||
<span class="linenos"> 5</span>
|
||
<span class="linenos"> 6</span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="kt">float</span><span class="o">></span><span class="w"> </span><span class="n">numpy_exp</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="kt">float</span><span class="o">></span><span class="w"> </span><span class="o">&</span><span class="n">x</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<span class="linenos"> 7</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="kt">float</span><span class="o">></span><span class="w"> </span><span class="n">result</span><span class="p">;</span>
|
||
<span class="linenos"> 8</span><span class="w"> </span><span class="n">result</span><span class="p">.</span><span class="n">reserve</span><span class="p">(</span><span class="n">x</span><span class="p">.</span><span class="n">size</span><span class="p">());</span>
|
||
<span class="linenos"> 9</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">float</span><span class="w"> </span><span class="n">num</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">x</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<span class="linenos">10</span><span class="w"> </span><span class="n">result</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">exp</span><span class="p">(</span><span class="n">num</span><span class="p">));</span>
|
||
<span class="linenos">11</span><span class="w"> </span><span class="p">}</span>
|
||
<span class="linenos">12</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">result</span><span class="p">;</span>
|
||
<span class="linenos">13</span><span class="p">}</span>
|
||
<span class="linenos">14</span>
|
||
<span class="linenos">15</span><span class="kt">float</span><span class="w"> </span><span class="n">sum_rows</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="kt">float</span><span class="o">></span><span class="w"> </span><span class="o">&</span><span class="n">vec</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">axis</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<span class="linenos">16</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="n">sum</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">accumulate</span><span class="p">(</span><span class="n">vec</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span><span class="w"> </span><span class="n">vec</span><span class="p">.</span><span class="n">end</span><span class="p">(),</span><span class="w"> </span><span class="mf">0.0</span><span class="p">);</span>
|
||
<span class="linenos">17</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">sum</span><span class="p">;</span>
|
||
<span class="linenos">18</span><span class="p">}</span>
|
||
<span class="linenos">19</span>
|
||
<span class="linenos">20</span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="kt">float</span><span class="o">>></span><span class="w"> </span><span class="n">convertTo2D</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="kt">float</span><span class="o">></span><span class="w"> </span><span class="o">&</span><span class="n">vec</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">rows</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<span class="linenos">21</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="kt">float</span><span class="o">>></span><span class="w"> </span><span class="n">result</span><span class="p">;</span>
|
||
<span class="linenos">22</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">vec</span><span class="p">.</span><span class="n">empty</span><span class="p">()</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="n">rows</span><span class="w"> </span><span class="o"><=</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<span class="linenos">23</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">result</span><span class="p">;</span>
|
||
<span class="linenos">24</span><span class="w"> </span><span class="p">}</span>
|
||
<span class="linenos">25</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">cols</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">vec</span><span class="p">.</span><span class="n">size</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">rows</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="n">rows</span><span class="p">;</span><span class="w"> </span><span class="c1">// 计算列数</span>
|
||
<span class="linenos">26</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">rows</span><span class="p">;</span><span class="w"> </span><span class="o">++</span><span class="n">i</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<span class="linenos">27</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="kt">float</span><span class="o">></span><span class="w"> </span><span class="n">row</span><span class="p">;</span>
|
||
<span class="linenos">28</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">j</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">j</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">cols</span><span class="p">;</span><span class="w"> </span><span class="o">++</span><span class="n">j</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<span class="linenos">29</span><span class="w"> </span><span class="kt">size_t</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">cols</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">j</span><span class="p">;</span><span class="w"> </span><span class="c1">// 计算索引</span>
|
||
<span class="linenos">30</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">index</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">vec</span><span class="p">.</span><span class="n">size</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
|
||
<span class="linenos">31</span><span class="w"> </span><span class="n">row</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">vec</span><span class="p">[</span><span class="n">index</span><span class="p">]);</span>
|
||
<span class="linenos">32</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
|
||
<span class="linenos">33</span><span class="w"> </span><span class="n">row</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span><span class="w"> </span><span class="c1">// 填充剩余空间,或者你可以选择不填充</span>
|
||
<span class="linenos">34</span><span class="w"> </span><span class="p">}</span>
|
||
<span class="linenos">35</span><span class="w"> </span><span class="p">}</span>
|
||
<span class="linenos">36</span><span class="w"> </span><span class="n">result</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">row</span><span class="p">);</span>
|
||
<span class="linenos">37</span><span class="w"> </span><span class="p">}</span>
|
||
<span class="linenos">38</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">result</span><span class="p">;</span>
|
||
<span class="linenos">39</span><span class="p">}</span>
|
||
<span class="linenos">40</span>
|
||
<span class="linenos">41</span><span class="kt">void</span><span class="w"> </span><span class="n">GetOutputData</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="n">MSTensor</span><span class="o">></span><span class="w"> </span><span class="o">&</span><span class="n">outputs</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<span class="linenos">42</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="k">auto</span><span class="w"> </span><span class="n">tensor</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">outputs</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<span class="linenos">43</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="s">"tensor name is:"</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">tensor</span><span class="p">.</span><span class="n">Name</span><span class="p">()</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="s">" tensor size is:"</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">tensor</span><span class="p">.</span><span class="n">DataSize</span><span class="p">()</span>
|
||
<span class="linenos">44</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="s">" tensor elements num is:"</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">tensor</span><span class="p">.</span><span class="n">ElementNum</span><span class="p">()</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
|
||
<span class="linenos">45</span><span class="w"> </span><span class="k">auto</span><span class="w"> </span><span class="n">out_data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">reinterpret_cast</span><span class="o"><</span><span class="k">const</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="o">*></span><span class="p">(</span><span class="n">tensor</span><span class="p">.</span><span class="n">Data</span><span class="p">().</span><span class="n">get</span><span class="p">());</span>
|
||
<span class="linenos">46</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="s">"output data is:"</span><span class="p">;</span>
|
||
<span class="linenos">47</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">tensor</span><span class="p">.</span><span class="n">ElementNum</span><span class="p">()</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o"><=</span><span class="w"> </span><span class="mi">50</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<span class="linenos">48</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">out_data</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="s">" "</span><span class="p">;</span>
|
||
<span class="linenos">49</span><span class="w"> </span><span class="p">}</span>
|
||
<span class="linenos">50</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
|
||
<span class="linenos">51</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="kt">float</span><span class="o">></span><span class="w"> </span><span class="n">out</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">floatArrayToVector</span><span class="p">(</span><span class="n">out_data</span><span class="p">,</span><span class="w"> </span><span class="n">tensor</span><span class="p">.</span><span class="n">ElementNum</span><span class="p">());</span>
|
||
<span class="linenos">52</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="kt">float</span><span class="o">></span><span class="w"> </span><span class="n">exp_x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">numpy_exp</span><span class="p">(</span><span class="n">out</span><span class="p">);</span>
|
||
<span class="linenos">53</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="n">sums</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">sum_rows</span><span class="p">(</span><span class="n">exp_x</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">);</span>
|
||
<span class="linenos">54</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="kt">float</span><span class="o">></span><span class="w"> </span><span class="n">x1</span><span class="p">;</span>
|
||
<span class="linenos">55</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">float</span><span class="w"> </span><span class="n">num</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">exp_x</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<span class="linenos">56</span><span class="w"> </span><span class="n">x1</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">num</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="n">sums</span><span class="p">);</span>
|
||
<span class="linenos">57</span><span class="w"> </span><span class="p">}</span>
|
||
<span class="linenos">58</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="kt">float</span><span class="o">>></span><span class="w"> </span><span class="n">twoD</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">convertTo2D</span><span class="p">(</span><span class="n">x1</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">);</span>
|
||
<span class="linenos">59</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="kt">int</span><span class="o">></span><span class="w"> </span><span class="n">argmax_indices</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">argmax</span><span class="p">(</span><span class="n">twoD</span><span class="p">);</span>
|
||
<span class="linenos">60</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">></span><span class="w"> </span><span class="n">Predicted_class</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="s">"装甲侦察车"</span><span class="p">,</span><span class="w"> </span><span class="s">"装甲运输车"</span><span class="p">,</span><span class="w"> </span><span class="s">"不明"</span><span class="p">,</span><span class="w"> </span><span class="s">"坦克"</span><span class="p">,</span><span class="w"> </span><span class="s">"自行高炮"</span><span class="p">};</span>
|
||
<span class="linenos">61</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="s">"预测结果: "</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">Predicted_class</span><span class="p">[</span><span class="n">argmax_indices</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
|
||
<span class="linenos">62</span><span class="w"> </span><span class="p">}</span>
|
||
<span class="linenos">63</span><span class="p">}</span>
|
||
</pre></div>
|
||
</div>
|
||
<ul>
|
||
<li><p>在FT78NE上运行可执行文件 <code class="docutils literal notranslate"><span class="pre">main</span></code> ,观察输出结果。与预期结果对比,验证模型推理的正确性。
|
||
执行命令如下:</p>
|
||
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span>./main<span class="w"> </span>gray_cnn.ms<span class="w"> </span>image_origin.jpg
|
||
</pre></div>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
<p>执行结果如下图:</p>
|
||
<a class="reference internal image-reference" href="../../_images/ft78ne_gray_cnn_output.png"><img alt="FT78NE运行结果" class="align-center" src="../../_images/ft78ne_gray_cnn_output.png" style="width: 40.0%; height: 49.0px;" />
|
||
</a>
|
||
</div></blockquote>
|
||
</section>
|
||
</section>
|
||
<section id="python">
|
||
<span id="python-code"></span><h2>python完整代码示例<a class="headerlink" href="#python" title="Link to this heading"></a></h2>
|
||
<blockquote>
|
||
<div><div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="c1"># CNN.py</span>
|
||
<span class="linenos"> 2</span><span class="kn">import</span><span class="w"> </span><span class="nn">mindspore</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">ms</span>
|
||
<span class="linenos"> 3</span><span class="kn">from</span><span class="w"> </span><span class="nn">mindspore.train.serialization</span><span class="w"> </span><span class="kn">import</span> <span class="n">export</span>
|
||
<span class="linenos"> 4</span><span class="kn">from</span><span class="w"> </span><span class="nn">mindspore</span><span class="w"> </span><span class="kn">import</span> <span class="n">nn</span><span class="p">,</span> <span class="n">context</span>
|
||
<span class="linenos"> 5</span><span class="kn">import</span><span class="w"> </span><span class="nn">numpy</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">np</span>
|
||
<span class="linenos"> 6</span><span class="kn">from</span><span class="w"> </span><span class="nn">PIL</span><span class="w"> </span><span class="kn">import</span> <span class="n">Image</span>
|
||
<span class="linenos"> 7</span><span class="kn">import</span><span class="w"> </span><span class="nn">mindspore.dataset</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">ds</span>
|
||
<span class="linenos"> 8</span><span class="kn">from</span><span class="w"> </span><span class="nn">mindspore.dataset</span><span class="w"> </span><span class="kn">import</span> <span class="n">py_transforms</span>
|
||
<span class="linenos"> 9</span><span class="kn">import</span><span class="w"> </span><span class="nn">mindspore.dataset.vision</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">CV</span>
|
||
<span class="linenos">10</span><span class="kn">from</span><span class="w"> </span><span class="nn">mindspore.train.callback</span><span class="w"> </span><span class="kn">import</span> <span class="n">LossMonitor</span>
|
||
<span class="linenos">11</span>
|
||
<span class="linenos">12</span><span class="c1"># # Define directories and parameters</span>
|
||
<span class="linenos">13</span><span class="n">batch_size</span> <span class="o">=</span> <span class="mi">32</span>
|
||
<span class="linenos">14</span><span class="n">img_size</span> <span class="o">=</span> <span class="p">(</span><span class="mi">128</span><span class="p">,</span> <span class="mi">128</span><span class="p">)</span>
|
||
<span class="linenos">15</span><span class="n">data_path</span> <span class="o">=</span> <span class="s1">'../cnn-sar/Target'</span>
|
||
<span class="linenos">16</span>
|
||
<span class="linenos">17</span><span class="c1"># 数据预处理</span>
|
||
<span class="linenos">18</span><span class="k">def</span><span class="w"> </span><span class="nf">rescale_to_0_1</span><span class="p">(</span><span class="n">image</span><span class="p">):</span>
|
||
<span class="linenos">19</span> <span class="k">return</span> <span class="n">image</span> <span class="o">/</span> <span class="mf">255.0</span>
|
||
<span class="linenos">20</span>
|
||
<span class="linenos">21</span><span class="c1"># 自定义函数,添加 color 通道维度</span>
|
||
<span class="linenos">22</span><span class="k">def</span><span class="w"> </span><span class="nf">add_channels</span><span class="p">(</span><span class="n">image</span><span class="p">):</span>
|
||
<span class="linenos">23</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">image</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span> <span class="c1"># 单个图像,没有 cin_channel 维度</span>
|
||
<span class="linenos">24</span> <span class="c1"># print("before ===> ", image.shape)</span>
|
||
<span class="linenos">25</span> <span class="c1"># 添加 color 通道维度,(128x128) => (1, 128, 128)</span>
|
||
<span class="linenos">26</span> <span class="n">image_four_channels</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">expand_dims</span><span class="p">(</span><span class="n">image</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
|
||
<span class="linenos">27</span> <span class="c1"># print("after ===> ", image_four_channels.shape)</span>
|
||
<span class="linenos">28</span> <span class="k">else</span><span class="p">:</span>
|
||
<span class="linenos">29</span> <span class="k">pass</span>
|
||
<span class="linenos">30</span> <span class="k">return</span> <span class="n">image</span>
|
||
<span class="linenos">31</span> <span class="k">return</span> <span class="n">image_four_channels</span>
|
||
<span class="linenos">32</span>
|
||
<span class="linenos">33</span><span class="k">class</span><span class="w"> </span><span class="nc">CNN</span><span class="p">(</span><span class="n">ms</span><span class="o">.</span><span class="n">nn</span><span class="o">.</span><span class="n">Cell</span><span class="p">):</span>
|
||
<span class="linenos">34</span> <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="linenos">35</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
|
||
<span class="linenos">36</span> <span class="bp">self</span><span class="o">.</span><span class="n">conv1</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">Conv2d</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">32</span><span class="p">,</span> <span class="n">kernel_size</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">has_bias</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
||
<span class="linenos">37</span> <span class="bp">self</span><span class="o">.</span><span class="n">pool1</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">MaxPool2d</span><span class="p">(</span><span class="n">kernel_size</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">stride</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
|
||
<span class="linenos">38</span> <span class="bp">self</span><span class="o">.</span><span class="n">conv2</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">Conv2d</span><span class="p">(</span><span class="mi">32</span><span class="p">,</span> <span class="mi">64</span><span class="p">,</span> <span class="n">kernel_size</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">has_bias</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
||
<span class="linenos">39</span> <span class="bp">self</span><span class="o">.</span><span class="n">pool2</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">MaxPool2d</span><span class="p">(</span><span class="n">kernel_size</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">stride</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
|
||
<span class="linenos">40</span> <span class="bp">self</span><span class="o">.</span><span class="n">conv3</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">Conv2d</span><span class="p">(</span><span class="mi">64</span><span class="p">,</span> <span class="mi">128</span><span class="p">,</span> <span class="n">kernel_size</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">has_bias</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
||
<span class="linenos">41</span> <span class="bp">self</span><span class="o">.</span><span class="n">pool3</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">MaxPool2d</span><span class="p">(</span><span class="n">kernel_size</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">stride</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
|
||
<span class="linenos">42</span> <span class="bp">self</span><span class="o">.</span><span class="n">flatten</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">Flatten</span><span class="p">()</span>
|
||
<span class="linenos">43</span> <span class="bp">self</span><span class="o">.</span><span class="n">dense1</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">Dense</span><span class="p">(</span><span class="mi">32768</span><span class="p">,</span> <span class="mi">64</span><span class="p">)</span>
|
||
<span class="linenos">44</span> <span class="bp">self</span><span class="o">.</span><span class="n">dense2</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">Dense</span><span class="p">(</span><span class="mi">64</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
|
||
<span class="linenos">45</span> <span class="bp">self</span><span class="o">.</span><span class="n">relu</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">ReLU</span><span class="p">()</span>
|
||
<span class="linenos">46</span>
|
||
<span class="linenos">47</span> <span class="k">def</span><span class="w"> </span><span class="nf">construct</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span>
|
||
<span class="linenos">48</span> <span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">relu</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">conv1</span><span class="p">(</span><span class="n">x</span><span class="p">))</span>
|
||
<span class="linenos">49</span> <span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">pool1</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
|
||
<span class="linenos">50</span> <span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">relu</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">conv2</span><span class="p">(</span><span class="n">x</span><span class="p">))</span>
|
||
<span class="linenos">51</span> <span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">pool2</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
|
||
<span class="linenos">52</span> <span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">relu</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">conv3</span><span class="p">(</span><span class="n">x</span><span class="p">))</span>
|
||
<span class="linenos">53</span> <span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">pool3</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
|
||
<span class="linenos">54</span> <span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">flatten</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
|
||
<span class="linenos">55</span> <span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">relu</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dense1</span><span class="p">(</span><span class="n">x</span><span class="p">))</span>
|
||
<span class="linenos">56</span> <span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">dense2</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
|
||
<span class="linenos">57</span> <span class="k">return</span> <span class="n">x</span>
|
||
<span class="linenos">58</span>
|
||
<span class="linenos">59</span><span class="k">def</span><span class="w"> </span><span class="nf">export_cnn</span><span class="p">():</span>
|
||
<span class="linenos">60</span> <span class="n">context</span><span class="o">.</span><span class="n">set_context</span><span class="p">(</span><span class="n">mode</span><span class="o">=</span><span class="n">context</span><span class="o">.</span><span class="n">PYNATIVE_MODE</span><span class="p">,</span> <span class="n">device_target</span><span class="o">=</span><span class="s2">"CPU"</span><span class="p">)</span>
|
||
<span class="linenos">61</span> <span class="n">resize_op</span> <span class="o">=</span> <span class="n">CV</span><span class="o">.</span><span class="n">Resize</span><span class="p">(</span><span class="n">img_size</span><span class="p">)</span>
|
||
<span class="linenos">62</span> <span class="n">rescale_transform</span> <span class="o">=</span> <span class="n">ms</span><span class="o">.</span><span class="n">dataset</span><span class="o">.</span><span class="n">transforms</span><span class="o">.</span><span class="n">Compose</span><span class="p">([</span><span class="n">rescale_to_0_1</span><span class="p">])</span>
|
||
<span class="linenos">63</span> <span class="n">f32_typecast</span> <span class="o">=</span> <span class="n">ms</span><span class="o">.</span><span class="n">dataset</span><span class="o">.</span><span class="n">transforms</span><span class="o">.</span><span class="n">TypeCast</span><span class="p">(</span><span class="n">ms</span><span class="o">.</span><span class="n">float32</span><span class="p">)</span>
|
||
<span class="linenos">64</span> <span class="c1"># 将读取的 RGB 转为 GRAY 模式</span>
|
||
<span class="linenos">65</span> <span class="n">convert_gray</span> <span class="o">=</span> <span class="n">ms</span><span class="o">.</span><span class="n">dataset</span><span class="o">.</span><span class="n">vision</span><span class="o">.</span><span class="n">ConvertColor</span><span class="p">(</span><span class="n">ms</span><span class="o">.</span><span class="n">dataset</span><span class="o">.</span><span class="n">vision</span><span class="o">.</span><span class="n">ConvertMode</span><span class="o">.</span><span class="n">COLOR_RGB2GRAY</span><span class="p">)</span>
|
||
<span class="linenos">66</span>
|
||
<span class="linenos">67</span> <span class="n">transform</span> <span class="o">=</span> <span class="p">[</span><span class="n">convert_gray</span><span class="p">,</span> <span class="n">resize_op</span><span class="p">,</span> <span class="n">f32_typecast</span><span class="p">,</span> <span class="n">rescale_transform</span><span class="p">,</span> <span class="n">CV</span><span class="o">.</span><span class="n">HWC2CHW</span><span class="p">()]</span>
|
||
<span class="linenos">68</span> <span class="n">train_data</span> <span class="o">=</span> <span class="n">ds</span><span class="o">.</span><span class="n">ImageFolderDataset</span><span class="p">(</span><span class="n">dataset_dir</span><span class="o">=</span><span class="n">data_path</span><span class="p">,</span> <span class="n">decode</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">extensions</span><span class="o">=</span><span class="p">[</span><span class="s2">".JPEG"</span><span class="p">,</span> <span class="s2">".PNG"</span><span class="p">,</span> <span class="s2">".JPG"</span><span class="p">])</span>
|
||
<span class="linenos">69</span> <span class="n">train_data</span> <span class="o">=</span> <span class="n">train_data</span><span class="o">.</span><span class="n">map</span><span class="p">(</span><span class="n">input_columns</span><span class="o">=</span><span class="s2">"image"</span><span class="p">,</span> <span class="n">operations</span><span class="o">=</span> <span class="n">transform</span><span class="p">)</span>
|
||
<span class="linenos">70</span> <span class="n">train_data</span> <span class="o">=</span> <span class="n">train_data</span><span class="o">.</span><span class="n">map</span><span class="p">(</span><span class="n">operations</span><span class="o">=</span><span class="k">lambda</span> <span class="n">image</span><span class="p">:</span> <span class="n">add_channels</span><span class="p">(</span><span class="n">image</span><span class="p">),</span> \
|
||
<span class="linenos">71</span> <span class="n">input_columns</span><span class="o">=</span><span class="p">[</span><span class="s2">"image"</span><span class="p">],</span> \
|
||
<span class="linenos">72</span> <span class="n">output_columns</span><span class="o">=</span><span class="p">[</span><span class="s2">"image"</span><span class="p">])</span>
|
||
<span class="linenos">73</span> <span class="n">train_data</span> <span class="o">=</span> <span class="n">train_data</span><span class="o">.</span><span class="n">batch</span><span class="p">(</span><span class="n">batch_size</span><span class="o">=</span><span class="n">batch_size</span><span class="p">)</span>
|
||
<span class="linenos">74</span> <span class="n">data_iter</span> <span class="o">=</span> <span class="n">train_data</span><span class="o">.</span><span class="n">create_dict_iterator</span><span class="p">()</span>
|
||
<span class="linenos">75</span> <span class="nb">print</span><span class="p">(</span><span class="s2">"数据集加载完成"</span><span class="p">)</span>
|
||
<span class="linenos">76</span> <span class="n">my_model</span> <span class="o">=</span> <span class="n">CNN</span><span class="p">()</span>
|
||
<span class="linenos">77</span> <span class="n">loss</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">CrossEntropyLoss</span><span class="p">(</span><span class="n">reduction</span><span class="o">=</span><span class="s1">'mean'</span><span class="p">)</span>
|
||
<span class="linenos">78</span> <span class="n">optimizer</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">Adam</span><span class="p">(</span><span class="n">my_model</span><span class="o">.</span><span class="n">trainable_params</span><span class="p">(),</span> <span class="n">learning_rate</span><span class="o">=</span><span class="mf">0.01</span><span class="p">)</span>
|
||
<span class="linenos">79</span> <span class="n">cnn_model</span> <span class="o">=</span> <span class="n">ms</span><span class="o">.</span><span class="n">Model</span><span class="p">(</span><span class="n">my_model</span><span class="p">,</span> <span class="n">loss_fn</span><span class="o">=</span><span class="n">loss</span><span class="p">,</span> <span class="n">optimizer</span><span class="o">=</span><span class="n">optimizer</span><span class="p">,</span> <span class="n">metrics</span><span class="o">=</span><span class="p">{</span><span class="s1">'Accuracy'</span><span class="p">:</span> <span class="n">nn</span><span class="o">.</span><span class="n">Accuracy</span><span class="p">()})</span>
|
||
<span class="linenos">80</span> <span class="nb">print</span><span class="p">(</span><span class="s2">"网络构建完成"</span><span class="p">)</span>
|
||
<span class="linenos">81</span> <span class="n">num_epoch</span> <span class="o">=</span> <span class="mi">10</span>
|
||
<span class="linenos">82</span> <span class="n">cnn_model</span><span class="o">.</span><span class="n">train</span><span class="p">(</span><span class="n">num_epoch</span><span class="p">,</span> <span class="n">train_data</span><span class="p">,</span><span class="n">callbacks</span><span class="o">=</span><span class="p">[</span><span class="n">LossMonitor</span><span class="p">()],</span><span class="n">dataset_sink_mode</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
||
<span class="linenos">83</span> <span class="n">inputs</span> <span class="o">=</span> <span class="n">ms</span><span class="o">.</span><span class="n">Tensor</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">randn</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">128</span><span class="p">,</span> <span class="mi">128</span><span class="p">)</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">float32</span><span class="p">))</span>
|
||
<span class="linenos">84</span> <span class="n">ms</span><span class="o">.</span><span class="n">save_checkpoint</span><span class="p">(</span><span class="n">my_model</span><span class="p">,</span> <span class="s1">'cnn.ckpt'</span><span class="p">)</span>
|
||
<span class="linenos">85</span> <span class="n">export</span><span class="p">(</span><span class="n">my_model</span><span class="p">,</span> <span class="n">inputs</span><span class="p">,</span> <span class="n">file_name</span><span class="o">=</span><span class="s1">'cnn'</span><span class="p">,</span> <span class="n">file_format</span><span class="o">=</span><span class="s2">"MINDIR"</span><span class="p">)</span>
|
||
</pre></div>
|
||
</div>
|
||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="c1"># GRAY_CNN.py</span>
|
||
<span class="linenos"> 2</span><span class="kn">import</span><span class="w"> </span><span class="nn">cv2</span>
|
||
<span class="linenos"> 3</span><span class="kn">import</span><span class="w"> </span><span class="nn">mindspore</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">ms</span>
|
||
<span class="linenos"> 4</span><span class="kn">from</span><span class="w"> </span><span class="nn">mindspore.train.serialization</span><span class="w"> </span><span class="kn">import</span> <span class="n">export</span>
|
||
<span class="linenos"> 5</span><span class="kn">import</span><span class="w"> </span><span class="nn">numpy</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">np</span>
|
||
<span class="linenos"> 6</span><span class="kn">from</span><span class="w"> </span><span class="nn">mindspore</span><span class="w"> </span><span class="kn">import</span> <span class="n">nn</span><span class="p">,</span> <span class="n">ops</span><span class="p">,</span> <span class="n">context</span>
|
||
<span class="linenos"> 7</span><span class="kn">from</span><span class="w"> </span><span class="nn">CNN</span><span class="w"> </span><span class="kn">import</span> <span class="n">export_cnn</span>
|
||
<span class="linenos"> 8</span>
|
||
<span class="linenos"> 9</span><span class="n">class_names</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'BRDM_2'</span><span class="p">,</span> <span class="s1">'BTR_60'</span><span class="p">,</span> <span class="s1">'SLICY'</span><span class="p">,</span> <span class="s1">'T62'</span><span class="p">,</span> <span class="s1">'ZSU_23_4'</span><span class="p">]</span>
|
||
<span class="linenos">10</span><span class="n">class_labels</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"装甲侦察车"</span><span class="p">,</span> <span class="s2">"装甲运输车"</span><span class="p">,</span> <span class="s2">"不明"</span><span class="p">,</span> <span class="s2">"坦克"</span><span class="p">,</span> <span class="s2">"自行高炮"</span><span class="p">]</span>
|
||
<span class="linenos">11</span>
|
||
<span class="linenos">12</span><span class="k">class</span><span class="w"> </span><span class="nc">GrayCNN</span><span class="p">(</span><span class="n">nn</span><span class="o">.</span><span class="n">Cell</span><span class="p">):</span>
|
||
<span class="linenos">13</span> <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="linenos">14</span> <span class="nb">super</span><span class="p">(</span><span class="n">GrayCNN</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
|
||
<span class="linenos">15</span> <span class="bp">self</span><span class="o">.</span><span class="n">split</span> <span class="o">=</span> <span class="n">ops</span><span class="o">.</span><span class="n">Split</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">output_num</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span>
|
||
<span class="linenos">16</span> <span class="bp">self</span><span class="o">.</span><span class="n">conv1</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">Conv2d</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">32</span><span class="p">,</span> <span class="n">kernel_size</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">has_bias</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
||
<span class="linenos">17</span> <span class="bp">self</span><span class="o">.</span><span class="n">pool1</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">MaxPool2d</span><span class="p">(</span><span class="n">kernel_size</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">stride</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
|
||
<span class="linenos">18</span> <span class="bp">self</span><span class="o">.</span><span class="n">conv2</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">Conv2d</span><span class="p">(</span><span class="mi">32</span><span class="p">,</span> <span class="mi">64</span><span class="p">,</span> <span class="n">kernel_size</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">has_bias</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
||
<span class="linenos">19</span> <span class="bp">self</span><span class="o">.</span><span class="n">pool2</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">MaxPool2d</span><span class="p">(</span><span class="n">kernel_size</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">stride</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
|
||
<span class="linenos">20</span> <span class="bp">self</span><span class="o">.</span><span class="n">conv3</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">Conv2d</span><span class="p">(</span><span class="mi">64</span><span class="p">,</span> <span class="mi">128</span><span class="p">,</span> <span class="n">kernel_size</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">has_bias</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
||
<span class="linenos">21</span> <span class="bp">self</span><span class="o">.</span><span class="n">pool3</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">MaxPool2d</span><span class="p">(</span><span class="n">kernel_size</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">stride</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
|
||
<span class="linenos">22</span> <span class="bp">self</span><span class="o">.</span><span class="n">flatten</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">Flatten</span><span class="p">()</span>
|
||
<span class="linenos">23</span> <span class="bp">self</span><span class="o">.</span><span class="n">dense1</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">Dense</span><span class="p">(</span><span class="mi">32768</span><span class="p">,</span> <span class="mi">64</span><span class="p">)</span>
|
||
<span class="linenos">24</span> <span class="bp">self</span><span class="o">.</span><span class="n">dense2</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">Dense</span><span class="p">(</span><span class="mi">64</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
|
||
<span class="linenos">25</span> <span class="bp">self</span><span class="o">.</span><span class="n">relu</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">ReLU</span><span class="p">()</span>
|
||
<span class="linenos">26</span> <span class="bp">self</span><span class="o">.</span><span class="n">cnn</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">GraphCell</span><span class="p">(</span><span class="n">ms</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">file_name</span><span class="o">=</span><span class="s2">"cnn.mindir"</span><span class="p">))</span>
|
||
<span class="linenos">27</span>
|
||
<span class="linenos">28</span> <span class="k">def</span><span class="w"> </span><span class="nf">construct</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span>
|
||
<span class="linenos">29</span> <span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
|
||
<span class="linenos">30</span> <span class="n">b</span><span class="p">,</span> <span class="n">g</span><span class="p">,</span> <span class="n">r</span> <span class="o">=</span> <span class="n">x</span>
|
||
<span class="linenos">31</span> <span class="n">x</span> <span class="o">=</span> <span class="p">(</span>
|
||
<span class="linenos">32</span> <span class="n">b</span> <span class="o">*</span> <span class="mf">0.114</span> <span class="o">+</span>
|
||
<span class="linenos">33</span> <span class="n">g</span> <span class="o">*</span> <span class="mf">0.587</span> <span class="o">+</span>
|
||
<span class="linenos">34</span> <span class="n">r</span> <span class="o">*</span> <span class="mf">0.299</span>
|
||
<span class="linenos">35</span> <span class="p">)</span><span class="o">.</span><span class="n">squeeze</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
|
||
<span class="linenos">36</span> <span class="n">x</span> <span class="o">=</span> <span class="n">ops</span><span class="o">.</span><span class="n">clip_by_value</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">255</span><span class="p">)</span>
|
||
<span class="linenos">37</span> <span class="n">x</span> <span class="o">=</span> <span class="n">x</span> <span class="o">/</span> <span class="mf">255.0</span> <span class="c1"># 数据归一化</span>
|
||
<span class="linenos">38</span> <span class="n">x</span> <span class="o">=</span> <span class="n">x</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">128</span><span class="p">,</span> <span class="mi">128</span><span class="p">)</span> <span class="c1"># 灰度化处理后结果需要重塑成cnn输入形状</span>
|
||
<span class="linenos">39</span> <span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">cnn</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
|
||
<span class="linenos">40</span> <span class="k">return</span> <span class="n">x</span>
|
||
<span class="linenos">41</span>
|
||
<span class="linenos">42</span><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">"__main__"</span><span class="p">:</span>
|
||
<span class="linenos">43</span> <span class="n">export_cnn</span><span class="p">()</span>
|
||
<span class="linenos">44</span> <span class="n">context</span><span class="o">.</span><span class="n">set_context</span><span class="p">(</span><span class="n">mode</span><span class="o">=</span><span class="n">context</span><span class="o">.</span><span class="n">GRAPH_MODE</span><span class="p">)</span>
|
||
<span class="linenos">45</span> <span class="c1"># 1. 读取图片(保持原始uint8类型)</span>
|
||
<span class="linenos">46</span> <span class="n">color_image</span> <span class="o">=</span> <span class="n">cv2</span><span class="o">.</span><span class="n">imread</span><span class="p">(</span><span class="s2">"image_origin.jpg"</span><span class="p">)</span> <span class="c1"># 默认uint8</span>
|
||
<span class="linenos">47</span> <span class="n">resized_image</span> <span class="o">=</span> <span class="n">cv2</span><span class="o">.</span><span class="n">resize</span><span class="p">(</span>
|
||
<span class="linenos">48</span> <span class="n">color_image</span><span class="p">,</span>
|
||
<span class="linenos">49</span> <span class="p">(</span><span class="mi">128</span><span class="p">,</span> <span class="mi">128</span><span class="p">),</span> <span class="c1"># 目标尺寸(width, height)</span>
|
||
<span class="linenos">50</span> <span class="n">interpolation</span><span class="o">=</span><span class="n">cv2</span><span class="o">.</span><span class="n">INTER_LINEAR</span>
|
||
<span class="linenos">51</span> <span class="p">)</span>
|
||
<span class="linenos">52</span> <span class="n">resized_image</span> <span class="o">=</span> <span class="n">resized_image</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">float32</span><span class="p">)</span>
|
||
<span class="linenos">53</span> <span class="n">resized_image_tensor</span> <span class="o">=</span> <span class="n">ms</span><span class="o">.</span><span class="n">Tensor</span><span class="p">(</span><span class="n">resized_image</span><span class="p">)</span>
|
||
<span class="linenos">54</span> <span class="n">my_model</span> <span class="o">=</span> <span class="n">GrayCNN</span><span class="p">()</span>
|
||
<span class="linenos">55</span> <span class="n">param_dict</span> <span class="o">=</span> <span class="n">ms</span><span class="o">.</span><span class="n">load_checkpoint</span><span class="p">(</span><span class="s2">"cnn.ckpt"</span><span class="p">)</span>
|
||
<span class="linenos">56</span> <span class="n">param_not_load</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">ms</span><span class="o">.</span><span class="n">load_param_into_net</span><span class="p">(</span><span class="n">my_model</span><span class="p">,</span> <span class="n">param_dict</span><span class="p">,</span> <span class="n">strict_load</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
||
<span class="linenos">57</span> <span class="n">input_tensor</span> <span class="o">=</span> <span class="n">ms</span><span class="o">.</span><span class="n">Tensor</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">ones</span><span class="p">((</span><span class="mi">128</span><span class="p">,</span> <span class="mi">128</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">float32</span><span class="p">))</span>
|
||
<span class="linenos">58</span> <span class="n">export</span><span class="p">(</span><span class="n">my_model</span><span class="p">,</span> <span class="n">input_tensor</span><span class="p">,</span> <span class="n">file_name</span><span class="o">=</span><span class="s1">'gray_cnn'</span><span class="p">,</span> <span class="n">file_format</span><span class="o">=</span><span class="s1">'MINDIR'</span><span class="p">)</span>
|
||
<span class="linenos">59</span> <span class="n">reload_cnn</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">GraphCell</span><span class="p">(</span><span class="n">ms</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">file_name</span><span class="o">=</span><span class="s1">'gray_cnn.mindir'</span><span class="p">))</span>
|
||
<span class="linenos">60</span> <span class="n">reload_cnn</span> <span class="o">=</span> <span class="n">ms</span><span class="o">.</span><span class="n">Model</span><span class="p">(</span><span class="n">reload_cnn</span><span class="p">)</span>
|
||
<span class="linenos">61</span> <span class="n">m</span> <span class="o">=</span> <span class="n">reload_cnn</span><span class="o">.</span><span class="n">predict</span><span class="p">(</span><span class="n">resized_image_tensor</span><span class="p">)</span>
|
||
<span class="linenos">62</span> <span class="nb">print</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
|
||
<span class="linenos">63</span> <span class="n">output_np</span> <span class="o">=</span> <span class="n">m</span><span class="o">.</span><span class="n">asnumpy</span><span class="p">()</span>
|
||
<span class="linenos">64</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">output_np</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span> <span class="c1"># 对于分类任务,通常输出是[batch_size, num_classes]</span>
|
||
<span class="linenos">65</span> <span class="n">output_prob</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">exp</span><span class="p">(</span><span class="n">output_np</span><span class="p">)</span> <span class="o">/</span> <span class="n">np</span><span class="o">.</span><span class="n">exp</span><span class="p">(</span><span class="n">output_np</span><span class="p">)</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">keepdims</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
||
<span class="linenos">66</span> <span class="n">predicted_class</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">argmax</span><span class="p">(</span><span class="n">output_prob</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
|
||
<span class="linenos">67</span> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"预测结果: </span><span class="si">{</span><span class="n">class_labels</span><span class="p">[</span><span class="n">predicted_class</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
||
</pre></div>
|
||
</div>
|
||
</div></blockquote>
|
||
</section>
|
||
</section>
|
||
|
||
|
||
</div>
|
||
</div>
|
||
<footer><div class="rst-footer-buttons" role="navigation" aria-label="页脚">
|
||
<a href="index.html" class="btn btn-neutral float-left" title="AI+DSP应用示例" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> 上一页</a>
|
||
<a href="../dsp/index.html" class="btn btn-neutral float-right" title="DSP应用示例" accesskey="n" rel="next">下一页 <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
|
||
</div>
|
||
|
||
<hr/>
|
||
|
||
<div role="contentinfo">
|
||
<p>© 版权所有 2025 - 2026, NUDT-674。</p>
|
||
</div>
|
||
|
||
利用 <a href="https://www.sphinx-doc.org/">Sphinx</a> 构建,使用的
|
||
<a href="https://github.com/readthedocs/sphinx_rtd_theme">主题</a>
|
||
由 <a href="https://readthedocs.org">Read the Docs</a> 开发.
|
||
|
||
|
||
</footer>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
<script>
|
||
jQuery(function () {
|
||
SphinxRtdTheme.Navigation.enable(true);
|
||
});
|
||
</script>
|
||
|
||
</body>
|
||
</html> |