基于PaddleHub-ace2p的人体分割
项目链接:Paddle Hub—基于ace2p实现人体分割
人体解析(Human Parsing)是细粒度的语义分割任务,其旨在识别像素级别的人类图像的组成部分(例如,身体部位和服装)。
ACE2P通过融合底层特征,全局上下文信息和边缘细节,端到端地训练学习人体解析任务。该结构针对Intersection over Union指标进行针对性的优化学习,提升准确率。
以ACE2P单人人体解析网络为基础的解决方案在CVPR2019第三届LIP挑战赛中赢得了全部三个人体解析任务的第一名。该PaddleHub Module采用ResNet101作为骨干网络,接受输入图片大小为473x473x3。
地址:Paddle Hub
!pip install paddlehub==1.6.0
一. 解压需要预测的图片
#只需运行一次
# !unzip /home/aistudio/data/data11874/ACE2P_data.zip -d /home/aistudio/work/ACE2P
Archive: /home/aistudio/data/data11874/ACE2P_data.zip
creating: /home/aistudio/work/ACE2P/data/
creating: /home/aistudio/work/ACE2P/data/testing_images/
inflating: /home/aistudio/work/ACE2P/data/testing_images/103491_1238096.jpg
inflating: /home/aistudio/work/ACE2P/data/testing_images/107157_521599.jpg
inflating: /home/aistudio/work/ACE2P/data/testing_images/153677_517642.jpg
inflating: /home/aistudio/work/ACE2P/data/testing_images/165064_482841.jpg
inflating: /home/aistudio/work/ACE2P/data/testing_images/169945_200582.jpg
inflating: /home/aistudio/work/ACE2P/data/testing_images/181316_510958.jpg
inflating: /home/aistudio/work/ACE2P/data/testing_images/401094_427878.jpg
inflating: /home/aistudio/work/ACE2P/data/testing_images/85881_493702.jpg
inflating: /home/aistudio/work/ACE2P/data/test_id.txt
二.一 使用API进行模型预测
预测前展示图片
import paddlehub as hub
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
#ace2p 模型
module = hub.Module(name="ace2p")
test_img_path = "/home/aistudio/work/ACE2P/data/testing_images/85881_493702.jpg"
# 预测前展示
img = mpimg.imread(test_img_path)
plt.imshow(img)
plt.axis('off')
plt.show()
[32m[2020-08-23 16:03:24,212] [ INFO] - Installing ace2p module[0m
[32m[2020-08-23 16:03:24,214] [ INFO] - Module ace2p already installed in /home/aistudio/.paddlehub/modules/ace2p[0m
执行预测并打印结果
image=mpimg.imread("/home/aistudio/work/ACE2P/data/testing_images/85881_493702.jpg")
results = module.segmentation(images = [image],
output_dir = '/home/aistudio/work/ace2p_output/',
visualization = True)
for result in results[0]:
print(result)
path = results[0]['path'][:-3]
print(path+'png')
img = mpimg.imread('/home/aistudio/work/ace2p_output/'+path+'png')
plt.imshow(img)
plt.axis('off')
plt.show()
path
data
ndarray_time=1598171975037451.0.png
二.二服务部署
第一步:启动PaddleHub Serving
在终端中输入(在Notebook中启动会一直运行)
默认端口号8866
hub serving start -m ace2p
第二步:发送预测请求
以上,这样就完成了一个人体解析服务化API的部署,接下来让我们尝试发送请求
import requests
import json
import cv2
import base64
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
img = mpimg.imread('work/ACE2P/data/testing_images/103491_1238096.jpg')
plt.imshow(img)
plt.axis('off')
plt.show()
def cv2_to_base64(image):
data = cv2.imencode('.jpg', image)[1]
return base64.b64encode(data.tostring()).decode('utf8')
def base64_to_cv2(b64str):
data = base64.b64decode(b64str.encode('utf8'))
data = np.fromstring(data, np.uint8)
data = cv2.imdecode(data, cv2.IMREAD_COLOR)
return data
# 发送HTTP请求
data = {'images':[cv2_to_base64(cv2.imread("work/ACE2P/data/testing_images/103491_1238096.jpg"))], \
"output_dir": '/home/aistudio/work/ace2p_output/', \
"visualization": True}
headers = {"Content-type": "application/json"}
url = "http://127.0.0.1:8866/predict/ace2p"
r = requests.post(url=url, headers=headers, data=json.dumps(data))
# # 打印预测结果
# print(base64_to_cv2(r.json()["results"][0]['data']))
输出预测结果: 此时我们的服务部署已经完成,http预测结果已保存在输出目录中
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
img = mpimg.imread('work/ace2p_output/ndarray_time=1598179908901488.0.png')
plt.imshow(img)
plt.axis('off')
put/ndarray_time=1598179908901488.0.png')
plt.imshow(img)
plt.axis('off')
plt.show()