- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I have tried to modify the python samples to run tiny-yolov2 through openvino. I have converted the tiny-yolov2 model and .weight file through Darkflow to .pb format and then used the documentation of Openvino R3 to successfully convert the .pb files to IR representation. But after modifying the source code the code runs successfully but there are no detections. I am attaching the sample code of post-processing, please throw some light over the issue
def sigmoid(p):
return 1.0 / (1 + math.exp(-p * 1.0))
def overlap(x1, w1, x2, w2): # x1 ,x2 are two box center x
left = max(x1 - w1 / 2.0, x2 - w2 / 2.0)
right = min(x1 + w1 / 2.0, x2 + w2 / 2.0)
return right - left
def cal_iou(box, truth):
w = overlap(box[0], box[2], truth[0], truth[2])
h = overlap(box[1], box[3], truth[1], truth[3])
if w < 0 or h < 0:
return 0
inter_area = w * h
union_area = box[2] * box[3] + truth[2] * truth[3] - inter_area
return inter_area * 1.0 / union_area
def apply_nms(boxes, thres):
sorted_boxes = sorted(boxes, key=lambda d: d[7])[::-1]
p = dict()
for i in range(len(sorted_boxes)):
if i in p:
continue
truth = sorted_boxes
for j in range(i + 1, len(sorted_boxes)):
if j in p:
continue
box = sorted_boxes
iou = cal_iou(box, truth)
if iou >= thres:
p = 1
res = list()
for i in range(len(sorted_boxes)):
if i not in p:
res.append(sorted_boxes)
return res
def post_processing(output):
res = output.astype(np.float32)
res=np.reshape(res,(13,13,125))
swap = np.zeros((13 * 13, 5, 25))
index = 0
for h in range(13):
for w in range(13):
for c in range(125):
i=h*13 + w
j = int(c/25)
k = c%25
swap=res
biases = [1.08, 1.19, 3.42, 4.41, 6.63, 11.38, 9.42, 5.11, 16.62, 10.52]
boxes = list()
for h in range(13):
for w in range(13):
for n in range(5):
box = list();
cls = list();
s = 0;
x = (w + sigmoid(swap[h * 13 + w][0])) / 13.0;
y = (h + sigmoid(swap[h * 13 + w][1])) / 13.0;
ww = (math.exp(swap[h * 13 + w][2]) * biases[2 * n]) / 13.0;
hh = (math.exp(swap[h * 13 + w][3]) * biases[2 * n + 1]) / 13.0;
obj_score = sigmoid(swap[h * 13 + w][4]);
for p in range(20):
cls.append(swap[h * 13 + w][5 + p]);
large = max(cls);
for i in range(len(cls)):
cls = math.exp(cls - large);
s = sum(cls);
for i in range(len(cls)):
cls = cls * 1.0 / s;
box.append(x);
box.append(y);
box.append(ww);
box.append(hh);
box.append(cls.index(max(cls)) + 1)
box.append(obj_score);
box.append(max(cls));
box.append(obj_score * max(cls))
# print("these are the values of box 5 and 6", box[5], box[6])
# if score
if box[5] * box[6] > 0.1:
boxes.append(box);
res = apply_nms(boxes, 0.35)
label_name = {0: "bg", 1: "aeroplane", 2: "bicycle", 3: "bird", 4: "boat", 5: "bottle", 6: "bus", 7: "car",
8: "cat", 9: "chair", 10: "cow", 11: "diningtable", 12: "dog", 13: "horse", 14: "motorbike",
15: "person", 16: "pottedplant", 17: "sheep", 18: "sofa", 19: "train", 20: "tvmonitor"}
w = img_cv.shape[1]
h = img_cv.shape[0]
for box in res:
xmin = (box[0] - box[2] / 2.0) * w;
xmax = (box[0] + box[2] / 2.0) * w;
ymin = (box[1] - box[3] / 2.0) * h;
ymax = (box[1] + box[3] / 2.0) * h;
if xmin < 0:
xmin = 0
if xmax > w:
xmax = w
if ymin < 0:
ymin = 0
if ymax > h:
ymax = h
cv2.rectangle(img_cv,(int(xmin),int(ymin)),(int(xmax),int(ymax)),(0,255,0),2)
print (label_name[box[4]],xmin, ymin, xmax, ymax)
label_text = label_name[box[4]] + " " + str("{0:.2f}".format(box[5]*box[6]))
label_background_color = (70, 120, 70) # greyish green background for text
label_text_color = (255, 255, 255) # white text
label_size = cv2.getTextSize(label_text, cv2.FONT_HERSHEY_SIMPLEX, 0.5, 1)[0]
label_left = int(xmin)
label_top = int(ymin) - label_size[1]
label_right = label_left + label_size[0]
label_bottom = label_top + label_size[1]
cv2.rectangle(img_cv, (label_left-1, label_top-5),(label_right+1, label_bottom+1), label_background_color, -1)
cv2.putText(img_cv, label_text, (int(xmin), int(ymin-5)), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255,255,255), 1)
cv2.imshow('YOLO detection',img_cv)
cv2.waitKey(10000)
Link Copied
1 Reply
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Please pay attention to the layout of the RegionYolo layer. In your code, the assumed layout is 13x13x125 and converted to 13x13x5x25. But, in the openvino, the shape of output is <1, 21125> whose's layout is acutally 5x25x13x13.
Reply
Topic Options
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page