nvidia jetson nano 操作指南-程序员宅基地

技术标签: python  图像处理  opencv  

硬件购买以及注意点

        购买硬件之后在网卡后面有个短路帽要加上,否则无法开机。

系统安装

nvidia jetson nano系统安装在SD卡中,请预先准备一个32G的SD卡

系统安装步骤请参考官网

Getting Started With Jetson Nano Developer Kit | NVIDIA Developer

注意:烧录完成会弹出好多个窗口,请求格式化,此处一定要点  取消 不要格式化,因为这是软件在为系统分盘。

开发前准备

检查opencv是否安装

命令行:opencv_version

输出:4.1.1

检查显卡驱动和cuda是否安装

命令行:nvcc -V

输出:bash: nvcc command not found

解决:驱动其实已经安装了,我们需要加入环境变量

sudo vim ~./bashrc

或者也可以直接到本地电脑的Home文件夹中找到.bashrc文件,直接打开文件,在文件的最后位置添加上三行命令。(若进到Home文件夹没看有.bashrc文件,则点击一下Ctrl + H就可以显示出.bashrc

在文件最后添加

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

设置完成后可以正常看到nvcc -V 的信息

安装jtop以便查看设备信息

sudo apt-get install git cmake
sudo apt-get install python3-dev
sudo apt-get install libhdf5-serial-dev hdf5-tools
sudo apt-get install libatlas-base-dev gfortran
sudo apt-get install python3-pip
sudo -H pip3 install -U jetson-stats
sudo systemctl restart jetson_stats.service
reboot
jtop

 安装opencv

sys Update

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

sudo add-apt-repository "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial main multiverse restricted universe"

sudo apt update

set nvcc

sudo vim ~/.bashrc
export CUDA_HOME=/usr/local/cuda-10.2
export LD_LIBRARY_PATH=/usr/local/cuda-10.2/lib64:$LD_LIBRARY_PATH
export PATH=/usr/local/cuda-10.2/bin:$PATH
source ~/.bashrc
# test

nvcc -V

安装OpenCV with CUDA

sudo apt-get install build-essential

sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev

sudo apt-get install python3-dev python3-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

sudo apt-get install pkg-config

sudo apt-get install opencv3-pip

unzip opencv4.6-contrib-xfture

build> cmake 
-D CMAKE_INSTALL_PREFIX=/usr/local 
-D CMAKE_BUILD_TYPE=Release 
-D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules 
-D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda-10.2 
-D CUDA_ARCH_BIN=5.3 
-D CUDA_ARCH_PTX="" 
-D BUILD_PNG=OFF 
-D BUILD_TIFF=OFF 
-D BUILD_TBB=OFF 
-D BUILD_JPEG=OFF 
-D BUILD_JASPER=OFF 
-D BUILD_ZLIB=OFF 
-D BUILD_EXAMPLES=ON 
-D BUILD_opencv_java=OFF 
-D BUILD_opencv_python2=OFF 
-D BUILD_opencv_python3=ON 
-D ENABLE_PRECOMPILED_HEADERS=OFF 
-D WITH_OPENCL=OFF 
-D WITH_OPENMP=OFF 
-D WITH_FFMPEG=ON 
-D WITH_GSTREAMER=OFF 
-D WITH_GSTREAMER_0_10=OFF 
-D WITH_CUDA=ON 
-D WITH_GTK=ON 
-D WITH_VTK=OFF 
-D WITH_TBB=ON 
-D PYTHON_DEFAULT_EXECUTABLE=$(python3 -c "import sys; print(sys.executable)") 
-D PYTHON3_EXECUTABLE=$(python3 -c "import sys; print(sys.executable)") 
-D PYTHON3_NUMPY_INCLUDE_DIRS=$(python3 -c "import numpy; print (numpy.get_include())") 
-D PYTHON3_PACKAGES_PATH=$(python3 -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") 
-D WITH_1394=OFF 
-D WITH_OPENEXR=OFF 
-D INSTALL_C_EXAMPLES=ON -D INSTALL_TESTS=OFF 
..
build> make -j4
build> sudo make install
build> sudo python3 setup.py install

if "sudo python3 setup.py install " error :

pip3 install setuptools

pip3 install --upgrade setuptools

pip3 install --upgrade pip

do sudo python3 setup.py install again!

pip3 install Pillow
pip3 install pygame -i https://pypi.tuna.tsinghua.edu.cn/simple/

CameraCall.py

# encoding: utf-8
import cv2 as cv
import subprocess


class CameraCallTool(object):
    cap = None
    
    
    def __init__(self, width, height, CamIndex):
        print(f'Init Camera Tool!')
        if CamIndex == -1:
            self.CallCameraOnBoard(width, height)
        elif CamIndex == 0:
            self.CallCameraOnCSI(width, height)
        else:
            print('no usb camera!')
		
    def CallCameraOnCSI(self, width, height):
        self.cap = cv.VideoCapture(0) #设置摄像头 0是默认的摄像头 如果你有多个摄像头的话呢,可以设置1,2,3....
        self.cap.set(cv.CAP_PROP_FRAME_WIDTH, width)
        self.cap.set(cv.CAP_PROP_FRAME_HEIGHT, height)
        self.cap.set(cv.CAP_PROP_EXPOSURE, 0.1)
        
        
    def Test(self):
        print('CameraCallTool Test')
        
    
    def CameraStatus(self):
        return self.cap.isOpened()
        
        
    def CallCameraOnBoard(self, width, height):
        gst_elements = str(subprocess.check_output('gst-inspect-1.0'))
        if 'nvcamerasrc' in gst_elements:
                # On versions of L4T prior to 28.1, add 'flip-method=2' into gst_str
                gst_str = ('nvcamerasrc ! '
                                   'video/x-raw(memory:NVMM), '
                                   'width=(int)2592, height=(int)1458, '
                                   'format=(string)I420, framerate=(fraction)30/1 ! '
                                   'nvvidconv ! '
                                   'video/x-raw, width=(int){}, height=(int){}, '
                                   'format=(string)BGRx ! '
                                   'videoconvert ! appsink').format(width, height)
        elif 'nvarguscamerasrc' in gst_elements:
                gst_str = ('nvarguscamerasrc ! '
                                   'video/x-raw(memory:NVMM), '
                                   'width=(int)1920, height=(int)1080, '
                                   'format=(string)NV12, framerate=(fraction)30/1 ! '
                                   'nvvidconv flip-method=2 ! '
                                   'video/x-raw, width=(int){}, height=(int){}, '
                                   'format=(string)BGRx ! '
                                   'videoconvert ! appsink').format(width, height)
        else:
                raise RuntimeError('onboard camera source not found!')
        # return cv.VideoCapture(gst_str, cv.CAP_GSTREAMER)
        self.cap = cv.VideoCapture(gst_str, cv.CAP_GSTREAMER)
        
        
    def GetOneFrame(self):
        if self.cap.isOpened():
            ret, frame = self.cap.read()
            if ret is True:
                # 摄像头是和人对立的,将图像左右调换回来正常显示。
                frame = cv.flip(frame, 1)
                frame = cv.flip(frame, 0)
                return frame
            else:
                return None
        else:
            return None
        
        
    def __del__(self):
        if self.cap is not None:
            self.cap.release()
        print('CameraCallTool del')
    
DnnClass.py

# encoding: utf-8
import numpy as np
import cv2 as cv
import os
import time


class MyDnn(object):
    # YOLO文件路径 G:\vs2017Project\yolov2-tiny-voc
    yolo_dir = './yolov3-tiny'
    # 过滤弱检测的最小概率
    CONFIDENCE = 0.5  
    # 非最大值抑制阈值
    THRESHOLD = 0.4
    
    
    def __init__(self):
        print('import Dnn Tool Calss!')
        # YOLO文件路径
        self.yolo_dir_name = self.yolo_dir  
        # 权重文件
        self.weightsPath = os.path.join(self.yolo_dir, 'yolov3.weights')  
        # 配置文件
        self.configPath = os.path.join(self.yolo_dir, 'yolov3.cfg')  
        # label名称
        self.labelsPath = os.path.join(self.yolo_dir_name, 'coco.names')  
        # 加载网络、配置权重
        self.net = cv.dnn.readNetFromDarknet(self.configPath, self.weightsPath)
        # intel gpu
        # self.net.setPreferableBackend(cv.dnn.DNN_BACKEND_OPENCV)
        # self.net.setPreferableTarget(cv.dnn.DNN_TARGET_OPENCL)
        # cpu
        # self.net.setPreferableBackend(cv.dnn.DNN_BACKEND_OPENCV)
        # self.net.setPreferableTarget(cv.dnn.DNN_TARGET_CPU)
        # nvidia gpu
        self.net.setPreferableBackend(cv.dnn.DNN_BACKEND_CUDA)
        self.net.setPreferableTarget(cv.dnn.DNN_TARGET_CUDA)
        print("[INFO] loading YOLO from disk...")  # # 可以打印下信息
        
    
    def importTest(self):
        print('dnn import test!')
        
        
    def DecodeImage(self, img):
        start = time.time()
        # 加载图片、转为blob格式、送入网络输入层
        # img = imagePath
        # net需要的输入是blob格式的,用blobFromImage这个函数来转格式
        blobImg = cv.dnn.blobFromImage(img, 1.0/255.0, (416, 416), None, True, False)
        # 调用setInput函数将图片送入输入层
        self.net.setInput(blobImg)
        # 前面的yolov3架构也讲了,yolo在每个scale都有输出,outInfo是每个scale的名字信息,供net.forward使用
        outInfo = self.net.getUnconnectedOutLayersNames()  
        # 得到各个输出层的、各个检测框等信息,是二维结构。
        layerOutputs = self.net.forward(outInfo)  
        end = time.time()
        print("[INFO] YOLO took {:.6f} seconds".format(end - start))
        # 拿到图片尺寸
        (H, W) = img.shape[:2]
        # 过滤layerOutputs
        # layerOutputs的第1维的元素内容: [center_x, center_y, width, height, objectness, N-class score data]
        # 过滤后的结果放入:
        # 所有边界框(各层结果放一起)
        boxes = []
        # 所有置信度
        confidences = []
        # 所有分类ID
        classIDs = []
        # # 1)过滤掉置信度低的框框
        # 各个输出层
        for out in layerOutputs:
            # 各个框框
            for detection in out:
                # 拿到置信度
                # 各个类别的置信度
                scores = detection[5:]
                # 最高置信度的id即为分类id
                classID = np.argmax(scores)
                # 拿到置信度
                confidence = scores[classID]
                # 根据置信度筛查
                if confidence > self.CONFIDENCE:
                    # 将边界框放会图片尺寸
                    box = detection[0:4] * np.array([W, H, W, H])
                    (centerX, centerY, width, height) = box.astype("int")
                    x = int(centerX - (width / 2))
                    y = int(centerY - (height / 2))
                    boxes.append([x, y, int(width), int(height)])   # 框
                    confidences.append(float(confidence))           # 置信度
                    classIDs.append(classID)                        # 分类ID
        # # 2)应用非最大值抑制(non-maxima suppression,nms)进一步筛掉
        # boxes中,保留的box的索引index存入idxs
        idxs = cv.dnn.NMSBoxes(boxes, confidences, self.CONFIDENCE, self.THRESHOLD)
        # 得到labels列表
        with open(self.labelsPath, 'rt') as f:
            labels = f.read().rstrip('\n').split('\n')
        np.random.seed(42)
        # 框框显示颜色,每一类有不同的颜色,每种颜色都是由RGB三个值组成的,所以size为(len(labels), 3)
        COLORS = np.random.randint(0, 255, size=(len(labels), 3), dtype="uint8")  
        if len(idxs) > 0:
            # alarm pic
            for i in idxs.flatten():  # indxs是二维的,第0维是输出层,所以这里把它展平成1维
                (x, y) = (boxes[i][0], boxes[i][1])
                (w, h) = (boxes[i][2], boxes[i][3])
                color = [int(c) for c in COLORS[classIDs[i]]]
                # 线条粗细为2px
                cv.rectangle(img, (x, y), (x+w, y+h), color, 2)
                cv.rectangle(img, (x, y), (x+w, y+h), color, 2)
                # 线条粗细为2px
                text = "{}: {:.4f}".format(labels[classIDs[i]], confidences[i])
                # cv.FONT_HERSHEY_SIMPLEX字体风格、0.5字体大小、粗细2px
                cv.putText(img, text, (x, y-5), cv.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)
            print('alarm pic!')
            cv.imshow('decode', img)
            return img
        else:
            # normal pic
            print('normal pic!')
            return None
DnnMain.py

# encoding: utf-8
import cv2 as cv
from DnnClass import MyDnn
from CameraCall import CameraCallTool
import pygame
from PIL import Image, ImageDraw, ImageFont
import threading
import subprocess


def LoadMusic():
    pygame.mixer.init()
    pygame.mixer.music.load('./audio/succ.wav')
    pygame.mixer.music.set_volume(0.5)
    
    
def PlaySuccess():
    pygame.mixer.music.play()


def DrawTextOnImage(img, text1, text2, left, top, textColor=(0,255,0), textSize=20):
    if(isinstance(img, np.ndarray)):
        img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    # create a draw to draw text
    draw = ImageDraw.Draw(img)
    fontstyle = ImageFont.truetype('./font/simsun.ttc', textSize, encoding='utf-8')
    draw.text((left,top), text1, textColor, font=fontstyle)
    draw.text((left,int(top + textSize + 2)), text2, textColor, font=fontstyle)
    return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)


def CallCameraOnBoard(width, height):
    gst_elements = str(subprocess.check_output('gst-inspect-1.0'))
    if 'nvcamerasrc' in gst_elements:
        # On versions of L4T prior to 28.1, add 'flip-method=2' into gst_str
        gst_str = ('nvcamerasrc ! '
                   'video/x-raw(memory:NVMM), '
                   'width=(int)2592, height=(int)1458, '
                   'format=(string)I420, framerate=(fraction)30/1 ! '
                   'nvvidconv ! '
                   'video/x-raw, width=(int){}, height=(int){}, '
                   'format=(string)BGRx ! '
                   'videoconvert ! appsink').format(width, height)
    elif 'nvarguscamerasrc' in gst_elements:
        gst_str = ('nvarguscamerasrc ! '
                   'video/x-raw(memory:NVMM), '
                   'width=(int)1920, height=(int)1080, '
                   'format=(string)NV12, framerate=(fraction)30/1 ! '
                   'nvvidconv flip-method=2 ! '
                   'video/x-raw, width=(int){}, height=(int){}, '
                   'format=(string)BGRx ! '
                   'videoconvert ! appsink').format(width, height)
    else:
        raise RuntimeError('onboard camera source not found!')
    return cv.VideoCapture(gst_str, cv.CAP_GSTREAMER)


if __name__ == "__main__":
    print('camera onboard')
    DnnTool = MyDnn()
    cameraCallTool = CameraCallTool(1024, 768, 0)
    t = 0
    try:
        while cameraCallTool.CameraStatus():
            CameraFrame = cameraCallTool.GetOneFrame()
            if CameraFrame is not None:
                cv.imshow('Video', CameraFrame)
                if t == 0 or t.is_alive() is False:
                    # image_np = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
                    t = threading.Thread(target=DnnTool.DecodeImage, args=(CameraFrame, ))
                    t.start()
            #判断退出的条件 当按下'Q'键的时候呢,就退出
            c = cv.waitKey(1)
            # 如果按下q 就截图保存并退出
            if c == ord('q'):  
                saveFile = "Capture.jpg"  # 带有中文的保存文件路径
                img_write = cv.imencode(".jpg", CameraFrame)[1].tofile(saveFile)
                break
    except:
        print('Camera Show Exception!')
    finally:
        del cameraCallTool
        cv.destroyAllWindows()

lost : audo  font  yolov3-tiny

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhangxianlililili/article/details/127647574

智能推荐

传授人生经验(预处理)_轩神与奇牛是师徒,也是k友,经常打2k,可奇牛老是不故意放水让轩神输,于是轩神决定-程序员宅基地

文章浏览阅读769次。Description轩神与奇牛是师徒,也是K友,经常打2K,可奇牛老是不故意放水让轩神输,于是轩神决定给奇 牛传授点人生经验以作补偿。 轩神拿出其珍藏多年的人生经验打造了n个经验球并连成一串,每一 个球里都含着一定量的人生经验。好玩的是,你打破一个球,你没法获得里面的人生经验,而只 能获得打破的那个球两边球的经验绝对值差。 假设轩神造了5个球,按顺序为 1 2 3 4 5 那么打破_轩神与奇牛是师徒,也是k友,经常打2k,可奇牛老是不故意放水让轩神输,于是轩神决定

以Vivado工具为例了解FPGA综合-程序员宅基地

文章浏览阅读4.3k次,点赞11次,收藏88次。在设计过程中,各个阶段的生成的文件都是.dcp,Vivado使用的是通用的模型贯穿在设计。_fpga综合

在Ubuntu上安装更轻量且响应更快的XFCE桌面环境_ubuntu xfce-程序员宅基地

文章浏览阅读3k次。通过安装XFCE桌面环境,你可以在Ubuntu上获得更轻量级和响应更快的桌面体验。在本文中,我们介绍了安装XFCE的步骤,包括更新系统、安装XFCE、配置默认的显示管理器和选择XFCE桌面环境。如果你在Ubuntu上寻求一种更轻便的桌面环境,那么安装XFCE可能是一个不错的选择。安装XFCE后,你需要将默认的显示管理器设置为LightDM,以便在登录时使用XFCE桌面环境。根据自己的需要进行调整,并享受你全新的XFCE桌面环境。现在,你可以享受在Ubuntu上使用XFCE的轻便和快速的桌面体验了!_ubuntu xfce

键值对集合-程序员宅基地

文章浏览阅读3.4k次。键值对集合Set集合Set集合是什么Set对象是值的集合,可以按照插入的顺序迭代它的元素。Set集合中的元素只会出现一次,即 Set集合中的元素是唯一的。const set = new Set([1,2,3,4,5]);NaN和 undefined都可以被存储在Set集合中,NaN之间被视为相同的值。const set = new Set([NaN,NaN]);console.log(set);// Set { NaN }对象被存储在Set集合中时,两个对象总是不相等的。const s_键值对集合

蓝桥杯 海盗比酒量-程序员宅基地

文章浏览阅读445次。海盗比酒量有一群海盗(不多于20人),在船上比拼酒量。过程如下:打开一瓶酒,所有在场的人平分喝下,有几个人倒下了。再打开一瓶酒平分,又有倒下的,再次重复...... 直到开了第4瓶酒,坐着的已经所剩无几,海盗船长也在其中。当第4瓶酒平分喝下后,大家都倒下了。等船长醒来,发现海盗船搁浅了。他在航海日志中写到:“......昨天,我正好喝了一瓶.......奉劝大家,开船不喝酒,喝酒别开船.........

Web基础知识与常用技术-程序员宅基地

文章浏览阅读5.8k次。Web基础知识与常用技术

随便推点

人工智能之华为云5G基站有AI,智能处理流量“潮汐”-程序员宅基地

文章浏览阅读1.9k次,点赞3次,收藏16次。一、5G 基站能否智能“省电”?① 能耗和能效随着中国 5G 基站部署规模的扩大,5G 基站能耗惊人的说法甚嚣尘上,众口铄金,5G 基站似乎坐实“电老虎”的尴尬地位。如下是一张某运营商的内部流出照片,从中可以看出,5G AAU 和 4G RRU 的满载功耗相差极为悬殊,不得不承认 5G 的能耗确实远高于 4G:在移动的节能技术白皮书中,也明确地写着:“2019 年初 5G 基站功耗约为 4G 基站的 3~4 倍,高功耗是运营商大规模部署 5G 的棘手问题”:联通也在其白皮书中写道:“5

flyme8.1.5.0A精简内置软件包_flyme8精简-程序员宅基地

文章浏览阅读6k次。flyme8.1.5.0A系统精简内置软件包提示:精简系统有风险 在精简之前先备份资料 sdcard目录放置官网刷机包以备重新刷机在pc端用adb命令精简手机系统手机端打开usb调试模式 设置 ———关于手机————版本号 点击6~8次进入开发者模式设置————辅助功能————开发者选项————开启开发者选项 打开usb调试platform-tools下载地址https://developer.android.com/studio/releases/platfor_flyme8精简

解决盲注编码问题-程序员宅基地

文章浏览阅读366次。Traceback (most recent call last): File "E:/Pycharm Project/CTF/xman-ctf��¼.py", line 56, in <module> if accesss(urllib.unquote(sub_tables(i, w))): File "E:/Pycharm Project/CTF/xman-ctf��..._codefever盲注

你管这破玩意儿叫高可用-程序员宅基地

文章浏览阅读2.1k次,点赞4次,收藏33次。大家好,我是坤哥今天我们来聊一下互联网三高(高并发、高性能、高可用)中的高可用,看完本文相信能解开你关于高可用设计的大部分困惑前言高可用(High availability,即 HA)的主..._码海 架构 分层

线性插值和二次插值_插值参数模型的线性回归连接和重要主题-程序员宅基地

文章浏览阅读5.5k次。线性插值和二次插值The model may turn out to be far too complex if we continuously keep adding more variables. 如果我们不断增加更多的变量,该模型可能会变得过于复杂。 Will fail to simplify as it is memorizing the training data. 记住训练数据将无法..._回归插值必须是线性

nested exception is org.springframework.jdbc.BadSqlGram 问题-程序员宅基地

文章浏览阅读7.3k次。type Exception reportmessage Request processing failed; nested exception is org.springframework.jdbc.BadSqlGrammarException:description The server encountered an internal error that prevented it f..._nested exception is org.springframework.jdbc.badsqlgrammarexception:

推荐文章

热门文章

相关标签