Edmond Yoo
2018-09-16 0dab894a5be9f7d10d85e89dea91d02c71bae84d
darknet.py
@@ -31,6 +31,8 @@
import math
import random
import os
import cv2
import numpy as np
def sample(probs):
    s = sum(probs)
@@ -78,8 +80,10 @@
#lib = CDLL("darknet.so", RTLD_GLOBAL)
hasGPU = True
if os.name == "nt":
    winGPUdll = "yolo_cpp_dll.dll"
    winNoGPUdll = "yolo_cpp_dll_nogpu.dll"
    cwd = os.path.dirname(__file__)
    os.environ['PATH'] = cwd + ';' + os.environ['PATH']
    winGPUdll = os.path.join(cwd, "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)
@@ -220,9 +224,14 @@
    Performs the meat of the detection
    """
    #pylint: disable= C0321
    im = load_image(image, 0, 0)
    if isinstance(image, np.ndarray):
        im = array_to_image(image)[0]
    else:
        im = load_image(image, 0, 0)
    #import cv2
    #custom_image = cv2.imread(image) # use: detect(,,imagePath,)
    #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)
@@ -233,7 +242,8 @@
    if debug: print("Assigned pnum")
    predict_image(net, im)
    if debug: print("did prediction")
    dets = get_network_boxes(net, im.w, im.h, thresh, hier_thresh, None, 0, pnum, 1)
    #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")
@@ -360,7 +370,9 @@
    if not os.path.exists(imagePath):
        raise ValueError("Invalid image path `"+os.path.abspath(imagePath)+"`")
    # Do the detection
    detections = detect(netMain, metaMain, imagePath.encode("ascii"), thresh)
    #detections = detect(netMain, metaMain, imagePath, thresh) # if is used cv2.imread(image)
    #detections = detect(netMain, metaMain, imagePath.encode("ascii"), thresh)
    detections = detect(netMain, metaMain, cv2.imread(imagePath), thresh, debug=True)
    if showImage:
        try:
            from skimage import io, draw
@@ -415,5 +427,88 @@
            print("Unable to show image: "+str(e))
    return detections
def capture(thresh=.25, hier_thresh=.5, nms=.45, configPath="./cfg/yolov3.cfg", weightPath="yolov3.weights",
            metaPath="./data/coco.data", showImage=True, makeImageOnly=False, initOnly=False):
    global metaMain, netMain, altNames  # pylint: disable=W0603
    netMain = load_net_custom(configPath.encode("ascii"), weightPath.encode("ascii"), 0, 1)  # batch size = 1
    metaMain = load_meta(metaPath.encode("ascii"))
    num = c_int(0)
    pnum = pointer(num)
    num = pnum[0]
    capture = cv2.VideoCapture('../data/test1.mp4')
    print(capture.get(cv2.CAP_PROP_FPS))
    capture.set(cv2.CAP_PROP_FRAME_WIDTH, 1024)
    capture.set(cv2.CAP_PROP_FRAME_HEIGHT, 768)
    while True:
        ret, frame = capture.read()
        detections = detect(netMain, metaMain, frame, thresh, debug=True)
        '''
        im, arr = array_to_image(frame)
        predict_image(netMain, im)
        dets = get_network_boxes(netMain, im.w, im.h, thresh, hier_thresh, None, 0, pnum, 1)
        if nms:
            do_nms_sort(dets, num, metaMain.classes, nms)
        res = []
        for j in range(num):
            for i in range(metaMain.classes):
                if dets[j].prob[i] > 0:
                    b = dets[j].bbox
                    nameTag = metaMain.names[i]
                    res.append((nameTag, dets[j].prob[i], (b.x, b.y, b.w, b.h)))
        '''
        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)
        print(res)
        cv2.imshow('frame', frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    capture.release()
    cv2.destroyAllWindows()
if __name__ == "__main__":
    print(performDetect())
    performDetect(imagePath='data/scream.jpg')
    #performDetect(imagePath="../data/test1.jpg", thresh=0.25, configPath="./cfg/tiny_yolo.cfg",
    #              weightPath="./weights/second_general/tiny_yolo_17000.weights",
    #              metaPath="./data/obj.data", showImage=True, makeImageOnly=False, initOnly=False)
    #print(performDetect(showImage=False))
    #capture()