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!
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.
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.
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).
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))
Versuchen Sie, ONNX zu installieren, sobald Sie eine Arbeitsumgebung haben!
$conda create -n touchdesigner python=3.7.2
$source activate touchdesigner
$pip install onnxruntime==1.1.0
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".
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!
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.
Wenn das gut funktioniert, ist es okay!
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! ** ** **
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