项目链接: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啊,但是七年同学你是不是发错地方了,哈哈哈
欢迎各位大佬前来踩!