FT_DSP.gitlink.net/master/html/appdevelop/ai_dsp/gray_cnn.html

765 lines
134 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html class="writer-html5" lang="zh-CN">
<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(图片灰度化处理+图片识别) &mdash; 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 data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js?v=595569a8"></script>
<script src="../../_static/doctools.js?v=888ff710"></script>
<script src="../../_static/sphinx_highlight.js?v=4825356b"></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="此标题的永久链接"></a></h1>
<section id="id1">
<h2>应用概述<a class="headerlink" href="#id1" title="此标题的永久链接"></a></h2>
<blockquote>
<div><p>这里将以图片灰度化加图片识别来介绍AI+DSP应用开发的开发流程。
其中图片灰度化可以使用DSP来完成图片识别则使用AI来完成。
灰度化处理使用灰度化公式来进行图片识别使用CNN模型。</p>
</div></blockquote>
</section>
<section id="id2">
<h2>开发流程<a class="headerlink" href="#id2" title="此标题的永久链接"></a></h2>
<section id="id3">
<h3>1. 定义模型<a class="headerlink" href="#id3" title="此标题的永久链接"></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="此标题的永久链接"></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">&#39;./Target&#39;</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">&quot;CPU&quot;</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">&quot;.JPEG&quot;</span><span class="p">,</span> <span class="s2">&quot;.PNG&quot;</span><span class="p">,</span> <span class="s2">&quot;.JPG&quot;</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">&quot;image&quot;</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">&quot;image&quot;</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">&quot;image&quot;</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">&quot;数据集加载完成&quot;</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">&#39;mean&#39;</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">&#39;Accuracy&#39;</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">&quot;网络构建完成&quot;</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">&#39;cnn.ckpt&#39;</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">&#39;cnn&#39;</span><span class="p">,</span> <span class="n">file_format</span><span class="o">=</span><span class="s2">&quot;MINDIR&quot;</span><span class="p">)</span>
</pre></div>
</div>
</div></blockquote>
</section>
<section id="id5">
<h3>3. 重新组网<a class="headerlink" href="#id5" title="此标题的永久链接"></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">&#39;BRDM_2&#39;</span><span class="p">,</span> <span class="s1">&#39;BTR_60&#39;</span><span class="p">,</span> <span class="s1">&#39;SLICY&#39;</span><span class="p">,</span> <span class="s1">&#39;T62&#39;</span><span class="p">,</span> <span class="s1">&#39;ZSU_23_4&#39;</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">&quot;装甲侦察车&quot;</span><span class="p">,</span> <span class="s2">&quot;装甲运输车&quot;</span><span class="p">,</span> <span class="s2">&quot;不明&quot;</span><span class="p">,</span> <span class="s2">&quot;坦克&quot;</span><span class="p">,</span> <span class="s2">&quot;自行高炮&quot;</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">&quot;cnn.mindir&quot;</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">&quot;__main__&quot;</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">&quot;image_origin.jpg&quot;</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">&quot;cnn.ckpt&quot;</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">&#39;gray_cnn&#39;</span><span class="p">,</span> <span class="n">file_format</span><span class="o">=</span><span class="s1">&#39;MINDIR&#39;</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">&#39;gray_cnn.mindir&#39;</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">&quot;预测结果: </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">&quot;</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="此标题的永久链接"></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="此标题的永久链接"></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">&lt;opencv2/opencv.hpp&gt;</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">&quot;read image failed</span><span class="se">\n</span><span class="s">&quot;</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">&lt;</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">&lt;</span><span class="kt">float</span><span class="o">&gt;</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">&lt;</span><span class="n">mindspore</span><span class="o">::</span><span class="n">Context</span><span class="o">&gt;</span><span class="p">();</span>
<span class="linenos">2</span><span class="k">auto</span><span class="w"> </span><span class="o">&amp;</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">-&gt;</span><span class="n">MutableDeviceInfo</span><span class="p">();</span>
<span class="linenos">3</span><span class="n">context</span><span class="o">-&gt;</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">&lt;</span><span class="n">mindspore</span><span class="o">::</span><span class="n">CPUDeviceInfo</span><span class="o">&gt;</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">&lt;</span><span class="n">mindspore</span><span class="o">::</span><span class="n">FT78NEDeviceInfo</span><span class="o">&gt;</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">&lt;</span><span class="kt">float</span><span class="o">&gt;</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">&lt;</span><span class="kt">float</span><span class="o">&gt;</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">&lt;</span><span class="kt">float</span><span class="o">&gt;</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">&lt;</span><span class="kt">float</span><span class="o">&gt;</span><span class="w"> </span><span class="o">&amp;</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">&lt;</span><span class="kt">float</span><span class="o">&gt;</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">&lt;</span><span class="kt">float</span><span class="o">&gt;</span><span class="w"> </span><span class="o">&amp;</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">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">float</span><span class="o">&gt;&gt;</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">&lt;</span><span class="kt">float</span><span class="o">&gt;</span><span class="w"> </span><span class="o">&amp;</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">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">float</span><span class="o">&gt;&gt;</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">&lt;=</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">&lt;</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">&lt;</span><span class="kt">float</span><span class="o">&gt;</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">&lt;</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">&lt;</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">&lt;</span><span class="n">MSTensor</span><span class="o">&gt;</span><span class="w"> </span><span class="o">&amp;</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">&lt;&lt;</span><span class="w"> </span><span class="s">&quot;tensor name is:&quot;</span><span class="w"> </span><span class="o">&lt;&lt;</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">&lt;&lt;</span><span class="w"> </span><span class="s">&quot; tensor size is:&quot;</span><span class="w"> </span><span class="o">&lt;&lt;</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">&lt;&lt;</span><span class="w"> </span><span class="s">&quot; tensor elements num is:&quot;</span><span class="w"> </span><span class="o">&lt;&lt;</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">&lt;&lt;</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">&lt;</span><span class="k">const</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="o">*&gt;</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">&lt;&lt;</span><span class="w"> </span><span class="s">&quot;output data is:&quot;</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">&lt;</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">&amp;&amp;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;=</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">&lt;&lt;</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">&lt;&lt;</span><span class="w"> </span><span class="s">&quot; &quot;</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">&lt;&lt;</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">&lt;</span><span class="kt">float</span><span class="o">&gt;</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">&lt;</span><span class="kt">float</span><span class="o">&gt;</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">&lt;</span><span class="kt">float</span><span class="o">&gt;</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">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">float</span><span class="o">&gt;&gt;</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">&lt;</span><span class="kt">int</span><span class="o">&gt;</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">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;</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">&quot;装甲侦察车&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;装甲运输车&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;不明&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;坦克&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;自行高炮&quot;</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">&lt;&lt;</span><span class="w"> </span><span class="s">&quot;预测结果: &quot;</span><span class="w"> </span><span class="o">&lt;&lt;</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">&lt;&lt;</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="此标题的永久链接"></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">&#39;../cnn-sar/Target&#39;</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(&quot;before ===&gt; &quot;, image.shape)</span>
<span class="linenos">25</span> <span class="c1"># 添加 color 通道维度,(128x128) =&gt; (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(&quot;after ===&gt; &quot;, 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">&quot;CPU&quot;</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">&quot;.JPEG&quot;</span><span class="p">,</span> <span class="s2">&quot;.PNG&quot;</span><span class="p">,</span> <span class="s2">&quot;.JPG&quot;</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">&quot;image&quot;</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">&quot;image&quot;</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">&quot;image&quot;</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">&quot;数据集加载完成&quot;</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">&#39;mean&#39;</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">&#39;Accuracy&#39;</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">&quot;网络构建完成&quot;</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">&#39;cnn.ckpt&#39;</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">&#39;cnn&#39;</span><span class="p">,</span> <span class="n">file_format</span><span class="o">=</span><span class="s2">&quot;MINDIR&quot;</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">&#39;BRDM_2&#39;</span><span class="p">,</span> <span class="s1">&#39;BTR_60&#39;</span><span class="p">,</span> <span class="s1">&#39;SLICY&#39;</span><span class="p">,</span> <span class="s1">&#39;T62&#39;</span><span class="p">,</span> <span class="s1">&#39;ZSU_23_4&#39;</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">&quot;装甲侦察车&quot;</span><span class="p">,</span> <span class="s2">&quot;装甲运输车&quot;</span><span class="p">,</span> <span class="s2">&quot;不明&quot;</span><span class="p">,</span> <span class="s2">&quot;坦克&quot;</span><span class="p">,</span> <span class="s2">&quot;自行高炮&quot;</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">&quot;cnn.mindir&quot;</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">&quot;__main__&quot;</span><span class="p">:</span>
<span class="linenos">43</span> <span class="n">export_gray</span><span class="p">()</span>
<span class="linenos">44</span> <span class="n">export_connection</span><span class="p">()</span>
<span class="linenos">45</span> <span class="n">export_cnn</span><span class="p">()</span>
<span class="linenos">46</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">47</span> <span class="c1"># 1. 读取图片保持原始uint8类型</span>
<span class="linenos">48</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">&quot;image_origin.jpg&quot;</span><span class="p">)</span> <span class="c1"># 默认uint8</span>
<span class="linenos">49</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">50</span> <span class="n">color_image</span><span class="p">,</span>
<span class="linenos">51</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">52</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">53</span> <span class="p">)</span>
<span class="linenos">54</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">55</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">56</span> <span class="n">my_model</span> <span class="o">=</span> <span class="n">GrayCNN</span><span class="p">()</span>
<span class="linenos">57</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">&quot;cnn.ckpt&quot;</span><span class="p">)</span>
<span class="linenos">58</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">59</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">60</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">&#39;gray_cnn&#39;</span><span class="p">,</span> <span class="n">file_format</span><span class="o">=</span><span class="s1">&#39;MINDIR&#39;</span><span class="p">)</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">&#39;gray_cnn.mindir&#39;</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">&quot;预测结果: </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">&quot;</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>&#169; 版权所有 2025 - 2025, 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>