一、介绍

计算机视觉分为四大基本任务(分类、定位、检测、分割)。而这里了解了一下实例分割。

**实例分割:**机器自动从图像中用目标检测方法框出不同实例,再用语义分割方法在不同实例区域内进行逐像素标记

借一个浅显的说法:语义分割不区分属于相同类别的不同实例。例如,当图像中有多只猫时,语义分割会将两只猫整体的所有像素预测为“猫”这个类别。与此不同的是,实例分割需要区分出哪些像素属于第一只猫、哪些像素属于第二只猫。

这里以猫为例,基本思路:目标检测+语义分割。

通过目标检测,先检测到猫,然后在用语义分割,就可以实现把猫区分出来,最终达到下图效果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

二、实现过程

实现使用的是Mask R-CNN,Mask R-CNN用于目标检测和分割

地址:

GitHub - matterport/Mask_RCNN:Mask R-CNN,用于 Keras 和 TensorFlow 上的对象检测和实例分割

也可以自己训练数据集,训练方法文档有详细教程。

这是使用是基于mask rcnn训练好的coco数据集的权重mask_rcnn_coco.h5模型。

mask_rcnn_coco.h5:下载链接如下:
链接:https://pan.baidu.com/s/1k0IhAh-H8HYsKl7t9C6jAQ 
提取码:bu1r 
--来自百度网盘超级会员V4的分享

1、下载源码

Releases · matterport/Mask_RCNN · GitHub

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下载后解压,并下载模型,在源码下新建目录weighs存放模型,结构如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

三、创建环境

这是使用的是pixellib,安装使用方法:https://pixellib.readthedocs.io/en/latest/index.html

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

根据上面创建环境

1、创建虚拟机

conda create -n danmu python==3.8

2、安装

所需要安装的

# TensorFlow
# Windows:pip3 install tensorflow==2.2.0  (最新版的2.8可能会报错)
# macOS:conda install -c conda-forge tensorflow

# pip3 install imgaug
# pip3 install pixellib --upgrade

# conda install -c conda-forge jupyterlab
pip install tensorflow==2.2.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install imgaug -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install pixellib --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install 'protobuf~=3.19.0' -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install numpy==1.23.4 -i https://pypi.tuna.tsinghua.edu.cn/simple
conda install -c conda-forge jupyterlab
jupyter lab```


到此,环境搭建完成。接下来是编写一个简单的代码测试一下。

## 四、代码


功能不是很复杂,基本看得懂,所以直接上代码。

这里注意target_classes = segment_frame.select_target_classes(cat=True),选择的类别是猫,模型也有其他的,可以自行修改。

import cv2
import numpy as np
import matplotlib.pyplot as plt
import pixellib
from pixellib.instance import instance_segmentation


class Segment_Video:
    def __init__(self):
        pass

def segment_det(self):
    # 实例化
    segment_frame = instance_segmentation()
    segment_frame.load_model("weights/mask_rcnn_coco.h5")

    # 选择类别
    target_classes = segment_frame.select_target_classes(cat=True)

    # 摄像头
    #cap = cv2.VideoCapture(0)
    cap = cv2.VideoCapture('./videos/video_cat.mp4')

    # 获取视频宽度与高度
    frame_w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    frame_h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    # 获取帧率
    fps = int(cap.get(cv2.CAP_PROP_FPS))

    # 构建视频写入器
    video_name = './out_video/out_video_cat.mp4'
    video_writer = cv2.VideoWriter(video_name, cv2.VideoWriter_fourcc(*'mp4v'), fps, (frame_w, frame_h))

    frame_index = 0

    while True:
        ret, frame = cap.read()
        if frame is None:
            break

        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

        # 分割
        results, output = segment_frame.segmentFrame(frame, segment_target_classes=target_classes, show_bboxes=True)

        output = cv2.cvtColor(output, cv2.COLOR_RGB2BGR)

        cv2.imshow('test?', output)

        video_writer.write(output)

        frame_index += 1
        print('第%d帧处理完毕' % (frame_index))

        if cv2.waitKey(10) & 0xFF == ord('q'):
            break
    cap.release()
    cv2.destroyAllWindows()
demo = Segment_Video()
demo.segment_det()

运行结束后,在保存成一个视频。效果如下,基本可以识别出猫,并分割出来。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

更多推荐