《CMake 构建实战-项目开发卷》实战分享4—基于onnxruntime的手写数字识别库
<div class='showpostmsg'> 本帖最后由 CoderX9527 于 2024-11-5 17:02 编辑<div> </div>
<h1>简介</h1>
<div>这是本书的最后一个章节,融合前面模块、库搜寻、调用第三方库的知识,并基于 ONNX runtime 写一个手写数字识别的命令行工具。</div>
<h1>ONNX runtime 安装</h1>
<div>ONNX runtime 的官方地址如下</div>
<div><a href="https://github.com/microsoft/onnxruntime">https://github.com/microsoft/onnxruntime</a></div>
<div></div>
<div>ONNX Runtime 是一种跨平台的推理和训练机器学习加速器。通过使用 ONNX runtime 进行推理,可以实现更快的客户体验并降低陈本,并支持诸如 PyTorch、TensorFlow/Keras 等深度学习框架以及诸如 sckit-learn、LightGBM 和 XGBoost 等经典机器学习库。 ONNX Runtime 兼容不同的硬件、驱动程序和操作系统,并利用使用的硬件加速器和图形优化与转换来提供最佳性能。</div>
<h2>安装并检验库(最新版本失败,低版本成功)</h2>
<div>这里下载当前最新的预编译包 onnxruntime-linux-x64-1.20.0.tgz,来源于 <a href="https://github.com/microsoft/onnxruntime/releases">https://github.com/microsoft/onnxruntime/releases</a></div>
<div></div>
<div>下载适用于 linux-x64 平台的压缩包,并解压到如下目录:</div>
<div></div>
<div>ch009 目录下编译失败: 应该和 c++ 版本与编译有关。暂时不折腾了。</div>
<div></div>
<h2>低版本编译成功</h2>
<div>下载和作者一样的 onnxruntime-linux-x64-1.10.0.tgz ,解压到对应目录。</div>
<div>运行提示 Load model failed,符合书本上的描述。</div>
<div></div>
<h1>zlib 库的编译和安装</h1>
<div>zlib 的 github 链接 <a href="https://github.com/madler/zlib">https://github.com/madler/zlib</a></div>
<h2>编译</h2>
<div>在 zlib 源码路径中新建 build-release 目录,进入,然后 cmake 配置并开始编译。</div>
<div>mkdir build-release</div>
<div>cmake -DCMAKE_BUILD_TYPE=Release ..</div>
<div>cmake --build . –config Release</div>
<div></div>
<h2>安装</h2>
<div>cmake --install . 失败,需要以管理员权限安装</div>
<div>sudo cmake --install . 安装成功</div>
<div></div>
<h1>libpng 库的编译和安装</h1>
<div>仓库地址:<a href="https://github.com/pnggroup/libpng">https://github.com/pnggroup/libpng</a></div>
<h2>编译</h2>
<div>在源码目录中新建一个 build-release 目录,在此目录中编译</div>
<div>cmake -DCMAKE_BUILD_TYPE=Release ..</div>
<div>cmake --build . –-config Release</div>
<div></div>
<h2>安装</h2>
<div>cmake --install . 安装失败,需要管理员权限</div>
<div>sudo cmake --install . 安装成功</div>
<div></div>
<h1>手写库示例</h1>
<div>此目录程序是一个调用手写数字识别库的应用程序,依赖上面三个库。</div>
<h2>CMake 目录程序</h2>
<h3>设置工程属性</h3>
<div></div>
<div>以上命令设置 CMake 目录程序的工程属性。</div>
<h3>查找软件包 onnxruntime</h3>
<div>这里指定 onnxruntime 版本为 1.10.0 用户可以根据下载的实际版本进行修改。</div>
<div></div>
<div>第17行查找 onnxruntime 包并指定版本号为 1.10.实际会调用 cmake/Findonnxruntime.cmake 文件。它的内容如下:</div>
<div></div>
<div>最终设置 onnxruntime_INCLUDE_DIR 、onnxruntime_LIBRARIES 两个变量。</div>
<h3>查找软件包 libpng</h3>
<div>在 CMakeLists.txt 的第18行。</div>
<div></div>
<div>它实际会调用 cmake/Findlibpng.cmake 文件,它的内容如下:</div>
<div>注意,它会继续在系统中找 libpng16.cmake 模块文件,即此文件是对 libpng16.cmake 文件的封装,导出了 libpng_LIBRARY 和 libpng_INCLUDE_DIR 两个变量。</div>
<div></div>
<div>注意,libpng16.cmake 文件路径在 /usr/local/lib/libpng/libpng16.cmake 。是上面libpng 安装的。</div>
<h3>生成出错</h3>
<div>出错,提示 png_shared 接口目标包含 ZLIB:ZLIB 没有找到。</div>
<div></div>
<h3>ZLIB:ZLIB 解决办法</h3>
<div>修改 /usr/local/lib/libpng/libpng16.cmake 文件</div>
<div>以管理员权限打开此文件,屏蔽包含 ZLIB:ZLIB 的两个语句,如下图所示:</div>
<div></div>
<div>cmake 配置并编译,成功</div>
<div>mkdir build-debug</div>
<div>cd build-debug</div>
<div>cmake -DCMAKE_BUILD_TYPE=Debug ..</div>
<div>cmake --build . --config Debug</div>
<div></div>
<h2>运行结果—有对有错</h2>
<div>命令行运行 ./recognize ../models/mnist.onnx ../2.png</div>
<div>分别识别 2.png/3.png/4.png 均识别成功。</div>
<div></div>
<div>这里的 2.png/3.png/4.png 均是作者提供的原始图片。</div>
<div>以下是我提供的图片 8.png/9.png/0.png,图片尺寸和2.png 相同,111x131 像素大小。</div>
<div></div>
<div>运行结果如下:0/8 识别正确,9 识别错误(识别为1)。</div>
<div></div>
<div>又提供了一张粗体的 9_bold.png 图片,识别结果还是出错,识别成了7.</div>
<div></div>
<p><!--importdoc--></p>
</div><script> var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;" style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
if(parseInt(discuz_uid)==0){
(function($){
var postHeight = getTextHeight(400);
$(".showpostmsg").html($(".showpostmsg").html());
$(".showpostmsg").after(loginstr);
$(".showpostmsg").css({height:postHeight,overflow:"hidden"});
})(jQuery);
} </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> #聊一聊# 为什么0/9 两张图片识别失败呢?
页:
[1]