用yolov5图像分割做人物抠像

前言

yolov5的6.2版本不仅更新了前一篇文章里提到的分类模型,同时也更新了图像分割模型,在官方的教程和用法还没出之前(2022/09/19),我基于官方已经写好的推理脚本进行部分修改,实现了基于图像分割的简单人物抠像。
注:本文所用模型为yolov5s-seg,是已经预训练好的官方模型。

展示效果

话不多说,先来放图!
首先是官方的图像分割推理结果,为了不透露小伙伴信息,这里打上马赛克:

其次是我修改后需要的人物抠像结果:

如何实现

克隆yolov5新版源码解压后(这个就不展开谈了)
1.首先修改yolov5-master\utils下的plots.py:

#plots.py
def masks(self, masks, colors, im_gpu=None, alpha=1):

这里的alpha值需要修改为1,alpha影响的是mask也就是遮罩层的透明度,默认是0.5,是以下这种效果:


可以看到很明显暗半圈,不符合我们的效果。

接下来需要修改几行代码,为了清楚,我直接把我修改的和原始文件对比进行截图:


也就是修改成:

masks = masks.unsqueeze(3)  # shape(n,h,w,1)
masks_color = masks * (colors * alpha)  # shape(n,h,w,3)
inv_alph_masks = (masks * alpha).cumprod(0)  # 1-masks*alpha
mcs = (masks_color * inv_alph_masks).sum(0) * 2  # mask color summand shape(n,h,w,3)
im_gpu = im_gpu.flip(dims=[0])  # flip channel
im_gpu = im_gpu.permute(1, 2, 0).contiguous()  # shape(h,w,3)
im_gpu = im_gpu * inv_alph_masks[0] #no mcs

其中我把mcs(也就是着色块)先去掉,然后因为是要去掉背景保留前景,所以需要把1-mask乘alpha改成mask乘alpha,同时为了只取最大的物体,这里inv_alph_masks里的-1(取全部)改成了0(只取第一个物体)。

为了更好地理解,这里分别放出mcs,inv_alph_masks分别是什么效果:


2.修改yolov5-master\segmant\predict.py文件:

上面两行代码的意思是这里取masks里的第一个物体,也就是检测值最大的那个物体,其他我不要了(这个看需求处理),同时要把目标检测框去掉的话只要把下面四行代码注释掉即可。

3.预测:

#D:\yolov5-master-seg\yolov5-master\segment在当前目录下启动命令行
python predict.py --weights yolov5s-seg.pt --source 3014193119028716040.avi --class 0

–source后面跟的换成你需要的视频文件或者视频源。
–class 0表示只预测0的分类,这里的分类取自coco数据集,0就是人的意思,所以只会进行人的图像分割。
以下是推理的结果:

Speed: 0.4ms pre-process, 8.3ms inference, 1.0ms NMS per image at shape (1, 3, 640, 640)
Results saved to ..\runs\predict-seg\exp24

用的是rtx4000显卡,速度是非常理想的,此外这里提一句,yolov5s的推理速度就比yolov5n慢了一点点(大约2ms),但是效果要好不少,各位请根据自己的实际情况选择模型。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2023年4月14日
下一篇 2023年4月14日

相关推荐