is_training, bn_decay, end_points)
    stage1_center = center_delta + mask_xyz_mean  # Bx3
    end_points['stage1_center'] = stage1_center
    # Get object point cloud in object coordinate
    object_point_cloud_xyz_new = \
        object_point_cloud_xyz - tf.expand_dims(center_delta, 1)

    # Amodel Box Estimation PointNet
    output, end_points = get_3d_box_estimation_v1_net(\
        object_point_cloud_xyz_new, one_hot_vec,
        is_training, bn_decay, end_points)

    # Parse output to 3D box parameters
    end_points = parse_output_to_tensors(output, end_points)
    end_points['center'] = end_points['center_boxnet'] + stage1_center  # Bx3

    return end_points


if __name__ == '__main__':
    with tf.Graph().as_default():
        inputs = tf.zeros((32, 1024, 4))
        outputs = get_model(inputs, tf.ones((32, 3)), tf.constant(True))
        for key in outputs:
            print((key, outputs[key]))
        loss = get_loss(tf.zeros((32, 1024), dtype=tf.int32),
                        tf.zeros((32, 3)), tf.zeros((32, ), dtype=tf.int32),
                        tf.zeros((32, )), tf.zeros((32, ), dtype=tf.int32),
                        tf.zeros((32, 3)), outputs)
        print(loss)
    ''' Loss functions for 3D object detection.
        Input:
            mask_label:  int32 tensor in shape (B,N)
            center_label:  tensor in shape (B,3)
            heading_class_label:  int32 tensor in shape (B,)
            heading_residual_label:  tensor in shape (B,)
            size_class_label:  tensor int32 in shape (B,)
            size_residual_label: tensor tensor in shape (B,)
            end_points: dict, outputs from our model
            corner_loss_weight: float scalar
            box_loss_weight: float scalar
        Output:
            total_loss: scalar tensor
                the total_loss is also added to the losses collection
    '''
    mask_label = torch.randint(0, 2, (batch_size, N))
    center_label = torch.rand((batch_size, 3))
    heading_class_label = torch.randint(0, NUM_HEADING_BIN, (batch_size, ))
    heading_residual_label = torch.rand((batch_size, ))
    size_class_label = torch.randint(0, NUM_SIZE_CLUSTER, (batch_size, ))
    size_residual_label = torch.rand((batch_size, 3))
    corner_loss_weight = 0.5
    box_loss_weight = 0.5
    for value in end_points.values():
        print(value.dtype)
    total_loss = get_loss(mask_label, center_label, heading_class_label,
                          heading_residual_label, size_class_label,
                          size_residual_label, end_points, corner_loss_weight,
                          box_loss_weight)
    print(total_loss)
#             loss = get_loss(tf.random.uniform((25,1024),minval=0,maxval=2, dtype=tf.int32),
#                 tf.random.uniform((25,3),minval=0,maxval=2,), tf.random.uniform((25,),minval=0,maxval=2,dtype=tf.int32),
#                 tf.random.uniform((25,),minval=0,maxval=2,), tf.random.uniform((25,),minval=0,maxval=2,dtype=tf.int32),
#                 tf.random.uniform((25,3),minval=0,maxval=2,), outputs)
#             print(loss)

if __name__ == '__main__':
    with tf.Graph().as_default():
        inputs = tf.zeros((25, 1024, 4))
        outputs = get_model(inputs, tf.ones((25, 1)), tf.constant(True))
        for key in outputs:
            print((key, outputs[key]))
        loss = get_loss(
            tf.random.uniform((25, 1024), minval=0, maxval=2, dtype=tf.int32),
            tf.random.uniform(
                (25, 3),
                minval=0,
                maxval=2,
            ), tf.random.uniform((25, ), minval=0, maxval=2, dtype=tf.int32),
            tf.random.uniform(
                (25, ),
                minval=0,
                maxval=2,
            ), tf.random.uniform((25, ), minval=0, maxval=2, dtype=tf.int32),
            tf.random.uniform(
                (25, 3),
                minval=0,
                maxval=2,
            ), outputs)
        print(loss)
        object_point_cloud_xyz, one_hot_vec,
        is_training, bn_decay, end_points)
    stage1_center = center_delta + mask_xyz_mean # Bx3
    end_points['stage1_center'] = stage1_center
    # Get object point cloud in object coordinate
    object_point_cloud_xyz_new = \
        object_point_cloud_xyz - tf.expand_dims(center_delta, 1)

    # Amodel Box Estimation PointNet
    output, end_points = get_3d_box_estimation_v1_net(\
        object_point_cloud_xyz_new, one_hot_vec,
        is_training, bn_decay, end_points)

    # Parse output to 3D box parameters
    end_points = parse_output_to_tensors(output, end_points)
    end_points['center'] = end_points['center_boxnet'] + stage1_center # Bx3

    return end_points

if __name__=='__main__':
    with tf.Graph().as_default():
        inputs = tf.zeros((32,1024,4))
        outputs = get_model(inputs, tf.ones((32,3)), tf.constant(True))
        for key in outputs:
            print((key, outputs[key]))
        loss = get_loss(tf.zeros((32,1024),dtype=tf.int32),
            tf.zeros((32,3)), tf.zeros((32,),dtype=tf.int32),
            tf.zeros((32,)), tf.zeros((32,),dtype=tf.int32),
            tf.zeros((32,3)), outputs)
        print(loss)
示例#5
0
def eval_one_epoch(fpointnet,device):
    '''
    @author chonepieceyb
    :param fpointnet:  网络对象
    :param device: 设备
    :return:
    '''
    # get data
    global EPOCH_CNT
    log_string(str(datetime.now()))
    log_string('---- EPOCH %03d EVALUATION ----' % (EPOCH_CNT))
    test_idxs = np.arange(0, len(TEST_DATASET))
    num_batches = len(TEST_DATASET) // BATCH_SIZE

    # To collect statistics
    total_correct = 0
    total_seen = 0
    loss_sum = 0
    total_seen_class = [0 for _ in range(NUM_CLASSES)]
    total_correct_class = [0 for _ in range(NUM_CLASSES)]
    iou2ds_sum = 0
    iou3ds_sum = 0
    iou3d_correct_cnt = 0

    fpointnet.eval()  # 训练模式
    for batch_idx in range(int(num_batches)):
        start_idx = batch_idx * BATCH_SIZE
        end_idx = (batch_idx+1)* BATCH_SIZE
        batch_data, batch_label, batch_center, \
        batch_hclass, batch_hres, \
        batch_sclass, batch_sres, \
        batch_rot_angle, batch_one_hot_vec = \
            get_batch(TEST_DATASET, test_idxs, start_idx, end_idx,
                      NUM_POINT, NUM_CHANNEL)

        # convert to torch tensor and change data  format
        batch_data_gpu = torch.from_numpy(batch_data).permute(0,2,1).to(device,dtype=torch.float32)                        #
        batch_label_gpu= torch.from_numpy(batch_label).to(device,dtype=torch.int64)
        batch_center_gpu = torch.from_numpy(batch_center).to(device,dtype=torch.float32)
        batch_hclass_gpu = torch.from_numpy(batch_hclass).to(device,dtype=torch.int64)
        batch_hres_gpu = torch.from_numpy(batch_hres).to(device,dtype=torch.float32)
        batch_sclass_gpu = torch.from_numpy(batch_sclass).to(device,dtype=torch.int64)
        batch_sres_gpu = torch.from_numpy(batch_sres).to(device,dtype=torch.float32)
        batch_one_hot_vec_gpu  = torch.from_numpy(batch_one_hot_vec).to(device ,dtype=torch.float32)

        # eval
        with torch.no_grad():
            end_points = fpointnet.forward(batch_data_gpu,batch_one_hot_vec_gpu)
            loss, losses = get_loss(batch_label_gpu,batch_center_gpu,batch_hclass_gpu,batch_hres_gpu,batch_sclass_gpu,batch_sres_gpu,end_points)
        #get data   and transform dataformat from torch style to tensorflow style
        loss_val = loss.cpu().data.numpy()
        logits_val = end_points['mask_logits'].data.cpu().numpy()
        iou2ds,iou3ds,accuracy = compute_summary(end_points,batch_label_gpu,batch_center,batch_hclass,batch_hres,batch_sclass,batch_sres)
        preds_val = np.argmax(logits_val, 1)
        correct = np.sum(preds_val == batch_label)
        total_correct += correct
        total_seen += (BATCH_SIZE * NUM_POINT)
        loss_sum += loss_val
        for l in range(NUM_CLASSES):
            total_seen_class[l] += np.sum(batch_label == l)
            total_correct_class[l] += (np.sum((preds_val == l) & (batch_label == l)))
        iou2ds_sum += np.sum(iou2ds)
        iou3ds_sum += np.sum(iou3ds)
        iou3d_correct_cnt += np.sum(iou3ds >= 0.7)

        for i in range(BATCH_SIZE):
            segp = preds_val[i,:]
            segl = batch_label[i,:]
            part_ious = [0.0 for _ in range(NUM_CLASSES)]
            for l in range(NUM_CLASSES):
                if (np.sum(segl==l) == 0) and (np.sum(segp==l) == 0):
                    part_ious[l] = 1.0 # class not present
                else:
                    part_ious[l] = np.sum((segl==l) & (segp==l)) / \
                        float(np.sum((segl==l) | (segp==l)))

    log_string('eval mean loss: %f' % (loss_sum / float(num_batches)))
    log_string('eval segmentation accuracy: %f' % \
               (total_correct / float(total_seen)))
    log_string('eval segmentation avg class acc: %f' % \
               (np.mean(np.array(total_correct_class) / \
                        np.array(total_seen_class, dtype=np.float))))
    log_string('eval box IoU (ground/3D): %f / %f' % \
               (iou2ds_sum / float(num_batches * BATCH_SIZE), iou3ds_sum / \
                float(num_batches * BATCH_SIZE)))
    log_string('eval box estimation accuracy (IoU=0.7): %f' % \
               (float(iou3d_correct_cnt) / float(num_batches * BATCH_SIZE)))

    EPOCH_CNT += 1
示例#6
0
def train_one_epoch(fpointnet,device,optimizer):
    '''
    @author Qiao
    :param fpointnet: 网络
    :param device: 设备
    :return:
    '''
    global EPOCH_CNT

    log_string(str(datetime.now()))
    log_string('---- EPOCH %03d TRAINING ----' % (EPOCH_CNT))
    # 按照原始数据集大小进行取值
    if FLAGS.train_batch_num == None:
        train_idxs = np.arange(0, len(TRAIN_DATASET))
        np.random.shuffle(train_idxs)                                                 #随机
        num_batches = len(TRAIN_DATASET)//BATCH_SIZE
    else:
        num_batches = int(FLAGS.train_batch_num)
        num_batches = min(num_batches,len(TRAIN_DATASET)//BATCH_SIZE)
        train_idxs = np.arange(0, BATCH_SIZE*num_batches)
        np.random.shuffle(train_idxs)
    # To collect statistics
    total_correct = 0
    total_seen = 0
    loss_sum = 0
    iou2ds_sum = 0
    iou3ds_sum = 0
    iou3d_correct_cnt = 0

    # Training with batches
    for batch_idx in range(num_batches):
        start_idx = batch_idx * BATCH_SIZE
        end_idx = (batch_idx+1) * BATCH_SIZE

        batch_data, batch_label, batch_center, \
        batch_hclass, batch_hres, \
        batch_sclass, batch_sres, \
        batch_rot_angle, batch_one_hot_vec = \
        get_batch(TRAIN_DATASET, train_idxs, start_idx, end_idx,
                NUM_POINT, NUM_CHANNEL)

        pointclouds_pl = torch.from_numpy(batch_data)
        pointclouds_pl = pointclouds_pl.permute(0, 2, 1)
        pointclouds_pl = pointclouds_pl.to(device,dtype=torch.float32)
        one_hot_vec_pl = torch.from_numpy(batch_one_hot_vec)
        one_hot_vec_pl = one_hot_vec_pl.to(device,dtype=torch.float32)

        labels_pl = torch.from_numpy(batch_label).to(device,dtype=torch.int64)
        centers_pl = torch.from_numpy(batch_center).to(device,dtype=torch.float32)
        heading_class_label_pl = torch.from_numpy(batch_hclass).to(device,dtype=torch.int64)
        heading_residual_label_pl = torch.from_numpy(batch_hres).to(device,dtype=torch.float32)
        size_class_label_pl = torch.from_numpy(batch_sclass).to(device,dtype=torch.int64)
        size_residual_label_pl = torch.from_numpy(batch_sres).to(device,dtype=torch.float32)

        fpointnet.train()

        end_points = fpointnet.forward(pointclouds_pl, one_hot_vec_pl)
        loss, losses = get_loss(labels_pl, centers_pl,\
                  heading_class_label_pl, heading_residual_label_pl,\
                  size_class_label_pl, size_residual_label_pl, end_points)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        loss_val = loss.cpu().detach().numpy()
        logits_val = end_points['mask_logits'].cpu().detach().numpy()
        iou2ds,iou3ds,accuracy = compute_summary(end_points,labels_pl ,batch_center,\
                                                 batch_hclass,batch_hres,batch_sclass,batch_sres)
        preds_val = np.argmax(logits_val, 1)
        correct = np.sum(preds_val == batch_label)
        total_correct += correct
        total_seen += (BATCH_SIZE*NUM_POINT)
        loss_sum += loss_val
        iou2ds_sum += np.sum(iou2ds)
        iou3ds_sum += np.sum(iou3ds)
        iou3d_correct_cnt += np.sum(iou3ds>=0.7)

        iou2d_t = np.sum(iou2ds)/float(BATCH_SIZE)
        iou3d_t = np.sum(iou3ds)/float(BATCH_SIZE)
        writer.add_scalar('iou2ds', iou2d_t, global_step=EPOCH_CNT*batch_idx)
        writer.add_scalar('iou3ds', iou3d_t, global_step=EPOCH_CNT*batch_idx)
        for key,value in losses.items():
            writer.add_scalar(key, losses[key].cpu().data.numpy(), global_step=EPOCH_CNT*batch_idx)
        # writer.add_scalar('total_loss', loss, global_step=EPOCH_CNT*batch_idx)
        for param_group in optimizer.param_groups:
            learning_rate = param_group['lr']
        writer.add_scalar('learning_rate', learning_rate, global_step=EPOCH_CNT*batch_idx)
        writer.add_scalar('segmentation accuracy', accuracy, global_step=EPOCH_CNT*batch_idx)

        if (batch_idx+1)%10 == 0:
                log_string(' -- %03d / %03d --' % (batch_idx+1, num_batches))
                log_string('mean loss: %f' % (loss_sum / 10))
                log_string('segmentation accuracy: %f' % \
                    (total_correct / float(total_seen)))
                log_string('box IoU (ground/3D): %f / %f' % \
                    (iou2ds_sum / float(BATCH_SIZE*10), iou3ds_sum / float(BATCH_SIZE*10)))
                log_string('box estimation accuracy (IoU=0.7): %f' % \
                    (float(iou3d_correct_cnt)/float(BATCH_SIZE*10)))
                total_correct = 0
                total_seen = 0
                loss_sum = 0
                iou2ds_sum = 0
                iou3ds_sum = 0
                iou3d_correct_cnt = 0