Координаты коробки Darknet Yolov3

Я хочу получить координаты ограничивающего прямоугольника (как xmin, xmax, ymin, ymax) в darknet YOLOv3. Я попробовал несколько методов, но когда я компилирую программу после изменения кодов, я не вижу никаких различий.

Как я могу найти координаты ограничивающей рамки Darknette или почему изменения не влияют на программу?


person Emrah Kalfa    schedule 29.07.2019    source источник
comment
какое репо вы используете?   -  person gameon67    schedule 30.07.2019


Ответы (2)


В Yolo координаты относительны. Это означает, что аннотации написаны так:

<object-class> <x_center> <y_center> <width> <height>

где x_center и y_center - значения с плавающей запятой относительно ширины и высоты изображения, они могут быть равны от (0,0 до 1,0]. Итак:

<x> = <absolute_x> / <image_width>

<y> = <absolute_y> / <image_height>

<width> = <box_absolute_width> / <image_width>

<height> = <box_absolute_height> / <image_height>

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

darknet.exe detector test cfg/coco.data yolov3.cfg yolov3.weights -ext_output dog.jpg

Чтобы получить координаты для вашего кода, вам нужно сначала вычислить каждую из них. Например, чтобы получить xmin:

xmin = (box_x-center - box_width/2) * img_width

и так далее.

person Hadi GhahremanNezhad    schedule 29.07.2019
comment
Я понимаю, но не могу ничего изменить, как я сказал. Вы что-нибудь об этом знаете? - person Emrah Kalfa; 29.07.2019
comment
Вам, вероятно, следует разместить программу здесь. Между тем, если ваши изменения не видны, возможно, вы вносите изменения не в нужном месте. Вы можете использовать команды печати, например, чтобы увидеть, вступили ли ваши изменения в силу или нет. - person Hadi GhahremanNezhad; 29.07.2019
comment
@EmrahKalfa, как вы скомпилировали свою программу? Вы повторно make даркнет после внесения некоторых изменений? - person gameon67; 30.07.2019

Если вы хотите получить координаты одного обнаружения, вы можете использовать -ext_output флаг AlexeyAB / darknet, как сказал @Hadi:

./darknet detector test data/obj.data cfg/yolov4.cfg yolov4.weights -ext_output data/person.jpg

Или вы можете сохранить его прямо в текстовый файл:

./darknet detector test data/obj.data cfg/yolov4.cfg yolov4.weights -ext_output data/person.jpg > output.txt

Но если у вас большое количество изображений, вам нужно обнаружить их все сразу и сохранить в файле JSON:

./darknet detector test data/obj.data cfg/yolov4.cfg yolov4.weights -ext_output -out train.json < train.txt

Где train.txt - это файл, в котором у вас есть каталоги всех ваших изображений, которые вы хотите обнаружить, а train.json - это файл JSON, в котором сохраняются результаты.

train.json файл будет выглядеть так:

[
{
 "frame_id":1, 
 "filename":"data/dataset/val/dog/image.png", 
 "objects": [ 
  {"class_id":0, "name":"dog", "relative_coordinates":{"center_x":0.452191, "center_y":0.809318, "width":0.349666, "height":0.378723}, "confidence":0.418734}, 
  {"class_id":1, "name":"cat", "relative_coordinates":{"center_x":0.454491, "center_y":0.891459, "width":0.397718, "height":0.220163}, "confidence":0.024015}
 ] 
}, 
{
 "frame_id":2, 
 "filename":"data/dataset/val/dog/image2.jpg", 
 "objects": [ 
  {"class_id":0, "name":"dog", "relative_coordinates":{"center_x":0.444495, "center_y":0.539488, "width":0.297957, "height":0.307668}, "confidence":0.991456}
 ] 
}, 
...
...
]

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

import json

def get_data(distros_dict):
    json_to_variable = []
    # For every frame.
    for distro in distros_dict:
        filename = distro['filename']
        if len(distro['objects']) != 0:
            # For every detection.
            for obj in range(len(distro['objects'])):
                # Get values.
                frame_id = distro['frame_id']
                class_id = distro['objects'][obj]["class_id"]
                x = distro['objects'][obj]["relative_coordinates"]["center_x"]
                y = distro['objects'][obj]["relative_coordinates"]["center_y"]
                width = distro['objects'][obj]["relative_coordinates"]["width"]
                height = distro['objects'][obj]["relative_coordinates"]["height"]
                confidence = distro['objects'][obj]["confidence"]
                # And save them.
                print(f"{frame_id} {class_id} {x} {y} {width} {height} {confidence}")
                json_to_variable.append([frame_id, class_id, x, y, width, height, confidence])

        # If you need to use json_to_variable here, move "json_to_variable = []" inside "for distro in distros_dict:"
    # Add your code here.
    # Or return json_to_variable to use it outside this function.

with open('train.json', 'r') as f:
    distros_dict_train = json.load(f)
with open('test.json', 'r') as f:
    distros_dict_test = json.load(f)
    
get_data(distros_dict_train)
get_data(distros_dict_test)

Другой вариант - импортировать daknet, как указано в здесь. Вызываемые здесь функции - это те, которые вы можете найти в файле darknet.py, но я думаю, что функции были изменены.

person José Martínez    schedule 09.01.2021