赞
踩
一、SD卡准备
英伟达官方为Jetson Nano提供了SD卡版本的系统镜像,并且一直在更新和维护,该镜像中包含对应的Ubuntu系统以及配置好的cuda环境和opencv环境,因此只需要下载和安装该镜像即可完成Jetson Nano的大部分环境配置。可以直接到官网进行镜像下载,下载地址为:https://developer.nvidia.com/embedded/downloads,双击Image下载最新的镜像即可,
一般情况下,如果SD卡是新的,可以直接烧写,但是有时候会需要对旧的SD卡重新烧写,这时候就需要预先对SD卡做一下格式化,避免在镜像过程中出错。如果之前是已经烧写过Jetson Nano镜像的SD卡,那么就需要先对SD卡进行分区删除和重新合并,这是因为经过Jetson Nano烧写过的SD卡会形成12个子分区,因此需要先用磁盘管理器对这些分区进行删除和合并,再进行新的镜像烧写(如果是新的SD卡则不需要这些操作),如下图所示:
如上图所示,旧的Jetson Nano镜像卡会形成12个子分区,对照上图中的磁盘2的12个分区,依次进行“删除卷”处理,然后为磁盘2重新“新建简单卷”,
如果是新的SD卡,则只需要格式化以下即可。接下来开始正式进行烧录。烧录工具很多,本文推荐使用Win32DiskImager,该工具可以直接在网上进行下载和安装。双击打开Win32DiskImager,选择刚才的img镜像,并配置好对应的SD卡盘符,如下图所所示:
单击“写入”即可完成镜像烧录,整个烧录时间大概在15分钟左右
二、增加交换空间
这一步是必须的,显存个内存是共享受的,物理内存只有4G,所以个人感觉加上好一些。Swap交换空间是在硬盘上,当物理内存RAM用完时,会开始使用。交换空间可以采用专用交换分区或交换文件的形式。在大多数情况下,不存在交换分区,因此唯一的选择是创建交换文件。创建教程参考1和参考2该链接,将添加swap file到ubuntu 18.04系统上。
1、检查当前系统的效换空间
sudo swapon --show
检查内存
free -h
内存有4G,交换空间2G.
2、增加2G交换空间
(1)创那用于swap的文件
sudo fallocate -l 2G /swapfile
如果fallocate没有安装,将得到fallocate failed:Operation not supported的报错信息。可以用以下命令创建:
sudo dd if=/dev/zero of=/swapfile bs=2048 count=1048576
(2)所有用户都可以读写swap file,设置正确的权限:
sudo chmod 666 /swapfile
(3)设置交换空间
sudo mkswap /swapfile
(4)激活交换空间
sudo swapon /swapfile
#为了使这个激活永久有效
sudo vi /etc/fstab
#粘贴 /swapfile swap swap defaults 0 0 效果如下图
(5)验证增加空间是否有效
sudo swapon --show
sudo free -h
通过VNC Viewer远程桌面
说到远程桌面,可能大家会比较熟悉VNC Viewer这个软件。这里我们介绍如何配合Jetson Nano的 Desktop功能来远程访问。
首先,下载并安装VNC Viewer软件到你的电脑上。(这里是下载链接)
需要先用HDMI屏幕和键盘等链接到Jetson Nano
打开终端界面,输入以下指令编辑vim/usr/share/glib-2.0/schemas/org.gnome.Vino.gschema.xml 文件
1 sudo vi /usr/share/glib-2.0/schemas/org.gnome.Vino.gschema.xml
将以下的代码添加到XML文件中。注意不要插到别的key中去。
1
2 Enable remote access to the desktop
3
4 If true, allows remote access to the desktop via the RFB
5 protocol. Users on remote machines may then connect to the
6 desktop using a VNC viewer.
7
8 true
9
添加好之后,保存文件并退出。
使用glib-compile-schemas指令将chemas编译一下
1 sudo glib-compile-schemas /usr/share/glib-2.0/schemas
编译完成之后,点开屏幕右上角的齿轮图标,选择System Settings, 然后点击Desktop Sharing, 安装下面的截图设置参数。注意密码最多支持8位
设置好了之后,关掉窗口,点开左上角的搜索图标(第一个图标),搜索startup applications, 并点开
打开之后,点击ADD, 然后新建一个程序。 Name 设置为Vino, Command设置为/usr/lib/vino/vino-server . Comment设置为VNC Server。设置好之后保存即可。
终端输入以下指令来关闭VNC连接加密
1 gsettings set org.gnome.Vino require-encryption false
2 gsettings set org.gnome.Vino prompt-enabled false
设置好之后,重启Jetson Nano
1 sudo reboot
重启之后,现在就可以用VNC Viewer软件来远程访问Jetson Nano桌面了。
输入Jetson Nano的IP地址,打开,点击continute
然后输入密码登录,注意,这个密码是我们前面在设置Desktop Sharing的时候你设置的密码,并不是Jetson nano的登录密码
备注:VNC教程,原教程链接:https://www.hackster.io/news/getting-started-with-the-nvidia-jetson-nano-developer-kit-43aa7c298797
设置远程连接
安装Xrdp
Windows远程桌面使用的是RDP协议,所以ubuntu上就要先安装Xrdp,在ubuntu软件中心搜索xrdp安装。
安装xrdp的同时会自动安装vnc4server,xbase-clients组件
或者终端命令行输入安装: sudo apt-get install xrdp vnc4server xbase-clients
2、设置打开桌面共享
安装完后在/usr/share/applications目录下打开”桌面共享”选项,进一步设定
桌面共享选项中首先要开启共享,关于是否允许其他用户控制,远程连接时是否需要本机确认,远程连接的密码等项目根据需要自己设定。其实右键选择open即可。
3, 其次,打开终端,我们需要安装vncserver的基础服务,输入以下命令:
sudo apt-get install xrdp vnc4server xbase-clients
4、安装dconf-editor
sudo apt-get install dconf-editor
安装完成之后,我们需要打开dconf-editor工具,在桌面搜索dconf-editor打开,如图所示:
打开之后,依次展开org->gnome->desktop->remote-access,然后取消 “requlre-encryption”的勾选即可。
4.远程桌面访问
安装摄像头
安装GStreamer
sudo add-apt-repository universe
sudo add-apt-repository multiverse
sudo apt-get update
sudo apt-get install gstreamer1.0-tools gstreamer1.0-alsa gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav
sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-good1.0-dev libgstreamer-plugins-bad1.0-dev
测试
配置GStreamer管道
首先说一下思路:由于yolov3本身不支持csi摄像头,因此需要通过GStreamer来对csi摄像头获取的视频进行预处理,然后提交给yolov3进行识别判定,而这一过程重点就是GStreamer管道的配置
// 仅适用于jetson-nano运行yolov3-tiny demo。注意请在darknet的文档页下打开terminal输入
./darknet detector demo cfg/coco.data cfg/yolov3-tiny.cfg yolov3-tiny.weights “nvarguscamerasrc ! video/x-raw(memory:NVMM), width=1280, height=720, format=NV12, framerate=20/1 ! nvvidconv flip-method=0 ! video/x-raw, width=1280, height=720, format=BGRx ! videoconvert ! video/x-raw, format=BGR ! appsink”
三、更新系统并移除无用软件
移除LibreOffice会为系统省很多空间
sudo apt-get purge libreoffice*
sudo apt-get clean
更新系统
sudo apt-get update
sudo apt-get full-upgrade
四、安装系统所需的包
0、如果要改源的话
sudo gedit /etc/apt/sources.list
把文件中所有的内容替换为下面:
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-updates main restricted
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic universe
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-updates universe
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic multiverse
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-updates multiverse
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-backports main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-security main restricted
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-security universe
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ bionic-security multiverse
使apt源生效:
sudo apt-get update
sudo apt-get upgrade
1、配置系统级的安装包
sudo apt-get install git cmake
sudo apt-get install libatlas-base-dev gfortran
sudo apt-get install libhdf5-serial-dev hdf5-tools
sudo apt-get install python3-dev
sudo apt-get install nano locate
联网成功,网速顺利的话,将花费几分钟(可以改安装源,请自行百度)。
sudo apt-get install build-essential cmake pkg-config
sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev protobuf-compiler
sudo apt-get install libhdf5-serial-dev hdf5-tools zlib1g-dev libjpeg9-dev libhdf5-dev
sudo apt-get install libgflags-dev libgoogle-glog-dev
sudo add-apt-repository universe
sudo add-apt-repository main
sudo apt-get update
sudo apt-get install gfortran libopenblas-dev liblapack-dev libatlas-base-dev
2、安装scipy的依赖和系统级别的cython:
sudo apt-get install libfreetype6-dev python3-setuptools
sudo apt-get install protobuf-compiler libprotobuf-dev openssl
sudo apt-get install libssl-dev libcurl4-openssl-dev
sudo apt-get install cython3
3、如果要装TensorFlow Object Detection (TFOD) API ,还要装xml的工具:
sudo apt-get install libxml2-dev libxslt1-dev
4、更新cmake,能帮助正确从源码来编译安装opencv(尽管nano装完后自带opencv):
sudo wget https://github.com/Kitware/CMake/releases/download/v3.18.0-rc2/cmake-3.18.0-rc2.tar.gz #下载,版本号可到官网上查
sudo tar xpvf cmake-3.18.0-rc2.tar.gz cmake-3.18.0-rc2/ #解压
sudo cd cmake-3.18.0-rc2/
sudo ./bootstrap --system-curl
sudo make -j4 #编译
echo ‘export PATH=~/cmacdke-3.18.0-rc2/bin/:$PATH’ >> ~/.bashrc
source ~/.bashrc #更新.bashrc
5、安装python3.6的pip,系统默认是没有pip的,安装好了,可以使用pip3安装各种包、
sudo apt-get install python3-pip
对pip进行一下升级,否则后面在安装其它Python库的时候会出问题。升级命令如下:
python3 -m pip install --upgrade pip
pip3有个小bug需要手动修复一下。
首先使用下面的命令打开pip3文件:
sudo vim /usr/bin/pip3
键盘输入字符a进入插入模式,然后可以开始编辑文件,将:
from pip import main
if name == ‘main’:
sys.exit(main())
修改为:
from pip import main
if name == ‘main’:
sys.exit(main._main())
然后按Esc键进入到命令模式。最后按英文的":"键进入末行模式,敲入wq按回车即可保存修改并退出编辑器。
修改结束后保存。运行pip3 -V成功后显示
yahboom@yahboom-desktop: ~$ pip3 -V
6、系统工具jtop和nvidia-smi的结合
Jetson Nano中有个工具jtop, 可以同时查看CPU和GPU资源以及温度,另外就是可以把你当前的library show出来
sudo -H python3 -m pip install jetson-stats
sudo jtop
选1ALL的内容
2GPU的内容
3CTRL的内容
4INFO的内容
按q退出
五、安装开发软件
1、安装Code OSS
Visual Studio Code(VS Code)是一个免费的集成开发环境(IDE),适用于Windows,Mac和Linux。VS Code近年来获得了越来越多的关注,成为广大编程开发者的首选编译环境。它作为微软推出的开源项目,吸引了无数第三方开发者和终端用户,成为顶尖开源项目之一。它功能强大、速度快,更在拥有海量插件的情况下做到了简洁流畅的用户体验,属于一款非常优秀的IDE。
原生的VS Code并不适用于Jetson Nano,当前,还没有针对Jetson Nano这样的ARM设备的VS Code正式版本。但是,由于它是开源的,所以任何人都可以编译一个版本。其中,Code-OSS就是这样一款嵌入式环境下的“VS Code”。Code-OSS基于VS Code,它并不仅仅是一个代码编辑器,它具有用于管理整个项目文件夹而不是单个脚本的内置资源管理器功能以及丰富的第三方插件。实际上Code-OSS几乎具备了VS Code的所有完整功能,因此用它作为代码编辑器来编辑代码,例如python,会使得整个开发过程更加便捷。下面讲解具体的安装方法。
wget --content-disposition https://packagecloud.io/headmelted/codebuilds/packages/debian/stretch/code-oss_1.42.0-1575969886_arm64.deb/download.deb
将该命令复制到终端中实现安装包下载。如下图所示:
此时,安装包已经下载到home根目录下,可以通过文件资源管理器查看下载的deb安装包,如下所示:
在终端中输入下述命令完成最终的安装:
sudo dpkg -i code-oss_1.42.0-1575969886_arm64.deb
安装完成后从可以在搜索中搜索Code OSS,会弹出Code OSS应用程序,这个即为我们需要的Python编程IDE。单击应用程序打开如下图所示:
下面简单演示下如何使用Code OSS执行Python脚本。
首先在Code OSS中安装Python插件,其插件安装方法和普通的VS Code完全相同,不熟悉VS Code的读者可以先在桌面PC上熟悉VS Code基本用法再切换到Jetson Nano环境中来。插件安装如下图所示,在Extensions面板中搜索python,选择第一个弹出的插件进行安装即可:
接下来在home目录下新建一个code文件夹,该文件夹用于存放Python代码脚本。然后在Code OSS中打开刚才创建的code文件夹,然后新建一个文件,按ctrl+s键保存文件,将文件命名为main.py,然后输入下面的代码:
a = 36
b = 64
print(a+b)
然后按ctrl+F5键即可运行脚本,效果如下:
至此,已完成Python编辑器的安装和运行。
2、安装Qt5
在实际的产品部署阶段,考虑到终端设备速度、稳定性、内存占用等因素,一般会采用C++来开发最终的成品,而只有在产品模型设计阶段才会使用python进行算法开发。因此,需要一款能够在Jetson Nano中开发C++的编译器方便我们开发落地产品。VS Code本身可以开发C++应用,但是Code-OSS对于C++的支持并不好,因此,需要另外安装一个优秀的C++编译器来完成C++开发任务。本文推荐使用Qt。
Qt是一个跨平台的 C++ 开发库,主要用来开发图形用户界面(Graphical User Interface,GUI)程序,当然也可以开发不带界面的命令行(Command User Interface,CUI)程序。Qt 是纯 C++ 开发的,所以用它来开发C++应用具有天然的优势。Qt 支持的操作系统有很多,例如通用操作系统 Windows、Linux、Unix,智能手机系统 Android、iOS、WinPhone以及嵌入式系统 QNX、VxWorks 等等。当然,QT也完全支持Jetson Nano的Ubuntu环境。
Jetson Nano下安装QT比较简单,只需要输入命令:
sudo apt-get install qt5-default qtcreator -y
此时安装的是Qt5.9.5版本。
安装完成后,同样在搜索菜单中搜索Qt,然后会出现Qt Creator,这个即为Qt的IDE,打开它。接下来简单演示如何创建一个简单的C++控制台程序。
打开Qt Creator,如下图所示:
单击New Project创建一个新项目,这里选择Application 下的Qt COnsole Appliation应用,即创建一个Qt版的C++控制台程序:
然后工程命名为QTtest:
然后一直默认单击下一步即可完成项目的创建。可以看到,Qt已经为我们创建了一个C++文件main.cpp用于编写C++代码,并且还有一个QTtest.pro配置文件用于为整个项目进行配置,效果如下图所示:
此时可以直接按ctrl+r键运行项目,但是由于我们并没有任何输出代码,所以弹出的终端也没有输出任何值。我们修改一下main.cpp的代码,同样来执行两个整数的相加并输出其结果,完成代码如下:
#include
#include
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
int c=64;
int d=36;
qDebug() << (c+d);
return a.exec();
}
此时,再重新按ctrl+r键运行项目输出下图所示结果:
Qt Creator的详细使用请读者自行学习相关教程,这部分资源很多也很成熟,对于开发实际的嵌入式产品来说掌握Qt和C++的使用是一个必要的过程。本文不再对Qt尤其是Qt的界面编程作深入介绍。
最后我们再看一下在主目录下生成了一个与QTtest对照的debug可执行项目build-QTtest-unknown-Debug,在这个文件夹中生成来debug版本的QTtest可执行程序。通过终端cd命令进入到该文件夹,然后输入
./QTtest
会直接执行程序,如下图所示:
也就是说本质上我们已经成功的部署开发了一个应用,该应用功能很简单,仅仅实现了两个固定整数的相加。尽管简单,但是却梳理了我们正常开发人工智能产品的一种比较常见的形式,即先在VS Code中用python脚本进行算法验证,最后再用QT编写对应的C++应用,最后生成二进制可执行程序,这个最终生成的二进制可执行程序就是我们的“产品”,这个可执行程序代码是封装起来的、不可见的、可以直接运行的。
六、安装Python常用机器学习包
sudo apt-get install python3-numpy
sudo apt-get install python3-scipy
sudo apt-get install python3-pandas
sudo apt-get install python3-sklearn
pip3 install --pre --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v42 tensorflow-gpu
错误修改.bashrc文件导致所有命令无法使用解决方法
export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
检查已经安装的系统组件
Jetson-nano的OS镜像已经自带了JetPack,cuda,cudnn,opencv等都已经安装好,并有例子,这些例子安装路径如下所示
TensorRT /usr/src/tensorrt/samples/
CUDA /usr/local/cuda-/samples/
cuDNN /usr/src/cudnn_samples_v8/
Multimedia API /usr/src/tegra_multimedia_api/
VisionWorks /usr/share/visionworks/sources/samples/ /usr/share/visionworks-tracking/sources/samples/ /usr/share/visionworks-sfm/sources/samples/
OpenCV /usr/share/OpenCV/samples/
(1) 检查CUDA
Jetson-nano中已经安装了CUDA10.2版本,但是此时你如果运行 nvcc -V是不会成功的,需要你把CUDA的路径写入环境变量中。OS中自带Vim工具 ,所以运行下面的命令编辑环境变量
sudo vim ~/.bashrc
在最后添加下面三行:(英文输入法下按下i,进入插入模式,上下键让光标移动到最下面一行,然后复制以下三行,在光标处按下鼠标右键就会自动复制进去,然后按住esc,输入冒号放开esc,在输入wq!强制保存退出)
export CUDA_HOME=/usr/local/cuda-10.2
export LD_LIBRARY_PATH=/usr/local/cuda-10.2/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
−
10.2
/
b
i
n
:
LD_LIBRARY_PATH export PATH=/usr/local/cuda-10.2/bin:
LDLIBRARYPATHexportPATH=/usr/local/cuda−10.2/bin:PATH
然后保存退出
然后需要source下生效下。
source ~/.bashrc
source后,此时再执行nvcc -V执行结果如下
beckhans@Jetson:~$ nvcc -V
(2)检查OpenCV
Jetson-nano中已经安装了OpenCV3.3版本,可以使用命令检查OpenCV是否安装就绪
pkg-config opencv4 --modversion
如果OpenCv安装就绪,会显示版本号,我的版本是4.1.1
(3)检查cuDNN
Jetson-nano中已经安装好了cuDNN,并有例子可供运行,我们运行一下例子,也正好验证上面的CUDA
cd /usr/src/cudnn_samples_v8/mnistCUDNN #进入例子目录
sudo make #编译一下例子
./mnistCUDNN # 执行
如果以上无法运行可以添加权限如下方法:
sudo chmod a+x mnistCUDNN # 为可执行文件添加执行权限
如果成功,如下所示
beckhans@Jetson:/usr/src/cudnn_samples_v8/mnistCUDNN$ ./mnistCUDNN
YoloV4
sudo git clone https://github.com/AlexeyAB/darknet.git
cd darknet
sudo vim Makefile
修改Makefile文件
GPU=1
CUDNN=1
OPENCV=1
将NVCC=nvcc修改为:NVCC=/usr/local/cuda-xx.x/bin/nvcc 注意全文的cuda版本路径都应该正确
./darknet detect cfg/yolov4.cfg yolov4-tiny.weights data/dog.jpg
./darknet detector demo cfg/coco.data cfg/yolov4-tiny.cfg yolov4-tiny.weights “nvarguscamerasrc ! video/x-raw(memory:NVMM), width=1280, height=720, format=NV12, framerate=20/1 ! nvvidconv flip-method=0 ! video/x-raw, width=1280, height=720, format=BGRx ! videoconvert ! video/x-raw, format=BGR ! appsink”
镜头反转
./darknet detector demo cfg/coco.data cfg/yolov4-tiny.cfg yolov4-tiny.weights “nvarguscamerasrc ! video/x-raw(memory:NVMM), width=1280, height=720, format=NV12, framerate=20/1 ! nvvidconv flip-method=2 ! video/x-raw, width=1280, height=720, format=BGRx ! videoconvert ! video/x-raw, format=BGR ! appsink”
分析视频
./darknet detector demo cfg/coco.data cfg/yolov4-tiny.cfg yolov4.weights /1.mp4
./darknet detector demo cfg/coco.data cfg/yolov4-tiny.cfg yolov3-tiny_30000.weights /test2.mp4
YoLoV3环境搭建和摄像头实时检测
官方参考链接:https://pjreddie.com/darknet/yolo/
YOLOv3也是一个物品检测的小程序,而且搭建起来比较简单。这里要申明,本文用的是YOLOv3的tiny版,正式版和tiny版安装的方法都是一样的,只是运行时的配置文件和权重文件不一样。我曾经试图跑正式版,但是跑不起来,基本上到第二次卷积就挂掉了,毕竟nano只有4G内存。
闲话少说,开始安装。
下载
Sudo git clone https://github.com/pjreddie/darknet.git
cd darknet
sudo vim Makefile #修改Makefile
4. 将Makefile的前三行修改一下
GPU=1
CUDNN=1
OPENCV=1
注意:原来代码中的OPENCV都要改成OPENCV4
NVCC = /usr/local/cuda-10.2/bin/nvcc
并将makefile中带有cuda的路径都改为自己的cuda版本
5. 编译
make -j4
6. 下载权重文件,这里直接下载tiny版的权重文件
wget https://pjreddie.com/media/files/yolov3-tiny.weights
7. 测试
./darknet detect cfg/yolov3-tiny.cfg yolov3-tiny.weights data/dog.jpg
layer filters size input output
0 conv 16 3 x 3 / 1 416 x 416 x 3 -> 416 x 416 x 16 0.150 BFLOPs
1 max 2 x 2 / 2 416 x 416 x 16 -> 208 x 208 x 16
2 conv 32 3 x 3 / 1 208 x 208 x 16 -> 208 x 208 x 32 0.399 BFLOPs
3 max 2 x 2 / 2 208 x 208 x 32 -> 104 x 104 x 32
4 conv 64 3 x 3 / 1 104 x 104 x 32 -> 104 x 104 x 64 0.399 BFLOPs
5 max 2 x 2 / 2 104 x 104 x 64 -> 52 x 52 x 64
6 conv 128 3 x 3 / 1 52 x 52 x 64 -> 52 x 52 x 128 0.399 BFLOPs
7 max 2 x 2 / 2 52 x 52 x 128 -> 26 x 26 x 128
8 conv 256 3 x 3 / 1 26 x 26 x 128 -> 26 x 26 x 256 0.399 BFLOPs
9 max 2 x 2 / 2 26 x 26 x 256 -> 13 x 13 x 256
10 conv 512 3 x 3 / 1 13 x 13 x 256 -> 13 x 13 x 512 0.399 BFLOPs
11 max 2 x 2 / 1 13 x 13 x 512 -> 13 x 13 x 512
12 conv 1024 3 x 3 / 1 13 x 13 x 512 -> 13 x 13 x1024 1.595 BFLOPs
13 conv 256 1 x 1 / 1 13 x 13 x1024 -> 13 x 13 x 256 0.089 BFLOPs
14 conv 512 3 x 3 / 1 13 x 13 x 256 -> 13 x 13 x 512 0.399 BFLOPs
15 conv 255 1 x 1 / 1 13 x 13 x 512 -> 13 x 13 x 255 0.044 BFLOPs
16 yolo
17 route 13
18 conv 128 1 x 1 / 1 13 x 13 x 256 -> 13 x 13 x 128 0.011 BFLOPs
19 upsample 2x 13 x 13 x 128 -> 26 x 26 x 128
20 route 19 8
21 conv 256 3 x 3 / 1 26 x 26 x 384 -> 26 x 26 x 256 1.196 BFLOPs
22 conv 255 1 x 1 / 1 26 x 26 x 256 -> 26 x 26 x 255 0.088 BFLOPs
23 yolo
Loading weights from yolov3-tiny.weights…Done!
data/dog.jpg: Predicted in 0.239507 seconds.
dog: 56%
car: 52%
truck: 56%
car: 62%
bicycle: 58%
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg # 简写版
./darknet detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights data/dog.jpg # 完整版
例如,要显示所有检测,您可以将阈值设置为0:
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg -thresh 0
摄像头实时检测方法:
./darknet detector demo cfg/coco.data cfg/yolov3-tiny.cfg yolov3-tiny.weights
CSI摄像头:
./darknet detector demo cfg/coco.data cfg/yolov3-tiny.cfg yolov3-tiny_20000.weights “nvarguscamerasrc ! video/x-raw(memory:NVMM), width=1280, height=720, format=NV12, framerate=20/1 ! nvvidconv flip-method=0 ! video/x-raw, width=1280, height=720, format=BGRx ! videoconvert ! video/x-raw, format=BGR ! appsink”
镜头反转
./darknet detector demo cfg/coco.data cfg/yolov3-tiny.cfg yolov3-tiny_30000.weights “nvarguscamerasrc ! video/x-raw(memory:NVMM), width=1280, height=720, format=NV12, framerate=20/1 ! nvvidconv flip-method=2 ! video/x-raw, width=1280, height=720, format=BGRx ! videoconvert ! video/x-raw, format=BGR ! appsink”
分析视频
./darknet detector demo cfg/coco.data cfg/yolov3-tiny.cfg yolov3-tiny.weights /1.mp4
注意:(电源必须是DC电源5V4A)否则会出现nano直接关机。
8. 资源不够时应对方案
Nano的内存还是太小了,有时候需要swap扩一下内存.nano重启后,swap空间自动回收。
sudo swapoff /swapfile
sudo dd if=/dev/zero of=/swapfile bs=1M count=4096
sudo mkswap /swapfile
sudo swapon /swapfile
扩展课程:
如果觉得效果不理想可以使用以下github地址版本,可以跑到15/17帧这样。方法跟前面一样。
重新建立目录执行以下命令
git clone https://github.com/AlexeyAB/darknet
效果如下图:
重命名文件夹
在Linux下重命名文件或目录,可以使用mv命令或rename命令,这里分享下二者的使用方法。
mv命令既可以重命名,又可以移动文件或文件夹。
例子:将目录A重命名为B
mv A B
例子:将/a目录移动到/b下,并重命名为c
mv /a /b/c
删除文件夹及所有文件
rm -rf 目录名字
修改文件夹权限
chmod -R 777 文件夹
参数-R是递归的意思
777表示开放所有权限
安装Z-moderm支持
Sudo apt-get install yum
sudo apt-get install lrzsz
现在就可以正常使用rz、sz命令上传、下载数据了。
使用方法:
上传文件
下载文件
Linux文件文件夹的压缩和解压
例如:zip -r mysql.zip mysql 该句命令的含义是:将mysql文件夹压缩成mysql.z
unzip FileName.zip
ubuntu下查看USB摄像头参数以及摄像头测试
sudo apt install v4l-utils
v4l2-ctl -d /dev/video0 --all
ls /dev/video*
guvcview -d /dev/video0
Cheese
重新编译darknet
完之后重新sudo make clean
Sudo make all 不出错的话就可以了
如果修改了draw_detections函数,则记得修改include中darknet.h文件
训练自己的数据集
1、到darkent根目录,依次建立如下几个文件夹
$ cd scripts
$ mkdir -p VOCdevkit && cd VOCdevkit
$ mkdir -p VOC2019 && cd VOC2019
$ mkdir -p Annotations && mkdir -p ImageSets && mkdir -p JPEGImages && mkdir -p labels
建立完之后的目录为:
├── VOCdevkit
│ └── VOC2019
│ ├──── Annotations
│ ├──-── ImageSets
│ ├──-──JPEGImages
│ └─────labels
将采集到的图像全部放入JPEGImages文件夹下.
2、打乱顺序并重命名。(运行rename_testsets.py程序)
3、数据标注
该步骤用于对每张图片生成描述文件,我们需要认为指定图片里哪一块区域是我们要检测的物体.每张图片都要以一个xml文件进行描述.数据标注的工具很多,在这里我们选择labelImg.首先安装,在这里该插件对python版本有要求,python2和python3的安装方式不同,选择任意一种即可,区别在于最后执行过程.
若为python3,安装过程如下:
$ sudo apt-get install pyqt5-dev-tools
$ sudo pip3 install lxml
$ cd darknet && mkdir -p software && cd software
$ git clone https://github.com/tzutalin/labelImg.git
$ cd labelImg
$ make all
若为python2,安装过程如下:
$ sudo apt-get install pyqt4-dev-tools
$ sudo pip install lxml
$ cd darknet && mkdir -p software && cd software
$ git clone https://github.com/tzutalin/labelImg.git
$ cd labelImg
$ make all
至此,安装已完成,下面可以运行如下命令打开该软件进行标注了:
若为python3安装,则打开软件的方式为:
$ python3 labelImg.py #打开labelImg
若为python2安装,则打开软件的方式为:
$ python labelImg.py #打开labelImg
软件界面如下:
然后点击左侧的"Open Dir"按键,选择我们存放数据图片的文件夹JPEGImages,如下:
然后点击"Open",之后会出现第一张图片,对于一张图片的标注,一般分如下几个步骤:
1)点击左侧的"Create \n RectBox"按键,然后找准我们要识别的物体,从左上角到右下角拖一个矩形,
2) 在弹出的窗口种创建标签,如下图所示,我们需要选择"watermenlon",如果不出现,要手动敲一个,添加进去,并选择,如果图片中有多个待识别的物体,则再此拉矩形框,并选择类别.
h = 0
a = ‘’
b = ‘’
dele = []
pathh = “/home/jetbot/darknet-master/scripts/VOCdevkit/VOC2019/JPEGImages”
#dele.remove(1)
for filenames in os.walk(pathh):
filenames = list(filenames)
filenames = filenames[2]
for filename in filenames:
print(filename) if h==0: a = filename h = 1 elif h==1: #print(filename) b = filename if a[0:a.rfind('.', 1)]==b[0:b.rfind('.', 1)]: h = 0 #print(filename) else: h = 1 dele.append(a) a = b else: print("wa1")
print(dele)
for file in dele:
os.remove(pathh+file)
print(“remove”+file+" is OK!")
#再循环一次看看有没有遗漏的单身文件
for filenames in os.walk(pathh):
filenames = list(filenames)
filenames = filenames[2]
for filename in filenames:
print(filename) if h==0: a = filename h = 1 elif h==1: #print(filename) b = filename if a[0:a.rfind('.', 1)]==b[0:b.rfind('.', 1)]: h = 0 #print(filename) else: h = 1 dele.append(a) a = b else: print("wa1")
print (dele)
至此数据标注工作完毕,我们还需要一个小工作,就是将xml文件全部从JPEGImages移出到Annotations文件夹下,方法为:
$ cd JPEGImages
$ mv *.xml …/Annotations/
至此,JPEGImages为全部的图像数据,Annotations中为对应的xml描述文件.
5.4 指定训练集和测试集
我们做好的数据集要一部分作为训练集来训练模型,需要另一部分作为测试集来帮助我们验证模型的可靠性.因此首先要将所有的图像文件随机分配为训练集和测试集.
首先切换到ImageSets目录中,新建Main目录,然后在Main目录中新建两个文本文档train.txt和val.txt.分别用于存放训练集的文件名列表和测试集的文件名列表.
$ cd ImageSets
$ mkdir -p Main && cd Main
$ touch train.txt test.txt
然后运行divide_sets.py程序
然后执行如下脚本文件来生成训练集和测试集,注意该文件中的2400为我选择的训练集的个数.400默认为测试集.
7.测试
7.1 使用c进行图片检测
将yolov3-tiny90000.weights拷贝到Nano上即可进行测试,其测试方法同第4节,主要提该模型文件即可.如:
执行如下命令,即可用于图片检测.
$ ./darknet detect cfg/yolov3-tiny.cfg yolov3-tiny90000.weights data/dog.jpg
7.2 使用c进行实时检测
执行如下命令,即可用于测试实时视频.
$ ./darknet detector demo cfg/voc.data cfg/yolov3-tiny.cfg yolov3-tiny90000.weights
7.2 使用python进行图片检测
若想使用python文件进行测试,可以进入examples目录下,修改detector.py文件,主要修改如下内容:
dn.set_gpu(0)
net = dn.load_net(“…/cfg/yolov3-tiny.cfg”, “…/backup/yolov3-tiny_70000.weights”, 0)
meta = dn.load_meta(“…/cfg/voc.data”)
修改完的内容如下:
#!/usr/bin/env python
import sys, os
sys.path.append(os.path.join(os.getcwd(),‘python/’))
import darknet as dn
import cv2 as cv
dn.set_gpu(0)
net = dn.load_net(“…/cfg/yolov3-tiny.cfg”, “…/backup/yolov3-tiny_70000.weights”, 0)
meta = dn.load_meta(“…/cfg/voc.data”)
r = dn.detect(net, meta, “…/data/2.jpg”)
print r
运行如下命令即可对指定的图片进行检测:
$ python detector.py
1
7.3 使用python进行实时检测
为了对实时视频进行目标检测,我们需要将上述检测图片的代码进行修改,
$ cd examples
$ touch detector_real_time.py
内容如下:
#!/usr/bin/env python
import sys, os
sys.path.append(os.path.join(os.getcwd(),‘python/’))
import darknet as dn
import cv2 as cv
dn.set_gpu(0)
net = dn.load_net(“…/cfg/yolov3-tiny.cfg”, “…/backup/yolov3-tiny_70000.weights”, 0)
meta = dn.load_meta(“…/cfg/voc.data”)
r = dn.detect(net, meta, “…/data/2.jpg”)
print r
cap = cv.VideoCapture(0)
while True:
ret,frame = cap.read()
if ret:
cv.imwrite(“./a.jpg”,frame)
r = dn.detect(net, meta, “./a.jpg”)
print r
if len®:
a= int(r[0][2][0]-(r[0][2][2]/2))
b= int(r[0][2][1]-(r[0][2][3]/2))
c= int(r[0][2][0]+(r[0][2][2]/2))
d= int(r[0][2][1]+(r[0][2][3]/2))
cv.rectangle(frame,(a,b),(c,d),(255,0,0),thickness=2)
m= int(r[0][2][0]-(r[0][2][2]/2)-10)
n= int(r[0][2][1]-(r[0][2][3]/2)-10)
cv.putText(frame,“%s:%.2f”%(r[0][0],r[0][1]),(m,n),cv.FONT_HERSHEY_SIMPLEX,0.7,(0,0,255),2,0)
cv.imshow(“result”,frame)
c = cv.waitKey(50)
if c==27:
break
else:
print “nothing”
continue
else:
break
cap.release()
运行该python文件,即可看到试试检测的画面,在Nnao上实测帧率为6fps.注意,要用python2来运行,即:
$ python detector_real_time.py
运行完成后可以在train.txt和val.txt文件如下所示:
5.5 指定训练集和测试集的实际路径和标签文件
修改script文件夹根目录下的voc_label.py文件,需要修改几处:
1.sets=[ (‘2019’, ‘train’), (‘2019’, ‘val’)] ,2019为我们设置的文件夹标识 ,"train"和"val"指代训练集和测试集
2)classes = [“shose”, “glove”, “battery”, “watermenlon”] ,修改为我们要识别的四类物体名称
如下:
import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join
sets=[ (‘2019’, ‘train’), (‘2019’, ‘val’)]
classes = [“shose”, “glove”, “battery”, “watermenlon”]
def convert(size, box):
dw = 1./(size[0])
dh = 1./(size[1])
x = (box[0] + box[1])/2.0 - 1
y = (box[2] + box[3])/2.0 - 1
w = box[1] - box[0]
h = box[3] - box[2]
x = xdw
w = wdw
y = ydh
h = hdh
return (x,y,w,h)
def convert_annotation(year, image_id):
in_file = open(‘VOCdevkit/VOC%s/Annotations/%s.xml’%(year, image_id))
out_file = open(‘VOCdevkit/VOC%s/labels/%s.txt’%(year, image_id), ‘w’)
tree=ET.parse(in_file)
root = tree.getroot()
size = root.find(‘size’)
w = int(size.find(‘width’).text)
h = int(size.find(‘height’).text)
for obj in root.iter('object'):
difficult = obj.find('difficult').text
cls = obj.find('name').text
if cls not in classes or int(difficult)==1:
continue
cls_id = classes.index(cls)
xmlbox = obj.find('bndbox')
b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))
bb = convert((w,h), b)
out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
wd = getcwd()
for year, image_set in sets:
if not os.path.exists(‘VOCdevkit/VOC%s/labels/’%(year)):
os.makedirs(‘VOCdevkit/VOC%s/labels/’%(year))
image_ids = open(‘VOCdevkit/VOC%s/ImageSets/Main/%s.txt’%(year, image_set)).read().strip().split()
list_file = open(‘%s_%s.txt’%(year, image_set), ‘w’)
for image_id in image_ids:
list_file.write(‘%s/VOCdevkit/VOC%s/JPEGImages/%s.jpg\n’%(wd, year, image_id))
convert_annotation(year, image_id)
list_file.close()
os.system(“cat 2019_train.txt 2019_val.txt > train.txt”)
修改完成后,执行如下命令,即可在labels文件夹下生成标签文件.如下:
在scripts根目录下,也会生成2019_train.txt和2019_var.txt文件,与之前Main中的train.txt和var.txt文件不同,其内容全部为训练图片或测试图片的实际路径.
5.6 修改一些必要文件
5.6.1 修改data目录下的voc.names
将文件中coco数据集的标签,修改为我们需要的四类标签,如下:
5.6.2 修改 cfg目录下的voc.data文件
主要修改的点为:
1)classes 因为,我们是4类,所以,classes = 4;
2) 修改训练集:train = /home/jetbot/darknet-master/scripts/2019_train.txt
3) 修改测试集valid = /home/jetbot/darknet-master/scripts/2019_var.txt
4) 修改标签名: names = data/voc.names
5) 修改训练过程中生成的过程结果存放地址
修改后,如下:
5.6.3 修改 cfg目录下的yolov3-tiny.cfg文件
修改地方主要有如下几个:
1.有两处需要修改classes和filters,从下往上有两处,类似如下字样处:
[convolutional]
size = 1
stride =1
pad =1
filters = %%%
actication = linear
[yolo]
mask = …
anchors = …
classes = %%%
num = …
将classes 修改为4,因为我们只有4类;将卷积层数修改为27 ,计算方式为3*(类别数+5).若为3类,则是3*(3+5) = 24.
2.我们任务是测试,则需要将该文件上方Testing下两行的batch=1,subdivisions=1全部注释掉,将# Training下两行的batch=64,subdivisions=16全部取消注释.
如果batch设置过大,会报显存不够错误,我电脑配置太低,batch设置为16,subdivisions为16,可以根据自己的情况进行设置,如下图
至此,训练前的准备工作已全部完成了.
5.6.4 生成预训练模型
该过程用于生成较小的预训练模型
$ ./darknet partial cfg/yolov3-tiny.cfg yolov3-tiny.weights yolov3-tiny.conv.15 15
或下载预训练权重
wget https://pjreddie.com/media/files/darknet53.conv.74
6.训练
执行如下命令即可进行训练:
$ ./darknet detector train cfg/voc.data cfg/yolov3-tiny.cfg yolov3-tiny.conv.15 | tee person_train_log.txt
保存log时会生成两个文件,一个保存的是网络加载信息和checkout点保存信息,另一个保存的是训练信息。
训练方式二:
./darknet detector train cfg/voc.data cfg/yolov3-tiny.cfg darknet53.conv.74
./darknet detector train cfg/voc.data cfg/yolov4-tiny.cfg yolov4-tiny.conv.29
训练耗时较长,查看log当loss较小,且不再发生变化时,可按"ctrl+c"终止训练.我训练到了90000次就停止了,在这个过程中在backup文件夹下会保存对应迭代次数的中间结果,前1000次内每100次保存一个,超过1000次,每1000保存一次,依次.在这个过程中,我么可以随时拿中间结果进行测试.
七:关于训练时打印的日志详解
如图所示:
Region 82 Avg IOU: 0.874546, Class: 0.983519, Obj: 0.984566, No Obj: 0.008776, .5R: 1.000000, .75R: 0.750000, count: 4
Region 94 Avg IOU: 0.686372, Class: 0.878314, Obj: 0.475262, No Obj: 0.000712, .5R: 1.000000, .75R: 0.200000, count: 5
Region 106 Avg IOU: 0.893751, Class: 0.762553, Obj: 0.388385, No Obj: 0.000089, .5R: 1.000000, .75R: 1.000000, count: 1
1
2
3
三个尺度上预测不同大小的框,82卷积层为最大预测尺度,使用较大的mask,可以预测出较小的物体,94卷积层 为中间预测尺度,使用中等的mask, 106卷积层为最小预测尺度,使用较小的mask,可以预测出较大的物体。
下面以其中一个为例:
Region 82 Avg IOU: 0.874546, Class: 0.983519, Obj: 0.984566, No Obj: 0.008776, .5R: 1.000000, .75R: 0.750000, count: 4
1
详解:
Region Avg IOU: 表示在当前subdivision内的图片的平均IOU,代表预测的矩形框和真实目标的交集与并集之比。
Class: 标注物体分类的正确率,期望该值趋近于1。
Obj: 越接近1越好。
No Obj: 期望该值越来越小,但不为零。
count: count后的值是所有的当前subdivision图片中包含正样本的图片的数量。
每过一个批次会返回一个输出:
1: 806.396851, 806.396851 avg, 0.000000 rate, 1.457291 seconds, 64 images
1
1: 指示当前训练的迭代次数
806.396851:是总体的Loss(损失)
806.396851 avg:是平均Loss,这个数值应该越低越好,一般到0.几的时候就可直接退出训练。
0.000000 rate:代表当前的学习率,是在.cfg文件中定义的。
1.843955 seconds:表示当前批次训练花费的总时间。
64 images:这一行最后的这个数值是1*64的大小,表示到目前为止,参与训练的图片的总量
SIM7600G-H 4G for Jetson Nano
Jetson Nano例程使用
硬件连接
软件安装
登录Jetson Nano后,在终端逐条输入下面指令,其中换源容易导致安装失败,不建议更换官方源.
第9行至11行为安装jetson-gpio库,第10行将your_user_name替换为自己用户名,官方文件参考
请点击查看
1.sudo apt-get update
2.sudo apt-get python3-pip
3.sudo pip3 install pyserial
4.mkdir -p ~/Documents/SIM7600X_4G_for_JETSON_NANO
5.wget -P ~/Documents/SIM7600X_4G_for_JETSON_NANO/ https://www.waveshare.net/w/upload/6/64/SIM7600X_4G_for_JETSON_NANO.tar.gz
6.cd ~/Documents/SIM7600X_4G_for_JETSON_NANO/
7.tar -xvf SIM7600X_4G_for_JETSON_NANO.tar.gz
8.sudo pip3 install Jetson.GPIO
9.sudo groupadd -f -r gpio
10.sudo usermod -a -G gpio your_user_name
11.sudo udevadm control --reload-rules && sudo udevadm trigger
12.sudo apt-get install minicom
minicom调试
在终端下逐条输入下面条命令行等待模块开机,当模块NET灯
闪烁后,输入最后1行打开minicom进行串口调试,minicom关
闭流控,退出minicom后,输入第3和第4行可以将SIM7600X模
块关机,自行百度minicom设置和使用方法,测试效果如图.
1.echo 200 > /sys/class/gpio/export
2.echo out > /sys/class/gpio/gpio200/direction
3.echo 1 > /sys/class/gpio/gpio200/value
4.echo 0 > /sys/class/gpio/gpio200/value
5.sudo minicom -D /dev/ttyTHS1 -b 115200
python例程
AT
检查模块硬件正确连接,输入下面命令行
退出时请按下Ctrl+C等待SIM7600X模块关机,效果如图.
1.cd ~/Documents/SIM7600X_4G_for_JETSON_NANO/AT/
2.sudo python3 AT.py
GPS
检查模块硬件正确连接,输入下面命令行
退出时请按下Ctrl+C等待SIM7600X模块关机,效果如图.
1.cd ~/Documents/SIM7600X_4G_for_JETSON_NANO/GPS/
2.sudo python3 GPS.py
PhoneCall
检查模块硬件正确连接,输入下面命令行
退出时请按下Ctrl+C等待SIM7600X模块关机,效果如图.
1.cd ~/Documents/SIM7600X_4G_for_JETSON_NANO/PhoneCall/
2.sudo python3 PhoneCall.py
SMS
检查模块硬件正确连接,输入下面命令行
退出时请按下Ctrl+C等待SIM7600X模块关机,效果如图.
1.cd ~/Documents/SIM7600X_4G_for_JETSON_NANO/SMS/
2.sudo python3 SMS.py
TCP
检查模块硬件正确连接,输入下面命令行,关于外
网IP和路由转发机制参考GSM/GPRS/GNSS_HAT的GPRS章节
退出时请按下Ctrl+C等待SIM7600X模块关机,效果如图.
1.cd ~/Documents/SIM7600X_4G_for_JETSON_NANO/TCP/
2.sudo python3 TCP.py
Jetson Nano拨号上网
Jetson Nano拨号上网请点击参考NDIS拨号上网或者PPP拨号上网
视频教程请点击查看,其中需要注意以下三点,硬件连接如图所示
TF卡备份与还原
备份tf卡:
把nano的卡用读卡器插到ubuntu机器上
sudo fdisk -u -l
标题
然后用下面命令将tf卡镜像并压缩
sudo dd if=/dev/sdb | gzip >/home/zc/nano__2020110302.img.gz
如果系统盘太小,放不下,就需要放在机械硬盘上
sudo gzip -dc /home/zc/nano__2020110302.img.gz | sudo dd of=/dev/sdb
恢复的时候
sudo gzip -dc ~/home/nano_test_20201031_v01.img.gz | sudo dd of=/dev/sdb
Nano开机自启动的设置
1、新建个shell脚本文件(例starter.sh)
touch elevator.sh
建议在Home目录下创建即可,访问路径为/home/zc/elevator.sh
内容如下
cd /darknet
sleep 20s #等待20秒,便于摄像头启动
./darknet detector demo cfg/voc.data cfg/yolov4-tiny.cfg yolov4-tiny_130000.weights “nvarguscamerasrc ! video/x-raw(memory:NVMM), width=1280, height=720, format=NV12, framerate=20/1 ! nvvidconv flip-method=2 ! video/x-raw, width=1280, height=720, format=BGRx ! videoconvert ! video/x-raw, format=BGR ! appsink”
2、设置权限
修改elevator.sh权限
$ chmod 777 elevator.sh
Step3 打开gnome-session-properties
直接在终端输入
gnome-session-properties
也可以在路径/usr/share/application/startup application双击打开
看到如下界面:
Step4 添加开启自启程序
点击Add
Name随便填写,按照你的需求来
Command很重要,如果你希望开机后前台运行程序,即出现终端,可以填写如下命令
gnome-terminal -x /home/zc/elevator.sh
gnome-terminal -x bash -c “/home/zc/ elevator.sh;read”
注意:第2个是根据命令行不关闭当前的shell
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。