精华内容
下载资源
问答
  • 【亲测可用】Jetson nano安装openpose

    千次阅读 2019-10-20 20:11:25
    因为项目原因,需要在Jetson nano上跑openpose,在网上找相关资源,只找到了小乖的晴天的一篇名为Jetson nano安装openpose的文章,这篇文章真的是帮了我大忙,在这里向这位博主表示衷心的感谢。本人按照这位博主的...

    因为项目原因,需要在Jetson nano上跑openpose,在网上找相关资源,只找到了 小乖的晴天的一篇名为Jetson nano安装openpose的文章,这篇文章真的是帮了我大忙,在这里向这位博主表示衷心的感谢。本人按照这位博主的教程一步一步操作,其中因为自己的一些操作失误原因,踩了一些坑,总共写了三次系统,用了四天的时间,终于在板子上跑来了openpose,这里将自己踩过的一些坑分享给大家,希望能够帮助到有同样需要的伙伴们。

    参考: 小乖的晴天

    本文直接从安装openpose环境开始讲起,此时假设你已经有一块已写入系统的板子。

     

    一、准备openpose安装环境——caffe

    建议使用openpose自带caffe(不过需要先安装好caffe的依赖)

    不需要过多操作,保证openpose——3rdparty——caffe文件夹和github上一样即可

    (直接clone整个openpose,3rdparty里会有caffe这个文件夹,但里边是空的,摊手~)

    openpose 的 caffe 下载地址:

    https://github.com/CMU-Perceptual-Computing-Lab/caffe/tree/b5ede488952e40861e84e51a9f9fd8fe2395cc8a

    关于安装caffe依赖:

    caffe需要一些依赖,否则后面编译会报错。具体步骤如下。

    Jetson nano已经安装好CUDA,cuDNN,以及OpenCV,但是需要配置一些,配置可以参考:

    https://blog.csdn.net/beckhans/article/details/89138876(第3部分,检查已经安装的系统组件)

    这一块建议按照这个步骤做,可以少踩很多坑!

    1.安装protobuf 2.6

    因为caffe不支持3.0以上的protobuf,所以这里用2.6,这是在单独安装caffe时出现的问题,不知道使用openpose自带caffe是否还对protobuf有要求,有试过的同学可以交流一下。

    protoc --version  可查看当前protoc的版本

    whereis protoc 可以查看哪些路径下安装了protoc

    下载protobuf 2.6:
    https://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz

    安装:

    安装完成,如果可以查看版本号,则证明安装成功,如果出现错误:

    protoc: error while loading shared libraries: libprotocbuf.so.9: cannot open shared

     在 /etc/ld.so.conf.d/目录下创建 bprotobuf.conf文件,文件内容如下:

    /usr/local/lib

    这里要注意:你可能没有在/etc/ld.so.conf.d/目录下创建 bprotobuf.conf文件的权限,所以要给当前用户加读写ld.so.conf.d目录下文件的权。#当前路径为/etc

    sudo chmod 777 -R ld.so.conf.d

    创建好bprotobuf.conf文件后,在 /etc/ld.so.conf.d/目录下输入命令:

    sudo ldconfig

    再输入protoc --version,就可以查看protobuf版本号了。

    2.安装其他依赖

    注意:千万不要去切换apt-get的源。因为apt-get的默认源在国外,下载包速度很慢,当时本人将apt-get的源换成了国内的,结果有些依赖包就下载不下来。

    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

    安装时,注意不要更新protobuf,不要使用sudo apt upgrade

    如果出现sudo apt-get install 命令不能用的情况,kill -9 相关进程也没有用,可以试试万能重启。

     

    关于 pybind11

    如果这个文件夹为空,后续编译时会报错

    openpose——3rdparty——pybind11文件夹也存在可能为空的问题

    openpose 的 pybind11 下载地址:

    https://github.com/pybind/pybind11/tree/085a29436a8c472caaaf7157aa644b571079bcaa

    可以单独下载这两个文件夹,进行替换,注意文件夹名称保持不变,还是“caffe”和“pybind11”,不然可能存在路径问题。


    二、编译openpose

    1.保证openpose——3rdparty——caffe 和 pybind11 两个文件夹非空且内容和github上一样

    2.安装cmake-gui

    因为jetson nano的系统是Ubuntu 18,所以需要cmake>=3.12(一般默认为3.10)

    卸载低版本cmake(如果已安装)

    sudo apt purge cmake-qt-gui

    执行

    sudo apt-get install qtbase5-dev

    下载最新版本cmake:

    https://cmake.org/download/

    解压文件,使用命令行进入文件夹,依次运行

    ./configure --qt-gui
    ./bootstrap && make -j8 && sudo make install -j2

    注:make install时,如果不加sudo可能会报权限错误

    -j2,可以量力而行,2可以改为更大的数,但需保证是2的倍数

    如果安装成功可以看到这样的图标(本文中安装的是cmake 3.14)

     

    3.编译openpose

    • 新建build文件夹
    • 打开cmake,源文件:openpose文件夹;目标文件:openpose下新建build文件夹

    如果openpose文件夹下之前没有build。会有如下提示,选择“Finish”就好。

    实际操作界面

    • Configure

    点击“Configure”按钮,如果成功,会提示“Configuring done”。这时,会出现一些选项

    使用openpose自带caffe需要按照下图勾选:

    千万注意不要勾选错了,否则会很麻烦!

    注意:最后一项不要选!!!

    说明:

    1.BUILD_CAFFE:使用自带caffe进行编译

    2.BUILD_EXAMPLE:可以使用openpose示例程序

    3.BUILD_PYTHON:如果需要使用Python的API,需要勾选此项

    4.USE_CUDNN:使用CUDNN加速,不勾选后期调整网络也能跑

    注:WITH_OPENCV_WITH_OPENGL:不用勾选,jetson nano没有OPENGL,如果勾选编译时会报错,或者也可以先安装所需文件,不过本文没有尝试。

    注意:如果之前自己安装过caffe,但是现在想用openpose自带的caffe,一定记得删除之前caffe的环境变量。
     

    sudo vim  ~/.bashrc

    删除环境变量/caffe/python,保存文件后记得source一下

    source ~/.bashrc

    如果想要使用自己安装的caffe,不需要勾选BUILD_CAFFE,而是设置下面两项内容,让cmake可以找到caffe

    • Generate

    点击“Generate”,如果成功,会提示“Generate done”

    • make

    进入openpose——build,然后make,然后等待,直到100%。

    
    cd openpose/build/
    sudo make -j2

    三、运行openpose

    如果上面的步骤都没问题,那么恭喜你,基本上可以成功运行openpose程序了。

    Jetson nano算力有限,如果直接照搬quickstart的示例,很可能发现Jetson nano卡住不动,最后什么也没出来,提示“killed”。

    这时候,需要缩小网络,如果需要外接摄像头,还需要缩小相机画面大小,否则nano也可能自己关机了

    比如直接使用摄像头:

     ./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口的摄像头,即插即用(本文用的这种),比较方便。


    【参考】:

    安装系统:

    https://developer.nvidia.com/embedded/learn/get-started-jetson-nano-devkit#write

    openpose准备工作:

    https://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/master/doc/prerequisites.md

    openpose安装:

    https://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/master/doc/installation.md

    openpose在jetson nano上示例:

    https://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/master/doc/quick_start.md

    https://developer.ridgerun.com/wiki/index.php?title=Setting_up_OpenPose_on_NVidia_Jetson_TX2

    安装protobuf:

    https://blog.csdn.net/yunyi4367/article/details/78071872

    安装caffe依赖:

    https://blog.csdn.net/beckhans/article/details/89393280

     

     

     

     

     

    展开全文
  • Jetson nano 运行openpose

    2021-10-28 14:05:38
    声明:仅作为个人学习使用 ...在网上找相关资源,找到了华仔的一篇名为Jetson nano安装openpose的文章,这篇文章真的是帮了我大忙,在这里向这位博主表示衷心的感谢。经过一天时间,成功运行o..

    声明:仅作为个人学习使用

    之前一直在树莓派上使用openpose,需要用到一个树莓派4B+一个Intel神经网络计算棒,即便如此也只能勉强运行openpose的精简版,成本约为1000r左右,后来发现了nvidia公司生产的Jeston nano,在Jetson nano上跑openpose流畅许多,且成本仅为500r左右

    在网上找相关资源,找到了华仔的一篇名为Jetson nano安装openpose的文章,这篇文章真的是帮了我大忙,在这里向这位博主表示衷心的感谢。经过一天时间,成功运行openpose,以此贴记录。

    一、安装Jeston nano 官方系统

    https://developer.nvidia.com/embedded/downloads

    可以看到官方系统安装了常用的机器学习库,便于我们进行后续操作。

     二、下载openpose

    OpenPose人体姿态识别项目是美国卡耐基梅隆大学(CMU)基于卷积神经网络和监督学习并以caffe为框架开发的开源库。故需要安装caffe框架。

    openpose地址:https://github.com/CMU-Perceptual-Computing-Lab/openpose

    或者使用命令:

    git clone https://github.com/CMU-Perceptual-Computing-Lab/openpose.git

    (注:有的blog提到了需要下载模型,这一步可以跳过,之后使用cmake时会自动下载)

    1. cd openpose

    2. cd models

    3. ./getModels.sh

    4. cd ..

    openpose 的 caffe 下载地址:

    https://github.com/CMU-Perceptual-Computing-Lab/caffe/tree/b5ede488952e40861e84e51a9f9fd8fe2395cc8a

    openpose 的 pybind11 下载地址:

    https://github.com/pybind/pybind11/tree/085a29436a8c472caaaf7157aa644b571079bcaa

    下载完成后,解压,将caffe、pybind11的内容复制到openpose下3rdparty文件夹中。

    三、准备openpose安装环境(apt-get千万不要换源)

    1、检查Jeston nano自带环境

    (1)先进行更新

    sudo apt-get update
    sudo apt-get full-upgrade

    (2)检查安装的组件

    1) 检查CUDA

    Jetson-nano中已经安装了CUDA10.0版本,但是此时你如果运行 nvcc -V是不会成功的,需要你把CUDA的路径写入环境变量中。

    sudo vim  ~/.bashrc


    在最后添加

    export CUDA_HOME=/usr/local/cuda-10.0
    export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64:$LD_LIBRARY_PATH
    export PATH=/usr/local/cuda-10.0/bin:$PATH


     然后保存退出

    对了最后别忘了source一下这个文件。

    source ~/.bashrc


     source后,此时再执行nvcc -V执行结果如下

    beckhans@Jetson:~$ nvcc -V
    nvcc: NVIDIA (R) Cuda compiler driver
    Copyright (c) 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中已经安装了OpenCV4.1.1版本,可以使用命令检查OpenCV是否安装就绪

    pkg-config opencv4 --modversion


    如果OpenCv安装就绪,会显示版本号,我的版本是4.1.1

    3)检查cuDNN

    Jetson-nano中已经安装好了cuDNN,并有例子可供运行,我们运行一下例子,也正好验证上面的CUDA

    cd /usr/src/cudnn_samples_v8/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!

    (3)安装protobuf 2.6(无论使用openpose自带caffe还是自己安装caffe都需要)

    因为caffe不支持3.0以上的protobuf,所以这里用2.6

    protoc --version  可查看当前protoc的版本

    whereis protoc 可以查看哪些路径下安装了protoc

    下载protobuf 2.6:
    https://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz

    安装过程:

    tar -zxvf protobuf-2.6.1.tar.gz
    sudo apt-get install build-essential #不装会报错
    cd protobuf-2.6.1
    ./configure #配置安装文件
    make #编译
    make check #检测编译安装环境
    sudo make install #安装

    安装完成,如果可以查看版本号,则证明安装成功,如果出现错误:

    protoc: error while loading shared libraries: libprotocbuf.so.9: cannot open shared

    在 /etc/ld.so.conf.d/目录下创建 bprotobuf.conf文件,文件内容如下:

    /usr/local/lib


    这里要注意:你可能没有在/etc/ld.so.conf.d/目录下创建 bprotobuf.conf文件的权限,所以要给当前用户加读写ld.so.conf.d目录下文件的权。#当前路径为/etc

    sudo chmod 777 -R ld.so.conf.d


    创建好bprotobuf.conf文件后,在 /etc/ld.so.conf.d/目录下输入命令:

    sudo ldconfig


    再输入protoc --version,就可以查看protobuf版本号了。

    (4)安装其他依赖

    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

    四、下载cmake编译软件(此处选择gui版本)

    因为jetson nano的系统是Ubuntu 18,所以需要cmake>=3.12(一般默认为3.10)

    卸载低版本cmake(如果已安装)

    sudo apt purge cmake-qt-gui

    执行

    sudo apt-get install qtbase5-dev

    下载最新版本cmake:

    Download | CMake

    解压文件,使用命令行进入文件夹,依次运行

    ./configure --qt-gui
    
    ./bootstrap && make -j8 && sudo make install -j2

    大约需要1h时间,之后若找不到cmake图标执行命令:

    cmake-gui
    

    即可打开gui版本cmake。

    五、编译openpose

    到这一步,所有前序工作全部完成,终于可以开始编译openpose了

    点击“Configure”按钮,如果成功,会提示“Configuring done”。这时,会报错并且出现一些选项

    使用openpose自带caffe需要按照下图勾选:

    千万注意不要勾选错了,否则会很麻烦!

    注意:最后一项不要选!!!

    说明:

    1.BUILD_CAFFE:使用自带caffe进行编译

    2.BUILD_EXAMPLE:可以使用openpose示例程序

    3.BUILD_PYTHON:如果需要使用Python的API,需要勾选此项

    4.USE_CUDNN:使用CUDNN加速,不勾选后期调整网络也能跑

    注:WITH_OPENCV_WITH_OPENGL:不用勾选,jetson nano没有OPENGL,如果勾选编译时会报错,或者也可以先安装所需文件,不过本文没有尝试。

    点击Generate,之后等待编译完成。

    进入openpose——build,然后make,然后等待,直到100%。

    
    sudo make -j2

    六、运行openpose

    笔者使用了Intel D435深度摄像头

    使用如下命令即可运行openpose:

    (要将openpose文件夹下models文件夹复制到openpose.bin所在目录下,否则会报错找不到模型models)

    ./build/examples/openpose/openpose.bin --face --hand
    
    ./build/examples/openpose/openpose.bin -camera_resolution 320x160 -net_resolution 64x32

    展开全文
  • Jetson nano安装openpose

    千次阅读 2019-07-30 20:38:14
    本文从烧录系统开始,详细介绍如何在Jetson nano上配置openpose安装环境,编译openpose,以及如何运行示例。 好多次的推倒重来之后,终于可以在Jetson nano上跑起来openpose。 希望本文可以对大家有些许帮助,...

    本文从烧录系统开始,详细介绍如何在Jetson nano上配置openpose安装环境,编译openpose,以及如何运行示例。

    好多次的推倒重来之后,终于可以在Jetson nano上跑起来openpose。

    希望本文可以对大家有些许帮助,欢迎交流呀。

     

    一、烧录系统

     

    关于内存卡选择:一般镜像系统有12G+,16G的内存卡可以跑起来,但如果想要下载的文件较多,估计需要换个大点的卡

    首先需要下载Jetson nano操作系统镜像文件格式化软件、烧写软件

    对了,还需要准备足够空间的内存卡读卡器哦~

    本文使用64G和128G内存卡

     

    1.镜像文件(5G+)

    https://developer.nvidia.com/jetson-nano-sd-card-image-r322

    下载文件即可,记得路径,一会烧录系统要用

     

    2.格式化软件 

    https://www.sdcard.org/downloads/formatter/eula_windows/

    首先,确定内存卡里没有重要文件

    接着,格式化内存卡(格式化结束后,可以关闭此软件,否则在烧录完镜像后,又会有格式化弹窗。如果系统烧录完成之后,又询问是否要格式化,一定记得不要格式化!不要!不要!不要!)

     

    3.烧录软件

    https://www.balena.io/etcher/

     

    选择刚才下载的镜像文件

    点击“Flash”开始烧录,耐心等待几分钟就好啦

    如果烧录完成,出现以下提示:点击“Cancel”!不要再格式化啦!(这就是前面说到的问题)

     

    【注意】:以上步骤针对windows,如需mac或linux,可以参考https://developer.nvidia.com/embedded/learn/get-started-jetson-nano-devkit#prepare

     


     

     

    二、准备openpose安装环境——caffe

     

    建议使用openpose自带caffe(不过需要先安装好caffe的依赖)

    不需要过多操作,保证openpose——3rdparty——caffe文件夹和github上一样即可

    (直接clone整个openpose,3rdparty里会有caffe这个文件夹,但里边是空的,摊手~)

     

    openpose 的 caffe 下载地址:

    https://github.com/CMU-Perceptual-Computing-Lab/caffe/tree/b5ede488952e40861e84e51a9f9fd8fe2395cc8a

    之前自己安装caffe,会存在各种问题,比如caffe依赖的版本问题。即使成功安装caffe,在编译openpose时,也会提示各种caffe版本错误,真是让人头大。

     

     

    关于安装caffe依赖:

    caffe需要一些依赖,否则后面编译会报错。具体步骤如下。

    Jetson nano已经安装好CUDA,cuDNN,以及OpenCV,但是需要配置一些,配置可以参考:

    https://blog.csdn.net/beckhans/article/details/89138876(第3部分,检查已经安装的系统组件)

     

    1.安装protobuf 2.6

    因为caffe不支持3.0以上的protobuf,所以这里用2.6,这是在单独安装caffe时出现的问题,不知道使用openpose自带caffe是否还对protobuf有要求,有试过的同学可以交流一下。

    protoc --version  可查看当前protoc的版本

    whereis protoc 可以查看哪些路径下安装了protoc

    下载protobuf 2.6:

    https://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz

    安装:

    安装完成,如果可以查看版本号,则证明安装成功,如果出现错误:

    protoc: error while loading shared libraries: libprotocbuf.so.9: cannot open shared

     在 /etc/ld.so.conf.d/目录下创建文件 bprotobuf.conf文件,文件内容如下

    /usr/local/lib

    输入命令

    sudo ldconfig

    再输入protoc --version,就可以查看protobuf版本号了。

     

    2.建立交换空间

    看到其他同学安装caffe这么做的,所以也进行了这一步操作,不知道使用openpose的caffe是否需要建立交换空间,尝试过的同学可以交流一下。

    # 先禁用以前的
    sudo swapoff /swapfile
     
    # 修改swap 空间的大小为4G
    sudo dd if=/dev/zero of=/swapfile bs=1M count=4096
     
    # 设置文件为“swap file”类型
    sudo mkswap /swapfile
     
    # 启用swapfile
    sudo swapon /swapfile
     
    # 在/etc/fstab中添加下面代码,将swap空间永久保留,不执行这句重新启动后swap空间被释放
    /swapfile            swap                   swap    defaults        0 0

     

    3.安装其他依赖

    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

    安装时,注意不要更新protobuf,不要使用sudo apt upgrade

    如果出现sudo apt-get install 命令不能用的情况,kill -9 相关进程也没有用,可以试试万能重启。

     

     

    关于 pybind11

    如果这个文件夹为空,后续编译时会报错

    openpose——3rdparty——pybind11文件夹也存在可能为空的问题

    openpose 的 pybind11 下载地址:

    https://github.com/pybind/pybind11/tree/085a29436a8c472caaaf7157aa644b571079bcaa

    可以单独下载这两个文件夹,进行替换,注意文件夹名称保持不变,还是“caffe”和“pybind11”,不然可能存在路径问题。


     

     

    三、编译openpose

    1.保证openpose——3rdparty——caffe 和 pybind11 两个文件夹非空且内容和github上一样

    2.安装cmake-gui

    因为jetson nano的系统是Ubuntu 18,所以需要cmake>=3.12(一般默认为3.10)

    卸载低版本cmake(如果已安装)

    sudo apt purge cmake-qt-gui

    执行

    sudo apt-get install qtbase5-dev

    下载最新版本cmake:

    https://cmake.org/download/

    解压文件,使用命令行进入文件夹,依次运行

    ./configure --qt-gui
    ./bootstrap && make -j8 && sudo make install -j2

    注:make install时,如果不加sudo可能会报权限错误

    -j2,可以量力而行,2可以改为更大的数,但需保证是2的倍数

    如果安装成功可以看到这样的图标(本文中安装的是cmake 3.14)

     

    3.编译openpose

    • 新建build文件夹

    打开cmake,源文件:openpose文件夹;目标文件:openpose下新建build文件夹

    如果openpose文件夹下之前没有build。会有如下提示,选择“Finish”就好。

    实际操作界面

     

    • Configure

    点击“Configure”按钮,如果成功,会提示“Configuring done”。这时,会出现一些选项

    使用openpose自带caffe需要按照下图勾选:

    说明:

    1.BUILD_CAFFE:使用自带caffe进行编译

    2.BUILD_EXAMPLE:可以使用openpose示例程序

    3.BUILD_PYTHON:如果需要使用Python的API,需要勾选此项

    4.USE_CUDNN:使用CUDNN加速,不勾选后期调整网络也能跑

    注:WITH_OPENCV_WITH_OPENGL:不用勾选,jetson nano没有OPENGL,如果勾选编译时会报错,或者也可以先安装所需文件,不过本文没有尝试。

    注意:如果之前自己安装过caffe,但是现在想用openpose自带的caffe,一定记得删除之前caffe的环境变量。

    sudo vim  ~/.bashrc
    

    删除环境变量/caffe/python,保存文件后记得source一下

    source ~/.bashrc

     

     

    如果想要使用自己安装的caffe,不需要勾选BUILD_CAFFE,而是设置下面两项内容,让cmake可以找到caffe

     

    • Generate

    点击“Generate”,如果成功,会提示“Generate done”

     

    • make

    进入openpose——build,然后make,然后等待,直到100%。

    cd openpose/build/
    sudo make -j2

     

     

    四、运行openpose

    Jetson nano算力有限,如果直接照搬quickstart的示例,很可能发现Jetson nano卡住不动,最后什么也没出来,提示“killed”。

    这时候,需要缩小网络,如果需要外接摄像头,还需要缩小相机画面大小,否则nano也可能自己关机了

    比如直接使用摄像头:

     ./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口的摄像头,即插即用(本文用的这种),比较方便。

     

    一点感悟:

    需要找到针对Jetson nano的解决方案可能才比较有效。

    关于openpose,很多问题在官网都有解决方案,还是要仔细阅读官网教程。

     


     

    【参考】:

    安装系统:

    https://developer.nvidia.com/embedded/learn/get-started-jetson-nano-devkit#write

    openpose准备工作:

    https://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/master/doc/prerequisites.md

    openpose安装:

    https://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/master/doc/installation.md

    openpose在jetson nano上示例:

    https://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/master/doc/quick_start.md

    https://developer.ridgerun.com/wiki/index.php?title=Setting_up_OpenPose_on_NVidia_Jetson_TX2

    安装protobuf:

    https://blog.csdn.net/yunyi4367/article/details/78071872

    安装caffe依赖:

    https://blog.csdn.net/beckhans/article/details/89393280

    展开全文
  • Jetson nano实战系列:基于MTCNN+FaceNet实现人脸识别

    0、序

    0.1、MTCNN是啥?

      MTCNN是一个深度卷积多任务的框架。这个框架利用了检测和对准之间固有的关系来增强其性能。在预测人脸和脸部标记点时,通过3个级联的CNN网络完成从粗到精的处理。在使用该网络之前,需要先进行图片的剪裁、缩放将图片缩放到不同的尺寸,形成图像金字塔,然后将不同尺寸的图片放到以下的三个子网络去进行训练。
      第一阶段使用P-Net:
    1)阶段一:使用P-Net网络的时候,输入12×12×3的RGB图像,通过10个3×3的卷积核,和2×2的Max Pooling池化操作,形成10个5×5的特征图;
    2)阶段二:通过16个3×3×10的卷积核,生成16个3×3的特征图;
    3)阶段三:通过32个3×3×16的卷积核将输入的16个3×3的特征图处理,生成32个1×1的特征图。
      输出:
    1)一个1×1×2的二分类得分,表示不是人脸的概率和是人脸的概率;
    2)4个bounding box的坐标偏移量;
    3)5个人脸特征点的坐标。
    在这里插入图片描述
      第二阶段使用R-Net:
      对P-Net生成的bouding box进行进一步的优化调整。输入换成了24×24×3的RGB图片,并加入全链接层。
    在这里插入图片描述
      第三阶段使用O-Net:
      输出最终的人脸框和特征点位置,和第二阶段类似,不过这里输出的5个特征点的位置。
    在这里插入图片描述
    MTCNN论文传送门:https://arxiv.org/ftp/arxiv/papers/1604/1604.02878.pdf
    MTCNN在github项目源码:https://github.com/kpzhang93/MTCNN_face_detection_alignment
      关于FaceNet的相关介绍就不再赘述,详细可见我上一篇博文Jetson nano实战系列:基于dlib+FaceNet实现人脸识别

    1、基本实现

      该demo基于MTCNN和FaceNet实现人脸识别,从功能上可分为两大部分即:人脸检测和人脸识别。人脸检测部分使用MTCNN是一个深度卷积多任务的框架,根据使用MTCNN返回的人脸区域框图作为后半部分FaceNet人脸识别的输入,结合上述这两部分实现实时的人脸识别。

    2、Coding

    在这里插入图片描述

    2.1、新建FaceNet model类,编写相关构造函数,推理函数,析构函数

    import tensorflow.compat.v1 as tf
    from scipy import misc
    import facenet
    import numpy as np
    
    #facenet network class
    class FaceNet_Model():
        def __init__(self, model_file):
            tf.Graph().as_default()
            self.sess = tf.Session()
            with self.sess.as_default():
                facenet.load_model('20180402-114759.pb') 
            self.image_placeholder = tf.get_default_graph().get_tensor_by_name("input:0")
            self.phase_train_placeholder = tf.get_default_graph().get_tensor_by_name("phase_train:0")
            self.embeddings_op = tf.get_default_graph().get_tensor_by_name("embeddings:0")
    
        def get_descriptor(self, image):
            image = misc.imresize(image, (160,160), interp = "bilinear")
            image = facenet.prewhiten(image)
            images = np.stack([image])
            feed_dict = {self.image_placeholder:images, self.phase_train_placeholder:False}
    
            emb = self.sess.run(self.embeddings_op, feed_dict = feed_dict)
            return emb[0,:]
    
        def __del__(self):
            self.sess.close()
    
    def g_FaceNetModel(model_file):
        return FaceNet_Model(model_file)
    
    

    2.2、新建MTCNN_model类,编写相关构造函数,以及功能函数

    from __future__ import absolute_import
    from __future__ import division
    from __future__ import print_function
    
    from scipy import misc
    import tensorflow.compat.v1 as tf
    import numpy as np
    import sys
    import os
    import copy
    import argparse
    import facenet
    import align.detect_face
    
    
    class MTCNN_Model():
        def __init__(self):
            # Setup P-Net R-Net O-Net
            self.minsize = 20                   # minimum size of face
            self.threshold = [ 0.6, 0.7, 0.7 ]  # three steps's threshold
            self.factor = 0.709                 # scale factor
            self.gpu_memory_fraction = 0.7
            self.face_crop_size = 160
            self.face_crop_margin = 32
            self.pnet, self.rnet, self.onet = self.__mtcnn_setup() #mtcnn setup
    
        def __mtcnn_setup(self):
            with tf.Graph().as_default():
                gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=self.gpu_memory_fraction)
                sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options, log_device_placement=False))
                with sess.as_default():
                    return align.detect_face.create_mtcnn(sess, None)        
    
        # func face_detect for face catch and alignment
        def face_detector(self, image):
    
            bounding_boxes, _ = align.detect_face.detect_face(image, self.minsize,
                                                        self.pnet, self.rnet, self.onet,
                                                        self.threshold, self.factor)
            return bounding_boxes
    
        #face alignment
        def face_aligner(self, image, bb):        
            bounding_box = np.zeros(4, dtype=np.int32)
            img_size = np.asarray(image.shape)[0:2]
            bounding_box[0] = np.maximum(bb[0] - self.face_crop_margin / 2, 0)
            bounding_box[1] = np.maximum(bb[1] - self.face_crop_margin / 2, 0)
            bounding_box[2] = np.minimum(bb[2] + self.face_crop_margin / 2, img_size[1])
            bounding_box[3] = np.minimum(bb[3] + self.face_crop_margin / 2, img_size[0])
            cropped = image[bounding_box[1]:bounding_box[3], bounding_box[0]:bounding_box[2], :]
            face_aligned = misc.imresize(cropped, (self.face_crop_size, self.face_crop_size), interp='bilinear')
            return face_aligned
    
        def __del__(self):
            self.sess.close()
    
    def g_mtcnn_model():
        return MTCNN_Model()
    

    2.3、人脸数据注册并保存本地

      人脸特征向量的获取还是借助dlib获取人脸区域图像,将其作为输入至FaceNet中获取人脸的特征向量表示。

    import dlib
    import cv2
    import os
    import facenet_model
    import pickle
    
    font = cv2.FONT_HERSHEY_SIMPLEX
    detector = dlib.get_frontal_face_detector()
    
    face_net = facenet_model.g_FaceNetModel('20180402-114759.pb')
    imagePATH = '/home/colin/works/face_dataset/processed/'
    
    def create_known(path):
        global font
        person_names    = []
        face_features   = []
    
        print("creating known face lib...")
        for root, dirs, files in os.walk(path):
            if len(files) != 0:
                print(files)
            for file in files:
                if '.jpg' in file or '.png' in file:
                    path=os.path.join(root,file)
                    name=os.path.splitext(file)[0]
                    print(file)
                    image = cv2.imread(path)
                    rgb_img = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
                    dets = detector(rgb_img)
    
                    if(len(dets) == 0):
                        continue
    
                    det = dets[0]
                    face_img = rgb_img[det.top():det.bottom(), det.left():det.right()]
                    descriptor = face_net.get_descriptor(face_img)
    
                    person_name = file[:file.rfind('_')]
                    person_names.append(person_name)
    
                    face_features.append(descriptor)
                    print('Appending + '+person_name+'...')
    
        with open('gtk_dataset.pkl', 'wb') as f:
            pickle.dump(person_names, f)
            pickle.dump(face_features, f)
        print('Face Library Created!')
    
    if __name__ == "__main__":
        create_known(imagePATH)
    

    2.4、人脸检测与识别

    import cv2
    import os
    import time
    import numpy as np
    import dlib
    import align.detect_face
    
    import facenet_model
    import mtcnn_model
    import pickle
    
    import image_shop
    ################################ Global variable ######################################
    person_names = []
    face_features = []
    imagePATH = '/home/colin/works/face_recognition_mtcnn_facenet/dataset/processed/Colin/'
    face_net = None
    mtcnn_det = None
    ########################################################################################
    
    # 640 480 320 240
    def gstreamer_pipeline(
        capture_width=320,
        capture_height=240,
        display_width=320,
        display_height=240,
        framerate=15,
        flip_method=0,
    ):
        return (
            "nvarguscamerasrc ! "
            "video/x-raw(memory:NVMM), "
            "width=(int)%d, height=(int)%d, "
            "format=(string)NV12, framerate=(fraction)%d/1 ! "
            "nvvidconv flip-method=%d ! "
            "video/x-raw, width=(int)%d, height=(int)%d, format=(string)BGRx ! "
            "videoconvert ! "
            "video/x-raw, format=(string)BGR ! appsink"
            % (
                capture_width,
                capture_height,
                framerate,
                flip_method,
                display_width,
                display_height,
            )
    )
    
    
    def train_data_load():
        global person_names, face_features
    
        with open('gtk_dataset.pkl','rb') as f:
            person_names=pickle.load(f)
            face_features=pickle.load(f)
    
    
    def facenet_recognition(image):
    
        faces = []
        face_names = []
        rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
        bounding_boxes = mtcnn_det.face_detector(rgb_image)
    
        for bb in bounding_boxes:
            person_name = 'unknown'
            #face aligment
            face_img= mtcnn_det.face_aligner(rgb_image, bb)
           
            #get the face descriptor
            descriptor = face_net.get_descriptor(face_img)
            min_dist = 0.7 #1
            
            for i in range(len(face_features)):
                dist = np.linalg.norm(descriptor-face_features[i])
                print('dist:', dist)
                if dist < min_dist:
                    min_dist = dist
                    person_name = person_names[i]
            
            face_names.append(person_name)
     
        #Fix the rectangle error by colin.tan 2020-11-25
        bounding_boxes = bounding_boxes[:,0:4].astype(int)
    
        for name ,box in zip(face_names,bounding_boxes):
            cv2.rectangle(image, (box[0],box[1]),(box[2],box[3]), (0, 255, 0), 2)
            cv2.putText(image,name, (box[0],box[1]), cv2.FONT_HERSHEY_COMPLEX_SMALL, 0.7, (0, 0, 255), thickness=2)
    
        face_names = None
    
        return image
    
    
    def face_recognition_livevideo(window_name, camera_idx):
        cv2.namedWindow(window_name)
    
        #CSI Camera for get pipeline
        cap = cv2.VideoCapture(gstreamer_pipeline(flip_method=camera_idx), cv2.CAP_GSTREAMER)
        
        while cap.isOpened():
            ok, frame = cap.read() #read 1 frame
            if not ok:
                break
            
            resImage= facenet_recognition(frame)
    
            #display
            cv2.imshow(window_name, resImage)
            c = cv2.waitKey(1)
            if c & 0xFF == ord('q'):
                break
    
        #close
        cap.release()
        cv2.destroyAllWindows()
    
    
    if __name__ == '__main__':
    
        train_data_load()
        mtcnn_det = mtcnn_model.g_mtcnn_model()
        face_net = facenet_model.g_FaceNetModel('20180402-114759.pb')
        face_recognition_livevideo('Find Face', 0)
    

    3、Demo效果

    在这里插入图片描述

    展开全文
  • 使用TensorRT的NVIDIA JetsonNano)的人脸识别 带有架构的人脸识别和David Sandberg( )使用TensorRT和OpenCV重新训练的模型。 该项目基于FaceNet模型的输出层中所需的l2norm helper函数的实现。 链接到: 。 ...
  • 因为要做项目,我打算在Jetson nano(B1)上安装编译openpose(虽然我知道这并不是一个好主意),安装这个东西我走了很多弯路,兜兜转转至少安装了20多次,重装nano镜像至少5次,耗时大概4个星期,最后成功了,为了...
  • Jetson Nano提供472个GFLOP的计算性能,四核64位ARM CPU和128核集成NVIDIA GPU。它还包括4GB LPDDR4内存,在一个高效的低功耗封装中,具有5W/10W电源模式和5V直流输入,如图1所示。 新发布的JetPack 4.2SDK为Je
  • Jetson nano 安装 openpose步骤
  • 关于Jetson Nano Developer Kit Jetson nano搭载四核Cortex-A57 MPCore 处理器,采用128 核 Maxwell™ GPU。支持JetPack SDK. 支持主流的AI框架和算法,例如TensorFlow, PyTorch, Caffe/Caffe2, Keras, MXNet等。 ...
  • 笔记(一)Jetson Nano Developer Kit 介绍

    千次阅读 2020-10-05 17:35:30
    Jetson Nano Developer Kit 介绍 1、简介 Jetson Nano Developer Kit 是一款体积小巧当功能强大的AI开发套件,搭载四核Cortex-A57处理器,128核Maxwell GPU 以及4GB LPDDR内存。支持JetPack SDK,支持主流的AI框架和...
  • Jetson nano搭载四核Cortex-A57 MPCore 处理器,采用128 核 Maxwell™ GPU。支持JetPack SDK. 支持主流的AI框架和算法,例如TensorFlow, PyTorch, Caffe/Caffe2, Keras, MXNet等。 支持人脸识别,物体识别追踪,...
  • 所以今天就把它卸载,原来nano自带opencv4.1.1,这次我的是opencv3.4.10。 1.卸载opencv4.1.1 方法:参考https://www.cnblogs.com/qilai/p/13663484.html sudo apt-get purge libopencv* sudo apt autoremove sudo...
  • Jetson Nano结合MediaPipe实现

    千次阅读 2021-03-08 20:40:14
    Jetson Nano是NVIDIA出品的一款小型AI计算机,与Raspberry PI这种开发板相比,它上面安装了NVIDIA Maxwell GPU,显然更适合于运行计算机视觉方面的AI应用。根据我之前的一篇博客,也可以很轻松地配置好一台具有...
  • Jetson nano 日志

    2019-08-14 11:30:38
    1. Cuda failure: no kernel image is available for execution on the device in file ../plugin_factory.cpp at line 155 Nano is with GPU capacity=53 https://arnon.dk/matchin...
  • 15、启动roslaunch opencv_apps hls_color_filter.launch 进行hls色特征采集 16、启动 roslaunch opencv_apps hsv_color_filter.launch进行hsv色特征采集 2.RIKIBOT Jetson Nano人体姿态检测、目标检测与图像分类 ...
  • 前言: 1. 致谢老黄,详情请参考英文官方网站:...2. 神器推荐,Jetson Nano 开源项目社区,https://developer.nvidia.com/embedded/community/jetson-projects 各路大佬神级开...

空空如也

空空如也

1 2 3 4
收藏数 75
精华内容 30
关键字:

openpose装jetsonnano