Skip to content

Processo de Classificação com CLIP

1. Gerando Embeddings

Embeddings de Texto

Pega a lista de prompts

txt_list = [
    "a photo of a white man",
    "a photo of a white woman",
    "a photo of a black man", 
    "a photo of a black woman",
    ...
]

Concatena a lista dos prompts "tokenizados":

text_inputs = torch.cat([tokenizer(c) for c in txt_list])

Codifica a lista usando o modelo:

text_features = model.encode_text(text_inputs)

Normaliza a lista(?):

text_features /= text_features.norm(dim=-1, keepdim=True)

Embeddings de imagem

Abre a imagem com Pillow e pre-processa:

img = Image.open(filepath)
img_input = model_preprocessing(img).unsqueeze(0)

Codifica a imagem usando o modelo:

image_features = model.encode_image(img_input)

Normaliza a imagem (?):

image_features /= image_features.norm(dim=-1, keepdim=True)

2. Pegando as similaridades

img_similarity = 100 * image_features @ text_features.T

Relaciona cada prompt com o seu "score" de similaridade:

for label, score in zip(txt_prompts, img_similarity[0]):
    sim_dict[label] = score.cpu().numpy().item()

Resultado:

{
    "image.jpg": {
        "a photo of a white man": 20.84195327758789,
        "a photo of a white woman": 13.337924003601074,
        "a photo of a black man": 16.401159286499023,
        "a photo of a black woman": 9.255730628967285,
        "a photo of a latino hispanic man": 22.144479751586914,
        "a photo of a latino hispanic woman": 14.342647552490234,
        "a photo of an east asian man": 24.513031005859375,
        "a photo of an east asian woman": 16.19273567199707,
        "a photo of a southeast asian man": 26.074390411376953,
        "a photo of a southeast asian woman": 17.766008377075195,
        "a photo of an indian man": 17.086769104003906,
        "a photo of an indian woman": 8.459698677062988,
        "a photo of a middle eastern man": 18.602418899536133,
        "a photo of a middle eastern woman": 10.164729118347168
    }
}

3. Realizando Predições

Com base no dicionário de similaridades acima, realiza os procedimentos abaixo para cada uma das imagens.

Average Sum

Primeiro cria um dicionário de pontuações vazio com cada raça:

race_dict = {
    "White": 0,
    "Black": 0,
    "Indian": 0,
    "Latino_Hispanic": 0,
    "Southeast Asian": 0,
    "East Asian": 0,
    "Middle Eastern": 0
}

Identifica a raça correspondente e soma os "scores" de similaridade:

for prompt, sim_score in sims_dict:
    race_label = get_race_from_prompt(prompt)
    race_dict[race_label] += sim_score

pega o maior valor e salva como a predição:

prediction = max(race_dict, key=race_dict.get)

Top K

Primeiro cria um dicionário de pontuações e um dicionário de scores por raça.

race_dict = {
    "White": 0,
    "Black": 0,
    "Indian": 0,
    "Latino_Hispanic": 0,
    "Southeast Asian": 0,
    "East Asian": 0,
    "Middle Eastern": 0
}

race_list = {
    "White": [],
    "Black": [],
    "Indian": [],
    "Latino_Hispanic": [],
    "Southeast Asian": [],
    "East Asian": [],
    "Middle Eastern": []
}

Indentifica a raça e salva seu score na lista correspondente:

for prompt, sim_score in sims_dict:
    race_label = get_race_from_prompt(prompt)
    race_list[race_label].append(sim_score)

Para cada uma das raças, ordena a lista de scores em ordem decrescente e soma os top K valores:

for race in race_dict:
    scores = sorted(race_list[race], reverse=True)
    race_dict[race] = sum(scores[:k])

pega o maior valor e salva como a predição:

prediction = max(race_dict, key=race_dict.get)