/godec

Python implementation of the GoDec algorithm from Zhou and Tao (ICML 2011) for low-rank and sparse representation

Primary LanguagePythonMIT LicenseMIT

GoDec

Python implementation of the GoDec algorithm from Zhou and Tao (ICML 2011) for low-rank and sparse representation. GoDec is one of the most efficient algorithm for low-rank and sparse decomposition thanks to bilateral random projections (BRP), a fast approximation of SVD/PCA.

Requirements

  • numpy
  • scipy
  • sklearn
  • arparse, time (for demos)
  • matplotlib (optional, to visualize the results)
  • opencv (optional, to read video files)

Demo using OpenCV

Simple demo using data from video file with OpenCV:

# Import libraries
import cv2 as cv
import time
from numpy import array, column_stack
from godec import godec
from utils import play_2d_results

# Open video file
cap = cv.VideoCapture('dataset/demo.avi')

# Read until video is completed
M = None
height = None
width = None
i = 0
print("Press 'q' to stop...")
while cap.isOpened():
    # Capture frame-by-frame
    ret, frame = cap.read()
    if ret:
        frame = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
        height, width = frame.shape

        # Stack frame as a column vector
        F = frame.T.reshape(-1)

        if i == 0:
            M = array([F]).T
        else:
            M = column_stack((M, F))

        # Display the resulting frame
        cv.imshow('Frame', frame)

        # Press Q on keyboard to exit
        if cv.waitKey(25) & 0xFF == ord('q'):
            break

        i = i + 1

    # Break the loop
    else:
        break

# Release the video capture object
cap.release()

# Closes all the windows
cv.destroyAllWindows()

# Decompose
print("Number of frames: ", i, " with size ", (width, height))
print("Processing M with shape ", M.shape)
t = time.time()
L, S, LS, _ = godec(M)
elapsed = time.time() - t
print(elapsed, "sec elapsed")

# Play results
play_2d_results(M, LS, L, S, width, height)

For more info, see godec_opencv.py

Demo using MATLAB data

Simple demo using data from MATLAB:

# Import libraries
import time
import scipy.io as sio

from godec import godec
from utils import play_2d_video, play_2d_results

# Load data
mat = sio.loadmat('dataset/demo.mat')
M, height, width = mat['M'], int(mat['m']), int(mat['n'])

# Play input data
play_2d_video(M, width, height)

# Decompose
t = time.time()
L, S, LS, _ = godec(M)
elapsed = time.time() - t
print(elapsed, "sec elapsed")

# Play results
play_2d_results(M, LS, L, S, width, height)

For more info, see godec_matlab.py

More examples

python godec_demo.py dataset/highway.mpg True
python godec_demo.py dataset/demo.avi True
python godec_demo.py dataset/demo.mat True

License

MIT