利用PyQt5为目标检测Faster-rcnn-Pytorch添加GUI界面(一)

  • 功能实现

从本地文件中读取图片,在界面上显示原图,然后将图片送去faster rcnn检测物体,最后将检测图片和检测结果显示出来,同时界面要控制上述流程。

  • Pytorch的学习

在开始实现之前,我先对pytorch代码进行了学习,在网易云课堂上找到了《深度学习与PyTorch入门实战》的教学视频,对深度学习和pytorch都有一定的了解

  • PyQt5的GUI界面的学习

    关于这方面的学习,我是在淘宝上买了一本书《Python Qt GUI与数据可视化编程》,这本书写的非常详细,特别适合初学者,通过一边看书一边自己动手实现书中的功能,一章一章的学习,慢慢学会GUI界面怎么设计。

  • 对Faster Rcnn的一些理解

代码采用的是陈云写的simple-faster-rcnn-pytorch-master,地址https://github.com/chenyuntc/simple-faster-rcnn-pytorch

1.Faster Rcnn 网络就是

  .卷积网络去掉全连接层的Feature Map

  .Feature Map送到RPN生成region proposal

  .region proposal+Feature Map ——>     Rol pooling生成proposal feature maps

  .proposal feature maps经过全连接层后分类+bounding box regression获得最终的检测框的精确定位以及类别

2.RPN(作用生成region proposal)

   RPN取代了滑窗的形式(理解为窗口的步长是1个像素),输出region proposal,这里的窗口称为Anchors,数量为9,分别是3种尺寸,宽度和高度比分别为(1:1)(1:2)(2:1),3种面积分别为128,256,512。具体代码实现在model/utils/bbox_tools.py:

def generate_anchor_base(base_size=16, ratios=[0.5, 1, 2],

                         anchor_scales=[8, 16, 32]):

功能:根据基准点生成9个基本anchor,ratios表示宽高比,anchor_scales表示放缩比,只是在左上角的第一个点生成9个anchor。

实现得到所有的anchors的代码在model/region_proposal_network,用上述的基本的9个anchor分别和偏移量相加,最后得到所有anchors的坐标。

RPN就相当于用9个窗口,步长为1个像素去检测每个像素,会有9个判断,每个点初始化的9个anchors是一样的,之后送去9*2和9*4的网络做二分类(判断是背景还是目标,输出label prediction)和bounding box回归(需要4个变量,左上角的坐标x,y和宽度w,高度h,输出region proposals),9个anchors位置就会发生变化。

3.bounding box regression

   求出anchor到groundtruch平移和放缩的4个参数(dx,dy,dw,dh),比如黑色的框框是groundtruth,用   G=[Gx,Gy,Gw,Gh]表示,蓝色的框框是某个anchor用A=[Ax,Ay,Aw,Ah]表示。

平移:G’x=Ax+x’   G’y=Ay+y’

 缩放:G’w=Aw+w’  G’h=Ah+h’

 将x’,y’,w’,h’用A的函数来表示(exp为了让缩放因子大于0):

              G’x=Aw*dx+Ax    G’y=Ah*dy+Ay

              G’w=Aw*exp(dw) G'h=Ah*exp(dh)

              此公式在代码的model/utils/bbox_tools.py的

                        def loc2bbox(src_bbox, loc):

函数体现,完成目标框的位置确定,src_bbox为源框框,loc为位置偏差

则dx=(G’x-Ax)/Aw    dy=(G’y-Ay)/Ah

   dw=log(G’w/Aw)  dh=log(G’h/Ah)

此公式在

  def bbox2loc(src_bbox, dst_bbox): def bbox2loc(src_bbox, dst_bbox):

函数中体现,求出源框框和目标框的位置偏差,dst_bbox为目标框,

偏移量d是feature map 的特征向量的函数:d*=w*T*ǥ(P),ǥ(P)是整个feature map 的输入,最终损失函数表示为Loss=∑(d’*-w*Tǥ(Pi))^2判断预测框的正确性的度量标准是IOU(交并比),将预测框叠加到groundtruth上,IOU=交集/并集,如果IOU>0.5则认为是真实的检测。

代码实现在

     def bbox_iou(bbox_a, bbox_b):

3. NMS(非极大值抑制)的过程:

(1)将所有检出的output_bbox按cls score划分

(2)遍历每个集合,对每个集合单独进行如下计算:

.在每个集合内根据各个bbox的cls和score做降序排序,得list_k;

.从list_k中第一个元素t0开始,计算该元素与list_k其他元素ti之间得IOU,若IOU大于阈值,则剔除元素ti,否则暂时保留ti

.选择list_k中的第二个元素t1,重复上述操作

.对每个集合重复上述操作

 

5.解读一下model/utils/creator_tool.py的3个重要的函数

claclass ProposalCreator:

生成Rols的过程,只有前向计算,没有反向传播,对于每张图片,计算所有anchors属于目标的概率和其对应的位置参数,然后从中选取概率较大的12000张,利用位置回归参数修正这12000个anchor的位置,利用非极大值抑制,选出2000个ROIS

clclass ProposalTargetCreator(object):ss ProposalTargetCreator(object):

作用就是从2000个ROIS筛选出128个ROIS,提供groundtruth样本供给ROISHeads网络进行自我训练,ROISHeads对接收到的ROIS对它进行类别的预测以及最终目标检测位置,ROIs和GroundTruth的IOU大于0.5,选取32个作为正样本,小于0的96个作为负样本,分别对ROI_Headers进行训练

cclass AnchorTargetCreator(object):ass AnchorTargetCreator(object):

作用是从2000个anchor选出256个给RPN网络自我训练,IOU大于0.7的作为正样本,个数不得超过128,IOU小于0.3的anchor作为负样本,正负样本和为 256.

发布了6 篇原创文章 · 获赞 6 · 访问量 276

猜你喜欢

转载自blog.csdn.net/zjc20172333086/article/details/105669784