Team Ai
Apppublic

radames/Text2Human-API

sourceHugging Faceupdated 3y agoView on Hugging Face
1likes
language_utils.py316 linesDownload Raw Back to utils
1from curses import A_ATTRIBUTES2 3import numpy4import torch5from pip import main6from sentence_transformers import SentenceTransformer, util7 8# predefined shape text9upper_length_text = [10    'sleeveless', 'without sleeves', 'sleeves have been cut off', 'tank top',11    'tank shirt', 'muscle shirt', 'short-sleeve', 'short sleeves',12    'with short sleeves', 'medium-sleeve', 'medium sleeves',13    'with medium sleeves', 'sleeves reach elbow', 'long-sleeve',14    'long sleeves', 'with long sleeves'15]16upper_length_attr = {17    'sleeveless': 0,18    'without sleeves': 0,19    'sleeves have been cut off': 0,20    'tank top': 0,21    'tank shirt': 0,22    'muscle shirt': 0,23    'short-sleeve': 1,24    'with short sleeves': 1,25    'short sleeves': 1,26    'medium-sleeve': 2,27    'with medium sleeves': 2,28    'medium sleeves': 2,29    'sleeves reach elbow': 2,30    'long-sleeve': 3,31    'long sleeves': 3,32    'with long sleeves': 333}34lower_length_text = [35    'three-point', 'medium', 'short', 'covering knee', 'cropped',36    'three-quarter', 'long', 'slack', 'of long length'37]38lower_length_attr = {39    'three-point': 0,40    'medium': 1,41    'covering knee': 1,42    'short': 1,43    'cropped': 2,44    'three-quarter': 2,45    'long': 3,46    'slack': 3,47    'of long length': 348}49socks_length_text = [50    'socks', 'stocking', 'pantyhose', 'leggings', 'sheer hosiery'51]52socks_length_attr = {53    'socks': 0,54    'stocking': 1,55    'pantyhose': 1,56    'leggings': 1,57    'sheer hosiery': 158}59hat_text = ['hat', 'cap', 'chapeau']60eyeglasses_text = ['sunglasses']61belt_text = ['belt', 'with a dress tied around the waist']62outer_shape_text = [63    'with outer clothing open', 'with outer clothing unzipped',64    'covering inner clothes', 'with outer clothing zipped'65]66outer_shape_attr = {67    'with outer clothing open': 0,68    'with outer clothing unzipped': 0,69    'covering inner clothes': 1,70    'with outer clothing zipped': 171}72 73upper_types = [74    'T-shirt', 'shirt', 'sweater', 'hoodie', 'tops', 'blouse', 'Basic Tee'75]76outer_types = [77    'jacket', 'outer clothing', 'coat', 'overcoat', 'blazer', 'outerwear',78    'duffle', 'cardigan'79]80skirt_types = ['skirt']81dress_types = ['dress']82pant_types = ['jeans', 'pants', 'trousers']83rompers_types = ['rompers', 'bodysuit', 'jumpsuit']84 85attr_names_list = [86    'gender', 'hair length', '0 upper clothing length',87    '1 lower clothing length', '2 socks', '3 hat', '4 eyeglasses', '5 belt',88    '6 opening of outer clothing', '7 upper clothes', '8 outer clothing',89    '9 skirt', '10 dress', '11 pants', '12 rompers'90]91 92 93def generate_shape_attributes(user_shape_texts):94    model = SentenceTransformer('all-MiniLM-L6-v2')95    parsed_texts = user_shape_texts.split(',')96 97    text_num = len(parsed_texts)98 99    human_attr = [0, 0]100    attr = [1, 3, 0, 0, 0, 3, 1, 1, 0, 0, 0, 0, 0]101 102    changed = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]103    for text_id, text in enumerate(parsed_texts):104        user_embeddings = model.encode(text)105        if ('man' in text) and (text_id == 0):106            human_attr[0] = 0107            human_attr[1] = 0108 109        if ('woman' in text or 'lady' in text) and (text_id == 0):110            human_attr[0] = 1111            human_attr[1] = 2112 113        if (not changed[0]) and (text_id == 1):114            # upper length115            predefined_embeddings = model.encode(upper_length_text)116            similarities = util.dot_score(user_embeddings,117                                          predefined_embeddings)118            arg_idx = torch.argmax(similarities).item()119            attr[0] = upper_length_attr[upper_length_text[arg_idx]]120            changed[0] = 1121 122        if (not changed[1]) and ((text_num == 2 and text_id == 1) or123                                 (text_num > 2 and text_id == 2)):124            # lower length125            predefined_embeddings = model.encode(lower_length_text)126            similarities = util.dot_score(user_embeddings,127                                          predefined_embeddings)128            arg_idx = torch.argmax(similarities).item()129            attr[1] = lower_length_attr[lower_length_text[arg_idx]]130            changed[1] = 1131 132        if (not changed[2]) and (text_id > 2):133            # socks length134            predefined_embeddings = model.encode(socks_length_text)135            similarities = util.dot_score(user_embeddings,136                                          predefined_embeddings)137            arg_idx = torch.argmax(similarities).item()138            if similarities[0][arg_idx] > 0.7:139                attr[2] = arg_idx + 1140                changed[2] = 1141 142        if (not changed[3]) and (text_id > 2):143            # hat144            predefined_embeddings = model.encode(hat_text)145            similarities = util.dot_score(user_embeddings,146                                          predefined_embeddings)147            if similarities[0][0] > 0.7:148                attr[3] = 1149                changed[3] = 1150 151        if (not changed[4]) and (text_id > 2):152            # glasses153            predefined_embeddings = model.encode(eyeglasses_text)154            similarities = util.dot_score(user_embeddings,155                                          predefined_embeddings)156            arg_idx = torch.argmax(similarities).item()157            if similarities[0][arg_idx] > 0.7:158                attr[4] = arg_idx + 1159                changed[4] = 1160 161        if (not changed[5]) and (text_id > 2):162            # belt163            predefined_embeddings = model.encode(belt_text)164            similarities = util.dot_score(user_embeddings,165                                          predefined_embeddings)166            arg_idx = torch.argmax(similarities).item()167            if similarities[0][arg_idx] > 0.7:168                attr[5] = arg_idx + 1169                changed[5] = 1170 171        if (not changed[6]) and (text_id == 3):172            # outer coverage173            predefined_embeddings = model.encode(outer_shape_text)174            similarities = util.dot_score(user_embeddings,175                                          predefined_embeddings)176            arg_idx = torch.argmax(similarities).item()177            if similarities[0][arg_idx] > 0.7:178                attr[6] = arg_idx179                changed[6] = 1180 181        if (not changed[10]) and (text_num == 2 and text_id == 1):182            # dress_types183            predefined_embeddings = model.encode(dress_types)184            similarities = util.dot_score(user_embeddings,185                                          predefined_embeddings)186            similarity_skirt = util.dot_score(user_embeddings,187                                              model.encode(skirt_types))188            if similarities[0][0] > 0.5 and similarities[0][189                    0] > similarity_skirt[0][0]:190                attr[10] = 1191                attr[7] = 0192                attr[8] = 0193                attr[9] = 0194                attr[11] = 0195                attr[12] = 0196 197                changed[0] = 1198                changed[10] = 1199                changed[7] = 1200                changed[8] = 1201                changed[9] = 1202                changed[11] = 1203                changed[12] = 1204 205        if (not changed[12]) and (text_num == 2 and text_id == 1):206            # rompers_types207            predefined_embeddings = model.encode(rompers_types)208            similarities = util.dot_score(user_embeddings,209                                          predefined_embeddings)210            max_similarity = torch.max(similarities).item()211            if max_similarity > 0.6:212                attr[12] = 1213                attr[7] = 0214                attr[8] = 0215                attr[9] = 0216                attr[10] = 0217                attr[11] = 0218 219                changed[12] = 1220                changed[7] = 1221                changed[8] = 1222                changed[9] = 1223                changed[10] = 1224                changed[11] = 1225 226        if (not changed[7]) and (text_num > 2 and text_id == 1):227            # upper_types228            predefined_embeddings = model.encode(upper_types)229            similarities = util.dot_score(user_embeddings,230                                          predefined_embeddings)231            max_similarity = torch.max(similarities).item()232            if max_similarity > 0.6:233                attr[7] = 1234                changed[7] = 1235 236        if (not changed[8]) and (text_id == 3):237            # outer_types238            predefined_embeddings = model.encode(outer_types)239            similarities = util.dot_score(user_embeddings,240                                          predefined_embeddings)241            arg_idx = torch.argmax(similarities).item()242            if similarities[0][arg_idx] > 0.7:243                attr[6] = outer_shape_attr[outer_shape_text[arg_idx]]244                attr[8] = 1245                changed[8] = 1246 247        if (not changed[9]) and (text_num > 2 and text_id == 2):248            # skirt_types249            predefined_embeddings = model.encode(skirt_types)250            similarity_skirt = util.dot_score(user_embeddings,251                                              predefined_embeddings)252            similarity_dress = util.dot_score(user_embeddings,253                                              model.encode(dress_types))254            if similarity_skirt[0][0] > 0.7 and similarity_skirt[0][255                    0] > similarity_dress[0][0]:256                attr[9] = 1257                attr[10] = 0258                changed[9] = 1259                changed[10] = 1260 261        if (not changed[11]) and (text_num > 2 and text_id == 2):262            # pant_types263            predefined_embeddings = model.encode(pant_types)264            similarities = util.dot_score(user_embeddings,265                                          predefined_embeddings)266            max_similarity = torch.max(similarities).item()267            if max_similarity > 0.6:268                attr[11] = 1269                attr[9] = 0270                attr[10] = 0271                attr[12] = 0272                changed[11] = 1273                changed[9] = 1274                changed[10] = 1275                changed[12] = 1276 277    return human_attr + attr278 279 280def generate_texture_attributes(user_text):281    parsed_texts = user_text.split(',')282 283    attr = []284    for text in parsed_texts:285        if ('pure color' in text) or ('solid color' in text):286            attr.append(4)287        elif ('spline' in text) or ('stripe' in text):288            attr.append(3)289        elif ('plaid' in text) or ('lattice' in text):290            attr.append(5)291        elif 'floral' in text:292            attr.append(1)293        elif 'denim' in text:294            attr.append(0)295        else:296            attr.append(17)297 298    if len(attr) == 1:299        attr.append(attr[0])300        attr.append(17)301 302    if len(attr) == 2:303        attr.append(17)304 305    return attr306 307 308if __name__ == "__main__":309    user_request = input('Enter your request: ')310    while user_request != '\\q':311        attr = generate_shape_attributes(user_request)312        print(attr)313        for attr_name, attr_value in zip(attr_names_list, attr):314            print(attr_name, attr_value)315        user_request = input('Enter your request: ')316