• 【Mask-RCNN】基于Mask-RCNN的目标检测和识别


          Mask-RCNN 是何凯明继Faster-RCNN后的又一力作,集成了物体检测和实例分割两大功能,并且在性能上上也超过了Faster-RCNN。其基本结构如下:

            Mask R-CNN是一个实例分割模型,它能确定图片中各个目标的位置和类别,给出像素级预测。所谓“实例分割”,指的是对场景内的每种兴趣对象进行分割,无论它们是否属于同一类别——比如模型可以从街景视频中识别车辆、人员等单个目标。下图是在COCO数据集上训练好的Mask R-CNN,如图所示,大到每一辆车,小到单根香蕉,它都能用窗口标出目标物品在画面中的像素位置。

          不同于Faster R-CNN这样的经典对象检测模型,Mask R-CNN的一个特点是可以给窗口内表示对象轮廓的像素着色。可能有人会觉得这是个鸡肋功能,但它对自动驾驶汽车和机器人控制意义非凡:

    着色可以帮助汽车明确道路上各目标的具体像素位置,从而避免发生碰撞;

    如果机器人想抓取某个目标物品,它就需要知道位置信息(如亚马逊无人机)。

    如果只是单纯想在COCO上训练Mask R-CNN模型,最简单的方法是调用Tensorflow Object Detection API,具体内容Github都有,此处不再详谈。

    Mask R-CNN的工作原理

    在构建Mask R-CNN模型之前,我们首先来了解一下它的工作机制。

    事实上,Mask R-CNN是Faster R-CNN和FCN的结合,前者负责物体检测(分类标签+窗口),后者负责确定目标轮廓。如下图所示:

    它的概念很简单:对于每个目标对象,Faster R-CNN都有两个输出,一是分类标签,二是候选窗口;为了分割目标像素,我们可以在前两个输出的基础上增加第三个输出——指示对象在窗口中像素位置的二进制掩模(mask)。和前两个输出不同,这个新输出需要提取更精细的空间布局,为此,Mask R-CNN在Faster-RCNN上添加一个分支网络:Fully Convolution Networ(FCN)。

    FCN是一种流行的语义分割算法,所谓语义分割,就是机器自动从图像中分割出对象区域,并识别其中的内容。该模型首先通过卷积和最大池化层把输入图像压缩到原始大小的1/32,然后在这个细粒度级别进行分类预测。最后,它再用上采样和deconvolution层把图还原成原始大小。

    因此简而言之,我们可以说Mask R-CNN结合了两个网络——把Faster R-CNN和FCN纳入同一巨型架构。模型的损失函数计算的是分类、生成窗口、生成掩模的总损失。


    由于MASK-RCNN训练时间较长,我们使用matlab提供的训练后的MASK-RCNN进行测试,下载

    https://www.mathworks.com/supportfiles/vision/data/maskrcnn_pretrained_person_car.mat

    这个是训练好的可以识别车辆和行人的MASK-RCNN模型。训练好的模型,其数据如下:

    1. targetSize = [700 700 3];
    2. imgSize = size(img);
    3. [~, maxDim]= max(imgSize);
    4. resizeSize = [NaN NaN];
    5. resizeSize(maxDim) = targetSize(maxDim);
    6. img = imresize(img, resizeSize);
    7. trainSize = [800 800 3];
    8. classNames = {'person','car','background'};
    9. numClasses = 2;
    10. params = createMaskRCNNConfig(trainSize, numClasses, classNames);
    11. Envs = "cpu";
    12. maskSubnet = helper.extractMaskNetwork(net);
    13. %MaskRCNN
    14. [boxes, scores, labels, masks] = detectMaskRCNN(net, maskSubnet, img, params, Envs);
    15. if(isempty(masks))
    16. overlayedImage = img;
    17. else
    18. overlayedImage = insertObjectMask(img, masks);
    19. end
    20. figure
    21. imshow(overlayedImage)
    22. showShape("rectangle", gather(boxes), "Label", labels, "LineColor",'g')

    通过MATLAB仿真,可以实现如下的仿真结果:

     

    为资源。

  • 相关阅读:
    【前端面试】(特别篇)面试准备——相互了解阶段
    MySQL索引与事务
    自动驾驶中的数据安全和隐私
    Parker派克高速电机MGV【高速、低惯性】测试台应用
    工厂方法模式
    Java游戏之飞翔的小鸟
    媒体查询技术
    接收端编程、UDP编程练习、wireshrak抓包工具、UDP包头
    如何对用户输入进行校验
    信息系统项目管理师---第十一章项目风险管理历年考题
  • 原文地址:https://blog.csdn.net/ccsss22/article/details/125531477