Tipps für Python-Anfänger, um das Scikit-Image-Beispiel für sich selbst zu verwenden 8 Verarbeitungszeitmessung und Profiler

Scikit-image, scikit-learn, Verarbeitungszeit bei Verwendung von OpenCV-Python Besorgnis, Sorge. Daher werde ich in diesem Artikel den Einstieg in die Messung der Verarbeitungszeit und die Profilerstellung vorstellen.

** Messung der Bearbeitungszeit **

import cv2 Die OpenCV-Bindung ist bereits in einer fehlerfreien Umgebung verfügbar. Cv2.getTickCount (), cv2.getTickFrequency () darin Mit können Sie die Verarbeitungszeit messen. Ein Beispiel für einen Artikel Messen der Leistung mit OpenCV Diese Funktion funktioniert sowohl unter Windows als auch unter Linux gleich, sodass Sie die Verarbeitungszeit messen können, ohne die Portabilität von Skripten zu beeinträchtigen.

Lassen Sie uns anhand der Beispiele, die bisher wiederholt verwendet wurden, messen, wie sich die Verarbeitungszeit ändert, wenn die Größe des Eingabebilds geändert wird. [Normalized Cut] (http://scikit-image.org/docs/dev/auto_examples/segmentation/plot_ncut.html#example-segmentation-plot-ncut-py) Normalized Cut Lassen Sie uns die Größe des Eingabebildes am Beispiel von ändern.

** Beispiel: Änderung der Ausführungszeit in Abhängigkeit von der Bildgröße **

.py:ex_getTickCount.py


from skimage import data, segmentation, color
from matplotlib import pyplot as plt
import cv2

img0 = data.coffee()

x=[]
y=[]

a=1.2
for i in range(10):
    r=a**i
    newSize=(int(img0.shape[1]/r), int(img0.shape[0]/r))
    img=cv2.resize(img0, newSize)
    t1=cv2.getTickCount()
    labels1 = segmentation.slic(img, compactness=30, n_segments=400)
    out1 = color.label2rgb(labels1, img, kind='avg')
    t2=cv2.getTickCount()
    dt=(t2-t1)/cv2.getTickFrequency()
    print newSize, dt
    x.append(newSize[0])
    y.append(dt)
    
plt.figure(1)
plt.plot(x,y, "*-")
plt.xlabel("width")
plt.ylabel("time [sec]")
plt.grid(True)
plt.show()

ex_getTickCount.png

Abbildung: Änderung der Ausführungszeit in Abhängigkeit von der Bildgröße

Wenn Sie sich das Diagramm ansehen, sehen Sie, dass sich die Verarbeitungszeit vervierfacht, wenn die Breite des Bildes verdoppelt wird. Mit anderen Worten, wenn die Breite des Bildes halbiert wird, beträgt die Verarbeitungszeit das 1/4-fache. Um die gleiche Verarbeitungszeit bei gleicher Bildbreite zu erzielen, entspricht dies einer Reduzierung der Verarbeitungszeit um 75%. Im Allgemeinen ist eine solche Beschleunigung nicht einfach, und im Fall einer Verarbeitung, bei der das Bild reduziert werden kann, ist das Reduzieren der Bildgröße ein Standard zum Verkürzen der Verarbeitungszeit.

** Beispiel: Änderung der Ausführungszeit bei jedem Videobild (Zeitreihen und Histogramm) **

Zunächst Tipps für Python-Anfänger, um das Scikit-Image-Beispiel für sich selbst zu verwenden 2 Verarbeiten mehrerer Dateien Einführung eines Skripts, das den normalisierten Schnitt für jeden Frame verarbeitet. Diesmal habe ich darauf basierend die Verarbeitungszeit in jedem Frame gemessen und eine grafische Darstellung des Ergebnisses erstellt.

.py:ex_plot_ncut2_time.py


from skimage import data, io, segmentation, color
from skimage.future import graph
import cv2

def plotNcut(img):    
    labels1 = segmentation.slic(img, compactness=30, n_segments=200)
    out1 = color.label2rgb(labels1, img, kind='avg')
    
    g = graph.rag_mean_color(img, labels1, mode='similarity')
    labels2 = graph.cut_normalized(labels1, g)
    out2 = color.label2rgb(labels2, img, kind='avg')

    return out1, out2

name="768x576.avi"
cap=cv2.VideoCapture(name)
i= -1
out=open("time_data.txt", "wt")
while cap.isOpened():
    i += 1
    ret, img=cap.read()
    if ret != True:
        break
    if i>100:
        break
    [h, w] = img.shape[:2]
    img = cv2.resize(img, (w/2, h/2))
    t1=cv2.getTickCount()
    out1, out2 = plotNcut(img)
    t2=cv2.getTickCount()
    dt=(t2-t1)/cv2.getTickFrequency()
    out.write("%f\n" % dt)
    cv2.imshow("img", out1)
    cv2.waitKey(100)
    cv2.imwrite("org_%04d.png " % i,  img)
    cv2.imwrite("img_%04d.png " % i,  out1)
    print i
    
out.close()

.py:view_data.py


import numpy as np
import pylab

name="time_data.txt"

data=np.loadtxt(name)

print data

pylab.figure(1)
pylab.subplot(1,2,1)
pylab.plot(data)
pylab.ylabel("time[s]")
pylab.grid(True)
pylab.subplot(1,2,2)
pylab.hist(data)
pylab.grid(True)
pylab.xlim([3, 4])
pylab.xlabel("time[s]")
pylab.show()

figure_1.png

Durch die Anzeige der Zeitreihen oder des Histogramms auf diese Weise wird es einfacher, zu bewerten, um wie viel sich die Verarbeitungszeit je nach Szene ändern kann, als die Verarbeitungszeit nur einmal zu messen. Der Versuch, es zu verwenden, ist einer der Anhaltspunkte, um die Methode zu verstehen.

** Profiler verwenden **

Python verfügt über einen Profiler in der Standardbibliothek, sodass Sie Python-Skripte unabhängig vom Betriebssystem oder CPU-Typ wie Windows oder Linux profilieren können. Im Fall von C ++ unterscheidet sich die Profilierungsmethode je nach Betriebssystem, Compilertyp und Tooltyp. Selbst wenn die Tools denselben Namen haben, kann die Verwendung je nach Version sehr unterschiedlich sein, und Sie fühlen sich möglicherweise belästigt. In dieser Hinsicht ist der Python-Profiler Python-Standardbibliothek 26.4. Python-Profiler Sie können den Profiler auf einfache Weise ausführen, wie in gezeigt.

Der Haupteinstiegspunkt für Profiler ist die globale Funktion profile.run () (oder cProfile.run ()).

Blog-Artikel Python-Code-Profilerstellung

Bitte versuchen Sie, die Verwendung zu imitieren, indem Sie sich Beispiele wie z.

Was ist die größte Aufschlüsselung der Verarbeitungszeit in profile.run ()? Ist die Anzahl der Funktionsaufrufe wie erwartet oder wird die Funktion mehr als erwartet aufgerufen? Ich überprüfe diese Teile.

Sie können die Betriebszeit und die Aufteilung desselben Python-Skripts mit demselben Profiler zwischen der Portierungsquelle Python (z. B. Windows) und der Portierungsziel-Python vergleichen.

Die Verarbeitungszeit von OpenCV-Python-Funktionen (z. B. Gesichtserkennung und Personenerkennung) hängt erheblich davon ab, wie OpenCV cv2.pyd verwendet wird und ob die CPU mehrkernig ist. Das sollte klar werden, wenn Sie es mit einem Python-Profiler testen.

Aufgabe:

Tipps für Python-Anfänger, um das Scikit-Image-Beispiel für sich selbst zu verwenden 2 Verarbeiten Sie mehrere Dateien

Basierend auf dem Beispiel der Verarbeitung mehrerer Dateien und der Verarbeitung in mehreren Frames in Lassen Sie uns die Ausführungszeit messen.

matplotlib verfügt über eine hist () - Funktion, mit der Sie einfach ein Histogramm erstellen können. Lassen Sie uns tatsächlich messen, wie stark die Verarbeitungszeit variiert, und ein Histogramm erstellen.

** Referenzartikel **

Warum DetectMultiScale () auf Raspberry Pi langsam ist

Überprüfen wir parallel_for

** Nachschlagewerke **

Micha Gorelick, Ian Ozsvald, übersetzt von Aizo Aikawa, "High Performance Python"

Über die Verarbeitungsgeschwindigkeit von SVM (SVC) von scikit-learn Ist ein Beispiel für einen praktischen Artikel über Zeitmessung.

Hinweis: Als ich merkte, dass es in Ordnung wäre, den Teil, der bei der Bildverarbeitung zu viel Zeit in Anspruch nahm, durch ein verkleinertes Bild zu ersetzen, versuchte ich, die Bildgröße zu verringern. Die Verarbeitungszeit wurde drastisch reduziert. Python hat ein einfaches Profil, sodass Sie schnell erkennen können, welcher Prozess lange dauert. Sobald dies identifiziert ist, beschleunigen Sie nur diesen Teil. Von den vielen Zeilen kann das Hinzufügen des Prozesses zum Reduzieren des Bilds zu einer von ihnen die Verarbeitungsgeschwindigkeit um das 10-fache oder mehr erhöhen.

Hinweis 9 Verwendung aus der Sprache C

Recommended Posts

Tipps für Python-Anfänger, um das Scikit-Image-Beispiel für sich selbst zu verwenden 8 Verarbeitungszeitmessung und Profiler
Tipps für Python-Anfänger, um das Scikit-Image-Beispiel für sich selbst zu verwenden
Tipps für Python-Anfänger, um das Scikit-Image-Beispiel für sich selbst zu verwenden 6 Verbessern Sie den Python-Code
Tipps für Python-Anfänger, um das Scikit-Image-Beispiel für sich selbst zu verwenden 7 Erstellen eines Moduls
Tipps für Python-Anfänger, um das Scikit-Image-Beispiel für sich selbst zu verwenden 4 Verwenden Sie die GUI
Tipps für Python-Anfänger, um das Scikit-Image-Beispiel für sich selbst zu verwenden 3 Schreiben Sie in eine Datei
Tipps für Python-Anfänger, um das Scikit-Image-Beispiel für sich selbst zu verwenden 5 In Netzwerk-Apps integrieren
[Python] Misst und zeigt die für die Verarbeitung erforderliche Zeit an
~ Tipps für Python-Anfänger mit Liebe von Pythonista ③ ~
Der schnellste Weg für Anfänger, um Python zu beherrschen
So verwenden Sie MkDocs zum ersten Mal
Verwenden Sie vorerst Logger mit Python
Tipps für diejenigen, die verwirrt sind, wie man is und == in Python verwendet
[Für Anfänger] Wie man den Befehl say mit Python benutzt!
Python # So überprüfen Sie Typ und Typ für Super-Anfänger
[Python] Verwendung von Matplotlib, einer Bibliothek zum Zeichnen von Diagrammen
TensorFlow-Lernmethode für Profis der freien Künste und Python-Anfänger
Ich wusste nicht, wie ich die [Python] für die Anweisung verwenden sollte
Beispiel für die Erstellung einer Python-Umgebung und eine SQL-Ausführung für DB und ein Memo der grundlegenden Verarbeitung für Statistiken 2019
Ich habe zum ersten Mal versucht, mit DynamoDB und Step Functions eine serverlose Stapelverarbeitung zu erstellen
Die Geschichte, zum ersten Mal seit 5 Jahren wieder an die Front zurückzukehren und Python Django umzugestalten
Bestimmen Sie das Datums- und Uhrzeitformat mit Python und konvertieren Sie es in Unixtime
Verarbeitung zur Verwendung von notMNIST-Daten in Python (und versucht, sie zu klassifizieren)
[Einführung in Python] Wie verwende ich den Operator in in der for-Anweisung?
[Einführung in Python] Verwendung des Booleschen Operators (und ・ oder ・ nicht)
Überlassen Sie die mühsame Verarbeitung Python
Siehe Python zum ersten Mal
Web Scraping für Anfänger in Python (1)
Web Scraping für Anfänger in Python (4) -1
Python> Verarbeitungszeitmessung> time.time () --start_time
Web-Scraping durch Anfänger mit Python (4) -3 GCE VM-Instanzerstellung und Scraping auf VM
Ich möchte die Verarbeitung zwischen Testzeit und Produktionsumgebung trennen
[Python] [Maschinelles Lernen] Anfänger ohne Wissen versuchen vorerst maschinelles Lernen
So ermitteln Sie mit Python den Unterschied zwischen Datum und Uhrzeit in Sekunden
Versuchen Sie, Foldl und Foldr mit Python: Lambda zu machen. Auch Zeitmessung
[Beispiel für eine Python-Verbesserung] Was ist die empfohlene Lernseite für Python-Anfänger?
[Python] Verwendung der Aufzählungsfunktion (Indexnummer und Element extrahieren)
Technik, um das Zeichnen des Bildschirms zu beenden und die Wartezeit für das Backen zu verkürzen
So installieren und verwenden Sie pandas_datareader [Python]
Erstellen Sie mit RDKit einen Befehl zum Suchen nach ähnlichen Verbindungen aus der Zieldatenbank und überprüfen Sie die Verarbeitungszeit
[Python] Organisieren der Verwendung für Anweisungen
MongoDB mit Python zum ersten Mal
Python: Verwendung von Einheimischen () und Globalen ()
Verwendung von "deque" für Python-Daten
Verwendung von Python zip und Aufzählung
Verwendung ist und == in Python
OpenGoddard Verwendung der 2-Python-Bibliothek zur nichtlinearen optimalen Steuerung und Trajektoriengenerierung
Verwendung der OpenGoddard 3-Python-Bibliothek zur nichtlinearen optimalen Steuerung und Trajektoriengenerierung
Verwenden Sie libsixel, um Sixel in Python auszugeben und das Matplotlib-Diagramm an das Terminal auszugeben.
Verwendung der OpenGoddard 4-Python-Bibliothek zur nichtlinearen optimalen Steuerung und Trajektoriengenerierung
Verwendung von OAuth und API für Dienstkonten mit Google API Client für Python
Verwendung der OpenGoddard 1-Python-Bibliothek zur nichtlinearen optimalen Steuerung und Trajektoriengenerierung
Verwendung der C-Bibliothek in Python
Verwenden Sie den zu Boto3 hinzugefügten Wiederholungsverarbeitungsmodus
Python für Super-Anfänger Super-Anfänger Python # Einfach loszuwerden
Kausales Denken und kausale Suche von Python (für Anfänger)
Geben Sie die ausführbare Python-Datei an, die mit virtualenv verwendet werden soll
Memo Nr. 3, dass Python-Anfänger "Detaillierte Erklärung der Python-Grammatik" lesen