[PYTHON] Führen Sie das Original YOLO mit Jetson Nano aus

Was ist in diesem Artikel zu tun?

In diesem Artikel werden wir die auf colab generierten Gewichte verwenden, um auf Jetson zu laufen. In früheren Artikeln erfahren Sie, wie Sie ein Originalmodell von YOLO erstellen. https://qiita.com/tayutayufk/items/4e5e35822edc5fda60ca https://qiita.com/tayutayufk/items/4dba4087e6f06fec338b

Bereit für Jetson Nano

Bitte installieren Sie JetCard als Voraussetzung in Jetson. Laden Sie zuerst OpenCV herunter. https://qiita.com/usk81/items/98e54e2463e9d8a11415 Informationen zur Installation finden Sie auf dieser Website. Ich habe geklont und unter / home /" username "/ Lib / gebaut.

Als nächstes werden wir Darknet vorstellen. Gehen Sie zu dem Verzeichnis, in das Sie Darknet einfügen möchten git clone https://github.com/AlexeyAB/darknet Ändern Sie nach dem Herunterladen das Makefile wie colab, bevor Sie es erstellen.

GPU=1
CUDNN=1
CUDNN_HALF=0
OPENCV=1
AVX=0
OPENMP=0
LIBSO=1
ZED_CAMERA=0 # ZED SDK 3.0 and above
ZED_CAMERA_v2_8=0 # ZED SDK 2.X

# set GPU=1 and CUDNN=1 to speedup on GPU
# set CUDNN_HALF=1 to further speedup 3 x times (Mixed-precision on Tensor Cores) GPU: Volta, Xavier, Turing and higher
# set AVX=1 and OPENMP=1 to speedup on CPU (if error occurs then set AVX=0)

USE_CPP=0
DEBUG=0

ARCH= -gencode arch=compute_30,code=sm_30 \
      -gencode arch=compute_35,code=sm_35 \
      -gencode arch=compute_50,code=[sm_50,compute_50] \
      -gencode arch=compute_52,code=[sm_52,compute_52] \
#           -gencode arch=compute_61,code=[sm_61,compute_61]

OS := $(shell uname)

# Tesla V100
# ARCH= -gencode arch=compute_70,code=[sm_70,compute_70]

# GeForce RTX 2080 Ti, RTX 2080, RTX 2070, Quadro RTX 8000, Quadro RTX 6000, Quadro RTX 5000, Tesla T4, XNOR Tensor Cores
# ARCH= -gencode arch=compute_75,code=[sm_75,compute_75]

# Jetson XAVIER
# ARCH= -gencode arch=compute_72,code=[sm_72,compute_72]

# GTX 1080, GTX 1070, GTX 1060, GTX 1050, GTX 1030, Titan Xp, Tesla P40, Tesla P4
# ARCH= -gencode arch=compute_61,code=sm_61 -gencode arch=compute_61,code=compute_61

# GP100/Tesla P100 - DGX-1
# ARCH= -gencode arch=compute_60,code=sm_60

# For Jetson TX1, Tegra X1, DRIVE CX, DRIVE PX - uncomment:
ARCH= -gencode arch=compute_53,code=[sm_53,compute_53]

# For Jetson Tx2 or Drive-PX2 uncomment:
# ARCH= -gencode arch=compute_62,code=[sm_62,compute_62]


VPATH=./src/
EXEC=darknet
OBJDIR=./obj/

ifeq ($(LIBSO), 1)
LIBNAMESO=libdarknet.so
APPNAMESO=uselib
endif

ifeq ($(USE_CPP), 1)
CC=g++
else
CC=gcc
endif

CPP=g++ -std=c++11
NVCC=/usr/local/cuda/bin/nvcc
OPTS=-Ofast
LDFLAGS= -lm -pthread
COMMON= -Iinclude/ -I3rdparty/stb/include
CFLAGS=-Wall -Wfatal-errors -Wno-unused-result -Wno-unknown-pragmas -fPIC

ifeq ($(DEBUG), 1)
#OPTS= -O0 -g
#OPTS= -Og -g
COMMON+= -DDEBUG
CFLAGS+= -DDEBUG
else                                                                                                                 ifeq ($(AVX), 1)                                                                                                     CFLAGS+= -ffp-contract=fast -mavx -mavx2 -msse3 -msse4.1 -msse4.2 -msse4a                                            endif                                                                                                                endif

Ändern Sie es in etwas wie. Speziell oben

GPU=0
CUDNN=0
CUDNN_HALF=0
OPENCV=0
AVX=0
OPENMP=0
LIBSO=0

Geändert wie folgt

GPU=1
CUDNN=1
CUDNN_HALF=0
OPENCV=1
AVX=0
OPENMP=0
LIBSO=1

Nächster

ARCH= -gencode arch=compute_30,code=sm_30 \
      -gencode arch=compute_35,code=sm_35 \
      -gencode arch=compute_50,code=[sm_50,compute_50] \
      -gencode arch=compute_52,code=[sm_52,compute_52] \
      -gencode arch=compute_61,code=[sm_61,compute_61]

        .......................

# For Jetson TX1, Tegra X1, DRIVE CX, DRIVE PX - uncomment:
#ARCH= -gencode arch=compute_53,code=[sm_53,compute_53]

Also habe ich die letzte Zeile von "-gencode" auskommentiert und da Jetson Nano den Jetson X1-Chip verwendet, kommentieren Sie unter "# Für Jetson TX1, Tegra X1, DRIVE CX, DRIVE PX - Kommentar:" Bitte gib mir.

Schließlich möchte ich den Speicherort von jetsons nvcc angeben, also habe ich den Speicherort von NVCC geändert

NVCC=/usr/local/cuda/bin/nvcc

ändern

Danach beginnt make mit dem Kompilieren.

Laden Sie Darknet mit Python

Ehhhh Es gibt darknet_video.py in. / Darknet /, also werde ich es mir so viel wie möglich ausleihen.

darknet_video.py


from ctypes import *
import math
import random
import os
import cv2
import numpy as np
import time
import darknet

def convertBack(x, y, w, h):
    xmin = int(round(x - (w / 2)))
    xmax = int(round(x + (w / 2)))
    ymin = int(round(y - (h / 2)))
    ymax = int(round(y + (h / 2)))
    return xmin, ymin, xmax, ymax


def cvDrawBoxes(detections, img):
    for detection in detections:
        x, y, w, h = detection[2][0],\
            detection[2][1],\
            detection[2][2],\
            detection[2][3]
        xmin, ymin, xmax, ymax = convertBack(
            float(x), float(y), float(w), float(h))
        pt1 = (xmin, ymin)
        pt2 = (xmax, ymax)
        cv2.rectangle(img, pt1, pt2, (0, 255, 0), 1)
        cv2.putText(img,
                    detection[0].decode() +
                    " [" + str(round(detection[1] * 100, 2)) + "]",
                    (pt1[0], pt1[1] - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5,
                    [0, 255, 0], 2)
    return img


netMain = None
metaMain = None
altNames = None


def YOLO():

    global metaMain, netMain, altNames
    configPath = "./cfg/yolov3-tiny.cfg"#Geben Sie hier den Speicherort der Modell-CFG-Datei an
    weightPath = "./yolov3-tiny_final.weights"#Speicherort der Gewichtsdatei
    metaPath = "./cfg/obj.data"#Speicherort der Datendatei
    if not os.path.exists(configPath):
        raise ValueError("Invalid config path `" +
                         os.path.abspath(configPath)+"`")
    if not os.path.exists(weightPath):
        raise ValueError("Invalid weight path `" +
                        os.path.abspath(weightPath)+"`")
    if not os.path.exists(metaPath):
        raise ValueError("Invalid data file path `" +
                         os.path.abspath(metaPath)+"`")
    if netMain is None:
        netMain = darknet.load_net_custom(configPath.encode(
            "ascii"), weightPath.encode("ascii"), 0, 1)  # batch size = 1
    if metaMain is None:
        metaMain = darknet.load_meta(metaPath.encode("ascii"))
    if altNames is None:
       try:
            with open(metaPath) as metaFH:
                metaContents = metaFH.read()
                import re
                match = re.search("names *= *(.*)$", metaContents,
                                  re.IGNORECASE | re.MULTILINE)
                if match:
                    result = match.group(1)
                else:
                    result = None
                try:
                    if os.path.exists(result):
                        with open(result) as namesFH:
                            namesList = namesFH.read().strip().split("\n")
                            altNames = [x.strip() for x in namesList]
                except TypeError:
                    pass
        except Exception:
            pass
    cap = cv2.VideoCapture(0)#Kommentieren Sie hier aus, wenn Sie Videos von einer Webcam aufnehmen möchten&Komm unten raus
    #cap = cv2.VideoCapture("test.mp4")
    cap.set(3, 1280)
    cap.set(4, 720)
    out = cv2.VideoWriter(
        "output.avi", cv2.VideoWriter_fourcc(*"MJPG"), 10.0,
        (darknet.network_width(netMain), darknet.network_height(netMain)))
    print("Starting the YOLO loop...")

    darknet_image = darknet.make_image(darknet.network_width(netMain),
                                    darknet.network_height(netMain),3)

    while True:
        prev_time = time.time()
        ret, frame_read = cap.read()
        frame_rgb = cv2.cvtColor(frame_read, cv2.COLOR_BGR2RGB)
        frame_resized = cv2.resize(frame_rgb,
                                   (darknet.network_width(netMain),
                                    darknet.network_height(netMain)),
                                   interpolation=cv2.INTER_LINEAR)

        darknet.copy_image_from_bytes(darknet_image,frame_resized.tobytes())

        detections = darknet.detect_image(netMain, metaMain, darknet_image, thresh=0.25)
        #image = frame_resized
        image = cvDrawBoxes(detections, frame_resized)
        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
        print(1/(time.time()-prev_time))
        cv2.imshow('Demo', image)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    cap.release()
    out.release()

if __name__ == "__main__":
    YOLO()

Es ist nicht notwendig, diejenigen zu erklären, die OpenCV normalerweise mit Python verwenden. Wenn Sie den Speicherort der Eingabedatei ändern und auswählen, ob es sich um eine WebCam oder eine Videodatei handelt, funktioniert dies. Was für eine wundervolle Sache. Ich wollte einen Endknopf, also gegen Ende

 if cv2.waitKey(1)

Zu

 if cv2.waitKey(1) & 0xFF == ord('q'):
            break

Gewechselt zu

Lauf

コメント 2020-06-12 174122.jpg Jetson ist sich Jetsons bewusst. Dies zeigt, dass Jetson zum Selbstbewusstsein erweckt wird und die Intelligenz eines Primaten besitzt. (eine große Lüge)

Nun, da ich die Tastatur immer noch als mich selbst erkenne, habe ich das Gefühl, dass es nicht genügend Samples gibt. Die FPS betrug ungefähr 6 bis 7 fps. Ich möchte, dass du etwas schneller wirst. Ist das die Grenze von Python? Codierung in C ++ ..... denken

Schließlich

YOLO ist gut für Leute, die Bilder mit Robotern erkennen wollen.

Recommended Posts

Führen Sie das Original YOLO mit Jetson Nano aus
Führen Sie die App mit Flask + Heroku aus
Führen Sie IDCF Cloud CLI auf Docker aus
Achtung Seq2 Führen Sie das Dialogmodell mit Seq aus
Jetson Nano Setup
Führen Sie es vorerst mit CentOS7 + Apache2.4 + Python3.6 aus
Einfacher Gesichtserkennungsversuch mit Jetson Nano und Webkamera
Führen Sie Python mit VBA aus
Führen Sie prepDE.py mit python3 aus
Fügen Sie den ursprünglichen Kontextprozessor hinzu
Führen Sie Blender mit Python aus
Richten Sie Jetson Nano ein
Führen Sie iperf mit Python aus
Führen Sie die Intelligenz Ihrer eigenen Python-Bibliothek mit VScode aus.