AlexeyAB / darknet

YOLOv4 / Scaled-YOLOv4 / YOLO - Neural Networks for Object Detection (Windows and Linux version of Darknet )
http://pjreddie.com/darknet/
Other
21.65k stars 7.96k forks source link

darknet_vid.py (Error: %1 is not a valid Win32 application) #2225

Open BahaaMansour opened 5 years ago

BahaaMansour commented 5 years ago

Im trying to run my yolov3 model that i trained earlier in darknet_vid.py . I compiled yolo_cpp_dll and i keep on getting this error. Can you tell me what to change/fix?

untitle11d

from ctypes import * import math import random import os import cv2 import numpy as np import time

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 DETECTION(Structure): fields = [("bbox", BOX), ("classes", c_int), ("prob", POINTER(c_float)), ("mask", POINTER(c_float)), ("objectness", c_float), ("sort_class", c_int)]

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

hasGPU = True

lib = CDLL("yolo_cpp_dll.dll", 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)

if hasGPU: 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

get_network_boxes = lib.get_network_boxes get_network_boxes.argtypes = \ [c_void_p, c_int, c_int, c_float, c_float, POINTER( c_int), c_int, POINTER(c_int), c_int] get_network_boxes.restype = POINTER(DETECTION)

make_network_boxes = lib.make_network_boxes make_network_boxes.argtypes = [c_void_p] make_network_boxes.restype = POINTER(DETECTION)

free_detections = lib.free_detections free_detections.argtypes = [POINTER(DETECTION), c_int]

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

network_predict = lib.network_predict network_predict.argtypes = [c_void_p, 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

load_net_custom = lib.load_network_custom load_net_custom.argtypes = [c_char_p, c_char_p, c_int, c_int] load_net_custom.restype = c_void_p

do_nms_obj = lib.do_nms_obj do_nms_obj.argtypes = [POINTER(DETECTION), c_int, c_int, c_float]

do_nms_sort = lib.do_nms_sort do_nms_sort.argtypes = [POINTER(DETECTION), c_int, c_int, c_float]

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)

def array_to_image(arr): import numpy as np arr = arr.transpose(2, 0, 1) c = arr.shape[0] h = arr.shape[1] w = arr.shape[2] arr = np.ascontiguousarray(arr.flat, dtype=np.float32) / 255.0 data = arr.ctypes.data_as(POINTER(c_float)) im = IMAGE(w, h, c, data) return im, arr

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

def detect(net, meta, image, thresh=.5, hier_thresh=.5, nms=.45, debug=False): im, arr = array_to_image(image) if debug: print("Loaded image") num = c_int(0) if debug: print("Assigned num") pnum = pointer(num) if debug: print("Assigned pnum") predict_image(net, im) if debug: print("did prediction")

dets = get_network_boxes(

#     net, image.shape[1], image.shape[0],
#     thresh, hier_thresh,
#     None, 0, pnum, 0)  # OpenCV
dets = get_network_boxes(net, im.w, im.h,
                         thresh, hier_thresh, None, 0, pnum, 0)
if debug:
    print("Got dets")
num = pnum[0]
if debug:
    print("got zeroth index of pnum")
if nms:
    do_nms_sort(dets, num, meta.classes, nms)
if debug:
    print("did sort")
res = []
if debug:
    print("about to range")
for j in range(num):
    if debug:
        print("Ranging on "+str(j)+" of "+str(num))
    if debug:
        print("Classes: "+str(meta), meta.classes, meta.names)
    for i in range(meta.classes):
        if debug:
            print("Class-ranging on "+str(i)+" of " +
                  str(meta.classes)+"= "+str(dets[j].prob[i]))
        if dets[j].prob[i] > 0:
            b = dets[j].bbox
            if altNames is None:
                nameTag = meta.names[i]
            else:
                nameTag = altNames[i]
            if debug:
                print("Got bbox", b)
                print(nameTag)
                print(dets[j].prob[i])
                print((b.x, b.y, b.w, b.h))
            res.append((nameTag, dets[j].prob[i], (b.x, b.y, b.w, b.h)))
if debug:
    print("did range")
res = sorted(res, key=lambda x: -x[1])
if debug:
    print("did sort")
# free_image(im)
if debug:
    print("freed image")
free_detections(dets, num)
if debug:
    print("freed detections")
return res

def convertBack(x, y, w, h): xmin = int(round(x - (w / 2))) xmax = int(round(x + (w / 2))) ymin = int(round(y - (h / 2))) ymax = int(round(y + (h / 2))) return xmin, ymin, xmax, ymax

def cvDrawBoxes(detections, img): for detection in detections: x, y, w, h = detection[2][0],\ detection[2][1],\ detection[2][2],\ detection[2][3] xmin, ymin, xmax, ymax = convertBack( float(x), float(y), float(w), float(h)) pt1 = (xmin, ymin) pt2 = (xmax, ymax) cv2.rectangle(img, pt1, pt2, (0, 255, 0), 2) cv2.putText(img, detection[0].decode() + " [" + str(round(detection[1] * 100, 2)) + "]", (pt1[0], pt1[1] + 20), cv2.FONT_HERSHEY_SIMPLEX, 1, [0, 255, 0], 4) return img

netMain = None metaMain = None altNames = None

def YOLO(): global metaMain, netMain, altNames configPath = "C:\Users\Bahaa\Desktop\Darknet_master\darknet-master\build\darknet\x64\cfg\yolov3-tiny_Thesis.cfg" weightPath = "C:\Users\Bahaa\Desktop\Darknet_master\darknet-master\build\darknet\x64\yolov3-tiny_Thesis_last.weights" metaPath = "C:\Users\Bahaa\Desktop\Darknet_master\darknet-master\build\darknet\x64\data\Thesis.data" if not os.path.exists(configPath): raise ValueError("Invalid config path " + os.path.abspath(configPath)+"") if not os.path.exists(weightPath): raise ValueError("Invalid weight path " + os.path.abspath(weightPath)+"") if not os.path.exists(metaPath): raise ValueError("Invalid data file path " + os.path.abspath(metaPath)+"") if netMain is None: netMain = load_net_custom(configPath.encode( "ascii"), weightPath.encode("ascii"), 0, 1) # batch size = 1 if metaMain is None: metaMain = load_meta(metaPath.encode("ascii")) if altNames is None: try: with open(metaPath) as metaFH: metaContents = metaFH.read() import re match = re.search("names = (.*)$", metaContents, re.IGNORECASE | re.MULTILINE) if match: result = match.group(1) else: result = None try: if os.path.exists(result): with open(result) as namesFH: namesList = namesFH.read().strip().split("\n") altNames = [x.strip() for x in namesList] except TypeError: pass except Exception: pass

cap = cv2.VideoCapture(0)

cap = cv2.VideoCapture("C:\\Users\\Bahaa\\Desktop\\Darknet_master\\darknet-master\\build\\darknet\\x64\\0.mp4")
cap.set(3, 1280)
cap.set(4, 720)
out = cv2.VideoWriter(
    "output.avi", cv2.VideoWriter_fourcc(*"MJPG"), 10.0,
    (lib.network_width(netMain), lib.network_height(netMain)))
print("Starting the YOLO loop...")
while True:
    prev_time = time.time()
    ret, frame_read = cap.read()
    frame_rgb = cv2.cvtColor(frame_read, cv2.COLOR_BGR2RGB)
    frame_resized = cv2.resize(frame_rgb,
                               (lib.network_width(netMain),
                                lib.network_height(netMain)),
                               interpolation=cv2.INTER_LINEAR)
    detections = detect(netMain, metaMain, frame_resized, thresh=0.25)
    image = cvDrawBoxes(detections, frame_resized)
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    print(1/(time.time()-prev_time))
cap.release()
out.release()

if name == "main": YOLO()

AlexeyAB commented 5 years ago

Im trying to run my yolov3 model that i trained earlier in darknet_vid.py .

Did you trained your model by using darknet_vid.py or by using ./darknet detector train ...?

I compiled yolo_cpp_dll and i keep on getting this error. Can you tell me what to change/fix?

Did you compile: build/darknet/yolo_cpp_dll.sln ?

And do you run this Python file? build/darknet/x64/darknet.py

BahaaMansour commented 5 years ago

Im trying to run my yolov3 model that i trained earlier in darknet_vid.py .

Did you trained your model by using darknet_vid.py or by using ./darknet detector train ...? i trained my model using **darknet.exe detector train data/Thesis.data cfg/yolov3-tiny_Thesis.cfg yolov3-tiny_Thesis_last.weights -dont_show**

Did you compile: build/darknet/yolo_cpp_dll.sln ? Yes i compiled it. i have yolo_cpp_dll.dll appeared in my darknet/x64 And do you run this Python file? build/darknet/x64/darknet.py yes, this error appears when i run build/darknet/x64/darknet.py untitle11111d

BahaaMansour commented 5 years ago

@AlexeyAB

BahaaMansour commented 5 years ago

What i want is to be able to use my
trained ( Yolov3-tiny-last.weights) with the data.exe and cfg to be able to edit and change the box styles and Add lines to be able to count objects. just like in the following untitle23213d picture

BahaaMansour commented 5 years ago

I would really appreciate it if someone can help me

AlexeyAB commented 5 years ago

@BahaaMansour

Try to set full path to your yolo_cpp_dll.dll library here

F.e. use winGPUdll = "D:\\Darknet2\\darknet\\build\\darknet\\x64\\yolo_cpp_dll.dll" instead of: https://github.com/AlexeyAB/darknet/blob/5343aa423563c107e0071b1427ad5defc27b56d2/build/darknet/x64/darknet.py#L83

Or just copy yolo_cpp_dll.dll to the your work directory.

BahaaMansour commented 5 years ago

!python3

""" Python 3 wrapper for identifying objects in images

Requires DLL compilation

Both the GPU and no-GPU version should be compiled; the no-GPU version should be renamed "yolo_cpp_dll_nogpu.dll".

On a GPU system, you can force CPU evaluation by any of:

To use, either run performDetect() after import, or modify the end of this file.

See the docstring of performDetect() for parameters.

Directly viewing or returning bounding-boxed images requires scikit-image to be installed (pip install scikit-image)

Original *nix 2.7: https://github.com/pjreddie/darknet/blob/0f110834f4e18b30d5f101bf8f1724c34b7b83db/python/darknet.py Windows Python 2.7 version: https://github.com/AlexeyAB/darknet/blob/fc496d52bf22a0bb257300d3c79be9cd80e722cb/build/darknet/x64/darknet.py

@author: Philip Kahn @date: 20180503 """

pylint: disable=R, W0401, W0614, W0703

from ctypes import * import math import random import os

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 DETECTION(Structure): fields = [("bbox", BOX), ("classes", c_int), ("prob", POINTER(c_float)), ("mask", POINTER(c_float)), ("objectness", c_float), ("sort_class", c_int)]

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/pjreddie/documents/darknet/libdarknet.so", RTLD_GLOBAL)

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

hasGPU = True if os.name == "nt": cwd = os.path.dirname(file) os.environ['PATH'] = cwd + ';' + os.environ['PATH'] winGPUdll = os.path.join(cwd, "C:\Users\Bahaa\Desktop\Darknet_master\darknet-master\build\darknet\x64\yolo_cpp_dll.dll") winNoGPUdll = os.path.join(cwd, "yolo_cpp_dll_nogpu.dll") envKeys = list() for k, v in os.environ.items(): envKeys.append(k) try: try: tmp = os.environ["FORCE_CPU"].lower() if tmp in ["1", "true", "yes", "on"]: raise ValueError("ForceCPU") else: print("Flag value '"+tmp+"' not forcing CPU mode") except KeyError:

We never set the flag

        if 'CUDA_VISIBLE_DEVICES' in envKeys:
            if int(os.environ['CUDA_VISIBLE_DEVICES']) < 0:
                raise ValueError("ForceCPU")
        try:
            global DARKNET_FORCE_CPU
            if DARKNET_FORCE_CPU:
                raise ValueError("ForceCPU")
        except NameError:
            pass
        # print(os.environ.keys())
        # print("FORCE_CPU flag undefined, proceeding with GPU")
    if not os.path.exists(winGPUdll):
        raise ValueError("NoDLL")
    lib = CDLL(winGPUdll, RTLD_GLOBAL)
except (KeyError, ValueError):
    hasGPU = False
    if os.path.exists(winNoGPUdll):
        lib = CDLL(winNoGPUdll, RTLD_GLOBAL)
        print("Notice: CPU-only mode")
    else:
        # Try the other way, in case no_gpu was
        # compile but not renamed
        lib = CDLL(winGPUdll, RTLD_GLOBAL)
        print("Environment variables indicated a CPU run, but we didn't find `"+winNoGPUdll+"`. Trying a GPU run anyway.")

else: 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)

if hasGPU: 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

get_network_boxes = lib.get_network_boxes get_network_boxes.argtypes = [c_void_p, c_int, c_int, c_float, c_float, POINTER(c_int), c_int, POINTER(c_int), c_int] get_network_boxes.restype = POINTER(DETECTION)

make_network_boxes = lib.make_network_boxes make_network_boxes.argtypes = [c_void_p] make_network_boxes.restype = POINTER(DETECTION)

free_detections = lib.free_detections free_detections.argtypes = [POINTER(DETECTION), c_int]

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

network_predict = lib.network_predict network_predict.argtypes = [c_void_p, 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

load_net_custom = lib.load_network_custom load_net_custom.argtypes = [c_char_p, c_char_p, c_int, c_int] load_net_custom.restype = c_void_p

do_nms_obj = lib.do_nms_obj do_nms_obj.argtypes = [POINTER(DETECTION), c_int, c_int, c_float]

do_nms_sort = lib.do_nms_sort do_nms_sort.argtypes = [POINTER(DETECTION), c_int, c_int, c_float]

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)

def array_to_image(arr): import numpy as np

need to return old values to avoid python freeing memory

arr = arr.transpose(2,0,1)
c = arr.shape[0]
h = arr.shape[1]
w = arr.shape[2]
arr = np.ascontiguousarray(arr.flat, dtype=np.float32) / 255.0
data = arr.ctypes.data_as(POINTER(c_float))
im = IMAGE(w,h,c,data)
return im, arr

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

def detect(net, meta, image, thresh=.5, hier_thresh=.5, nms=.45, debug= False): """ Performs the meat of the detection """

pylint: disable= C0321

im = load_image(image, 0, 0)
#import cv2
#custom_image_bgr = cv2.imread(image) # use: detect(,,imagePath,)
#custom_image = cv2.cvtColor(custom_image_bgr, cv2.COLOR_BGR2RGB)
#custom_image = cv2.resize(custom_image,(lib.network_width(net), lib.network_height(net)), interpolation = cv2.INTER_LINEAR)
#import scipy.misc
#custom_image = scipy.misc.imread(image)
#im, arr = array_to_image(custom_image)     # you should comment line below: free_image(im)
if debug: print("Loaded image")
num = c_int(0)
if debug: print("Assigned num")
pnum = pointer(num)
if debug: print("Assigned pnum")
predict_image(net, im)
if debug: print("did prediction")
#dets = get_network_boxes(net, custom_image_bgr.shape[1], custom_image_bgr.shape[0], thresh, hier_thresh, None, 0, pnum, 0) # OpenCV
dets = get_network_boxes(net, im.w, im.h, thresh, hier_thresh, None, 0, pnum, 0)
if debug: print("Got dets")
num = pnum[0]
if debug: print("got zeroth index of pnum")
if nms:
    do_nms_sort(dets, num, meta.classes, nms)
if debug: print("did sort")
res = []
if debug: print("about to range")
for j in range(num):
    if debug: print("Ranging on "+str(j)+" of "+str(num))
    if debug: print("Classes: "+str(meta), meta.classes, meta.names)
    for i in range(meta.classes):
        if debug: print("Class-ranging on "+str(i)+" of "+str(meta.classes)+"= "+str(dets[j].prob[i]))
        if dets[j].prob[i] > 0:
            b = dets[j].bbox
            if altNames is None:
                nameTag = meta.names[i]
            else:
                nameTag = altNames[i]
            if debug:
                print("Got bbox", b)
                print(nameTag)
                print(dets[j].prob[i])
                print((b.x, b.y, b.w, b.h))
            res.append((nameTag, dets[j].prob[i], (b.x, b.y, b.w, b.h)))
if debug: print("did range")
res = sorted(res, key=lambda x: -x[1])
if debug: print("did sort")
free_image(im)
if debug: print("freed image")
free_detections(dets, num)
if debug: print("freed detections")
return res

netMain = None metaMain = None altNames = None

def performDetect(imagePath="data/dog.jpg", thresh= 0.25, configPath = "./cfg/yolov3.cfg", weightPath = "yolov3.weights", metaPath= "./cfg/coco.data", showImage= True, makeImageOnly = False, initOnly= False): """ Convenience function to handle the detection and returns of objects.

Displaying bounding boxes requires libraries scikit-image and numpy

Parameters
----------------
imagePath: str
    Path to the image to evaluate. Raises ValueError if not found

thresh: float (default= 0.25)
    The detection threshold

configPath: str
    Path to the configuration file. Raises ValueError if not found

weightPath: str
    Path to the weights file. Raises ValueError if not found

metaPath: str
    Path to the data file. Raises ValueError if not found

showImage: bool (default= True)
    Compute (and show) bounding boxes. Changes return.

makeImageOnly: bool (default= False)
    If showImage is True, this won't actually *show* the image, but will create the array and return it.

initOnly: bool (default= False)
    Only initialize globals. Don't actually run a prediction.

Returns
----------------------

When showImage is False, list of tuples like
    ('obj_label', confidence, (bounding_box_x_px, bounding_box_y_px, bounding_box_width_px, bounding_box_height_px))
    The X and Y coordinates are from the center of the bounding box. Subtract half the width or height to get the lower corner.

Otherwise, a dict with
    {
        "detections": as above
        "image": a numpy array representing an image, compatible with scikit-image
        "caption": an image caption
    }
"""
# Import the global variables. This lets us instance Darknet once, then just call performDetect() again without instancing again
global metaMain, netMain, altNames #pylint: disable=W0603
assert 0 < thresh < 1, "Threshold should be a float between zero and one (non-inclusive)"
if not os.path.exists(configPath):
    raise ValueError("Invalid config path `"+os.path.abspath(configPath)+"`")
if not os.path.exists(weightPath):
    raise ValueError("Invalid weight path `"+os.path.abspath(weightPath)+"`")
if not os.path.exists(metaPath):
    raise ValueError("Invalid data file path `"+os.path.abspath(metaPath)+"`")
if netMain is None:
    netMain = load_net_custom(configPath.encode("ascii"), weightPath.encode("ascii"), 0, 1)  # batch size = 1
if metaMain is None:
    metaMain = load_meta(metaPath.encode("ascii"))
if altNames is None:
    # In Python 3, the metafile default access craps out on Windows (but not Linux)
    # Read the names file and create a list to feed to detect
    try:
        with open(metaPath) as metaFH:
            metaContents = metaFH.read()
            import re
            match = re.search("names *= *(.*)$", metaContents, re.IGNORECASE | re.MULTILINE)
            if match:
                result = match.group(1)
            else:
                result = None
            try:
                if os.path.exists(result):
                    with open(result) as namesFH:
                        namesList = namesFH.read().strip().split("\n")
                        altNames = [x.strip() for x in namesList]
            except TypeError:
                pass
    except Exception:
        pass
if initOnly:
    print("Initialized detector")
    return None
if not os.path.exists(imagePath):
    raise ValueError("Invalid image path `"+os.path.abspath(imagePath)+"`")
# Do the detection
#detections = detect(netMain, metaMain, imagePath, thresh)  # if is used cv2.imread(image)
detections = detect(netMain, metaMain, imagePath.encode("ascii"), thresh)
if showImage:
    try:
        from skimage import io, draw
        import numpy as np
        image = io.imread(imagePath)
        print("*** "+str(len(detections))+" Results, color coded by confidence ***")
        imcaption = []
        for detection in detections:
            label = detection[0]
            confidence = detection[1]
            pstring = label+": "+str(np.rint(100 * confidence))+"%"
            imcaption.append(pstring)
            print(pstring)
            bounds = detection[2]
            shape = image.shape
            # x = shape[1]
            # xExtent = int(x * bounds[2] / 100)
            # y = shape[0]
            # yExtent = int(y * bounds[3] / 100)
            yExtent = int(bounds[3])
            xEntent = int(bounds[2])
            # Coordinates are around the center
            xCoord = int(bounds[0] - bounds[2]/2)
            yCoord = int(bounds[1] - bounds[3]/2)
            boundingBox = [
                [xCoord, yCoord],
                [xCoord, yCoord + yExtent],
                [xCoord + xEntent, yCoord + yExtent],
                [xCoord + xEntent, yCoord]
            ]
            # Wiggle it around to make a 3px border
            rr, cc = draw.polygon_perimeter([x[1] for x in boundingBox], [x[0] for x in boundingBox], shape= shape)
            rr2, cc2 = draw.polygon_perimeter([x[1] + 1 for x in boundingBox], [x[0] for x in boundingBox], shape= shape)
            rr3, cc3 = draw.polygon_perimeter([x[1] - 1 for x in boundingBox], [x[0] for x in boundingBox], shape= shape)
            rr4, cc4 = draw.polygon_perimeter([x[1] for x in boundingBox], [x[0] + 1 for x in boundingBox], shape= shape)
            rr5, cc5 = draw.polygon_perimeter([x[1] for x in boundingBox], [x[0] - 1 for x in boundingBox], shape= shape)
            boxColor = (int(255 * (1 - (confidence ** 2))), int(255 * (confidence ** 2)), 0)
            draw.set_color(image, (rr, cc), boxColor, alpha= 0.8)
            draw.set_color(image, (rr2, cc2), boxColor, alpha= 0.8)
            draw.set_color(image, (rr3, cc3), boxColor, alpha= 0.8)
            draw.set_color(image, (rr4, cc4), boxColor, alpha= 0.8)
            draw.set_color(image, (rr5, cc5), boxColor, alpha= 0.8)
        if not makeImageOnly:
            io.imshow(image)
            io.show()
        detections = {
            "detections": detections,
            "image": image,
            "caption": "\n<br/>".join(imcaption)
        }
    except Exception as e:
        print("Unable to show image: "+str(e))
return detections

if name == "main": print(performDetect())

Same issue again, untitle12312312d

I didnt understand why do i keep on getting "%1 is not a valid Win32 application"

AlexeyAB commented 5 years ago

Dont use os.path.join(cwd, And use \\ instead of \

Use winGPUdll = "C:\\Users\\Bahaa\\Desktop\\Darknet_master\\darknet-master\\build\\darknet\\x64\\yolo_cpp_dll.dll"

instead of winGPUdll = os.path.join(cwd, "C:\Users\Bahaa\Desktop\Darknet_master\darknet-master\build\darknet\x64\yolo_cpp_dll.dll")

BahaaMansour commented 5 years ago

Dont use os.path.join(cwd, And use \\ instead of \

Use winGPUdll = "C:\\Users\\Bahaa\\Desktop\\Darknet_master\\darknet-master\\build\\darknet\\x64\\yolo_cpp_dll.dll"

instead of winGPUdll = os.path.join(cwd, "C:\Users\Bahaa\Desktop\Darknet_master\darknet-master\build\darknet\x64\yolo_cpp_dll.dll")

lib = CDLL("libdarknet.so", RTLD_GLOBAL) hasGPU = True if os.name == "nt": cwd = os.path.dirname(file) os.environ['PATH'] = cwd + ';' + os.environ['PATH'] winGPUdll = "C:\Users\Bahaa\Desktop\Darknet_master\darknet-master\build\darknet\x64\yolo_cpp_dll.dll" winNoGPUdll = os.path.join(cwd, "yolo_cpp_dll_nogpu.dll") envKeys = list() for k, v in os.environ.items(): envKeys.append(k)

same error again on line 110. Exception has occurred: OSError [WinError 193] %1 is not a valid Win32 application File "C:\Users\Bahaa\Desktop\Darknet_master\darknet-master\build\darknet\x64\darknet.py", line 120, in print("Environment variables indicated a CPU run, but we didn't find "+winNoGPUdll+". Trying a GPU run anyway.")

BahaaMansour commented 5 years ago

@AlexeyAB thank you so much for replying to me btw i really appreciate it...

BahaaMansour commented 5 years ago

from ctypes import * import math import random import os import cv2 import numpy as np import time

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 DETECTION(Structure): fields = [("bbox", BOX), ("classes", c_int), ("prob", POINTER(c_float)), ("mask", POINTER(c_float)), ("objectness", c_float), ("sort_class", c_int)]

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

hasGPU = True

lib = CDLL("C:\Users\Bahaa\Desktop\Darknet_master\darknet-master\build\darknet\x64\yolo_cpp_dll.dll") 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)

if hasGPU: 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

get_network_boxes = lib.get_network_boxes get_network_boxes.argtypes = \ [c_void_p, c_int, c_int, c_float, c_float, POINTER( c_int), c_int, POINTER(c_int), c_int] get_network_boxes.restype = POINTER(DETECTION)

make_network_boxes = lib.make_network_boxes make_network_boxes.argtypes = [c_void_p] make_network_boxes.restype = POINTER(DETECTION)

free_detections = lib.free_detections free_detections.argtypes = [POINTER(DETECTION), c_int]

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

network_predict = lib.network_predict network_predict.argtypes = [c_void_p, 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

load_net_custom = lib.load_network_custom load_net_custom.argtypes = [c_char_p, c_char_p, c_int, c_int] load_net_custom.restype = c_void_p

do_nms_obj = lib.do_nms_obj do_nms_obj.argtypes = [POINTER(DETECTION), c_int, c_int, c_float]

do_nms_sort = lib.do_nms_sort do_nms_sort.argtypes = [POINTER(DETECTION), c_int, c_int, c_float]

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)

def array_to_image(arr): import numpy as np arr = arr.transpose(2, 0, 1) c = arr.shape[0] h = arr.shape[1] w = arr.shape[2] arr = np.ascontiguousarray(arr.flat, dtype=np.float32) / 255.0 data = arr.ctypes.data_as(POINTER(c_float)) im = IMAGE(w, h, c, data) return im, arr

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

def detect(net, meta, image, thresh=.5, hier_thresh=.5, nms=.45, debug=False): im, arr = array_to_image(image) if debug: print("Loaded image") num = c_int(0) if debug: print("Assigned num") pnum = pointer(num) if debug: print("Assigned pnum") predict_image(net, im) if debug: print("did prediction")

dets = get_network_boxes(

#     net, image.shape[1], image.shape[0],
#     thresh, hier_thresh,
#     None, 0, pnum, 0)  # OpenCV
dets = get_network_boxes(net, im.w, im.h,
                         thresh, hier_thresh, None, 0, pnum, 0)
if debug:
    print("Got dets")
num = pnum[0]
if debug:
    print("got zeroth index of pnum")
if nms:
    do_nms_sort(dets, num, meta.classes, nms)
if debug:
    print("did sort")
res = []
if debug:
    print("about to range")
for j in range(num):
    if debug:
        print("Ranging on "+str(j)+" of "+str(num))
    if debug:
        print("Classes: "+str(meta), meta.classes, meta.names)
    for i in range(meta.classes):
        if debug:
            print("Class-ranging on "+str(i)+" of " +
                  str(meta.classes)+"= "+str(dets[j].prob[i]))
        if dets[j].prob[i] > 0:
            b = dets[j].bbox
            if altNames is None:
                nameTag = meta.names[i]
            else:
                nameTag = altNames[i]
            if debug:
                print("Got bbox", b)
                print(nameTag)
                print(dets[j].prob[i])
                print((b.x, b.y, b.w, b.h))
            res.append((nameTag, dets[j].prob[i], (b.x, b.y, b.w, b.h)))
if debug:
    print("did range")
res = sorted(res, key=lambda x: -x[1])
if debug:
    print("did sort")
# free_image(im)
if debug:
    print("freed image")
free_detections(dets, num)
if debug:
    print("freed detections")
return res

def convertBack(x, y, w, h): xmin = int(round(x - (w / 2))) xmax = int(round(x + (w / 2))) ymin = int(round(y - (h / 2))) ymax = int(round(y + (h / 2))) return xmin, ymin, xmax, ymax

def cvDrawBoxes(detections, img): for detection in detections: x, y, w, h = detection[2][0],\ detection[2][1],\ detection[2][2],\ detection[2][3] xmin, ymin, xmax, ymax = convertBack( float(x), float(y), float(w), float(h)) pt1 = (xmin, ymin) pt2 = (xmax, ymax) cv2.rectangle(img, pt1, pt2, (0, 255, 0), 2) cv2.putText(img, detection[0].decode() + " [" + str(round(detection[1] * 100, 2)) + "]", (pt1[0], pt1[1] + 20), cv2.FONT_HERSHEY_SIMPLEX, 1, [0, 255, 0], 4) return img

netMain = None metaMain = None altNames = None

def YOLO(): global metaMain, netMain, altNames configPath = "C:\Users\Bahaa\Desktop\Darknet_master\darknet-master\build\darknet\x64\cfg\yolov3-tiny_Thesis.cfg" weightPath = "C:\Users\Bahaa\Desktop\Darknet_master\darknet-master\build\darknet\x64\yolov3-tiny_Thesis_last.weights" metaPath = "C:\Users\Bahaa\Desktop\Darknet_master\darknet-master\build\darknet\x64\data\Thesis.data" if not os.path.exists(configPath): raise ValueError("Invalid config path " + os.path.abspath(configPath)+"") if not os.path.exists(weightPath): raise ValueError("Invalid weight path " + os.path.abspath(weightPath)+"") if not os.path.exists(metaPath): raise ValueError("Invalid data file path " + os.path.abspath(metaPath)+"") if netMain is None: netMain = load_net_custom(configPath.encode( "ascii"), weightPath.encode("ascii"), 0, 1) # batch size = 1 if metaMain is None: metaMain = load_meta(metaPath.encode("ascii")) if altNames is None: try: with open(metaPath) as metaFH: metaContents = metaFH.read() import re match = re.search("names = (.*)$", metaContents, re.IGNORECASE | re.MULTILINE) if match: result = match.group(1) else: result = None try: if os.path.exists(result): with open(result) as namesFH: namesList = namesFH.read().strip().split("\n") altNames = [x.strip() for x in namesList] except TypeError: pass except Exception: pass

cap = cv2.VideoCapture(0)

cap = cv2.VideoCapture("C:\\Users\\Bahaa\\Desktop\\Darknet_master\\darknet-master\\build\\darknet\\x64\\0.mp4")
cap.set(3, 1280)
cap.set(4, 720)
out = cv2.VideoWriter(
    "output.avi", cv2.VideoWriter_fourcc(*"MJPG"), 10.0,
    (lib.network_width(netMain), lib.network_height(netMain)))
print("Starting the YOLO loop...")
while True:
    prev_time = time.time()
    ret, frame_read = cap.read()
    frame_rgb = cv2.cvtColor(frame_read, cv2.COLOR_BGR2RGB)
    frame_resized = cv2.resize(frame_rgb,
                               (lib.network_width(netMain),
                                lib.network_height(netMain)),
                               interpolation=cv2.INTER_LINEAR)
    detections = detect(netMain, metaMain, frame_resized, thresh=0.25)
    image = cvDrawBoxes(detections, frame_resized)
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    print(1/(time.time()-prev_time))
cap.release()
out.release()

if name == "main": YOLO()

This is what happens when i run darknet_video.py

11121

AlexeyAB commented 5 years ago
BahaaMansour commented 5 years ago
  • Try to run darknet.py by mouse double click. Will it run successfully?

1.a. I ran darknet.py by just double clicking the icon and here what happens

double darnknet

b. Then i decided to open 'darknet.py' with IDLE and i ran with F5 and i got the objects detected but without an output.

idle darnket

2.a. Then i decided to run 'darknet_video.py' by only double clicking on it but nothing happened. the code didnt run but quickly switched off.

quickly switches off

b. Then i ran 'darknet_video.py' with idle x64 and i got this result.

idle python vid

c. Then i ran 'darknet_video.py' with idle x32

second idle 32 and i got this result.

  • Try to compile yolo_console_cpp.sln and run it. Will it run successfully?

    1. i built 'yolo_console_cpp.sln'

    building yolo console

    2.it compiled successfully

    succeeded

    3. and yolo_console_dll

    ran succefully .exe ran successfully

BahaaMansour commented 5 years ago

@AlexeyAB My objective is to run darknet_video.py but it keeps on fail on running.

OndoyManing commented 5 years ago

@AlexeyAB I'm having the same error also when executing darknet.py. I compiled both GPU and non GPU version and I already have them on my workspace directory. What could be the problem?

AlexeyAB commented 5 years ago

@BahaaMansour Hi,

@AlexeyAB My objective is to run darknet_video.py but it keeps on fail on running.

Try to run darknet_video.py by using Python 2.7: https://www.python.org/downloads/release/python-2715/

Also you should have any test.mp4 videofile near with darknet_video.py

AlexeyAB commented 5 years ago

@BahaaMansour @OndoyManing

Also look at this file, may be you should install do pip install for: numpy, sci and opencv python-packages: https://github.com/AlexeyAB/darknet/blob/1b15e2f8df5794a8c81fdfafddb3863c9a1a9e16/build/darknet/x64/darknet_python.cmd#L1-L19

OndoyManing commented 5 years ago

@AlexeyAB I installed all required packages, but still the same error on line 110 in darknet.py.

blaine141 commented 5 years ago

I had this issue and it turned out to be I had 32 bit python

mauromazzei commented 5 years ago

it's not a darknet bug

has said by @blaine141 seems like you're launching python scripts with a 32-bit python interpreter. to check wich version of python is running try to look the output of "python --version" and it should give show "32-bit" somewhere.

In order to work you have to use a 64-bit python executable (you can download it from the python website)

Probably you're using a custom python installation (32-bit) and when testing by IDLE you're using a different version at 64-bit (maybe the one that came with Visual Studio). Update it by setting the right path into the environment variables. Remember that when you switch python version you have to switch pip too