最近一段时间做图像挖掘的3个经验mark一下【人脸、全图、形体】

1.判断一个人颜值好看不好看,截取“人脸部分”去训练模型,比整图要好。(这里贴下seetaface取人脸特征的脚本,部分函数是小伙伴写的)

关键词:颜值,人脸部分

import os
os.environ["CUDA_VISIBLE_DEVICES"]="-1" #不使用gpu
import tensorflow as tf

#配置seetaface
sys.path.append('./seetaface')
from seetaface.api import *
init_mask = FACE_DETECT|LANDMARKER5|FACE_GENDER|LANDMARKER68|LANDMARKER_MASK|FACERECOGNITION
stf = SeetaFace(init_mask)
stf.SetProperty(DetectProperty.PROPERTY_MIN_FACE_SIZE, 40)
stf.SetProperty(DetectProperty.PROPERTY_THRESHOLD, 0.9)

#配置颜值打分的模型
mm = keras.models.load_model("./nn_model/0001xxx")
def extract_feature(img):
    '''
    返回最大人脸的seetaface结果
    '''
    faces = stf.Detect(img)
    if faces.size < 1:
        return np.array([]), '', 0.0
    max_face_index = 0
    max_face_size = faces.data[0].pos.width * faces.data[0].pos.height
    for i in range(faces.size):
        tmp = faces.data[i].pos.width * faces.data[i].pos.height
        if tmp > max_face_size:
            max_face_size = tmp
            max_face_index = i
    mark5 = stf.mark5(img, faces.data[max_face_index].pos)
    feature = stf.Extract(img, mark5)
    gender = stf.PredictGenderWithCrop(img, mark5)
    face_ratio = faces.data[max_face_index].pos.width * faces.data[max_face_index].pos.height / (img.shape[0] * img.shape[1])
    #rect = faces.data[max_face_index].pos
    #face_img = img[rect.y:rect.y + rect.height, rect.x:rect.x + rect.width]
    #feature = stf.ExtractCroppedFace(face_img)
    return np.array(list(feature)), 'male' if gender == 0 else 'female', face_ratio

def variance_of_laplacian(image):
    '''
    计算图像的laplacian响应的方差,反应图片的清晰程度
    '''
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    return cv2.Laplacian(gray, cv2.CV_64F).var()
    
def img2beauty(img):
    img = np.uint8(img)
    img_bgr = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)#进来的rgb转bgr
    fea, pred_gender, face_ratio = extract_feature(img_bgr)
    fm = variance_of_laplacian(img_bgr)
    if fea.size != 0 and face_ratio > 0.02:
        score = round(float(mm.predict(fea.reshape(-1, 1024))[0]), 3)
        return pred_gender, face_ratio, score, fm
    else:
        return "-",face_ratio,0.0,fm
2.照片的“整图”在判断场景之类的比较好用。

关键词:整图,人物环境

比如人在健身房、卫生间、电梯间、户外山水、绿地、车里、街景、戴墨镜、戴口罩、带帽子等。(这里贴一下用看下imagenet倒数第二层2048维,pca后,聚类看效果的脚本)

import os
os.environ['CUDA_VISIBLE_DEVICES']='2'
mem_limit = 10000
import tensorflow as tf
physical_devices = tf.config.experimental.list_physical_devices('GPU')
tf.config.experimental.set_virtual_device_configuration(physical_devices[0],[tf.config.experimental.VirtualDeviceConfiguration(memory_limit=mem_limit)])

from keras.applications.resnet50 import ResNet50
from keras.preprocessing import image
from keras.applications.resnet50 import preprocess_input, decode_predictions
import numpy as np

#====1.看下imagenet倒数第二层2048维的效果
model = ResNet50(weights='imagenet')

from keras.models import Model
base_model = model
model_1 = Model(inputs=base_model.input, outputs=base_model.get_layer('avg_pool').output)

def path_to_array(img_path):
    img = image.load_img(img_path, target_size=(224, 224))
    x = image.img_to_array(img)
    x = np.expand_dims(x, axis=0)
    x = preprocess_input(x)
    preds = model_1.predict(x)
    return preds[0]

path_dir = "/var/data/xxx/"
list_file = os.listdir(path_dir)

res_file = "/var/data/xxx_txt"
with open(res_file, "w+") as res_f:
    for x in list_file:
        img_path = path_dir + x
        res  = x + "\t" + str(path_to_array(img_path).tolist()) + "\n"
        res_f.write(res)

#====2.得到了2048维度,pca加聚类看下效果
import numpy as np
with open("/var/data/xxx_txt", "r+") as f:
    res_lines = f.readlines()

# user_vec = [eval(item.split("\t")[1].strip("\n")) for item in res_lines]
user_vec = []
user_id = []
for line in res_lines:
    items = line.split("\t")
    feav = [float(x) for x in items[2].strip("\n").split(",")]
    uid = items[0]
    if feav != []:
        user_vec.append(feav)
        user_id.append(uid)
user_nparr = np.array(user_vec)

from sklearn.decomposition import PCA
pca = PCA(n_components=100)
pca.fit(user_nparr)
print(pca.explained_variance_ratio_)
print(pca.explained_variance_)

user_nparr_new = pca.transform(user_nparr)
from sklearn.cluster import KMeans
model = KMeans(n_clusters=50)
model.fit(user_nparr_new)
#model.fit(user_nparr)
yhat = model.predict(user_nparr_new)
#yhat = model.predict(user_nparr)

#======3.显示图片
import matplotlib.pyplot as plt # plt 用于显示图片
import matplotlib.image as mpimg # mpimg 用于读取图片

#返回每一个簇的前35张图片plt
def index_img(i):
    index_i = np.where(yhat==i)[0]
    user_i = [user_id[id] for id in index_i]
    print(user_i[0])
    user_pic = user_i[0:35]
    N=6
    M=6
    plt.figure(figsize=(30, 30))
    for i in range(len(user_pic)):
        path="/var/data/xxx/" + user_pic[i] + ".jpg"
        img = plt.imread(path)
        plt.subplot(N,M,i+1)#表示第i张图片,下标只能从1开始,不能从0,
        plt.imshow(img)
        #下面两行是消除每张图片自己单独的横纵坐标,不然每张图片会有单独的横纵坐标,影响美观
        plt.xticks([])
        plt.yticks([])
    plt.show()
for i in range(50):
    print(i)
    index_img(i)

3.照片的“人脸部分”在体型胖瘦还算比较好用,整图不行,这里代码就不贴了,参见第一部分

但是不知道利用姿态估计提取特征好不好使,还没试

关键词:人脸部分,体型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值