当前位置: 首页 > news >正文

【lite.ai.toolkit】【深度学习】【Ubuntu 20.04】C++ 轻量级AI模型工具箱的编译、安装、使用教程

【lite.ai.toolkit】【深度学习】【Ubuntu 20.04】C++ 轻量级AI模型工具箱的编译、安装、使用教程

C++算法库: 【】编译、安装、使用极简教程

文章目录

  • 【lite.ai.toolkit】【深度学习】【Ubuntu 20.04】C++ 轻量级AI模型工具箱的编译、安装、使用教程
  • 前言
  • 依赖环境搭建
    • 安装必要的依赖库
    • 安装 CUDA Toolkit
  • lite.ai.toolkit工具箱下载编译安装(onnxruntime)
  • lite.ai.toolkit 工具箱案例说明(onnxruntime)
    • age_googlenet 年龄预测
    • yolov8face 人脸检测
  • 总结


前言

lite.ai.toolkit【源码】 是一个轻量级的 C++ AI 模型工具箱,它旨在让开发者能够更方便地在各种环境中快速部署和运行流行的 AI 模型。

优势说明
加粗样式核心定位
模型支持提供了大量(超过100种)预先集成好的流行 AI 模型,涵盖了目标检测、人脸检测与识别、图像分割、抠图等多个领域。
推理引擎支持支持多种高性能的推理引擎作为后端,包括 ONNXRuntime、MNN、NCNN 和 TNN。
跨平台性支持在 Linux、Windows、macOS 以及 Android 等主流操作系统上运行。

依赖环境搭建

环境 Ubuntu 20.04
Windows系统的读者,博主建议安装docker而不是双系统。
【Windows11系统下安装docker】
【Windows11创建Ubuntu20.04 docker容器】

# 查看系统版本
lsb_release -a

安装必要的依赖库

sudo apt update # 安装 CMake
sudo apt install cmake -y# 安装 build-essential
sudo apt install -y build-essential

安装 CUDA Toolkit

【Ubuntu 环境配置详细教程】

1.安装合适的CUDA 【CUDA官网地址】

下载CUDA Toolkit 11.8
wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run
sudo sh cuda_11.8.0_520.61.05_linux.run

安装过程:Continue–>accept–>取消Driver选项([x]-选择,[]-不选择)
配置环境变量

# 打开.bashrc文件,添加信息
vim ~/.bashrc# 需要在.bashrc文件末尾添加的信息
export CUDA_HOME=/usr/local/cuda${CUDA_HOME:+:${CUDA_HOME}}
export PATH=/usr/local/cuda/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}# 加载修改后的设置使之生效
source ~/.bashrc
# 查看CUDA版本
nvcc -V


2.安装对应的CUDNN【CUDNN官方地址】
推荐选择"Local Installer for Linux x86_64 (Tar)"。

# 解压
tar -xvf cudnn-linux-x86_64-8.9.7.29_cuda11-archive.tar.xz 
# 将下载好的.h文件和lib文件放到cuda文件夹目录下
sudo cp cudnn-linux-x86_64-8.9.7.29_cuda11-archive/include/cudnn*.h /usr/local/cuda/include 
sudo cp -p cudnn-linux-x86_64-8.9.7.29_cuda11-archive/lib/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*
# 查看cuDNN版本
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2


lite.ai.toolkit工具箱下载编译安装(onnxruntime)

暂时只关注onnxruntime版本工具箱的编译和安装。

从官网下来源码 https://github.com/xlite-dev/lite.ai.toolkit

# 下载到合适的路径下
git clone --depth=1 https://github.com/xlite-dev/lite.ai.toolkit.git
# 编译按照
cd lite.ai.toolkit && sh ./build.sh

1.可能出现的问题: fatal error: cuda_runtime.h: 没有那个文件或目录。

解决方式:找到 “lite.ai.toolkit/examples/lite/cv/test_lite_face_restoration.cpp” 文件,修改部分内容:

# 原始代码
#include "lite/trt/cv/trt_face_restoration_mt.h"# 修改为
#ifdef ENABLE_TENSORRT
#include "lite/trt/cv/trt_face_restoration_mt.h"
#endif

2.可能出现的问题: 无法找到所需的符号(GLIBCXX_3.4.29和GLIBCXX_3.4.30),使用的预编译 .so 文件(libopencv_core.so, libddim_scheduler_cpp.so)是用高版本 GCC(≥10) 编译的,系统 libstdc++.so.6 太旧,不支持 GLIBCXX_3.4.29 和 3.4.30。

解决方式: “升级 GCC 和 libstdc++” 即可解决,最后在重新编译。
检查当前 GCC 版本和 GLIBCXX 版本:

# 检查当前 GCC 版本
gcc --version
g++ --version
# 检查系统支持的 GLIBCXX 版本
strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX | tail -10


升级GCC和GLIBC++:

# 安装 software-properties-common 软件包
sudo apt update
sudo apt install -y software-properties-common
# 添加一个名为 PPA (Personal Package Archive) 的第三方软件源
#  Ubuntu 社区维护的 PPA 专门用于提供更新版本的 GCC、G++、binutils 等开发工具链(toolchain)
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
# 安装更高版本的GCC编译器
sudo apt install -y gcc-10 g++-10
# 将gcc-11/g++-11注册为 gcc/g++ 命令的可选版本之一,并设置优先级。
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 100
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 100
# 查看所有 gcc/g++ 版本
ls /usr/bin/gcc*
ls /usr/bin/g++*
# 查看 gcc/g++ 的 alternatives 配置,包含优先级
sudo update-alternatives --verbose --display gcc
sudo update-alternatives --verbose --display g++


验证升级成功:

gcc --version
g++ --version
strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX | tail -5


lite.ai.toolkit 工具箱案例说明(onnxruntime)

暂时只关注onnxruntime版本工具箱的案例说明。

age_googlenet 年龄预测

1.执行官方案例

# 测试用例的输出路径在bin子目录中
cd lite.ai.toolkit/build/install/bin
# eg:博主的位置
cd ./lite_ag/root/ayu_projects/lite.ai.toolkit/build/install/bin
# 年龄预测命令
./lite_age_googlenet 

出现 “/lite_modnet_dyn: error while loading shared libraries: libopencv_features2d.so.409: cannot open shared object file: No such file or directory” 。说明OpenCV库文件路径没有被正确配置,因此需要指定(临时),而后再次执行命令。

# 将OpenCV库路径添加到环境变量
export LD_LIBRARY_PATH=XXX/lite.ai.toolkit/build/install/third_party/opencv/lib:$LD_LIBRARY_PATH
#eg:博主个人的路径
export LD_LIBRARY_PATH=/root/ayu_projects/lite.ai.toolkit/build/install/third_party/opencv/lib:$LD_LIBRARY_PATH

执行结果:

结果保存到lite.ai.toolkit/examples/logs路径下:

2.检测个人数据集
在lite.ai.toolkit/examples/lite/cv路径下找到原始test_lite_age_googlenet.cpp文件

test_lite_age_googlenet.cpp 源码(onnxruntime相关部分):

#include "lite/lite.h"static void test_default()
{std::string onnx_path = "../../../examples/hub/onnx/cv/age_googlenet.onnx";std::string test_img_path = "../../../examples/lite/resources/test_lite_age_googlenet.jpg";std::string save_img_path = "../../../examples/logs/test_lite_age_googlenet.jpg";// 1. Test Default Engine ONNXRuntimelite::cv::face::attr::AgeGoogleNet *age_googlenet = new lite::cv::face::attr::AgeGoogleNet(onnx_path);lite::types::Age age;cv::Mat img_bgr = cv::imread(test_img_path);age_googlenet->detect(img_bgr, age);lite::utils::draw_age_inplace(img_bgr, age);cv::imwrite(save_img_path, img_bgr);if (age.flag)std::cout << "Default Version Detected Age: " << age.age << std::endl;delete age_googlenet;}static void test_onnxruntime()
{
#ifdef ENABLE_ONNXRUNTIMEstd::string onnx_path = "../../../examples/hub/onnx/cv/age_googlenet.onnx";std::string test_img_path = "../../../examples/lite/resources/test_lite_age_googlenet.jpg";std::string save_img_path = "../../../examples/logs/test_lite_age_googlenet.jpg";// 2. Test Specific Engine ONNXRuntimelite::onnxruntime::cv::face::attr::AgeGoogleNet *onnx_age_googlenet =new lite::onnxruntime::cv::face::attr::AgeGoogleNet(onnx_path);lite::types::Age age;cv::Mat img_bgr = cv::imread(test_img_path);onnx_age_googlenet->detect(img_bgr, age);if (age.flag)std::cout << "ONNXRuntime Version Detected Age: " << age.age << std::endl;delete onnx_age_googlenet;
#endif
}

可以看到源码中待检测图像的路径、模型权重文件路径以及输出路径都已经被写死。检测个人数据集最简单的方式有俩种,一个是修改源码中的中的指定文件的路径,然后再重新编译;另一个则是讲你的被检测的个人图像名修改成源码中的指定的图像名。

感觉不是很准确。

yolov8face 人脸检测

1.执行官方案例

# 人脸检测命令
./lite_yolov8face

结果保存到lite.ai.toolkit/examples/logs路径下:

2.检测个人数据集
test_lite_yolov8face.cpp 源码(onnxruntime相关部分):

#include "lite/lite.h"static void test_default()
{std::string onnx_path = "../../../examples/hub/onnx/cv/yoloface_8n.onnx";std::string test_img_path = "../../../examples/lite/resources/test_lite_face_detector_2.jpg";std::string save_img_path = "../../../examples/logs/test_lite_yolov8face.jpg";// 1. Test Default Engine ONNXRuntimelite::cv::face::detect::YOLOV8Face *yolov8_face = new lite::cv::face::detect::YOLOV8Face(onnx_path);std::vector<lite::types::Boxf> detected_boxes;cv::Mat img_bgr = cv::imread(test_img_path);yolov8_face->detect(img_bgr, detected_boxes);lite::utils::draw_boxes_inplace(img_bgr, detected_boxes);cv::imwrite(save_img_path, img_bgr);std::cout<<"face detect done!"<<std::endl;delete yolov8_face;}


总结

尽可能简单、详细的介绍Ubuntu 20.04环境配置lite.ai.toolkit工具箱的教程,以及简单讲解一些使用案例,后续会讲解lite.ai.toolkit工具箱的相关代码。


文章转载自:

http://Z4sRt45m.zbnkt.cn
http://BmZznzGy.zbnkt.cn
http://Uq4tBMVR.zbnkt.cn
http://fPQ2H3ej.zbnkt.cn
http://s1quBZry.zbnkt.cn
http://65wlsRWb.zbnkt.cn
http://8gZvAkhG.zbnkt.cn
http://qNgf2Khb.zbnkt.cn
http://ST3gibLV.zbnkt.cn
http://yGcjXVDy.zbnkt.cn
http://aPqUs9QO.zbnkt.cn
http://a82WGb96.zbnkt.cn
http://DE0Zqd0z.zbnkt.cn
http://MHVD8Q28.zbnkt.cn
http://0jJDZVb6.zbnkt.cn
http://YzWEEQjw.zbnkt.cn
http://K6WosnS0.zbnkt.cn
http://AsPmT8hk.zbnkt.cn
http://pWt7aEov.zbnkt.cn
http://yr6p7u0L.zbnkt.cn
http://z8PXPGC6.zbnkt.cn
http://Tpsei385.zbnkt.cn
http://0KzXYp6r.zbnkt.cn
http://iQCGDLo5.zbnkt.cn
http://eW6aC18n.zbnkt.cn
http://7CFKQ3rp.zbnkt.cn
http://f19RFJer.zbnkt.cn
http://DWueSTek.zbnkt.cn
http://1jDaf9Yy.zbnkt.cn
http://Q0Bddp7L.zbnkt.cn
http://www.dtcms.com/a/379479.html

相关文章:

  • 远程创意协作新方式:cpolar助力Drawnix跨地域团队协作
  • 深入理解 Linux 内核进程管理
  • 企业跨区域组网新解:SD-WAN技术打造安全稳定网络体系
  • 单身杯2 web
  • 《Learning Langchain》阅读笔记12-RAG(8):RAG的优化策略
  • daily notes[43]
  • LRU缓存详解:用C语言实现高效数据管理
  • 灵码产品演示:软件工程架构分析
  • 硬件电路-陀机
  • swiper插件的使用
  • mysql的各种锁
  • Java大厂面试实录:AIGC与虚拟互动场景下的微服务与AI落地(附知识详解)
  • Kafka 学习笔记
  • 机械零件极限应力线图
  • 萤石安全生产监管解决方案:构建企业安全智能化防护网
  • sqlmap常用命令
  • MID认证:全球电力计量市场的通行证与中国协议兼容性分析
  • STM32开发(USART:IIC总线)
  • Spring框架中用到的设计模式
  • 从源码和设计模式深挖AQS(AbstractQueuedSynchronizer)
  • 四、计算机网络与分布式系统(中)
  • 半导体学习笔记
  • 深入解析Dart虚拟机运行原理
  • 一文教您解决Ubuntu ModuleNotFoundError: No module named ‘_tkinter‘问题
  • 部署合约常见的问题
  • Python快速入门专业版(二十三):for循环基础:遍历字符串、列表与range()函数(计数案例)
  • MySQL 非空约束(NOT NULL):看似简单,却决定数据质量的关键细节
  • 【笔记】悬架减振器的阻尼带宽
  • C++:迭代器失效问题(vector为例)
  • TDengine 选择函数 TAIL() 用户手册