MXNet的Faster R-CNN(基于区域提议网络的实时目标检测)《3》

news2024/11/17 8:28:12

前面了解到Faster R-CNN在实验中的效果很不错,以及对论文做了一个大概的了解,对此有兴趣的伙伴们也可以先浏览前面两篇文章:
MXNet的Faster R-CNN(基于区域提议网络的实时目标检测)《1》
MXNet的Faster R-CNN(基于区域提议网络的实时目标检测)《2》

这节主要就是针对源代码,来具体看看有一些什么新的知识点以及加深对论文观点的认识。

python demo.py --dataset voc --network vgg16 --params model/vgg_voc07-0010.params --image hi.jpg 

从这个参数来看,很关键的点就是用到已训练好的模型参数vgg_voc07_0010.params,这个好处大家都知道,大型的模型训练非常耗时,而且我们在计算机视觉之迁移学习中的微调(fine tuning)
有讲到可以应用已训练好的参数文件为我所用,我们可以先来加载看下这个参数文件里面有些什么键值对。 

加载模型参数

import mxnet as mx
mydict=mx.nd.load('model/vgg_voc07-0010.params')
for k,v in mydict.items():
    tp,name=k.split(":")
    print(tp,name,end=',')
'''
arg conv3_2_weight,arg rpn_conv_3x3_weight,arg conv4_1_bias,arg conv5_3_bias,arg cls_score_weight,arg conv3_3_bias,arg fc7_bias,arg conv4_3_weight,arg conv1_2_bias,arg conv4_1_weight,arg bbox_pred_bias,arg bbox_pred_weight,arg fc7_weight,arg 
conv2_1_bias,arg conv5_2_weight,arg conv1_1_bias,arg cls_score_bias,arg bbox_pred_weight_test,arg conv2_2_weight,arg conv4_3_bias,arg fc6_bias,arg bbox_pred_bias_test,arg conv3_1_bias,arg rpn_bbox_pred_bias,arg rpn_cls_score_bias,arg conv5_3_weight,arg conv1_2_weight,arg conv4_2_weight,arg rpn_cls_score_weight,arg conv3_1_weight,arg conv5_1_bias,arg conv4_2_bias,arg conv2_1_weight,arg conv2_2_bias,arg conv5_1_weight,arg conv1_1_weight,arg rpn_conv_3x3_bias,arg rpn_bbox_pred_weight,arg conv3_3_weight,arg fc6_weight,arg conv3_2_bias,arg conv5_2_bias,
'''

可以看到k有卷积层权重与偏置、rpn3x3的卷积层权重与偏置、类别分数权重与偏置、全连接层权重与偏置、边框预测权值与偏置、rpn边框预测权值与偏置、rpn类别分数权值与偏置等。
当然这个v值就是权值与偏置的值。这里就不必要贴了。
在这个模型源码当中,判别了tp是arg还是aux,分别放入到arg_params和aux_params字典中

可视化

python demo.py --dataset voc --network vgg16 --params model/vgg_voc07-0010.params --image hi.jpg --vis

加一个vis参数,可以将输入图片进行可视化,标注类别和锚框并显示分数,这个参数我们可以看到,如果存在将会调用一个vis_detection方法。我们单独列出来看下这个可视化的函数是怎么样的。 

import cv2

def vis_detection(im_orig, detections, class_names, thresh=0.7):
    """visualize [cls, conf, x1, y1, x2, y2]"""
    import matplotlib.pyplot as plt
    import random
    plt.imshow(im_orig)
    colors = [(random.random(), random.random(), random.random())
              for _ in class_names]
    for [cls, conf, x1, y1, x2, y2] in detections:
        cls = int(cls)
        #类别索引大于0以及大于设定的阈值才显示锚框
        if cls > 0 and conf > thresh:
            rect = plt.Rectangle((x1, y1), x2 - x1, y2 - y1,
                                 fill=False, edgecolor=colors[cls], linewidth=3.5)
            plt.gca().add_patch(rect)
            plt.gca().text(x1, y1 - 2, '{:s} {:.3f}'.format(class_names[cls], conf),
                           bbox=dict(facecolor=colors[cls], alpha=0.5), fontsize=12, color='white')
    plt.show()


img = cv2.imread("hi.jpg")
img = img[:, :, (2, 1, 0)]  # cv2出来的是BGR,需要转成RGB
# 里面6个元素分别表示类别索引、阈值(交并比IoU)、左上角xy坐标、右下角xy坐标
det = [[12, 0.999, 214, 0, 473, 473], [8, 0.997, 15, 175, 171, 453], [2, 0.25, 6, 74, 176, 458]]
clsname = ['__background__', 'aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', 'cat', 'chair', 'cow',
           'diningtable', 'dog', 'horse', 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor']
vis_detection(img, det, clsname, 0.7)

这里主要就是最后做可视化的一步,给图片加上锚框,这个模型包括背景一共是21个类:

感兴趣区域

感兴趣区域ROI(Region Of Interest),这个在代码中也是频繁出现,我们独立出来了解下: 

感兴趣区域

import cv2 as cv
#感兴趣区域
def roi(imgpath):
    src = cv.imread(imgpath)
    cv.namedWindow("hi", cv.WINDOW_AUTOSIZE)  # 创建一个自适应窗口
    cv.imshow("hi", src)
    roiImg = src[200:400, 0:300]  # 感兴趣的区域(高、宽)
    cv.imshow("roi", roiImg)
    cv.waitKey()
roi("hi.png")

我们将看到左边那块,就是我们感兴趣的区域,其实就是将图片转成矩阵,然后可以选择几行几列的元素,这样就挑选出了ROI

还原图片

# 还原
def orig(imgpath):
    src = cv.imread(imgpath)
    cv.namedWindow("hi", cv.WINDOW_AUTOSIZE)  # 创建一个自适应窗口
    cv.imshow("hi", src)
    roiImg = src[200:400, 0:300]  # 感兴趣的区域(高、宽)
    cv.imshow("roi", roiImg)
    gray = cv.cvtColor(roiImg, cv.COLOR_BGR2GRAY)  # 灰度单通道(200,300)
    backface = cv.cvtColor(gray, cv.COLOR_GRAY2BGR)  # 单通道转3通道(200,300,3)
    src[200:400, 0:300] = backface
    cv.imshow("newImg", src)
    cv.waitKey(0)
    cv.destroyAllWindows()

注意看感兴趣区域的那块颜色,成了灰色区域,然后这块区域cv.COLOR_BGR2GRAY灰色区域是单通道,要还原到原图,原图是三通道,所以需要cv.COLOR_GRAY2BGR转成三通道。

剪切区域

#剪切指定区域块到指定位置
def clipImg(imgarr):
    src = imgarr[10:150, 200:380]
    cv.imshow("clip", src)
    imgarr[110:250, 300:480] = src  #截取的块放入到指定位置,形状保持一样
    cv.imshow("merge", imgarr)

imgarr = cv.imread("hi.jpg")
cv.imshow("orginal", imgarr)
clipImg(imgarr)
cv.waitKey(0)
orig("hi.jpg")

裁剪出来的区域,放入到原图中合并时,也需要保持大小一样,一个萝卜一个坑,不然形状转换就会报错。

泛洪填充

泛洪填充也叫漫水填充

FLOODFILL_FIXED_RANGE

import cv2 as cv
import numpy as np

def fillColor(image):
    copyImg = image.copy()
    h, w = image.shape[:2]
    mask = np.zeros([h+2, w+2], image.dtype)
    #图片、掩码、种子点、填充颜色、低于种子点的颜色范围、高于种子点的颜色范围、填充方法
    cv.floodFill(copyImg, mask, (200, 10), (0, 0, 255), (100, 100, 100), (50, 50, 50), cv.FLOODFILL_FIXED_RANGE)
    cv.imshow("fillcolor", copyImg)
    cv.waitKey()
src = cv.imread("hi.jpg")
fillColor(src)

FLOODFILL_MASK_ONLY

def fillBinary(image):
    image[100:300,100:300,:]=255
    cv.imshow("fillbinary",image)

    h,w=image.shape[:2]
    mask=np.ones([h+2,w+2,1],np.uint8)
    mask[101:301,101:301]=0 #为1不填充,为0才进行填充
    #将这块mask进行填充
    cv.floodFill(image,mask,(100,100),(0,255,0),cv.FLOODFILL_MASK_ONLY)
    cv.imshow("filledbinary1",image)
    cv.waitKey()
src = cv.imread("hi.jpg")
fillBinary(src)

FLOODFILL_FIXED_RANGE:改变图像,泛洪填充
FLOODFILL_MASK_ONLY:不会改变图像,只填充mask遮罩层本身
其中关键点就是选择一个种子点seedPoint,然后把邻近区域所有相似点填充上相同的颜色。

另外需要注意的就是cv出来的通道是BGR,平时看到的是RGB通道。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/136479.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Node】Node.js安装与配置(详细步骤)

Node.js安装与配置(详细步骤)一、安装Node.js1.1 下载1.2 安装1.3 环境变量二、验证是否安装成功三、修改模块下载位置3.1 查看npm默认存放位置3.2 在 nodejs 安装目录下,创建 “node_global” 和 “node_cache” 两个文件夹3.3 修改默认文件…

xd卡数据丢失原因和三种数据恢复方法介绍

xd卡适用于富士/奥林巴斯相机品牌,它能配合各式读卡器,方便的与个人电脑连接传输图像视频等。但是xd卡与其他类型的存储卡一样容易因各种原因出现数据丢失。如果您的xd卡出现了数据丢失的问题,不妨了解下这里给大家分析的xd卡数据丢失原因和具…

解决仓库产品管理痛点,选对条码工具至关重要

" 最近我们仓库管理遇到了很多问题,一方面 我们进出库的产品数量非常庞大,目前公司的条码扫描系统识别效率非常低,只能单个产品进行扫描,经常需要加班加点出入库,而且有些产品条码比较特殊,现在的扫描…

【LeetCode每日一题】——507.完美数

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【时间频度】九【代码实现】十【提交结果】一【题目类别】 数学 二【题目难度】 简单 三【题目编号】 507.完美数 四【题目描述】 对于一个 正整数&…

windows10安装goland

一、安装包 下载以下两个安装包: go语言二进制包: https://golang.google.cn/dl/ goland安装包 https://www.jetbrains.com/go/nextversion/ 二、安装go语言包 双击下载的语言包,直接next,选择安装路径(自己选择&am…

图的遍历(深度DFS与广度BFS)

文章目录图的遍历深度优先遍历思路邻接表邻接矩阵性能分析广度优先遍历思路邻接表邻接矩阵性能分析源代码图的遍历 **对有向图和无向图进行遍历是按照某种次序系统地访问图中的所有顶点, 并且使得每一个顶点只能访问一次. ** 对于图的遍历需要解决掉两个问题: 如果存在回路/环…

实力总结四类Bean注入Spring的方式

xml 方式 注解方式 Configuration Bean Import FactoryBean BDRegistryPostProcessor 源码 实战 一提到Spring,大家最先想到的是啥?是AOP和IOC的两大特性?是Spring中Bean的初始化流程?还是基于Spring的Spring Cloud全家桶呢…

Vue组件之间的通信

1、组件:是vue的重要的特征之一,可以扩展html的功能,也可以封装代码实现重复使用 2、组件的创建 (1)非脚手架方式创建: 1️⃣使用vue.extend创建组件 2️⃣使用vue.component注册组件 3️⃣在html页面…

一个平凡打工人在 CSDN 的 2022 与 2023

平凡又不平凡的一年 2022 年是不平凡的一年,这一年经历了疫情的起起伏伏,随着身边好多同学的毕业离开,手头的工作也愈发的繁重,2022 年也顺理成章的成为了工作3年来最忙碌的一年,但却也是博客产出与自己收获最多的一年…

大数据hadoop和spark怎么选择?

Hadoop框架的主要模块包括如下: Hadoop Common Hadoop分布式文件系统(HDFS) Hadoop YARN Hadoop MapReduce 虽然上述四个模块构成了Hadoop的核心,不过还有其他几个模块。这些模块包括:Ambari、Avro、Cassandra、Hive、 Pig、Oozie、Flume…

spring之静态代理

文章目录前言一、代理模式中的三大角色二、静态代理引入1.业务接口2.目标对象总结前言 在Java程序中代理模式的作用: 当一个对象需要收到保护的时候可以考虑使用代理对象去完成某个行为需要给某个对象的功能进行功能增强的时候,可以考虑找一个代理进行…

Java内存模型(JMM)详解!

文章目录什么是JMM?现代计算机内存模型缓存一致性JMM内存模型与计算机内存模型的关系线程间通信JMM三大问题原子性可见性有序性什么是JMM? JMM定义了Java 虚拟机(JVM)在计算机内存(RAM)中的工作方式。 JMM可以理解为是一个规范,一个抽象概念,并不真实…

Java 单元测试

目录 一、Junit 1.1、单元测试初始化与清理资源 1.2、捕获异常 1.3、条件测试 1.4、标记失效测试方法 1.5、参数化测试 单元测试:是对最小功能单元编写的测试代码。 示例,当开发好一个 Java 阶乘的方法。 n! 1 x 2 x 3 x ..…

CRM软件哪个好?该如何选择?

CRM软件哪个好?该如何选择? CRM是集营销、销售、服务为一体的围绕客户全生命周期管理的系统,在各行各业的数字化转型大潮中,作为以消费者、终端用户、客户为主导的企业经营管理核心系统,CRM选型的难度和复杂度也在不断…

关于ETL的两种架构(ETL架构和ELT架构)

ETL,是英文 Extract-Transform-Load 的缩写,用来描述将数据从来源端经过抽取(extract)、转换(transform)、加载(load)至目的端的过程。ETL一词较常用在数据仓库,但其对象…

Java的JVM垃圾回收机制GC概述

JVM——GC机制1、什么是GC?2、GC算法的总体概述3、JVM所处的位置4、JVM整体结构5、JVM架构模型6、Java垃圾回收机制优缺点7、GC主要关注的区域垃圾回收算法:标记阶段,引用计数循环引用标记阶段:可达性分析算法GC root可以是哪些&a…

JavaScript代码题--以及一些奇奇怪怪的发现

解析 let a{b:10,c:{d:[11,12],e:13}},实现 10111213 效果 解 const a{b:10,c:{d:[11,12],e:13}}function sum(obj) {let total 0;const value Object.values(obj)value.forEach(item>{total typeof item number ? item : sum(item)})return total }const …

Java家教系统家教网站家教兼职系统

简介: 用户可以注册成为学员也可以是教员。教员发布家教信息,学员根据自己的要求查找符合自己的教员。学员预约教员的某一天去家教,教员可以在个人中心里查看,是否接受该预约。在教员接受或拒绝之前,学员随时可以取消…

数据库,计算机网络、操作系统刷题笔记23

数据库,计算机网络、操作系统刷题笔记23 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话,你就得学数据库,sql,oracle…

基于 Vue 制作一个猜拳小游戏

目录前言:项目效果展示:对应素材:代码实现思路:实现代码:总结:前言: 在工作学习之余玩一会游戏既能带来快乐,还能缓解生活压力,跟随此文一起制作一个小游戏吧。 描述&…