前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ONNXRUNTIME部署一键人像抠图模型

ONNXRUNTIME部署一键人像抠图模型

作者头像
OpenCV学堂
发布2023-08-22 13:43:29
6200
发布2023-08-22 13:43:29
举报
文章被收录于专栏:贾志刚-OpenCV学堂

MODNet模型ONNX介绍

一键人像抠图,实时支持的模型,整个代码实现是基于Pytorch完成,通过脚本可以一键导出ONNX格式模型,官方提供了ONNXRUNTIME模型部署推理演示的Python版本代码。项目的github地址如下:

代码语言:javascript
复制
https://github.com/ZHKKKe/MODNet

然后可以直接下载官方提供的ONNX格式模型文件,模型文件打开输入与输出格式如下:

输入格式是 NCHW,其中HW支持不定长(动态)输入,但是绝对不能超过512。输出格式是:1x1xHxW,输出的大小跟输入HW一致,单个通道预测值,小于0.5可以看作是背景。

代码实现

01

图像预处理

MODNet模型输入图像数据预处理要求把图像转化0~1之间的浮点数,输入图像格式RGB顺序,转化0~1之间的浮点数是通过减去127.5然后除以127.5获得。然后把图像格式维度转化为NCHW。代码如下:

代码语言:javascript
复制
cv::Mat rgb, gblob;
cv::cvtColor(frame, rgb, cv::COLOR_BGR2RGB);
cv::resize(rgb, gblob, cv::Size(input_w, input_h));
gblob.convertTo(gblob, CV_32F);
cv::subtract(gblob, cv::Scalar(127.5, 127.5, 127.5), gblob);
cv::divide(gblob, cv::Scalar(127.5, 127.5, 127.5), gblob);
cv::Mat blob = cv::dnn::blobFromImage(gblob);

02

预测后处理

得到的推理后数据维度格式与输入相似,但是通道只有单个通道,通过阈值0.5分割为前景与背景,实现人像Mask对象提取,后处理代码如下:

代码语言:javascript
复制
cv::Mat mask = cv::Mat::zeros(cv::Size(input_w, input_h), CV_8UC1);
for (int row = 0; row < input_h; row++) {
    for (int col = 0; col < input_w; col++) {
        float c1 = mask_data[row*input_w + col] ;
        if (c1 > 0.5) {
            mask.at<uchar>(row, col) = 255;
        }
    }
}
cv::Mat result;
cv::imshow("mask", mask);
cv::resize(mask, mask, cv::Size(frame.cols, frame.rows));
cv::bitwise_and(frame, frame, result, mask);

03

测试运行

基于ONNXRUNTIME框架,推理测试结果运行如下:

我只能说扣的真好,然后我叠加一下背景,效果丝滑,显示如下:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-08-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenCV学堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云服务器利旧
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档