# -*- coding: utf-8 -*-
from __future__ import division
import numpy as np
import sys,os
import cv2
caffe_root = '/home/jiasj/workspaces/Caffe/Calmcar_file/caffe_deephi/'
sys.path.insert(0, caffe_root + 'python')
import caffe
import time
net_file= 'train_val_reach15.prototxt'
caffe_model='SSD_480x360_GENIII_15_iter_701100.caffemodel'
test_dir = "/home/jiasj/Desktop/ces_demo1"
image_outdir = "/home/jiasj/Desktop/demo/"
if not os.path.exists(image_outdir):
os.makedirs(image_outdir)
if not os.path.exists(caffe_model):
print("MobileNetSSD_deploy.caffemodel does not exist,")
print("use merge_bn.py to generate it.")
exit()
net = caffe.Net(net_file,caffe_model,caffe.TEST)
caffe.set_mode_gpu()
caffe.set_device(0)
CLASSES = ('background',
'car_whole', 'car_rear', 'car_front', 'bus_whole',
'bus_rear', 'bus_front', 'truck_whole', 'truck_rear', 'truck_front','person','bicycle','motorbike','tricycle',"speed_limit_sign","traffic_cone")
def preprocess(src):
img = cv2.resize(src, (480,360))
img = img - 127.5
#img = img * 0.007843img - 127.5
return img
def postprocess(img, out):
h = img.shape[0]
w = img.shape[1]
box = out['detection_out'][0,0,:,3:7] * np.array([w, h, w, h])
cls = out['detection_out'][0,0,:,1]
conf = out['detection_out'][0,0,:,2]
return (box.astype(np.int32), conf, cls)
def compute_iou(rec1, rec2):
left_column_max = max(rec1[0],rec2[0])
right_column_min = min(rec1[2],rec2[2])
up_row_max = max(rec1[1],rec2[1])
down_row_min = min(rec1[3],rec2[3])
S1 = (rec1[2]-rec1[0])*(rec1[3]-rec1[1])
S2 = (rec2[2]-rec2[0])*(rec2[3]-rec2[1])
if left_column_max>=right_column_min or up_row_max >=down_row_min:
return 0
else:
S_cross = (down_row_min-up_row_max)*(right_column_min-left_column_max)
return S_cross/(S1+S2-S_cross)
def class_loop(origimg, file_name, box, conf, cls, class_f, class_s1, class_s2):
for i in range(len(box)):
if ((conf[i] > 0.3)&((str(CLASSES[int(cls[i])]) == class_f))):
car=(box[i][0], box[i][1],box[i][2], box[i][3])
for j in range(len(box)):
if ((conf[j] > 0.3)&((str(CLASSES[int(cls[j])]) == class_s1) | (str(CLASSES[int(cls[j])]) == class_s2))):
car_front = (box[j][0], box[j][1],box[j][2], box[j][3])
iou=compute_iou(car, car_front)
if (iou>0.1)&(iou <1):
xmin_ = abs(car[0] - car_front[0])
xmax_ = abs(car[2] - car_front[2])
if xmin_ < xmax_:
car_outside, car_inside = draw_3d_road_left(car, car_front)
cv2.rectangle(origimg, (car_outside[0], car_outside[1]), (car_outside[2], car_outside[3]), (255, 128, 128), 2)
cv2.line(origimg, (car_outside[0], car_outside[1]), (car_inside[0], car_inside[1]), (255, 128, 128), 2)
cv2.line(origimg, (car_outside[2], car_outside[1]), (car_inside[2], car_inside[1]), (255, 128, 128), 2)
cv2.line(origimg, (car_outside[2], car_outside[3]), (car_inside[2], car_inside[3]), (255, 128, 128), 2)
cv2.line(origimg, (car_inside[0], car_inside[1]), (car_inside[2], car_inside[1]), (255, 128, 128), 2)
cv2.line(origimg, (car_inside[2], car_inside[1]), (car_inside[2], car_inside[3]), (255, 128, 128), 2)
cv2.imwrite(image_outdir + '/'+ file_name, origimg)
elif xmin_ > xmax_:
car_outside, car_inside = draw_3d_road_right(car, car_front)
cv2.rectangle(origimg, (car_outside[0], car_outside[1]), (car_outside[2], car_outside[3]), (255, 128, 128), 2)
cv2.line(origimg, (car_outside[0], car_outside[1]), (car_inside[0], car_inside[1]), (255, 128, 128), 2)
cv2.line(origimg, (car_outside[2], car_outside[1]), (car_inside[2], car_inside[1]), (255, 128, 128), 2)
cv2.line(origimg, (car_outside[0], car_outside[3]), (car_inside[0], car_inside[3]), (255, 128, 128), 2)
cv2.line(origimg, (car_inside[0], car_inside[1]), (car_inside[2], car_inside[1]), (255, 128, 128), 2)
cv2.line(origimg, (car_inside[0], car_inside[1]), (car_inside[0], car_inside[3]), (255, 128, 128), 2)
cv2.imwrite(image_outdir + '/'+ file_name, origimg)
conf[j] = 0
conf[i] = 0
break
def detect(imgfile):
file_path,file_name = os.path.split(imgfile)
print file_name
start = time.time()
origimg = cv2.imread(imgfile)
img = preprocess(origimg)
img = img.astype(np.float32)
img = img.transpose((2, 0, 1))
net.blobs['data'].data[...] = img
out = net.forward()
box, conf, cls = postprocess(origimg, out)
class_loop(origimg, file_name, box, conf, cls, 'car_whole', 'car_rear', 'car_front')
class_loop(origimg, file_name, box, conf, cls, 'bus_whole', 'bus_rear', 'bus_front')
class_loop(origimg, file_name, box, conf, cls, 'truck_whole', 'truck_rear', 'truck_front')
for i in range(len(box)):
if (conf[i] > 0.3):
p3 = (max(box[i][0], 15), max(box[i][1], 15))
cv2.rectangle(origimg, (box[i][0], box[i][1]), (box[i][2], box[i][3]), (255, 128, 128),2)
cv2.imwrite(image_outdir + '/'+ file_name, origimg)
cv2.imshow("SSD", origimg)
k = cv2.waitKey(1) & 0xff
return True
def draw_3d_road_left(car, car_rear):
w = car[2] - car[0]
h = car[3] - car[1]
top_back_y = car[1]
wheel_front = (car[2], int(car[3] - (car[3] - car[1]) * 0.15))
wheel_back = (car_rear[2], car_rear[3])
light_middle = car_rear[2]
v1 = car[3]
l1 = h
v2 = wheel_front[1]
l2 = int(v2 / v1 * l1)
retf_ul_x = car[2] - (car_rear[2] - car_rear[0])
retf_ul_y = wheel_front[1] - int(l2 * (1 - 0.125))
retf_dr_x = wheel_front[0]
retf_dr_y = int(car[1] + h - (light_middle - wheel_front[0]) *
(wheel_back[1] - wheel_front[1]) / (wheel_back[0] - wheel_front[0]))
return car_rear, (retf_ul_x, retf_ul_y, retf_dr_x, retf_dr_y)
def draw_3d_road_right(car, car_rear):
w = car[2] - car[0]
h = car[3] - car[1]
top_back_y = car[1]
wheel_front = (car[0], int(car[3] - (car[3] - car[1]) * 0.15))
wheel_back = (car_rear[0], car_rear[3])
light_middle = car_rear[0]
v1 = car[3]
l1 = h
v2 = wheel_front[1]
l2 = int(v2 / v1 * l1)
retf_ul_x = wheel_front[0]
retf_ul_y = wheel_front[1] - int(l2 * (1 - 0.125))
retf_dr_x = wheel_front[0] + car[2] - light_middle
retf_dr_y = int(car[1] + h - (light_middle - wheel_front[0]) *
(wheel_back[1] - wheel_front[1]) / (wheel_back[0] - wheel_front[0]))
return (light_middle, top_back_y, car[2], car[3]), (retf_ul_x, retf_ul_y, retf_dr_x, retf_dr_y)
for f in sorted(os.listdir(test_dir)):
if detect(test_dir + "/" + f) == False:
break
3dbbox.pdf