一、准备工作
1、首先你得给你的TX2 刷好机,而且最好刷最新版本Jetpack4.4.1(因为本人刷过3.3的版本,运行代码时会出现很多的问题)
2、教程原地址
二、正式的学习
1、该教程做了哪些
(1)此仓库使用NVIDIA TensorRT将神经网络有效地部署到嵌入式Jetson平台上.
(2)在Jetson上运行推理和转移学习,包括收集自己的数据集和训练自己的模型。它涵盖了图像分类,对象检测和分割。
2、从源头开始构建项目
(1)总体的执行过程
$ sudo apt-get update//更新安装程序列表
$ sudo apt-get install git cmake libpython3-dev python3-numpy//安装python3依赖库和cmake
$ git clone --recursive https://github.com/dusty-nv/jetson-inference//克隆该项目
$ cd jetson-inference//进入到该目录
$ git submodule update --init//更新submodule
$ mkdir build
$ cd build
$ cmake ../
$ make -j$(nproc)
$ sudo make install
$ sudo ldconfig
(2)有些指令为什么要执行?
1、为什么需要cmke、make、makefile
在前面我们通过sudo apt install cmake安装了一个cmake的工具,那么它到底是什么呢?
①是什么?
CMake是一个跨平台的编译(Build)工具,可以用简单的语句来描述所有平台的编译过程。
②为什么需要它?它不能构建最终的软件,但是可以产生输出各种各样的makefile或者project文件。
假如我们有一个深度学习框架的部分工程列表,里面有超过40个互相调用的工程共同组成,一些用于生成库文件,一些用于实现逻辑功能。他们之间的调用关系复杂而严格,如果我想在这样复杂的框架下进行二次开发,显然只拥有它的源码是远远不够的,还需要清楚的明白这几十个项目之间的复杂关系,在没有原作者的帮助下进行这项工作几乎是不可能的。即使是原作者给出了相关的结构文档,对新手来说建立工程的过程依旧是漫长而艰辛的,因此CMake的作用就凸显出来了。原作者只需要生成一份CMakeLists.txt文档,框架的使用者们只需要在下载源码的同时下载作者提供的CMakeLists.txt,就可以利用CMake,在”原作者的帮助下“进行工程的搭建。
③输出了makefile文件后有什么用?
makefile定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具。
④为什么需要makefile?
有效地描述这些文件之间的依赖关系以及处理命令,当个别文件改动后仅执行必要的处理,而不必重复整个编译过程,可以大大提高软件开发的效率。
⑤最终完整的实现逻辑
通过cmake编译cmakelist.txt生成了makefile文件,然后通过make工具就可以解释makefile最终生成可执行文件。
执行make就可以实现自动编译,执行make clean 就可以清楚编译产生的文件,本人博客的makefile专栏有简单的makefile编写,链接如下
2、在刚刚的构建步骤中为什么执行cmake …/?
看下图既可知道。
此命令将启动CMakePreBuild.sh在Jetson上安装某些必备软件包,该脚本还从Web服务下载经过预训练的网络。
3、make的相关命令的作用
make,仅编译;
make install,编译并安装(比如安装到/usr/bin目录下,然后可以直接使用。因为/usr/bin只有管理员才能向里面添加文件,所以通常要加sudo)
make就是make all,编译用的,具体编译了那些文件要看你的Makefile
make install就是把编译出来的二进制文件,库,配置文件等等放到相应目录下
make clean清除编译结果
具体的东西都在Makefile里面,只不过大部分应用程序的Makefile都是由configure脚本自动生成的,所以Makefile内容都差不多。
上面的构建过程中用到了sudo make install ,更新代码,请记住再次运行它。
4、sudo ldconfig
ldconfig是一个动态链接库管理命令,为了让动态链接库为系统所共享,还需运行动态链接库的管理命令–ldconfig。 ldconfig 命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态 链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件.缓存文件默认为 /etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表.
linux下的共享库机制采用了类似于高速缓存的机制,将库信息保存在/etc/ld.so.cache里边。
程序连接的时候首先从这个文件里边查找,然后再到ld.so.conf的路径里边去详细找。
这就是为什么修改了ld.so.conf要重新运行一下ldconfig的原因
补充一点,ldconfig在/sbin里面。
可参考这篇博主的文章
3、使用ImageNet程序
(1)处理图像
使用TensorRT和imageNet类执行推理,然后叠加分类结果并保存输出图像
首次运行每种模型时,TensorRT将花费几分钟来优化网络。然后将优化的网络文件缓存到磁盘,因此使用该模型的将来运行将加载得更快。
c++的imagenet程序
class imageNet : public tensorNet
{
public:
/**
* Network choice enumeration.
*/
enum NetworkType
{
CUSTOM, /**< Custom model provided by the user */
ALEXNET, /**< AlexNet trained on 1000-class ILSVRC12 */
GOOGLENE