Download data_utils/UNFaceFlow/utils.py from ameerazam08/SyncTalk: direct link, hf CLI and curl.
- Browser
- Download file 3.4 kB
-
https://huggingface.co/ameerazam08/SyncTalk/resolve/main/data_utils/UNFaceFlow/utils.py
- Command line
-
hf download hf://ameerazam08/SyncTalk/data_utils/UNFaceFlow/utils.py
-
curl -L -o utils.py https://huggingface.co/ameerazam08/SyncTalk/resolve/main/data_utils/UNFaceFlow/utils.py
3.4 kB
| import os | |
| import shutil | |
| import numpy as np | |
| import struct | |
| import pickle | |
| from scipy.sparse import coo_matrix | |
| def load_flow(filename): | |
| # Flow is stored row-wise in order [channels, height, width]. | |
| assert os.path.isfile(filename), "File not found: {}".format(filename) | |
| flow = None | |
| with open(filename, 'rb') as fin: | |
| width = struct.unpack('I', fin.read(4))[0] | |
| height = struct.unpack('I', fin.read(4))[0] | |
| channels = struct.unpack('I', fin.read(4))[0] | |
| n_elems = height * width * channels | |
| flow = struct.unpack('f' * n_elems, fin.read(n_elems * 4)) | |
| flow = np.asarray(flow, dtype=np.float32).reshape([channels, height, width]) | |
| return flow | |
| def load_graph_info(filename, max_edges, max_nodes): | |
| assert os.path.isfile(filename), "File not found: {}".format(filename) | |
| with open(filename, 'rb') as fin: | |
| edge_total_size = struct.unpack('I', fin.read(4))[0] | |
| edges = struct.unpack('I' * (int(edge_total_size / 4)), fin.read(edge_total_size)) | |
| edges = np.asarray(edges, dtype=np.int16).reshape(-1, 2).transpose() | |
| nodes_total_size = struct.unpack('I', fin.read(4))[0] | |
| nodes_ids = struct.unpack('I' * (int(nodes_total_size / 4)), fin.read(nodes_total_size)) | |
| nodes_ids = np.asarray(nodes_ids, dtype=np.int32).reshape(-1) | |
| nodes_ids = np.sort(nodes_ids) | |
| edges_extent = np.zeros((2, max_edges), dtype=np.int16) | |
| edges_mask = np.zeros((max_edges), dtype=np.bool) | |
| edges_mask[:edges.shape[1]] = 1 | |
| edges_extent[:, :edges.shape[1]] = edges | |
| nodes_extent = np.zeros((max_nodes), dtype=np.int32) | |
| nodes_mask = np.zeros((max_nodes), dtype=np.bool) | |
| nodes_mask[:nodes_ids.shape[0]] = 1 | |
| nodes_extent[:nodes_ids.shape[0]] = nodes_ids | |
| fx = struct.unpack('f', fin.read(4))[0] | |
| fy = struct.unpack('f', fin.read(4))[0] | |
| ox = struct.unpack('f', fin.read(4))[0] | |
| oy = struct.unpack('f', fin.read(4))[0] | |
| return edges_extent, edges_mask, nodes_extent, nodes_mask, fx, fy, ox, oy | |
| def load_adja_id_info(filename, src_mask, H, W, num_adja, num_neigb): | |
| assert os.path.isfile(filename), "File not found: {}".format(filename) | |
| assert num_adja<=8, "Num of adja is larger than 8" | |
| assert num_neigb<=8, "Num of neighb is larger than 8" | |
| src_v_id = np.zeros((H*W, num_adja), dtype=np.int16) | |
| src_neigb_id = np.zeros((H*W, num_neigb), dtype=np.int32) | |
| with open(filename, 'rb') as fin: | |
| neigb_id, value_id = pickle.load(fin) | |
| assert((src_mask.sum())==value_id.shape[0]) | |
| for i in range(num_adja): | |
| src_v_id[src_mask.reshape(-1), i] = value_id[:, i] | |
| for i in range(num_neigb): | |
| src_neigb_id[src_mask.reshape(-1), i] = neigb_id[:, i] | |
| src_v_id = src_v_id.transpose().reshape(num_adja, H, W) | |
| src_neigb_id = src_neigb_id.transpose().reshape(num_neigb, H, W) | |
| return src_v_id, src_neigb_id | |
| def save_flow(filename, flow_input): | |
| flow = np.copy(flow_input) | |
| # Flow is stored row-wise in order [channels, height, width]. | |
| assert len(flow.shape) == 3 | |
| with open(filename, 'wb') as fout: | |
| fout.write(struct.pack('I', flow.shape[2])) | |
| fout.write(struct.pack('I', flow.shape[1])) | |
| fout.write(struct.pack('I', flow.shape[0])) | |
| fout.write(struct.pack('={}f'.format(flow.size), *flow.flatten("C"))) | |