从传统算法过渡到深度学习(从经典GMM-BackgroundSubtractorMOG2到BackgroundMatting),运动目标检测实战
首先收集非常多的人物肖像数据集,然后搭建两个神经网络,即引入了一个base网络,它可以在较低的分辨率下预测alpha matte和前景层,以及一个预测误差图,它指定了可能需要高分辨率精细化的区域。然后,使用一个refinement网络将低分辨率的结果和原始图像结合在一起,只在选定区域生成高分辨率的输出。最后达到了惊人的效果
运动目标检测传统算法有:连续帧间差分法、背景差分法、光流法和运动能量法。
涉及论文:
《Real-Time High-Resolution Background Matting》
实时超分辨率背景抠图
《Adaptive-background-mixture-models-for-real-time-tracking》
实时跟踪的自适应背景混合模型
目录
一、传统算法(GMM-BackgroundSubtractorMOG2)
a. 根据Github中readme文件的提示步骤,下载模型文件和数据集(需要翻墙到国外),并保存到自定义的路径之中,下图是本人的保存路径
b. 运行inference_images.py文件,再点击Edit Configuration,填写参数
一、传统算法(GMM-BackgroundSubtractorMOG2)
(1)原理(简单描述):
一种概率估计背景提取方法,算法为每个像素建立混合高斯模型并且使用一种在线估方法来更新模型参数,自适应混合高斯模型可以判断哪些区域更加可能属于背景。
(2)优点:
实现了一个实时的,具有高稳定性和鲁棒性的检测系统。该算法通过逐渐调整高斯参数来处理缓慢改变的光照变化,能够处理一些因为阴影、镜面反射、摇摆的树枝、监视器和其他复杂的特征导致的多态分布问题。
(3)代码实现
import cv2
camera = cv2.VideoCapture("MOG2.mp4") # 输入参数0表示启用电脑的摄像头
frame_number = camera.get(7)
print(frame_number)
mog = cv2.createBackgroundSubtractorMOG2()
while 1:
grabbed, frame_lwpCV = camera.read()
frame_lwpCV = cv2.resize(frame_lwpCV, (int(frame_lwpCV.shape[1] / 4), int(frame_lwpCV.shape[0] / 4)))
fgmask = mog.apply(frame_lwpCV)
# 按'q'健退出循环
cv2.imshow('frame', fgmask)
key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
break
camera.release()
cv2.destroyAllWindows()
>>>结果展示(视频流中的一帧图像)
二、深度学习(BackgroundMatting)
(1)原理(简单描述):
首先收集非常多的人物肖像数据集,然后搭建两个神经网络,即引入了一个base网络,它可以在较低的分辨率下预测alpha matte和前景层,以及一个预测误差图,它指定了可能需要高分辨率精细化的区域。然后,使用一个refinement网络将低分辨率的结果和原始图像结合在一起,只在选定区域生成高分辨率的输出。最后达到了惊人的效果!
(2)优点:
我们引入了一种实时的、高分辨率的背景重置技术,它在4K分辨率下的运行速度为30fps,在现代GPU上的高清运行速度为60fps。计算一个高质量的alpha哑光,保持链水平的头发细节,同时在实时处理高分辨率的图像。
(3)代码实现和数据集下载:
官方链接直达:https://grail.cs.washington.edu/ projects/background-matting-v2/
(4)部分代码以及运行所需关键步骤:
argparse 模块是 Python 内置的一个用于命令项选项与参数解析的模块,argparse 模块可以让人轻松编写用户友好的命令行接口。通过在程序中定义好我们需要的参数,然后 argparse 将会从 sys.argv 解析出这些参数。
required=True:代表运行程序时,不可忽略,需要输入参数
# 创建一个解释器
parser = argparse.ArgumentParser(description='Inference images')
# 添加参数
parser.add_argument('--model-type', type=str, required=True, choices=['mattingbase', 'mattingrefine'])
parser.add_argument('--model-backbone', type=str, required=True, choices=['resnet101', 'resnet50', 'mobilenetv2'])
parser.add_argument('--model-backbone-scale', type=float, default=0.25)
parser.add_argument('--model-checkpoint', type=str, required=True)
parser.add_argument('--model-refine-mode', type=str, default='sampling', choices=['full', 'sampling', 'thresholding'])
parser.add_argument('--model-refine-sample-pixels', type=int, default=80_000)
parser.add_argument('--model-refine-threshold', type=float, default=0.7)
parser.add_argument('--model-refine-kernel-size', type=int, default=3)
parser.add_argument('--images-src', type=str, required=True)
parser.add_argument('--images-bgr', type=str, required=True)
parser.add_argument('--device', type=str, choices=['cpu', 'cuda'], default='cpu')
parser.add_argument('--num-workers', type=int, default=0,
help='number of worker threads used in DataLoader. Note that Windows need to use single thread (0).')
parser.add_argument('--preprocess-alignment', action='store_true')
parser.add_argument('--output-dir', type=str, required=True)
parser.add_argument('--output-types', type=str, required=True, nargs='+', choices=['com', 'pha', 'fgr', 'err', 'ref'])
parser.add_argument('-y', action='store_true')
# 解析参数
args = parser.parse_args()
a. 根据Github中readme文件的提示步骤,下载模型文件和数据集(需要翻墙到国外),并保存到自定义的路径之中,下图是本人的保存路径
b. 运行inference_images.py文件,再点击Edit Configuration,填写参数
c. 把参数填写到Parameters中,最后点击OK
d. 需要填写的Parameters仅供参考
--model-refine-mode
sampling
--model-refine-sample-pixels
80000
--model-checkpoint
"checkpoint/pytorch_resnet50.pth" # 模型文件
--images-src
"mydata/images/demo_src" # 原始图像读取路径
--images-bgr
"mydata/images/demo_bgr" # 背景图像读取路径
--output-dir
"output/inference_images" # 输出图像保存路径
--output-type
com fgr pha
>>>运行结果
>>>原始图像、背景图像和结果图像
>>>如有疑问,欢迎评论区一起探讨
更多推荐
所有评论(0)