2016-05-18 18 views
0

Ich muss Gaussian Mixture Models auf einem RGB-Bild verwenden, und daher ist das Dataset ziemlich groß. Dies muss in Echtzeit (von einem Webcam-Feed) ausgeführt werden. Ich habe dies zunächst mit Matlab programmiert und konnte für ein Bild von 1729 × 866 eine Laufzeit von 0,5 Sekunden erreichen. Die Bilder für die endgültige Anwendung werden kleiner und damit das Timing schneller.Gaussian Mixture Model passen in Python mit sklearn ist zu langsam - Alternative?

Allerdings muss ich dies mit Python und OpenCV für die endgültige Anwendung implementieren (ich brauche es auf einer eingebetteten Platine zu laufen). Ich habe meinen gesamten Code übersetzt und sklearn.mixture.GMM verwendet, um fitgmdist in Matlab zu ersetzen. Die Codezeile, die das GMM-Modell selbst berechnet, wird in nur 7,75 Sekunden durchgeführt, aber die für das Modell passende dauert 19 Sekunden. Ich habe andere Arten von Kovarianz, wie "Diag" oder "sphärisch" versucht, und die Zeit verringert sich ein wenig, aber die Ergebnisse sind schlechter und die Zeit ist immer noch nicht gut genug, nicht einmal nahe.

Ich frage mich, ob es eine andere Bibliothek gibt, die ich verwenden kann, oder ob es sich lohnt, die Funktionen von Matlab nach Python zu übersetzen.

Hier ist mein Beispiel:

import cv2 
import numpy as np 
import math 
from sklearn.mixture import GMM 

im = cv2.imread('Boat.jpg'); 

h, w, _ = im.shape;  # Height and width of the image 

# Extract Blue, Green and Red 
imB = im[:,:,0]; imG = im[:,:,1]; imR = im[:,:,2]; 

# Reshape Blue, Green and Red channels into single-row vectors 
imB_V = np.reshape(imB, [1, h * w]); 
imG_V = np.reshape(imG, [1, h * w]); 
imR_V = np.reshape(imR, [1, h * w]); 

# Combine the 3 single-row vectors into a 3-row matrix 
im_V = np.vstack((imR_V, imG_V, imB_V)); 

# Calculate the bimodal GMM 
nmodes = 2; 
GMModel = GMM(n_components = nmodes, covariance_type = 'full', verbose = 0, tol = 1e-3) 
GMModel = GMModel.fit(np.transpose(im_V)) 

Vielen Dank für Ihre Hilfe

+0

verwenden Sie den GMM für die Hintergrundsubtraktion? – Miki

+0

Ja, das mache ich. – Zynk

+0

Warum verwenden Sie nicht OpenCV [backgroundSubtractorMog] (http://docs.opencv.org/3.1.0/db/d5c/tutorial_py_bg_subtraction.html#gsc.tab=0) oder backgroundSubtractorMog2 ? – Miki

Antwort

0

Sie können mit der ‚Diagonale‘ oder sphärischer Kovarianzmatrix statt Voll fit versuchen. covariance_type='diag' oder covariance_type='spherical'

Ich glaube, es viel schneller sein wird.

+0

Danke, ich habe das versucht, aber nicht so gute Ergebnisse wie mit der vollen Kovarianz-Matrix bekommen, und das war signifikant für diese Anwendung. – Zynk

+0

vielleicht können Sie die Anzahl der Komponenten von GMM erhöhen und es kann das Ergebnis kompensieren/verbessern –