Ejemplo n.º 1
0
         dis_r.append(dis)
     dxy = []
     for i, j in itertools.combinations(
             range(0, training_data[m].shape[1], 2), 2):
         dxy.append(training_data[m][r, i:i + 2] -
                    training_data[m][r, j:j + 2])
     dxy_r.append(dxy)
 dis_r = np.array(dis_r)
 dxy_r = np.array(dxy_r)
 dis_smth = []
 dxy_eu = np.zeros([dataRange, dxy_r.shape[1]])
 ang = np.zeros([dataRange - 1, dxy_r.shape[1]])
 dxy_smth = []
 ang_smth = []
 for l in range(dis_r.shape[1]):
     dis_smth.append(boxcar_center(dis_r[:, l], win_len))
 for k in range(dxy_r.shape[1]):
     for kk in range(dataRange):
         dxy_eu[kk, k] = np.linalg.norm(dxy_r[kk, k, :])
         if kk < dataRange - 1:
             b_3d = np.hstack([dxy_r[kk + 1, k, :], 0])
             a_3d = np.hstack([dxy_r[kk, k, :], 0])
             c = np.cross(b_3d, a_3d)
             ang[kk, k] = np.dot(
                 np.dot(np.sign(c[2]), 180) / np.pi,
                 math.atan2(
                     np.linalg.norm(c),
                     np.dot(dxy_r[kk, k, :], dxy_r[kk + 1, k, :])))
     dxy_smth.append(boxcar_center(dxy_eu[:, k], win_len))
     ang_smth.append(boxcar_center(ang[:, k], win_len))
 dis_smth = np.array(dis_smth)
Ejemplo n.º 2
0
def bsoid_extract(data, fps):
    """
    Extracts features based on (x,y) positions
    :param data: list, csv data
    :param fps: scalar, input for camera frame-rate
    :return f_10fps: 2D array, extracted features
    """
    win_len = np.int(np.round(0.05 / (1 / fps)) * 2 - 1)
    feats = []
    for m in range(len(data)):
        logging.info(f'Extracting features from CSV file {m+1}...')
        data_range = len(data[m])
        dxy_r = []
        dis_r = []
        for r in range(data_range):
            if r < data_range - 1:
                dis = []
                for c in range(0, data[m].shape[1], 2):
                    dis.append(
                        np.linalg.norm(data[m][r + 1, c:c + 2] -
                                       data[m][r, c:c + 2]))
                dis_r.append(dis)
            dxy = []
            for i, j in itertools.combinations(range(0, data[m].shape[1], 2),
                                               2):
                dxy.append(data[m][r, i:i + 2] - data[m][r, j:j + 2])
            dxy_r.append(dxy)
        dis_r = np.array(dis_r)
        dxy_r = np.array(dxy_r)
        dis_smth = []
        dxy_eu = np.zeros([data_range, dxy_r.shape[1]])
        ang = np.zeros([data_range - 1, dxy_r.shape[1]])
        dxy_smth = []
        ang_smth = []
        for l in range(dis_r.shape[1]):
            dis_smth.append(boxcar_center(dis_r[:, l], win_len))
        for k in range(dxy_r.shape[1]):
            for kk in range(data_range):
                dxy_eu[kk, k] = np.linalg.norm(dxy_r[kk, k, :])
                if kk < data_range - 1:
                    b_3d = np.hstack([dxy_r[kk + 1, k, :], 0])
                    a_3d = np.hstack([dxy_r[kk, k, :], 0])
                    c = np.cross(b_3d, a_3d)
                    ang[kk, k] = np.dot(
                        np.dot(np.sign(c[2]), 180) / np.pi,
                        math.atan2(
                            np.linalg.norm(c),
                            np.dot(dxy_r[kk, k, :], dxy_r[kk + 1, k, :])))
            dxy_smth.append(boxcar_center(dxy_eu[:, k], win_len))
            ang_smth.append(boxcar_center(ang[:, k], win_len))
        dis_smth = np.array(dis_smth)
        dxy_smth = np.array(dxy_smth)
        ang_smth = np.array(ang_smth)
        feats.append(np.vstack((dxy_smth[:, 1:], ang_smth, dis_smth)))
    logging.info(
        f'Done extracting features from a total of {len(data)} training CSV files.'
    )
    f_10fps = []
    for n in range(0, len(feats)):
        feats1 = np.zeros(len(data[n]))
        for s in range(math.floor(fps / 10)):
            for k in range(
                    round(fps / 10) + s, len(feats[n][0]), round(fps / 10)):
                if k > round(fps / 10) + s:
                    feats1 = np.concatenate(
                        (feats1.reshape(feats1.shape[0], feats1.shape[1]),
                         np.hstack((
                             np.mean((feats[n][0:dxy_smth.shape[0],
                                               range(k - round(fps / 10), k)]),
                                     axis=1),
                             np.sum(
                                 (feats[n][dxy_smth.shape[0]:feats[n].shape[0],
                                           range(k - round(fps / 10), k)]),
                                 axis=1))).reshape(len(feats[0]), 1)),
                        axis=1)
                else:
                    feats1 = np.hstack(
                        (np.mean((feats[n][0:dxy_smth.shape[0],
                                           range(k - round(fps / 10), k)]),
                                 axis=1),
                         np.sum((feats[n][dxy_smth.shape[0]:feats[n].shape[0],
                                          range(k - round(fps / 10), k)]),
                                axis=1))).reshape(len(feats[0]), 1)
            logging.info(
                'Done integrating features into 100ms bins from CSV file {n + 1}.'
            )
            f_10fps.append(feats1)
    return f_10fps
Ejemplo n.º 3
0
def bsoid_feats(data: list, fps):
    """
    Trains UMAP (unsupervised) given a set of features based on (x,y) positions
    :param data: list of 3D array
    :param fps: scalar, argument specifying camera frame-rate in LOCAL_CONFIG
    :return f_10fps: 2D array, features
    :return f_10fps_sc: 2D array, standardized/session features
    """
    win_len = np.int(np.round(0.05 / (1 / fps)) * 2 - 1)
    feats = []
    for m in range(len(data)):
        logging.info('Extracting features from CSV file {}...'.format(m + 1))
        dataRange = len(data[m])
        dxy_r = []
        dis_r = []
        for r in range(dataRange):
            if r < dataRange - 1:
                dis = []
                for c in range(0, data[m].shape[1], 2):
                    dis.append(np.linalg.norm(data[m][r + 1, c:c + 2] - data[m][r, c:c + 2]))
                dis_r.append(dis)
            dxy = []
            for i, j in itertools.combinations(range(0, data[m].shape[1], 2), 2):
                dxy.append(data[m][r, i:i + 2] - data[m][r, j:j + 2])
            dxy_r.append(dxy)
        dis_r = np.array(dis_r)
        dxy_r = np.array(dxy_r)
        dis_smth = []
        dxy_eu = np.zeros([dataRange, dxy_r.shape[1]])
        ang = np.zeros([dataRange - 1, dxy_r.shape[1]])
        dxy_smth = []
        ang_smth = []
        for l in range(dis_r.shape[1]):
            dis_smth.append(boxcar_center(dis_r[:, l], win_len))
        for k in range(dxy_r.shape[1]):
            for kk in range(dataRange):
                dxy_eu[kk, k] = np.linalg.norm(dxy_r[kk, k, :])
                if kk < dataRange - 1:
                    b_3d = np.hstack([dxy_r[kk + 1, k, :], 0])
                    a_3d = np.hstack([dxy_r[kk, k, :], 0])
                    c = np.cross(b_3d, a_3d)
                    ang[kk, k] = np.dot(np.dot(np.sign(c[2]), 180) / np.pi,
                                        math.atan2(np.linalg.norm(c),
                                                   np.dot(dxy_r[kk, k, :], dxy_r[kk + 1, k, :])))
            dxy_smth.append(boxcar_center(dxy_eu[:, k], win_len))
            ang_smth.append(boxcar_center(ang[:, k], win_len))
        dis_smth = np.array(dis_smth)
        dxy_smth = np.array(dxy_smth)
        ang_smth = np.array(ang_smth)
        feats.append(np.vstack((dxy_smth[:, 1:], ang_smth, dis_smth)))
    logging.info('Done extracting features from a total of {} training CSV files.'.format(len(data)))
    for n in range(0, len(feats)):
        feats1 = np.zeros(len(data[n]))
        for k in range(round(fps / 10), len(feats[n][0]), round(fps / 10)):
            if k > round(fps / 10):
                feats1 = np.concatenate((feats1.reshape(feats1.shape[0], feats1.shape[1]),
                                         np.hstack((np.mean((feats[n][0:dxy_smth.shape[0],
                                                             range(k - round(fps / 10), k)]), axis=1),
                                                    np.sum((feats[n][dxy_smth.shape[0]:feats[n].shape[0],
                                                            range(k - round(fps / 10), k)]),
                                                           axis=1))).reshape(len(feats[0]), 1)), axis=1)
            else:
                feats1 = np.hstack((np.mean((feats[n][0:dxy_smth.shape[0], range(k - round(fps / 10), k)]), axis=1),
                                    np.sum((feats[n][dxy_smth.shape[0]:feats[n].shape[0],
                                            range(k - round(fps / 10), k)]), axis=1))).reshape(len(feats[0]), 1)
        logging.info('Done integrating features into 100ms bins from CSV file {}.'.format(n + 1))
        if n > 0:
            f_10fps = np.concatenate((f_10fps, feats1), axis=1)
            scaler = StandardScaler()
            scaler.fit(feats1.T)
            feats1_sc = scaler.transform(feats1.T).T
            f_10fps_sc = np.concatenate((f_10fps_sc, feats1_sc), axis=1)
        else:
            f_10fps = feats1
            scaler = StandardScaler()
            scaler.fit(feats1.T)
            feats1_sc = scaler.transform(feats1.T).T
            f_10fps_sc = feats1_sc  # scaling is important as I've seen wildly different stdev/feat between sessions
    return f_10fps, f_10fps_sc