darknet  v3
darknet.py
Go to the documentation of this file.
1 from ctypes import *
2 import math
3 import random
4 
5 def sample(probs):
6  s = sum(probs)
7  probs = [a/s for a in probs]
8  r = random.uniform(0, 1)
9  for i in range(len(probs)):
10  r = r - probs[i]
11  if r <= 0:
12  return i
13  return len(probs)-1
14 
15 def c_array(ctype, values):
16  arr = (ctype*len(values))()
17  arr[:] = values
18  return arr
19 
20 class BOX(Structure):
21  _fields_ = [("x", c_float),
22  ("y", c_float),
23  ("w", c_float),
24  ("h", c_float)]
25 
26 class DETECTION(Structure):
27  _fields_ = [("bbox", BOX),
28  ("classes", c_int),
29  ("prob", POINTER(c_float)),
30  ("mask", POINTER(c_float)),
31  ("objectness", c_float),
32  ("sort_class", c_int)]
33 
34 
35 class IMAGE(Structure):
36  _fields_ = [("w", c_int),
37  ("h", c_int),
38  ("c", c_int),
39  ("data", POINTER(c_float))]
40 
41 class METADATA(Structure):
42  _fields_ = [("classes", c_int),
43  ("names", POINTER(c_char_p))]
44 
45 
46 
47 #lib = CDLL("/home/pjreddie/documents/darknet/libdarknet.so", RTLD_GLOBAL)
48 lib = CDLL("libdarknet.so", RTLD_GLOBAL)
49 lib.network_width.argtypes = [c_void_p]
50 lib.network_width.restype = c_int
51 lib.network_height.argtypes = [c_void_p]
52 lib.network_height.restype = c_int
53 
54 predict = lib.network_predict
55 predict.argtypes = [c_void_p, POINTER(c_float)]
56 predict.restype = POINTER(c_float)
57 
58 set_gpu = lib.cuda_set_device
59 set_gpu.argtypes = [c_int]
60 
61 make_image = lib.make_image
62 make_image.argtypes = [c_int, c_int, c_int]
63 make_image.restype = IMAGE
64 
65 get_network_boxes = lib.get_network_boxes
66 get_network_boxes.argtypes = [c_void_p, c_int, c_int, c_float, c_float, POINTER(c_int), c_int, POINTER(c_int)]
67 get_network_boxes.restype = POINTER(DETECTION)
68 
69 make_network_boxes = lib.make_network_boxes
70 make_network_boxes.argtypes = [c_void_p]
71 make_network_boxes.restype = POINTER(DETECTION)
72 
73 free_detections = lib.free_detections
74 free_detections.argtypes = [POINTER(DETECTION), c_int]
75 
76 free_ptrs = lib.free_ptrs
77 free_ptrs.argtypes = [POINTER(c_void_p), c_int]
78 
79 network_predict = lib.network_predict
80 network_predict.argtypes = [c_void_p, POINTER(c_float)]
81 
82 reset_rnn = lib.reset_rnn
83 reset_rnn.argtypes = [c_void_p]
84 
85 load_net = lib.load_network
86 load_net.argtypes = [c_char_p, c_char_p, c_int]
87 load_net.restype = c_void_p
88 
89 do_nms_obj = lib.do_nms_obj
90 do_nms_obj.argtypes = [POINTER(DETECTION), c_int, c_int, c_float]
91 
92 do_nms_sort = lib.do_nms_sort
93 do_nms_sort.argtypes = [POINTER(DETECTION), c_int, c_int, c_float]
94 
95 free_image = lib.free_image
96 free_image.argtypes = [IMAGE]
97 
98 letterbox_image = lib.letterbox_image
99 letterbox_image.argtypes = [IMAGE, c_int, c_int]
100 letterbox_image.restype = IMAGE
101 
102 load_meta = lib.get_metadata
103 lib.get_metadata.argtypes = [c_char_p]
104 lib.get_metadata.restype = METADATA
105 
106 load_image = lib.load_image_color
107 load_image.argtypes = [c_char_p, c_int, c_int]
108 load_image.restype = IMAGE
109 
110 rgbgr_image = lib.rgbgr_image
111 rgbgr_image.argtypes = [IMAGE]
112 
113 predict_image = lib.network_predict_image
114 predict_image.argtypes = [c_void_p, IMAGE]
115 predict_image.restype = POINTER(c_float)
116 
117 def classify(net, meta, im):
118  out = predict_image(net, im)
119  res = []
120  for i in range(meta.classes):
121  res.append((meta.names[i], out[i]))
122  res = sorted(res, key=lambda x: -x[1])
123  return res
124 
125 def detect(net, meta, image, thresh=.5, hier_thresh=.5, nms=.45):
126  im = load_image(image, 0, 0)
127  num = c_int(0)
128  pnum = pointer(num)
129  predict_image(net, im)
130  dets = get_network_boxes(net, im.w, im.h, thresh, hier_thresh, None, 0, pnum)
131  num = pnum[0]
132  if (nms): do_nms_obj(dets, num, meta.classes, nms);
133 
134  res = []
135  for j in range(num):
136  for i in range(meta.classes):
137  if dets[j].prob[i] > 0:
138  b = dets[j].bbox
139  res.append((meta.names[i], dets[j].prob[i], (b.x, b.y, b.w, b.h)))
140  res = sorted(res, key=lambda x: -x[1])
141  free_image(im)
142  free_detections(dets, num)
143  return res
144 
145 if __name__ == "__main__":
146  #net = load_net("cfg/densenet201.cfg", "/home/pjreddie/trained/densenet201.weights", 0)
147  #im = load_image("data/wolf.jpg", 0, 0)
148  #meta = load_meta("cfg/imagenet1k.data")
149  #r = classify(net, meta, im)
150  #print r[:10]
151  net = load_net("cfg/tiny-yolo.cfg", "tiny-yolo.weights", 0)
152  meta = load_meta("cfg/coco.data")
153  r = detect(net, meta, "data/dog.jpg")
154  print r
155 
156 
predict_image
Definition: darknet.py:113
free_detections
Definition: darknet.py:73
def sample(probs)
Definition: darknet.py:5
def detect(net, meta, image, thresh=.5, hier_thresh=.5, nms=.45)
Definition: darknet.py:125
def c_array(ctype, values)
Definition: darknet.py:15
load_image
Definition: darknet.py:106
def classify(net, meta, im)
Definition: darknet.py:117
free_image
Definition: darknet.py:95
load_meta
Definition: darknet.py:102
get_network_boxes
Definition: darknet.py:65
load_net
Definition: darknet.py:85
do_nms_obj
Definition: darknet.py:89