make_movie_PC.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. import argparse
  2. import ipyparallel as ipp
  3. import numpy as np
  4. import os
  5. import cv2 as cv2
  6. import time
  7. from retinatools.library import image_to_cone
  8. #Helper function
  9. def RF_FilterFrame(idx, luminance_frame, r_RF):
  10. """
  11. Helper function to do the parallelized filtering with RFs.
  12. """
  13. from retinatools.library import get_RF
  14. X = np.linspace(-128, 128, 256)
  15. Y = np.linspace(-128, 128, 256)
  16. idx_x = idx%256
  17. idx_y = np.int(np.floor(idx/256))
  18. x, y = np.meshgrid(X,Y)
  19. xoff = X[idx_x]
  20. yoff = Y[idx_y]
  21. RF = get_RF(xoff, yoff, r_RF)
  22. product = np.sum(luminance_frame * RF)
  23. return product
  24. def parallel_prediction(idx_x, RFstrip, fitparameters, celltype):
  25. '''
  26. Helper function to do the parallelized processing of the filtered signal;
  27. This transform center/surround signal to activity with standard parameters.
  28. '''
  29. from retinatools.library import get_PC_response
  30. lum_signalM = RFstrip[0, idx_x, :]
  31. lum_signalL = RFstrip[1, idx_x, :]
  32. R = get_PC_response(lum_signalM, lum_signalL, fitparameters, celltype)
  33. return R
  34. # fitparameters = {'rcenterM': 20, 'rcenterL': 5.0, \
  35. # 'lum_factor': 1200, 'tau1': 6.9, 'tau2': 60, 'k1': 0.017, 'tau3': 400,\
  36. # 'alpha': 0.68, 'k2': 4, 'o1': 0.07, 'dt': 1000/150.} #110Ron
  37. # celltype = "Ron"
  38. fitparameters = {'rcenterM': 4.9, 'rcenterL': 32, \
  39. 'lum_factor': 290, 'tau1': 7.8, 'tau2': 100, 'k1': 0.018, 'tau3': 2000,\
  40. 'alpha': 0.71, 'k2': 3.0, 'o1': 0.06, 'dt': 1000/150.} #130Gon
  41. celltype = "Gon"
  42. savepath = "/jukebox/tank/schottdorf/tmp/"
  43. N_MAXFRAME = 4500 # 4500 to only process first 2.5 min *60sec *30fps in the mpg -> 30sec ret video
  44. def main(profile):
  45. rc = ipp.Client(profile=profile) # ipyparallel status
  46. print(rc.ids)
  47. dview = rc[:] # Set up the engines
  48. dview.use_cloudpickle() # Make sure to fix the closure over luminance_frame
  49. with dview.sync_imports():
  50. import numpy as np
  51. ################################
  52. ##### Process the movie #####
  53. ################################
  54. vidcap = cv2.VideoCapture('/usr/people/ms81/cells/1x10_256.mpg')
  55. data = np.ones((2, 256, 256, N_MAXFRAME)) # for center & surround X 256px X 256px X N_frames
  56. counter = 0
  57. success = True
  58. t0 = time.time()
  59. while success and (counter < N_MAXFRAME):
  60. success, image = vidcap.read()
  61. scone, mcone, lcone = image_to_cone(image)
  62. for tt in ["M", "L"]:
  63. if tt == "M":
  64. r_RF = fitparameters['rcenterM']
  65. luminance_frame = mcone
  66. idx = 0
  67. else:
  68. r_RF = fitparameters['rcenterL']
  69. luminance_frame = lcone
  70. idx = 1
  71. rc[:].push(dict( luminance_frame = luminance_frame, RF_FilterFrame = RF_FilterFrame, r_RF = r_RF )) # Seed namespace for the ipython engines.
  72. tmp = rc[:].map_sync( lambda ix: RF_FilterFrame(ix, luminance_frame, r_RF), range(0,256*256) ) # Execute parallel computation on all ipython engines
  73. data[idx,:,:,counter] = np.reshape(tmp, (256,256)) # Reorganize data back to frame
  74. counter += 1
  75. print(counter/N_MAXFRAME)
  76. t1 = time.time()
  77. # filename = "rgc-{0}-raw.npy".format(os.environ["SLURM_JOB_ID"])
  78. # np.save(filename, data)
  79. print("Part 1 DONE; Time needed [in h]:")
  80. print( (t1-t0)/3600 )
  81. ################################
  82. #### Apply temp. process #####
  83. ################################
  84. t1 = time.time()
  85. output_model = np.zeros((256, 256, N_MAXFRAME))
  86. rc[:].push(dict( parallel_prediction = parallel_prediction))
  87. for idx_x in range(0,256):
  88. RFstrip = data[:,idx_x,:,:]
  89. rc[:].push(dict( RFstrip = RFstrip, celltype = celltype, fitparameters = fitparameters, parallel_prediction = parallel_prediction ))
  90. tmp = rc[:].map_sync(lambda idx_y: parallel_prediction(idx_y, RFstrip, fitparameters, celltype), range(0,256))
  91. output_model[idx_x,:,:] = np.reshape(tmp, (256, N_MAXFRAME))
  92. print(idx_x/256)
  93. t2 = time.time()
  94. filename = "-{0}-frames.npy".format(os.environ["SLURM_JOB_ID"])
  95. pp = savepath + celltype + filename
  96. np.save(pp, output_model)
  97. print("Part 2 DONE; Time needed [in h]:")
  98. print("Saved: " + pp)
  99. print((t2-t1)/3600)
  100. if __name__ == '__main__':
  101. parser = argparse.ArgumentParser()
  102. parser.add_argument("-p", "--profile", required=True, help="Name of IPython profile to use")
  103. args = parser.parse_args()
  104. main(args.profile)
  105. print("Done and done.")