pjreddie / darknet

Convolutional Neural Networks
http://pjreddie.com/darknet/
Other
25.74k stars 21.33k forks source link

Unable to run example with image from scipy or opencv #595

Open dfayzur opened 6 years ago

dfayzur commented 6 years ago

Hi, There is an example script "detector-scipy-opencv.py" of running detector with image from scipy or opencv. The script is in the in examples folder. I am unable to run the script as I am getting the following error:

image

I also have seen that, there is an issue #289 related to this work it around. I followed the step to add "make_boxes", "num_boxes", and "make_probs" in the darknet.py file and compile the library. But I still unsuccessful to run the "detector-scipy-opencv.py". Now I am getting following error:

image

I am just checking, if anyone had solved this issue and ran the detector with image from scipy or opencv.

Any help to on this issue would be greatly appreciated.

ahsan856jalal commented 6 years ago

This is my darknet.py which is working . Initially I also got libcuda.so error but when I put the exac t location of libcudo file, it worked ################################

from ctypes import * import math import random import os os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID" # see issue #152 os.environ["CUDA_VISIBLE_DEVICES"]="1"

def sample(probs): s = sum(probs) probs = [a/s for a in probs] r = random.uniform(0, 1) for i in range(len(probs)): r = r - probs[i] if r <= 0: return i return len(probs)-1

def c_array(ctype, values): arr = (ctype*len(values))() arr[:] = values return arr

class BOX(Structure): fields = [("x", c_float), ("y", c_float), ("w", c_float), ("h", c_float)]

class IMAGE(Structure): fields = [("w", c_int), ("h", c_int), ("c", c_int), ("data", POINTER(c_float))]

class METADATA(Structure): fields = [("classes", c_int), ("names", POINTER(c_char_p))]

lib = CDLL("/home/ajalal/darknet_original/libdarknet.so", RTLD_GLOBAL)

lib = CDLL("libdarknet.so", RTLD_GLOBAL)

lib.network_width.argtypes = [c_void_p] lib.network_width.restype = c_int lib.network_height.argtypes = [c_void_p] lib.network_height.restype = c_int

predict = lib.network_predict predict.argtypes = [c_void_p, POINTER(c_float)] predict.restype = POINTER(c_float)

set_gpu = lib.cuda_set_device set_gpu.argtypes = [c_int]

make_image = lib.make_image make_image.argtypes = [c_int, c_int, c_int] make_image.restype = IMAGE

make_boxes = lib.make_boxes make_boxes.argtypes = [c_void_p] make_boxes.restype = POINTER(BOX)

free_ptrs = lib.free_ptrs free_ptrs.argtypes = [POINTER(c_void_p), c_int]

num_boxes = lib.num_boxes num_boxes.argtypes = [c_void_p] num_boxes.restype = c_int

make_probs = lib.make_probs make_probs.argtypes = [c_void_p] make_probs.restype = POINTER(POINTER(c_float))

detect = lib.network_predict detect.argtypes = [c_void_p, IMAGE, c_float, c_float, c_float, POINTER(BOX), POINTER(POINTER(c_float))]

reset_rnn = lib.reset_rnn reset_rnn.argtypes = [c_void_p]

load_net = lib.load_network load_net.argtypes = [c_char_p, c_char_p, c_int] load_net.restype = c_void_p

free_image = lib.free_image free_image.argtypes = [IMAGE]

letterbox_image = lib.letterbox_image letterbox_image.argtypes = [IMAGE, c_int, c_int] letterbox_image.restype = IMAGE

load_meta = lib.get_metadata lib.get_metadata.argtypes = [c_char_p] lib.get_metadata.restype = METADATA

load_image = lib.load_image_color load_image.argtypes = [c_char_p, c_int, c_int] load_image.restype = IMAGE

rgbgr_image = lib.rgbgr_image rgbgr_image.argtypes = [IMAGE]

predict_image = lib.network_predict_image predict_image.argtypes = [c_void_p, IMAGE] predict_image.restype = POINTER(c_float)

network_detect = lib.network_detect network_detect.argtypes = [c_void_p, IMAGE, c_float, c_float, c_float, POINTER(BOX), POINTER(POINTER(c_float))]

def classify(net, meta, im): out = predict_image(net, im) res = [] for i in range(meta.classes): res.append((meta.names[i], out[i])) res = sorted(res, key=lambda x: -x[1]) return res

def detect(net, meta, image, thresh=.5, hier_thresh=.5, nms=.45): im = load_image(image, 0, 0) boxes = make_boxes(net) probs = make_probs(net) num = num_boxes(net) network_detect(net, im, thresh, hier_thresh, nms, boxes, probs) res = [] for j in range(num): for i in range(meta.classes): if probs[j][i] > 0: res.append((meta.names[i], probs[j][i], (boxes[j].x, boxes[j].y, boxes[j].w, boxes[j].h))) res = sorted(res, key=lambda x: -x[1]) free_image(im) free_ptrs(cast(probs, POINTER(c_void_p)), num) return res

if name == "main": net = load_net("cfg/densenet201.cfg", "densenet201.weights", 0) im = load_image("data/dog.jpg", 0, 0) meta = load_meta("cfg/imagenet1k.data") r = classify(net, meta, im) print r[:5] ####################### classify/predict

extraction is not running in python may be it takes more resources

#net = load_net("/home/ajalal/darknet_original/cfg/alexnet.cfg", "/home/ajalal/darknet_original/alexnet.weights", 0)
#meta = load_meta("/home/ajalal/darknet_original/cfg/imagenet1k.data")

#r = classify(net, meta, im)
#print r[:5]

######################### detect

net = load_net("/home/ajalal/darknet_original/cfg/yolo.cfg", "/home/ajalal/darknet_original/yolo.weights", 0)

meta = load_meta("/home/ajalal/darknet_original/cfg/coco.data")

r = detect(net, meta, "/home/ajalal/darknet_original/data/dog.jpg")

print r

evilmtv commented 6 years ago

Hi, @dfayzur I managed to get darknet working with an input from cv2 described here: #609 Let me know if you need more detailed help.

Borda commented 6 years ago

there are also issue with the paths to cfg and weights are odd