选择困难症患者的福音!PaddleHub帮你任意搭配你想要的颜色!

原创
2020/12/26 16:31
阅读数 1.6K

目录

下载安装命令

## CPU版本安装命令
pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle

## GPU版本安装命令
pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu

选择困难症患者的福音!PaddleHub帮你任意搭配你想要的颜色!

一、前言(项目链接在最后)

想染头发不知道染什么颜色好看?想买衣服却不知道买哪个颜色适合自己…

别担心,PaddleHub帮你安排!

PaddleHub旨在为开发人员提供丰富,高质量,可直接使用的预训练模型。无需深度学习背景便可以快速使用AI模型,模型涵盖图像,文本,音频和视频的4个主要类别,并支持一键式预测,轻松的服务部署和迁移学习,所有模型都是开源的,可以在离线情况下免费下载和使用。

PaddleHub: https://www.paddlepaddle.org.cn/hub

二、实现效果

背景换色 | 上衣换色 | 头发换色(其他的效果自己试吧)



三、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

五、安装新版本Hub

!pip install PaddleHub==2.0.0b1

六、配置参数

# 原图片
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)

九、生成gif

# 需要合在一起的图片
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)

项目链接:选择困难症患者的福音!PaddleHub帮你任意搭配你想要的颜色!

下载安装命令

## CPU版本安装命令
pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle

## GPU版本安装命令
pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu

本文同步分享在 博客“七年期限”(CSDN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部