项目链接:https://aistudio.baidu.com/aistudio/projectdetail/1356088
一、前言
想染头发不知道染什么颜色好看?想买衣服却不知道买哪个颜色适合自己......
别担心,PaddleHub帮你安排!
PaddleHub旨在为开发人员提供丰富,高质量,可直接使用的预训练模型。无需深度学习背景便可以快速使用AI模型,模型涵盖图像,文本,音频和视频的4个主要类别,并支持一键式预测,轻松的服务部署和迁移学习,所有模型都是开源的,可以在离线情况下免费下载和使用。
二、实现效果
背景换色 | 上衣换色 | 头发换色(其他的效果自己试吧)(不能上传动态图呀)
三、ace2p模型介绍
模型链接
https://www.paddlepaddle.org.cn/hubdetail?name=ace2p&en_category=ImageSegmentation
模型概述
人体解析(Human Parsing)是细粒度的语义分割任务,其旨在识别像素级别的人类图像的组成部分(例如,身体部位和服装)。ACE2P通过融合底层特征,全局上下文信息和边缘细节,端到端地训练学习人体解析任务。该结构针对Intersection over Union指标进行针对性的优化学习,提升准确率。以ACE2P单人人体解析网络为基础的解决方案在CVPR2019第三届LIP挑战赛中赢得了全部三个人体解析任务的第一名。该PaddleHub Module采用ResNet101作为骨干网络,接受输入图片大小为473x473x3。
API说明
def segmentation(images=None,
paths=None,
batch_size=1,
use_gpu=False,
output_dir='ace2p_output',
visualization=False):
预测API,用于图像分割得到人体解析。
参数
* images (list[numpy.ndarray]): 图片数据,ndarray.shape 为 [H, W, C],BGR格式;
* paths (list[str]): 图片的路径;
* batch_size (int): batch 的大小;
* use_gpu (bool): 是否使用 GPU;
* output_dir (str): 保存处理结果的文件目录;
* visualization (bool): 是否将识别结果保存为图片文件。
返回
* res (list[dict]): 识别结果的列表,列表中每一个元素为 dict,关键字有'path', 'data',相应的取值为:
* path (str): 原输入图片的路径;
* data (numpy.ndarray): 图像分割得到的结果,shape 为H * W,元素的取值为0-19,表示每个像素的分类结果,映射顺序与下面的调色板相同。
实现代码
import cv2
import os
import imageio
import numpy as np
import paddlehub as hub
from random import randrange
import matplotlib.image as mpimg
# 原图片
image = 'xiaojiejie.jpg'
# 输出的文件夹名称
output = 'output'
# 生成多少张图片
image_num = 8
# gif的图片名
gif_name = 'background.gif'
# 自己设定颜色
colors = {
'background': '#000000',
'hat': '#800000',
'hair': '#008000',
'glove': '#808000',
'sunglasses': '#000080',
'upperclothes': '#800080',
'dress': '#008080',
'coat': '#808080',
'socks': '#400000',
'pants': '#c00000',
'jumpsuits': '#408000',
'scarf': '#c08000',
'skirt': '#400080',
'face': '#c00080',
'left-arm': '#408080',
'right-arm': '#c08080',
'left-leg': '#004000',
'right-leg': '#804000',
'left-shoe': '#00c000',
'right-shoe': '#80c000',
}
# 随机颜色
def get_random_color():
return (randrange(0, 255, 1), randrange(0, 255, 1), randrange(0, 255, 1))
def color_str_to_list(color_str):
return [int(color_str[1:3], 16), int(color_str[3:5], 16), int(color_str[5:7], 16)]
def change_color(origin_img, mask_img, label, color=None):
label_mask = mask_img.copy()
result = origin_img.copy()
alpha = 0.9
label_mask[np.where((label_mask != color_str_to_list(colors[label])).any(axis=2))] = [0, 0, 0]
if not color:
color = color_str_to_list(colors[label])
pos = np.where((label_mask == color_str_to_list(colors[label])).all(axis=2))
for i, j in zip(pos[0], pos[1]):
result[i][j] = alpha * origin_img[i][j] + (1 - alpha) * np.array(color)
return result
def save_image(i,final):
name = os.path.join('/home/aistudio/', output, str(i) + '.png')
mpimg.imsave(name, final)
human_parser = hub.Module(name="ace2p")
result = human_parser.segmentation(images=[cv2.imread(image)],visualization=True)
# 原图片
origin = cv2.imread(image, -1)
# 切割的图片
path = os.path.join('/home/aistudio/ace2p_output/',result[0]['path'][0:-3] + 'png')
mask = cv2.imread(path, -1)
# get_random_color随机生成颜色,去掉之后即按照colors的颜色生成
if not os.path.exists(output):
os.mkdir(output)
for i in range(image_num):
final = change_color(origin, mask, 'background', get_random_color())
final = cv2.cvtColor(final, cv2.COLOR_BGRA2RGBA)
save_image(i,final)
# 需要合在一起的图片
image_list = ['output/' + str(x) + ".png" for x in range(0, image_num)]
frames = []
for image_name in image_list:
frames.append(imageio.imread(image_name))
# druation : 图片切换的时间,单位秒
imageio.mimsave(gif_name, frames, 'GIF', duration=0.8)
okok 等周日
你可以编辑一下
我以为是让写这个 没想到是让写文章 等周日在改把 咳咳
666
欢迎建哥
来了姐
帅呆了。
快帮我回个贴,挽尊啊
啊 是说故事啊 我以为说项目emmmmmmmmmmmmm
666啊,但是七年同学你是不是发错地方了,哈哈哈
欢迎各位大佬前来踩!