Извлечение одной цели из набора данных с несколькими целями

глубокое обучение Python

Это 25-й день моего участия в ноябрьском испытании обновлений. Узнайте подробности события:Вызов последнего обновления 2021 г.

окрестности

  • windows 10 64bit
  • voc dataset

Введение

Иногда для большого набора данных (например,VOC2012), нам нужно только сделать определенную цель (например,person) обучение модели, в это время необходимо отсортировать изображения конкретной цели и соответствующие аннотации для формирования нового набора данных. В этой статье мы достигнем этой цели.

Шаги

здесь сVOC2012Возьмите набор данных в качестве примера, перейдите кroboflowОфициальный общедоступный набор данных, выберитеPascal VOC 2012 Dataset

VOC2012

VOC2012

При загрузке выберитеYOLO DarknetФормат

VOC2012

VOC2012

После завершения загрузки разархивируйте его, структура каталогов такая

VOC2012

VOC2012

полныйVOC2012Содержит 20 целей, это в файле_darknet.labelsописано в

VOC2012

VOC2012

Здесь предполагается, что извлечениеpersonэтоclass, мы создаем новый скрипт в корневом каталоге набора данных и вводим следующий код

import os
import shutil

# 统计下最后图片的数量
counter = 0

# 创建2个目标文件夹,images放图片,labels放标注
if not os.path.exists('images'):
    os.makedirs('images')

if not os.path.exists('labels'):
    os.makedirs('labels')

for file in os.listdir('train'):
    flag = False
    if file.endswith('.txt'):
        f = open("train/{}".format(file), 'r')
        line = f.readline()

        # 原数据集中有部分txt,大小为0,内容为空,去除掉
        if line == "":
            continue

        while line:
            # 去除txt中的第一列的值,也就是class id
            tmp = line.split(' ')[0]

            # txt中的数据是字符串类型,人这个目标的id是14
            if tmp != "14":
                print('NOT person.')
                flag = True
                break

            line = f.readline()

        f.close()

        if not flag:
            counter += 1
            prefix = file[0: -3]

            # 拷贝符合条件的图片和对应的标注
            shutil.copy2('train/{}jpg'.format(prefix), 'images')
            shutil.copy2('train/{}'.format(file), 'labels')

print('total number image: {}'.format(counter))

После выполнения вышеуказанного скрипта подходящие изображения будут сохранены вimagesпапку, а аннотации хранятся вlabelsпапка

Затем нам нужно изменить аннотациюclass id, вVOC2012в, человекidравно 14 (начиная с 0), учитывая, что в новом наборе данных есть только категория людей, поэтомуidравен 0, то работа становитсяtxtИзмените 14 на 0 в первом столбце данных в файле.

По сути, это операция поиска и замены, и существует множество способов ее реализации. Здесь мы представляемwindowsИнструмент с открытым исходным кодом подgrepWin, имеет графический интерфейс, управление очень простое, адрес загрузки

GitHub.com/Stefan Library Eng…

После установки щелкните правой кнопкой мыши папкуlabels,выберитеsearch with grepWinОткрытым

VOC2012

VOC2012

Поиск может использовать обычный, также может использовать текст.

Используя полное текстовое сопоставление в этом примере, вам нужно поставить14заменить0, обратите внимание на пробел после него, чтобы вы могли отфильтровать больше совпадений, не беспокойтесь о замене в первую очередь, вы можете сначала искать и видеть результаты

VOC2012

VOC2012

немногоtxtфайла, совпадений может быть несколько, нажмите вышеMatchesможно изменить порядок

VOC2012

VOC2012

открыть один изtxtПроверьте это и обнаружите, что другие столбцы также могут совпадать14, так что для данной ситуации нужно модифицировать вручную, благо таких файлов не слишком много.

Если есть одно совпадение, текст можно заменить напрямую.

На данный момент набор данных одной цели обработан и может использоваться для обучения.