前言

  1. 关于抠图,首先想到的是PS的抠图,要美工手动一点点的把细节抠出来,抠图的好坏取决一个美工对PS的熟悉程度,在人像抠图方面,对头发的处理更是耗时耗力的一件事,在拍证件照的照像馆都有固定的绿幕来挡掉复杂的背景,以免增加后期的工作量,那么有没有一种完全自动的抠图办法呢? [A Late Fusion CNN for Digital Matting] CVPR 2019 上的一编论文, 作者提出了全自动抠图这个算法,不需要绿幕,也不需要输入trimap图(有了解传统抠图算法的应该知道这个图是干吗用的),背景图也不需要。在只需要输入一张原图的情况下,就能很好的抠图。我用Pytorch复现了他的这个算法,并且效果还不错。
  2. 关于人像抠图的应用场景可谓无所不在,在影视剪辑、直播娱乐、线上教学、视频会议等场景中都有人像分割的身影,它可以帮助用户实时、精准地将人物和背景精准识别出来,实现更精细化的人物美颜、背景虚化替换、弹幕穿人等,我那时想复现这编论文也是因为公司想做证件照相关的项目。
  3. 我的编译环境是Windows 10 64位,IDE是VS2019,配置了OpenCV 4.5,实现语言是C++,用OpenCV的dnn来进行模型推理。

模型演示

1.实现代码

void LFMatting(const cv::Mat& cv_src,cv::Mat &cv_matting, cv::Mat& cv_dst, cv::dnn::Net& net, int target_w = 640, int target_h = 960);
void imshow(std::string name, const cv::Mat& img)
{cv::namedWindow(name, 0);int max_rows = 500;int max_cols = 600;if (img.rows >= img.cols && img.rows > max_rows) {cv::resizeWindow(name, cv::Size(img.cols * max_rows / img.rows, max_rows));}else if (img.cols >= img.rows && img.cols > max_cols){cv::resizeWindow(name, cv::Size(max_cols, img.rows * max_cols / img.cols));}cv::imshow(name, img);
}void  mergeImage(std::vector<cv::Mat>& src_vor, cv::Mat& cv_dst, int channel)
{cv::Mat img_merge;cv::Size size(src_vor.at(0).cols * src_vor.size(), src_vor.at(0).rows);if (channel == 1){img_merge.create(size, CV_8UC1);}else if (channel == 3){img_merge.create(size, CV_8UC3);}for (int i = 0; i < src_vor.size(); i++){cv::Mat cv_temp = img_merge(cv::Rect(src_vor.at(i).cols * i, 0, src_vor.at(i).cols, src_vor.at(i).rows));src_vor.at(i).copyTo(cv_temp);}cv_dst = img_merge.clone();
}cv::Mat channelSwitching(const cv::Mat& cv_src)
{cv::Mat three_channel = cv::Mat::zeros(cv_src.rows, cv_src.cols, CV_8UC3);std::vector<cv::Mat> channels;if (cv_src.channels() == 1){for (int i = 0; i < 3; i++){channels.push_back(cv_src);}merge(&channels[0], channels.size(), three_channel);}return three_channel;
}int main(int argc, char* argv[])
{cv::dnn::Net net = cv::dnn::readNet("model/graph_final_960_640.pb", "model/graph_final_960_640.pbtxt");std::string path = "images";std::vector<std::string> filenames;cv::glob(path, filenames, false);for (auto v : filenames){cv::Mat cv_src = cv::imread(v,1);std::vector<cv::Mat> cv_dsts(3);cv::Mat  cv_matting, cv_dst;cv_dsts[0] = cv_src.clone();LFMatting(cv_src,cv_matting, cv_dsts[2], net);cv_dsts[1] = channelSwitching(cv_matting);cv_dsts[1].convertTo(cv_dsts[1], CV_8UC3, 255);mergeImage(cv_dsts, cv_dst, 3);cv::imwrite("dst.jpg", cv_dst);//cv::waitKey();}return 0;
}void LFMatting(const cv::Mat& cv_src,cv::Mat &cv_matting, cv::Mat& cv_dst, cv::dnn::Net& net, int target_w,int target_h)
{cv::Size reso(target_h, target_w);cv::Mat blob = cv::dnn::blobFromImage(cv_src, 1.0, reso,cv::Scalar(127.156207, 115.917443, 106.031127), true, false);net.setInput(blob);std::vector<cv::Mat> outputs;std::vector<std::string> names = {"deFG_side_0_out/ResizeNearestNeighbor","deBG_side_0_out/ResizeNearestNeighbor","fusion_sigmoid_output/Sigmoid"};net.forward(outputs, names);auto t1 = cv::getTickCount();for (size_t i = 0; i < outputs.size(); ++i){outputs[i] = outputs[i].reshape(0, { outputs[i].size[2], outputs[i].size[3] });cv::resize(outputs[i], outputs[i], cv_src.size(), 0.0, 0.0, cv::INTER_LINEAR);}cv::Mat fg = outputs[0];cv::Mat bg = outputs[1];cv::Mat alpha = outputs[2];cv_matting = fg.mul(alpha) + (1.0 - bg).mul(1.0 - alpha);cv_dst = cv::Mat::zeros(cv::Size(cv_src.cols, cv_src.rows), CV_8UC3);const int bg_color[3] = { 219,142,67 };float* alpha_data = (float*)alpha.data;for (int i = 0; i < cv_matting.rows; i++){for (int j = 0; j < cv_matting.cols; j++){float alpha_ = alpha_data[i * cv_matting.cols + j];cv_dst.at < cv::Vec3b>(i, j)[0] = cv_src.at < cv::Vec3b>(i, j)[0] * alpha_ + (1 - alpha_) * bg_color[0];cv_dst.at < cv::Vec3b>(i, j)[1] = cv_src.at < cv::Vec3b>(i, j)[1] * alpha_ + (1 - alpha_) * bg_color[1];cv_dst.at < cv::Vec3b>(i, j)[2] = cv_src.at < cv::Vec3b>(i, j)[2] * alpha_ + (1 - alpha_) * bg_color[2];}}
}

2.一些不错的效果:




3.还有一些是场景处理不是很好。



4. 我现在训练的样本在10000张左右,如果加大样本量或者优化下算法,是可以解决掉这些问题点。
5. 模型和源码都上传到CSDN,感兴趣的可以下载试玩:https://download.csdn.net/download/matt45m/51419768

智能人像自动抠图——C++ 实现LFM 模型推理相关推荐

  1. AI孙燕姿 ?AI东雪莲 !—— 本地部署DDSP-SVC一键包,智能音频切片,本地训练,模型推理,为你喜欢的角色训练AI语音模型小教程

    目录 感谢B站UP羽毛布团 演示视频 稻香--东雪莲 虚拟--东雪莲 反方向的钟--东雪莲 晴天+龙卷风--东雪莲 ZOOD--东雪莲 DDSP-SVC 3.0 (D3SP) 是什么? 下载资源: 解 ...

  2. android拍照自动裁剪_新功能上线!智能人像抠图、图片自由裁剪,PPT 还能这么玩?...

    众所周知,不少人买平板都是买前「生产力」,买后某奇艺.其实,要打破这个魔咒,一个 WPS 可能就够了. 安卓平板 WPS 不仅能拥有电脑版般的体验,还针对触屏推出了众多实用且前沿的新功能,帮助你快速提 ...

  3. unity抠人像原理_【图】自动抠图抠人像的方法 智能化的人像识别抠图好用到爆...

    以前,想要把照片中的人像抠出来,可能需要打开ps(不过前提是你电脑有安装PS,如果没有安装PS还要花时间下载安装),然后在一点点的手动完成抠图,虽然PS抠图工具多,整体也不算也难,但是过程繁琐而且抠出 ...

  4. paddlehub自动抠图-人像

    paddlehub自动抠图-人像 import os import matplotlib.pyplot as plt import matplotlib.image as mpimg, cv2 imp ...

  5. 软件分享:AI智能人像美化软件,AI识别人像自动为图片“补妆”还原照片中美丽的你。。。

    BEGIN Portrait Professional 是一款功能强大的人物磨皮(降噪)的人像美化软件,包含了很多专门针对人物的脸部,眼部.牙齿等部位进行美化处理的设置,虽然没有PS功能齐全,但对于人 ...

  6. html5 自动扣图,5 秒实现自动抠图?见过 remove.bg 这款神器

    雷锋网(公众号:雷锋网) AI 科技评论按:是否为了简单的抠图功能,还在苦苦修炼 Photoshop 大法?即使修炼成功了,是否觉得在抠图这件事情上花费的时间依然太多?如今一个名叫 remove.bg ...

  7. 怎么给图片自动抠图换背景?简单一招轻松操作

    相信平时小伙伴们都接触过抠图换背景吧!比如改变证件照的背景颜色,图片素材的处理,P掉路人照片等等.而且说到背景抠图,很多人应该会想到用PS来解决,但是对于我这样的PS小白来说,PS抠图改变背景的操作是 ...

  8. 还在看ps抠图教程?3秒钟自动抠图神器来了,一定要收藏

    ​很多刚接触设计的同学都要求先学PhotoShop,因为抠图是后续图像处理的重要基础.初学者都认为抠图不好掌握,魔术棒.色彩范围.蒙版.磁性索套.钢笔,每一步都需要看教程,一篇不够看2篇,不够看3篇, ...

  9. Python图片批量自动抠图去背景

    图片批量自动抠图去背景 今天发现个好东西啊,叫片刻抠图(pickwant.com),是一个在线对图片自动抠图去除背景的网站.只要上传图片,就可以自动把背景去掉把目标对象抠出来. 不管是动物.汽车或各种 ...

最新文章

  1. 1037 Magic Coupon
  2. 识别图片并可视化_识别交通锥,特斯拉驾驶信任提升的一小步
  3. 【深度学习】nnU-Net(优秀的前处理和后处理框架)
  4. 2017年第八届蓝桥杯C/C++ C组国赛 —— 第三题:表达式计算
  5. SpringBoot是如何解析参数的
  6. 工作407-启动vue项目出现Module build failed (from ./node_modules/sass-loader/dist/cjs.js): ValidationError: I
  7. 微型计算机原理中ADC,微机原理实验-逐比较式ADC.doc
  8. 选择北大青鸟的九大理由
  9. OD教程(多态和变形)
  10. dell服务器自动部署,教你DELL服务器提高电源的转化效率,最高效的方式进行电源管理...
  11. java smslib rxtx_SMSLIB+RXTX 短信猫开发模块
  12. 超实用:本科生如何发论文?
  13. 一份完整的数据分析师成长书单
  14. color a dir/s_揭发Wuli杨幂的quot;A字裙quot;执念!一款裙也要72变!
  15. 运维危险操作之windows server打开或关闭windows功能
  16. apache avro 简介
  17. matlab车轮滚动动画,Fireworks动画教程:简单制作轮子滚动动画效果
  18. 使用 nodeJs 实现 js/ts 文件翻译功能
  19. 将qrcode生成的二维码转成图片
  20. Vue-ElementUI教程

热门文章

  1. Qt+VLC编写的流媒体播放器
  2. 群体进化技术原理和研究思路
  3. 使用Qt写一个简单的五子棋单机小游戏
  4. Solr suggest配置
  5. 【Android】录屏功能实现——MediaProjection
  6. 如何使用iMacros进行web程序中页面加载的性能测试
  7. Win10多用户远程桌面同时登录
  8. 无线点菜宝服务器,无线点菜机怎么用 无线点菜机使用方法【详解】
  9. pdf转word转换器在线
  10. 寻找蒙赫阵列(monge array)的每行的最小值