Python - обнаружение объекта darknetpy по URL-адресу изображения вместо локального расположения файла - PullRequest
1 голос
/ 17 июня 2020

Я создал собственное обнаружение объекта yolo и пытаюсь использовать его, используя dar knet python wrapper darknetpy. Ниже мой код

from darknetpy.detector import Detector

detector = Detector('data/obj.data',
                    'cfg/yolov3_custom.cfg',
                    'weights/yolov3_custom_last.weights')


image_loc = 'filepath/image.jpg'
boxes = detector.detect(image_loc)

, он правильно возвращает координаты объектов с классом. Однако я хочу выполнить обнаружение URL-адреса изображения из Интернета, для которого я пытался загрузить изображение, используя requests и PIL, и передать объект изображения детектору, как показано ниже

import requests
from PIL import Image as PILImage
from darknetpy.detector import Detector


detector = Detector('data/obj.data',
                    'cfg/yolov3_custom.cfg',
                    'weights/yolov3_custom_last.weights')

url = 'https://images-na.ssl-images-amazon.com/images/I/81LtUCz2wYL._UY879_.jpg'
response = requests.get(url)
image_loc = PILImage.open(BytesIO(response.content))
boxes = detector.detect(image_loc)

, однако это выдает мне ошибку, поскольку я передаю объект изображения вместо локального местоположения изображения. Я знаю, что это можно исправить, сохранив объект изображения на локальном уровне в виде файла jpg или png и используя местоположение, вместо этого есть какое-либо другое решение для darknetpy, в котором я могу передать объект изображения вместо местоположения изображения из локального

Ответы [ 2 ]

1 голос
/ 24 июня 2020

Попробуйте сохранить изображения локально и после обнаружения удалите локально сохраненный файл изображения.

img_data = session.get(src).content
f_name = 'image_name.jpg'
with open(f_name, 'wb') as handler:
  handler.write(img_data)
img = cv2.imread('image_name.jpg', 0)
#After Detecting Delete te image
os.remove("image_name.jpg")
1 голос
/ 19 июня 2020

darknetpy принимает только путь к изображению и не предоставляет метод для передачи изображения как объекта.

Для достижения этой функциональности; вы можете клонировать репозиторий https://github.com/danielgatis/darknetpy и внести изменения.

Похоже, что функция detect () содержится в / src / lib.rs , это реализовано с использованием ржавчины .

fn detect(
    &self,
    img_path: String,
    thresh: Option<f32>,
    hier_thresh: Option<f32>,
    nms: Option<f32>,
) -> PyObject {
    // ... [HIDDEN]

    let image = unsafe { load_image_color(CString::new(img_path).expect("invalid img_path").into_raw(), 0, 0) };
    let sized = unsafe { letterbox_image(image, (*self.network).w, (*self.network).h) };

    unsafe { network_predict(self.network, sized.data) };

    let num_ptr = &mut 0 as *mut i32;
    let boxes = unsafe {
        get_network_boxes(
            self.network,
            image.w,
            image.h,
            thresh,
            hier_thresh,
            0 as *mut i32,
            0,
            num_ptr,
        )
    };
    // ... [HIDDEN]

img_path преобразуется в изображение . После этого img_path больше не потребляется. Поэтому в пользовательском коде создайте новую функцию, которая либо обрабатывает преобразование изображения, либо передает изображение. Я считаю, что изображение является структурой https://nebgnahz.github.io/darknet-rs/darknet/ffi/struct.image.html

Для иллюстрации я создал метод, который передает изображение напрямую:

fn detect_image(
    &self,
    image: image,
    thresh: Option<f32>,
    hier_thresh: Option<f32>,
    nms: Option<f32>,
) -> PyObject {
    // ... [HIDDEN]
    let sized = unsafe { letterbox_image(image, (*self.network).w, (*self.network).h) };

    unsafe { network_predict(self.network, sized.data) };

    let num_ptr = &mut 0 as *mut i32;
    let boxes = unsafe {
        get_network_boxes(
            self.network,
            image.w,
            image.h,
            thresh,
            hier_thresh,
            0 as *mut i32,
            0,
            num_ptr,
        )
    };
    // ... [HIDDEN]

Также вы должен иметь возможность достичь тех же результатов с dar knet (не путать с darknetpy ). Более подробную информацию можно найти на https://github.com/pjreddie/darknet/issues/289

...