def AnalyzeMultiAnimalVideo( video, DLCscorer, trainFraction, cfg, dlc_cfg, sess, inputs, outputs, pdindex, save_as_csv, destfolder=None, c_engine=False, robust_nframes=False, ): """ Helper function for analyzing a video with multiple individuals """ print("Starting to analyze % ", video) vname = Path(video).stem videofolder = str(Path(video).parents[0]) if destfolder is None: destfolder = videofolder auxiliaryfunctions.attempttomakefolder(destfolder) dataname = os.path.join(destfolder, vname + DLCscorer + ".h5") if os.path.isfile(dataname.split(".h5")[0] + "_full.pickle"): print("Video already analyzed!", dataname) else: print("Loading ", video) vid = VideoWriter(video) if robust_nframes: nframes = vid.get_n_frames(robust=True) duration = vid.calc_duration(robust=True) fps = nframes / duration else: nframes = len(vid) duration = vid.calc_duration(robust=False) fps = vid.fps nx, ny = vid.dimensions print( "Duration of video [s]: ", round(duration, 2), ", recorded with ", round(fps, 2), "fps!", ) print( "Overall # of frames: ", nframes, " found with (before cropping) frame dimensions: ", nx, ny, ) start = time.time() print("Starting to extract posture") if int(dlc_cfg["batch_size"]) > 1: PredicteData, nframes = GetPoseandCostsF( cfg, dlc_cfg, sess, inputs, outputs, vid, nframes, int(dlc_cfg["batch_size"]), c_engine=c_engine, ) else: PredicteData, nframes = GetPoseandCostsS(cfg, dlc_cfg, sess, inputs, outputs, vid, nframes, c_engine=c_engine) stop = time.time() if cfg["cropping"] == True: coords = [cfg["x1"], cfg["x2"], cfg["y1"], cfg["y2"]] else: coords = [0, nx, 0, ny] dictionary = { "start": start, "stop": stop, "run_duration": stop - start, "Scorer": DLCscorer, "DLC-model-config file": dlc_cfg, "fps": fps, "batch_size": dlc_cfg["batch_size"], "frame_dimensions": (ny, nx), "nframes": nframes, "iteration (active-learning)": cfg["iteration"], "training set fraction": trainFraction, "cropping": cfg["cropping"], "cropping_parameters": coords, } metadata = {"data": dictionary} print("Saving results in %s..." % (destfolder)) auxfun_multianimal.SaveFullMultiAnimalData(PredicteData, metadata, dataname)
def extract_bpt_feature_from_video( video, DLCscorer, trainFraction, cfg, dlc_cfg, sess, inputs, outputs, extra_dict, destfolder=None, robust_nframes=False, ): print("Starting to analyze % ", video) vname = Path(video).stem videofolder = str(Path(video).parents[0]) if destfolder is None: destfolder = videofolder auxiliaryfunctions.attempttomakefolder(destfolder) dataname = os.path.join(destfolder, vname + DLCscorer + ".h5") assemble_filename = dataname.split(".h5")[0] + "_assemblies.pickle" feature_dict = shelve.open( dataname.split(".h5")[0] + "_bpt_features.pickle", protocol=pickle.DEFAULT_PROTOCOL, ) with open(assemble_filename, "rb") as f: assemblies = pickle.load(f) print("Loading ", video) vid = VideoWriter(video) if robust_nframes: nframes = vid.get_n_frames(robust=True) duration = vid.calc_duration(robust=True) fps = nframes / duration else: nframes = len(vid) duration = vid.calc_duration(robust=False) fps = vid.fps nx, ny = vid.dimensions print( "Duration of video [s]: ", round(duration, 2), ", recorded with ", round(fps, 2), "fps!", ) print( "Overall # of frames: ", nframes, " found with (before cropping) frame dimensions: ", nx, ny, ) start = time.time() print("Starting to extract posture") if int(dlc_cfg["batch_size"]) > 1: # for multi animal, seems only this is used PredicteData, nframes = GetPoseandCostsF_from_assemblies( cfg, dlc_cfg, sess, inputs, outputs, vid, nframes, int(dlc_cfg["batch_size"]), assemblies, feature_dict, extra_dict, ) else: raise NotImplementedError( "Not implemented yet, please raise an GitHub issue if you need this." )