颜值打分系统

颜值打分系统

最近,华南理工大学发布了一个颜值数据库

[SCUT-FBP5500]( SCUT-FBP500),数据集共有5500个人,分值在1~5之间

数据库下载地址:


我将利用keras建立一个基于深度学习的颜值打分系统,不同于图像分类任务,颜值打分是一个回归任务,不能直接利用keras自带的ImageDatagenerator产生迭代器给模型喂数据,我们将实现一个类似的迭代器


__author__ = 'lzy'
# image_input.py

import cv2
from keras.utils import Sequence
import math
import numpy as np
from random import shuffle, randint

import os


class SequenceData(Sequence):
    def __init__(self, file_list, batch_size, target_size, mode='caffe'):
        self.file_list = file_list
        self.batch_size = batch_size
        self.target_size = target_size
        self.mode = mode

    def __len__(self):
        num_imgs = len(self.file_list)
        return math.ceil(num_imgs / self.batch_size)

    def __getitem__(self, idx):
        file_sub_list = self.file_list[idx*self.batch_size : (idx+1)*self.batch_size]
        batch_x = np.array([self.read_img(file[0]) for file in file_sub_list])
        batch_y = np.array([file[1] for file in file_sub_list], dtype=np.float32)
        return batch_x, batch_y

    def read_img(self, file_name):
        file_path = os.path.join('data/Images', file_name)
        try:
            img = cv2.imread(file_path)
            img = cv2.resize(img, self.target_size)
            # 象征性的做一点数据增广
            # 随机对图像进行数据翻转
            if randint(0, 1):
                img = img[:, ::-1, :]
            img = np.array(img, dtype=np.float32)
            if self.mode == 'caffe':
                img[:, :, 0] -= 103.939
                img[:, :, 1] -= 116.779
                img[:, :, 2] -= 123.68
            elif self.mode == 'tf':
                img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
                img = img / 127.5 - 1.0


        except Exception as e:
            print(e)
        else:
            return img


def read_file_list(train_test_split_ratio=0.8):
    with open('data/train_test_files/SCUT-FBP5500.txt', 'r') as f:
        file_list = f.read()

    file_list = file_list.split('\n')[:-1]
    file_list = [file.split(' ') for file in file_list]
    # 将颜值分数归一化到[0, 1]之间
    file_list = [(file[0], 0.2 * float(file[1])) for file in file_list]
    shuffle(file_list)
    train_len = int(len(file_list) * train_test_split_ratio)
    train_file_list = file_list[:train_len]
    test_file_list = file_list[train_len:]
    return train_file_list, test_file_list


if __name__ == '__main__':
    read_file_list()


keras已经提供了好多个在Imagenet上训练过的模型,我们将采用这些预训练模型来建议一个颜值打分系统


__author__ = 'lzy'

import tensorflow as tf
from keras.applications import ResNet50
from keras import optimizers
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.callbacks import EarlyStopping, ReduceLROnPlateau, ModelCheckpoint
from keras.backend.tensorflow_backend import set_session
import math
import os

from image_input import SequenceData, read_file_list

# 指定gpu和显存占用, stupid tensorflow
os.environ['CUDA_VISIBLE_DEVICES'] = '1'
config = tf.ConfigProto()
config.gpu_options.allow_growth = True
set_session(tf.Session(config=config))


batch_size = 32
target_size = (224, 224)

# 这个例子中我们采用resnet50作为base network
resnet = ResNet50(include_top=False, pooling='avg')
resnet.trainable = False
model = Sequential()
model.add(resnet)
model.add(Dropout(0.5))   # 加个dropout防止过拟合
model.add(Dense(1, activation='sigmoid'))  # 增加一层给颜值打分,激活函数选择为sigmoid保证输出在[0, 1]之间
print(model.summary())
model.compile(optimizer=optimizers.SGD(lr=0.001), loss='mse')

callbacks = [EarlyStopping(monitor='val_loss',
                           patience=5,
                           verbose=1,
                           min_delta=1e-4),
             ReduceLROnPlateau(monitor='val_loss',
                               patience=3,
                               factor=0.1,
                               epsilon=1e-4),
             ModelCheckpoint(monitor='val_loss',
                             filepath='weights/resnet50_weights.hdf5',
                             save_best_only=True,
                             save_weights_only=True)]

train_file_list, test_file_list = read_file_list()
train_steps_per_epoch = math.ceil(len(train_file_list) / batch_size)
test_steps_per_epoch = math.ceil(len(test_file_list) / batch_size)

train_data = SequenceData(train_file_list, batch_size, target_size)
test_data = SequenceData(test_file_list, batch_size, target_size)

model.fit_generator(train_data,
                    steps_per_epoch=train_steps_per_epoch,
                    epochs=30,
                    verbose=1,
                    callbacks=callbacks,
                    validation_data=test_data,
                    validation_steps=test_steps_per_epoch,
                    use_multiprocessing=True)


训练结束就来测试一下吧



先搞一张大幂幂的头像来评一下:

竟然得到了4.29这么高的分数


再来试试你们都爱的gakki

哎,老婆只得到了3.76分,输给了大幂幂,这个系统一定把欧派也考虑进去了,不正经


最后再来看看我自己能得多少分

哎,只能告诉你们我和吴彦祖的平均分是3.53,搞什么搞嘛

资讯网父爱作文三年级做seo优化公司优化吉祥物的设计网站401周公解梦查询大全梦见网络推广seo教程周公解梦梦见牙掉了好几个混种手机页面seo优化外贸多语言网站建设美好寓意的成语可起名字固态硬盘寿命大樱桃在北方能种吗长白山种人参解红楼梦周公解梦敌人苏州个人网站制作百度推广网站制作关于雪的作文450起名需要注意什么周易卦象测出名字山海经纪行青岛生辰八字算命淘宝seo怎么推广上海专业seo优化金华网站建设企业防腐木起名大全网站设计师招聘网安装工程有限公司起名大全海安网站优化少年生前被连续抽血16次?多部门介入两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”淀粉肠小王子日销售额涨超10倍高中生被打伤下体休学 邯郸通报单亲妈妈陷入热恋 14岁儿子报警何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言张家界的山上“长”满了韩国人?男孩8年未见母亲被告知被遗忘中国拥有亿元资产的家庭达13.3万户19岁小伙救下5人后溺亡 多方发声315晚会后胖东来又人满为患了张立群任西安交通大学校长“重生之我在北大当嫡校长”男子被猫抓伤后确诊“猫抓病”测试车高速逃费 小米:已补缴周杰伦一审败诉网易网友洛杉矶偶遇贾玲今日春分倪萍分享减重40斤方法七年后宇文玥被薅头发捞上岸许家印被限制高消费萧美琴窜访捷克 外交部回应联合利华开始重组专访95后高颜值猪保姆胖东来员工每周单休无小长假男子被流浪猫绊倒 投喂者赔24万小米汽车超级工厂正式揭幕黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发当地回应沈阳致3死车祸车主疑毒驾恒大被罚41.75亿到底怎么缴妈妈回应孩子在校撞护栏坠楼外国人感慨凌晨的中国很安全杨倩无缘巴黎奥运校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变王树国卸任西安交大校长 师生送别手机成瘾是影响睡眠质量重要因素国产伟哥去年销售近13亿阿根廷将发行1万与2万面值的纸币兔狲“狲大娘”因病死亡遭遇山火的松茸之乡“开封王婆”爆火:促成四五十对奥巴马现身唐宁街 黑色着装引猜测考生莫言也上北大硕士复试名单了德国打算提及普京时仅用姓名天水麻辣烫把捣辣椒大爷累坏了

资讯网 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化