Python - 从图像URL而不是本地文件位置进行暗网对象检测



我创建了一个自定义的yolo对象检测,并尝试使用暗网python包装器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 执行检测,我尝试使用requestsPIL下载图像并将图像对象传递给检测器,如下所示

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,其中我可以传递图像对象而不是本地的图像位置

尝试在本地保存图像,并在检测到后删除本地保存的图像文件。

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")

darknetpy只接受图像路径,不提供将图像作为对象传入的方法。

要实现此功能;您可以克隆存储库 https://github.com/danielgatis/darknetpy 并实施更改。

看起来 detect(( 函数包含在/src/lib.rs 中,它是使用 rust 实现的。

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]

此外,您应该能够使用暗网获得相同的结果(不要与暗网混淆(。更多详情请见 https://github.com/pjreddie/darknet/issues/289

相关内容

  • 没有找到相关文章

最新更新