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.
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) Lassen Sie uns die Größe des Eingabebildes am Beispiel von ändern.
.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()
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.
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()
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.
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.
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.
Warum DetectMultiScale () auf Raspberry Pi langsam ist
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