我用飞桨帮助选择困难症患者进行搭配
七年期限 发布于2021-01 浏览:4397 回复:11
0
收藏
最后编辑于2022-04

项目链接: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)

 

收藏
点赞
0
个赞
共11条回复 最后由用户已被禁言回复于2022-04
#12七年期限回复于2021-01
#11 doubi渣渣回复
你可以编辑一下

okok  等周日

0
#11doubi渣渣回复于2021-01
#10 七年期限回复
我以为是让写这个  没想到是让写文章 等周日在改把  咳咳

你可以编辑一下

0
#10七年期限回复于2021-01
#9 doubi渣渣回复
666

我以为是让写这个  没想到是让写文章 等周日在改把  咳咳

0
#9doubi渣渣回复于2021-01
#7 七年期限回复
来了姐

666

0
#8七年期限回复于2021-01
#6 JavaRoom回复
帅呆了。

欢迎建哥

0
#7七年期限回复于2021-01
#5 doubi渣渣回复
快帮我回个贴,挽尊啊

来了姐

0
#6JavaRoom回复于2021-01

帅呆了。

0
#5doubi渣渣回复于2021-01

快帮我回个贴,挽尊啊

0
#4七年期限回复于2021-01
#3 doubi渣渣回复
666啊,但是七年同学你是不是发错地方了,哈哈哈

啊  是说故事啊  我以为说项目emmmmmmmmmmmmm

0
#3doubi渣渣回复于2021-01

666啊,但是七年同学你是不是发错地方了,哈哈哈

0
#2七年期限回复于2021-01

欢迎各位大佬前来踩!

0
TOP
切换版块