# -*- coding: utf-8 -*-from __future__ import divisionimport numpy as np import sys,os import cv2caffe_root = '/home/jiasj/workspaces/Caffe/Calmcar_file/caffe_deephi/'sys.path.insert(0, caffe_root + 'python') import caffe import timenet_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 imgdef 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 breakdef 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 Truedef 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