关于yolo算法

2019-05-07  本文已影响0人  Songger

下面这篇文章可以解决大多数我的疑问,
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)
上一篇下一篇

猜你喜欢

热点阅读