精华内容
下载资源
问答
  • 【SSD目标检测】2:如何制作自己的数据集

    万次阅读 多人点赞 2018-07-20 14:04:07
    前言:因为要依赖上一章SSD目标检测(1):图片+视频版物体定位(附源码)来训练预测自己的数据集,所以建立自己的数据集是一个复杂且避不开的步骤,以下给出了制作自己的数据集所要经过的简单步骤,而后也有更详细的...

    前言:因为要依赖上一章SSD目标检测(1):图片+视频版物体定位(附源码)来训练预测自己的数据集,所以建立自己的数据集是一个复杂且避不开的步骤,以下给出了制作自己的数据集所要经过的简单步骤,而后也有更详细的说明奉上。

    1. VOC2007数据集简介;
    2. 规定文件夹名称,图片名称、格式;如何生成txt文件;
    3. 如何使用labelImg工具给图片上标签,并生成.xml文件;
    4. 最后如何将.xml文件生成SSD所需要的.tfrecords文件;

    以下过程详细,如有不明请留言提醒,详细过程如下:

    -----------------------------------------------------------------------------------------
    本篇博客,我的数据集、代码存储在这里,有需要的同学自己下载。
    -----------------------------------------------------------------------------------------

    1、VOC2007数据集简介

    知己知彼,方百战不殆。想制作自己的数据集当然要先了解SSD使用的数据集VOC2007长啥样。VOC2007下载链接 ,密码是:m5io。(VOC2007完整下载有3个压缩包+1个PDF,上面链接里只包含其中一个压缩包VOCtrainval_06-Nov-2007)。打开压缩包就如下图:
    这里写图片描述
    VOC2007详细介绍在这里,提供给大家有兴趣作了解。而制作自己的数据集只需用到前三个文件夹,所以请事先建好这三个文件夹放入同一文件夹内,同时ImageSets文件夹内包含Main文件夹

    • JPEGImages:用于存放训练、测试的图片(图片格式最好为.jpg)
    • Annotations:用于存放.xml格式的文件,也就是图片对应的标签,每个.xml文件都对应于JPEGImages文件夹的一张图片
    • ImageSets:内含Main文件夹,在…/ImageSets/Main文件夹下包含test.txt、train.txt、val.txt、trainval.txt四个文件,生成的方式第二步有详细说明

    -----------------------------------------------------------------------------------------
    -----------------------------------------------------------------------------------------

    2、制作自己的数据集

    第一步:下载图片,存入JPEGImages文件夹——你可以直接从各种渠道下载得到所需要的图片集,存入到JPEGImages文件夹下,命名格式统一为“00xxxx.jpg”,如下图:
    在这里插入图片描述
    -------------------------------------------------------------------------------------**----

    第二步:使用labelImg工具给图片打标签——这是最重要的一步。如果你的python已经pip install lxml下载了lxml,就可以直接在我网盘下载labelImg工具windows版使用,密码:gyf3。
    通过以上网盘下载得到工具文件后,打开…/data/predefined_classes.txt文件,可以发现这里都是图片标签——把你将要用到的标签都事先存入在这里,注意标签不能有中文。每次使用都把.exedata这两个文件拖到桌面上(如果直接在文件夹内运行.exe会报错不能运行),打开labelImg.exe文件,运行界面如下:就可以开始给图片打标签了
    这里写图片描述
    labelImg工具简单的使用步骤就是:

    1. 打开单个文件,或者打开一个图片文件夹
    2. 给目标物体建立box边框
    3. 对box边框内的物体贴上标签
    4. 把一张图片内所有目标物都打上各自标签后,再保存生成.xml文件,注意存入Annotations文件夹,文件名也要与当前图片保存一致
    5. 然后next下一张图片继续打标签,直到所有图片内物体都打上了标签,最后exit

    -------------------------------------------------------------------------------------**----

    第三步:生成Main文件夹下的.txt文件——在主目录下运行以下代码既可生成test.txt、train.txt、val.txt、trainval.txt四个文件,请注意每一个path地址是否正确(其实这四个txt文件在后续并没有什么用处)

    # -*- coding:utf-8 -*-
    # -*- author:zzZ_CMing  CSDN address:https://blog.csdn.net/zzZ_CMing
    # -*- 2018/07/18; 15:19
    # -*- python3.5
    import os  
    import random  
    
    trainval_percent = 0.7  
    train_percent = 0.8
    xmlfilepath = 'Annotations/'
    txtsavepath = 'ImageSets/Main'  
    total_xml = os.listdir(xmlfilepath)  
    
    num = len(total_xml)  
    list = range(num)  
    tv = int(num*trainval_percent)  
    tr = int(tv*train_percent)  
    trainval = random.sample(list,tv)  
    train = random.sample(trainval,tr)  
    
    ftrainval = open(txtsavepath+'/trainval.txt', 'w')  
    ftest = open(txtsavepath+'/test.txt', 'w')  
    ftrain = open(txtsavepath+'/train.txt', 'w')  
    fval = open(txtsavepath+'/val.txt', 'w')  
    
    for i in list:  
        name = total_xml[i][:-4]+'\n'  
        if i in trainval:  
            ftrainval.write(name)  
            if i in train:  
                ftrain.write(name)  
            else:  
                fval.write(name)  
        else:  
            ftest.write(name)  
    
    ftrainval.close()  
    ftrain.close()  
    fval.close()  
    ftest .close()
    print('Well Done!!!')
    

    运行完成,得到如下文件:可以打开看一看,内容就是各个图片的索引,意味着哪些图片用做训练,哪些用做测试。
    这里写图片描述

    3、用.xml标签,生成.tfrecord文件

    说明:SSD框架所用到的标签文件并不直接是.xml格式文件,而是.tfrecord文件,因为这一部分比较重要,代码先贴上——只为想研究如何生成.tfrecord文件的同学准备,想要了解 SSD目标检测(3):使用自己的数据集做识别(详细说明附源码),请继续点击,详细过程讲解+源码即刻奉上

    # -*- coding:utf-8 -*-
    # -*- author:zzZ_CMing  CSDN address:https://blog.csdn.net/zzZ_CMing
    # -*- 2018/07/17; 13:18
    # -*- python3.5
    """
    特别注意: 17行VOC_LABELS标签要修改,189行的path地址要正确
    """
    
    import os
    import sys
    import random
    import numpy as np
    import tensorflow as tf
    import xml.etree.ElementTree as ET
    
    # 我的标签定义只有手表这一类,所以下面的VOC_LABELS要根据自己的图片标签而定,第一组'none': (0, 'Background')是不能删除的;
    VOC_LABELS = {
        'none': (0, 'Background'),
        'watch': (1, 'watch')
    }
    
    # 图片和标签存放的文件夹.
    DIRECTORY_ANNOTATIONS = 'Annotations/'
    DIRECTORY_IMAGES = 'JPEGImages/'
    
    # 随机种子.
    RANDOM_SEED = 4242
    SAMPLES_PER_FILES = 3  # 每个.tfrecords文件包含几个.xml样本
    
    
    
    def int64_feature(value):
        """
        生成整数型,浮点型和字符串型的属性
        """
        if not isinstance(value, list):
            value = [value]
        return tf.train.Feature(int64_list=tf.train.Int64List(value=value))
    
    
    def float_feature(value):
        if not isinstance(value, list):
            value = [value]
        return tf.train.Feature(float_list=tf.train.FloatList(value=value))
    
    
    def bytes_feature(value):
        if not isinstance(value, list):
            value = [value]
        return tf.train.Feature(bytes_list=tf.train.BytesList(value=value))
    
    
    def _process_image(directory, name):
        """
        图片处理
        """
        # Read the image file.
        filename = directory + DIRECTORY_IMAGES + name + '.jpg'
        image_data = tf.gfile.FastGFile(filename, 'rb').read()
    
        # Read the XML annotation file.
        filename = os.path.join(directory, DIRECTORY_ANNOTATIONS, name + '.xml')
        tree = ET.parse(filename)
        root = tree.getroot()
    
        # Image shape.
        size = root.find('size')
        shape = [int(size.find('height').text),
                 int(size.find('width').text),
                 int(size.find('depth').text)]
        # Find annotations.
        bboxes = []
        labels = []
        labels_text = []
        difficult = []
        truncated = []
        for obj in root.findall('object'):
            label = obj.find('name').text
            labels.append(int(VOC_LABELS[label][0]))
            labels_text.append(label.encode('ascii'))  # 变为ascii格式
    
            if obj.find('difficult'):
                difficult.append(int(obj.find('difficult').text))
            else:
                difficult.append(0)
            if obj.find('truncated'):
                truncated.append(int(obj.find('truncated').text))
            else:
                truncated.append(0)
    
            bbox = obj.find('bndbox')
            a = float(bbox.find('ymin').text) / shape[0]
            b = float(bbox.find('xmin').text) / shape[1]
            a1 = float(bbox.find('ymax').text) / shape[0]
            b1 = float(bbox.find('xmax').text) / shape[1]
            a_e = a1 - a
            b_e = b1 - b
            if abs(a_e) < 1 and abs(b_e) < 1:
                bboxes.append((a, b, a1, b1))
    
        return image_data, shape, bboxes, labels, labels_text, difficult, truncated
    
    
    def _convert_to_example(image_data, labels, labels_text, bboxes, shape,difficult, truncated):
        """
        转化样例
        """
        xmin = []
        ymin = []
        xmax = []
        ymax = []
    
        for b in bboxes:
            assert len(b) == 4
            # pylint: disable=expression-not-assigned
            [l.append(point) for l, point in zip([ymin, xmin, ymax, xmax], b)]
            # pylint: enable=expression-not-assigned
    
        image_format = b'JPEG'
        example = tf.train.Example(features=tf.train.Features(feature={
            'image/height': int64_feature(shape[0]),
            'image/width': int64_feature(shape[1]),
            'image/channels': int64_feature(shape[2]),
            'image/shape': int64_feature(shape),
            'image/object/bbox/xmin': float_feature(xmin),
            'image/object/bbox/xmax': float_feature(xmax),
            'image/object/bbox/ymin': float_feature(ymin),
            'image/object/bbox/ymax': float_feature(ymax),
            'image/object/bbox/label': int64_feature(labels),
            'image/object/bbox/label_text': bytes_feature(labels_text),
            'image/object/bbox/difficult': int64_feature(difficult),
            'image/object/bbox/truncated': int64_feature(truncated),
            'image/format': bytes_feature(image_format),
            'image/encoded': bytes_feature(image_data)}))
        return example
    
    
    def _add_to_tfrecord(dataset_dir, name, tfrecord_writer):
        """
        增加到tfrecord
        """
        image_data, shape, bboxes, labels, labels_text, difficult, truncated = \
            _process_image(dataset_dir, name)
        example = _convert_to_example(image_data, labels, labels_text,
                                      bboxes, shape, difficult, truncated)
        tfrecord_writer.write(example.SerializeToString())
    
    
    def _get_output_filename(output_dir, name, idx):
        """
        name为转化文件的前缀
        """
        return '%s/%s_%03d.tfrecord' % (output_dir, name, idx)
    
    
    def run(dataset_dir, output_dir, name='voc_train', shuffling=False):
        if not tf.gfile.Exists(dataset_dir):
            tf.gfile.MakeDirs(dataset_dir)
    
        path = os.path.join(dataset_dir, DIRECTORY_ANNOTATIONS)
        filenames = sorted(os.listdir(path))
        if shuffling:
            random.seed(RANDOM_SEED)
            random.shuffle(filenames)
    
        i = 0
        fidx = 0
        while i < len(filenames):
            # Open new TFRecord file.
            tf_filename = _get_output_filename(output_dir, name, fidx)
            with tf.python_io.TFRecordWriter(tf_filename) as tfrecord_writer:
                j = 0
                while i < len(filenames) and j < SAMPLES_PER_FILES:
                    sys.stdout.write(' Converting image %d/%d \n' % (i + 1, len(filenames)))  # 终端打印,类似print
                    sys.stdout.flush()  # 缓冲
    
                    filename = filenames[i]
                    img_name = filename[:-4]
                    _add_to_tfrecord(dataset_dir, img_name, tfrecord_writer)
                    i += 1
                    j += 1
                fidx += 1
    
        print('\nFinished converting the Pascal VOC dataset!')
    
    
    def main(_):
        # 原数据集路径,输出路径以及输出文件名,要根据自己实际做改动
        dataset_dir = "../VOC2007_test/"
        output_dir = "tfrecords_/"
        if not os.path.exists(output_dir):
            os.mkdir(output_dir)
    
        run(dataset_dir, output_dir)
    
    
    if __name__ == '__main__':
        tf.app.run()
    

    得到的.tfrecords文件如下:
    这里写图片描述
    到这里,用于SSD的自己的数据集就建立完成了,主要需要的就是.tfrecords文件。下一章 SSD目标检测(3):使用自己的数据集做识别(详细说明附源码)介绍如何用自己的数据集开展训练预测

    展开全文
  • python制作yolov2目标检测标注数据集

    千次阅读 2017-11-07 21:48:07
    利用python制作yolov2目标检测数据集
    YOLOv2-photo-mark

    2017-11-7

    网上关于制作yolo数据集的代码有好几份,之前看到的有imageLabel和yolo-mark,这两个功能都比较完善,但是代码比较复杂,后者还需要配置,且得到的数据需要再经过一次转换,如果是像我这样只需要做一类物体的标记或者需要制作的数据集较小的朋友,更适合用本代码中的方法。
    这个代码是基于网上的一份代码修改的,刚刚找了半天已经找不到出处了,如果知道的同学可以告知一下。
    最初的代码比较简陋,运行起来也有一些问题,且输出的格式不能直接用于yolov2的训练,修改过后基本没什么问题。


    使用方法

    在代码文件所在目录下新建images文件夹、labels文件夹,将需要做标记的图片放到images文件夹中。最后得到的标签文件会存放到labels文件夹下。
    代码比较简洁,因此功能也相对来说比较简陋,目前只能对一类物体进行标记,如果需要制作多类的标签数据,只能修改代码67行后重复运行代码。以后有时间会将代码进行完善。
    本代码用到了opencv,利用opencv进行标记,需要提前配置好opencv库(既然要用yolov2,opencv肯定还是要装的)。
    在命令行窗口下,输入 python YOLOv2_photo_mark.py进入标记界面。
    左键拖动进行绘制,当前图片绘制完成后,点击右键绘制下一张图片,直到标记完成images目录下的所有图片。

    代码在github上:点击

    展开全文
  • 多目标跟踪技术

    千次阅读 2017-12-29 22:18:22
    多目标跟踪MTT,边扫边跟TWS是MTT的一种特殊情况。机载雷达TWS属于微波单探测器MTT技术问题。 概率数据关联PDA,假设跟踪MHT,帧分配MFA,模糊理论,随机集理论,神经网络,粒子滤波。 1.机载空空多目标...

    多目标跟踪MTT,边扫边跟TWS是MTT的一种特殊情况。机载雷达TWS属于微波单探测器MTT技术问题。

    概率数据关联PDA,多假设跟踪MHT,多帧分配MFA,模糊理论,随机集理论,神经网络,粒子滤波。


    1.机载空空多目标跟踪

    (1)攻击:典型的特点是作战飞机具有多目标跟踪和多目标攻击的能力,从而能在较远的作用距离上同时发现并跟踪多个有威胁的目标,并与火控系统配合发射多枚导弹、分别攻击不同的目标,达到先敌发现、先发制人、以少胜多的目的。

    (2)预警:利用多目标跟踪技术可以跟踪多达上百个有威胁的目标,不仅可以大大提高预警能力,而且在战斗中还可以及时为空中和地面部队提供战场信息,形成一个空中指挥中心,对提高各种武器系统的作战效能、减少伤亡、控制战场事态起着重要的作用。

    2.机载空地多目标跟踪

    完成对地面多个目标的跟踪和监视。


    MTT主要的内容包括:坐标变换(完成对跟踪坐标系和状态变量的选择)、航迹起始(如何从点迹建立航迹)、数据关联(完成点迹与航迹的配对)、跟踪维持或称跟踪算法(完成对被跟踪目标的滤波和预测)、航迹消除(种植不需要或者不能继续跟踪的航迹)、性能评估。


    设计MTT时坐标系和状态变量选择的好坏,关系到MTT的性能和计算量的大小。


    不同的探测条件导致雷达检测出的目标具有不同的特点,如,空空目标具有机动性强、机动和非机动同时存在等特点,空海和空面目标具有检测概率低、目标相互靠近、目标运动速度慢及转弯机动性强等特点,总体来讲,在航迹起始中最困难的是:

    (1)机动和非机动目标的航迹起始;(2)相互靠近目标的航迹起始;(3)低检测概率下的航迹起始;(4)密集杂波和干扰环境下的航迹起始。


    对机动目标的跟踪主要的两个问题:一方面是建立更符合实际目标机动情况的跟踪模型和新的跟踪滤波方法;另一方面是采用各种机动分析、估计方法以及通过新的理论改进跟踪滤波方法。

    多目标数据关联是MTT技术中最重要和最困难的问题。它所面临的主要问题除关联域大小的确定外,还有从当前N个与上次M个点迹及已形成的T个目标航迹中判断那个点迹属于那个目标。当一个目标的点迹同时落入两个以上目标的关联域内,或几个目标的点迹同时落入一个目标的关联域内时,或目标和杂波的数目增加时,都是数据关联变得更复杂。近年来又提出了在杂波和干扰背景下的多目标跟踪问题,解决这一问题也存在数据关联问题。因此,数据关联问题在MTT技术中显得非常重要。


    地/海面慢动目标跟踪的主要困难是低检测概率下的航迹起始和数据关联。

    相控阵雷达,由于其波束的捷变性和扫描图形的种类多,特别是在MTT状态对多个目标进行回扫时,雷达的扫描方式、波束的移动时间往往不是等间隔连续变化的,而是根据目标的运动、周边态势,及所处的电磁环境等因素变化。所以相控阵雷达多目标跟踪的主要困难时点迹预处理和变采样周期的跟踪滤波方法。

    总之,一套性能良好的MTT系统,应能在下述条件下利用测量数据跟踪多个目标:

    (1)存在杂波或干扰及接受机噪声引起的虚警,

    这里写图片描述
    (2)目标的检测概率小于1,这里写图片描述; 
    (3)目标的航迹可能起始或终止于任意时刻、任何空间; 
    (4)目标可能发生机动; 
    (5)由于信号处理能力的有限,测量数据不是很准确,存在测量误差; 
    (6)由于编队或交叉飞行,目标航机靠的很近。

    如何对上述MTT系统的性能进行正确的评价也是需要研究和解决的问题。MTT系统性能评估方法分两种:(1)传统的蒙特卡洛模拟法;(2)解析分析法。蒙特卡罗模拟法的优点是直观、可普遍适应于各种情况,缺点是计算量大、负责。目前实际应用中大多采用这种方法,但缺少普遍使用的性能评估的准则。解析方法是一种理论分析的方法,不需要大量的计算,但也没有普遍使用的解析方法,一般都针对某种具体的方法进行分析评定,普遍适应性差。

    利用MTT性能评估不仅可以分析在一定的作战环境下某种MTT系统能达到的性能,从而选择最佳MTT系统设计方案,而且还可以反过来确定所要求达到的性能,从而选择最佳MTT系统设计方案,即对雷达系统的辅助设计,因此性能评估是研究MTT系统非常重要的手段。

    MTT技术中存在的主要问题和关键技术。 
    1.坐标系的选择 
    (1)直角坐标系 
    (2)球坐标系 
    (3)北东下坐标系 
    (4)混合坐标系 
    (5)航迹定向坐标系 
    2.点迹录取与预处理 
    点迹录取是实现MTT的第一步,它主要由下属几部分功能组成: 
    注:TWS为机载脉冲多普勒火控雷达 
    (1)提高俯仰角精度 
    一般采用按目标回波幅度进行加权求质心方法解决;进一步也可按信噪比(SNR)或天线增益梯度进行加权修正;更复杂的方法则是利用单脉冲测角原理获得俯仰角或将俯仰角通道改为点扫。 
    (2)多余回波或点迹消除逻辑 
    多余回波消除的任务是合并由一个目标产生的多个点迹,确定多个目标。处理时应注意在密集目标环境下对多个目标的分辨。 
    由于跟踪目标数量多,为了减少计算量,处理时需要将扫描区域分成若干扇区进行处理。根据划定的扇区,当雷达天线扫描过每个扇区后,首先按扇区进行扇区内多余回波消除处理,将一个目标产生的多个目标回拨合并成一个目标的点迹。随着天线的扫面,目标也在运动,两个相邻扇区之间的点迹可能来自同一个目标。因此,存在相邻两个扇区的多余点迹消除预处理问题。扇区内多余点迹消除预处理完成后,在下一个雷达天线帧对相邻扇区边缘跨扇区的点迹进行相邻扇区多余点迹消除,将跨在两个扇区之间的多余点迹合并。为了保证对相邻扇区边缘跨扇区的点迹进行正确处理,设计时需要将方位和距离重叠半个扇区。 
    (3)多目标分辨 
    应有一种处理方法能分辨多个相近的空间目标,以便真正做到多目标跟踪和威胁判断。

    3.航迹起始、确定和消除 
    航迹起始一般由三部分组成:(1)建立源生航迹(航迹头);(2)建立临时航迹;(3)确认临时航迹,建立可靠航迹。

    航迹消除包括两个部分:(1)消除由虚假信号产生的临时航迹;(2)消除由于目标飞出雷达探测区域或目标威胁等级降低或降低由驾驶员强迫终止的可靠航迹。

    4.数据关联

    代表性的方法有:最近邻法、航迹分裂法、高斯和法、0-1整数规划法、最大似然法、全邻域法、概率数据关联法(PDA)、联合概率数据关联法(JP-DA)、简化的概率数据关联法(SJPDA)、多假设法(MHT)、概率多假设(PMHT)法、交互多模式概率数据关联法(IMPDA)和神经网络概率数据关联法(NPDA)等。

    上述方法可以大致分为价值函数值法、贝叶斯法两大类。价值函数值法以观测序列的似然比为基础,依赖于目标的时间累积信息(观测时间序列);贝叶斯方法则侧重利用空间累积信息(空间概率数据关联)。


    展开全文
  • 快速多目标检测——YOLO9000

    万次阅读 2017-01-04 14:13:52
    本次介绍一篇有关快速目标检测的文章...项目主页:http://pjreddie.com/darknet/yolo/ —————————— Introduction —————————— 通用的目标检测不但要够快够准,还要能够检测类的目标。但实际情

    本次介绍一篇有关快速目标检测的文章《YOLO9000: Better, Faster, Stronger》。该方法记作YOLOv2,相比v1除了在性能上有所提升之外,更是在速度上表现惊人。

    项目主页:http://pjreddie.com/darknet/yolo/

    ———————— Introduction ————————

    通用的目标检测不但要够快够准,还要能够检测多类的目标。但实际情况是,目标检测数据集包含的类别数都太少,远远小于图像分类数据集所包含的类别数(比如ImageNet)。

    于是,本文提出了一种联合训练的方法,可以同时利用检测数据集和分类数据集来训练目标检测器。具体思路是,利用目标检测数据集来学习目标的准确定位,用分类数据集来增加检测的目标类别数以及检测器的鲁棒性。

    通过采用上述策略,本文利用COCO目标检测数据集和ImageNet图像分类数据集训练得到了YOLO9000,可以实时地检测超过9000类的目标。

    ———————— Better ————————

    YOLOv1同Fast RCNN相比存在定位不准以及召回率不如Region Proposal方法等问题。因此,V2的主要目标就是在保持分类准确率的同时提高召回率和定位准确度。

    为了做到又快又好,所以文章在简化的网络上采用了很多策略来提高性能,具体用的技术如下表:

    float

    (1) Batch Normalization

    BN可以加速收敛,同时BN也可以替代Dropout等正则化手段来防止网络过拟合。

    (2) High Resolution Classifier

    YOLOv1是在ImageNet预训练了一个输入为224x224大小的模型,当想要检测小目标时需要把图像resize到448x448,同时网络也要相应地进行调整。

    为了适应较大的分辨率,YOLOv2以448x448的分辨率在ImageNet上预训练了10个epoch,然后将该预训练模型在检测数据上finetune,最终得到了 4% mAP的提升。

    (3) Convolutional With Anchor Boxes

    YOLOv1直接通过全连接层来预测bounding box的坐标,与Fast-RCNN相比有两个缺点:
    一是只能预测98个框,数量太少,而Fast-RCNN在conv-map上每一个位置都可以预测9个框;二是预测坐标不如预测坐标相对偏移量有效,Fast-RCNN预测的是偏移量和置信度。

    因此,YOLOv2移除了全连接层,并将网络输入由448调整为416,使得最后输出的feature map大小为13x13(416/32)。之所以要调整输入为416,是为了使得最后的输出size是一个奇数,这样就可以保证feature map只有一个中心。由于目标(特别是大目标)往往位于图像中心,因此一个正中心来预测位置要比4个要好。

    通过在卷积层使用anchor boxes,网络可以预测超过1000个窗口,虽然这导致了准确率降低了0.3mAP,但是召回率却足足提高了7%。

    (4) Dimension Clusters

    Fast-RCNN中使用3种scales和3中aspect ratios(1:1,1:2,2:1)在每个位置产生了9个anchor boxes。作者认为这种手动选取的anchor不够好,虽然网络最终可以学出来,但如果我们可以给出更好的anchor,那么网络肯定更加容易训练而且效果更好。

    作者通过K-Means聚类的方式在训练集中聚出好的anchor模板。需要注意的是,在使用K-Means中如果使用传统的欧式距离度量,那么大的框肯定会产生更大的误差,因此作者更换为基于IOU的度量方式:

    \(d(box,centroid) = 1- IOU(box,centroid)\)。

    下表表明,基于K-Means的anchor box选取比手动选取效果好:

    float

    通过权衡速度与性能,作者最终选则聚5类时得到的anchor boxes。
    float

    (5) Direct Location Prediction

    作者在训练中发现模型不稳定,特别是训练早期。这主要是由anchor box回归引起的,因为预测的是偏移量,这可能导致前期预测得到的框偏移到图像任何位置。

    因此,作者采用了一种较强约束的定位方法,参见下图:

    float

    如上图,每个cell会预测5个bounding box,每个bounding box预测 \(t_x,t_y,t_w,t_h,t_o\) 这5个参数。其中 \(t_x,t_y\) 经过sigmoid约束到 \([0\quad1]\),因此预测出来的bounding box的中心点 \(b_x,b_y\)一定位于以 \(c_x,c_y\)为左顶点的cell内。(其中, \(p_w,p_h\)为anchor box的宽高)

    (6) Fine-Grained Features

    Faster F-CNN、SSD通过使用不同尺寸的feature map来取得不同范围的分辨率, YOLOv2则通过添加一个passthrough layer来取得上一层26x26的特征,并将该特征同最后输出特征相结合,以此来提高对小目标的检测能力。具体的做法是将相邻的特征堆积到不同channel中,从而将 \(26\times26\times512\) 的feature map变为 \(13\times13\times2048\) 的feature map。

    (7) Multi-Scale Training

    由于网络只有卷积和pooling层,因此实际上可以接受任意尺寸的输入,作者也希望YOLOv2对各种尺度的图片都足够鲁棒。

    因此,训练过程中每迭代10个batch,都会随机的调整一下输入尺度,具体尺度列表为 \(320,352,…,608\)。

    当输入图片尺寸比较小的时候检测速度比较快,当输入图片尺寸比较大的时候则精度较高,所以YOLOv2可以在速度和精度上进行权衡。

    ———————— Faster ————————

    (1) DarkNet-19

    为了提高性能同时加快速度,作者设计了一个带有19个卷积核5个max-pooling的网络,命名为Darknet-19。设计该网络时主要参考了VGG使用大量3x3卷积,参考NIN使用1x1卷积和avg-pooling,使用BN等。具体网络如下图:

    float

    (2) Training for classification

    先在Imagenet(1000分类)上以224x224输入训练160 epochs,然后再更改输入为448x448继续finetune 10 epochs。(训练的具体设置参见原文)

    (3) Training for detection

    修改(2)预训练的网络的最后几层,然后在检测数据集上finetune。(具体怎么修改还是要参看原文和相关代码)。 以VOC的20类目标检测为例,最后的输出应该是 \(13\times13\times125\) , \(13\times13\) 是feature map尺寸; \(125 = 5\times(20+5)\)表示每个位置预测5个框,每个框有20个分类概率和5个boundingbox参数。

    ———————— Stronger ————————

    前面提到过,作者同时使用检测数据集和分类数据集来训练多目标检测器。具体做法是,将两个数据集混合,训练时如果遇到来自检测集的图片则计算完整的Loss,如果遇到来自分类集的图片则只计算分类的Loss。

    上面的想法实现起来会有一点问题,因为通常使用的softmax假定类间独立,而Imagenet(分类集)包含了100多种狗,COCO(检测集)就只有狗这一类。为了解决这个无法融合的问题,作者使用了multi-label模型,即假定一张图片可以有多个label,并且不要求label间独立。

    (1) Hierarchical Classification

    Imagenet中的类别是从WordNet(描述对象关系的一个语言集合)中选取的。WordNet是一种比较庞大的直线图结构,作者使用分层树的结构来对其进行简化。

    具体地,遍历Imagenet的label,然后在WordNet中寻找该label到根节点(指向一个物理对象)的路径,如果路径只有一条,那么就将该路径直接加入到分层树结构中。然后处理剩余的具有多条路径的label,并将最短路径加入。

    最终可以得到下图所示的分类树:

    float

    至于分类时的概率计算,大家应该可以很容易看出需要采用条件概率,即某个节点的概率值应当等于该节点到根节点的所有条件概率之积。而且,softmax操作也同时应该采用分组操作,如下图:

    float

    (2) Dataset Combination With WordTree

    通过WordTree可以将不同的数据集合并使用。

    (3) Joint Classification and Detection

    最终制作了一个9418分类的WordTree,并且通过重采样保证Imagenet和COCO的数据比例为4:1。

    对于检测数据集中的图片计算完整的Loss并反方向传播,对于分类数据集图片,则只计算分类的loss,同时假设IOU最少为 .3,最后根据这些假设进行反向传播。

    ———————— Conclusion ————————

    没什么好总结的,最后放一张速度对比图吧。

    float

    展开全文
  • 目标检测之VOC2007格式数据集制作

    万次阅读 热门讨论 2018-03-21 16:42:10
    前几天师弟问我如何做自己的VOC2007数据集的事情,当时跟他说网上资料很,让他自己查查,但不知道什么原因和我说还是没搞好。自己想想也是,不熟悉的东西即便在别人眼里看似很简单,到了自己跟前也变得深奥到天际...
  • TensorFlow Object Detection API 技术手册(5)——制作自己的目标检测数据集(一)收集图片(二)安装图像打标工具labelImg(三)将XML文件转化为CSV文件(四)生成TFRecords文件 从这一节开始我们要开始准备训练...
  • MS COCO 是google 开源的大型数据集, 分为目标检测、分割、关键点检测三大任务, 数据集主要由图片和json 标签文件组成。 coco数据集由自带COCO API,方便对json文件进行信息读取。本博客介绍是目标检测数据集格式...
  • labelme自己制作目标检测数据集

    千次阅读 2018-09-30 21:26:19
    Labelme windows安装包在我的github里: https://github.com/BonnieHuangxin/Fast-RCNN-pytorch 打开这个 然后就可以打标签了 打完标签的图片再用fast rcnn训练模型。...
  • 利用深度学习方法如Faster R-CNN或YOLOv3等进行目标检测时需要训练数据集,我们很少会根据自己的数据集格式修改代码,更的是按照一定格式修改自己的数据格式,而PASCAL VOC为图像识别和分类提供了一整套标准化的...
  • Unity Cinemachine插件学习笔记,实现单目标多目标之间切换 *版本要求Unity2017.1及以上。 参考资料: [官方] Unity 2017.1正式版发布 Cinemachine插件:Cinemachine。  Cinemachine在2017版中正式加入...
  • 多目标优化_学习笔记(三)MOEA/D

    万次阅读 多人点赞 2018-03-26 16:13:50
    本篇博客出于学习交流目的,主要是用来记录自己学习多目标优化中遇到的问题和心路历程,方便之后回顾。过程中可能引用其他大牛的博客,文末会给出相应链接,侵删! REMARK:本人纯小白一枚,如有理解错误还望...
  • 数学建模(3.9)多目标规划

    千次阅读 2019-08-03 18:20:10
    数学建模(3.9)多目标规划 理解 多目标规划跟一般的规划问题有所不同,多目标规划通常是要求学生做出满足各个优先度要求的最佳抉择。衡量出尽量满足所有需求而得出使得目标最优(如收益最大)的方案。 由于...
  • 数学建模——lingo实现多目标规划

    万次阅读 2019-08-03 18:20:24
    数学建模——lingo实现多目标规划
  • 玩转Makefile | 一次编译目标

    万次阅读 2018-04-15 16:40:33
    0. 相关阅读  玩转Makefile | 系列综述  玩转Makefile | 基础入门  玩转Makefile | 四步教你从零开始写Makefile  玩转Makefile | 企业... 玩转Makefile | 一次编译目标   1. 使用场景 本教程所介绍...
  • 睿智的目标检测20——利用mAP计算目标检测精确度

    万次阅读 多人点赞 2020-03-06 17:12:48
    睿智的目标检测20——利用mAP计算目标检测精确度学习前言GITHUB代码下载知识储备1、IOU的概念2、TP TN FP FN的概念3、precision(精确度)和recall(召回率)4、概念举例5、单个指标的局限性什么是AP绘制mAP ...
  • detectron2训练自己的数据实现目标检测和关键点检测——制作转换自己的数据集1. 配置2. 使用dlib的imglab标注工具标记图片3. 转换xml文件为coco数据格式 1. 配置 基本配置 版本号 CPU Intel® Core™ i5-...
  • 1.数据集 使用faster-rcnn的时候需要把数据集做成voc的格式,这和之前的caffe的图片分类很不一样,所以第一应该清楚voc是什么样的格式。这里有一个比较好的工具可以制作Annotations的xml文件的工具:labelImg ...
  • 多目标跟踪入门篇(1):SORT算法详解

    千次阅读 2019-07-15 22:48:05
    一、多目标跟踪概述 多目标跟踪(Multi-Object Tracking,MOT),顾名思义,就是指在同一段影像序列中同时跟踪目标。相比单目标追踪,多目标追踪问题要更加复杂。 根据应用场景的不同,跟踪算法分为两类,...
  • 多目标跟踪-MOT16数据集格式介绍

    万次阅读 多人点赞 2018-04-04 15:56:23
    多目标跟踪的问题是这样的:有一段视频,视频是由 N 个 连续帧构成的。从第一帧到最后一帧,里面有目标,不断地有出有进,不断地运动。我们的目的是对每个目标,能跟其他目标区分开,维持他们的ID、记录他们的...
  • KERN_VER = $(shell uname -r) KERN_DIR = /lib/modules/$(KERN_VER)/build 解决办法: 1、新建一个build文件夹 2、检查KERN_VER最后面不要有空格
  • 一、解决办法 1.通过运行以下命令来安重新装 python -m pip install --user -r $IDF_PATH/requirements.txt 2.解释器的版本号可以通过运行命令以下来获得 python --version 3.根据结果,您可能要使用 python2, ...
  • Manjaro在安装源码的时候出现如下错误 这个原因大多是由于linux内核的header未安装正确 查看内核 uname -r 4.14.60-1-MANJARO 可以看到我当前的内核是4.14.60-1 ...再次执行make install 完美成功...
  • 步骤一 下载配置windows下tensorflow版faster-rcnn,参考博客: windows10下运行tensorflow版的faster-Rcnn 步骤二 制作自己的数据集参考博客:... ...用你的Annotations,ImagesSets和JPEGIm
  • 目标跟踪

    千次阅读 2012-05-12 10:41:43
    1、单目标目标跟踪还可以分为单目标的跟踪和多目标的跟踪。单目标的静态背景下的目标跟踪指的是摄像头是固定在某一方位,其所观察的视野也是静止的。通常采用背景差分法,即先对背景进行建模,然后从视频流中读取...
  • ARCGIS制作图中图——小图/一幅

    万次阅读 2019-07-23 11:48:38
    文章目录1、中国完整政区的shape文件制作2 制作图中图2.1 选择目标区域2.2 选择目标区域2.3 创建研究区shapefile2.3 创建研究区shapefile3 最后的小调整 有时,我们想把目标区域在大行政区内的位置给出来:比如像...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 394,880
精华内容 157,952
关键字:

多目标制