我有一个魔(mo)镜(xing),能告诉你是不是世界上最美|帅的人

Facial Beauty Prediction

模型很简单,重要的是训练数据,在此感谢A Diverse Benchmark Dataset for Multi-Paradigm Facial Beauty Prediction 打分标准:0~5,应该是开区间吧,不然得0分的怎么办,比如我。。。 简单说下我使用的模型

  • 按照论文说明,使用效果最好的训练好的resnet50
  • 最后接一层linear输出分数,使用Relu作为激活函数
  • 损失函数使用SmoothL1Loss,在我这里效果优于MSEloss,前期更快收敛(猜测,无证明)

贴下代码

模型

class Beauty(nn.Module):
    def __init__(self):
        super().__init__()

        self.resnet = resnet50(True)
        self.predict = nn.Linear(1000, 1)

        self._reset_parameters()

    def forward(self, x):
        out = nn.functional.relu(self.resnet(x))
        score = self.predict(out)
        return score

    def _reset_parameters(self):
        for p in self.resnet.parameters():
            p.requires_grad = False

        self.predict.weight.data.uniform_(-.1, .1)

    def get_trainable_parameters(self):
        return filter(lambda m: m.requires_grad, self.parameters())

预测

class Predict:
    def __init__(self):
        model_source = torch.load(
            "./model.pt", map_location=lambda storage, loc: storage)
        model = Beauty()
        model.load_state_dict(model_source["model"])
        model.eval()
        self.model = model

        self.encode = T.Compose([
            T.Resize(224),
            T.ToTensor()
        ])

    def img2V(self, img):
        t = self.encode(Image.open(img).convert('RGB')).unsqueeze(0)
        return Variable(t, volatile=True)

    def divine(self, img):
        v = self.img2V(img)
        score = self.model(v)

        return round(score.data.tolist()[0][0], 3)

预测效果

  • 吴彦祖 4.251分

pic

  • 来个我同学(已征得同意) 2.298分

pic

Nevermore Written by:

步步生姿,空锁满庭花雨。胜将娇花比。