def infer(args,cut_path,image_list,comb_path): data_shape = cityscape.test_data_shape() num_classes = cityscape.num_classes() # define network images = fluid.layers.data(name='image', shape=data_shape, dtype='float32') _, _, sub124_out = icnet(images, num_classes, np.array(data_shape[1:]).astype("float32")) predict = fluid.layers.resize_bilinear( sub124_out, out_shape=data_shape[1:3]) predict = fluid.layers.transpose(predict, perm=[0, 2, 3, 1]) predict = fluid.layers.reshape(predict, shape=[-1, num_classes]) _, predict = fluid.layers.topk(predict, k=1) predict = fluid.layers.reshape( predict, shape=[data_shape[1], data_shape[2], -1]) # batch_size should be 1 inference_program = fluid.default_main_program().clone(for_test=True) # prepare environment place = fluid.CPUPlace() if args.use_gpu: place = fluid.CUDAPlace(0) exe = fluid.Executor(place) exe.run(fluid.default_startup_program()) assert os.path.exists(args.model_path) fluid.io.load_params(exe, args.model_path) print("loaded model from: %s" % args.model_path) sys.stdout.flush() if not os.path.isdir(args.out_path): os.makedirs(args.out_path) for line in image_list: # image_file = args.images_path + "/" + line.strip() # filename = os.path.basename(image_file) # print(str(cut_path)+"/"+str(line)) # image = cv2.imread(cut_path+'/'+line) #print(11111111,line) image = paddle.dataset.image.load_image( cut_path+"/" +line, is_color=True).astype("float32") image -= IMG_MEAN img = paddle.dataset.image.to_chw(image)[np.newaxis, :] image_t = fluid.LoDTensor() image_t.set(img, place) result = exe.run(inference_program, feed={"image": image_t}, fetch_list=[predict]) cv2.imwrite(comb_path + "/" + line + "_result.png", color(result[0])) print("predicted images saved in :"+comb_path)
def eval(args): data_shape = cityscape.test_data_shape() num_classes = cityscape.num_classes() # define network images = fluid.layers.data(name='image', shape=data_shape, dtype='float32') label = fluid.layers.data(name='label', shape=[1], dtype='int32') mask = fluid.layers.data(name='mask', shape=[-1], dtype='int32') _, _, sub124_out = icnet(images, num_classes, np.array(data_shape[1:]).astype("float32")) iou, out_w, out_r = create_iou(sub124_out, label, mask, num_classes, data_shape) inference_program = fluid.default_main_program().clone(for_test=True) # prepare environment place = fluid.CPUPlace() if args.use_gpu: place = fluid.CUDAPlace(0) exe = fluid.Executor(place) exe.run(fluid.default_startup_program()) assert os.path.exists(args.model_path) fluid.io.load_params(exe, args.model_path) print("loaded model from: %s" % args.model_path) sys.stdout.flush() fetch_vars = [iou, out_w, out_r] out_wrong = np.zeros([num_classes]).astype("int64") out_right = np.zeros([num_classes]).astype("int64") count = 0 test_reader = cityscape.test() for data in test_reader(): count += 1 result = exe.run(inference_program, feed=get_feeder_data( data, place, for_test=True), fetch_list=fetch_vars) out_wrong += result[1] out_right += result[2] sys.stdout.flush() iou = cal_mean_iou(out_wrong, out_right) print("\nmean iou: %.3f" % iou) print("kpis test_acc %f" % iou)
def train(args): data_shape = cityscape.train_data_shape() num_classes = cityscape.num_classes() # define network images = fluid.layers.data(name='image', shape=data_shape, dtype='float32') label_sub1 = fluid.layers.data(name='label_sub1', shape=[1], dtype='int32') label_sub2 = fluid.layers.data(name='label_sub2', shape=[1], dtype='int32') label_sub4 = fluid.layers.data(name='label_sub4', shape=[1], dtype='int32') mask_sub1 = fluid.layers.data(name='mask_sub1', shape=[-1], dtype='int32') mask_sub2 = fluid.layers.data(name='mask_sub2', shape=[-1], dtype='int32') mask_sub4 = fluid.layers.data(name='mask_sub4', shape=[-1], dtype='int32') sub4_out, sub24_out, sub124_out = icnet( images, num_classes, np.array(data_shape[1:]).astype("float32")) loss_sub4 = create_loss(sub4_out, label_sub4, mask_sub4, num_classes) loss_sub24 = create_loss(sub24_out, label_sub2, mask_sub2, num_classes) loss_sub124 = create_loss(sub124_out, label_sub1, mask_sub1, num_classes) reduced_loss = LAMBDA1 * loss_sub4 + LAMBDA2 * loss_sub24 + LAMBDA3 * loss_sub124 regularizer = fluid.regularizer.L2Decay(0.0001) optimizer = fluid.optimizer.Momentum(learning_rate=poly_decay(), momentum=0.9, regularization=regularizer) _, params_grads = optimizer.minimize(reduced_loss, no_grad_set=no_grad_set) # prepare environment place = fluid.CPUPlace() if args.use_gpu: place = fluid.CUDAPlace(0) exe = fluid.Executor(place) exe.run(fluid.default_startup_program()) if args.init_model is not None: print("load model from: %s" % args.init_model) def if_exist(var): return os.path.exists(os.path.join(args.init_model, var.name)) fluid.io.load_vars(exe, args.init_model, predicate=if_exist) iter_id = 0 t_loss = 0. sub4_loss = 0. sub24_loss = 0. sub124_loss = 0. train_reader = cityscape.train(args.batch_size, flip=args.random_mirror, scaling=args.random_scaling) start_time = time.time() while True: # train a pass for data in train_reader(): if iter_id > TOTAL_STEP: end_time = time.time() print("kpis train_duration %f" % (end_time - start_time)) return iter_id += 1 results = exe.run( feed=get_feeder_data(data, place), fetch_list=[reduced_loss, loss_sub4, loss_sub24, loss_sub124]) t_loss += results[0] sub4_loss += results[1] sub24_loss += results[2] sub124_loss += results[3] # training log if iter_id % LOG_PERIOD == 0: print( "Iter[%d]; train loss: %.3f; sub4_loss: %.3f; sub24_loss: %.3f; sub124_loss: %.3f" % (iter_id, t_loss / LOG_PERIOD, sub4_loss / LOG_PERIOD, sub24_loss / LOG_PERIOD, sub124_loss / LOG_PERIOD)) print("kpis train_cost %f" % (t_loss / LOG_PERIOD)) t_loss = 0. sub4_loss = 0. sub24_loss = 0. sub124_loss = 0. sys.stdout.flush() if iter_id % CHECKPOINT_PERIOD == 0 and args.checkpoint_path is not None: dir_name = args.checkpoint_path + "/" + str(iter_id) fluid.io.save_persistables(exe, dirname=dir_name) print("Saved checkpoint: %s" % (dir_name))