Jetson nano取西经式开箱部署

0. 警告

16G不够用!!一个cuda就快塞满了,还要torch torchvision,不懂商家怎么想的。

1. 组装

直接照说明书或者视频组装即可。WiFi天线好像装不装信号差别不大。另外,需要一台Ubuntu电脑,实测用Windows+VMware也行,不过要多给一些硬盘,20G不够,后来给了50G。另外,云服务器Ubuntu+VNC是不行的,浪费了100元。

2. 系统烧录

使用的是带16G eMMC (Embedded Multi Media Card)的版本,默认已经烧录了系统Ubuntu,也就是L4T(Linux for Tegra),是arm64架构的,适用aarch64版本。
本来不想烧录的,但是在eMMC上折腾一圈后发现空间不够用,得在U盘或microSD上装系统,于是买了128G的microSD。不过U盘或microSD启动也还是需要eMMC上的系统进行引导,之前eMMC已经被我折腾得面目全非,于是考虑也先烧录eMMC系统练练手,然后再试试microSD

2.0 安装SDK Manager

WindowsVMware 16,然后下载Ubuntu 18.04 desktop,安装好调好分辨率。再次提醒,别买云服务器装,什么VNC方式折腾半天也不成功!
Ubuntu上打开浏览器,去https://developer.nvidia.com/zh-cn/embedded/jetpack注册下载:

image.png

然后安装:

sudo dpkg -i sdkmanager_1.6.1-8175_amd64.deb

如果报错dpkg frontend is locked by another process,可以:

sudo lsof /var/lib/dpkg/lock-frontend
sudo kill -9 PID # 杀掉上一步看到的进程

如果报错:


image.png

看起来是缺少东西,继续装:

sudo apt install libgconf-2-4

继续报错,不过给出提示解决。

sudo apt --fix-broken install

然后可以启动了,如果还不行,可以再尝试安装sdkmanager_1.6.1-8175_amd64.deb一次。启动直接输入:

sdkmanager # 一开始用云服务器+VNC,折腾半天显示can not open display blabla...

2.1 烧录eMMC系统

之前已经在Windows上分配了50G空间,用VMware安装了Ubuntu。接下来把nano的核心板拆开,用跳线帽连接上recgnd进入恢复模式,然后再装上核心板,接上电源线,稍等片刻开机好了,接上microUSB连接线,这时候Ubuntu虚拟机会显示新设备,选择用Ubuntu来连接即可。对了,有的microUSB连接线可能不靠谱,多试试,多准备几根。
接下来打开sdkmanager,(提前打开也可以),

0578C678B7933F548CAFEFC3F55284B6.png

正常的话会识别出Nano,按照识别的版本即可,然后因为只是烧系统,就取消掉Host Machine,然后选择下JetPack版本,一般4.6就可以,至于4.6.14.6.2应该也行吧。
4AEDB80A936BD7E058BF3D32384C3E20.png

继续之后,取消掉CUDA,暂时不想在eMMC上装这些,准备在后面的microSD卡安装,空间足够大。继续后,会在Ubuntu建个目录,应该是临时安装文件,这里分配的50G就派上用场了,不然各种报错,根本继续不下去。
E7D018023A87B2276E4FA836E91E91D9.png

这里大概是说如果以前已经装了系统,可以类似ssh登录进去进行自动模式,我没成功,于是选择手动模式:
image.png

然后就等烧录吧,十几分钟吧,好了后finish退出。
然后断电,拆开核心板,去掉跳线帽,暂时先别装外壳了,装上核心板,把键鼠显示器先接好了,然后上电开机试试。正常的话,进入Ubuntu配置,一路下一步即可。

2.2 烧录microSD系统

U盘需要在Ubuntu下复制文件,烧录引导程序,没试,还是microSD卡优雅一些吧。先装上读卡器,格式化,注意别选错了:

image.png

请用商家预先配置好的镜像,因为Nvidia官网的镜像都是要做开机配置的,microSD启动无法做开机配置。另外,普遍认为版本最好跟eMMC的版本一致,比如都是4.6.1,本文不一致,有可能是这个原因导致后面出现Failed to start nvpmodel service,后来找商家重新弄搞定,读者可以试试看,这里可能有点玄学。
选好后,刻写镜像,:
image.png

接下来做引导,进入Ubuntu虚拟机,安装,没什么问题:

sudo apt-get install device-tree-compiler

进入2.1步SDK Manager下载的安装目录,视版本略有差异,反编译:

cd ~/nvidia/nvidia_sdk/JetPack_4.6_Linux_JETSON_NANO_TARGETS/Linux_for_Tegra/kernel/dtb
dtc -I dtb -O dts -o tegra210-p3448-0002-p3449-0000-b00.dts tegra210-p3448-0002-p3449-0000-b00.dtb

然后修改文件,随便用什么编辑器:

sudo vim tegra210-p3448-0002-p3449-0000-b00.dts

找到sdhci@700b0400,修改或添加这部分内容:

cd-gpios = <0x5b 0xc2 0x0>;
sd-uhs-sdr104;
sd-uhs-sdr50;
sd-uhs-sdr25;
sd-uhs-sdr12;
            
no-mmc;
uhs-mask = <0xc>;

如图:


9C25D4620DBFB218EAA1DC29B66DB00B.png

5D103E954EC8FC903BF507D1BF55A91A.png

再编译回去:

dtc -I dts -O dtb -o tegra210-p3448-0002-p3449-0000-b00.dtb tegra210-p3448-0002-p3449-0000-b00.dts

nano装上跳帽,进入恢复模式,烧写引导:

cd ~/nvidia/nvidia_sdk/JetPack_4.6_Linux_JETSON_NANO_TARGETS/Linux_for_Tegra
sudo ./flash.sh jetson-nano-emmc mmcblk0p1

然后断电,拔掉跳帽,插入microSD卡,上电开机,这时候还是eMMC系统,

sudo ls /dev/mmcblk*

如果能看到一堆,证明microSD识别没问题。继续修改启动顺序:

sudo vim /boot/extlinux/extlinux.conf
# 找到APPEND ${cbootargs} quiet root=/dev/mmcblk0p1 rw rootwait rootfstype=ext4 console=ttyS0,115200n8 console=tty0
# 将mmclk0p1 改成 mmclk1p1,保存重启

正常的话,就正常了。

2.3 扩容

也可以用U盘或TF卡扩容,使用apt安装GParted磁盘分区工具,待试。

3. 开机测试

3.1 版本

接上显示器和键鼠,开机,以官方版本为例,设置下Ubuntu,用户名密码,连上网。
看下版本:

$ uname -a
Linux myjetsonname 4.9.253-tegra #1 SMP PREEMPT Mon Jul 26 12:13:06 PDT 2021 aarch64 aarch64 aarch64 GNU/Linux

再查看下L4T的版本:

$ cat /etc/nv_tegra_release
# R32 (release), REVISION: 6.1, GCID: 27863751, BOARD: t210ref, EABI: aarch64, DATE: Mon Jul 26 19:20:30 UTC 2021

个人理解:这里的R32版本,适配了jetpack的4.6版本,升级后者需要先升级前者。

3.2 远程连接

还可以用其它电脑ssh登陆nano,连上也能看到版本Welcome to Ubuntu 18.04.6 LTS (GNU/Linux 4.9.253-tegra aarch64)。但还需要设置一下开机自动连WiFi

sudo nmcli dev wifi # 扫描WIFI
sudo nmcli dev wifi connect "wifi_name" password "wifi_password"

会断开重连一下,好了,以后nano不需要显示屏了,开机后直接其它电脑ssh user@192.168.1.x来远程连接nano,具体IP可以通过路由器管理页面查看。有时候换个地方就不行,很奇怪。

3.3. 其它

测试摄像头:

nvgstcapture-1.0 --sensor-id=1 # 摄像头序号从0开始

系统自带温控,不过也测试风扇(可调速风扇):

sudo sh -c 'echo 255 > /sys/devices/pwm-fan/target_pwm' # 转速0~255
cat /sys/class/thermal/thermal_zone0/temp # 获取CPU温度

4. 开发环境配置

4.1 安装SDK

也就是Jetpack SDK,烧录系统只是最基本的部分,其它组件包括CUDA需要进一步安装。可以使用SDK ManagerMicroUSB连到电脑上,虚拟机也能识别,然后在SDK Manager里注册下载包,但看起来挺麻烦的,勾选的SDK pack也不知道需不需要,于是选择apt方式。参考官方:

https://docs.nvidia.com/jetson/jetpack/install-jetpack/index.html

更新apt后安装,

sudo apt update
sudo apt install nvidia-jetpack

会自动分析升级安装,体验不错。


image.png

image.png

image.png

发现好像也在安装cuda相关的包。
需要点时间,耐心等待吧,万幸没啥报错幺蛾子。安装完了,看下包的内容:

sudo apt show nvidia-jetpack

看下版本,4.6,后来刷成4.6.2了,应该是nano支持的最高版本:

Package: nvidia-jetpack
Version: 4.6-b199
...

另外发现cuda确实装了,只不过还是有点问题似的。

$ cat /usr/local/cuda/version.txt
CUDA Version 10.2.300
$ nvcc -V
-bash: nvcc: command not found
$ nvidia-smi
-bash: nvidia-smi: command not found

apt list --installed看下已经安装的apt包,看见一些眼熟的已经有了:

image.png

至于nvcc不行,应该是要安装nvidia-cuda-toolkit,试试看:
image.png

字面理解吧,后来在这里/usr/local/cuda-10.2/bin找到了,那就顺便设置下环境变量:

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

上面也可以vim ~/.bashrc来设置,懂的都懂。再看看版本:

$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2021 NVIDIA Corporation
Built on Sun_Feb_28_22:34:44_PST_2021
Cuda compilation tools, release 10.2, V10.2.300
Build cuda_10.2_r440.TC440_70.29663091_0

倒是跟上面的版本一致。再看看nvidia-smi为啥不行,应该是要安装nvidia-340 nvidia-utils-390,但也报错软件包没有可安装候选。后来搜到说,Tegra平台没有这个命令,而是用jtop,于是先安装pip,因为要sudo安装,所以conda自带的pip是不行的。

sudo apt-get install python3-pip python3-dev
sudo -H pip3 install jetson-stats # 带jtop

必须重启后,试试看,很华丽。


image.png

如果要升级,参考官网,也正如上文提到的,应该是先升级L4T

# To upgrade from JetPack 5.0/5.0.1 Developer Preview, first edit /etc/apt/sources.list.d/nvidia-l4t-apt-source.list to point to the 35.1 repo (just change the version to r35.1 in both lines). Next, use the following commands, then physically reboot the system:

sudo apt update
sudo apt dist-upgrade # 几分钟更新包
sudo apt install --fix-broken -o Dpkg::Options::="--force-overwrite"
# The last line is required because in the JetPack 5.0.2 release, the cuda-nvprof-11-4 package was renamed.

没成功,

image.png

看官网,可能nano不支持吧。

# https://developer.nvidia.com/embedded/jetson-linux
NVIDIA Jetson Linux 35.1
Jetson Linux 35.1 is a production release and replaces Jetson LInux 34.1.1/34.1 which were meant for development only. Jetson Linux 35.1 includes Linux Kernel 5.10, an Ubuntu 20.04 based root file system, a UEFI based bootloader, and OP-TEE as Trusted Execution Environment.

This release supports Jetson AGX Orin 32GB production module and Jetson AGX Orin Developer Kit. It also supports Jetson AGX Xavier series and Jetson Xavier NX series modules, as well as Jetson AGX Xavier Developer Kit and Jetson Xavier NX Developer Kit.

这个网页https://developer.nvidia.com/zh-cn/embedded/jetpack还说4.4就是最新版本,Nvidia官网真是无力吐槽,暂不升级了。

4.2 安装pipconda

安装更新pip

sudo apt update
sudo apt-get install python3-pip python3-dev
python3 -m pip install --upgrade pip
python3 -m pip install --upgrade --force-reinstall pip # 出现问题后使用
sudo reboot

装个conda管理环境吧,选择miniconda,去官网下载了合适的版本,

image.png

一阵操作,最后还是报错:

Unpacking payload ...
Illegal instruction (core dumped)

于是下载这个:


image.png

安装成功了。

4.3 安装CUDA

之前装jetpack,好像顺便装上了cuda,如果没有的话,就打开SDK Manager,登陆,进入step 01

image.png

Host Machine可以不选,右边选下型号,然后最后的DeepStream也可以勾上备用,点继续:
image.png

再继续到step 02
image.png

主要就是Jetson SDK的,下载个几分钟。会在Downloads/nvidia/sdkm_downloads里冒出一堆文件。可以想办法拷贝到jetson上,然后安装,总之相当麻烦。或者microUSB直连安装,由于空间不大,所以就只拷贝cuda相关的deb吧,也麻烦。

4.4 安装torchtorchvision

先参考这里,看版本是否支持:

https://forums.developer.nvidia.com/t/pytorch-for-jetson/72048 # 有下载地址
https://catalog.ngc.nvidia.com/orgs/nvidia/containers/l4t-pytorch
https://docs.nvidia.com/deeplearning/frameworks/install-tf-jetson-platform-release-notes/tf-jetson-rel.html#tf-jetson-rel
# 这个页面看起来4.6.1也能跑1.11+?下面这个页面也可以研究
https://docs.nvidia.com/deeplearning/frameworks/install-pytorch-jetson-platform-release-notes/pytorch-jetson-rel.html#pytorch-jetson-rel
https://docs.nvidia.com/deeplearning/frameworks/install-pytorch-jetson-platform/index.html

PyTorch的,看起来最多1.10.0了:

image.png

还有TensorFlow的:
image.png

先安装依赖包:

sudo apt-get install libjpeg-dev zlib1g-dev libpython3-dev libavcodec-dev libavformat-dev libswscale-dev libopenblas-base libopenmpi-dev

官网选择一个版本,这里一看,因为nanoJetPack最多4.6+,而下面的包都是cp36,岂不是Python只能到3.6.9,有读者成功安装更高版本且能跑torch,欢迎评论。

image.png

下载后传到nano上,

scp torch-1.10.0-cp36-cp36m-linux_aarch64.whl jackal@192.168.2.xxx:~/

然后安装:

sudo pip3 install torch-1.10.0-cp36-cp36m-linux_aarch64.whl

注意,sudo pip会安装到conda外的原生环境里,如果要安装到conda里,最好用sudo python -m pip
测试没问题。

image.png

安装torchvision,参考这个选择版本,比如0.11.1
image.png

git clone --branch v0.11.1 https://github.com/pytorch/vision torchvision
cd torchvision
export BUILD_VERSION=0.11.1
sudo python3 setup.py install # 注意如果在conda环境里,去掉sudo,不然就装在外面

这个编译安装过程有几十分钟,如果报错:

image.png

就降PIL的版本。

sudo pip3 uninstall pillow
sudo pip3 install pillow # 官网建议'pillow<7'

自动降到8.4.0了,试试:

image.png

如果报错:

ModuleNotFoundError: No module named 'numpy'

就安装下numpy

pip install numpy==1.19.4

不要安装1.19.5,否则会报错Illegal instruction (core dumped)
最后总结下支持链,nano最高Jetpack4.6.24.6.2最高torch-1.10.0,而官网的1.10.0只能到Python3.6.9torchvision 0.11.1。当然安装更低的torch-1.9.0-cp36-cp36m-linux_aarch64.whltorchvision 0.10.1也是可以的。读者如果成功安装了更高的版本,欢迎告知,反正我试了几次Python3.7+,装torch的时候报错platform不合适。

4.5 安装VS CODE

本来去官网下载了一个arm64的版本,安装好之后卡得不能用,不知道什么原因。只好退而求其次,下载衍生版本code-oss

sudo apt-get install curl
curl -L https://github.com/toolboc/vscode/releases/download/1.32.3/code-oss_1.32.3-arm64.deb -o code-oss_1.32.3-arm64.deb
sudo dpkg -i code-oss_1.32.3-arm64.deb

运行code-oss即可,使用正常。

5. YOLOv5+TensorRT

5.1 使用tensorrtx

假设读者会用YOLO,注意拖下来安装环境的时候,把requirements.txt里的torchtorchvision注释掉,因为之前安装过了,另外选下版本,报错可能性低,如下:

matplotlib==3.2.2
numpy==1.19.4
# torch>=1.7.0
# torchvision>=0.8.1

因为之前装的是Python3.6.9,而YOLOv5要求3.7.0,所以会警告,不过也能用,FPS为5左右,略卡,得加速。之前安装Jetpack时已经安装了TensorRT

image.png

安装一下pycudaonnx

pip install pycuda==2020.1 # /usr/src/tensorrt/samples/python/yolov3_onnx/requirements.txt要求pycuda<2021.1
pip install onnx==1.11.0 # 1.12.0会报错

接下来参考,其实跟github上的教程类似:

https://wiki.seeedstudio.com/YOLOv5-Object-Detection-Jetson/#inference-on-jetson-device

直接使用大佬封装好的tensorrtx,方便不少:

git clone git@github.com:wang-xinyu/tensorrtx.git
cp tensorrtx/yolov5/gen_wts.py path/to/my/yolov5/project/
cd path/to/my/yolov5/project/
python gen_wts.py -w best.pt # 已经训练好的best.pt,大概几十秒
mv best.wts ../tensorrtx/yolov5/

然后vim ../tensorrtx/yolov5/yololayer.h,修改下种类数,还有宽高。我的pt是用960训练的,但这里没改宽高,倒是也能跑:

image.png

然后编译:

cd ../tensorrtx/yolov5/
mkdir build
cd build
cmake ..
make # 一两分钟的样子
# 转engine文件 sudo ./yolov5 -s [.wts] [.engine] [n/s/m/l/x/n6/s6/m6/l6/x6 or c/c6 gd gw]
sudo ./yolov5 -s ../best.wts ../best.engine n # 我是yolov5n,所以选n

最后一步转.engine大概几分钟,耐心等下,同时还有libmyplugin.so文件,可用于后面的DeepStream。最后就可以跑了:

./yolov5 -d ../best.engine my_images/ # 必须是目录

在当前目录就生成识别好的图片了。当然,有了engine文件,也可以使用yolov5_trt.py来运行,试试看:

5.2 摄像头

上一节最后运行只能是指定图片目录,太局限了。网上有大佬稍作修改,可以指定单张图片、视频以及摄像头。这里参考实现摄像头,先复制一份代码:


image.png

把最后改成:

def detect_camera(camera, yolov5_wrapper):
    while True:
        ret, img = camera.read() # cv2
        img = cv2.resize(img, (640, 480)) # 调整输入帧的尺寸
        img_batch = [img]
        img, use_time = yolov5_wrapper.infer(img_batch) # 简化去掉原始的warmup线程,虽然不懂为什么warmup

        cv2.imshow('Press q to exit...', img)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break


if __name__ == "__main__":
    '''基于cv2的摄像头'''
    camera = cv2.VideoCapture(0) # 设置为正确的序号
    # 以下备用
    # w = int(camera.get(cv2.CAP_PROP_FRAME_WIDTH))
    # h = int(camera.get(cv2.CAP_PROP_FRAME_HEIGHT))
    # fps = camera.get(cv2.CAP_PROP_FPS)
    
    PLUGIN_LIBRARY = "build/libmyplugins.so"
    engine_file_path = "build/yolov5s.engine"
    if len(sys.argv) > 1:
        engine_file_path = sys.argv[1]
    if len(sys.argv) > 2:
        PLUGIN_LIBRARY = sys.argv[2]

    ctypes.CDLL(PLUGIN_LIBRARY)

    categories = ["class_0", "class_1", "class_2", "class_3"] # 自定义

    yolov5_wrapper = YoLov5TRT(engine_file_path)
    print('batch size is', yolov5_wrapper.batch_size)
    detect_camera(camera, yolov5_wrapper)

    # 结束
    yolov5_wrapper.destroy()
    camera.release()
    cv2.destroyAllWindows()

最后还得确认下tensorrtpip库:

image.png

其实直接在安装pycuda的时候已经安装了,如图:
image.png

需要设置下路径,也可以添加到.bashrc里:

export PYTHONPATH=/usr/lib/python3.6/dist-packages:$PYTHONPATH

import tensorrt as trt,成功,运行吧。

> python yolov5_trt_camera.py best.engine

虽然报错Gtk-Message: Failed to load module"canberra-gtk-module",不过跑起来了。至于这个错误,参考:

https://blog.csdn.net/GungnirsPledge/article/details/110200146

试试:

sudo cp /etc/matplotlibrc /etc/matplotlibrc_bak
vim /etc/matplotlibrc
# 改成 QT5Agg
sudo apt install qt5-doc qt5-doc-html qtbase5-doc-html qtbase5-examples -y

还是没解决。。

C++重新编译的方式可参考:

https://blog.csdn.net/hahasl555/article/details/116500763

我没试过。

5.3 DeepStream

还记得之前SDK Manager安装的时候,可以勾选同时安装DeepStream,就装入了nano,这时候派上用场了。

5.3.1 DeepStream-Yolo

git clone https://github.com/marcoslucianops/DeepStream-Yolo

注意下版本:


image.png
cp DeepStream-Yolo/utils/gen_wts_yoloV5.py yolov5 # 这个yolov5目录是yolov5的repo下,不是tensorrtx的
cd yolov5
python3 gen_wts_yoloV5.py -w best.pt # 生成cfg和wts文件,理解是模型的配置和权重,可以看源代码, -s height width修改推理尺寸,会自动加上yolov5_前缀
cp yolov5_best.cfg ~/DeepStream-Yolo
cp yolov5_best.wts ~/DeepStream-Yolo

cd ~/DeepStream-Yolo
CUDA_VER=10.2 make -C nvdsinfer_custom_impl_Yolo # 6.0.1/6.0

编辑:

vim config_infer_primary_yoloV5.txt

[property]
...
custom-network-config=yolov5_best.cfg
model-file=yolov5_best.wts
...
num-detected-classes=80 # 修改种类,然后labels.txt也要改一下
...

编辑deepstream_app_config.txt,与上面文件名一致:

vim deepstream_app_config.txt

...
[primary-gie]
...
config-file=config_infer_primary_yoloV5.txt

默认是用SDK的例子视频跑,参考官方https://aijishu.com/a/1060000000223353,需要改一下来源:

[source0]
enable=1
# type = {1: "CameraV4L2", 2: "URI", 3: "MultiURI", 4: "RTSP", 5: "CSI"}
# CameraV4L2是USB摄像头,耗CPU;CSI摄像头用GPU,专用
type=1
camera-width=960
camera-height=540
camera-fps-n=30
camera-fps-d=1
# v4l2-ctl --list-devices检查一下node
camera-v4l2-dev-node=0

其中node号可以查,注意是L不是412,代表video for linux two

sudo apt install v4l-utils # 没有2
v4l2-ctl --list-devices
v4l2-ctl --list-formats-ext --device=0 # 看分辨率

最后,跑起来:

deepstream-app -c deepstream_app_config.txt

5.3.2 Yolov5-in-Deepstream

这种方式可以跟TensorRT结合。

git clone git@github.com:DanaHan/Yolov5-in-Deepstream-5.0.git

修改种类:


image.png
cd Deepstream\ 5.0/nvdsinfer_custom_impl_Yolo
make # 得到libnvdsinfer_custom_impl_Yolo.so,注意路径后面使用

回到上级目录,把.enginelibmyplugin.so文件拷过来,然后编辑deepstream_app_config_yoloV5.txt,可以调整显示宽高,再把source改成摄像头,也设置下输入的宽高(不要超过摄像头的固有宽高),跟上一小节有点类似:

[tiled-display]
enable=1
rows=1
columns=1
width=960
height=540
...
[source0]
enable=1
#Type - 1=CameraV4L2 2=URI 3=MultiURI,咋没有CSI?
type=1
camera-width=960
camera-height=540
camera-fps-n=30
camera-fps-d=1
...
[primary-gie]
enable=1
gpu-id=0
model-engine-file=yolov5s.engine # 自定义
labelfile-path=labels.txt # 自定义,补一个文件
...
[streammux]
gpu-id=0
...
width=960 # 自定义
height=540 # 自定义

[tracker]
...
ll-lib-file=/opt/nvidia/deepstream/deepstream-5.1/lib/libnvds_mot_klt.so # 自定义,改成5.1

然后编辑config_infer_primary_yoloV5.txt,这几处按需修改、确认好:

image.png

然后运行:

LD_PRELOAD=./libcustomOp.so deepstream-app -c deepstream_app_config_yoloV5.txt

即可。

5.4 总结对比

有几种方式:

  • 无加速检测,FPS为5
  • TensorRT加速,FPS未见到提高,待查
  • DeepStream-Yolo加速
  • TensorRT + Yolov5-in-Deepstream加速
    官方是推荐用DeepStream的,因为DeepStream是全管道优化,而TensorRT会使用OpenCV作为摄像机接口,没有针对性优化,会使用CPU作为缓存。

6. 播放声音

nano没有声卡,怎么发声?

  • 内置声卡,可惜没有适配的外壳,但可能是最好的方式;
  • USB声卡+特定接口的扬声器,一堆外接线不够优雅;
  • HDMI的带耳机孔的显示屏,记得选一下音频输出,可惜有启动延迟,音头都没了,调试了好几天搞不定。
    播放可以使用playsound库:
pip install playsound
# 可能会报错什么cairo,那就需要装下面的
sudo apt install libcairo2 libcairo2-dev libgirepository1.0-dev
pip install pygobject

这个也不错,官方论坛推荐:

import simpleaudio as sa

wave_obj = sa.WaveObject.from_wave_file('sound.wav')
play_obj = wave_obj.play()
play_obj.wait_done()

搞定!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容