19

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

 3 years ago
source link: https://my.oschina.net/u/4067628/blog/4867317
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
下载安装命令

## 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)。
如有侵权,请联系 [email protected] 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK