首页 > 编程知识 正文

shapenet数据集,tensorflow框架

时间:2023-05-05 00:32:51 阅读:13247 作者:4366

Tensorflow2.0—SSD网络原理和代码分析(四)数据生成和编码Tensorflow2.0—SSD网络原理和代码分析)二)锚箱生成和Tensorflow2.0—SSD网络原理

在这里,为了调试,留下了标记在训练文件夹中的两个图像数据

如何生成这样的数据,可以看我先写的blog:Keras—数据预处理操作。

在train.py主文件中,培训数据的生成代码如下:

gen=generator(bbox_util,#这是用于训练数据编码的BATCH_SIZE类,#训练批大小lines[:num_train],#训练#模型是输入图像大小,(300,300 ) NUM_CLASSES #类别数,这里是包含背景的21 )数据的编码实际上是Generator类的generate方法,gen.generate

(自生成, train=true (3360 while true : if train : #洗牌shuffle(self.train_lines ) lines=self.train _ lines else 365292; for annotation _ line inlines 3360 if train : img,y=self.get _ ran net self.image _ size [ 03:2 ],else : img,y self.image_size其中get_random_data方法是数据扩展操作,最后返回从resize到(300,300 )的图像和相应的标记信息。

如上图所示,生成y。 这里,此图像共有三个gt框,前四个是左上角右下角的坐标,最后一维显示该gt框属于哪个类别。

然后进行坐标规范化操作并合并。

Iflen(y )!=0: boxes=NP.array (y [ :4 ],dtype=np.float32 ) boxes [ :0 ]=boxes [ :0 ]/self . 2 ]/self.image _ size [1] boxes [ 3360,3 ]=3)/self.image _ size [0] one _ hot _ label=NP.eye (self ) 1 )=0).any (and (boxes [ :2 ]-boxes [ :0 ] )=0).any ) :continuey=NP.concatenate )

将y传递给BBoxUtility类的assign_boxes方法(核心代码)。

assignment=NP.zeros ((self.num _ priors,4 self.num_classes 8) ) assignment [ :4 ]=1.0 assignment是三个部分

# :4的内容是网络应该具有的回归预测结果

# 4:-8的内容类型与预箱相对应,默认为背景

# -8的内容是当前预箱中是否包含目标

# -7:无意义

后面,首先就是对所有gt框和所有的锚点框进行IOU计算,这里值得注意的是np.apply_along_axis表示的是分别对每一个gt框进行IOU或后续处理。

def iou(self, box): # 计算出每个真实框与所有的先验框的iou # 判断真实框与先验框的重合情况 inter_upleft = np.maximum(self.priors[:, :2], box[:2]) inter_botright = np.minimum(self.priors[:, 2:4], box[2:]) inter_wh = inter_botright - inter_upleft inter_wh = np.maximum(inter_wh, 0) inter = inter_wh[:, 0] * inter_wh[:, 1] # 真实框的面积 area_true = (box[2] - box[0]) * (box[3] - box[1]) # 先验框的面积 area_gt = (self.priors[:, 2] - self.priors[:, 0])*(self.priors[:, 3] - self.priors[:, 1]) # 计算iou union = area_true + area_gt - inter iou = inter / union return iou

由于是对每一个gt框求与其所有的锚点框的IOU值,所以这里求得的iou的shape为(8732,)。

# 找到每一个真实框,重合程度较高的先验框 assign_mask = iou > self.overlap_threshold # 如果没有一个先验框重合度大于self.overlap_threshold # 则选择重合度最大的为正样本 if not assign_mask.any(): assign_mask[iou.argmax()] = True

在iou中找与真实框重叠程度大于阈值的,由于这里第一个gt框与所有的锚点框的iou都没有大于0.5,所以选择重合度最大的为正样本。(已经有一个正样本了~)进行赋值encoded_box中,并找到对应的锚点框。

# 利用iou进行赋值 if return_iou: encoded_box[:, -1][assign_mask] = iou[assign_mask]# 找到对应的先验框assigned_priors = self.priors[assign_mask]

然后,分别计算这个真实框与提取出来的正样本的锚点框的中心与长宽,目的是后续进行偏移量的计算。

# 先计算真实框的中心与长宽 #---------------------------------------------# box_center = 0.5 * (box[:2] + box[2:]) box_wh = box[2:] - box[:2] #---------------------------------------------# # 再计算重合度较高的先验框的中心与长宽 #---------------------------------------------# assigned_priors_center = 0.5 * (assigned_priors[:, :2] + assigned_priors[:, 2:4]) assigned_priors_wh = (assigned_priors[:, 2:4] - assigned_priors[:, :2]) encoded_box[:, :2][assign_mask] = box_center - assigned_priors_center encoded_box[:, :2][assign_mask] /= assigned_priors_wh encoded_box[:, :2][assign_mask] /= assigned_priors[:, -4:-2] encoded_box[:, 2:4][assign_mask] = np.log(box_wh / assigned_priors_wh) encoded_box[:, 2:4][assign_mask] /= assigned_priors[:, -2:]

到了这一步,我们来一起看一下encoded_box[:, :][assign_mask]里面的内容:

这就是符合正样本筛选之后得到的基于第一个gt框进行编码得到的。前四个是xywh的偏移量大小,最后一维是基于gt框的iou值。

同理,对所有的gt框进行处理之后,就得到了encoded_boxes,我们一起来看一下这个:

encoded_boxes[encoded_boxes[:, :, -1] != 0]

shape为(56,5),56表示的是该训练图片中符合与所有gt框iou值大于阈值或者没有大于阈值选取的最大iou值的锚点框的数量,即该训练数据图片一共有56个正样本,5表示:0-4是位置的偏移量,最后一维表示的是iou值。
再来看下,encoded_boxes:
首先,在encoded_boxes = np.apply_along_axis(self.encode_box, 1, boxes[:, :4])之后生成的encoded_boxes 的shape为(4, 43660),然后进行reshape为(4,8732,5),4表示该训练图片一共有4个gt框,8732表示生成了8732个anchor box,5的含义与上述一致。

接着,对于所有的锚点框分别看看其与4个gt框哪个框的iou值最大。

# [num_priors]求取每一个先验框重合度最大的真实框 #---------------------------------------------------# best_iou = encoded_boxes[:, :, -1].max(axis=0) best_iou_idx = encoded_boxes[:, :, -1].argmax(axis=0) best_iou_mask = best_iou > 0 best_iou_idx = best_iou_idx[best_iou_mask]

最终得到的best_iou_idx :

best_iou_idx 的shape为(54,1),表示有54个符合条件的先验框(但是上面是56,还差两个??我暂时还没搞懂。。。。。
最后一步,就是将先验框的5个值全部赋值到assignment:

# 将编码后的真实框取出 encoded_boxes = encoded_boxes[:, best_iou_mask, :] assignment[:, :4][best_iou_mask] = encoded_boxes[best_iou_idx,np.arange(assign_num),:4] #----------------------------------------------------------# # 4代表为背景的概率,设定为0,因为这些先验框有对应的物体 #----------------------------------------------------------# assignment[:, 4][best_iou_mask] = 0 assignment[:, 5:-8][best_iou_mask] = boxes[best_iou_idx, 4:] #----------------------------------------------------------# # -8表示先验框是否有对应的物体 #----------------------------------------------------------# assignment[:, -8][best_iou_mask] = 1

最终得到的assignment[assignment[:,4]==0],shape为(54,33),54表示一共54个正样本,33表示其各种信息:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。