基于OpenCV的人员剔除
重磅干货,第一时间送达
01.准备工作
1. Python 3.xx(Python 3.7.4)
2. OpenCV(4.1.2版)
一个检测帧示例
要解决的第二个问题是找到一种方法来检测要删除的对象。OpenCV提供了一种简单的方法:基于支持向量机的“定向梯度直方图”检测器。它是必不可少的检测器,不是最快,不是最准确,不是最好的,但它可以正常工作。
1. 实例化 HOGDescriptor
2. 获取视频的第一帧用作遮罩
3. 遍历每一帧,对于每个检测到的人,从第一帧开始用相应的“空”替换该区域
4. 保存输出
按照前面描述的工作流程,代码保存在github中,见文末。
让我们测试一下!
像一个老板一样。手放在口袋里消失了!
但是,引用伊隆·马斯克(Elon Musk)的话:“仍有改善的空间”。实际上结果并不是那么精确,尤其是当离相机更近的时候。
在测试了这段代码之后,整个输出看起来有问题且不稳定。因此,需要找到一种方法来改进它:用第一帧替换每个检测到的人似乎是个好方法,因此我可能需要找到一种更好的方法来检测物体!
改进之处:
在搜索COCO的模型ZOO时,我们发现了一个实例分割模型,每幅图像的推理时间为0.07秒,这是最快的实例之一(可能不是最准确的)。
我们自定义了模型,需要安装所有需要的依赖,例如pytorch,torchvision和detectron2:
# install dependencies:
!pip install -U torch==1.4+cu100 torchvision==0.5+cu100 -f https://download.pytorch.org/whl/torch_stable.html
!pip install cython pyyaml==5.1
!pip install -U ‘git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI'
import torch, torchvision
以下代码和说明已在Google Colab实例上进行了测试,做出此选择是为了使此实验更易于复制,而不会因缺少依赖项,版本冲突和所有经常发生的无聊而苦恼。
然后我们需要安装Detectron2:
# install detectron2:
!git clone https://github.com/facebookresearch/detectron2 detectron2_repo
!pip install -e detectron2_repo
现在,我们可以继续导入所有需要的库并加载模型:
cfg = get_cfg()
cfg.merge_from_file(model_zoo.get_config_file(“COCO-InstanceSegmentation/mask_rcnn_R_50_DC5_1x.yaml”))
cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.5 # set threshold for this model
cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url(“COCO-InstanceSegmentation/mask_rcnn_R_50_DC5_1x.yaml”)
predictor = DefaultPredictor(cfg)
无法使用我们的predictor类进行推断,predictor需要在Tensors上返回一个需要转换为numpy数组的数组,然后可以像以前一样迭代该数组:
outputs = predictor(frame)
outputs = outputs[“instances”].pred_boxes
.to(‘cpu’)
.tensor
.numpy()
.astype(int)
让我们检查一下最终结果。
Detectron2 VS HOGDetector
从gif可以观察到Detectron2如何更准确地检测到一个人,但是,需要说的是,当然,它需要更多的“深度”配置(依赖有时会很麻烦)。但是,最终结果不言而喻!
代码链接:https://github.com/robertosannazzaro/person-removal-detectron2
交流群