Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

人像模型预测结果锯齿问题 #390

Closed
yanchaoguo opened this issue Nov 9, 2020 · 14 comments
Closed

人像模型预测结果锯齿问题 #390

yanchaoguo opened this issue Nov 9, 2020 · 14 comments

Comments

@yanchaoguo
Copy link

咱们官方提供的人像语义分割模型 predict后获得的掩码图像存在锯齿问题,请问如何去除,让边缘变得平滑一些,
我之前也测试过paddlehub模型,输出的掩码模型不是只有0和1两个label,且预测结果无锯齿问题

paddlex 人像模型地址

@jiangjiajun
Copy link
Collaborator

#228 (comment) 参考此issue,预测结果有锯齿,应该跟transforms的定义有关,可以将输入图像的shape设得更大,来优化锯齿的问题。
对应于你这里下载的模型,可以修改下载解压后目录中的model.yml下的target_size参数,目前是512*512,可以根据自己的实际图片输入情况和显存情况,设得更大

Model: DeepLabv3p
Transforms:
- Resize:
    interp: LINEAR
    target_size:
    - 512
    - 512

锯齿可能原因如下:

  1. 模型预测前,需要将原图resize到512 * 512
  2. 预测后,再将512*512的结果resize成原图大小,放大的过程可能会带来锯齿

@yanchaoguo
Copy link
Author

#228 (comment) 参考此issue,预测结果有锯齿,应该跟transforms的定义有关,可以将输入图像的shape设得更大,来优化锯齿的问题。
对应于你这里下载的模型,可以修改下载解压后目录中的model.yml下的target_size参数,目前是512*512,可以根据自己的实际图片输入情况和显存情况,设得更大

Model: DeepLabv3p
Transforms:
- Resize:
    interp: LINEAR
    target_size:
    - 512
    - 512

锯齿可能原因如下:

  1. 模型预测前,需要将原图resize到512 * 512
  2. 预测后,再将512*512的结果resize成原图大小,放大的过程可能会带来锯齿

找了一张图片进行测试,并将官方模型对应model.yml下的target_size调成与图片大小对应的size,锯齿效果依然很明显,和paddlehub提供的人像分隔模型效果差的有点远

另外为什么paddlehub预测得到的掩码范围是0-255的 我们只有0和1呢?

image

@jiangjiajun
Copy link
Collaborator

预测的掩码是0-1, 其中0和1即为分类结果,0表示该像素点分为背景,1表示该像素点被分为人体。这个0或1是根据预测的score进行判断,在paddlex中语义分割模型结果包含了label_mapscore_map

对应于这里的人像分割,label_map即为0或1的掩码,而score_map为每个像素点的分类置信度。在PaddleHub中是将score_map映射到0-255。

当前你这里提到预测效果不佳的问题,可以确认下是否是因为PaddleHub展示的是score_map的原因

@yanchaoguo
Copy link
Author

预测的掩码是0-1, 其中0和1即为分类结果,0表示该像素点分为背景,1表示该像素点被分为人体。这个0或1是根据预测的score进行判断,在paddlex中语义分割模型结果包含了label_mapscore_map

对应于这里的人像分割,label_map即为0或1的掩码,而score_map为每个像素点的分类置信度。在PaddleHub中是将score_map映射到0-255。

当前你这里提到预测效果不佳的问题,可以确认下是否是因为PaddleHub展示的是score_map的原因

paddlehub效果是可以的 ,我在paddlex中直接使用的是label_map的结果 这里只有0和1 我将0的部分移除后 图像的锯齿效果会比较明显,这里按照您的处理 我应该怎么处理score_map会得到一个比较理想的0-255范围的掩码数据呢?

@jiangjiajun
Copy link
Collaborator

给一张你测试的用例图我试试

@yanchaoguo yanchaoguo reopened this Nov 9, 2020
@jiangjiajun
Copy link
Collaborator

这里你是用的bg_replace.py这个脚本的测试吗,使用这个脚本进行背景替换时,需注意设置image_shape参数
例如如下命令默认是使用192*192的大小输入到模型中,因此锯齿感会较严重【如下面第一张图结果】

python bg_replace.py --model_dir humanseg_server_inference --image_path data/human_image.jpg --background_image_path data/background.jpg

通过修改image_shape,我们可以加大输入的大小,从而得到更好的效果,效果图如图2

python bg_replace.py --model_dir humanseg_server_inference --image_path data/human_image.jpg --background_image_path data/background.jpg --image_shape 1024 1024

image

image

@yanchaoguo
Copy link
Author

yanchaoguo commented Nov 9, 2020

这是我通过官网模型测试代码
import paddlex as pdx
import cv2

模型地址:https://bj.bcebos.com/paddlex/examples/human_seg/models/humanseg_server_params.tar

model = pdx.load_model('C:/Users/bigdata/Downloads/humanseg_server_params')

image_name = 'd:/tmp/qbs.jpg'
result = model.predict(image_name)
pdx.seg.visualize(image_name, result, weight=0.0, save_dir='output')

r ,c = result['label_map'].shape
src = cv2.imread(image_name)
src = cv2.cvtColor(src, cv2.COLOR_BGR2BGRA)
for i in range(r):
for j in range(c):
if result['label_map'][i][j] == 0:
src[i][j][0] = 255
src[i][j][1] = 255
src[i][j][2] = 255
src[i][j][3] = 0

cv2.imwrite('output/tmp.jpg', src)

原图:

image

结果图:

image

##使用paddlehub预测结果:无锯齿问题
image

@jiangjiajun
Copy link
Collaborator

PaddleHub的原理是,模型预测出结果后,将预测的score_map转成0-255的值,并且作为alpha通道添加到原图上,保存成4通道的图,因此看起来会更柔和,我这里将下载的模型中model.yml作一下修改,删除里面的Resize部分,这样可以原图输入不作Resize进行预测

model.ymlTransforms部分改成如下所示

Transforms:
- Normalize:
    mean:
    - 0.5
    - 0.5
    - 0.5
    std:
    - 0.5
    - 0.5
    - 0.5
TransformsMode: BGR

预测时采用如下示例代码

import paddlex as pdx
import numpy as np
import copy
import cv2
model = pdx.load_model('humanseg_server_inference')

image_name = 'test.png'
result = model.predict(image_name)

score_map = (result['score_map'][:, :, 1] * 255).astype('uint8')
score_map = np.expand_dims(score_map, axis=2)

# 生成新图
im = cv2.imread(image_name)
rgba = np.concatenate((im, score_map), axis=2)

cv2.imwrite("result.png", rgba.astype('int32'))

最终预测效果即为你上图所示
image

@yanchaoguo
Copy link
Author

yanchaoguo commented Nov 9, 2020

import paddlex as pdx
import cv2
import numpy as np
import matplotlib.pyplot as plt 

def process(logit, shape):
        thresh = 120
        logit = logit * 255
        logit = cv2.resize(logit, shape)
        logit -= thresh
        logit[logit < 0] = 0
        logit = 255 * logit / (255 - thresh)
        return logit.astype('uint8')

# 模型地址:https://bj.bcebos.com/paddlex/examples/human_seg/models/humanseg_server_params.tar
#model = pdx.load_model('C:/Users/bigdata/Downloads/humanseg_server_params')
model = pdx.load_model('d:/tmp/models/deeplab/best_model/')
image_name = 'd:/tmp/qbs.jpg'
result = model.predict(image_name)
pdx.seg.visualize(image_name, result, weight=0.0, save_dir='output') 
#score_map = (result['score_map'][:, :, 1] * 255).astype('uint8')  #将背景部分score转换为0-244

im = cv2.imread(image_name)
rows, cols, _ = im.shape
score_map = process(result['score_map'][:, :, 1], (cols, rows)) 
score_map = np.expand_dims(score_map, axis=2)
rgba = np.concatenate((im, score_map), axis=2)  #将3通道变为4通道

cv2.imwrite('d:/output/tmp.png',rgba)

image

@yanchaoguo
Copy link
Author

@jiangjiajun 感谢支持 现在效果好多了,请问咱们提供图形分割数据集吗,或者哪里可以获取到开源的图形分割数据集(装饰 图案 logo之类的)

@jiangjiajun
Copy link
Collaborator

我们没有提供相应开源数据集,可以在网上搜下

@jiangjiajun jiangjiajun changed the title 官方DeepLabv3p-Xception65模型预测结果有锯齿问题 人像模型预测结果锯齿问题 Nov 10, 2020
@jiangjiajun jiangjiajun pinned this issue Nov 10, 2020
@yanchaoguo
Copy link
Author

我们没有提供相应开源数据集,可以在网上搜下
请问这个数据集有 完整版的下载地址吗
image

@jiangjiajun
Copy link
Collaborator

这个是由外部提供的数据,参考其官方网站 https://supervise.ly/

@yanchaoguo
Copy link
Author

这个是由外部提供的数据,参考其官方网站 https://supervise.ly/

没有找到下载页面

@ZeyuChen ZeyuChen unpinned this issue Feb 27, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants