在Jetson nano安装编辑openpose
~~ 如果你有台好电脑就用电脑安装吧,除非你是真的没办法。~~
因为要做项目,我打算在Jetson nano(B1)上安装编译openpose(虽然我知道这并不是一个好主意),安装这个东西我走了很多弯路,兜兜转转至少安装了20多次,重装nano镜像至少5次,耗时大概4个星期,最后成功了,为了确定我的成功使具有可复制性,我又重头装多了两次,确定可行。我觉得绝大多数错误我都踩过,并将自己踩过的坑分享给大家,希望能够帮助到有同样需要的兄弟。
[https://blog.csdn.net/taiyangmiaomiao/article/details/97638598](https://blog.csdn.net/taiyangmiaomiao/article/details/97638598)
[https://blog.csdn.net/weixin_30514003/article/details/113090195](https://blog.csdn.net/weixin_30514003/article/details/113090195)
以上两篇文章是我参照最多的文章,帮了我很多,在这里向两位博主表示衷心的感谢。
如果是用过的镜像,建议重新烧录,因为有一些软件要求用的是旧的版本
一、烧录镜像
如果你有TB官方提供的教程可以按那个来烧录
内存卡选择:64G内存卡(32G都不知道可不可以跑的动)
1.镜像文件
https://developer.nvidia.com/jetson-nano-sd-card-image-r322
找个文件夹放着就好,记得路径,别搞丢了
2.格式化软件
我用的是SD Card Formatter
随便去网上下载一个,下个新的也行
https://www.sdcard.org/downloads/formatter/eula_windows/
首先,如果是用过的镜像,建议重新烧录确定内存,注意卡里没有重要文件删除了别找我。
接着,格式化内存卡(就是这么简单)
3.烧录软件
我用的是balenaEtcher1.5.116
随便去网上下载一个,下个新的也行
https://www.balena.io/etcher/
第一个选择镜像,第二个选择TF卡,第三个是确认烧录
最后耐心等待
烧录半途中和完成后,会弹出很多个盘(什么E\F\G一大堆),不用管,烧录完后就直接关掉就行,千万不要格式化!
4、换源和安装软件
可以参考https://blog.csdn.net/beckhans/article/details/89138876
比较推荐换源(清华源),不换会很慢
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
防止误操作后无法恢复,先备份原文件sources.list
sudo gedit /etc/apt/sources.list
然后删除原来的源,复制下面的清华源(我的话会新建一个文件,复制原来的源存放)
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic main
multiverse restricted universe deb
http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-security main
multiverse restricted universe deb
http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-updates main
multiverse restricted universe deb
http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-backports
main multiverse restricted universe deb-src
http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic main
multiverse restricted universe deb-src
http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-security main
multiverse restricted universe deb-src
http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-updates main
multiverse restricted universe deb-src
http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-backports
main multiverse restricted universe
到sources.list后保存文件,之后打开终端输入让它编辑运行
sudo apt-get update
编辑运行后的镜像已经自带了JetPack,cuda,cudnn,opencv等都已经安装好,并有例子,这些例子安装路径如下所示
(1)检查CUDA
Jetson-nano中已经安装了CUDA10.0版本,但是此时你如果运行 nvcc -V是不会成功的,需要你把CUDA的路径写入环境变量中。OS中自带Vim工具 ,所以运行下面的命令进入环境变量
sudo vim ~/.bashrc
在环境变量最后面添加
export CUDA_HOME=/usr/local/cuda
export LD_LIBRARY_PATH=/usr/local/cuda/lib64: L D L I B R A R Y P A T H e x p o r t P A T H = / u s r / l o c a l / c u d a / b i n : LD_LIBRARY_PATH export PATH=/usr/local/cuda/bin: LDLIBRARYPATHexportPATH=/usr/local/cuda/bin:PATH
然后保存退出
修改:
I
退出修改:
Esc
保存退出:
:wq
最后source一下这个文件。
source ~/.bashrc
source后,此时再执行nvcc -V执行结果如下
beckhans@Jetson:~$ nvcc -V
nvcc: NVIDIA ® Cuda compiler driver
Copyright © 2005-2018 NVIDIA Corporation
Built on Sun_Sep_30_21:09:22_CDT_2018
Cuda compilation tools, release 10.0,V10.0.166
beckhans@Jetson:~$
(2)检查OpenCV
Jetson-nano中已经安装了OpenCV3.3版本,可以使用命令检查OpenCV是否安装就绪
pkg-config opencv --modversion
如果OpenCv安装就绪,会显示版本号,我的版本是3.3.1
(3)检查cuDNN
Jetson-nano中已经安装好了cuDNN,并有例子可供运行,我们运行一下例子,也正好验证上面的CUDA
cd /usr/src/cudnn_samples_v7/mnistCUDNN
进入例子目录
sudo make
编译一下例子
sudo chmod a+x mnistCUDNN
为可执行文件添加执行权限
./mnistCUDNN
执行
如果成功,如下所示
beckhans@Jetson:/usr/src/cudnn_samples_v7/mnistCUDNN$ ./mnistCUDNN
cudnnGetVersion() : 7301 , CUDNN_VERSION from cudnn.h : 7301 (7.3.1)
Host compiler version : GCC 7.3.0 There are 1 CUDA capable devices on
your machine : device 0 : sms 1 Capabilities 5.3, SmClock 921.6 Mhz,
MemSize (Mb) 3964, MemClock 12.8 Mhz, Ecc=0, boardGroupID=0 Using
device 0 Testing single precision Loading image data/one_28x28.pgm
Performing forward propagation … Testing
cudnnGetConvolutionForwardAlgorithm … Fastest algorithm is Algo 1
Testing cudnnFindConvolutionForwardAlgorithm … ^^^^
CUDNN_STATUS_SUCCESS for Algo 1: 0.325104 time requiring 3464 memory
^^^^ CUDNN_STATUS_SUCCESS for Algo 0: 0.387500 time requiring 0 memory
^^^^ CUDNN_STATUS_SUCCESS for Algo 2: 0.540729 time requiring 57600
memory ^^^^ CUDNN_STATUS_SUCCESS for Algo 4: 4.965156 time requiring
207360 memory ^^^^ CUDNN_STATUS_SUCCESS for Algo 7: 5.201146 time
requiring 2057744 memory Resulting weights from Softmax:
0.0000000 0.9999399 0.0000000 0.0000000 0.0000561 0.0000000 0.0000012 0.0000017 0.0000010 0.0000000 Loading image data/three_28x28.pgm Performing forward propagation … Resulting weights from Softmax:
0.0000000 0.0000000 0.0000000 0.9999288 0.0000000 0.0000711 0.0000000 0.0000000 0.0000000 0.0000000 Loading image data/five_28x28.pgm Performing forward propagation … Resulting weights from Softmax:
0.0000000 0.0000008 0.0000000 0.0000002 0.0000000 0.9999820 0.0000154 0.0000000 0.0000012 0.0000006 Result of classification: 1 3 5 Test passed! Testing half precision (math in single precision)
Loading image data/one_28x28.pgm Performing forward propagation …
Testing cudnnGetConvolutionForwardAlgorithm … Fastest algorithm is
Algo 1 Testing cudnnFindConvolutionForwardAlgorithm … ^^^^
CUDNN_STATUS_SUCCESS for Algo 0: 0.113750 time requiring 0 memory ^^^^
CUDNN_STATUS_SUCCESS for Algo 1: 0.119792 time requiring 3464 memory
^^^^ CUDNN_STATUS_SUCCESS for Algo 2: 0.236198 time requiring 28800
memory ^^^^ CUDNN_STATUS_SUCCESS for Algo 4: 1.031719 time requiring
207360 memory ^^^^ CUDNN_STATUS_SUCCESS for Algo 5: 5.049948 time
requiring 203008 memory Resulting weights from Softmax:
0.0000001 1.0000000 0.0000001 0.0000000 0.0000563 0.0000001 0.0000012 0.0000017 0.0000010 0.0000001 Loading image data/three_28x28.pgm Performing forward propagation … Resulting weights from Softmax:
0.0000000 0.0000000 0.0000000 1.0000000 0.0000000 0.0000714 0.0000000 0.0000000 0.0000000 0.0000000 Loading image data/five_28x28.pgm Performing forward propagation … Resulting weights from Softmax:
0.0000000 0.0000008 0.0000000 0.0000002 0.0000000 1.0000000 0.0000154 0.0000000 0.0000012 0.0000006 Result of classification: 1 3 5 Test passed!
(4)Jetson Nano Swap交换空间增加
依次输入以下命令,可以使交换空间增加4G,解决一些耗尽内存的程序出错。(我不知道这个有没有影响,有人说可以不用搞这个,不过我觉得交换空间增加可能可以提高运行空间吧,如果你不做也成功了就在评论区告诉我)
sudo fallocate -l 4G /var/swapfile
sudo chmod 600 /var/swapfile
sudo mkswap /var/swapfile
sudo swapon /var/swapfile
sudo bash -c ‘echo “/var/swapfile swap swap defaults 0 0” >>
/etc/fstab’
(5)安装环境依赖
sudo apt-get install libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev
sudo apt-get install --no-install-recommends libboost-all-dev
sudo apt-get install libopenblas-dev liblapack-dev libatlas-base-dev
sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev
sudo apt-get install git build-essential
sudo apt install libcanberra-gtk-module
sudo apt-get install qtbase5-dev
二、安装openpose
建立pose文件夹,专门存放openpose、cmake、protobuf 2.6和配置.git文件
1、openpose
(1)openpose下载
首先在github上下载openpose
https://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/master/doc/installation.md
如果你觉得github下的好慢的话可以用CSDN的开源广场下载
https://codechina.csdn.net/mirrors/CMU-Perceptual-Computing-Lab/openpose
但是无论是在github还是CODE CHINA上clone的openpose项目都存在一个问题,就是openpose项目目录下的3rdparty目录中的caffe目录和pybind11为空,需要单独下载。
(2)caffe 下载
openpose 的 caffe 下载地址:
https://github.com/CMU-Perceptual-Computing-Lab/caffe/tree/b5ede488952e40861e84e51a9f9fd8fe2395cc8a
(caffe最好用openpose自带的,不然会有很多问题)
(3)pybind11 下载
openpose 的 pybind11 下载地址:
https://github.com/pybind/pybind11/tree/085a29436a8c472caaaf7157aa644b571079bcaa
(单独下载这两个文件夹后,对3rdparty目录中的caffe目录和pybind11进行替换,注意文件夹名称保持不变,还是“caffe”和“pybind11”,不然可能存在路径问题。)
(4)openpose模型下载
提前下好模型,到时候cmake-gui编译就不用等太久,5个模型分别放在OpenPose目录下的models文件下的对应模型文件里
https://blog.csdn.net/weixin_40245131/article/details/106988775?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161797492516780264024387%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=161797492516780264024387&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-1-106988775.first_rank_v2_pc_rank_v29&utm_term=openpose%E6%A8%A1%E5%9E%8B%E4%B8%8B%E8%BD%BD
2.安装protobuf 2.6
有人说因为caffe不支持3.0以上的protobuf要用2.6版本,但是我是用openpose自带caffe,不知道对protobuf有没有要求,所以我没冒险还是用2.6版,毕竟protobuf不是核心工具,如果你试过可以的话就在评论区和我说。
查看当前protoc的版本
protoc --version
查看哪些路径下安装了protoc
whereis protoc
下载protobuf 2.6:
https://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz
安装依赖
sudo apt-get install build-essential
进入protobuf-2.6.1
cd pose/protobuf-2.6.1/
配置安装文件
./configure
编译
make
检测编译安装环境
make check
安装
sudo make install
检查环境变量是否安装配置好protoc
protoc --version
一般来说是没有的,只会提示出现以下报错
protoc: error while loading shared libraries: libprotocbuf.so.9:
cannot open shared
解决以上报错需要在 /etc/ld.so.conf.d/目录下创建一个 bprotobuf.conf文件,不过需要管理员root权限。
进入root
sudo su
退出root
su 用户名
进入root后
vim bprotobuf.conf
往bprotobuf.conf文件添加的内容
/usr/local/lib
创建好bprotobuf.conf文件后,在 /etc/ld.so.conf.d/目录下输入命令:
sudo ldconfig
最后再次检查环境变量是否有protoc
protoc --version
libprotoc 2.6.1
安装好后,注意不要更新protobuf,不要使用sudo apt upgrade。
3.安装cmake
愿世界没有cmake,实在恶心人,这里的坑太多,经过兜兜转转才我走出来(泪目,给我点个赞吧)
首先安装依赖
sudo apt-get install qtbase5-dev
在cmake官方网站下载cmake的安装文件,我建议下载的是3.16版本,太高版本可能存在不适应,一大堆麻烦。
https://cmake.org/files/v3.16/
然后提取到pose文件夹下安装编译
cd pose/cmake-3.16.0
./configure --qt-gui
./bootstrap
make
sudo make install
检查cmake是否完成安装,如果安装成功可以看到这样的图标,通过图形界面打开cmake软件。
三、编译openpose
1、新建build文件夹
在pose文件夹下openpose文件夹下新建build文件夹
2、编译cmake
打开cmake,源文件:openpose文件夹;目标文件:openpose下新建build文件夹
(注意打钩的地方)
新建build会有如下提示,选择“Finish”就好。
3、Configure与Generate
先点击“Configure”按钮,如果成功,会提示“Configuring done”。
再点击“Generate”,如果成功,会提示“Generate done”
(注意顺序)
如果有这么简单就好了。。。
实际上点击“Configure”按钮后即使提示“Configuring done”了,但仔细看它会在“Configure”按钮下面的编辑进度框里提示你有一个错误:致命git。
4、git与master的配置
(1)git
git出错主要是我们还没有给git配置好,首先你要去github注册一个号。
在终端输入命令安装
sudo apt-get install git
安装完成后进行git配置,输入指令
git config --global user.name “github用户名”
git config --global user.eamil “github注册邮箱”
因为git是通过ssh的方式访问资源库的,所以需要在本地创建验证用的文件。
使用命令
ssh-keygen -C ‘github注册邮箱’ -t rsa
(这个命令是在用户目录~/.ssh/下建立相应的密钥文件)
(2)github
进入.ssh
cd ~/.ssh
进入后输入,获取公钥内容
gedit id_rsa.pub
将id_rsa.pub文件公钥内容复制添加到github上
Title随便取个名,key是公钥内容,然后Add SSH key。
(3)master
回到终端,进入pose文件夹,运行命令初始化git
git init
进入openpose下把build文件夹删掉,再新建一个build文件夹
然后在终端进入/pose/openpose/build下输入
vi …/CMakeLists.txt
在CMakeLists.txt的68%处,
把master那行的#去掉,把下面c95002f那行的#加上
如下
在CMakeLists.txt的70%处还有两行,
也是把master那行的#去掉,把下面c95002f那行的#加上
(c95002f可能每个人都不是很一样,比如我是1807add,我觉得问题不大)
再到cmake-gui,重复上面的编译步骤运行Configure
很好,又报错。
error: pathspec ‘master’ did not match any file(s) known to
出现这个错误是因为git的本地分支master进不去,我猜是git还没提交过所以识别不了master。
下面是我的测试解决的整个过程
git init
$Initialized empty Git repository in e:/tRepo/.git/
ls -ah
$ .git
git checkout -b dev
$Switched to a new branch ‘dev’
git checkout master
$error: pathspec ‘master’ did not match any file(s) known to git.
vim readme.txt
可以输入点东西,也可以不输。
git status
$On branch dev
Initial commit
Untracked files:
(use “git add …” to include in what will be committed)
readme.txt
nothing added to commit but untracked files present (use “git add” to track
git add .
等它传输
git status
$On branch dev
Initial commit
Changes to be committed:
(use “git rm --cached …” to unstage)
new file: readme.txt
git commit -m “add a new file:readme.txt”
$[dev (root-commit) 06e83d0] add a new file:readme.txt
1 file changed, 1 insertion(+)
create mode 100644 readme.txt
git checkout dev
$Already on ‘dev’
git checkout master
$error: pathspec ‘master’ did not match any file(s) known to git.
git checkout -b master
$Switched to a new branch ‘master’
git checkout master
$Already on ‘master’
git checkout dev
$Switched to branch ‘dev’
git checkout -
$Switched to branch ‘master’
ok,搞好了
再再回到cmake-gui,先点击“Configure”按钮,如果成功,会提示“Configuring done”。
再点击“Generate”,如果成功,会提示“Generate done”
(注意顺序)
然后我的gui就编译通过了。
四、编译cmake
进入build文件夹
cd pose/openpose/build/
编译make
sudo make
编译要很慢,也没有错误提出
五、运行openpose
Jetson nano算力其实有限,比较容易使Jetson nano卡住不动,最后什么也没出来,提示“killed”(裂开)。需要缩小网络,缩小usb摄像头画面大小,否则nano也可能自己关机了
使用usb摄像头:
./build/examples/openpose/openpose.bin -camera_resolution 320x160 -net_resolution 64x32
注意:两个数值可以调整,但需要是16的倍数
其他示例也需要设置网络大小,否则很难在Jetson nano上跑起来
处理视频:
./build/examples/openpose/openpose.bin --video examples/media/video.avi --net_resolution 64x32
处理图片:
./build/examples/openpose/openpose.bin --image_dir examples/media/ --net_resolution 64x32
注意:处理图片时,example/media/文件中有多张图片,如果想要快速检测,可以只留一张图片在此文件夹中,其他图片另存备份。
成功实时检测
关于网络大小:
其实128x96效果比较好,但是很容易自动关机。网络太小时,需要离摄像头很近,才能检测出姿态,如果距离较远,会检测不出姿态或者姿态不准确。而网络较大时,距离较远就可以准确识别姿态,但是算力会比较紧张,因为Jetson nano随时会关机。
关于摄像头:
可以用树莓派摄像头,但是好像需要进行一些设置,我也不知道怎么做,知道的兄弟可以在评论区和我说。
可以用usb摄像头,即插即用(必须是Ubuntu下免驱的),比较方便。
本文为学习笔记,供自己学习记录,如果有错请勿骂人。
希望相互学习,共同进步,望三连哦!