Если вы хотите получить координаты одного обнаружения, вы можете использовать -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