Esempio n. 1
0
def store_test_resnet_outputs(task,
                              date,
                              shuffle,
                              snapshot=None,
                              nc=200,
                              chunk_size=1000,
                              allow_growth=True,
                              debug_key=''):
    """
    Store resnet outputs for test data
    """
    #snapshot = 4999  # set to snapshot # to overwrite snapshot read
    #chunk_size = 1000  # distribute among gpus
    #%%
    from PoseDataLoader import DataLoader
    from src.deepgraphpose import load_dlc_snapshot, get_train_config, get_model_config

    # %%
    data_info = DataLoader(task)

    cfg = get_model_config(task,
                           data_info.model_data_dir,
                           scorer=data_info.scorer,
                           date=date)
    dlc_cfg = get_train_config(cfg, shuffle)
    trainingsnapshot_name, snapshot, dlc_cfg = load_dlc_snapshot(
        dlc_cfg, overwrite_snapshot=snapshot)
    # %%
    store_test_resnet_output_chunks(dlc_cfg,
                                    nc=nc,
                                    chunk_size=chunk_size,
                                    allow_growth=allow_growth,
                                    debug_key=debug_key)

    return
Esempio n. 2
0
def store_original_targets(task, date, shuffle, debug_key=''):

    #%%
    #task = 'ibl1'
    #date = '2031-05-01'
    #%%
    data_info = DataLoader(task)
    # Load project configuration
    cfg = get_model_config(task,
                           data_info.model_data_dir,
                           scorer=data_info.scorer,
                           date=date)
    # Load training configuration for cfg file
    dlc_cfg = get_train_config(cfg, shuffle=shuffle)

    # update
    _, _, dlc_cfg = load_dlc_snapshot(dlc_cfg)

    #%%
    if debug_key == '':
        frame_ids, target2d_train, nx_out, ny_out, datas = get_targets(
            task, date, shuffle)

        #elif debug_key == '_v1':
        #frame_ids, target2d_train, nx_out, ny_out, datas = get_targets_v1(task, date, shuffle)
    else:
        raise ('Not implemeneted')
    # %%
    # target is shared for all snapshots regargless of whathever else
    target_outdir = Path(dlc_cfg.snapshot_prefix).parent / "target_mat"
    if not target_outdir.exists():
        os.makedirs(target_outdir)
    print(target_outdir)
    # %%
    ss = os.path.join(str(target_outdir), "targets{}.mat".format(debug_key))
    sio.savemat(
        ss,
        {
            "target_ind": frame_ids,  # ntrain,
            "target2d": target2d_train,  # ntrain x nj x 2
            "nx_out": nx_out,  # int
            "ny_out": ny_out,  # int
            "dlc_outs": datas,
        },
    )
    #%%
    print("Stored targets in:\n{}".format(ss))
    #%%
    return
Esempio n. 3
0
def extract_resnet_output(task,
                          date,
                          shuffle,
                          overwrite_snapshot=None,
                          allow_growth=True,
                          videofile_path=None,
                          indices=None,
                          nc=200):
    #%%
    if isinstance(videofile_path, str):
        videofile_path = Path(videofile_path)
    else:
        pass
        #assert isinstance(videofile_path, Path)
    #%%
    data_info = DataLoader(task)
    cfg = get_model_config(task,
                           data_info.model_data_dir,
                           scorer=data_info.scorer,
                           date=date)
    #%%
    dlc_cfg = get_train_config(cfg, shuffle)
    # dlc_cfg_init = edict(dlc_cfg)
    #%%
    trainingsnapshot_name, trainingsnapshot, dlc_cfg = load_dlc_snapshot(
        dlc_cfg, overwrite_snapshot=overwrite_snapshot)
    if not (overwrite_snapshot is None):
        assert trainingsnapshot == overwrite_snapshot
    # dlc_cfg_init = edict(dlc_cfg)
    #%%# Update dlc_cfg files just to init network
    dlc_cfg["batch_size"] = 1
    dlc_cfg["num_outputs"] = cfg.get("num_outputs", 1)
    dlc_cfg["deterministic"] = True

    # %%
    # Load data
    if videofile_path is None:
        videofile_path = Path(data_info.videofile_path)

    resnet_outputs = pass_video_through_resnet(videofile_path,
                                               dlc_cfg,
                                               allow_growth=allow_growth,
                                               indices=indices,
                                               nc=nc)

    return resnet_outputs
def get_size_training_chunk(task,
                            date,
                            shuffle,
                            snapshot=4999,
                            chunk=0,
                            nc=200,
                            ns=10):
    # task = 'ibl3'
    # date = '2020-03-16'
    # ns = 10
    # nc = 200
    # %%
    # shuffle = 0
    data_info = DataLoader(task)
    # snapshot = 4999  # set to snapshot # to overwrite snapshot read
    # chunk_size = 1000  # distribute among gpus
    num_chunks = 1
    cfg = get_model_config(task,
                           data_info.model_data_dir,
                           scorer=data_info.scorer,
                           date=date)
    dlc_cfg = get_train_config(cfg, shuffle)
    trainingsnapshot_name, snapshot, dlc_cfg = load_dlc_snapshot(
        dlc_cfg, overwrite_snapshot=snapshot)
    # %% Load training data

    # %%
    dataset = train_loader(dlc_cfg)
    # %%
    outputdir = dataset.resnet_out_chunk_path / ('ns{}nc{}'.format(ns, nc))
    # %%
    if not outputdir.exists() or (len(os.listdir(str(outputdir))) == 0):
        raise FileExistsError('\n\nRun training process\n')
        # store_training_features_v1(dlc_cfg, ns=ns, num_chunks=num_chunks,chunk_size=chunk_size, nc=nc)
    # %%
    print('\n Reading stored resnet outputs in {}'.format(outputdir))
    # load a single chunk
    # num_chunks = len(os.listdir(outputdir))
    resnet_out_chunk = dataset.load_resnet_outs_chunk(chunk=chunk,
                                                      ns=ns,
                                                      nc=nc)[0]
    # %%
    # test frame is 0
    nt_chunk = resnet_out_chunk.shape[0]
    return nt_chunk
Esempio n. 5
0
def store_train_labels(task, date, shuffle):
    data_info = DataLoader(task)
    cfg = get_model_config(task,
                           data_info.model_data_dir,
                           scorer=data_info.scorer,
                           date=date)
    cfg_train = get_train_config(cfg, shuffle=shuffle)
    #%%
    filename = Path(cfg_train.project_path) / cfg_train.dataset
    assert filename.exists()
    #%%
    # Look up manually labeled datasets
    data = sio.loadmat(filename)
    data = data["dataset"][0]
    # n_frames = len(data)
    train_data = [
        int(dat_[0][0].split(".")[0].split("/")[-1][3:]) for dat_ in data
    ]
    train_data = np.sort(train_data)

    assert len(train_data) > 0
    #%%
    val_frame = np.setdiff1d(data_info.get_labeled_frames(), train_data)

    #%%
    frame_index_dir = filename.parent / (filename.stem + "_vframe_indices.npy")
    print(frame_index_dir)
    #%%
    np.save(
        str(frame_index_dir),
        {
            "train_data": train_data,
            "val_data": val_frame,
            "fname": cfg_train.dataset
        },
    )
    print("\nStored train and validation values in \n{}\n".format(
        frame_index_dir))
    return
Esempio n. 6
0
from PoseDataLoader import DataLoader
from PoseDataLoader import TrainDataLoader as train_loader
from src.deepgraphpose import load_dlc_snapshot, get_train_config, get_model_config
# from graphpose.plotting.plot_model import get_traces_fname, make_annotated_movie
from preprocess.get_morig_resnet_outputs import extract_resnet_output

# %%
task = 'ibl1'
date = '2031-05-01'
shuffle = 1
snapshot = 5000
# %%
data_info = DataLoader(task)
# construct proj name
cfg = get_model_config(task,
                       data_info.model_data_dir,
                       scorer=data_info.scorer,
                       date=date)
dlc_cfg = get_train_config(cfg, shuffle)
# load training file
trainingsnapshot_name, snapshot, dlc_cfg = load_dlc_snapshot(
    dlc_cfg, overwrite_snapshot=snapshot)
# %%
resout_from_file = extract_resnet_output(task=task,
                                         date=date,
                                         shuffle=shuffle,
                                         overwrite_snapshot=snapshot)

# %%
debug_key = ''
# Load training data
dataset = train_loader(dlc_cfg, debug_key=debug_key)
Esempio n. 7
0
def store_resnet_output(task,
                        date,
                        shuffle,
                        overwrite_snapshot=None,
                        allow_growth=True,
                        videofile_path=None,
                        resnet_output_dir=None):
    from deeplabcut.pose_estimation_tensorflow.nnet.net_factory import pose_net
    """
    task = 'ibl1'
    date = '2020-01-25'
    shuffle = 1
    overwrite_snapshot = 5000
    ibl_chunk_path = '/data/libraries/deepgraphpose/etc/lab_ekb/debug_va_semi_pipeline/run_long_video_aqweight/movies'
    videofile_path = Path(ibl_chunk_path) / 'movie_chunk_00.mp4'
    resnet_output_dir = videofile_path.parent / videofile_path.stem
    allow_growth = True
    """
    #%%
    if isinstance(videofile_path, str):
        videofile_path = Path(videofile_path)
    else:
        pass
        # assert isinstance(videofile_path, Path)
    if isinstance(resnet_output_dir, str):
        resnet_output_dir = Path(resnet_output_dir)
    else:
        pass
        #assert isinstance(resnet_output_dir, Path)

    #%%
    data_info = DataLoader(task)
    cfg = get_model_config(task,
                           data_info.model_data_dir,
                           scorer=data_info.scorer,
                           date=date)
    #%%
    dlc_cfg = get_train_config(cfg, shuffle)
    # dlc_cfg_init = edict(dlc_cfg)
    #%%
    trainingsnapshot_name, trainingsnapshot, dlc_cfg = load_dlc_snapshot(
        dlc_cfg, overwrite_snapshot=overwrite_snapshot)
    if not overwrite_snapshot == None:
        assert trainingsnapshot == overwrite_snapshot
    # dlc_cfg_init = edict(dlc_cfg)
    #%% Update dlc_cfg files just to init network
    dlc_cfg["batch_size"] = 1
    dlc_cfg["num_outputs"] = cfg.get("num_outputs", 1)
    dlc_cfg["deterministic"] = True
    # %%
    # Load data
    if videofile_path is None:
        videofile_path = Path(data_info.videofile_path)

    #%%

    cap = cv2.VideoCapture(str(videofile_path))
    nframes = int(cap.get(7))
    #%%
    # We want to pass all frames through network
    nx_in, ny_in = int(cap.get(4)), int(cap.get(3))

    frames = np.zeros((nframes, nx_in, ny_in, 3),
                      dtype="ubyte")  # this keeps all frames in a batch
    pbar = tqdm(total=nframes)
    counter = 0
    step = nframes // 3  #max(10, int(nframes / 100))

    while cap.isOpened():
        if counter % step == 0:
            pbar.update(step)
        ret, frame = cap.read()
        if ret:
            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
            frames[counter] = img_as_ubyte(frame)
            counter = counter + 1
        else:
            print("the end")
            break
    pbar.close()
    # read all frames
    assert counter == nframes

    # %%
    TF.reset_default_graph()
    inputs = TF.placeholder(tf.float32, shape=[1, nx_in, ny_in, 3])
    pn = pose_net(dlc_cfg)
    # extract freatures using resnet
    net, end_points = pn.extract_features(inputs)
    # heads = pn.prediction_layers(net, end_points)
    # %%
    # always restore from snapshot do not restore from IBL
    if trainingsnapshot == 0:
        variables_to_restore = slim.get_variables_to_restore(
            include=["resnet_v1"])
    else:
        variables_to_restore = slim.get_variables_to_restore()
    restorer = TF.train.Saver(variables_to_restore)

    # Init session
    config_TF = TF.ConfigProto()
    config_TF.gpu_options.allow_growth = allow_growth
    sess = TF.Session(config=config_TF)

    sess.run(TF.global_variables_initializer())
    sess.run(TF.local_variables_initializer())

    # %%
    # Restore the one variable from disk
    restorer.restore(sess, dlc_cfg.init_weights)

    #%%
    if resnet_output_dir is None:
        resnet_output_dir = Path(dlc_cfg.init_weights).parent
        print(resnet_output_dir)
    #%%
    resnet_outdir = resnet_output_dir / "resnet_output_mat" / (
        "{}".format(trainingsnapshot_name))
    if not resnet_outdir.exists():
        os.makedirs(resnet_outdir)
    #%%
    for ii in range(nframes):
        if ii % 10 == 0:
            print("iter {}/{}".format(ii, nframes))
        ff = frames[ii, :, :, :]
        ff = np.expand_dims(ff, axis=0)
        [net_output] = sess.run([net], feed_dict={inputs: ff})
        # net_heads = sess.run(heads, feed_dict={inputs: ff})
        ss = resnet_outdir / ("resnet_output_{:03d}.mat".format(ii))
        sio.savemat(str(ss), {"net_output": net_output})
    print("Stored resnet outputs in:\n{}".format(resnet_outdir))
    #%%
    sess.close()
    return
def run_original_dlc_shuffle(task,
                             date,
                             shuffle,
                             allow_growth=True,
                             max_snapshots_to_keep=None,
                             keepdeconvweights=True,
                             maxiters=None):
    data_info = DataLoader(task)
    cfg = get_model_config(task,
                           data_info.model_data_dir,
                           scorer=data_info.scorer,
                           date=date)
    path_config_file = Path(cfg["project_path"]) / "config.yaml"
    # dlc_cfg = get_train_config(cfg, shuffle=shuffle)
    # %%
    print("\nTraining network")
    deeplabcut.train_network(
        str(path_config_file),
        shuffle=shuffle,
        trainingsetindex=cfg["iteration"],
        allow_growth=allow_growth,
        max_snapshots_to_keep=max_snapshots_to_keep,
        keepdeconvweights=keepdeconvweights,
        maxiters=maxiters,  # inherits from dlc_cfg file being read
    )
    #%%
    # Evaluate run
    print("\nEVALUATE")
    deeplabcut.evaluate_network(
        str(path_config_file),
        plotting=False,
        Shuffles=[shuffle],
        trainingsetindex=cfg["iteration"],
    )
    # %%
    print("Make copy of video for evaluation")
    # Read video
    video_file = str(
        Path(cfg["project_path"]) / "videos" /
        (data_info.vname + data_info.videotype))

    # %%
    dfolder = Path(cfg["project_path"]
                   ) / "videos" / "moriginal_iter_{}_shuffle_{}".format(
                       cfg['iteration'], shuffle)
    if not os.path.isdir(dfolder):
        os.makedirs(dfolder)

    # Make video copy for evaluation
    newvideo = str(dfolder / (data_info.vname + '.mp4'))

    newclip = VideoFileClip(video_file)
    newclip.write_videofile(newvideo)

    #%%
    # deeplabcut.analyze_videos(path_config_file,
    #                          [newvideo],
    #                          save_as_csv=True,
    #                          shuffle=shuffle,
    #                          trainingsetindex=trainingsetindex,
    #                          destfolder=dfolder,
    #                          dynamic=(True, .1, 5))

    # %%
    # cannot use dynamic cropping wo locref
    print("\nanalyze again...")
    deeplabcut.analyze_videos(
        str(path_config_file),
        [newvideo],
        save_as_csv=True,
        destfolder=dfolder,
        shuffle=shuffle,
        trainingsetindex=cfg["iteration"],
    )
    # %%
    print("\nCreate Labeled video")
    deeplabcut.create_labeled_video(
        str(path_config_file),
        [newvideo],
        destfolder=dfolder,
        shuffle=shuffle,
        trainingsetindex=cfg["iteration"],
        save_frames=False,
    )

    # %%
    # print("\nMaking plots")
    # deeplabcut.plot_trajectories(str(path_config_file),
    #                             [newvideo],
    #                             destfolder=dfolder,
    #                             shuffle=shuffle,
    #                             trainingsetindex=trainingsetindex)
    # % note when training gails we are not updating the model
    #%%
    return
Esempio n. 9
0
def get_targets(task, date, shuffle):
    from deeplabcut.pose_estimation_tensorflow.dataset.factory import (
        create as create_dataset, )
    #%%
    #task = 'reach'
    #date = '2020-02-19'
    #shuffle = 0
    #%%
    data_info = DataLoader(task)
    # Load project configuration
    cfg = get_model_config(task,
                           data_info.model_data_dir,
                           scorer=data_info.scorer,
                           date=date)
    # Load training configuration for cfg file
    dlc_cfg = get_train_config(cfg, shuffle=shuffle)

    # update
    _, _, dlc_cfg = load_dlc_snapshot(dlc_cfg)
    # %%
    dlc_cfg["deterministic"] = True

    #%% Create dataset
    dataset = create_dataset(dlc_cfg)
    nt = len(dataset.data)  # number of training frames
    assert nt >= 1
    nj = max([dat_.joints[0].shape[0] for dat_ in dataset.data])
    ncolors, nxraw, nyraw = dataset.data[0].im_size

    #%%
    stride = dlc_cfg['stride']

    #%%
    #clip = VideoFileClip(str(dlc_cfg.video_path))

    #%%
    # TO DO: make exact should be around 1/8 for resnet 50
    nx = nxraw // 4
    ny = nyraw // 4
    #%%
    extract_frame_num = lambda x: int(x.split("/")[-1].split(".")[0][3:])
    frame_ids = []
    # frame_imgs = []
    counter = 0
    #datas = []
    datas = np.zeros((nt, nx, ny, nj))
    joinss = []
    #%%
    while counter < (nt):
        # for ii in range(nt):
        data = dataset.next_batch()
        data_keys = list(data.keys())

        # inputs = 0
        # part_score_targets = 1
        # part_score_weights = 2
        # locref_targets = 3
        # locref_mask = 4
        # pairwise_targets = 5
        # pairwise_mask = 6
        # data_item = 7

        data_item = data[data_keys[-1]]
        joinss += [np.copy(data_item.joints[0])]

        inputs = data[data_keys[0]].squeeze()
        print(inputs.shape)
        part_score_targets = data[data_keys[1]].squeeze()  # multi class labels
        nx, ny = part_score_targets.shape[0], part_score_targets.shape[1]

        # part_score_weights = data[data_keys[2]].squeeze()
        # locref_targets = data[data_keys[3]].squeeze()
        # locref_mask  = data[data_keys[4]].squeeze()

        frame_id = extract_frame_num(data[data_keys[5]].im_path)
        # print(part_score_targets.max((0, 1)))
        print(frame_id)

        if frame_id in frame_ids:
            continue
        else:
            print("Adding frame {}".format(frame_id))
            frame_ids.append(frame_id)
            datas[counter, :nx, :ny, :] = part_score_targets
            #datas.append(part_score_targets)
            counter += 1

    #%%
    #datas = np.stack(datas, 0)
    datas = datas[:, :nx, :ny, :]
    #nx, ny = datas.shape[1:3]
    frame_ids = np.asarray(frame_ids)
    #%%
    # ignore when tongue is not present?
    # assert datas.sum((1, 2)).min() >= 1
    print(datas.sum((1, 2)).min())

    # %%
    # To find 2D coordinates, we must update
    target2d_train = np.zeros((nt, nj, 2)) * np.nan  # nt x nj x 2
    for ntt in range(nt):
        cjoin = joinss[ntt]  # D x nj
        njtt = cjoin.shape[0]
        for njj_id in range(njtt):
            njj = cjoin[njj_id][0]
            joinss_ntt_njj = cjoin[njj_id][1:]
            target2d_train[ntt, njj] = np.flip(
                (joinss_ntt_njj - stride / 2) / stride)

    # %%
    # visualize some randomly
    # ntt = 23
    # njj = 0
    # center_loc = target2d_train[ntt, njj]

    # plt.imshow(datas[ntt, :, :, njj])
    # plt.plot(center_loc[1], center_loc[0], 'ro')
    # plt.show(block=True)
    # %%
    # target is shared for all snapshots regargless of whathever else

    nx_out = int(part_score_targets.shape[0])
    ny_out = int(part_score_targets.shape[1])
    return frame_ids, target2d_train, nx_out, ny_out, datas