Как сохранить вывод darknet-видео YOLOv4 в текстовом файле для каждого кадра?

Я использую darknet для обнаружения объектов с YOLOv4 в моем индивидуальном наборе данных. Для этого обнаружения на видео я использую:

./darknet detector demo data/obj.data yolo-obj.cfg yolo-obj_best.weights -ext_output video.mp4 -out-filename video_results.mp4

Это дает мне видео с ограничивающими рамками, напечатанными для каждого обнаружения. Однако я хочу создать файл .txt (или .csv) с предсказаниями для каждого номера кадра.

Я нашел этот ответ, но это дает результат в виде json-файла, и мне нужен файл .txt или .csv. Я не так хорошо знаком с C, поэтому мне трудно преобразовать этот ответ в нужный мне формат.


person Y.Ynot    schedule 22.09.2020    source источник
comment
Вы знакомы с питоном? Возможно, вы можете вывести json и перебрать его, чтобы сохранить файл txt или csv. Это действительно просто.   -  person Rafael Junio Xavier    schedule 23.09.2020
comment
Я действительно пошел на этот подход, спасибо, что подумал!   -  person Y.Ynot    schedule 28.10.2020


Ответы (2)


Я последовал предложению Рафаэля и написал код для перехода от JSON к cvs. Я положу его сюда на случай, если кто-то захочет им воспользоваться. Это для случая, когда видео анализировалось, поэтому каждое изображение представляет собой кадр в видео.

import json
import csv

# with and height of the video
WIDTH = 1920
HEIGHT = 1080


with open('~/detection_results.json', encoding='latin-1') as json_file:
    data = json.load(json_file)
    
# open csv file
csv_file_to_make = open('~/detection_results.csv', 'w', newline='\n')

csv_file = csv.writer(csv_file_to_make)

# write the header 
# NB x and y values are relative
csv_file.writerow(['Frame ID',
                   'class',
                   'x_center',
                   'y_center',
                   'bb_width',
                   'bb_heigth',
                   'confidence'])


for frame in data:
    frame_id = frame['frame_id']
    instrument = ""
    center_x = ""
    center_y = ""
    bb_width = ""
    bb_height = ""
    confidence = ""

    if frame['objects'] == []:
        csv_file.writerow([frame_id,
                              class,
                              center_x,
                              center_y,
                              bb_width,
                              bb_height,
                              confidence
                               ])
    else:
        for single_detection in frame['objects']:
            instrument = single_detection['name']
            center_x = WIDTH*single_detection['relative_coordinates']['center_x']
            center_y = HEIGHT*single_detection['relative_coordinates']['center_y']
            bb_width = WIDTH*single_detection['relative_coordinates']['width']
            bb_height = HEIGHT*single_detection['relative_coordinates']['height']
            confidence = single_detection['confidence']
        
            csv_file.writerow([frame_id,
                              class,
                              center_x,
                              center_y,
                              bb_width,
                              bb_height,
                              confidence
                               ])
    
csv_file_to_make.close()

Надеюсь это поможет! Если вы видите решение по оптимизации этого кода, это тоже приветствуется :)

person Y.Ynot    schedule 14.07.2021

уже есть объяснение, как использовать командную строку, особенно для сохранения результата в формате .txt, ссылка:

https://github.com/AlexeyAB/darknet#how-to-use-on-the-command-line

Чтобы сэкономить время, я приведу точку, которая может быть полезна:

  • Для обработки списка изображений data / train.txt и сохранения результатов обнаружения в result.txt используйте:
  • Тест детектора darknet.exe cfg / coco.data cfg / yolov4.cfg yolov4.weights -dont_show -ext_output ‹data / train.txt› result.txt

может опоздать, но может быть полезен другим.

person Naufal Ramadhani    schedule 23.03.2021