美文网首页
关于yolo算法

关于yolo算法

作者: Songger | 来源:发表于2019-05-07 16:37 被阅读0次

    下面这篇文章可以解决大多数我的疑问,
    https://zhuanlan.zhihu.com/p/46691043
    除了一点:bound ing box是怎么标注的。从yolo源代码中可以看出label的使用方式:只有中心grid为每个对象负责,其余的虽然也有预测,但是在非极大化抑制这个步骤中就已经设置为零了。

        def load_pascal_annotation(self, index):
            """
            Load image and bounding boxes info from XML file in the PASCAL VOC
            format.
            
            args:
                index:图片文件的index
                
            return :
                label:标签 [7,7,25] 
                          0:1:置信度,表示这个地方是否有目标
                          1:5:目标边界框  目标中心,宽度和高度(这里是实际值,没有归一化)
                          5:25:目标的类别
                len(objs):objs对象长度
            """
            #获取图片文件名路径
            imname = os.path.join(self.data_path, 'JPEGImages', index + '.jpg')
            #读取数据
            im = cv2.imread(imname)
            #宽和高缩放比例
            h_ratio = 1.0 * self.image_size / im.shape[0]
            w_ratio = 1.0 * self.image_size / im.shape[1]
            # im = cv2.resize(im, [self.image_size, self.image_size])
            #用于保存图片文件的标签
            label = np.zeros((self.cell_size, self.cell_size, 25))
            #图片文件的标注xml文件
            filename = os.path.join(self.data_path, 'Annotations', index + '.xml')
            tree = ET.parse(filename)
            objs = tree.findall('object')
    
            for obj in objs:
                bbox = obj.find('bndbox')
                # Make pixel indexes 0-based  当图片缩放到image_size时,边界框也进行同比例缩放
                x1 = max(min((float(bbox.find('xmin').text) - 1) * w_ratio, self.image_size - 1), 0)
                y1 = max(min((float(bbox.find('ymin').text) - 1) * h_ratio, self.image_size - 1), 0)
                x2 = max(min((float(bbox.find('xmax').text) - 1) * w_ratio, self.image_size - 1), 0)
                y2 = max(min((float(bbox.find('ymax').text) - 1) * h_ratio, self.image_size - 1), 0)
                #根据图片的分类名 ->类别index 转换
                cls_ind = self.class_to_ind[obj.find('name').text.lower().strip()]
                #计算边框中心点x,y,w,h(没有归一化)
                boxes = [(x2 + x1) / 2.0, (y2 + y1) / 2.0, x2 - x1, y2 - y1]
                #计算当前物体的中心在哪个格子中
                x_ind = int(boxes[0] * self.cell_size / self.image_size)
                y_ind = int(boxes[1] * self.cell_size / self.image_size)
                #表明该图片已经初始化过了
                if label[y_ind, x_ind, 0] == 1:
                    continue
                #置信度,表示这个地方有物体
                label[y_ind, x_ind, 0] = 1
                #物体边界框
                label[y_ind, x_ind, 1:5] = boxes
                #物体的类别
                label[y_ind, x_ind, 5 + cls_ind] = 1
    
            return label, len(objs)
    

    相关文章

      网友评论

          本文标题:关于yolo算法

          本文链接:https://www.haomeiwen.com/subject/wkkyoqtx.html