[PYTHON] Ich habe versucht, maschinelles Lernen (Objekterkennung) mit TouchDesigner zu verschieben

Einführung

Während des Studiums wollte ich das Modell, das ich in Touch Designer erstellt habe, verschieben, also habe ich es ausprobiert.

Wenn ich es tatsächlich versuche, sieht es so aus! (Es unterscheidet sich von dem in diesem Artikel verwendeten Modell, sieht aber so aus.)

https://www.youtube.com/watch?v=ycBvOQUzisU

Das Beispiel-Repository ist hier!

Dieses Mal habe ich übrigens einen Artikel unter der Annahme von Windows geschrieben, aber er kann auch auf Mac funktionieren!

Informationen zu Python in Touch Designer

Mit TouchDesigner können Sie Python als Erweiterung verwenden (Python 3.7.2 scheint in meiner Umgebung intern zu funktionieren).

Sie können den Python-Interpreter unter Dialoge> Textport und DATs verwenden.

Als Vorinstallation können Sie Standardbibliotheken, OpenCV, Numpy usw. verwenden.

touch1.png

Darüber hinaus möchte ich dieses Mal eine Bibliothek verwenden, die häufig beim maschinellen Lernen verwendet wird, um die Objekterkennung in Touch Desginer durchzuführen.

Um dies zu tun, geben Sie den Pfad zur externen Bibliothek unter "Externen Python zum Suchpfad hinzufügen" unter Bearbeiten> Einstellungen an, damit er in Touch Designer verwendet werden kann.

Informationen zur Objekterkennung

Ich werde ObjectDetection nicht im Detail erklären, aber es ist wie das Erkennen von Objekten wie Personen und Dingen wie dem Bild unten (eingeschlossen in ein Quadrat, um anzuzeigen, was dies ist).

result.png

Dieses Mal werde ich versuchen, MobileNetv2-SSD zu verwenden, das auf mobilen Endgeräten funktioniert, um FPS zu verdienen, indem ich einen Algorithmus verwende, der so leicht wie möglich ist!

Als Bibliothek (Framework) für maschinelles Lernen (hauptsächlich DNN) in Python

Es existiert etwas.

Normalerweise beschäftige ich mich mit ** Tensorflow / Keras ** (manchmal benutze ich auch Pytorch), aber diesmal benutze ich ONNX. (Um genau zu sein, wird eine Inferenzumgebung namens ONNX Runtime verwendet.)

Der Grund dafür ist, dass in meiner Umgebung bei Verwendung von Tensorflow oder Pytorch aus Python in TouchDesigner TouchDesigner abstürzt, ohne dass eine Fehlermeldung ausgegeben wird.

Danach habe ich ONNX ohne Verwendung ausprobiert und es hat funktioniert, also werde ich dies verwenden! (Ich kenne MXNet nicht ...)

Für das wesentliche Modell haben wir ein mit Tensorflow erstelltes Modell vorbereitet und in das ONNX-Format exportiert. (In [Repository] enthalten (https://github.com/T-Sumida/ObjectDetection4TouchDesginer))

Arbeitsumgebung

1. Umweltbau

Versuchen Sie, ONNX zu installieren, sobald Sie eine Arbeitsumgebung haben!

1-1 Erstellen Sie eine virtuelle Umgebung mit Anaconda

$conda create -n touchdesigner python=3.7.2

1-2. Installieren Sie ONNX in der virtuellen Umgebung

$source activate touchdesigner
$pip install onnxruntime==1.1.0

1-3 Übergeben Sie den Pfad der virtuellen Umgebung durch Touch Designer

Klicken Sie auf Bearbeiten> Einstellungen, um die Einstellungen zu öffnen.

Aktivieren Sie "Externes Python zum Suchpfad hinzufügen" (siehe Abbildung unten) und übergeben Sie den Pfad zur virtuellen Umgebung von Anaconda an "Python 64-Bit-Modulpfad".

touch2.png

In meiner Umgebung würde ich den folgenden Weg gehen.

C:/Users/T-Sumida/Anaconda3/envs/touchdesigner/Lib/site-packages

Bitte beziehen Sie sich darauf und versuchen Sie es durch den Pfad!

2. Vorbereitung von ONNX

Bestätigen wir nun, dass ONNX auf Touch Desiger funktioniert!

Starten Sie den Python-Interpreter über Dialoge> Textport und DATs, fügen Sie den folgenden Code ein und führen Sie ihn aus.

** * Bitte legen Sie den Pfad zum Modell und den Pfad des Bildes fest, das Sie entsprechend ausprobieren möchten. ** **.

import cv2
import numpy as np
import onnxruntime

#Klassennummer des Coco-Datasets: Klassenname
coco_classes = {
    1: 'person',
    2: 'bicycle',
    3: 'car',
    4: 'motorcycle',
    5: 'airplane',
    6: 'bus',
    7: 'train',
    8: 'truck',
    9: 'boat',
    10: 'traffic light',
    11: 'fire hydrant',
    12: 'stop sign',
    13: 'parking meter',
    14: 'bench',
    15: 'bird',
    16: 'cat',
    17: 'dog',
    18: 'horse',
    19: 'sheep',
    20: 'cow',
    21: 'elephant',
    22: 'bear',
    23: 'zebra',
    24: 'giraffe',
    25: 'backpack',
    26: 'umbrella',
    27: 'handbag',
    28: 'tie',
    29: 'suitcase',
    30: 'frisbee',
    31: 'skis',
    32: 'snowboard',
    33: 'sports ball',
    34: 'kite',
    35: 'baseball bat',
    36: 'baseball glove',
    37: 'skateboard',
    38: 'surfboard',
    39: 'tennis racket',
    40: 'bottle',
    41:'wine glass',
    42: 'cup',
    43: 'fork',
    44: 'knife',
    45: 'spoon',
    46: 'bowl',
    47: 'banana',
    48: 'apple',
    49: 'sandwich',
    50: 'orange',
    51: 'broccoli',
    52: 'carrot',
    53: 'hot dog',
    54: 'pizza',
    55: 'donut',
    56: 'cake',
    57: 'chair',
    58: 'couch',
    59: 'potted plant',
    60: 'bed',
    61: 'dining table',
    62: 'toilet',
    63: 'tv',
    64: 'laptop',
    65: 'mouse',
    66: 'remote',
    67: 'keyboard',
    68: 'cell phone',
    69: 'microwave',
    70: 'oven',
    71: 'toaster',
    72: 'sink',
    73: 'refrigerator',
    74: 'book',
    75: 'clock',
    76: 'vase',
    77: 'scissors',
    78: 'teddy bear',
    79: 'hair drier',
    80: 'toothbrush'
}

#Laden Sie das Modell
session = onnxruntime.InferenceSession("Geben Sie den Pfad zum ONNX-Modell an")

#Bild laden
img = cv2.imread("Geben Sie den Pfad des Bildes an, das Sie ausprobieren möchten")

#OpenCV liest Bilddaten mit BGR, konvertieren Sie sie also in BGR
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

width, height = img.shape[0], img.shape[1]

img_data = np.expand_dims(img, axis=0)

#Modellinferenz vorbereiten
input_name = session.get_inputs()[0].name   # 'image'
output_name_boxes = session.get_outputs()[0].name     # 'boxes'
output_name_classes = session.get_outputs()[1].name   # 'classes'
output_name_scores = session.get_outputs()[2].name    # 'scores'
output_name_num = session.get_outputs()[3].name       # 'number of detections'

#Inferenz
outputs_index = session.run(
    [output_name_num, output_name_boxes, output_name_scores, output_name_classes],
    {input_name: img_data}
)

#Ergebnisse erhalten
output_num = outputs_index[0] #Anzahl der erkannten Objekte
output_boxes = outputs_index[1] #Feld mit der Position des erkannten Objekts
output_scores = outputs_index[2] #Vorhersagewahrscheinlichkeit des erkannten Objekts
output_classes = outputs_index[3] #Klassennummer des erkannten Objekts

#Vorhersagewahrscheinlichkeitsschwelle
threshold = 0.6

#Inferenzergebnisse in Bilder konvertieren
img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
for detection in range(0, int(output_num[0])):
    if output_scores[0][detection] > threshold:
        classes = output_classes[0][detection]
        boxes = output_boxes[0][detection]
        scores = output_scores[0][detection]
        top = boxes[0] * width
        left = boxes[1] * height
        bottom = boxes[2] * width
        right = boxes[3] * height

        top = max(0, top)
        left = max(0, left)
        bottom = min(width, bottom)
        right = min(height, right)
        img = cv2.rectangle(img, (int(left), int(top)), (int(right), int(bottom)), (0,0,255), 3)
        img = cv2.putText(
        	img, "{}: {:.2f}".format(coco_classes[classes], scores),
        	(int(left), int(top)),
        	cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2, cv2.LINE_AA
        )

cv2.imshow('img', img)
k = cv2.waitKey(0)

Wenn Sie es ausführen, wird das folgende Bild gezeichnet.

result.png

Wenn das gut funktioniert, ist es okay!

3. Schreiben Sie Python mit Touch Designer

Als nächstes werden wir dafür sorgen, dass es mit dem Touch Desiger-Patch funktioniert.

Ich werde auf diesen Artikel verweisen (Danke!) Und die Objekterkennung für die Eingabe aus dem Kamerabild durchführen.

https://qiita.com/komakinex/items/5b84b88d537d393afc98

Das Projekt selbst ist sehr einfach, und ich habe es so gemacht, als würde ich die Eingabe von "Video Device In" mit "OP Execute" empfangen und mit der Opencv-Funktion zeichnen.

Der Inhalt von "OP Execute" ist wie folgt.

# me - this DAT.
# changeOp - the operator that has changed
#
# Make sure the corresponding toggle is enabled in the OP Execute DAT.

import cv2
import numpy as np
import onnxruntime

#Da es das gleiche wie der obige Test ist, werde ich es weglassen (wenn Sie es verwenden, kopieren Sie es von oben und verwenden Sie es)
coco_classes = {
    1: 'person',
    2: 'bicycle',
    ...
}

session = onnxruntime.InferenceSession("C:/Users/TomoyukiSumida/Documents/Hatena/ObjetDetection4TD/ssdlite_mobilenetv2.onnx")

def onPreCook(changeOp):
	return

def onPostCook(changeOp):
	#Bilder laden
	frame = changeOp.numpyArray(delayed=True)
	arr = frame[:, :, 0:3]
	arr = arr * 255
	arr = arr.astype(np.uint8)
	arr = np.flipud(arr)
	width, height = arr.shape[0:2]
	image_data = np.expand_dims(arr, axis=0)

	#Modellinferenz vorbereiten
	input_name = session.get_inputs()[0].name   # 'image'
	output_name_boxes = session.get_outputs()[0].name     # 'boxes'
	output_name_classes = session.get_outputs()[1].name   # 'classes'
	output_name_scores = session.get_outputs()[2].name    # 'scores'
	output_name_num = session.get_outputs()[3].name       # 'number of detections'

	#Inferenz
	outputs_index = session.run([output_name_num, output_name_boxes,
                                output_name_scores, output_name_classes],
                                {input_name: image_data})

	#Ergebnisse erhalten
	output_num = outputs_index[0] #Anzahl der erkannten Objekte
	output_boxes = outputs_index[1] #Feld mit der Position des erkannten Objekts
	output_scores = outputs_index[2] #Vorhersagewahrscheinlichkeit des erkannten Objekts
	output_classes = outputs_index[3] #Klassennummer des erkannten Objekts

	#Vorhersagewahrscheinlichkeitsschwelle
	threshold = 0.6

	#Inferenzergebnisse in Bilder konvertieren
	for detection in range(0, int(output_num[0])):
		if output_scores[0][detection] > threshold:
			classes = output_classes[0][detection]
			boxes = output_boxes[0][detection]
			scores = output_scores[0][detection]
			top = boxes[0] * width
			left = boxes[1] * height
			bottom = boxes[2] * width
			right = boxes[3] * height

			top = max(0, top)
			left = max(0, left)
			bottom = min(width, bottom)
			right = min(height, right)
			arr = cv2.rectangle(arr, (int(left), int(top)), (int(right), int(bottom)), (0,0,255), 3)
			arr = cv2.putText(
				arr, "{}: {:.2f}".format(coco_classes[classes], scores),
				(int(left), int(top)),
				cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2, cv2.LINE_AA)
	arr = cv2.cvtColor(arr, cv2.COLOR_RGB2BGR)
	cv2.imshow('img', arr)
	return

def onDestroy():
	return

def onFlagChange(changeOp, flag):
	return

def onWireChange(changeOp):
	return

def onNameChange(changeOp):
	return

def onPathChange(changeOp):
	return

def onUIChange(changeOp):
	return

def onNumChildrenChange(changeOp):
	return

def onChildRename(changeOp):
	return

def onCurrentChildChange(changeOp):
	return

def onExtensionChange(changeOp, extension):
	return


Wenn Sie dies schreiben können, geben Sie "Video Device In" in den Monitor-OPs von "OP Execute" an und aktivieren Sie Post Cook.

**gerührt! ** ** **

example.png

abschließend

Dieses Mal habe ich versucht, die Objekterkennung mit ONNX in Touch Designer zu verschieben. Ich war in Schwierigkeiten, weil Tensorflow aus irgendeinem Grund nicht funktioniert hat, aber ich bin froh, dass ich es geschafft habe, etwas zu machen, das funktioniert.

Das Ausführen der Objekterkennung (und damit des maschinellen Lernens) in TouchDesigner weist jedoch die folgenden Nachteile auf.

Daher ist es besser, einen Python-Prozess hinter TouchDesigner zu starten und Informationen von dort mit OSC zu senden (dies kann nützlich sein, wenn Multithreading in Zukunft mit TouchDesigner verwendet werden kann).

Dieses Mal habe ich auch das ONNX-Modell mit meinem eigenen Modell ausprobiert, aber es ist in Ordnung, die Modelldatei von onnx / model herunterzuladen und zu verwenden. (Ich habe auch mask-rcnn von dort heruntergeladen und bestätigt, dass es funktioniert)

Darüber hinaus ist auch eine Hochgeschwindigkeitsinferenz mit der GPU möglich. (Dieses Modell verwendet eines, das auch mit einer CPU mit hoher Geschwindigkeit läuft.)

$pip install onnxruntime==1.1.0

An Stelle von

$pip install onnxruntime-gpu==1.1.0

Wenn Sie dies installieren, erfolgt die Inferenz auf der GPU. Ist es interessant, verschiedene Dinge auszuprobieren?

Die Ausdrucksseite war schwer zu erreichen, aber ich denke, ich sollte diesen Bereich in Zukunft ansprechen!

Recommended Posts

Ich habe versucht, maschinelles Lernen (Objekterkennung) mit TouchDesigner zu verschieben
Ich habe maschinelles Lernen mit liblinear versucht
Ich habe versucht, GAN (mnist) mit Keras zu bewegen
(Maschinelles Lernen) Ich habe versucht, die Bayes'sche lineare Regression bei der Implementierung sorgfältig zu verstehen
Ich habe versucht, das Modell mit der Low-Code-Bibliothek für maschinelles Lernen "PyCaret" zu visualisieren.
Ich habe versucht, Faster R-CNN mit Pytorch auszuführen
Ich habe versucht, das Bild mithilfe von maschinellem Lernen zu komprimieren
Ich habe versucht, LightGBM mit Yellowbrick zu lernen
Ich habe versucht, den Ball zu bewegen
Onkel SE mit verhärtetem Gehirn versuchte, maschinelles Lernen zu studieren
Ich habe versucht, durch maschinelles Lernen Sätze in den XX-Stil umzuwandeln
Mayungos Python Learning Episode 3: Ich habe versucht, Zahlen zu drucken
Ich habe versucht, ListNet of Rank Learning mit Chainer zu implementieren
[Maschinelles Lernen] Ich habe versucht, die Theorie von Adaboost zusammenzufassen
Ich habe versucht, in einem tief erlernten Sprachmodell zu schreiben
Ich habe versucht, mit Python Machine Learning ein Echtzeit-Modell zur Trennung von Tonquellen zu erstellen
Ich habe versucht, mit Python (Mac OS X) eine Umgebung für maschinelles Lernen zu erstellen.
Ich habe versucht, Autoencoder mit TensorFlow zu implementieren
Ich habe versucht, AutoEncoder mit TensorFlow zu visualisieren
Ich habe versucht, Deep Learning mit Spark × Keras × Docker skalierbar zu machen
Ich habe versucht, mit Hy anzufangen
Ich habe Python 3.5.1 installiert, um maschinelles Lernen zu studieren
Ich habe versucht, mit Kaggles Titanic (kaggle②) zu lernen.
Ich habe versucht, CVAE mit PyTorch zu implementieren
Ich habe versucht, TSP mit QAOA zu lösen
[Maschinelles Lernen] Ich habe versucht, so etwas wie Bilder weiterzugeben
Ich habe versucht, Othello AI mit Tensorflow zu machen, ohne die Theorie des maschinellen Lernens zu verstehen ~ Einführung ~
Ich habe versucht, Othello AI mit Tensorflow zu erstellen, ohne die Theorie des maschinellen Lernens zu verstehen ~ Implementierung ~
Ich habe versucht, Deep Learning zu implementieren, das nicht nur mit NumPy tiefgreifend ist
Mayungos Python Learning Episode 2: Ich habe versucht, Zeichen mit Variablen zu löschen
Ich habe versucht, Gitarrenakkorde in Echtzeit mithilfe von maschinellem Lernen zu klassifizieren
Ich habe mit Python mit dem maschinellen Lernen begonnen (ich habe auch angefangen, in Qiita zu posten). Datenvorbereitung
Ich habe versucht, nächstes Jahr mit AI vorherzusagen
[Python] Einfache Einführung in das maschinelle Lernen mit Python (SVM)
Ich habe versucht, das Lesen von Dataset mit PyTorch zu implementieren
Ich habe versucht, lightGBM, xg Boost mit Boruta zu verwenden
Ich habe versucht, mit TF Learn die logische Operation zu lernen
Ich habe versucht, die Daten mit Zwietracht zu speichern
Ich habe versucht, mit OpenCV Bewegungen schnell zu erkennen
Ich habe versucht, Keras in TFv1.1 zu integrieren
Ich habe versucht, CloudWatch-Daten mit Python abzurufen
Ich habe versucht, LLVM IR mit Python auszugeben
Ich habe versucht, ein Objekt mit M2Det zu erkennen!
Ich habe versucht, die Herstellung von Sushi mit Python zu automatisieren
Ich habe versucht, das Überleben der Titanic mit PyCaret vorherzusagen
Ich habe mit der maschinellen Vorverarbeitung von Python Data begonnen
Ich habe versucht, Linux mit Discord Bot zu betreiben
Ich habe versucht, DP mit Fibonacci-Sequenz zu studieren
Ich habe versucht, Jupyter mit allen Amazon-Lichtern zu starten
Ich habe versucht, Tundele mit Naive Bays zu beurteilen
[Mac] Ich habe versucht, das Lernen mit Open AI Baselines zu stärken
(Maschinelles Lernen) Ich habe versucht, den EM-Algorithmus in der gemischten Gaußschen Verteilung sorgfältig mit der Implementierung zu verstehen.
Ich habe versucht, tief zu lernen
Ich habe versucht zu debuggen.
Einführung in das maschinelle Lernen
Ich habe versucht, Othello AI mit Tensorflow zu erstellen, ohne die Theorie des maschinellen Lernens zu verstehen ~ Battle Edition ~
Ich habe versucht, die beim maschinellen Lernen verwendeten Bewertungsindizes zu organisieren (Regressionsmodell).
Mayungos Python Learning Episode 5: Ich habe versucht, vier Regeln mit Zahlen zu machen