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)
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
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