├── .gitignore ├── LICENCE ├── README.md ├── cam_est ├── model_cam.py └── train_sdf_cam.py ├── data ├── data_sdf_h5_queue.py ├── data_sdf_h5_queue_mask_imgh5_cammat.py └── filelists │ ├── 02691156_test.lst │ ├── 02691156_train.lst │ ├── 02828884_test.lst │ ├── 02828884_train.lst │ ├── 02933112_test.lst │ ├── 02933112_train.lst │ ├── 02958343_test.lst │ ├── 02958343_train.lst │ ├── 03001627_test.lst │ ├── 03001627_train.lst │ ├── 03211117_test.lst │ ├── 03211117_train.lst │ ├── 03636649_test.lst │ ├── 03636649_train.lst │ ├── 03691459_test.lst │ ├── 03691459_train.lst │ ├── 04090263_test.lst │ ├── 04090263_train.lst │ ├── 04256520_test.lst │ ├── 04256520_train.lst │ ├── 04379243_test.lst │ ├── 04379243_train.lst │ ├── 04401088_test.lst │ ├── 04401088_train.lst │ ├── 04530566_test.lst │ └── 04530566_train.lst ├── demo ├── 03001627_17e916fc863540ee3def89b32cef8e45_20.png ├── demo.py └── result.obj ├── isosurface ├── LIB_PATH ├── computeDistanceField ├── computeMarchingCubes ├── displayDistanceField └── libtcmalloc.so.4 ├── models ├── CNN │ ├── __init__.py │ ├── alexnet.py │ ├── resnet.py │ └── vgg.py ├── deformnet.py ├── model_normalization.py ├── posenet.py ├── sdfnet.py └── tf_ops │ ├── approxmatch │ ├── __init__.py │ ├── tf_approxmatch.cpp │ ├── tf_approxmatch.py │ ├── tf_approxmatch_compile.sh │ ├── tf_approxmatch_g.cu │ └── tf_approxmatch_so.so │ └── nn_distance │ ├── README.md │ ├── __init__.py │ ├── tf_nndistance.cpp │ ├── tf_nndistance.py │ ├── tf_nndistance_compile.sh │ ├── tf_nndistance_cpu.py │ ├── tf_nndistance_g.cu │ └── tf_nndistance_so.so ├── postprocessing └── clean_smallparts.py ├── preprocessing ├── create_file_lst.py ├── create_img_h5.py ├── create_point_sdf_fullgrid.py ├── create_point_sdf_grid.py └── info.json ├── result.png ├── test ├── command ├── create_sdf.py ├── test_cd_emd.py ├── test_f_score.py ├── test_iou.py └── test_sdf_acc.py ├── train └── train_sdf.py └── utils ├── output_utils.py ├── part_color_mapping.json └── tf_util.py /.gitignore: -------------------------------------------------------------------------------- 1 | *.xml 2 | *.pyc 3 | .idea/ 4 | *.o 5 | models/CNN/pretrained_model/ 6 | checkpoint/ 7 | log/ 8 | pnt_vis/ 9 | cam_est/checkpoint/ 10 | -------------------------------------------------------------------------------- /LICENCE: -------------------------------------------------------------------------------- 1 | 2 | Copyright (c) 2012-2021 Scott Chacon and others 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining 5 | a copy of this software and associated documentation files (the 6 | "Software"), to deal in the Software without restriction, including 7 | without limitation the rights to use, copy, modify, merge, publish, 8 | distribute, sublicense, and/or sell copies of the Software, and to 9 | permit persons to whom the Software is furnished to do so, subject to 10 | the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be 13 | included in all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 19 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 20 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 21 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # DISN: Deep Implicit Surface Network for High-quality Single-view 3D Reconstruction 2 | Please report bugs [here](https://github.com/Xharlie/DISN) and we will publish the bug fix and the latest [updates](https://github.com/Xharlie/DISN) 3 | 4 | * ### We just released a rendering [datasets](https://github.com/Xharlie/ShapenetRender_more_variation) with more view variations that contains RGB, albedo, depth and normal 2D images. 5 | 6 | Please cite our paper 7 | [DISN: Deep Implicit Surface Network for High-quality Single-view 3D Reconstruction (NeurIPS 2019)](https://arxiv.org/abs/1905.10711) 8 | 9 | ``` 10 | @incollection{NIPS2019_8340, 11 | title = {DISN: Deep Implicit Surface Network for High-quality Single-view 3D Reconstruction}, 12 | author = {Xu, Qiangeng and Wang, Weiyue and Ceylan, Duygu and Mech, Radomir and Neumann, Ulrich}, 13 | booktitle = {Advances in Neural Information Processing Systems 32}, 14 | editor = {H. Wallach and H. Larochelle and A. Beygelzimer and F. d\textquotesingle Alch\'{e}-Buc and E. Fox and R. Garnett}, 15 | pages = {492--502}, 16 | year = {2019}, 17 | publisher = {Curran Associates, Inc.}, 18 | url = {http://papers.nips.cc/paper/8340-disn-deep-implicit-surface-network-for-high-quality-single-view-3d-reconstruction.pdf} 19 | } 20 | ``` 21 | Code contact: [Qiangeng Xu*](https://xharlie.github.io/) and [Weiyue Wang*](https://weiyuewang.github.io/) 22 | 23 | 24 | 25 | ## Installation 26 | ``` 27 | pip install trimesh==2.37.20 28 | cd {DISN} 29 | mkdir checkpoint 30 | cd checkpoint 31 | wget https://www.dropbox.com/s/2ts7qc9w4opl4w4/SDF_DISN.tar?dl=0 32 | tar -xvzf SDF_DISN.tar?dl=0 33 | rm -rf SDF_DISN.tar?dl=0 34 | cd .. 35 | mkdir cam_est/checkpoint 36 | cd cam_est/checkpoint 37 | wget https://www.dropbox.com/s/hyv4lcvpfu0au9e/cam_DISN.tar?dl=0 38 | tar -xvzf cam_DISN.tar?dl=0 39 | rm -rf cam_DISN.tar?dl=0 40 | cd ../../ 41 | change corresponding libary path in your system in isosurface/LIB_PATH 42 | ``` 43 | ## Demo: 44 | * --sdf_res control the resolution of the sampled sdf, default is 64, the larger, the more fine-grained, but slower. 45 | ``` 46 | cd {DISN} 47 | source isosurface/LIB_PATH 48 | nohup python -u demo/demo.py --cam_est --log_dir checkpoint/SDF_DISN --cam_log_dir cam_est/checkpoint/cam_DISN --img_feat_twostream --sdf_res 256 &> log/create_sdf.log & 49 | ``` 50 | The result is demo/result.obj. 51 | 52 | ## Data Preparation 53 | 54 | * ### file location setup: 55 | * under preprocessing/info.json, you can change the locations of your data: the neccessary dir for the main model are : 56 | ``` 57 | "raw_dirs_v1": { 58 | "mesh_dir": "/ssd1/datasets/ShapeNet/ShapeNetCore.v1/", 59 | "norm_mesh_dir": "/ssd1/datasets/ShapeNet/march_cube_objs_v1/", 60 | "rendered_dir": "/ssd1/datasets/ShapeNet/ShapeNetRendering/", 61 | "renderedh5_dir": "/ssd1/datasets/ShapeNet/ShapeNetRenderingh5_v1/", 62 | "sdf_dir": "/ssd1/datasets/ShapeNet/SDF_v1/" 63 | } 64 | ``` 65 | 66 | * ### Download ShapeNetCore.v1 67 | download the dataset following the instruction of https://www.shapenet.org/account/ (about 30GB) 68 | 69 | ``` 70 | cd {your download dir} 71 | wget http://shapenet.cs.stanford.edu/shapenet/obj-zip/ShapeNetCore.v1.zip 72 | unzip ShapeNetCore.v1.zip -d {your mesh_dir} 73 | ``` 74 | 75 | * ### Prepare SDF files and marching cube ground truth model 76 | To directly download the generated sdf and model, follow the instruction [here](https://github.com/Xharlie/DISN) 77 | To generate sdf files and the reconstructed models by yourself (Please expect the script to run for several hours), please execute the following command lines 78 | Our data preparation used this paper [Vega: non-linear fem deformable object simulator](http://run.usc.edu/vega/SinSchroederBarbic2012.pdf). Please also cite it if you use our code to generate sdf files 79 | ``` 80 | mkdir log 81 | cd {DISN} 82 | source isosurface/LIB_PATH 83 | nohup python -u preprocessing/create_point_sdf_grid.py --thread_num {recommend 9} --category {default 'all', but can be single category like 'chair'} &> log/create_sdf.log & 84 | 85 | ## SDF folder takes about 9.0G, marching cube obj folder takes about 245G 86 | 87 | ``` 88 | * ### Download and generate 2d image h5 files: 89 | * #### download 2d image following 3DR2N2[https://github.com/chrischoy/3D-R2N2], please cite their paper if you use this image tar file: 90 | 91 | ``` 92 | wget http://cvgl.stanford.edu/data2/ShapeNetRendering.tgz 93 | untar it to {your rendered_dir} 94 | ``` 95 | * #### run h5 file generation (about 26 GB) : 96 | 97 | ``` 98 | cd {DISN} 99 | nohup python -u preprocessing/create_img_h5.py &> log/create_imgh5.log & 100 | ``` 101 | 102 | ## Camera parameters estimation network 103 | 104 | * ### train the camera parameters estimation network: 105 | ``` 106 | ### train the camera poses of the original rendered image dataset. 107 | nohup python -u cam_est/train_sdf_cam.py --log_dir checkpoint/{your training checkpoint dir} --gpu 0 --loss_mode 3D --learning_rate 2e-5 &> log/cam_3D_all.log & 108 | 109 | ### train the camera poses of the adding 2 more DoF augmented on the rendered image dataset. 110 | nohup python -u cam_est/train_sdf_cam.py --log_dir checkpoint/{your training checkpoint dir} --gpu 2 --loss_mode 3D --learning_rate 1e-4 --shift --shift_weight 2 &> log/cam_3D_shift2_all.log & 111 | 112 | ``` 113 | * ### create h5 file of image and estimated cam parameters: 114 | ``` 115 | ### Create img_h5 to {renderedh5_dir_est} in your info.json, the default is only generate h5 of test images and cam parameters(about 5.3GB) 116 | nohup python -u train_sdf_cam.py --img_h5_dir {renderedh5_dir_est} --create --restore_model checkpoint/cam_3D_all --log_dir checkpoint/{your training checkpoint dir} --gpu 0--loss_mode 3D --batch_size 24 &> log/create_cam_mixloss_all.log & 117 | ``` 118 | 119 | ## SDF generation network: 120 | 121 | * ### train the sdf generation with provided camera parameters: 122 | 123 | if train from scratch, you can load official pretrained vgg_16 by setting --restore_modelcnn; or you can --restore_model to your checkpoint to continue the training): 124 | 125 | * support flip the background color from black to white since most online images have white background(by using --backcolorwhite) 126 | * if use flag --cam_est, the img_h5 is loaded from {renderedh5_dir_est} instead of {renderedh5_dir}, so that we can train the generation on the estimated camera parameters 127 | ``` 128 | nohup python -u train/train_sdf.py --gpu 0 --img_feat_twostream --restore_modelcnn ./models/CNN/pretrained_model/vgg_16.ckpt --log_dir checkpoint/{your training checkpoint dir} --category all --num_sample_points 2048 --batch_size 20 --learning_rate 0.0001 --cat_limit 36000 &> log/DISN_train_all.log & 129 | ``` 130 | 131 | * ### inference sdf and create mesh objects: 132 | 133 | * will save objs in {your training checkpoint dir}/test_objs/{sdf_res+1}_{iso} 134 | * will save objs in {your training checkpoint dir}/test_objs/{sdf_res+1}_{iso} 135 | * if use estimated camera post, --cam_est, will save objs in {your training checkpoint dir}/test_objs/camest_{sdf_res+1}_{iso} 136 | * if only create chair or a single category, --category {chair or a single category} 137 | * --sdf_res control the resolution of the sampled sdf, default is 64, the larger, the more fine-grained, but slower. 138 | ``` 139 | source isosurface/LIB_PATH 140 | 141 | #### use ground truth camera pose 142 | nohup python -u test/create_sdf.py --img_feat_twostream --view_num 24 --sdf_res 64 --batch_size 1 --gpu 0 --sdf_res 64 --log_dir checkpoint/{your training checkpoint dir} --iso 0.00 --category all &> log/DISN_create_all.log & 143 | 144 | #### use estimated camera pose 145 | nohup python -u test/create_sdf.py --img_feat_twostream --view_num 24 --sdf_res 64 --batch_size 1 --gpu 3 --sdf_res 64 --log_dir checkpoint/{your training checkpoint dir} --iso 0.00 --category all --cam_est &> log/DISN_create_all_cam.log & 146 | ``` 147 | * ### clean small objects: 148 | * #### if the model doens't converge well, you can clean flying parts that generated by mistakes 149 | ``` 150 | nohup python -u clean_smallparts.py --src_dir checkpoint/{your training checkpoint dir}/test_objs/65_0.0 --tar_dir checkpoint/{your training checkpoint dir}/test_objs/65_0.0 --thread_n 10 &> log/DISN_clean.log & 151 | ``` 152 | 153 | ## Evaluation: 154 | ### please compile models/tf_ops/ approxmatch and nn_distance and cites "A Point Set Generation Network for 3D Object Reconstruction from a Single Image" 155 | * ### Chamfer Distance and Earth Mover Distance: 156 | * #### cal_dir specify which obj folder to be tested, e.g. if only test watercraft, --category watercraft 157 | ``` 158 | nohup python -u test/test_cd_emd.py --img_feat_twostream --view_num 24 --num_sample_points 2048 --gpu 0 --batch_size 24 --log_dir checkpoint/{your training checkpoint dir} --cal_dir checkpoint/{your training checkpoint dir}/test_objs/65_0.0 --category all &> log/DISN_cd_emd_all.log & 159 | ``` 160 | * ### F-Score caluculation: 161 | * cal_dir specify which obj folder to be tested, e.g. if only test watercraft, --category watercraft 162 | also the threshold of true can be set, here we use 2.5 for default: 163 | ``` 164 | nohup python -u test/test_f_score.py --img_feat_twostream --view_num 24 --num_sample_points 2048 --gpu 0 --batch_size 24 --log_dir checkpoint/{your training checkpoint dir} --cal_dir checkpoint/{your training checkpoint dir}/test_objs/65_0.0 --category all --truethreshold 2.5 &> log/DISN_fscore_2.5.log & 165 | ``` 166 | * ### IOU caluculation: 167 | * cal_dir specify which obj folder to be tested, e.g. if only test watercraft, --category watercraft 168 | * --dim specify the number of voxels along each 3D dimension. 169 | 170 | ``` 171 | nohup python -u test/test_iou.py --img_feat_twostream --view_num 24 --log_dir checkpoint/{your training checkpoint dir} --cal_dir checkpoint/{your training checkpoint dir}/test_objs/65_0.0 --category all --dim 110 &> DISN_iou_all.log & 172 | ``` 173 | -------------------------------------------------------------------------------- /cam_est/model_cam.py: -------------------------------------------------------------------------------- 1 | import tensorflow as tf 2 | import numpy as np 3 | import os 4 | import tensorflow.contrib.slim as slim 5 | from tensorflow.contrib.slim.python.slim.nets import vgg 6 | import sys 7 | BASE_DIR = os.path.dirname(os.path.abspath(__file__)) 8 | ROOT_DIR = os.path.dirname(BASE_DIR) 9 | sys.path.append(os.path.join(ROOT_DIR)) 10 | sys.path.append(os.path.join(ROOT_DIR,'..')) 11 | sys.path.append(os.path.join(ROOT_DIR, 'models')) 12 | import posenet 13 | 14 | def placeholder_inputs(batch_size, num_points, img_size, num_pc=2018, num_sample_pc = 2048*8, scope=''): 15 | 16 | with tf.variable_scope(scope) as sc: 17 | pc_pl = tf.placeholder(tf.float32, shape=(batch_size, num_pc, 3)) 18 | sample_pc_pl = tf.placeholder(tf.float32, shape=(batch_size, num_sample_pc, 3)) 19 | sample_pc_rot_pl = tf.placeholder(tf.float32, shape=(batch_size, num_sample_pc, 3)) 20 | imgs_pl = tf.placeholder(tf.float32, shape=(batch_size, img_size[0], img_size[1], 3)) 21 | sdf_value_pl = tf.placeholder(tf.float32, shape=(batch_size, num_sample_pc, 1)) 22 | sdf_sign_pl = tf.placeholder(tf.int32, shape=(batch_size, num_sample_pc)) 23 | trans_mat_pl = tf.placeholder(tf.float32, shape=(batch_size, 4, 3)) 24 | RT_mat_pl = tf.placeholder(tf.float32, shape=(batch_size, 4, 3)) 25 | shifts_pl = tf.placeholder(tf.float32, shape=(batch_size, 2)) 26 | 27 | # camera intrinsic matrix 28 | K = np.array([[149.84375, 0., 68.5],[0., 149.84375, 68.5],[0., 0., 1.]], dtype=np.float32)#.T 29 | K_pl = tf.constant(K) 30 | K_pl = tf.expand_dims(K_pl, 0) # Convert to a len(yp) x 1 matrix. 31 | K_pl = tf.tile(K_pl, [batch_size, 1, 1]) # Create multiple columns. 32 | 33 | sdf = {} 34 | sdf['pc'] = pc_pl 35 | sdf['sample_pc'] = sample_pc_pl 36 | sdf['sample_pc_rot'] = sample_pc_rot_pl 37 | sdf['imgs'] = imgs_pl 38 | sdf['sdf_value'] = sdf_value_pl 39 | sdf['sdf_sign'] = sdf_sign_pl 40 | sdf['trans_mat'] = trans_mat_pl 41 | sdf['RT'] = RT_mat_pl 42 | sdf['K'] = K_pl 43 | sdf['shifts'] = shifts_pl 44 | 45 | return sdf 46 | 47 | def get_model(ref_dict, num_point, is_training, bn=False, bn_decay=None, img_size = (137,137), wd=1e-5, FLAGS=None): 48 | 49 | ref_img = ref_dict['imgs'] 50 | ref_pc = ref_dict['pc'] 51 | ref_sample_pc = ref_dict['sample_pc'] 52 | ref_sample_pc_rot = ref_dict['sample_pc_rot'] 53 | trans_mat = ref_dict['trans_mat'] 54 | K = ref_dict['K'] 55 | RT = ref_dict['RT'] 56 | gt_xyshift = ref_dict['shifts'] 57 | 58 | batch_size = ref_img.get_shape()[0].value 59 | 60 | # endpoints 61 | end_points = {} 62 | end_points['ref_pc'] = ref_pc 63 | end_points['RT'] = RT 64 | end_points['K'] = K 65 | end_points['gt_xyshift'] = gt_xyshift 66 | end_points['trans_mat'] = trans_mat 67 | end_points['sample_pc'] = ref_sample_pc #* 10 68 | 69 | # Image extract features 70 | if ref_img.shape[1] != 224 or ref_img.shape[2] != 224: 71 | ref_img = tf.image.resize_bilinear(ref_img, [224, 224]) 72 | end_points['ref_img'] = ref_img 73 | 74 | # vgg.vgg_16.default_image_size = (224, 224) 75 | with slim.arg_scope([slim.conv2d], 76 | weights_regularizer=slim.l2_regularizer(wd)): 77 | ref_feats_embedding, vgg_end_points = vgg.vgg_16(ref_img, num_classes=1024, is_training=False, scope='vgg_16', spatial_squeeze=False) 78 | ref_feats_embedding_cnn = tf.squeeze(ref_feats_embedding, axis = [1,2]) 79 | end_points['embedding'] = ref_feats_embedding_cnn 80 | print(vgg_end_points.keys()) 81 | 82 | with tf.variable_scope("cameraprediction") as scope: 83 | if FLAGS.shift: 84 | pred_rotation, pred_translation, pred_RT, pred_xyshift = posenet.get_cam_mat_shft(ref_feats_embedding_cnn, is_training, batch_size, bn, bn_decay, wd) 85 | end_points['pred_rotation'] = pred_rotation 86 | end_points['pred_translation'] = pred_translation 87 | end_points['pred_RT'] = pred_RT 88 | end_points['pred_xyshift'] = pred_xyshift 89 | else: 90 | pred_rotation, pred_translation, pred_RT = posenet.get_cam_mat(ref_feats_embedding_cnn, is_training, batch_size, bn, bn_decay, wd) 91 | end_points['pred_rotation'] = pred_rotation 92 | end_points['pred_translation'] = pred_translation 93 | end_points['pred_RT'] = pred_RT 94 | end_points['pred_xyshift'] = None 95 | pred_xyshift = None 96 | 97 | print('trans_mat', trans_mat.shape) 98 | sample_img_points, gt_xy = get_img_points(ref_sample_pc, trans_mat, gt_xyshift, FLAGS) 99 | end_points['sample_img_points'] = sample_img_points 100 | end_points['gt_xy'] = gt_xy 101 | 102 | K_transpose = tf.transpose(K, perm=[0, 2, 1]) 103 | pred_trans_mat = tf.matmul(pred_RT, K_transpose) 104 | pred_sample_img_points, pred_xy = get_img_points(ref_sample_pc, pred_trans_mat, pred_xyshift, FLAGS) 105 | end_points['pred_sample_img_points'] = pred_sample_img_points 106 | end_points['pred_trans_mat'] = pred_trans_mat 107 | end_points['pred_xy'] = pred_xy 108 | print("gt_xy, pred_xy", gt_xy.get_shape(), pred_xy.get_shape()) 109 | return end_points 110 | 111 | def get_img_points(sample_pc, trans_mat_right, pred_xyshift, FLAGS): 112 | # sample_pc B*N*3 113 | size_lst = sample_pc.get_shape().as_list() 114 | homo_pc = tf.concat((sample_pc, tf.ones((size_lst[0], size_lst[1], 1),dtype=np.float32)),axis= -1) 115 | print("homo_pc.get_shape()", homo_pc.get_shape()) 116 | pc_xyz = tf.matmul(homo_pc, trans_mat_right) 117 | print("pc_xyz.get_shape()", pc_xyz.get_shape()) # B * N * 3 118 | pc_xy = tf.cast(tf.divide(pc_xyz[:,:,:2], tf.expand_dims(pc_xyz[:,:,2], axis = 2)), dtype=tf.float32) 119 | if FLAGS.shift: 120 | pc_xy = pc_xy + tf.tile(tf.expand_dims(pred_xyshift / 2 * FLAGS.img_h, axis=1), (1,FLAGS.num_points,1)) 121 | mintensor = tf.constant([0.0,0.0], dtype=tf.float32) 122 | maxtensor = tf.constant([136.0,136.0], dtype=tf.float32) 123 | return tf.minimum(maxtensor, tf.maximum(mintensor, pc_xy)), pc_xy 124 | 125 | def get_loss(end_points, sdf_weight=10., regularization=True, FLAGS=None): 126 | """ sigmoid loss+sdf value""" 127 | 128 | sample_pc = end_points['sample_pc'] 129 | RT = end_points['RT'] 130 | pred_RT = end_points['pred_RT'] 131 | sample_img_points = end_points['sample_img_points'] 132 | pred_sample_img_points = end_points['pred_sample_img_points'] 133 | pred_xy = end_points['pred_xy'] 134 | pred_xyshift = end_points['pred_xyshift'] 135 | gt_xyshift = end_points['gt_xyshift'] 136 | gt_xy = end_points['gt_xy'] 137 | pred_trans_mat = end_points['pred_trans_mat'] 138 | trans_mat = end_points['trans_mat'] 139 | loss = 0. 140 | # K = end_points['K'] 141 | # pred_rotation = end_points['pred_rotation'] 142 | # pred_translation = end_points['pred_translation'] 143 | # trans_cam = end_points['trans_mat'] 144 | 145 | ################ 146 | # Compute loss # 147 | ################ 148 | end_points['losses'] = {} 149 | end_points['results'] = {} 150 | 151 | ########### camera loss 152 | ##point cloud rotation error 153 | size_lst = sample_pc.get_shape().as_list() 154 | homo_sample_pc = tf.concat((sample_pc, tf.ones((size_lst[0], size_lst[1], 1),dtype=np.float32)),axis= -1) 155 | sub_3d = tf.matmul(homo_sample_pc, pred_RT) - tf.matmul(homo_sample_pc, RT) 156 | rotpc_loss = tf.reduce_mean(tf.nn.l2_loss(sub_3d)) 157 | rot2d_loss = tf.reduce_mean(tf.nn.l2_loss(pred_xy - gt_xy)) / 10000. 158 | rot2d_dist_all = tf.reduce_mean(tf.sqrt(tf.reduce_sum(tf.square(sample_img_points - pred_sample_img_points), axis = -1)), axis=1) 159 | rot2d_dist = tf.reduce_mean(rot2d_dist_all) 160 | rot3d_dist_all = tf.reduce_mean(tf.sqrt(tf.reduce_sum(tf.square(sub_3d), axis = -1)), axis=1) 161 | rot3d_dist = tf.reduce_mean(rot3d_dist_all) 162 | rotmatrix_loss = tf.reduce_mean((tf.square((pred_trans_mat-trans_mat)))) 163 | end_points['rot_homopc'] = tf.matmul(homo_sample_pc, RT) 164 | end_points['pred_rot_homopc'] = tf.matmul(homo_sample_pc, pred_RT) 165 | rotpc_loss = rotpc_loss #* 100 166 | end_points['losses']['rotpc_loss'] = rotpc_loss 167 | end_points['losses']['rot2d_loss'] = rot2d_loss 168 | end_points['losses']['rot3d_dist'] = rot3d_dist 169 | end_points['losses']['rot2d_dist'] = rot2d_dist 170 | end_points['losses']['rotmatrix_loss'] = rotmatrix_loss 171 | end_points['results']['rot2d_dist_all'] = rot2d_dist_all 172 | end_points['results']['rot3d_dist_all'] = rot3d_dist_all 173 | if FLAGS.loss_mode == "3D": 174 | loss += rotpc_loss 175 | elif FLAGS.loss_mode == "2D": 176 | loss += rot2d_loss 177 | elif FLAGS.loss_mode == "3DM": 178 | loss += rotpc_loss + rotmatrix_loss * 0.3 179 | else: 180 | loss += rot2d_loss + rotpc_loss + rotmatrix_loss 181 | if FLAGS.shift: 182 | shiftxy_loss = tf.reduce_mean(tf.nn.l2_loss(gt_xyshift - pred_xyshift)) 183 | end_points['losses']['shiftxy_loss'] = shiftxy_loss 184 | loss+= shiftxy_loss * FLAGS.shift_weight 185 | # ## rotation geodesic distance loss 186 | # geodist = posenet.compute_geodesic_distance_from_two_matrices(pred_rotation, RT[:,:3,:]) 187 | # geodist_loss = tf.reduce_mean(tf.nn.l2_loss(geodist)) 188 | # geodist_loss = geodist_loss 189 | # end_points['losses']['geodist_loss'] = geodist_loss 190 | # loss += geodist_loss 191 | 192 | # ## rotation mat loss 193 | # rot_loss = tf.reduce_mean(tf.nn.l2_loss(pred_rotation - RT[:,:3,:])) 194 | # rot_loss = 100 * rot_loss 195 | # end_points['losses']['rot_loss'] = rot_loss 196 | # loss += rot_loss 197 | 198 | # ## rotation mat differencel loss 199 | # rot_mat_diff = tf.matmul(pred_rotation, tf.transpose(RT[:,:3,:], perm=[0,2,1])) 200 | # end_points['rot_mat_diff'] = rot_mat_diff 201 | # rot_mat_diff -= tf.constant(np.eye(3), dtype=tf.float32) 202 | # rot_mat_diff_loss = tf.reduce_mean(tf.nn.l2_loss(rot_mat_diff)) 203 | # rot_mat_diff_loss = 100 * rot_mat_diff_loss 204 | # end_points['losses']['rot_mat_diff'] = rot_mat_diff_loss 205 | # loss += rot_mat_diff_loss 206 | 207 | # trans_loss = tf.reduce_mean(tf.abs(pred_translation - RT[:,3,:])) 208 | # trans_loss = 100 * trans_loss 209 | # end_points['losses']['trans_loss'] = trans_loss 210 | # loss += trans_loss 211 | 212 | # cam_loss = tf.reduce_mean(tf.abs(pred_RT - RT)) 213 | # cam_loss = 100 * cam_loss 214 | 215 | # end_points['losses']['rot_loss'] = rot_loss 216 | # end_points['losses']['cam_loss'] = cam_loss 217 | # cam_loss = rot_mat_diff + trans_loss 218 | # loss += cam_loss 219 | 220 | # cam_loss = tf.reduce_mean(tf.abs(pred_cam - RT)) 221 | # end_points['losses']['cam_loss'] = cam_loss 222 | # loss += cam_loss 223 | 224 | # mat_diff = tf.matmul(pred_rotation, tf.transpose(pred_rotation, perm=[0,2,1])) 225 | # mat_diff -= tf.constant(np.eye(3), dtype=tf.float32) 226 | # mat_diff_loss = tf.nn.l2_loss(mat_diff) 227 | # end_points['losses']['mat_diff_loss'] = mat_diff_loss 228 | # loss += mat_diff_loss 229 | 230 | ############### weight decay 231 | if regularization: 232 | vgg_regularization_loss = tf.add_n(slim.losses.get_regularization_losses()) 233 | # decoder_regularization_loss = tf.add_n(tf.get_collection('regularizer')) 234 | end_points['losses']['regularization'] = vgg_regularization_loss#(vgg_regularization_loss + decoder_regularization_loss) 235 | loss += vgg_regularization_loss#(vgg_regularization_loss + decoder_regularization_loss) 236 | 237 | end_points['losses']['overall_loss'] = loss 238 | 239 | return loss, end_points 240 | 241 | -------------------------------------------------------------------------------- /data/filelists/02828884_test.lst: -------------------------------------------------------------------------------- 1 | 131edf0948b60ee6372c8cd7d07d8ddc 2 | c96afd58ad067a6871b66f80cfaa9877 3 | dd97603ce7538c15be5bbc844e6db7e 4 | c6dbedf2028735ccd2b12aa6a0f050b3 5 | d8c1f1b9bdbd697b849cf9ca1e2dcbed 6 | 974668cad6e15520c955e5ed03ef3a2f 7 | 866b0fab7a3e54053555de1e3169ac6e 8 | fb861f0e4e7f528fccda8d28b44378b7 9 | 22031fe0420834a9ad5067eac75a07f7 10 | 87c34f2d5d53a51768679c90b064f491 11 | 373ae08d8903dc10ba929f7d2edd1706 12 | e6a3b8946b66b83065ba78ad9601cf1b 13 | b3974f214dd4af93601104cd2d998272 14 | 9b5dfec7d45eeca94c8c340ea700916e 15 | db4aeb6354f5bd0dd4d8765e3910f617 16 | a5a9a0be36997bd82f549c6b85154162 17 | 6df5b51b250a823b147d36b9f2f13116 18 | b4ae95fbb879bed0ee38cd6552dcaadc 19 | 366db933a2c99444f4fb4dee5181bee 20 | 9c9fc31bba4881794620a50068fc504d 21 | aa2571b8067d6d5383c4907a93b0fbc1 22 | 6b4e4125c1a680cd2cc92e3c03668ea8 23 | 42ffe8d78c2e8da9d40c07d3c15cc681 24 | eb038519c5ba87b663b2acb037dfbcde 25 | fc7785be580a926a3409d1e6da3f019 26 | 23ce36288382e8285710c881d369ccb3 27 | a8e987a6a6486b962d6c8e51365a5a87 28 | 4647754b7c5b31cccb2a965e75be701c 29 | 957596b8dc4cba37ad5067eac75a07f7 30 | a4491b4a67356be5184c1614f4105c8b 31 | 218b98805019ba7df11e0e33e4b1b85c 32 | 2e2518a8a2f335ae76bc197b3a3ffc0 33 | 1b78416210cbdcf1b184e775cf66758c 34 | 89f810f17284aceb85ef4356ea4ff622 35 | 2eea9c22b37967006e40121acd58a004 36 | 94420ab399ce8a1561e51a63d5bc6e46 37 | b852e63ad5983f1a8ccde000e771fc1a 38 | b6b10e519fed3c9ea9d99888ae8a3eb5 39 | 9fd5b67a2b20b5d1b19874039c8f3e05 40 | 88440ae4e218fa6ed4d8765e3910f617 41 | ddbcdce0db6aa00524b325c2195eaee5 42 | 7b21980987b63b953e329950ec40f6dd 43 | f8ff2310c6b130d38aaa31e538081318 44 | fdf0f799b897b0c99917ad57402f53f1 45 | 71ab9fd8db7ee09a59cbde03ded257fd 46 | f7ffdf91b66c0c989c9513cebb0fb44c 47 | 459f90aa2162b1f1d46c340938e2ff1c 48 | 7a8a8c523bcaa364a41bbb5eb703e15 49 | d74a990634bb4b98ad5067eac75a07f7 50 | 2c6c50ead2551d51a0e159a720dabf7 51 | 8f102661c3efbdd184f92715bac39b74 52 | 7cab2809bcc7b73a141c96faecd80bdd 53 | 498ef3fb51503dc36e07666ce67ff5a 54 | 61ade658bb475cc6a992c1353f8a88ef 55 | 7bbd4d3fed3c4255626d7e3d07da8352 56 | 5d463e4412600a3213afadfff198a630 57 | 2cb61abc0c2663ae8f0add668496d7a1 58 | 8277bffcffda5c4edab3d510e4b89249 59 | c9ca9b7317ac41b82168e5dee0d7f21 60 | af79d505f2ef2223cb2a965e75be701c 61 | d7025b55fe15337ed7c5502d4a22edf5 62 | 6752d9230ae82d1ce67de87b371d4c06 63 | ea4740ede10b7620c09352f205bd9134 64 | 8d074f177479ac42628516f95b4691f 65 | 9e4c82a76b6aff2bbeedb4c8fd29e2d1 66 | 557899ea369eedd4cb2a965e75be701c 67 | 8a5a59ab999c03ccfb0eb7e753c06942 68 | d1f9f40f8f58394c91cb0beedee33fd 69 | 14af4a9931635c75f4fb4dee5181bee 70 | 35948e4d06a9b07e8ba8ff316aec8d3d 71 | d8b87f36fde3f2f3bc5996932c1238cd 72 | 56a818c4e5891f1d39316df04169d12f 73 | 3830a5b2eec789ac63b2acb037dfbcde 74 | 85db4f1bf9e2b62c492d9da2668ec34c 75 | 9de1b1608e6ffb9afde926512eb9d305 76 | 1a55e418c61e9dab6f4a86fe50d4c8f0 77 | f0b85200702e4739391e4d6c585a697a 78 | 84bb6a30b1c5a87be008ebe8273a693f 79 | 14abcb14222adcd499b68520b875243 80 | 95cbcdc64b28bbf396f61afd58e50ae2 81 | cad58af144b615b674a3201fd136f855 82 | 3749b110a6f7895afdb310510a9dc39 83 | a047cb14c22517e6f33e284fed03c3fc 84 | 28b9f2908f0cbb179c21c139c0613648 85 | 84efcf2796fad0d2917fe9209d09e56e 86 | e7bb6ef568db1c986dfe473551340375 87 | 5d8f7c82a04943fed201085e80edb26a 88 | 4d6b053f11e784e2a136ebdce43e4200 89 | d9c927569da63ff92ebeb1e6a8111f53 90 | a7366461245f831ea764a25163affad1 91 | beae527c550f5ce8e4ed7bd95fe664b 92 | 2bfeb0ef0693823d1418b6bd61b3ca4 93 | b9fb64100372235adbbc9440457e303e 94 | 19399a9aac37442359cbde03ded257fd 95 | a380e75d8efcb4192f550a4f461edf6b 96 | 8fc8fb14df48da05ad5067eac75a07f7 97 | 1e039c5d86b061a593ebeeedbff73b 98 | ad9a12cce63df1c9870f22c94729669b 99 | f264c4d430891732d97248c4337f8439 100 | eb9938d81ec9005882db9fca4b68095 101 | efe997f288fdce2d985ef0bf52b97bf5 102 | 550e62946d2f55554bce3147c41ec725 103 | 26299b4f8e03f3ae9470a3e695aa4fae 104 | 92f1fa8d3b5da497ad5067eac75a07f7 105 | 18d0aff1a5eb486ae2be3aed8abfbbaf 106 | 20222f467d257022c8bbbd98dee48cb 107 | c3d8c664906eb8e57b11ae648ea92233 108 | 5a96b6b335bada106fa8ce57c8ec2e09 109 | ea56c97ec123270c2d776d9e024e5deb 110 | abcb5dc91337f47682db9fca4b68095 111 | 8a03039b614b41b319fb4103277a6b93 112 | 2974b7f87eb2297ffebad4f49b26ec52 113 | 3d470843f013f9d8c9fd4914d3d18461 114 | 891b8a01ad71af2db7e843606969432b 115 | 220ab2896e0b5d87dae58dd9656897ad 116 | e56b95381904bfd08ccde000e771fc1a 117 | 717019a5d139874f44dfa7c5506ef235 118 | abf095439d2d7bdb57a8fa4c1cbcf3ea 119 | e8480e72fb656057656a19d1d18fdbac 120 | 617fa8d6d65af35d71295682a9280b8b 121 | e1ce45ee8de4436655a9b4fa7594b177 122 | de00838284782bfe97fb25ec4f973add 123 | f7b5756c04e354a0c1c40d87de24d930 124 | 552ab19eab47725cb2a965e75be701c 125 | 84d0db8ad40017a195c500dedd6e2c23 126 | cff15ed24c45878b3567b82c74e275b4 127 | 2346b4f87a4f683b92e6829c9c63f7e8 128 | e4b80a7e381c6ef0f4215050a7660e65 129 | 9399c7769b01d4742591fa6348c25a73 130 | 3e81e31d8cd99cdffae0a22d98098878 131 | 8bb2354519a2ca276d9eb2ed02ef01ed 132 | 106494f75125eea6adf66a6d73888234 133 | ce23a5781e86368af4fb4dee5181bee 134 | 3a60057b27f90ed64910664c4d1311f4 135 | c7fb65bd3bd09a852056b4bd5d870b47 136 | 72b6c4e1d8b93b21c2bf98e7124e149 137 | 6a237c1e61fe2bba8490246570868c8d 138 | 25876fee744f8f8dd45380eb90f62b3f 139 | 86059f6fa56a8c5e44175b4dddf5be08 140 | 2d1ea225c279836cd67b3c7873295e75 141 | b95994218ee416f492d9da2668ec34c 142 | fa2f82cf9275c2078ccde000e771fc1a 143 | 2731687dd460a263d8eae9bce48bbeed 144 | 5b24beacd0385489a6ca26b5255a8e6 145 | cf873b381095c2d43cbc166debd211cf 146 | 38e367e4421ec3cbba70cedf91706353 147 | 9bb6f0077f91c613f155d75bbf62b80 148 | 90a8b80aa2fa209ca936e2693dce34b6 149 | bfaad1f9dadac9b6a385f05be5d65f80 150 | e329a9a5e7422b0a43638dabe1eb5336 151 | 9e4e83e67a901168febad4f49b26ec52 152 | f495bd67af8d9f0cadd1cf65e8dc4de 153 | 5775bf637d14acf1eaa4526a35f01085 154 | 50ef39d633520df0855931d119219022 155 | 5a383d9a0e67caed4ea8cb420cbb292f 156 | d0c64a8b3fed1ba113736977841a6b9b 157 | 2fe40aafbefd99a9d2b12aa6a0f050b3 158 | 1c47c37d6c785d4fe7fd9a18c19837e5 159 | 405d1666d90df2c139842e32fb9b4e4a 160 | 3c7a0029ec98c965601104cd2d998272 161 | 9b37a6d7c9f1800952dac0add839bf80 162 | a76a3d33ac6c3c65d46c340938e2ff1c 163 | a3e3c1bd2a644e2df4fb4dee5181bee 164 | ca21ae1c48c020db1a7fdfcca5768f88 165 | 87086d24c964f9524ee9546b7112f88f 166 | 8afe9533153bb82b157f5033576317e1 167 | 7d865d0774f34972814c9aa90ee14e 168 | e2cf4a7357cae6ed2dd04fa3e4c2a53f 169 | f5e4f9657ecc18efc862eec8232fff1e 170 | 6fe6b24009d0ac4f19b647a92023d001 171 | 4b00859dc8ce46eff4fb4dee5181bee 172 | d25262c74c8269a04c80535a28040aea 173 | 1ac6a3d5c76c8b96edccc47bf0dcf5d3 174 | bd51deddfdcae18b3b8dea4a358cbf0d 175 | 241f99f97083f685beedb4c8fd29e2d1 176 | b65f1141e4eb2529100a6411eafa7455 177 | c3f92e6a78ad156863b2acb037dfbcde 178 | 5b50871735c5cce2d2b12aa6a0f050b3 179 | da39ee814b8e3c0387d7792ff13e9cd8 180 | 80593a84e45e4345f51f77a6d7299806 181 | 88f9fa58ee9ce3de1c863a93a9948fe0 182 | 1c79aa69e4ec26b65dc236dd32108e81 183 | f56c78ba29d9f73e9bc72297235ac73c 184 | f5c6c9a4c5787dae19fb4103277a6b93 185 | adf284153a2a87208c9b655484c84004 186 | 394563d19e157c126f2e3fcce6bbeeb5 187 | 91e169ea3ceb587beff42b9e13c388bc 188 | c33b2dc4fca8fd178cca710901c2e97b 189 | 56f65bffa385a635f4b6538438a0b930 190 | 9ebca72c02d26886a6e82f4002a10be2 191 | 486535f610428612cf078dc7b29022e6 192 | b2a585ba5f0b4a25e76bc197b3a3ffc0 193 | 739d41c59dc387e575f9747ff6fb5e8 194 | 98971eb747738a6880360680c1602c7d 195 | 50a3b398b3a2e5979ec4bb690ca24962 196 | 2eb289d5829907b9e6ad3e1a394e102 197 | 901872a92ecdfa4863b2acb037dfbcde 198 | a11caea04fcac4f5643a8f56e2ede6dc 199 | cf14c102e6da1a78e6d475a101a6dfca 200 | a393945aad7a2cad5067eac75a07f7 201 | a64965f10047f31db3ee3d0077feb1bd 202 | 43cae409bde302d4c88fd5e1f2929cbf 203 | 2aaf5fe631a855b4de9ff1d2442cc6d1 204 | cbf9773bfebd4321cb2a965e75be701c 205 | 9a87c9d904851205bfcc4c7214610fe3 206 | 6aae683396bc08eaa4b1640fdb2c85c0 207 | 62ec527e6093cd007a9af08d0375df56 208 | 444e7c5709eca2496f61afd58e50ae2 209 | ebf5b387f119c51cad5067eac75a07f7 210 | 605b2c687b73695c8da90b986150cc3b 211 | 5f0e28d1324397d9c0b027ae5b223d6 212 | d2cd3e3cb4ed6ee4e7fbee941d13bb9f 213 | 205b404cdee5d81cc624b11e153a6d87 214 | de80be770d51dbf53567b82c74e275b4 215 | 397ac4bbb11796902d92929fa159facf 216 | 567779d7087c75eead5067eac75a07f7 217 | f1f14399ac9684df835bac7bf872f771 218 | da52e5b3a29c06b1eb8ae9cf8e3a676c 219 | 1acf34aa0cb8f06a19fb4103277a6b93 220 | ee50d76492226837926fe0a4cdbf03 221 | 5a86b8c93baf8ad0a9030dd33d75b731 222 | 46a1e2560a1e96f3897fc31a9c059e16 223 | 972e0e5717676e47d201085e80edb26a 224 | b2ab0b13c344132ec569803a3242d4b9 225 | 57678bef578b487a738e43095496b061 226 | aab92a965e310885d2b12aa6a0f050b3 227 | 433253d0d97f814025444614eab3fc33 228 | 88134efda194f8f422f9a913dd25c68a 229 | f13e44c93bca57d092f4c88fd91c6b1b 230 | d7d6a7fae6003dd6f4fb4dee5181bee 231 | a5669fc418b91f9959cbde03ded257fd 232 | feb6a23a5e25abe459af9a18ecf57ec3 233 | 691480901ee9f047ad5067eac75a07f7 234 | 77c2f1b7a7c0a4d15ca1f314f1afc186 235 | 63a218005fa1bee7fd313061a14ce51c 236 | 4e1acb893cafc1ea29c39f613cc72411 237 | d5fd97ad2620480c62cdb4b7b7821421 238 | f2a3ac936fcabeb8d1ccbd5d84e5bc86 239 | e6b0ac08a5326f23faf575cbae5008b8 240 | 39d8fdb56b0e160dbcceec49967c0de7 241 | fa4d4e697d21ec65512d71be7dbf2d60 242 | 9d47deb11cac29f089345002d2594e4c 243 | 1b80cd42474a990ccd8655d05e2f9e02 244 | 2c75963e304f490223ed665630afd1ce 245 | ea96a04c68b969c5c35f34f09f11667 246 | 38c4c2ddbdb502e162701a18243b45d3 247 | 16549eea10c75d0f65d3152da5208307 248 | bcb4f576747e10bdd7f6e86d7d335698 249 | 7acc1a370dfcd3a85ff6fe84f53e00a5 250 | 758b78e2ad5dfdd1edecfa50e41e5c9b 251 | c02649dad5a5946dfcb04979ea30d7e8 252 | 3bc45b4fea81c02463b2acb037dfbcde 253 | 8417c3b75ce474d217b431cae0dd70ed 254 | 52867aee1e2e137912a905e721b748f5 255 | d673c7ec4a08aa6db6f5e7b313e4eaae 256 | e5b1626359c609a59d297e74104d3ac3 257 | 7f4f6fc801f4f957263e68b45fad1e64 258 | 6b9b014c54423664a9bf865a81345d8e 259 | 7e8caf5bf2eb1a61ecaa3c66b0328b42 260 | c0976144b3ec94381076bdfcbbc20a9d 261 | 294613465801739b4739fd13bce14311 262 | 3d92cb6fe0abdf9c4ab121f03cb11a77 263 | 459cad806518f195ba6d436b28fcddfb 264 | f70fe48c38bda53282c132e825d0d08f 265 | 8f52743c3cb564f149e6f7df978f3373 266 | 1be0e167a93a1069acb4ead41419080a 267 | 7a2ad24394c5d139d46c340938e2ff1c 268 | d87bd42b60591573c83f7280476c6eef 269 | 522f8c069a76c21fad5067eac75a07f7 270 | d26818a4e62d931d2056b4bd5d870b47 271 | 84d3224312b9630465826cf0dd1f6a6c 272 | 327dcb9a47911686815bd25a546c8489 273 | cae6c2b329bbc12de5d5fc930770c792 274 | 514ba7cb3392ca5ad5067eac75a07f7 275 | 3fbbb64cce9b5fb681faebbdea6bd9be 276 | 1422f82a72e0b7f48ae1c1abea367249 277 | bdce8b3475f59d38f4fb4dee5181bee 278 | 6233b6cce0da0615d4cfbd0aef5a371 279 | ade8119d5a30ba4bf1547b1668422ce3 280 | 94df387a0b97302ad201085e80edb26a 281 | c293f2fbc66af3dbf4fb4dee5181bee 282 | 870562aca7165d703c78f7fe78269073 283 | a58e45ec5204f09559cbde03ded257fd 284 | 52e921d1e558e6cda19b1c45fadaeb5f 285 | ff8f8d280de66226d2b12aa6a0f050b3 286 | 4504e203b67dd8e473f10e6caaeca56 287 | af264c02f69566cdf4fb4dee5181bee 288 | 381317c1e4c91e87855931d119219022 289 | cb30a5a8df3007f6f4fb4dee5181bee 290 | 2a9ad7f4e7ab564a5be2d177e843be47 291 | 411f68beb7d27135d1dcc55e36186e4e 292 | a12abb06ee3aa30ae074517a246f1e65 293 | 77323ba74273cfe017b431cae0dd70ed 294 | 248e0773a2a8d90879ba0a8466ed4e3b 295 | ec3b32347c823f258c2b40655482a651 296 | fcfc935c2ff7c66c858699aaad4acee4 297 | df31fdbbf7e3616b774561c9c1990536 298 | f5557538f4c6d755d295b24579cf55b8 299 | 919f90e92283eff8febad4f49b26ec52 300 | 44c720c5edf8942798cfd47a860803c5 301 | 978e21e3ac24a83c17b431cae0dd70ed 302 | 41fe326e3decebd1b40f0ac0fb9a650d 303 | 1da4abf560002490391b7a189305050 304 | 162550a8510464d97881b8f7aa99120f 305 | 7c1cf879c84904a4e82028a475156419 306 | 5f9d3dae06acf0e4e93e1127627b834 307 | c6885d073919e897de9de6d8a1c444be 308 | 40279f85fc80e16edccc47bf0dcf5d3 309 | 7f218ef91e835a90b515d1675be6b5d3 310 | 5cbed790bc24fa22056b4bd5d870b47 311 | b1ac6f2ba106e8ec2250bf58700b4d8f 312 | 88a00b80d432ed5a577e7964e0284adb 313 | fd359f64dda4e753870f22c94729669b 314 | 3e4f4c54420bdcae75becd8a4c3f1866 315 | 9d68ef4ac84c552819fb4103277a6b93 316 | 97d009dc14e25080d83393768c99f441 317 | 6152fd8b7b5b10df436455e65b78c0e3 318 | 831955faf1c5eceb433fb7e44afbc69d 319 | 818879b4a23c12bf575f9747ff6fb5e8 320 | f1fe8c6c1f9f28321739c3c7bfb786a5 321 | 303c1519c700d19299e8bf807e902261 322 | 36d1f0331d7f4ad2cf695c8970a97c29 323 | ea518b89b8511916ac51268fdb437a9e 324 | 8ea569854b8dfc8022b74f7ed4070ae0 325 | 9ad5cab6ff1e45fd48113d3612de043b 326 | dd1a375db7015e0ad6983f351200ac6a 327 | 7c40c1a2e4476afbaca9cc236210e91 328 | 367cc7ed7b83b7c8fff16555386d173d 329 | 4bc92bee14e81db06c262ba0bee45d20 330 | 8b8b59fc52257bea58e51facd8ce1a25 331 | 4eb3dc26aad9ace8f4fb4dee5181bee 332 | 9f5ae162a075ec741e85d47a2a5461b3 333 | 481885f3ffe14c40665f42dc26fed092 334 | f123b8da77f6d17e50f9fc0e2c94dd76 335 | 27267209ed320cd271cf429728b349ba 336 | 7c33a6f55768b7acb97ad864945165a1 337 | e0f7a559a6066203dacc0b57c47fa747 338 | 991803aca7fca258b40f0ac0fb9a650d 339 | 3b412429257bc1c34e437e844fb32a1e 340 | dd4d12077d16512d8ab9e8dd82b356fd 341 | b218e59af74f0be4ee9005feeed08b86 342 | 23c874e54f1f9f152d07d128adae16ff 343 | ab131feec69007a42250bf58700b4d8f 344 | 8c942a8e196a9371a782a4379556c7 345 | 93e43734f99c7ca6c42fa56863e48020 346 | d27d44b023a8ac1a54457eecf7344025 347 | 137fdd05ae4e69c7a68359455a0ffe24 348 | 6bc471eb8f212c9317b431cae0dd70ed 349 | 53f19d1ab0828e3fcd3af3995946ed40 350 | a064a3e9b537fd64818b16b10229b98 351 | 1f239e55de52bb63eefaf3e79e3e3454 352 | 3880be8744dc0ebaadab4c26397edfab 353 | ec79d41034e8deabf4fb4dee5181bee 354 | 87dfa3332d118867d0d69b51a45f7aff 355 | a557114149ae934819420b7669e7265 356 | 146934a1cb852afc1a1a2dbbd3d54d53 357 | 192684f9de3adfe827ee88e8274f281e 358 | 4e4b38efc9345bc3cc543a6b1ba2fd1d 359 | 2af98dcf936576b155f28299c0ff52b7 360 | b54d0fbc33d125bb7a6d149f6c9151a9 361 | 360d9cc763aa370320768660cf080d12 362 | ca0a5a3a4c5e255b20768660cf080d12 363 | b1117a83ebf5a4c9c337a931444a5063 364 | -------------------------------------------------------------------------------- /data/filelists/02933112_test.lst: -------------------------------------------------------------------------------- 1 | 115e4c9a9150fe8e99dd23ec22c4943b 2 | 480a381b676003df4da5feafe6f1c8fc 3 | 6b7123a3631583c612de5317fe5b354f 4 | 63397b0df482d51ad7838dc22b16368e 5 | 92aa3075799e275a3fe047712e43e185 6 | 1a51237c9515ad0a4da5feafe6f1c8fc 7 | 298dcf7bd982cf0712de5317fe5b354f 8 | 4b80db7aaf0dff0c4da5feafe6f1c8fc 9 | 8c1cd3c09ffef7efc59350d819542ec7 10 | 140ec01582235e15c59350d819542ec7 11 | 70ef5ad531624a24cb87a43f8f346ada 12 | 59263293983a99d3de650492e45fb14f 13 | 26dcf7a76c89d5aa4da5feafe6f1c8fc 14 | 68bc79caeaf162a7ce5d6e9371bb5c33 15 | 45553c754e1132533fe047712e43e185 16 | dfe503e6a4a86d4dc59350d819542ec7 17 | 131992dab1550a7aec24cae3e129c189 18 | 7b98e7b25bb83413c59350d819542ec7 19 | a9bfa9259f31ef9fde650492e45fb14f 20 | 6f679ca92bfaca984da5feafe6f1c8fc 21 | 6a910ffe32ae2e575588a2543ef0b0b4 22 | c060caaa105890d74da5feafe6f1c8fc 23 | 24c781a3aa6310a44da5feafe6f1c8fc 24 | cc9194f94951cd934da5feafe6f1c8fc 25 | 39db396f57ec698cc59350d819542ec7 26 | 3c2a50e5907b0fb64da5feafe6f1c8fc 27 | 221d442d733de66144221bef0fa3c36b 28 | 5ff7e1be775072e5824662341ce2b233 29 | 24da7fd5e33513814da5feafe6f1c8fc 30 | 886031ff2a514f86c59350d819542ec7 31 | 3649b02bd61a337321730ef9c9d28bd1 32 | 31a7cd3b7990834cde650492e45fb14f 33 | 7d95374a9110157c7d8c689e1315827b 34 | 60ac3a02f8c1116b5588a2543ef0b0b4 35 | 4cee2825142a64acde650492e45fb14f 36 | 467b66a6ed7b3cd24da5feafe6f1c8fc 37 | 190cb7264781df604da5feafe6f1c8fc 38 | 4c99fa08135a52d04c62bee40dcdc539 39 | f3bc5eb543bd852bb7ea82317702e856 40 | 3b98711b877ae402824662341ce2b233 41 | 2a3a3bf0878f1fa4c59350d819542ec7 42 | bb741a003e5ff46c59350d819542ec7 43 | 2817480c23e4a106c59350d819542ec7 44 | 13aeab12a8ccdb244da5feafe6f1c8fc 45 | 48ad79b48a76fcec4da5feafe6f1c8fc 46 | 180154895560cd0cc59350d819542ec7 47 | aae9df5536cce166d5532c7891a349ad 48 | 5feaee9848b44d44824662341ce2b233 49 | 1ec5e12f2b5684a24da5feafe6f1c8fc 50 | 2bdedc5d70cda02cc59350d819542ec7 51 | 2cf4888579296377c59350d819542ec7 52 | 15de6a77af2b4fccc59350d819542ec7 53 | 45c91d543ef3c1a829a50a2b3c5e5b6 54 | bceca165030250f94da5feafe6f1c8fc 55 | 30675877e822626e3fe047712e43e185 56 | c55eef8d5b4d3db563b3c67777442463 57 | d3257b1df741d9a099c549327bba1953 58 | 8a7f0dd58fbf14a4c59350d819542ec7 59 | 68f25e77ac6bdea7de650492e45fb14f 60 | da5d7b5dfa92abdace5d6e9371bb5c33 61 | 23b7a3961eda17df4da5feafe6f1c8fc 62 | 233612a657bbda534da5feafe6f1c8fc 63 | 26a2132b719d226a86d53ab0fe94e911 64 | 19dd35ef180808c38f1735145fdf5c5c 65 | 6f03b6ab474c04a243e5ff23b077c03a 66 | 973023bbf9c6a603c59350d819542ec7 67 | a95f93b9da094471c59350d819542ec7 68 | 7fbd264b7031c399d37a1bae74ee50a2 69 | 1e40a4dfbd78455812de5317fe5b354f 70 | 721c788bb55b083ae8a9bc001231a118 71 | d8cd6611c5f407cdbe81a9109a782712 72 | b572114b0944ac203fe047712e43e185 73 | 83bb0c92d3ede1e8c59350d819542ec7 74 | 67616bd629dbf7b3824662341ce2b233 75 | 1cd80ed7f3ab7a5d4da5feafe6f1c8fc 76 | bc7973150ac25b1ce08dea88cca8641e 77 | 1f336c9e48f1b54686d53ab0fe94e911 78 | 47344f869d6c12e486d53ab0fe94e911 79 | 11ee3844cf96c7194da5feafe6f1c8fc 80 | 5b112266c93a711b824662341ce2b233 81 | d3ff3bd1badb62c2c59350d819542ec7 82 | 2c6aee97b0325e92de650492e45fb14f 83 | 3a2afbdc240a7f073fe047712e43e185 84 | 1d61ca99924b13fc99dd23ec22c4943b 85 | 90dd9ad1a74e25d53fe047712e43e185 86 | d7fe270a81b0f21c3fe047712e43e185 87 | 6f56fdbf225247abcd8f3fe9ca2145e1 88 | 29ce2b045bc6111912de5317fe5b354f 89 | 88982fc3cdf5d2b212de5317fe5b354f 90 | 54ea003ba0d36f34da5feafe6f1c8fc 91 | 1252e89db37d786386d53ab0fe94e911 92 | 139aeafbfbdd6bb64da5feafe6f1c8fc 93 | bdb118e2b6c9f4d712de5317fe5b354f 94 | 1715965e2e1e33e1c59350d819542ec7 95 | 6d448fdac1dc71f9c59350d819542ec7 96 | 1c898677c5b4291c847857e42f50ec6e 97 | 3167991b1c87967ac59350d819542ec7 98 | 36bfa6f0a5897be786d53ab0fe94e911 99 | 1c4e2879669e949e3fe047712e43e185 100 | 3eddbe968ac08030c59350d819542ec7 101 | 1971024c0cac65a824662341ce2b233 102 | 7359539c1b62cf1e29a50a2b3c5e5b6 103 | ea48a2a501942eedde650492e45fb14f 104 | 14dff09acf069b63c59350d819542ec7 105 | 902a342783278a9d824662341ce2b233 106 | 228a83ea767bcab94da5feafe6f1c8fc 107 | d6242003931d0a27824662341ce2b233 108 | 3cdabe258ed67a144da5feafe6f1c8fc 109 | d4a7b45abac7a39c59350d819542ec7 110 | fc5b7d19b1ab1e8bd0504a433b7a549 111 | 5a2de91981d27ba3c59350d819542ec7 112 | 40d4200a071b555c5588a2543ef0b0b4 113 | 4205bc230382f663c59350d819542ec7 114 | 1a9fa73ca819aa994da5feafe6f1c8fc 115 | 203ef2b06c3ad6033fe047712e43e185 116 | 1d973f05e870af4b4da5feafe6f1c8fc 117 | 4298f678b53d370dc59350d819542ec7 118 | 5b08e72cfe785f4912de5317fe5b354f 119 | 21f3c0d4604587b4da5feafe6f1c8fc 120 | 29c6f3ce118576724da5feafe6f1c8fc 121 | a234f5b48a26fe1d12de5317fe5b354f 122 | 285864fbee3a4038178e7d331e641179 123 | fdf32559c6b7a6643fe047712e43e185 124 | 2ba392a70c40dac7c59350d819542ec7 125 | 85ddbd698b3e7dfec59350d819542ec7 126 | 1676f8b995b976e5824662341ce2b233 127 | 1a1b62a38b2584874c62bee40dcdc539 128 | 55bfa46d7b39f4dcc59350d819542ec7 129 | 2e4184763139ff274da5feafe6f1c8fc 130 | 3d2870c83ad35dfe86d53ab0fe94e911 131 | 12cb11dbb135ca9ac59350d819542ec7 132 | 1b212b67e5eb90f4da5feafe6f1c8fc 133 | 4fd61ff0aa949a4486d53ab0fe94e911 134 | b0f329dc43af0fbd4da5feafe6f1c8fc 135 | 5294d0d31a33e67912de5317fe5b354f 136 | b7be75d3cb83457a44221bef0fa3c36b 137 | 4946c14a466fb5094da5feafe6f1c8fc 138 | 6e2beb63c61144f54da5feafe6f1c8fc 139 | b6c1fd850c5b042c738e43095496b061 140 | 5aee956ff28e337a44221bef0fa3c36b 141 | 134055516ed892913ba1c51b82b58419 142 | 23e3c2a2f61ddb2986d53ab0fe94e911 143 | 6e75ca2b08fe53a344221bef0fa3c36b 144 | 455a583e41579db14da5feafe6f1c8fc 145 | 1aa76e87d7bcf5c0c59350d819542ec7 146 | 6a121783609b4a18824662341ce2b233 147 | 29b2a25804651a34c59350d819542ec7 148 | 47f477a8b67d28028f1735145fdf5c5c 149 | 16bc9f5821d887f2d7838dc22b16368e 150 | a03797c4034be11ac59350d819542ec7 151 | 9d0a9c46bb6768fbd37a1bae74ee50a2 152 | 2bda2392d5715d16c59350d819542ec7 153 | 2b6bd6e0b3c2565839d3717288022c20 154 | 99ff3359d64f1f45ce5d6e9371bb5c33 155 | 90ccd5fbb48ba3bdde650492e45fb14f 156 | 19e444da148930154692707833167ca3 157 | 3115a3a0a61aacac59350d819542ec7 158 | 8cf41a94663c7fe24da5feafe6f1c8fc 159 | 1a4ff09890565843c59350d819542ec7 160 | f6d2550b82c208b012de5317fe5b354f 161 | 8415b7cd04f981d94692707833167ca3 162 | 839393d59ef6c8cfc59350d819542ec7 163 | c2ac91973d449b18738e43095496b061 164 | 3076e5d4a8078a0c59350d819542ec7 165 | 1ff28690a2ba31e4da5feafe6f1c8fc 166 | 8382308b895aa93286d53ab0fe94e911 167 | f939cc4fa30511963fe047712e43e185 168 | 2036aaa68d164c373fe047712e43e185 169 | 5f7e3d694d47fe6cde650492e45fb14f 170 | 56031b004d5306954da5feafe6f1c8fc 171 | 1e25501b8930873129a50a2b3c5e5b6 172 | 7aca460dbd4ef77712de5317fe5b354f 173 | 8dc8d2e0bdf870ec95d0ca3fdb30532a 174 | 30cf0cedd661880e86d53ab0fe94e911 175 | 21224eab2d099f5012de5317fe5b354f 176 | 15d3297d200f8979c59350d819542ec7 177 | 721bd0402e92e339c59350d819542ec7 178 | 70b15dbfed77ad2d4da5feafe6f1c8fc 179 | 9166a54bcb06b6c7c59350d819542ec7 180 | 779cda069c3b6338824662341ce2b233 181 | 98d963a9f353cd026b0f9e3b3feb2454 182 | 583c242abdc4c08e4da5feafe6f1c8fc 183 | 951377627e2fb20f86d53ab0fe94e911 184 | 147e9d3591cb190829a50a2b3c5e5b6 185 | 1fd36ae1d93b6f3fc59350d819542ec7 186 | c0d58499d2cecf07e1c245f9728d365 187 | 146c3a9cbe3d8f703fe047712e43e185 188 | 23aeb8fdc0d1ed4c4da5feafe6f1c8fc 189 | 6a49166d5852d23044221bef0fa3c36b 190 | bd55f9190cb5c9ea3fe047712e43e185 191 | 316bd800a04f14f0de650492e45fb14f 192 | 19492e2263ea82e4da5feafe6f1c8fc 193 | 20d00eeac9377d1212de5317fe5b354f 194 | 595999124367c701de650492e45fb14f 195 | 2b3f95e3a1ae1e3f824662341ce2b233 196 | 14864858c05f52ec4da5feafe6f1c8fc 197 | a247a4978888e6403fe047712e43e185 198 | 1566915c8a69d58812de5317fe5b354f 199 | 48b9fbf28fd33df5c59350d819542ec7 200 | b0f01584cbb37d2ff546596ce7364503 201 | 4068c751d46ca222de650492e45fb14f 202 | d0421fb0b59291df7eee615e75bc3b77 203 | a08aa6e386cd983c59350d819542ec7 204 | 3cfebf4fdfa1384da5feafe6f1c8fc 205 | 4e62d6e735b8bf2b90071898148dca0e 206 | 68aa1ed740374787de650492e45fb14f 207 | 3c28e4a1a5154ecc59350d819542ec7 208 | c817934380830ccb4da5feafe6f1c8fc 209 | 12b0773858754105c59350d819542ec7 210 | cc843a4c31c60dec64cb4ed80bd76aed 211 | 6fcae7f06d9f86b2ce5d6e9371bb5c33 212 | 74c058f9f24fbb524692707833167ca3 213 | de23f702d6e8232f12de5317fe5b354f 214 | 114b810af4a847ca99dd23ec22c4943b 215 | 7eca681f6174f1ce12de5317fe5b354f 216 | 720ee748eb25f010c59350d819542ec7 217 | 7d9b7a4412d9f373c59350d819542ec7 218 | c8631f63ec5899a4a84a884e8267301c 219 | 57dc5950f0a7304d4da5feafe6f1c8fc 220 | 1a4d4980bbe2dcf24da5feafe6f1c8fc 221 | b592fe51cdda66394692707833167ca3 222 | 4c94892ca2cd066e29a50a2b3c5e5b6 223 | 4db0db06f86fe48f4da5feafe6f1c8fc 224 | 403661cbfc8deb029a50a2b3c5e5b6 225 | 9b34b5983bd64409e08dea88cca8641e 226 | 1e694a1848b810ebc59350d819542ec7 227 | 2cd6ee7e592939a9824662341ce2b233 228 | 297684bcd05347cd86d53ab0fe94e911 229 | e619cf6aa221424cf80ff10f4838c137 230 | c4d17b681e7f3d8a1e1f137e13140387 231 | 14a093126f5764bcf2792e4b1535c6c3 232 | 8f39d603e733eb58fcbe4e14ff0c4707 233 | 5523a90c230a1d0699bf8547ee35d38a 234 | 643191e8ee56104e424f8f8e828c9ab9 235 | 9dfac0132596ff09b13b0af4c7a59aa0 236 | 11b8fd945de0ee99642f6fb37a230b5e 237 | 6543e0c78675e6eb868fb986bc092533 238 | 181cfc93cd44af805a0e5699b3040a35 239 | d7762b2997bb9e2aa70a592d6c8c9234 240 | 809d5384f84d55273a11565e5be9cf53 241 | 79a8b5fdd40e1b1d20768660cf080d12 242 | 5366e82cfca7382729f1ce9399524695 243 | a5d193fd45690070b93ba26740e73067 244 | fc3bb2eda6e061e9b50d0c6a0c254040 245 | 875437f9f2bfdc3feadc9f074ecd1df1 246 | ebc49b9b624dfb55f9913e822d5318 247 | eea67da61b5477c7d4c6910fb477cd67 248 | 422975f531854eeaf36ea1eb6542fe7e 249 | b28d1c49cfe93a3f79368d1198f406e7 250 | 3bc232700d2ed20b89a68decc32d3e34 251 | dd6ebb99b2346757da8c66dd9a203cf0 252 | eb2843ff62280f5320768660cf080d12 253 | 5ff47fe4724d0c9320768660cf080d12 254 | 84a374fd72bab291ccff75c3d7aff973 255 | 895de6b9d3e0f1ad11b65536c08c170d 256 | bd7cae3c39773a4ed0a0c43e4971be14 257 | 3e080e2b2556add4eabad247a05ad956 258 | c6e91d50e1bb3351a8851b4eb6161973 259 | 9b33a5363695ebc3391e4d6c585a697a 260 | 3b5d7b7fb89b178d50711e66b0db6ed 261 | df0f03ac21921f02c868162258053ece 262 | 1055dc4f3f2079f7e6c5cd45aa112726 263 | 353dd8c418146de16c7d1f675f2a04a5 264 | b06b351b939e279bc5ff6d1af2135fc9 265 | 5e61fc6946ed74c3532e8683617554c4 266 | c18a4772bcfbb98e85bc264270ae0601 267 | 50c7e5dace1d5dffc6256085755e32ef 268 | 906d1dc1a8e519868cb5d9909aeb1309 269 | fe8c34a5275804d451f8aaa850306632 270 | ab072b1506cbfd921b7554913e3d38e6 271 | 2544d05396cf1c91bc19762eaa7ba40f 272 | 95ca7e79cf9b51cbb9a0f5d18f1ce54c 273 | 544fbd4d4c1d445498a4820926b2a786 274 | c89a5482bb756c041d86c17c15247b0 275 | f0ebc33311b55d6b4e7d60def15dcb8b 276 | fe5f6a2aab0091438860c69ebde1e4b8 277 | 727a4dbadbb74c33bf1b16662b6673df 278 | eaf341c056c79bec1a2c782fdbf60db6 279 | aa0280a7d959a18930bbd4cddd04c77b 280 | 6e6801ca4a03a1adc672720c52b0e374 281 | f07668a627a039b87b79156a61ad4c01 282 | 46bb63196198ffa2fc98aa4b97627df6 283 | 6336b5516cc8bd50635469b95109803c 284 | 367044e655cdce1f109be8beeb87a681 285 | a631a1a99b21cd92b87eaf81a9afbbe 286 | 5382680280ef5b57d0b36851d61b6fca 287 | e72235ca5b0f9b5de485c93908cf58c1 288 | 4b2e20535d3ecd016b7154919b02cbec 289 | 6bf0f5e06cb748bb9671c58246946ed6 290 | 91ac5c074c7d137762646c8cd54d58b4 291 | dca4c8bdab8bdfe739e1d6694e046e01 292 | a3a6f9e80956ec6f4035f93ab9531db 293 | 8f7a277ae05da76c1bb088904f7cb154 294 | 9f17f45a28d063e7391e4d6c585a697a 295 | 39b51f3a6e8447c3c8a1a154de62786 296 | 4e217d2ef816a08251c4deb11af7079e 297 | 641e64902bb9f6a4aaca4b071fcc002c 298 | a7e9a54cfae053aa20768660cf080d12 299 | e18f47b52ff3aa2452174f43a416bc6f 300 | b12fd3c4e5912a7dd8b510632cc84b8c 301 | 92a1e771eb621c14c2a5a06bb7a05e87 302 | 9eada38b3a65963e30bbd4cddd04c77b 303 | ad86354fb5faf1c98a4820926b2a786 304 | 1f0b5514d93f39ebd189eb81471216ad 305 | 3931068c10d0a606ef37b256c10c21e4 306 | 9fbb34244e00b2a9eacb155f400b9076 307 | 3b3a1bfd87c87a184b499a9d711de5a7 308 | e0393e80702d9a698cbb8bac2032149c 309 | 10c484963692d3c87d40405e5ee68b4f 310 | e5bd1675d43422bb61706e18472540d6 311 | e0f6e225c7f88db19ea59510032cbc74 312 | 38def13ea098f098fb266533561ee98a 313 | a49eec529b5c44eaac00fd1150223027 314 | 941289c22ad19099a87002a4eeaf610 315 | 634fe05a380adac585430ccbd2632877 316 | -------------------------------------------------------------------------------- /data/filelists/03211117_test.lst: -------------------------------------------------------------------------------- 1 | b9cc669597085c028766390809048ebc 2 | 534d3c5dca2d44641af9a5a7008cc3ec 3 | d32688a505930c96e2c8e43c97ec5a85 4 | d10dcdae2d7645ebcfe78be5b7b99c8d 5 | a4dd6c69ac130db6795284068bb430b2 6 | a71826a92bedd8e1f3c3e7bb31acc31a 7 | ffc9068c8de1fe46d9869786ff7f6a46 8 | a87214036fbca69e84a172a28c2dc 9 | e5b50925213ade6a340d4ac30c6d322a 10 | 63d4e03c4effa06d6845a0762dd07baf 11 | dd8cebcb4d0564059352b002a7d38daa 12 | b05a54988fb28d20d0b341c1c5648015 13 | 2c4f9415edb358adb71a0e5ffd778fe 14 | 195d9d0305fd1625679efbdc830f6d0e 15 | f8c22e6011567f655dee408cc1ce3ebd 16 | f2b3efb28b5f5d56fb4038701c4e8e29 17 | 8440ff1637f2c6d7ebe17c8dfb911d2c 18 | 3529cd0cb733596bc22a9d71e5721aa6 19 | 459ea1db4ad52f3d7b7c888d3626712b 20 | f124d85da3ef5ee5fb51920a0179fa71 21 | 3ee0923254671a1ef2bc9da1ba799c60 22 | 676e65417cd3d59f3aabc01aa1c5608b 23 | aa99cc4323af7144e7321f25048c6142 24 | 31ea284fd46d2d6013d823b13369c182 25 | e6304d3bec856684d9c9f98900faca52 26 | f3004c5b38bbc0e445804144dab4dd66 27 | 887fdc9a9940ea57bd59d5b2d356dfd7 28 | 1c47397db49047b9d35d1c787a8f626e 29 | 415b39d4f60a36d742274cb89cb6c841 30 | ec190042ef2f7aaef925cd3fbd303c2c 31 | b569ba9d9d74e7d5184dd44a99578080 32 | 58837198e067db4cde008fce66fdc56a 33 | 15e7231a97ccf7953aeb14563b37e04a 34 | b47b05891c5161189722ef9ae1c74e1 35 | 5305858e5ce441d65fabfc69ee61b28b 36 | 3cb53b32b97c0a04c04cf0f68103eaea 37 | 1ec7d9fe07b94f6e274d4393e80e99fa 38 | 9740d1752c70a41350577cf04f3bf74a 39 | 441c5d2f78e1100558ecbb7ebe658148 40 | e70f6a81158cfb213a762233fffc49ea 41 | 8a87846412b40900ab610b0c94236463 42 | e51c13070dcd4ce25432e3a73fd1f7a9 43 | ab2f9418c111cc6ddb965514105122a4 44 | 87d4b97120598dc54e6185a07ec22996 45 | ac81f325fbc993d3eb42617d0a1c53b 46 | 30fc571d408b84cd6315023d0bef39b6 47 | dec6a8c1c01e148d20685b5a7e34b501 48 | 73669f92851d3b28eb34db531a289b8e 49 | d3193b07bd166c0611e348ae03a757ef 50 | f675d7c91d540e6bb45df535caecae62 51 | 5880abd2815da0492fc6a8cbc82a5bb1 52 | 60bde4ebc37f9b31473f10e6caaeca56 53 | daae6d7f0e8d7e208a8be3c02effecce 54 | 3017481ad6a978393eb1d3da560687e9 55 | a9432163d01a99f1d38b9064784c4b38 56 | 4440935e5e566502250bf58700b4d8f 57 | 89f3262d8e06acfdeb0ce5843fe6b264 58 | 3d4079a37c8fb40e808951ff5fb582ac 59 | f5f5e872bf70f59983f551e0fd7d32ac 60 | 9972709345d24fd31ee6305032661052 61 | 6a743f7ae8deade97e0bbc356ce23758 62 | 35003dc3d74527729a1d432cc80562d9 63 | eab36391bd7fb745585e5281d7025178 64 | cc499148f0e031054b8def6cb3b321af 65 | d3f9fc10276d8922f7248d9dbed7a7b8 66 | a9a2ec15d1223290916cd984b3abbf4d 67 | 8c4cb4ea7cbd0ff5ad3833a4ccccd8ee 68 | 80976fe087ec183f3de42699b619b796 69 | 42fe49800a1e65d18a6b1cf8170af1b3 70 | d59cbf752abeeb17f1a5dd559b550d68 71 | 8a4cbeb489904fe3083b551ec2a5aa3 72 | f4097db6ad343f90d551435517f7f18d 73 | 3cbe9bb95e5004eb342398ca9dc32672 74 | d0959256c79f60872a9c9a7e9520eea 75 | 95df08344f4737e078785e24320d5ee9 76 | df81df82811b2b2fe2d8a7cb76d59615 77 | 59580147939bcb7e8b296db8a8f00728 78 | fc314f1e3325a47af287ec53a469521 79 | 76d351e5df26f91fb895bc5ff828fca 80 | 286a7629b62426b5427c20e7fc0367ac 81 | 52a7f3e36d09848ca63c1bd05197cc 82 | 66a50da0551d36c9f13ece01395d269b 83 | dfbce5e6cca00c1448627a76b6268107 84 | 8ce9fa1075039c8c63f4b01b3d592bed 85 | 2979d8814a450f884b8894e5e467986b 86 | 6e4c06e5dc03291bec77bb7db6eae005 87 | a56c13025ec97af31ac04cb85e251041 88 | 184a3f58220427c39fd28cfa9e6e405f 89 | 9db1c375f76c8ac1db01c957364e77d0 90 | 9716c06d43de24387103ae93fdb3bd5f 91 | 233a7970efc2594b26735a5c7bb362c0 92 | 6a1e4ab7debcb3f429426a0f57e4d15e 93 | 9ff60c2ab8d5a15abad8372756ee3232 94 | 73c5898bf63748ff110eeb6ed2bcbbc 95 | 5ebad73554fd866830bcd442adebae0f 96 | 2971f417b08961475a4cd9b26f359d36 97 | 56dee4eb44b2f0e64a6b6d001599a1e5 98 | 40c53f54e7fb0e3ff4c409c17e0a5165 99 | 24f34f582f9072eedc3e7f8ad872247f 100 | 2967a5504d5aef38bb3914fb474ebce4 101 | 74a99b32b562fcea7fa29a3ea424473 102 | 48b8290cb0dc0a6cc785f06f424b9d06 103 | 34d998b1845880795b1895ac674412c5 104 | 48c17189e6c58d619f4c3c326d704746 105 | d85f501bf76933c609d7d8d27dbba7f 106 | e46e45f94470b45ad1924b802935a37a 107 | af2f3c9c8fe90380c75516c7217fb218 108 | 3c7ff78e8036b217d3923426933f698d 109 | 58fceeffe91b7b1c20685b5a7e34b501 110 | e7b9c172059d23a6f12f3a2695789ca4 111 | e5dd90d78168e53741e88434245c899 112 | cf16012ae10b993bd15e5f70c1308761 113 | 2bbf7f77d43b74338a331b18e58c6914 114 | 77f4c991478ad1c26cd5a1d5c8bb85b9 115 | ebc62d2dac989b7d8b71a158ed504795 116 | d1b3804c23311181f361255e85d5896f 117 | d911b390503a11f96436916a86a90ed7 118 | 4f46683ad627700edb09a997c699dabd 119 | 6e3fafd33a4683d1fb0a4dd466ef3d66 120 | 722df1da5778d45b1e43523279c7f09f 121 | 1a92363c2a155ed3c397356311cbeea4 122 | 6f9ee2b839d3a03683fb187ab7c1f026 123 | 600bb2a17b238a927f7954f9ba534b6d 124 | 2fc578c8daf35023ef641b9022b66b97 125 | e5e5018fe96e414528d0f4c81cc1f1d8 126 | aba93b2b9b45a30dab0b172d4dea80cd 127 | 9d51ab35cca6288da8b55d3e40d96c08 128 | e09670b2d890f63d84e349450a5c51b2 129 | c62af9a75f8779b82b8499d50978754f 130 | be89d32290b9dd4aba27b59766aaedd9 131 | 96c87c372083e06e9ce9562d3c10079 132 | f2f41913123a7a7e4b87db09ac4cfa73 133 | 2e5b9f616a0805dc3704a45f4027ebcb 134 | a6ce00ec813199804e2b01a3e0fd3197 135 | 4736b46f6cb97d091e02c9947dc6e279 136 | 1d9f55b1651c5190a3f4a96ccd277d49 137 | 64fe6e4480939c5e9b485b25e7417c6f 138 | ea4b90cca359e2d38b9be827bf6fc77 139 | dfe2e7c66b4063f79a6b496c6e9f4c2 140 | 198eebeca7243399ca5ca7089655f058 141 | 4f598d41b30b28e84158c4db508f74e8 142 | 92e757e989dab6225ad009ac944c169e 143 | be2f04d1204c86d4db70fa8937c64733 144 | 74e3d29a7e0d5bc48ce0f31e09d08e16 145 | 76d87469c1fa3638577ed6878ebb1511 146 | f7effbc133537f0aa5d0c95600bf54cb 147 | fbec33bb92e066ade1f2a1daf140ac9f 148 | 44f363137d006f3cf7fe2bde3ab894f 149 | afcacbd7078a3b4b70bb6bcb670ecdf5 150 | bba0cad6dbbef2589fb287620a60b403 151 | 2f07cae4c7809f0bcf5a37a70014c623 152 | 1dd8b03b590dc0ff9470c43f253f33ee 153 | 62188618e7d0b2f23dabafedd9562ca6 154 | 6f7bbbc83183a93daafac0c8d5992bd 155 | a52e505fb03e2d8568292529fb38e524 156 | 4116b08cd0e4e19ff799a4672edb216b 157 | a8e109c66a0fcce7a87d866b539e4b68 158 | 85240d0fdd8bc669ccf3727bc3da6c48 159 | e6bedde4571506491fde762a4c6848dd 160 | bca2b66a9ef701bf585db0bff5175f74 161 | 68206e7d85afe3619d8d0b45bd2b5b8d 162 | 15896858de30017d8e75bb5638d14ce9 163 | 14add565ff90153855f9913e822d5318 164 | a990477e9c1bcaf4a70518e25ed617a7 165 | 6afc906811e9b40421d7ca6ede0e9373 166 | 5530382ad4ea8b364abfe5850a7ebd07 167 | e912fab93eb63fef6b4897a481d7d16a 168 | 8a7712d5c8614b97974e278a62ec98f 169 | 1a5494c28b607f699263b5578aef09fa 170 | ddd82fb23a12e2eb2c8bd51dc6fc05b 171 | db4de4095a962680c951cf8670bfff6 172 | 600fd2598fd5761eb9099be21c212692 173 | f4877a34163978f84efc7e7114f1b9c5 174 | 7940b411f730cb767ba0766d8bbd9a5c 175 | fe75bacab7594206ab0b172d4dea80cd 176 | 877cadd597775369ec059109909662d2 177 | 49ad86b608403b8ce760531185a75b14 178 | dcd4d3d6bbbabdc6376c487287ae2b71 179 | 90d97637c01fd05e59122da3e1ccb92c 180 | 30e739ed4c65f67ab71158027becbea8 181 | 751f46191d0baf99f541411dc07303c 182 | f47044b611046a7bf901627f525bf7a 183 | d4bffa0adec5f9a73387ebdfbbe050db 184 | faf54bcb640753a28c6daa755196a36 185 | 97870c19256a95acf5f79806bd65844f 186 | fb92cb1fa04c2ba6bf1c304f780914c6 187 | 792002ca0c65b1dfaf7869e0a5920f2a 188 | 26c4051b7dfbccf4afaac116abdd44e 189 | c2b4ffa6f1911d4cd1ecbd6620e3fd17 190 | 538eebd970e4870546ed33fa3575cd87 191 | 4302bce2d7e6594cab610b0c94236463 192 | 3ad5eaabf85f4b5cc4d320644a1ff105 193 | cc7bac4f85cbd7d68a04632e06812aec 194 | a568d8aaf2b587a2f27bd2175000097 195 | b8386207364e622d5e7087f2d9a278a9 196 | f464a98b2d4f598be8581b38259c3721 197 | 34f6cff3e8fb6315fc2aaecaba21de51 198 | 9536f9fd4795dc2d70ef2132a4b991a 199 | 815060a9c109ff4659de6f0155fa4014 200 | 777a8a1c887779f47ac59aba6f9a1449 201 | ede70dc992195dc272e55f1aa85cc5f 202 | 32be865d1baf7eb9ca4aaad7dc0e3a16 203 | 70dacf62da510868a5ff93a193b16554 204 | b86af5698f9a04a4d0d1157c0bfa4669 205 | c906b5644fe468a2b61fb7ca6803b7a5 206 | 9c23caf872048374ec8285b7fd906069 207 | 3351a012745f53a7d423fd71113e0f1d 208 | 246f0b722dff7f16fb7ec8bd3f8b241d 209 | 88be1603c4e07fed6418651cc29befff 210 | e2787b2f0dd35fccf42a90fe4baf4591 211 | 4ee8d3a617b574ee30582dab79e5c58d 212 | d9b7d9a4f7560f6ffa007087bf0a09 213 | 2190a888d3f7ba6bd3ffd38a8449bde8 214 | 5a440522b7df4cdf318d408ca5b702a3 215 | 813b3e438a8fcb189d9f3b4d1ec94c69 216 | 3ca0f34c03ddd760234c2f2e8f2fe6da 217 | 61645237bf8de4df77525a753bdd4f00 218 | b11d7ae45f5a84de8641d137e7c33076 219 | 2d0138ffe3eb25b9e23244d89a2e66d6 220 | -------------------------------------------------------------------------------- /data/filelists/03691459_test.lst: -------------------------------------------------------------------------------- 1 | 8c18ef2a9170a8144884161c20b458b0 2 | 7ba65164444ed5be3df08ed7d70af1ee 3 | 710014b815369e1c2bcea2cd4cc7b042 4 | 3e21834bd08c078963de47aaa413f122 5 | 767f4a63260c8419e279011f622f20b0 6 | bae089bd1855bcdcfa9922db9b6aab31 7 | 4b29063d6237b062eabe53d90550c4a6 8 | 2335c268bbd05a5f230584014222e685 9 | 2a6f78d39d66f6171bd445ab4c056b71 10 | 8b73786c112d262d4852385de47501f6 11 | 7e63f06b3c48fadfd6d49cce41472b6e 12 | b0f209faa41b8f0879da6431b0766445 13 | 2f4e9cc37c3bf5f1fdd84f4a160b8854 14 | 460d5cc9d09ec59eb34ed614d2670aca 15 | af7aded6c26d2b119d3f10ce46ef328c 16 | 1b31f250deb7e124fae32a4a57dfb78 17 | 3b3f46308f2ad119988b934ce1e16bb7 18 | 5f3436d8bb1620f4617146ea341ca085 19 | f6d4918c7dd190447f45370489ca3156 20 | 7578b2e27851b989a374ee921da07aaa 21 | 300d579cb4dea9338cbc76a30015552a 22 | 2034f891fe2d1e79bb51f8b36601764d 23 | f0d27525fa81798d982acd4b5c0a58b0 24 | aede81c0789358891ae45cdab702386a 25 | 8675e32f2e122ea5c13bcab6e4ecd7e4 26 | 17c472a6899c92efcf39ad4726172e1d 27 | ac951c58cd826af6a89585af9e32f3d7 28 | 35982cb980f6916c2633ff66beb9cf31 29 | 132257fddbebc02ff14235268cca03a3 30 | 1e82e94cf9f6bda8fe893ed5dfb6041d 31 | 1301670e3ddb72b099284d844aba7576 32 | 4793c0b78701e47dd529f6660fe10a17 33 | 33d9a210df86a437cb3c1170309e6b12 34 | 6be15f4f6dd64490d747b49524a1246e 35 | 85eb14c504232ad1bb36a678453013a7 36 | f0e562c21dfcaaa1d1936ff8c5fb2337 37 | 2aad0ff91e947e64baf402ca36cbac3b 38 | 57b8d08d37d835995d0dded52efeb4fd 39 | c462e3b75f570a3b42227a2ba4dff5ab 40 | 8dfa9921e51e0fa3f99860cd321d6c67 41 | 10e079ff34f99777bcb3fc1376c3a85d 42 | a1d1f232168607c81dd4da6e97c175c2 43 | 60575cff5db034c621e6f308016fab7 44 | 5da2a1ae6ec64155dc7dfac1f2c9f0d4 45 | cc88df1c3cfac12a99db62650613bd48 46 | 622a9789d1eaf6e3cf56355417e88d12 47 | 92039123d08d8ad6adbfb30d8d1b297e 48 | 4c43241d7b30eee379e6d136097a1329 49 | 76007907d4e0ae438c2ccb23eb70d81c 50 | 4383b2bbce729356a9c2f34ef56404ef 51 | 9a94af940a768aee5865ac92cffc2982 52 | 8c7c72599c6bbafc8323fc17a8352c3d 53 | 2c5dde3b43f0b0fc5afcf0aaed5d73d0 54 | 1445e30aa2d3212db6a78dbbcf2e408 55 | d7233f2190432638d747b49524a1246e 56 | 54e61267b88174967bc8772c5c1a0c19 57 | d14e6214d7dd4ed62d563c85edb49108 58 | 596f7a94c6d1443870896ebcdb67d8d7 59 | a6453864512f46dd747b49524a1246e 60 | 5c4964d7c42cf84bdd9ef3991bf7600e 61 | 84adc06696eea1774a2b8524bd5c98 62 | 3b01bd24d47245289159eab9ccaa73ce 63 | e1be0b02973011aa4c5341ee07f41676 64 | fa2cf860e277919a7445d25f394949d0 65 | ff9c1754252b9ebf73c7253ec9acd58b 66 | 2f7b5ea50c09d928b23f3e90fedcfa3 67 | 2325005b09d12b2585d624cfcd9a37a7 68 | 2240cfeefea8b69fb90623b288d5691f 69 | 496aea93dd8f7af1f3f18c4c348425c1 70 | 9b4d3ead5066a6c5844e9c5caa6d29c6 71 | 2daca96a8e202949c67b8955be358784 72 | fd11b075bb1df4b01f1c09aefb59ebea 73 | d09f0e2e33452a739d3f10ce46ef328c 74 | 716d1d38cc0bcdc8c9d5b08933b9e0c1 75 | 400fb89ed6cc3d2bf1acfa9a5200e941 76 | af39a67dea9ff78bf46f716b2b22b550 77 | 1742419bf5a54be3e1a894502fdbf97b 78 | 4d276aacd5e4c510de7da340cde8d034 79 | c8018ed73c5f4087eb927391bdd6c8e8 80 | 6ab218aba38bdada2268dda5c324173f 81 | cfdd69078d7752298b54295fac36ff1b 82 | fff40d102ca88fdb52648dc23b25b1d 83 | 5e6d30de53afebe2fb0a4dd466ef3d66 84 | fe977bebc78501995996c3a82deb78d6 85 | 86f45d4bb1f5f8597a040c8bcae232df 86 | 8629dacee484080c7ad11885dccb6f43 87 | 5584bebdc80ecb42c9d5b08933b9e0c1 88 | cf0da3cd69392999da2140846c49e200 89 | bb570a28a0e81a51d747b49524a1246e 90 | 93c5159d17de18f02899849b3f61c3c5 91 | 3636ebcd2e5568616bb15da9e307a14 92 | 6341662056860c3e225f3f0d46b4fca3 93 | 6ef86253eb81e4d418200338a176d705 94 | 48bf5d4693bb7ecfb4bf1edf2dd92af 95 | f6954ca2e4c2b03c67b2ae8c967fcba0 96 | 7a7193771ada6796a1b0d9ebe362f8f3 97 | ef71576ad5262c4ef398d0c5832df00e 98 | b859938280d0c7346583871b5c274818 99 | 913eb13149ceb59a75a3010d3ada28ba 100 | 68393fdf9730d1c86e95461e6c2993ce 101 | 4c5b7420078b23b098935bd14e27f0a5 102 | ea95cdbe8f4114107354c46aadb2b2fd 103 | 1334b56706bddaf4451f278fffaaebae 104 | d6f0a0ca6446eab0c0b5947ffe18a468 105 | 95c24657d2ac0469a3cd3bc808c81de5 106 | 54fadd7a6c5c04d752560296120d4cb 107 | b93169c2360aa02ea14443313213c384 108 | 1788d15f49a57570a0402637f097180 109 | 8df018bf733ff01cf00aae52edb0b7b 110 | b7285ba6fc6628a1a43ada367b02a4fb 111 | 42fe49780429d25d1de55fee5ac2c5c2 112 | 81b711a75b8781956faee4308b49b522 113 | 405db2cef5b41756fa16d3c3138134ae 114 | ed981b60651d5ad8265d1076b4b6c5c 115 | ecd9a96ebfd0caf6d8f9dd7647048a0c 116 | 8aea25f1090e419c9f78b1e1185445c4 117 | 3c467fca7449a857a2b4d33761839e86 118 | f37f4ef72fd0204d839a84b4ae4862d3 119 | 39ade62ad13e3c79206861ce7df4037f 120 | 90120bf8e84315de6873d49607c1f87 121 | 3cbeb01fae7fb6ec7238b5c2712646b7 122 | a288498f21acdedb2a65278501cfbe7 123 | 19a8736130ef822b93dcf5e22ecc3f5e 124 | 10d03876d94ec5f4e7670ea63e6cabfd 125 | c2024c0fa0906fc724abfaa350249967 126 | c3733b26c3fa23ce2633ff66beb9cf31 127 | 374df728f54322363b0edb55efd49670 128 | 7b7904e3d5ac33a65afb688fc9d0c0 129 | 945805d18c0de73ae3e30e20ce3a5bf5 130 | 71b4fb2d151a9d70fb0a4dd466ef3d66 131 | 6d28e2683df5f013c9d5b08933b9e0c1 132 | 60d58e77382f081a69d22ff82177f51b 133 | d233b0a03f171cef47e72126a394af4d 134 | 6592d33f84263ef435cd53a06b1d2317 135 | 16ea8ecabd3f373bdef52d9b75805a83 136 | 85e8d20d51ce13cc7fbc060fd555478 137 | 64aed24bbb7542c6afac285245c66df0 138 | 84cabb92bca7c3fdf2198539cbd3b69c 139 | 451f3d4fd10530b9d5a56ecdb5a1cd39 140 | 7263b5bed1c020d3fd8284eaee3b0fd 141 | fd421313164e2d7f1be6fffd725195b9 142 | 164bf28ed57e29a6293982b5acb5446c 143 | ac27fec4b0460b00318a4feb4ab5fd2b 144 | fb60dd3c36439d836d74ed7e4da4b6ec 145 | 6450e70e275a80e0e39b302b17f4c82d 146 | 1124d162420a75232633ff66beb9cf31 147 | 91f570ca6702fe4abd1cba733b111584 148 | fae47d104b9111aafd949ebbd292d47 149 | 1152c16d1081c32a561e8b31a1141890 150 | 7599541dac4a89ada1efd4f01acbedc 151 | a8f3e98220f34623b3d8c1107f6ae528 152 | c2bf199ce5a022a1126d510cb8dd3d9e 153 | 7e359607ecf460f399372ee1e6dff278 154 | 48c21ec6f9623c997ededbc2b9b4362a 155 | 440745e23b80c41f398d0c5832df00e 156 | 2a59accd6ff9b5265c38e15d823f1476 157 | fa09acded526a0105b1433436fd82800 158 | 7d2bd4d349ae34a2fcefa74f1d0bc6e6 159 | f289aadb7cdf59daa62fb160d742c45 160 | 9a017f96829a34a2b17f090763e2921e 161 | cb356bbfb74abea2c6573f6ede3fd543 162 | 560a626f93c664ff9069c2d361390698 163 | 99dce9c359b0bf4afb33d0031815b3e6 164 | 2b3e7da84b849a84d3dbdb797d2f78b5 165 | 40b492e1a0fb0860e2f05bd11e1d1c68 166 | 9076b1b9e23c7446d747b49524a1246e 167 | 3adf396785cf9dee7bbfac568080cdbc 168 | 60765697073cc44cec7e019402cb7bad 169 | bdfa20e11d204ecd35cd53a06b1d2317 170 | a3f14846404245d5bbbcb091dd094e5f 171 | 10d16ee9c9402e6df2e5d34c7b677bc4 172 | 21612bf3e866a8831d6b14cb827cdf85 173 | 3972d44065257859c0b45c582c6ed736 174 | ae4bcb4baca763c24521562865ab775e 175 | 2ab4f9bbdc17d9cd618e9d35559b7aa 176 | 970ada2dffb5ce49a663d9823c133130 177 | b04281aa2c134623cb3c1170309e6b12 178 | aed74c2fb80bf363f5776cc601097c0a 179 | 95db5c34357e2a81bbb94390080b5b78 180 | 15e847b20d22d56cd288bc0586930768 181 | 4e3669ef40de1b3b465b32805167c435 182 | 66baf7b7b4ce43d7e50f6aaad9a07bc 183 | b70c600b20614f4c690135fb845b8de1 184 | fb86950be1b0ced7760a6b24be218cf3 185 | b40b4cbf6309c3519fa340262d231abd 186 | 1ba39460a5e31c722a813544190dbe4a 187 | 8b7afc9b056307f3d3ba59ac5475adf4 188 | ca052c8db0c94fd345189af3887d3c51 189 | 5ea3d1068a624c1da91bbba4742a1643 190 | 72c5cab12c0ddb22a0fd8d18f37cdbfc 191 | f452418d7be7e78eeb752889d5199f9f 192 | 923b7f0a4bf93c4fb66814b45dc64bc9 193 | 3187862d922b0ce96583871b5c274818 194 | acbda0d16acd03329d4b859036b8707c 195 | a34c80e1f6175711c9d5b08933b9e0c1 196 | b521957294cbb170c7c1bdfb41b9d2d 197 | 2a8345bd5d50456d8db1a0ee98c45ee7 198 | c1ad8720fcc7246a1fb294203c64a4b3 199 | 2ae8239afdabc2baaf365ec12406f363 200 | 8bd1d73922ebc098627a66821130f814 201 | 8a3edcc398f34fe534b2581df0f941a1 202 | 3fc0513ac3bf11c873d25f4e2e3775f1 203 | 3a4950ac89429ff5b396c6d231dec74d 204 | 17c5950c89528703225f3f0d46b4fca3 205 | ffd168e54f722339ef94793a67b4c5c0 206 | dd3f884d9b5b3c0de7b7e97e5332a9cf 207 | a6216e99923da6988947789ccf4faf06 208 | afcd98e6a91b3d16569e2e0d2caa039 209 | da9c218b79205d489c4dd878242c44b7 210 | dcf84867f92cef75a9c2f34ef56404ef 211 | 28b91f5ca7e3d174fb0a4dd466ef3d66 212 | 6fcb50de7df5381835cd53a06b1d2317 213 | bb1b387c674fdc4750577cf04f3bf74a 214 | e750bda061e86402cf39ad4726172e1d 215 | 7fc23785c19991e4e180a1a604561d3b 216 | 64ba67a67d83811c2b688d771932c023 217 | 9fbb43c7437c1bb8a2ec0446d32ce69 218 | ff4bc6c329ec7bf8a0eebc16d3afb516 219 | fbb7610643dae4a34c5341ee07f41676 220 | 800a0a91308845b4519f3f3e6cd6d1a6 221 | aed97e60cd2802ce7ffb47acd56f396b 222 | 26363bb293e6c9e499db62650613bd48 223 | f000edc1cfdeda11bee0494534c13f8c 224 | fb4c855848345ecd3e738e11bd8803f8 225 | 37758713e7a31d1710b84d6f34c2f2e1 226 | afe96f3cf256cbac81a6b6721af23c58 227 | 5336a4698616726725a4212543dabaf9 228 | 8d55d634810b52f176f6deb1c78dfee8 229 | 40511e6769c91cbcd3dbdb797d2f78b5 230 | 105d0802d1ee0430bba5c9b6de65a038 231 | 79c3e029d9ffbccbe58eb6a4fe5a2344 232 | e71f2c0e0c760ae98139dd63d55edc44 233 | f663176a43096b35a43ada367b02a4fb 234 | 1c25b626dddfc36a28d267d044b54402 235 | 548f94cd0c5fba501148996e35417db6 236 | a82329a937432afe8d28f674ed08c521 237 | 542bc1ef866548c3d24fc75b2f944a91 238 | 80109bf3b6904d577edd21390c628646 239 | 431892f5456a2b9ab96497d8dce09d96 240 | b7a6e59fe546d81cdb2e05daba43d6f 241 | 5dd29010575d36ea73e1b2d018c0512 242 | f2e521a8d08e2a2f20363e2561dd589a 243 | be83d48fc695dca62b4e8a84a498fb09 244 | be5e0dbd5a8a589ca04f967bd94443cb 245 | 92e409aa16d2d673b5203226c26c59ad 246 | 4a1ffed169f04f5fd084cd4069686980 247 | 75c408e3ce113c84d084cd4069686980 248 | 96d6d519784e40c0c066b9622c005c53 249 | 984d064e7e0310f54cb67f35c09e50ad 250 | 84e6e1fb56eb60e918d385624fdfc6d0 251 | a2dc5748b523db72bbbcb091dd094e5f 252 | 46bd2ce6ca3439c9c2687184da14e3dc 253 | f9a615ecebfe7ae1b27175774c9e33e9 254 | 8d7d7dbf8f0c0f7673e1b2d018c0512 255 | b754df4013a71f6873e1b2d018c0512 256 | b2af20dc171d40e4d4e62d99c536bbaf 257 | 2d1302ed4d4f43ca73e1b2d018c0512 258 | d087ad474122e24d887e8faf8f33b0c5 259 | 5578446e4a13451a6c7c9dba2abc9f8b 260 | 94abce2eb2c9567da7729f9969cb563e 261 | 27046cee7ae745e6d207241113bee327 262 | c75c5ae81c1fd498c066b9622c005c53 263 | 57412ca31eeb15bf75fa5879e0c49e00 264 | bc11fa1bae19a90ad74a70b98d3225c0 265 | 217733447f1ec818c066b9622c005c53 266 | d06efc46aa999fa21574d21c0c95092f 267 | b209054be0f71cfdf398d0c5832df00e 268 | 115115104976edfdc066b9622c005c53 269 | e41aab211af3f84673e1b2d018c0512 270 | 2d53b9798c7ffe7a6e55c6c7c80df9dd 271 | 485a778cb7416a59e810658c16fad24a 272 | 83dea2f2561fc2fbe9364d19fabb5f00 273 | ec0a8e2fa00a746dfe74514a9fcabaf8 274 | 1ca17d2cadd47286c066b9622c005c53 275 | f7a45911d01fe4a961775b840d882da9 276 | b0feef9f599d41cbb3d8c1107f6ae528 277 | d2426b884d1108e8bdc8d5970acdf989 278 | 39554167163a7cc3f881bbcfcc456ec 279 | ed06c596dd9b9cf3dc99793862c889e0 280 | 68bbfac3232f153c6ecea800f06e81d 281 | cfc38353ff8392e73a7dda43d8d95517 282 | a31ac0bd8915d99631c992914b89bc52 283 | 65dfccb2d5e47538a24143eec482cd09 284 | c51823c76ebc7f6e464e6423c0222f3b 285 | c398c35b48c31188c73a379f25dda815 286 | ebe84e8ccc8b5f3fa817854e3b5b5439 287 | 1ac22719af776fcea2626afcc786d93 288 | e2c1e8958295f84459fca7a6b28640d3 289 | d3a872834cd0aa94d77ea5e1afa5bfe6 290 | c15fdc911c54f4cb62c440075d5ed193 291 | 1bf06b16e59e482c238ad1274d829e68 292 | 73c40350f07efb92d207241113bee327 293 | b3f5d033d3fed8e9d207241113bee327 294 | e47b83b94a1956ad7a16fcc398700938 295 | 8e25a8e0de9ff545bf1411bc6f3b308 296 | b4d4338a36711ccdb113389b677f57ff 297 | 4f152b01f056d0c35363d5176df02e54 298 | eadad629c581c28c6b424c689f1d711a 299 | 95d01543b46b5e43f398d0c5832df00e 300 | b1fa05d508d9ed81753a010738a20397 301 | 88ae9338c167e8d5238ad1274d829e68 302 | 90e3a0488b8ff079d207241113bee327 303 | 108316842b17210394a42262667addbc 304 | 29c140fb4eba078c7909eb62c64c0070 305 | e2dc092a4ef62c09d207241113bee327 306 | 64ebe165fa668ad4abbfc2108a5a7885 307 | 4468a5e60a6fedc086bb0379a61a0978 308 | 52e827d2f969a2b61f2b6130e0fe93a6 309 | 3ee30326a3bdf219ec2ca8479368108a 310 | 6e6b4d2603930dfd4fc88114be3a6b6f 311 | d17192339d28af3234140f5d5f70bb2c 312 | 38007ed3e5ce40ab13dd6eafe1477be1 313 | 123f9066606d80206454c2aa07613033 314 | a4ffce648faf8349e651a075b3dd0597 315 | 1c5c9d780dffb5c2599d9c8430d600ff 316 | d69d5cf7868651effd28950562697757 317 | 221a981adf503875e17b9e33c097dbff 318 | 4e06e2b59a83bb6229cd1f0bcc30f82c 319 | cd451b74570bd84f44dc88afcdcd380 320 | cf7a2cb0c487f3a0bd1cba733b111584 321 | -------------------------------------------------------------------------------- /data/filelists/04401088_test.lst: -------------------------------------------------------------------------------- 1 | 45301b15dce2724e483a0f6665d9ffe0 2 | c4b66fac952d4ef7d9039fb3a1715e96 3 | eaf85cce060622c88de42b14089e0e7c 4 | acda976ba347a3e58ba35fc6cd3da287 5 | f48acd0450cf96cde6b9b562e2cde99e 6 | 8e9c97d54060d1282085d549612807d7 7 | 7ba45cacce4b4c09c7a217851f86faa1 8 | b984d7e958fe9eb961179e7ef17bf7b5 9 | e006061cc51617b9498dffe5de12eacd 10 | 2a38116473099355498dffe5de12eacd 11 | 3bd6626a05b4f79bcf17364e7927abd 12 | 96f4e3797b8e66042b8a15395c060463 13 | 295d6f0caa702a1a2f58405e4baaa2ed 14 | ab2cdd82bc69255f1fc489fbdec3fa1 15 | 9b91faa0835a0287db45a112fe2d5592 16 | 5891622298f30916f31b75c4a94a8879 17 | b801c4ebbc1149b34961b0d325e91640 18 | d56bca3888d3a595e93f5e23021ef900 19 | fca7558e383a8200a1a64f95774cf79d 20 | e3291bf83de108ad98b4ae7d0ad0f9 21 | 9c5952804e0b2ba3e1fb8c5792a5768b 22 | 67743ab1b28ab5cab3fcf86503541b68 23 | c960421b8c637137fb4952f06d5e75bd 24 | 57aa54c9db88e364502122ac3599bb74 25 | 800ef55c1401c26ef5d4e1af18c85258 26 | 743b747a119307e8e3785a46a5c831bd 27 | 79f11cd09522565fecb1ea9fbacd5278 28 | 57daa58dd0715c58beafa80aadbc3232 29 | 2ef0e93ce68dfa74bd1f358005ee8ea2 30 | b575152bd96a4dc4adf82b2748b1cb62 31 | 80d73417fa12508d7d6b888b4eb1ac9f 32 | b490aed1d7d9a42ec4e2c9b051d6a014 33 | ab5fc5879ace7418bdec90548bc24588 34 | 6f725c21e92ae3e8dfac5fb05629bdfd 35 | b7741503cf1fe40378bfad8b5ed8c4ef 36 | dafeda191170938ad33f96248c28a3a9 37 | 87b696d3942f6845fe75c83a5776ab77 38 | e11ff7bea65e8545c3f912172873d52f 39 | 2fe4f1ea84cf924ea4d4dcdfc6fd3059 40 | 4f2b1a13f06a85961138452c33de4a3d 41 | ba9f7bd05d6f028fc1a1659eb4f57afc 42 | f1f794c3b6ed8951d07b37cd4d789f4d 43 | 8b291d445d412c09cc018c0e073a98f6 44 | 10b3b46298af96d40e7407386eaee0f 45 | 68082af238b7973aa4d4dcdfc6fd3059 46 | 1f4e56064de606093e746e5f1700ce1a 47 | 96700b47eb9bf33889a1b8cd5b44ae5e 48 | ab47334a425e1650bbef66962a25aa5f 49 | c771a9b2dc439adac38a7eff5af707a2 50 | e85bac837e951f3780ed245d94a6a268 51 | f928f74ed34e46c4b5ce02cb8ffbdc86 52 | d62ebc23fe1a7e6a985b19765176f4ab 53 | 19bb5e75692793fd45df661aef5d0a33 54 | 57056c8f465dd1aec03bc4569d70377c 55 | 6693fcd81ce5a4e6f5d789e33b735c9e 56 | 73ab63e7ac7a404b545fb5ece69fbf4e 57 | b4c1d8191707ead52e10692b3b33e38 58 | 6c53f579c7a8da15c7ef7dadd1baff8 59 | 60193289e8d9689b62f6b877265e2679 60 | e97033321b1930ed4391592096b033ae 61 | 424d356bbbdb38daab0fba1d15eaeacf 62 | fef0bba982a4ad5296913ea8ca1ac015 63 | 7cf110165b54e7511d3a21e67b7da85e 64 | d0c5bdc45a59669a39a4971adc53c51d 65 | 3f95b3ecbe55c83e9c3a7294039d408 66 | 74314be9ad38b02171eade9e9bdd0f45 67 | 162341ffb94a3884e4ba5fe92f32019a 68 | c4dcbb047d219cfeb4018979c856c916 69 | 12f2156b99444e955d73afbd7c310e93 70 | 1a0fab14a11b39d1a5295d0078b5d60 71 | b307961888415ab88ec5d235d7e81cc6 72 | 649c8024460077cce8f3b203d0634c16 73 | a53b3ac989d9e6f35f8a15a7cb97bf7a 74 | a4c32dbcb71076d5825732a29ddd146e 75 | 43d96f5a6a619c06bc663b874223ed74 76 | 8f3250e029d561341b92a1339af2f7ce 77 | fc07770a57d7a87022d3f170937c6a0b 78 | 98eab6b7dee0d64519907bbfddac6b6 79 | 2d3208fa267160862c611effe1bec8cf 80 | a04e8cce46e70fc48f2c50408e4e65f6 81 | dacb3f6f6b0cc7a52b1abd641c06dcad 82 | 2e6c1cc7d262bc36c1d28dd38097a536 83 | 83dedc1afeb57e199edca1fee171b669 84 | 4458a5056f633fa13abacfd1353cca42 85 | 692ed312d9ba1663577cfcf36d9b3392 86 | 294d1fa4193f54528db944c07f28e3d8 87 | bdb87a4218cc7ecd23bb4223d09fa6a0 88 | d61ddb57397143e38d03482ac0270137 89 | 9f6acb21f86a88d93ff936510fe2e02f 90 | 709a0c498dfa2b32db9f110046803f4f 91 | 9e2169e8e8186a3a27bac6c74974cca2 92 | 2caa10c91355efe6ae2545602370c249 93 | 85a94f368a791343985b19765176f4ab 94 | 63e84b82309bae535b6795b7faa3170f 95 | 257ef557fee9c083324b3288c1587efe 96 | fa98d507d82d325c80202e5aaf48e957 97 | 74dd744f5c5b9d132fb56cff2a0f826 98 | 23cf8469ffbd93ff8faab772f03eba4b 99 | f022d7789de219e1fb7ad0eb0a148aa8 100 | 93d617cb7bf7558671fd17a89eb6aa70 101 | 7a458ea841e4e67a11ee7ca4f000feba 102 | 6d7a0e701b4417504161e123a102b12b 103 | 678ed514423f067fba55419d0f0e294 104 | 58ece48e59781da1fd0a2086d631b6a0 105 | c1c23c7a80e4bf388c34a8518a7b6811 106 | 9e98174951026624164c8c77555f8e1f 107 | ab621af8d265667a396287d16057dbdd 108 | ba669a9b03186ee8108c9111b239151 109 | 158f605ffbe6b036436916a86a90ed7 110 | 4f2919438ca46d8de8d8ad3bdef6aca2 111 | c3ded7599240c96f8bbff91b1135bb3c 112 | 3035c3d7d7eef1fc952c851f81463faa 113 | e679783f54c36220b99a2cc4ddf0d3f9 114 | 8b174c67bfa00f03df269b2c62a1bd4a 115 | 9878b77e157e4b0dffc2eedcd24a87fb 116 | de271ee7c512d31551c2056c93a582cf 117 | dc2c4f42a5715d0a6d1ffe1a45470ad7 118 | c8550b3e45672f5d891ef59b77a7541b 119 | 832d6075c8fafe4de862e3cac45aa769 120 | cc6c216e25469966bf14f57b214697e5 121 | 18bab729642c42631308c95c9c0fcafc 122 | 36ff3418849b9b8635d9dd2d03e6c396 123 | 5ae839d512364bd4da0f54fde38627c3 124 | 13dfb842c1944c64de3b109acc7ed8a 125 | 69e334b26683a81935bbff93749c520 126 | 49db0f97d215a109a2db3e68315c7819 127 | e96198cfb23a8b9d1d7ccb77d69f693e 128 | 520bdc1f312a9c92e44148b82b01a424 129 | 590017c9eabc3a1cfe8474bfd438f6d8 130 | 68918effca4b9becf3434ae1311a0329 131 | 856d33d16a97605bc9164fb9f03dc1ac 132 | 98c63a8e5485b0a12737a4ff69ca3cd7 133 | 7176e9baddd8a2ea33ac431572f43a21 134 | 75d6dd4112038b8359aa4ad538fd90de 135 | bc27ec84fdfa912437ab6ee77f8c5e9e 136 | 74a65213a90e1f2d850a112e6048afc4 137 | ef34d9789a83659c9f8f9b52e89f6554 138 | eed72e5bc3dc4e85150c05906b260c9e 139 | 7483bc04eec05077b6d41c42f7ade8c8 140 | 479e2ed536698d478f257ecba9a6ef8 141 | e0355773a18fc61224d795aabf4bd88 142 | 9c2e939e173fb6e88af54f33b2f21f70 143 | 198557f515ecfe73f3c5246a46375579 144 | e3ad9c85b958737ef7c1509e74f67ac7 145 | f75cac5b112f14002c32dcd0becbedb7 146 | 2c8699277b2717be66289707fcc0ca1d 147 | 20bcd48918a843946e74af071fa12682 148 | 541cc8b3ccf4c799502122ac3599bb74 149 | dcc94b8d84b5093df47a365062723f15 150 | 678ec09bbde5f116716c29316ac4d0a0 151 | 39b91aa425472c3676fb191f3b44695a 152 | 738e377ef785ee92d3429357dd0adcaa 153 | db059495c20c0e2e514ce6dee24d82db 154 | 89d70d3e0c97baaa859b0bef8825325f 155 | b7dd49e4f54f736afd5d38d2ca555422 156 | 4cbd57cc8e6aef9f2ed91d160fd4ae97 157 | 36290375c3ff67b9fa391a6b067626b4 158 | 15bc36a3ce59163bce8584f8b28da0ba 159 | 4133d764b4ce5323a44bdc236120a21e 160 | 99fa43c391f71ffd592461222e5fed0 161 | e2784eee13f340f2195cb740f5da17ea 162 | 62a6de09ff956e997b239f1b8ec0d46d 163 | 42ce5fc532b667bf9f8c6ee75b301991 164 | 235cca962513b7a7629cefcc54d102ca 165 | 170f4eab739637f2a101047bb63a1772 166 | f2245c0ff356a85dda10b9c82531bbc2 167 | 142e9e68380daef34eb88be3370bffe7 168 | cbe652c317a4366b4298c9fe028be1cd 169 | e8c4ef4c74c631e83628c1e9941a8ab9 170 | f46531484dea3574a803a040655859ad 171 | eb6fd5cae6ee26c8a2651abaf391628e 172 | ab2e514557ecb359224096f37ce8c08c 173 | 10a1aa2255ede06589b4abee87a908b9 174 | 7f55d778584ee63d2271b84575f49c3b 175 | de48276b397bfbbe8fc27711a3d87327 176 | 7a1eba075f17d7b0a456028305c31de3 177 | 1049bf1611874c9cf0c2cf8583536651 178 | fbd120d2c01484d56c95c6d882af3c0 179 | 5050d6be55dbb7cbbf82a0d508a096d3 180 | f9bc179b45d2e5ffc55273be8e22f2c 181 | 67b3696286a96a8c171bc7a10f38839b 182 | a6fa27ebfdcfb0e165f198d5d73e9283 183 | 75dce3b2e5152c01ead1b13838d77bb3 184 | 52541b667e4dee9b1c1be4d7e88f11d5 185 | 4f71662203c45d66cb2c0b430ff869c 186 | 2682cb34e7db8735bdc7fd7cf135ade2 187 | 5681c4fec43043c1a9f85d9079e13c55 188 | 5f03b8d583798f7fac18d1d66482053f 189 | 58d40261b05f9a148abea0092096036 190 | e7ef78ddc23ab4edbad0eedd46c6260f 191 | a262dd4b61d374c8b91c0e89daffb776 192 | 6adb3426ac55ba827efa8dff0d683ef7 193 | f5eb39c7d2e7452ee7ef9fff09638f8e 194 | 2b829a38051e6f8d1f6dfedaba98d5f9 195 | be7a560b2a6996558c646f076042ffd9 196 | fcd923f9bcf1e859e2a1e51fbada37b3 197 | 597b3a321198f0a029b6ce1cfa22349d 198 | eb1fa4d2a399d4c38334e57fff4eb77b 199 | 467ab7ee9487525b13e4f8e4c4578272 200 | 30e53b35873e59da73ea3d752b4ac8ec 201 | 652a6fd052491909ab19ce2dec0d1925 202 | 5b7901974a37066aee44e0ef4ed60fd 203 | e8508eef82fb9163a1288f74f9304471 204 | fecfbab790d979a25d560b84ad8d9e87 205 | 3ef3e3008fd2696ca1033de17902ec9b 206 | 57245f4db78fc2be7aa291768a04b26f 207 | a2b921dea6df33765282621e4b0cea7 208 | 91240b6e6ca6136dd25ac584f0a4b696 209 | 5ff8806e12ef72e0650185da4813c6fe 210 | fa21f65c051ea2577500d68c500fdb4b 211 | 7c134eee62290ae7fd130953acb6f543 212 | c13cfcc92e41e5a924fb403e4bf9a6b1 213 | a801c5a24131f1842ed91d160fd4ae97 214 | e71c51adfe4d4f00341e76467b172f31 215 | 719a564d600f1ab38162d5a2262f4a8 216 | 34d8c06ade78bee87e273378b31b6ba6 217 | -------------------------------------------------------------------------------- /data/filelists/04401088_train.lst: -------------------------------------------------------------------------------- 1 | 611afaaa1671ac8cc56f78d9daf213b 2 | 9f3ad4e5f16f40b3d0f9f958bc79097c 3 | 21a7e90867b64433316979ee2b237f2b 4 | 74e5759913a2ac208b0d3d4e51815944 5 | b8555009f82af5da8c3645155d02fccc 6 | 73339a7ed1e72d89aef10502d58d4967 7 | fb1e1826c233104a4e09ebaf49b0cb2f 8 | 6039379abd69be2f5383626fb6f0dbda 9 | 474b04796bf1ec91962bfd5bcfc9bf86 10 | abf5c8d2cbcd97d81a0d6bd0d03a1fc9 11 | 202fd2497d2e85f0dd6c14adedcbd4c3 12 | 16549bfa3cd0f53d2110cfd44d2335d 13 | 38881e9944ea86dca374e5b9b6427c16 14 | 6909da0ff58823615a82137b384b94e 15 | 7f643ee632aa0a3f51ad7743381c8a7d 16 | b7ebfa514d14036e2da685d55be1eb 17 | 1b1969121f2d099b27192dc5dc6ab252 18 | cb21dc07d0ca602b151d8b52c53b90 19 | f18dbf3cbc7d3822de764ca2f457c756 20 | b207b3f3617db6cb85089a13cc567dbd 21 | c9a50d65e19a4aa3e2da685d55be1eb 22 | 4f3c487c54ca29f2439292e4b8fd557e 23 | 5413423e80c9f264abe7f17e61fac246 24 | 27ef3bc1f4a05157bcff4302eb453f85 25 | 816aef1e285ab957b1c67c24f425bd0e 26 | d6120b12aca39e73cdbe8a30cf95821 27 | e1b7a28e8f8ddf15a4ecfe858e518c15 28 | f73493b7c8a78000b594bbf2c494ab81 29 | 2216e78a43c5d587b8e1b99345a5afd4 30 | fe9d97823a25e56d95e43220ee0eb824 31 | b18f0d53dd3db1999410a04d09c14d1a 32 | fb050aca4d5f2573cf1d3d11d6121bb4 33 | a434289b281e629b81139543c959a70a 34 | 6e183cdeba6b83b3805062aaa3bb7665 35 | ff8676e76a0fd471fc115be4ff5cfb9e 36 | ac6f6437f9e63981b6d41c42f7ade8c8 37 | 3bc6f902628b3f7f85f6153ed2033a1c 38 | ac1e771d6392e912f594ca916b37180c 39 | d7ed913a3888696d289b03e5721252f3 40 | 8cac6df50c515c498be6bc9d57b6a438 41 | 74aab120cfb4d88257de0221db0b9d32 42 | 5101c0131cdf76d03f9d84f9a87a44e4 43 | db89fa13b1c3c53afff0e9d5e9e3da5b 44 | a6b2c1427dec317525bf2427892579c7 45 | 5b111b3a3e94b5907e1c85c5c15da7fb 46 | e458abdbff34fefe255591a17641445 47 | e30f2d19e9f44f6ab0cb879d4613195c 48 | b35c2da756f8df5aa0eb5a85db887292 49 | 1847d3782970e60679510444cc61f839 50 | 77f5498dd2277aacfd71ce99fb45ba0c 51 | aa833540c3f2d77e2915acf4d1de24fe 52 | 73b87e2025cfdb6daf19fa8e8218bf64 53 | f3aac8f54f5f2a2f983ec12a2b33f18b 54 | 308cce8808b076bff49084215d845d01 55 | 9644fb6a1520af7fa90f3ad3635b46d5 56 | ccfac9fefb0326003f548cb8701b2293 57 | 1b43d9193794748e31811399a4ff3aa0 58 | 1b41282fb44f9bb28f6823689e03ea4 59 | 8d55c1677626cc48214d974150b798e9 60 | ef2472e661320b03e324fbf60278e45a 61 | 901a0180abe1011b3c629b56d283e7b8 62 | 4bef48f1c1b4a40fbdeec9c43546255e 63 | 70fe91a7bc072c39cf81faac56233ce6 64 | fa9b007a326be6975c8fa950032e0987 65 | d2f3eb92a31649647c17b7a9bb17a24 66 | 8da5c29d14a1003d23247d005da93d43 67 | 1f93dbc9622d83de7a9f0bb7b1eb35a4 68 | cf7973f49aa611346be7f66e5722d994 69 | 43b59b01866f23e6f8d380ef6d10e2a7 70 | 54bb14aad2406a124ce28f0f1b509eda 71 | 9dc0c2ca8de18e28b4c18e3209e12990 72 | 2c32c1b5d13074431c1943a82a09125f 73 | 81f527c62191bcd465c46de8aef92580 74 | 1d9169471bf9223423e378ba27e11ea6 75 | 18dc34a116734b43bfd324d8acaeb3f2 76 | ff8ba237ee9164c8ff86292618094648 77 | 5a37ad3759b4d93df843a7d4732b1d6 78 | abcda75b9f826fce8dd7bd77b545a577 79 | cfdd44745ba101bc714ce1441b585593 80 | 1b1aaa9a95ae964746becd46a4907f38 81 | 113303df7880cd71226bc3b9ce9ff2a1 82 | a9d358ce2d54d95e54c7ab6aa5674ccc 83 | 922380f231a342cf388f6c7a9d3e1552 84 | 6ff995a8e9faa6e83e43be0b542efff8 85 | ee7d2d986f2c989ac66dc18b3cf1700 86 | 85841bf9d27c85a26062f54263899d21 87 | 8270c952b147d263b9746cb9e2b9d08 88 | 89019c955310bc56eeb3fafe1bc8c07d 89 | 5c8d554075a904bfa7ca3fec59d82214 90 | da24f27173874672ed7485a1aa598365 91 | a82fbd031a79f88eb6d41c42f7ade8c8 92 | 2a6d70bc7ac6db391d4136675e1527dd 93 | e48a2eff0b0d0a39a0eb5a85db887292 94 | 692e5fc16bc6ebd23737433332467411 95 | a4d81a74a416b88948637414dbe9de8d 96 | 98eb601db13d2a99611f4167fca99b42 97 | 3c0801c11fc7e4c5f31b75c4a94a8879 98 | 1ac1e6fc09611ff049c647f92ae11714 99 | 3a3fb2919b1bd92658c2dcb60645f75c 100 | 1cd8004a1e0dd825c33f370fa5b41cf7 101 | 722acb5e8ccd39391e5d846d206adf3d 102 | d9ce2d0be1f3952aa36bec4fa7cd58c9 103 | 5e6ee0c5d155d2298b13932a0c28e98b 104 | efed528241cd773fa2c7c5886f4bbc93 105 | ef2b505068cf120efe48f52a0ccc160d 106 | 2eae0713342e1103397d790c3d0a8fb5 107 | 39359aaddcc4b761b0a79e28606cb167 108 | bf15900bf5afb946b35f223cefd97829 109 | 96b1d230e88cba16f71555c6480aef72 110 | 9dcc24af7e0df254525b3f0594400a46 111 | b7ab1b6f7dc5026dea8f4709e6949c8 112 | 6167bf752533508dfd6e968ab91bff17 113 | 6bd7f7a17a7bbd2d68acf22a03600648 114 | 7772938405ac56c1b6d41c42f7ade8c8 115 | f5f1fbeca9af99c98efee9b82d757c0b 116 | fc1675526d043e81a2811061ff7e0824 117 | d944c42ad08401651e5d846d206adf3d 118 | c202335fd3dccf9d45e2a4e5729b970d 119 | 4991cd37af08577070346e4935b9a42b 120 | bcc1760ef463671c825b62bd6c28eac 121 | be66886215eafadd56b70d2dbf032aa1 122 | d41b332b9e6efddaa0eb5a85db887292 123 | 6a073661711d8b9f1a5b805dbbf26206 124 | fcdbba7127ad58a84155fcb773414092 125 | f7cb2d921f246c00cc8eea03ea8843cc 126 | 8b11b38e035143ddb007a3ad40c5add6 127 | e840fab2f764532ce4bb3cae511f21f0 128 | 8f049b65309d8390f5304dc8cfbb76e1 129 | 8a56e999d75c4d6e8d1dabf86742ec3c 130 | 25eff75e43287223f1cb19f636b1c2bd 131 | c3e18e5d0f7a8709e41b17b375798648 132 | 1292caa1282ad8cffc3c4ad908ac06f4 133 | 76a4a3e8370bdc24bd2d4107e8dc02b8 134 | d9d06d2772ecc526c0dc3ed657ab97f0 135 | e13a5d5b3f7581cbecf207e73a787c06 136 | 53cd656555da181db6d41c42f7ade8c8 137 | 457b4310870bcf047f4e0c14aca1a926 138 | c864337d009c823290a9c3b0b32f8569 139 | 19208607cafce17dcb85f279c97d4c5c 140 | 9e302a3f21a992c0bb579d1d8d989550 141 | bf0f0ba650108d03cf144715a1bb5595 142 | 9efabcf2ff8a4be9a59562d67b11f3d 143 | f7fcc773249429a2761eb63018291094 144 | 953a952a18e389e4eb386a4e845c05f5 145 | 38afc0467599bd6bfa13d53e5e4a7d2a 146 | 452b924abd2ece2d58932236a22029d3 147 | 71121add7e94b024fb88c3d40924fb73 148 | 4116965029bd24393423610e52061098 149 | 556b1ebe82977992c51777c7f8bdea09 150 | 7f41f4b186fdf84c7ecaf377af2046d6 151 | c87bd717c3640f0f741e88434245c899 152 | bf2a5f434972f11a690a03770c5de186 153 | 320d0f9256ab9cc3a046bbac53886364 154 | d299bcdfee69c57d419fdfebc874eb8f 155 | 312c430f8b1a3fc80249ed612e14df4 156 | bf7daa3ade10ee75bad093be69512dcd 157 | 58c6118bd15ca3b48dd025faf4cea27d 158 | f8d97bebf67cad12a0eb5a85db887292 159 | bef91c1804ec226e5b1c02ea3a290822 160 | 2acc3bd87282a7e31da45817bd55c1e 161 | 5e87bca3231cbdf15b5f05be350ae67e 162 | 9fac50c7b7c72dc694f8f49303e93f14 163 | ec39e26f8c0829b3413ef77469a0f9cf 164 | ab8243a880170c00cca1221aa4c4f70a 165 | f760cdb0f8cbc6fa3c28e819722231b4 166 | d72b00ba0cbe10a1157f4a560c24391b 167 | 5286f018c374d3ec3f7fe3cbfc3d51a7 168 | 610a9f79a2f2faacc43c9f60fcc79b4c 169 | af983238a3e47692f90d7ee51bc3530a 170 | 84cff93cb8ed08e55acbb5d30672759 171 | 424ccff9ceea33451c81652b127a0ec9 172 | bcbf0ce42d2b0f91abae9246594d3f7d 173 | 44ce10ddb982c8ff72152988eac576ab 174 | 3ed359e502a24e5a79510444cc61f839 175 | d932fb5d06d5e4f8da8c8a88ff86c5a7 176 | 9c26b9b0584920f1539baeab407f4a02 177 | 5fe99904fa4b22d4ff1911c2640f2e42 178 | 383a304edf67f757769dec5ec0157054 179 | 420138dffb14f929f0b45b4b4c7e33b7 180 | 7dd788cca7df768495b1245be456cdf5 181 | 3036e6b2a898fc85e85776440ad91264 182 | a1e51e185a9f24354b8478bdb97333d3 183 | 112cdf6f3466e35fa36266c295c27a25 184 | 313e9b124e421a4efa9922db9b6aab31 185 | 92ec69548761efc61f74e5d5bf005208 186 | 500fbdefb58e261af2cdad303f49c9f9 187 | e06b902efc1576c62fd4061aba358325 188 | 271421566061988a93d9d97ff82834ba 189 | 3bdd569911660da81229c79e4cce736a 190 | d2636f3af00fb3e2538f655e65b0b57 191 | 1101db09207b39c244f01fc4278d10c1 192 | c43c9123ed893de5a0eb5a85db887292 193 | 17072ff9ec47bfadc3fd2392bc923b2f 194 | 878135eab6ae9aa181471a5ba59fd0fa 195 | 89f17a3563941ba9f2fdbae39bae1eff 196 | 1f565ab552dc89727e51366b0cf7747 197 | 2a48a703451da580555dee99eadeb47b 198 | 6609f05bbe9c49172cf708d3028fb325 199 | 25e03c305f41c5dd226bc3b9ce9ff2a1 200 | 6f63df7ca322514f41ced50d3a574698 201 | 59a168f51f8d7dd9e59685727bdd9ae9 202 | df2299185baf20a17b1546f309a98bd9 203 | 31e8327ffa4ba6a87790cd6f6e8952aa 204 | b1085da37756ddd1d3f1ccf368ff60f9 205 | 2df0bc8b46ad3cb858932236a22029d3 206 | a698b67778c02fcb5a0a15c8380e928f 207 | ef57d8665eb5ef7cdb965514105122a4 208 | f77811bd35b9215dfd06b6d6f44d62dc 209 | bbbca195cd6b85f1562c8e1ac545ef78 210 | d37afdca0c48251044b992023e0d3ef0 211 | 7bd9b1b1297013ed65f78a217bb320fd 212 | 27085a2456319497f1cb19f636b1c2bd 213 | e8e9617b4f7247fa3578fcb734a22822 214 | 2163366f7c3a7a0e6c63b8b48495261a 215 | 35d370a1531826adbe5693b333a3dd92 216 | 3dc95447a57f8d06c1e615a94e798da1 217 | e513675ffb2da709a060e584e7409aab 218 | 29f27d4472a17e723fd445ae159c2cb2 219 | 1bb65c38e6b563d919bade123d9b1a21 220 | 144d8038c1688e37ab3dd76bf33b0f5e 221 | 5deb3e8911dbef1adce6ba04fb42df 222 | 68189c0fdca1a8744db121a0d72356af 223 | 52494d36a6d136f6b34ae4286be3d813 224 | ae7098f0bc20cc6b2a87aa332da7bee6 225 | 436d7a114f72dc03d4713685ae50fa13 226 | 234d1646b21fd765ee45e1eced971f52 227 | 34e36249166b8c6bc3f912172873d52f 228 | 16685299c37055c2be40226527c9872 229 | b73398902d1c267b5eed8c8b1cd54386 230 | 49081a0c0cd4ad32166f3c6af52a7c59 231 | eb58b011745519194fde46457697d80 232 | 97e214d6b93e012f6337fbfda5096043 233 | c7e4a425cebaa04bf9c8feac0b33491e 234 | cb9e8cd0a29cbb26b6d41c42f7ade8c8 235 | 54539e30a59cce413864ee650d9e9c5c 236 | 2cbfb354e5dd731dfd6c7e3f0d9c56c1 237 | 267a2d6fbf29c04cbc17518d87dd1f7a 238 | e691c8f0fd7d64d7ab0b172d4dea80cd 239 | 52d1db0a460723949582767760266e88 240 | f66d8ca1f6b259de2a9eb0f146e94477 241 | baafe1add38af23a5f0b5b54dbc4f35c 242 | 5bb9020da1d3bdc260a9d7568d474ade 243 | 774bec08bd534dd28a1687774f473322 244 | 76781e8b967f98b5a0eb5a85db887292 245 | d5fd6679ddfc8ddc59f56ab706e2f74c 246 | 3ff176780a009cd93b61739f3c4d4342 247 | fabcaa4858df16e35817e30de1dabac4 248 | 609321c1351a955c1e1f8455cdf1c0bb 249 | fe553cf733e29a349426aa93c5c54668 250 | 3d1d0255e2163917f4ad1770263e7f39 251 | df90c50a892611ca8536be73396b323e 252 | 78b4f3aa956b52139531a714ad5bf7d5 253 | ab9c56981431ec70f7b18034d9df056d 254 | 40dbb04ab8f780d6cc571cd3cf8f17a1 255 | ffd186dcf855e13e26479a182158bae5 256 | 5828a8259ba570bbd24e3068806a8c67 257 | 8e3e1213e47661506457f8736d1c9e5d 258 | a3c1c9fc390b1bbbb099170e6f5a4af9 259 | 5e5c0391952208e81213f8f7891e7fa0 260 | b7049148a4ffa22fdfe197f9f37aa72d 261 | d4a038b20b1250d7241d076ab53023c1 262 | ceb47998c0ffa704f1cb19f636b1c2bd 263 | d51e5d7eae216c9ef1cb19f636b1c2bd 264 | 4b96f974453ef59ea2c7c5886f4bbc93 265 | 8e00be7402a612e17d6b888b4eb1ac9f 266 | 6d85b3dfd681eba530400184d5d3220b 267 | e1a4ea72b1f98e92d265c94f4d41d924 268 | db96e9b2c96c273de7d92dda5756fcfd 269 | 4a81237a7fc743763992b1138bb05b3c 270 | 8a26be623e40850a203d19a168d29f04 271 | e0b1cb72aba261731fa8e666182e8619 272 | fe34b663c44baf622ad536a59974757f 273 | 521fa79c95f4d3e26d9f55fbf45cc0c 274 | 8ede5d8c00e10a2ff35554ebed2bf2 275 | d740b0679a9996ae56acd5d5597a72c4 276 | e3c02395e83fefaa42dbe6bfe3cdb29d 277 | 3c244a5e76cec2cf6f108f2b64e6593a 278 | 2fe9e8fd2a7c512ad1f278e1513f3b7 279 | 27f7ab052f3fce42b35f223cefd97829 280 | bd7b84ae3b88bd5cd2dd279a9538db3c 281 | 8ea128f9035474394cb30fc798a4d976 282 | 64b6ddb847da082d761eb63018291094 283 | 3ef278f78ddb1db52a39b1d7ef8834b0 284 | 3d5c17c3e60a168bdaab9d410eb59af2 285 | 983b045d30322f96b102e855af58e521 286 | 86fc58a0c40316f2562c8e1ac545ef78 287 | c3e0378cf861099ae3f7a74e12a274ef 288 | c410d13694b8ca1d15e144fc878b7afa 289 | 7d93b8dae79d5bbe7015d3b6f402d5a4 290 | 52a81d42c352a903a0eb5a85db887292 291 | 9c1286570bbc6fc78f257ecba9a6ef8 292 | b02d8e0fb3ec903b4a952171144f2812 293 | aef45c975ed647778768dbb598f40c93 294 | bf259988d2e8728c391790b8b8084f0a 295 | 6e6d7c2ffadc2fad2fffec7af390883 296 | cea8f15682797fe6eb386a4e845c05f5 297 | 88c64c14d4b6ae5aa7636d58d56f8570 298 | 453c590f0a1b37c1e0c2427da07ca8c6 299 | 2274e1f494d6d2c3226bc3b9ce9ff2a1 300 | 7afdaca858bb0a964a28575f3344964 301 | a7056690a5bf34d24ffbcf8cf904ca12 302 | 6a0c0c55f355cc23a0eb5a85db887292 303 | 1edc7aa574624ca0200a0406803801e9 304 | 959975a60ae104c48780444eaa02106b 305 | e33124aa016bd1f19c1db271ad9472a7 306 | c7407877d3325f7f391258277c122351 307 | 22fc328d136756361e5d846d206adf3d 308 | 6682bf5d835701abe1a8044199c77d84 309 | 57657c2b0d983a1658975870bb96a55c 310 | e6f4ceda4907fcc13c47272ccf8f316c 311 | cd1739ec8797049072f1ebe52d9b9daa 312 | 35dc3f0f2f5fe8d667a434dda72a2c24 313 | 81ad8af206d6b21b89b367279b017ccc 314 | a86eec9735db06a8226bc3b9ce9ff2a1 315 | ecbb1c53e881c2b25f4e4793ed432bc1 316 | d7b2a9546b6f68bfd0659574aaccef0b 317 | 2b48b14e226b131af3b2c084b195b056 318 | 69e45e401c1d05b767d8789d3a6519d0 319 | d79b59ea51a9d80c483afc91de6851e4 320 | 388415634e1056942ab70120fece57c0 321 | 8ec3b148b8c608a0562c671ec5000f23 322 | ee7ef8b40cc2c90d6b7170bfc4da1f8 323 | 2c6d9512b4013504ff0682cfb57a62dd 324 | da390e1a895506db28792f2ae4de363e 325 | 5dcb666efc36d9a68480fb9b9f30e540 326 | 9a94067c6ae50d59227a8035cf3430d9 327 | 5814df537b8f1bcde95cd0dc8c2f0e83 328 | a4910da0271b6f213a7e932df8806f9e 329 | 33db5943a8942fdfd998bbb6a9d203d8 330 | b1feb3020d9380ba4fb324159a14f34e 331 | 2d26f853e710b3e894088ff49a6baac4 332 | c6ad139da5e0799c712cb59213324f9d 333 | c71acd79ec4cf1cdd11ec2c68afc26e4 334 | 8b4d28e4df5ac6e8656557acf97c5e2a 335 | d3dcafb368c1defaa2c7c5886f4bbc93 336 | ad66da8440023d8a1e929774f9727b5e 337 | 5148da752bcd11884ce243cdbc967ce2 338 | 912d81dbf33f20956aedbd2a02b96953 339 | b77f57d319fd864fda5309001d158b32 340 | 1a9707b3e9d8345048891ddb73756acf 341 | 35f584cf8fd22794e4b68d3b17c43658 342 | 9a4812cc600c67a6bc4fefdf821af065 343 | c28ca490e5e7d104b1508bbfb8b56edb 344 | 5f4937b6e428e4ee122db064a7596ea 345 | 585f02091286a7a82b7045644a6897b2 346 | f0b3e6f5bd34ca3cf0c6f578f0594c3 347 | -------------------------------------------------------------------------------- /data/filelists/04530566_test.lst: -------------------------------------------------------------------------------- 1 | b497c390de93b4dcba21fe79619ae253 2 | c991fc4636615e64ed01ae0c90548352 3 | 5a0ca7a6df97542e69c3c818538357ad 4 | 2fb7d918e4a738fd97556ba76bc2663 5 | 23be001cceb4c31af6f70779d83413f3 6 | 28be32d7361adce59e5ca238b1551011 7 | ac93c084dc99fa8a1613e32ab05e546d 8 | e3f81331fa00c5f893375feb9c1d5577 9 | 8c3148ee031b15446e0dbba30ac27e8 10 | 728fa87ee84c5c2d2fc7e4ac493eaaf8 11 | d4fcf6486fd18a4982266a2b21a2294 12 | a8976b06101853deb4d272023dce0149 13 | 1d075cc087e9c9e3e3d3b281e2d34942 14 | 2a301f7070178c028cd011e47ff1df1 15 | b5290cd73084cec0283f6ecb26ba2c4c 16 | 67b312f1ecd5e4a9810b5070d24f8934 17 | 4b54d54c1e9cd6cbff5cc490d863ff3d 18 | 498bc74044946e85484d83b7c37bccdd 19 | 2552d0de59d21f1bfbc6fe0b6b7dde54 20 | 4f8e847d3453f2f17301f2b895d332ac 21 | 8d7c4ca5e08a8a3a6d4334e260ec617d 22 | 924eeaf6f203fb636be14c19eeda8326 23 | eb1d9a98d4024b2e89d2f742ca991829 24 | e7bd994999e1d6d87ad17faf524063ac 25 | cb79681fc1caae04a63e14ddd32fec78 26 | cc97fdf906ef08afc5646791c1cc7f13 27 | 25159673c007368b8b44023403d275d4 28 | 3c52a65c90a604f36d41dce38b96c472 29 | 738eee54143b5406615bb39b45716cb5 30 | 587793fcbae6a6fbf5abe4b4be4c3d4b 31 | 834dead664b43efb1ca19e5e5c1d5766 32 | 70b7ef0d69c7013473965669ebe40616 33 | 2a569537a0f6abd34b5acb1c7aa990eb 34 | 6e52344e2aa435d37e264261353b57e1 35 | 6a9764e3e4127744be2fa29f46d19511 36 | feaf5c41e664348220dfe072b77502f8 37 | c929e6d77b548b27e6f3ce318264cd13 38 | 3838f398264452a47c97d792b03a31cc 39 | 614aaafb767bfe62dcf47132cab9d51b 40 | eb90fdddcb1f25fca60ce6f0a0028c13 41 | 8d8113b30710a6bb68d1fcae6985bcc8 42 | d5f0a8785afc39120dfe072b77502f8 43 | fc15175b34b5e47ec57b4b6e80796be3 44 | 1b19bc5a09198bc85fa2a5df3ce5bc40 45 | 927c8ab9d2603aec2d4fe9f5177af0 46 | 4a7375e11a8ac1ae565f244baeeca983 47 | 2c7a846828d3584f2e332a83fed6fe76 48 | 327be46d4b15ba2aa79c0870e481d9eb 49 | c9d1159874c934f16f1b09a7281511b8 50 | e3c5033a9367bfa5a6dc0341d8503142 51 | b032f7baa738f10ef1ec74085c31730d 52 | 325d6d879e306fec3547bc1786bc3b6 53 | d2f5b582c65ee9567f79d93424b708f0 54 | 1dce61f6dd85dc469811751e3fab8939 55 | 6c99359667a1b49d657a96a9bceb8713 56 | a7444ff7be7aad024c8ad92cfce1307c 57 | 60c58f42072396986d4334e260ec617d 58 | 54b6788d413eb45bf6b4f9d652536b82 59 | 37aeaa30913d6ac73e7331a68f273ff6 60 | 8fb16643e061a3bd82b5804533e545b1 61 | 10212c1a94915e146fc883a34ed13b89 62 | 5ab18f317c0a5d21576932faf8645222 63 | 9380065fd20eec791a7be2887bc37d1 64 | ac736a87ca813c6d701c68e1045b606 65 | 1a2f00c6886f14354d85fb76de815344 66 | a85ef79371cb1edb52fd6b83c5929135 67 | 8851329ba7c3394d41556f795d265590 68 | 47c53f9cfdd4addfe054bb56e3407f7b 69 | 79803d0a02bbdc93ff790997f2048517 70 | ca529b32d5bccdfe7d66e5fb8a76ea1f 71 | 9a0c149f5c47207f22252c899eb7861f 72 | c29e6490308ad33320d713ce6286f99c 73 | 721a41c68f8d1e1af898a4b2192a12e 74 | e00d3546401b6759710b5d09f274df 75 | d65fc1dbe7fe802a5761a0b53ed37cec 76 | 635bed8b6b180fa3e65273dbd0c0f949 77 | 2d136ffca92d9c4e3639e751e7f78cf0 78 | 5f1956ad3dd52a69d3a2c7c88c74aa63 79 | 2080308141b05e9e584c6557cf979aa5 80 | c23960425c8cb654c6cb0dfa2f14f9d4 81 | d1f0353c7fa985c91915777d56cf77e0 82 | 27bee532a7cbe5dbc4bd6e2ad0dc6de6 83 | e765446c37351a26850e00840470903a 84 | 41d1856d2e24a738b4624ce09086ad45 85 | 29c5c9924a3e1e2367585a906cb87a62 86 | f17262f7443b98de38d037116a032a18 87 | 5aac718c51fc73ca00223dcc18ecf69 88 | 3283111173c12947622984b5941cfb8 89 | d9e771ae62f0bebd28642b2f4910862d 90 | 2c68972ae4868355a6a720afea6887c 91 | 6824763a090a0b2fd942f20c59bd7ad0 92 | a51410ca51a40c2529412f6cb23454eb 93 | 1d2aa0bcc9ade276a70cfb3232f40c6 94 | 72a9394882b8151bef94bcb012573cf2 95 | 1175df3d5cedc3365c00e52236fed2eb 96 | 24beb61e46bf6b1970d557f49392fb1 97 | fcb92e30085a580d9c6645849b3b7d65 98 | 61eaa4afe332ba113547ed4d05d19f04 99 | 189668ffa80d37877622984b5941cfb8 100 | 72a68c898941cb3541556f795d265590 101 | 24000ec6bcb6ab9182b5804533e545b1 102 | 607b88a99de743eda0fefbd3658c7966 103 | fa2b5f163549ca457ba04de7d6d93ce8 104 | 68d32bb51ab2050efe999a207e6e230e 105 | cd4240b8246555df54102e7ecaeb1c5 106 | 34c099dc4cbcb0ee7c304709a8c6cd35 107 | 7103677dbfe63b1ff85fa5c7c88c6c9f 108 | b2f200bd0861e1daeb78d3e0a9401d4b 109 | 6f36c486675210cdd566d7f46e9a16d3 110 | 587cc1fc65ac4991ff920fdb73e92549 111 | 2f004ec4a719d231e513e51a78e5ea1b 112 | 9122c94c6aa76d9e652b5e55e45d0bc1 113 | 1fb07d5bf3421a46e2b83b21c9537e1b 114 | 283dc6c755398547657a96a9bceb8713 115 | aa695b15cb58096f36aafa2ff65e6955 116 | 46fefa9e95b353f4b1bb46d2556ba67d 117 | 6419254bff42d878e820a92cdd43b76d 118 | 68babb87d66a981dd187e410b169ccd0 119 | ad2c82cd40584b43fc4c78b4701b2fab 120 | 58a768c309c01b2cd6dc46f6baef3245 121 | a32082d31b6b9a0566dd4c46ee29f5d0 122 | 693566461a33af90d7f8e93419dcfd5f 123 | e1e3c053f4b4f1405e45696ec6d1a105 124 | d5c7613bf466d33e94daa4565dd30535 125 | f02b990da656df8dba71d80f7b736179 126 | 8676b1989d68f3e970c565b5a7d76650 127 | a755dbab93afbb3a1a05bdebf75f301d 128 | 8d95b6ddd06a8a80f57109a0257e61dd 129 | 5c313324778eb79ad976d6ec0305833a 130 | 20c2bcd71abffc2a93add66353cae8ec 131 | a431fbb7e58ef0c46c03c11657c96c60 132 | 3c835bfc9201041a34f2450730697f14 133 | 4ecbd1471e916cd6c1ae34bcb12af75b 134 | 86fafe5bf7013d18248c5646daf6718 135 | a0372d1c35e531e7130b54be1fe602e 136 | 6e1781a84b5dbda6fb3e64e796c0391a 137 | 77d2d34922964c7b57c58fd0f9b1d74 138 | e5524ebe2d9f1e8c47caa6b5f3c46e10 139 | bad5505a49b50dc8b89145155e320b60 140 | f03f7c963928073227ac692756be9e24 141 | 83ecbc5daab43647ff790997f2048517 142 | 6c687a500aff678ad83f267e8f0b536 143 | 3e7923c788b0b9a67297c18bca670e89 144 | eb05e72eb8f94a24816427daa1887efe 145 | 6911bfee295138ccae6afdd0fd1549e 146 | c359eef375afa3b6dd42314e00caace4 147 | 90d83e1dde32426407e66c6e74f5ce3 148 | 20d1090d07a49fe927ac692756be9e24 149 | a3109a4b09953b5e2b141dc6bd7c4bce 150 | 41032fa8e4f632a5447ea5854b3cf405 151 | ec685f1f4bd71a191bf585548743bf8 152 | a36f6174628ee5807789fc10abcbc749 153 | 6371cc04f48161ec43b0018b6edb5e48 154 | 6d71354936e0e1e8c362d63d34a4d0a 155 | c715bbc7a1586afe64ab9e610db7c692 156 | 7a6634eb949d72719e6f7dedb7e5f584 157 | 6313352481b445a8ecbbed03ea2b4cdc 158 | 25f20d56a125b4028d8e8d98cb30b332 159 | 848164edcd9aa41594daa4565dd30535 160 | 93285afc55afb00f6bad0887a204b994 161 | 84b75e53176c9f1fe1e2f026632da15 162 | ba05637e557909b19527abfa7ff95c0f 163 | 52fb0261b905147d2fe023c7dc3e5231 164 | 183054ec6b2665a38b2b48d71cfe16ab 165 | 5c695e7aa51d16ee557500503415b4e6 166 | 2362039302d80f99f2c9de96bdb467eb 167 | 27e9a27b6e3b49c227ac692756be9e24 168 | acc820666df876cb33af5a5d96363fe1 169 | 508e6fc3b47590556be64995e9ed73eb 170 | d1e59a48852965fb036cb639ea80765 171 | 7edbaebf7d4fa994eca93934e5f39869 172 | dd4b3fc340bddb7f70adfca72a15271b 173 | 5b88544e42981ce0a71aa3ce894d7bf7 174 | ac8a42622eed9830ae433bf4d273c8e2 175 | b89d4bfad9c9b64d476a01ad767951be 176 | 9262aa413df7b369d735fa1ab17311ec 177 | 70744087c22ee199a51aab4cdab636bb 178 | e0d1f833e8dc5c604947b319a9e09fd 179 | 307a956fb5eaf7a629d81e9641dd535d 180 | ca129502c7b2b8186d54dce3f3e9f18b 181 | 9696dd7f30247c5c573080510ce7a6bb 182 | dde0cd836238f7946cde899c8674e2a8 183 | 73fd73a8bda002eae8d6be23f236225a 184 | 77cf1b9003d904df96bb95f1b1976a40 185 | aeb021c1e1838706b44ca19ee8c5531e 186 | 2114fe40b577ced9c7640fef6931a907 187 | 1d176576e4ded157a313c221866393fc 188 | e3e2bf1879ec9298c711893477336d39 189 | abdd2218a607a19819194900293f58f0 190 | 6c2c2ce0215d3f979b3523fcb9cc5680 191 | d45f39e14c365801892294bafc22e040 192 | 9f468767b1fd9285eb2c303a0e0d287b 193 | 409ff4fbba1ba94adab1bb7802748e9e 194 | ea34a8282ae86edcd3fb60637c014c9e 195 | b7d831d7b1dcad77a8596b6b008107ab 196 | 2067c22906b79faff877f04737ced5b5 197 | b03e831a78f2f16a5b04bf7f324b7e5e 198 | 1f20ff37655c5dd61aa01ae491663d9 199 | 6847480bd905f05b544654c1c7449887 200 | f81ae8a4452ad290aa9bbcb26e1c5ea7 201 | f269ef3a1c758432e8d6be23f236225a 202 | ff77dc4561e1a8a531d119333f70ecc8 203 | 72d110284cdf597e68b6f3ae18faf6b7 204 | b090b42f3dc0e7a4aa7c6f19b4833a28 205 | 2b17c0705ee0426e53b2b4f48361e0b2 206 | 5e1c4ca986d216866554a94f24190b8a 207 | 697c8a9055e5ff2ea7a62969e8bea32d 208 | 2615224e88e47ed29e5ca238b1551011 209 | 703e4a7096ac1aba8f7e96a8530f50cf 210 | 6f8bb01950141f63b3e3c8d3ee0e8f52 211 | 2e54c2bad5d117994daa4565dd30535 212 | 57b1795508e5f9d19996f95a20b4c45a 213 | 9a7b0effb53375625f647c1b0a6369bc 214 | df73ce22935c8081b04c44c0f84a941e 215 | 7eedbeaa5216ff06ccd600f441988364 216 | 52ad452f1c63aee5a66bcb069f7626a7 217 | 2b58ca08b8f93769c5408f4f799fe72 218 | e1a43edb6152a3726e23bf72aec61fd1 219 | 22a66588db3822831d20b5ad5ef1cb1b 220 | 8c0199fb20e7d4d391347c63d1dae43c 221 | c89c8eca488d5072cdd34f38f87d26cf 222 | 4bd85ce20325ba7442c20743f866e1a6 223 | 2abe34f72a7ed4eb0d00cfc385a039b 224 | c8f85606ab95f0bd75086ae01906f5ab 225 | b093af9dabb14b70cfd826dd468a5497 226 | 2571a0b3d1eb9280f26f17fb5c4740a9 227 | 7ee49cd8ad72bfd2c620cf302459a7d3 228 | 6a5f7a634b13ea7a94daa4565dd30535 229 | beacf34e9b0c0597894b951d14f8e56 230 | 7e16ed13ded8aba83f59687345e725a 231 | 9e3c0b7fb69ec3997cd1f8dd6fbce8fb 232 | d703643f4a4f76a16c63b8b48495261a 233 | 6c1cfb2fe245b969c2e818a707fdb3e0 234 | c15004cb38217b33af018ffb2ed4ff85 235 | 9d3f9edb3fe0ada39bddaef1ba7e1752 236 | 5a2bdc97e9d6683077f1d7a36adeef7b 237 | 370ab590d5f9f6e12998de2923cbf8ed 238 | 2d847f7ada349864a4f87aa9a31cd70 239 | c1b48711737649616a740b8023d40f30 240 | ffacadade68cec7b926a1ee5a429907 241 | 995547c0276be2626bd4106c65ec103c 242 | 395ce591ad2e2d9be47b958d3d1f5177 243 | f90a485c72b6047b102edba1bfa321c4 244 | 7b602de66f5eff247991cd6455da4fb3 245 | 123c021333485d698a75485f44bcc744 246 | dace99ad1144747eaec7ac3c7340a2f9 247 | 2988a53fc376653aae529ab4a75c4af 248 | ddf03991440ea0d15eb13ba95b07c9cb 249 | 65e829c5a8a52b9491347c63d1dae43c 250 | 703c1f85dc01baad9fb3e3631a88cdab 251 | f91e712b124915514b6c44ccda750d2e 252 | 65be4fb7c78125eda52f887aa13ba9c2 253 | e11279543f1e3ea015ebc00dd3588bef 254 | e88c7403ff401716b7002bddf0942f8e 255 | c21024d97247df5ae922b610a625137b 256 | 8e8a38abbfa3ddec942654e703edf3c5 257 | 847e8fedddf6bee5518c49741aed1bc1 258 | 9bedc0d32c657b5a95003e7aecc71b93 259 | 8faf5fbe39f67f3dfa2eb3102eea4e72 260 | 54da496566d05afb568b456e2715b08f 261 | 93c013c922b90649ec08eb6485163157 262 | 816efac46f2f3c99452a4c76a476a0f6 263 | 2e620c48f90f6fb2f569f587daa38158 264 | a28a7d34ad5f006f959df312c935a698 265 | 887be2603a56d8acc13b4b8de5611825 266 | 73c6ef5ee071b7f9791ed0cd6a81047 267 | c6e127fca727e2be3d312efac35b8a09 268 | 8d5e3b659cf0df154327dc86b5ea9517 269 | 95de565a937cc4ccdb024f6e72f57630 270 | 35960e065788a31b123c06ea72522927 271 | 377ea2491f8db13c4808655181d482fb 272 | f3f66f0bce27d439c1dbab1d1ee81853 273 | 5fd1b1b185638c49c13c29cdfe828247 274 | 4214845c44563c5fb1bb46d2556ba67d 275 | 602df167ba6cb5f5443efa8c2bef3b97 276 | d09202ccf8fa18d7de6289e76b045123 277 | 6ea8d00d7359f08f9e4614310319ea50 278 | 1eac28fe0b2d620bf0f75e254acd7ce4 279 | bacbb452a0f6917a663e90eaf6b4ca52 280 | 389d122da973fd5cd812ac1676a22587 281 | e93a47089f5c03fb7220891f188bc420 282 | c993c40ab88b161e3cedf90fdd80720e 283 | 6fd433c69f9c498a12d1578498a3b488 284 | 7890b89eba662af0ce90854bc9efdc95 285 | 1f846bab69b20a23561fc06c3ebd59d2 286 | f8b80289dbba94bdb7002bddf0942f8e 287 | c680824e615c772d18d5c097fe7ed300 288 | 411da0cd0b0089362b249fd16295bbfb 289 | f99537c4b6d50126d87c63d8b3018b58 290 | 1d5ff455b6ebd04e413559acd5524c40 291 | 1abf3b20f05ed8ea902d6f4ac8edb5f4 292 | 7aba61c9096ce60b7002bddf0942f8e 293 | c8f5f746daa5bd96b34ff70ac6c9e4d5 294 | 2212bb44240a9f0b57cf4c4836e6df44 295 | 921a5d88994aa99c71327f667b2179b0 296 | 2e958577e7756f59bf9717d602b327f4 297 | 83122dd93e3f42c08099d0cb75c1d1e1 298 | 2ba37ef44fa116f8300ca77569ad3884 299 | 2ee1a459db90488826fea6918e74b120 300 | e82e97e22066a75d798832e32e32aae6 301 | 83aa90436933149311c337781d78350b 302 | 6d6e65b938b88eaf3a4406b2a58a646a 303 | f12f615701b9fd31a9e77d2a83027228 304 | bdc39427c6267262c541ae04c251c7da 305 | ae65e1f6bb539fa775e66ae917e551ed 306 | eba55caf770565989c063286c702ba92 307 | 368dadba3b837dd926be51fab07b7ec6 308 | 4140a889b730d00cc613c8345c33a85a 309 | 957ac9708448e111f0ef63bb932093ce 310 | 9004946f75082a8632c0857fb4bcf47a 311 | 97b9c8f223390554e2584b7a39a94cb9 312 | 3897d265d993ee2a1fabf3cbd0fc77bc 313 | b5b320871c5dd884a24134966691a2dc 314 | bb601d5ded9bdc00746ffcbc44510229 315 | 854728b0055ec423e4f0b6b21d3809cf 316 | 2e6a74a610868d5be1e91cfa8fea7dba 317 | be8efba4b5c1cbfb94daa4565dd30535 318 | 71d6ab6979e5a313dde8c025d72da437 319 | c45f67b42b7febf52b249fd16295bbfb 320 | f18739a47f1f08e08510ad9ae6ed36b6 321 | 4464fb8cf0d04cb732c0857fb4bcf47a 322 | 2c8725b9a09b6d0a44ebbc705ad8c07 323 | d4079a1fa9c5eee8a3599da6d4b3696d 324 | a13e0728cbc8a41594ebaf95f022dfde 325 | f73392abd103857666ab813654be63ca 326 | e4717ec5f7e12fbf07aa2d157764a08 327 | 92f08b4bd8aed9bedc2616ac929c8116 328 | b9c516eec45c825979283d5c77809cc1 329 | 1f9315ee16e03c64450e0a3087ad6863 330 | 39ee3af7e07310f494daa4565dd30535 331 | 72f3510fb835c3557c0ab7347b9e831a 332 | cdfe819679f7c2e2916576b265053633 333 | 438a1ce3825bc06a18803813f0c0dee8 334 | 4d8ae6327ab4ed301e66f1783a4812d7 335 | 522614512d74a2f8c5f391634c2a5ade 336 | 20c2e1a09d00f51294daa4565dd30535 337 | ac479ce45b04972891bdbed880f31c72 338 | 10e10b663a81801148c1c53e2c827229 339 | a0b661c93028d7de798832e32e32aae6 340 | 9d8d5086930871efe2e5f41247736024 341 | dfd7315b7f8a07ca67585a906cb87a62 342 | 24a0d85f723fed2d7f332834f123f44 343 | 59a363d3852757572b249fd16295bbfb 344 | 49075ee8db9d66538d1140748efc85ed 345 | 9114091d7dce55242e5cac9166d7a1f5 346 | 698f399e6c578386b64d3e1832079349 347 | 7551b29b91fa4d47ca732a92ee1dda3b 348 | ace32fcd2b6c3fd081e9f45621d2c8eb 349 | 739a6f209a49040a4f44d84b9baa5f42 350 | 1fb578de4aebcd62b249fd16295bbfb 351 | 7af3abe01d2ba4ddf09d36263ac1039c 352 | e2595bc7ef0809097c0ab7347b9e831a 353 | a4d9445d191c80a235a6b421c152ac60 354 | e92386352c19221ac99bbfcf5650bf52 355 | 8a553a23adde929ceb2c303a0e0d287b 356 | ba5723d5cab50a0b7d86b3749977e29 357 | bc698a05ff49b6e06d793283e2a4a87e 358 | 758c75266d7788c0f5678db9e73ab77e 359 | d317c39473534f97b1bb46d2556ba67d 360 | 3f3043e275bac07a6f315eca7454150f 361 | 751aeec5f1d50668332d76467c18dfde 362 | d37263bdd876ddf6f885c09aa3e51c57 363 | 37b4b837ca7da6a4561fc06c3ebd59d2 364 | 49665c3dca5441d77c0ab7347b9e831a 365 | 1378b7d4dc05adba9069b3c9aa123329 366 | 33e3b187089a68d3f983f6a1267b9260 367 | a99574a44a78208981f422b7e55b97ef 368 | c8414ce9b8848c3c1a3ad8aa8e24c7d1 369 | 76dab7acad83682765aae3dfe86a49ae 370 | 84097ba1b35f844ceb2c303a0e0d287b 371 | 4e3cd4d3b11584dda70cfb3232f40c6 372 | 33f7a4ca412285334616fd0dc3d5279 373 | 786f18c5f99f7006b1d1509c24a9f631 374 | ffffe224db39febe288b05b36358465d 375 | 5fb24b87514df43a82b0247bfa21216b 376 | 8605c975778dc8634c634743f56177d4 377 | 98da594a65640370c8333f6c4d99e2c8 378 | -------------------------------------------------------------------------------- /demo/03001627_17e916fc863540ee3def89b32cef8e45_20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laughtervv/DISN/f8206adb45f8a0714eaefcae8433337cd562b82a/demo/03001627_17e916fc863540ee3def89b32cef8e45_20.png -------------------------------------------------------------------------------- /isosurface/LIB_PATH: -------------------------------------------------------------------------------- 1 | export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./isosurface/:/home/xharlie/dev/isosurface/tbb/tbb2018_20180822oss/lib/intel64/gcc4.7:/opt/intel/lib/intel64:/opt/intel/mkl/lib/intel64:/usr/local/lib64:/usr/local/lib:/usr/local/cuda/lib64 2 | -------------------------------------------------------------------------------- /isosurface/computeDistanceField: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laughtervv/DISN/f8206adb45f8a0714eaefcae8433337cd562b82a/isosurface/computeDistanceField -------------------------------------------------------------------------------- /isosurface/computeMarchingCubes: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laughtervv/DISN/f8206adb45f8a0714eaefcae8433337cd562b82a/isosurface/computeMarchingCubes -------------------------------------------------------------------------------- /isosurface/displayDistanceField: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laughtervv/DISN/f8206adb45f8a0714eaefcae8433337cd562b82a/isosurface/displayDistanceField -------------------------------------------------------------------------------- /isosurface/libtcmalloc.so.4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laughtervv/DISN/f8206adb45f8a0714eaefcae8433337cd562b82a/isosurface/libtcmalloc.so.4 -------------------------------------------------------------------------------- /models/CNN/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laughtervv/DISN/f8206adb45f8a0714eaefcae8433337cd562b82a/models/CNN/__init__.py -------------------------------------------------------------------------------- /models/CNN/alexnet.py: -------------------------------------------------------------------------------- 1 | """This is an TensorFLow implementation of AlexNet by Alex Krizhevsky at all. 2 | Paper: 3 | (http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf) 4 | Explanation can be found in my blog post: 5 | https://kratzert.github.io/2017/02/24/finetuning-alexnet-with-tensorflow.html 6 | This script enables finetuning AlexNet on any given Dataset with any number of 7 | classes. The structure of this script is strongly inspired by the fast.ai 8 | Deep Learning class by Jeremy Howard and Rachel Thomas, especially their vgg16 9 | finetuning script: 10 | Link: 11 | - https://github.com/fastai/courses/blob/master/deeplearning1/nbs/vgg16.py 12 | The pretrained weights can be downloaded here and should be placed in the same 13 | folder as this file: 14 | - http://www.cs.toronto.edu/~guerzhoy/tf_alexnet/ 15 | @author: Frederik Kratzert (contact: f.kratzert(at)gmail.com) 16 | """ 17 | 18 | import tensorflow as tf 19 | import numpy as np 20 | 21 | 22 | class AlexNet(object): 23 | """Implementation of the AlexNet.""" 24 | 25 | def __init__(self, x, skip_layer, is_training, num_classes = 1024, keep_prob = 0.7, 26 | weights_path='DEFAULT'): 27 | """Create the graph of the AlexNet model. 28 | Args: 29 | x: Placeholder for the input tensor. 30 | keep_prob: Dropout probability. 31 | num_classes: Number of classes in the dataset. 32 | skip_layer: List of names of the layer, that get trained from 33 | scratch 34 | weights_path: Complete path to the pretrained weight file, if it 35 | isn't in the same folder as this code 36 | """ 37 | # Parse input arguments into class variables 38 | self.X = x 39 | self.NUM_CLASSES = num_classes 40 | self.KEEP_PROB = keep_prob 41 | self.SKIP_LAYER = skip_layer 42 | self.is_training = is_training 43 | 44 | if weights_path == 'DEFAULT': 45 | self.WEIGHTS_PATH = '/media/ssd/projects/pointnet/pointnet/pointnet2/models/alexnet/bvlc_alexnet.npy' 46 | else: 47 | self.WEIGHTS_PATH = weights_path 48 | 49 | # Call the create function to build the computational graph of AlexNet 50 | self.create() 51 | 52 | def create(self): 53 | """Create the network graph.""" 54 | # 1st Layer: Conv (w ReLu) -> Lrn -> Pool 55 | conv1 = conv(self.X, 11, 11, 96, 1, 1, padding='VALID', name='conv1') 56 | norm1 = lrn(conv1, 2, 2e-05, 0.75, name='norm1') 57 | pool1 = max_pool(norm1, 3, 3, 2, 2, padding='VALID', name='pool1') 58 | 59 | # 2nd Layer: Conv (w ReLu) -> Lrn -> Pool with 2 groups 60 | conv2 = conv(pool1, 5, 5, 256, 1, 1, groups=2, name='conv2') 61 | norm2 = lrn(conv2, 2, 2e-05, 0.75, name='norm2') 62 | pool2 = max_pool(norm2, 3, 3, 2, 2, padding='VALID', name='pool2') 63 | 64 | # 3rd Layer: Conv (w ReLu) 65 | conv3 = conv(pool2, 3, 3, 384, 1, 1, name='conv3') 66 | 67 | # 4th Layer: Conv (w ReLu) splitted into two groups 68 | conv4 = conv(conv3, 3, 3, 384, 1, 1, groups=2, name='conv4') 69 | 70 | # 5th Layer: Conv (w ReLu) -> Pool splitted into two groups 71 | conv5 = conv(conv4, 3, 3, 256, 1, 1, groups=2, name='conv5') 72 | 73 | pool5 = max_pool(conv5, 3, 3, 2, 2, padding='VALID', name='pool5') 74 | 75 | print ('pool5', pool5.shape) 76 | # 6th Layer: Flatten -> FC (w ReLu) -> Dropout 77 | # flattened = tf.reshape(pool5, [-1, 6*6*256]) 78 | # fc6 = fc(flattened, 6*6*256, 4096, name='fc6') 79 | # dropout6 = dropout(fc6, self.KEEP_PROB) 80 | fc6 = conv(pool5, 11, 11, 4096, 1, 1, padding='VALID', name='fc6') 81 | print ('fc6', fc6.shape) 82 | dropout6 = tf.layers.dropout(fc6, self.KEEP_PROB, training = self.is_training) 83 | 84 | # # 7th Layer: FC (w ReLu) -> Dropout 85 | # fc7 = fc(dropout6, 4096, 4096, name='fc7') 86 | # dropout7 = dropout(fc7, self.KEEP_PROB) 87 | fc7 = conv(dropout6, 1, 1, 4096, 1, 1, padding='VALID', name='fc7') 88 | dropout7 = tf.layers.dropout(fc7, self.KEEP_PROB, training = self.is_training) 89 | 90 | # 8th Layer: FC and return unscaled activations 91 | # self.out = fc(dropout7, 4096, self.NUM_CLASSES, relu=False, name='fc8') 92 | self.out = conv(dropout7, 1, 1, 4096, 1, 1, padding='VALID', relu=False, name='fc8') 93 | 94 | def load_initial_weights(self, session): 95 | """Load weights from file into network. 96 | As the weights from http://www.cs.toronto.edu/~guerzhoy/tf_alexnet/ 97 | come as a dict of lists (e.g. weights['conv1'] is a list) and not as 98 | dict of dicts (e.g. weights['conv1'] is a dict with keys 'weights' & 99 | 'biases') we need a special load function 100 | """ 101 | # Load the weights into memory 102 | weights_dict = np.load(self.WEIGHTS_PATH, encoding='bytes').item() 103 | 104 | # Loop over all layer names stored in the weights dict 105 | for op_name in weights_dict: 106 | 107 | # Check if layer should be trained from scratch 108 | if op_name not in self.SKIP_LAYER: 109 | 110 | with tf.variable_scope(op_name, reuse=True): 111 | 112 | # Assign weights/biases to their corresponding tf variable 113 | for data in weights_dict[op_name]: 114 | 115 | # Biases 116 | if len(data.shape) == 1: 117 | var = tf.get_variable('biases', trainable=False) 118 | session.run(var.assign(data)) 119 | 120 | # Weights 121 | else: 122 | var = tf.get_variable('weights', trainable=False) 123 | session.run(var.assign(data)) 124 | 125 | 126 | def conv(x, filter_height, filter_width, num_filters, stride_y, stride_x, name, 127 | padding='VALID', groups=1, relu = True): 128 | """Create a convolution layer. 129 | Adapted from: https://github.com/ethereon/caffe-tensorflow 130 | """ 131 | # Get number of input channels 132 | input_channels = int(x.get_shape()[-1]) 133 | 134 | # Create lambda function for the convolution 135 | convolve = lambda i, k: tf.nn.conv2d(i, k, 136 | strides=[1, stride_y, stride_x, 1], 137 | padding=padding) 138 | 139 | with tf.variable_scope(name) as scope: 140 | # Create tf variables for the weights and biases of the conv layer 141 | weights = tf.get_variable('weights', shape=[filter_height, 142 | filter_width, 143 | input_channels/groups, 144 | num_filters]) 145 | biases = tf.get_variable('biases', shape=[num_filters]) 146 | 147 | if groups == 1: 148 | conv = convolve(x, weights) 149 | 150 | # In the cases of multiple groups, split inputs & weights and 151 | else: 152 | # Split input and weights and convolve them separately 153 | input_groups = tf.split(axis=3, num_or_size_splits=groups, value=x) 154 | weight_groups = tf.split(axis=3, num_or_size_splits=groups, 155 | value=weights) 156 | output_groups = [convolve(i, k) for i, k in zip(input_groups, weight_groups)] 157 | 158 | # Concat the convolved output together again 159 | conv = tf.concat(axis=3, values=output_groups) 160 | 161 | # Add biases 162 | bias = tf.reshape(tf.nn.bias_add(conv, biases), tf.shape(conv)) 163 | 164 | # Apply relu function 165 | 166 | if relu: 167 | relu = tf.nn.relu(bias, name=scope.name) 168 | 169 | return relu 170 | else: 171 | return bias 172 | 173 | 174 | def fc(x, num_in, num_out, name, relu=True): 175 | """Create a fully connected layer.""" 176 | with tf.variable_scope(name) as scope: 177 | 178 | # Create tf variables for the weights and biases 179 | weights = tf.get_variable('weights', shape=[num_in, num_out], 180 | trainable=True) 181 | biases = tf.get_variable('biases', [num_out], trainable=True) 182 | 183 | # Matrix multiply weights and inputs and add bias 184 | act = tf.nn.xw_plus_b(x, weights, biases, name=scope.name) 185 | 186 | if relu: 187 | # Apply ReLu non linearity 188 | relu = tf.nn.relu(act) 189 | return relu 190 | else: 191 | return act 192 | 193 | 194 | def max_pool(x, filter_height, filter_width, stride_y, stride_x, name, 195 | padding='SAME'): 196 | """Create a max pooling layer.""" 197 | return tf.nn.max_pool(x, ksize=[1, filter_height, filter_width, 1], 198 | strides=[1, stride_y, stride_x, 1], 199 | padding=padding, name=name) 200 | 201 | 202 | def lrn(x, radius, alpha, beta, name, bias=1.0): 203 | """Create a local response normalization layer.""" 204 | return tf.nn.local_response_normalization(x, depth_radius=radius, 205 | alpha=alpha, beta=beta, 206 | bias=bias, name=name) 207 | 208 | 209 | def dropout(x, keep_prob): 210 | """Create a dropout layer.""" 211 | return tf.nn.dropout(x, keep_prob) 212 | 213 | -------------------------------------------------------------------------------- /models/CNN/resnet.py: -------------------------------------------------------------------------------- 1 | import tensorflow as tf 2 | from tensorflow.contrib.slim.python.slim.nets import resnet_v1 3 | from tensorflow.contrib.framework.python.framework import checkpoint_utils 4 | import cv2 5 | 6 | slim = tf.contrib.slim 7 | resnet_v1 = resnet_v1 8 | 9 | if __name__ == "__main__": 10 | #print ("unitest for resnet") 11 | batch_size = 10 12 | img_size = 256 13 | img = cv2.imread('/mnt/ilcompf8d0/user/weiyuewa/sources/pipeline1/tf_neural_renderer/img.png') 14 | 15 | # with tf.Session('') as sess: 16 | 17 | with tf.device('/gpu:0'): 18 | inputbatch = tf.expand_dims(tf.constant(img, dtype=tf.float32), axis=0)#tf.zeros([batch_size, img_size, img_size, 3]) 19 | 20 | logits, endpoints = resnet_v1.resnet_v1_50(inputbatch, 1000, is_training=False) 21 | 22 | config = tf.ConfigProto() 23 | config.gpu_options.allow_growth = True 24 | config.allow_soft_placement = True 25 | config.log_device_placement = False 26 | sess = tf.Session(config=config) 27 | variables_to_restore = [] 28 | 29 | a = [name for name, _ in checkpoint_utils.list_variables('pretrained_model/resnet_v1_50.ckpt')] 30 | # print a 31 | for var in slim.get_model_variables(): 32 | if (var.op.name.startswith('resnet_v1_50')) and (var.op.name in a) and ('logits' not in var.op.name): 33 | variables_to_restore.append(var) 34 | # print variables_to_restore 35 | # slim.assign_from_checkpoint_fn('pretrained_model/resnet_v1_50.ckpt', variables_to_restore, ignore_missing_vars=False) 36 | init = tf.global_variables_initializer() 37 | sess.run(init) 38 | 39 | saver = tf.train.Saver(variables_to_restore) 40 | saver.restore(sess, 'pretrained_model/resnet_v1_50.ckpt') 41 | # print a.keys() 42 | 43 | cls_val = sess.run(logits) 44 | print cls_val 45 | 46 | # print logits 47 | print endpoints.keys() -------------------------------------------------------------------------------- /models/posenet.py: -------------------------------------------------------------------------------- 1 | import tensorflow as tf 2 | import os 3 | import sys 4 | BASE_DIR = os.path.dirname(os.path.abspath(__file__)) 5 | ROOT_DIR = os.path.dirname(BASE_DIR) 6 | sys.path.append(os.path.join(ROOT_DIR)) 7 | sys.path.append(os.path.join(ROOT_DIR,'..')) 8 | sys.path.append(os.path.join(ROOT_DIR, 'models')) 9 | sys.path.append(os.path.join(ROOT_DIR, 'utils')) 10 | import tf_util 11 | 12 | # batch*n 13 | def normalize_vector(v): 14 | batch=v.shape[0] 15 | 16 | v_mag = tf.sqrt(tf.reduce_sum(tf.square(v), axis=1, keepdims=True)) 17 | v_mag = tf.maximum(v_mag, 1e-8) 18 | v = v / v_mag 19 | return v 20 | 21 | ###################### 22 | def compute_rotation_matrix_from_ortho6d(poses): 23 | x_raw = poses[:,0:3]#batch*3 24 | y_raw = poses[:,3:6]#batch*3 25 | x = normalize_vector(x_raw) #batch*3 26 | z = tf.linalg.cross(x,y_raw) #batch*3 27 | z = normalize_vector(z)#batch*3 28 | y = tf.linalg.cross(z,x) #batch*3 29 | print('x', x.shape, 'y', y.shape, 'z', z.shape) 30 | x = tf.reshape(x, [-1, 3, 1]) 31 | y = tf.reshape(y, [-1, 3, 1]) 32 | z = tf.reshape(z, [-1, 3, 1]) 33 | matrix = tf.concat((x,y,z), 2) #batch*3*3 34 | print('matrix', matrix.shape) 35 | 36 | return matrix 37 | 38 | def compute_geodesic_distance_from_two_matrices(m1, m2): 39 | batch=m1.shape[0] 40 | m = tf.matmul(m1, tf.transpose(m2, [0,2,1])) #batch*3*3 41 | cos = (m[:,0,0] + m[:,1,1] + m[:,2,2] - 1) / 2. 42 | cos = tf.minimum(cos, 1.) 43 | cos = tf.maximum(cos, -1.) 44 | 45 | theta = tf.acos(cos) 46 | 47 | return theta 48 | 49 | ############# 50 | def get_cam_mat_shift(globalfeat, is_training, batch_size, bn, bn_decay, wd=None): 51 | 52 | with tf.variable_scope("scale") as scope: # 53 | scale = tf_util.fully_connected(globalfeat, 64, bn=bn, is_training=is_training, scope='fc1', bn_decay=bn_decay) 54 | scale = tf_util.fully_connected(scale, 32, bn=bn, is_training=is_training, scope='fc2', bn_decay=bn_decay) 55 | scale = tf_util.fully_connected(scale, 1, bn=bn, is_training=is_training, scope='fc3', activation_fn=None, bn_decay=bn_decay) 56 | pred_scale = tf.reshape(scale, [batch_size, 1, 1]) * tf.tile(tf.expand_dims(tf.eye(3), 0), [batch_size, 1, 1]) 57 | 58 | with tf.variable_scope("ortho6d") as scope: # 59 | rotation = tf_util.fully_connected(globalfeat, 512, bn=bn, is_training=is_training, scope='fc1', bn_decay=bn_decay) 60 | rotation = tf_util.fully_connected(rotation, 256, bn=bn, is_training=is_training, scope='fc2', bn_decay=bn_decay) 61 | rotation = tf_util.fully_connected(rotation, 6, bn=bn, is_training=is_training, scope='fc3', activation_fn=None, bn_decay=bn_decay) 62 | pred_rotation = tf.reshape(rotation, [batch_size, 6]) 63 | 64 | with tf.variable_scope("translation") as scope: 65 | translation = tf_util.fully_connected(globalfeat, 128, bn=bn, is_training=is_training, scope='fc1', bn_decay=bn_decay) 66 | translation = tf_util.fully_connected(translation, 64, bn=bn, is_training=is_training, scope='fc2', bn_decay=bn_decay) 67 | # w_trans_init = 68 | weights = tf.get_variable('fc3/weights', [64, 3], 69 | initializer=tf.truncated_normal_initializer(stddev=0.05, seed=1), 70 | dtype=tf.float32) 71 | biases = tf.get_variable('fc3/biases', [3], 72 | initializer=tf.constant_initializer(0.0), 73 | dtype=tf.float32) 74 | translation = tf.matmul(translation, weights) 75 | translation = tf.nn.bias_add(translation, biases) 76 | pred_translation = tf.reshape(translation, [batch_size, 3]) 77 | pred_translation += tf.constant([-0.00193892, 0.00169222, 1.3949631], dtype=tf.float32) 78 | 79 | with tf.variable_scope("xyshift") as scope: 80 | pred_xyshift = tf_util.fully_connected(globalfeat, 128, bn=bn, is_training=is_training, scope='fc1', bn_decay=bn_decay) 81 | pred_xyshift = tf_util.fully_connected(pred_xyshift, 64, bn=bn, is_training=is_training, scope='fc2', bn_decay=bn_decay) 82 | pred_xyshift = tf_util.fully_connected(pred_xyshift, 2, bn=bn, is_training=is_training, scope='fc3', activation_fn=None, bn_decay=bn_decay) 83 | pred_translation = tf.reshape(pred_translation, [batch_size, 1, 3]) 84 | pred_rotation_mat = compute_rotation_matrix_from_ortho6d(pred_rotation) 85 | pred_rotation_mat = tf.matmul(pred_scale, pred_rotation_mat) 86 | pred_RT = tf.concat([pred_rotation_mat, pred_translation], axis = 1) 87 | return pred_rotation_mat, pred_translation, pred_RT, pred_xyshift 88 | 89 | 90 | ############# 91 | def get_cam_mat(globalfeat, is_training, batch_size, bn, bn_decay, wd=None): 92 | 93 | with tf.variable_scope("scale") as scope: # 94 | scale = tf_util.fully_connected(globalfeat, 64, bn=bn, is_training=is_training, scope='fc1', bn_decay=bn_decay) 95 | scale = tf_util.fully_connected(scale, 32, bn=bn, is_training=is_training, scope='fc2', bn_decay=bn_decay) 96 | scale = tf_util.fully_connected(scale, 1, bn=bn, is_training=is_training, scope='fc3', activation_fn=None, bn_decay=bn_decay) 97 | pred_scale = tf.reshape(scale, [batch_size, 1, 1]) * tf.tile(tf.expand_dims(tf.eye(3), 0), [batch_size, 1, 1]) 98 | 99 | with tf.variable_scope("ortho6d") as scope: # 100 | rotation = tf_util.fully_connected(globalfeat, 512, bn=bn, is_training=is_training, scope='fc1', bn_decay=bn_decay) 101 | rotation = tf_util.fully_connected(rotation, 256, bn=bn, is_training=is_training, scope='fc2', bn_decay=bn_decay) 102 | rotation = tf_util.fully_connected(rotation, 6, bn=bn, is_training=is_training, scope='fc3', activation_fn=None, bn_decay=bn_decay) 103 | pred_rotation = tf.reshape(rotation, [batch_size, 6]) 104 | 105 | with tf.variable_scope("translation") as scope: 106 | translation = tf_util.fully_connected(globalfeat, 128, bn=bn, is_training=is_training, scope='fc1', bn_decay=bn_decay) 107 | translation = tf_util.fully_connected(translation, 64, bn=bn, is_training=is_training, scope='fc2', bn_decay=bn_decay) 108 | # w_trans_init = 109 | weights = tf.get_variable('fc3/weights', [64, 3], 110 | initializer=tf.truncated_normal_initializer(stddev=0.05, seed=1), 111 | dtype=tf.float32) 112 | biases = tf.get_variable('fc3/biases', [3], 113 | initializer=tf.constant_initializer(0.0), 114 | dtype=tf.float32) 115 | translation = tf.matmul(translation, weights) 116 | translation = tf.nn.bias_add(translation, biases) 117 | pred_translation = tf.reshape(translation, [batch_size, 3]) 118 | pred_translation += tf.constant([-0.00193892, 0.00169222, 1.3949631], dtype=tf.float32) 119 | 120 | pred_translation = tf.reshape(pred_translation, [batch_size, 1, 3]) 121 | pred_rotation_mat = compute_rotation_matrix_from_ortho6d(pred_rotation) 122 | pred_rotation_mat = tf.matmul(pred_scale, pred_rotation_mat) 123 | pred_RT = tf.concat([pred_rotation_mat, pred_translation], axis = 1) 124 | return pred_rotation_mat, pred_translation, pred_RT 125 | -------------------------------------------------------------------------------- /models/sdfnet.py: -------------------------------------------------------------------------------- 1 | import tensorflow as tf 2 | import tf_util 3 | 4 | def get_sdf_3dcnn(grid_idx, globalfeats, is_training, batch_size, num_point, bn, bn_decay, wd=None, FLAGS=None): 5 | 6 | globalfeats_expand = tf.reshape(globalfeats, [batch_size, 1, 1, 1, -1]) 7 | print('globalfeats_expand', globalfeats_expand.get_shape()) 8 | net2 = tf_util.conv3d_transpose(globalfeats_expand, 128, [2, 2, 2], stride=[2, 2, 2], 9 | bn_decay=bn_decay, bn=bn, 10 | is_training=is_training, weight_decay=wd, scope='3deconv1') # 2 11 | 12 | net2 = tf_util.conv3d_transpose(net2, 128, [3, 3, 3], stride=[2, 2, 2],bn_decay=bn_decay, bn=bn, 13 | is_training=is_training, weight_decay=wd, scope='3deconv2') # 4 14 | 15 | net2 = tf_util.conv3d_transpose(net2, 128, [3, 3, 3], stride=[2, 2, 2], bn_decay=bn_decay, bn=bn, 16 | is_training=is_training, weight_decay=wd, scope='3deconv3') # 8 17 | 18 | net2 = tf_util.conv3d_transpose(net2, 64, [3, 3, 3], stride=[2, 2, 2], bn_decay=bn_decay, bn=bn, 19 | is_training=is_training, weight_decay=wd, scope='3deconv4') # 16 20 | 21 | net2 = tf_util.conv3d_transpose(net2, 64, [3, 3, 3], stride=[2, 2, 2], bn_decay=bn_decay, bn=bn, 22 | is_training=is_training, weight_decay=wd, scope='3deconv5') # 32 23 | 24 | net2 = tf_util.conv3d_transpose(net2, 32, [3, 3, 3], stride=[2, 2, 2], bn_decay=bn_decay, bn=bn, 25 | is_training=is_training, weight_decay=wd, padding='VALID', scope='3deconv6') # 65 26 | 27 | net2 = tf_util.conv3d(net2, 1, [1, 1, 1], stride=[1, 1, 1], bn_decay=bn_decay, bn=bn, activation_fn=None, 28 | is_training=is_training, weight_decay=wd, padding='VALID', scope='3conv7') 29 | res_plus = FLAGS.sdf_res+1 30 | full_inter = tf.reshape(net2, (batch_size, res_plus, res_plus, res_plus)) 31 | 32 | print("3d cnn net2 shape:", full_inter.get_shape()) 33 | 34 | pred = tf.reshape(full_inter, [batch_size, -1, 1]) 35 | return pred 36 | 37 | def get_sdf_3dcnn_binary(grid_idx, globalfeats, is_training, batch_size, num_point, bn, bn_decay, wd=None, FLAGS=None): 38 | globalfeats_expand = tf.reshape(globalfeats, [batch_size, 1, 1, 1, -1]) 39 | print('globalfeats_expand', globalfeats_expand.get_shape()) 40 | net2 = tf_util.conv3d_transpose(globalfeats_expand, 128, [2, 2, 2], stride=[2, 2, 2], 41 | bn_decay=bn_decay, bn=bn, 42 | is_training=is_training, weight_decay=wd, scope='3deconv1') # 2 43 | 44 | net2 = tf_util.conv3d_transpose(net2, 128, [3, 3, 3], stride=[2, 2, 2],bn_decay=bn_decay, bn=bn, 45 | is_training=is_training, weight_decay=wd, scope='3deconv2') # 4 46 | 47 | net2 = tf_util.conv3d_transpose(net2, 128, [3, 3, 3], stride=[2, 2, 2], bn_decay=bn_decay, bn=bn, 48 | is_training=is_training, weight_decay=wd, scope='3deconv3') # 8 49 | 50 | net2 = tf_util.conv3d_transpose(net2, 64, [3, 3, 3], stride=[2, 2, 2], bn_decay=bn_decay, bn=bn, 51 | is_training=is_training, weight_decay=wd, scope='3deconv4') # 16 52 | 53 | net2 = tf_util.conv3d_transpose(net2, 64, [3, 3, 3], stride=[2, 2, 2], bn_decay=bn_decay, bn=bn, 54 | is_training=is_training, weight_decay=wd, scope='3deconv5') # 32 55 | 56 | net2 = tf_util.conv3d_transpose(net2, 32, [3, 3, 3], stride=[2, 2, 2], bn_decay=bn_decay, bn=bn, 57 | is_training=is_training, weight_decay=wd, padding='VALID', scope='3deconv6') # 65 58 | 59 | net2 = tf_util.conv3d(net2, 2, [1, 1, 1], stride=[1, 1, 1], bn_decay=bn_decay, bn=bn, activation_fn=None, 60 | is_training=is_training, weight_decay=wd, padding='VALID', scope='3conv7_binary') 61 | res_plus = FLAGS.sdf_res+1 62 | full_inter = tf.reshape(net2, (batch_size, res_plus, res_plus, res_plus)) 63 | 64 | print("3d cnn net2 shape:", full_inter.get_shape()) 65 | 66 | pred = tf.reshape(full_inter, [batch_size, -1, 2]) 67 | return pred 68 | 69 | def get_sdf_basic2(src_pc, globalfeats, is_training, batch_size, num_point, bn, bn_decay, wd=None): 70 | 71 | net2 = tf_util.conv2d(tf.expand_dims(src_pc,2), 64, [1,1], padding='VALID', stride=[1,1], bn_decay=bn_decay, bn=bn, is_training=is_training, 72 | weight_decay=wd, scope='fold1/conv1') 73 | net2 = tf_util.conv2d(net2, 256, [1,1], padding='VALID', stride=[1,1], bn_decay=bn_decay, bn=bn, is_training=is_training, 74 | weight_decay=wd, scope='fold1/conv2') 75 | net2 = tf_util.conv2d(net2, 512, [1,1], padding='VALID', stride=[1,1], bn_decay=bn_decay, bn=bn, is_training=is_training, 76 | weight_decay=wd, scope='fold1/conv3') 77 | 78 | globalfeats = tf.reshape(globalfeats, [batch_size, 1, 1, -1]) 79 | globalfeats_expand = tf.tile(globalfeats, [1, src_pc.get_shape()[1], 1, 1]) 80 | print( 'net2', net2.shape) 81 | print( 'globalfeats_expand', globalfeats_expand.shape) 82 | concat = tf.concat(axis=3, values=[net2, globalfeats_expand]) 83 | 84 | net2 = tf_util.conv2d(concat, 512, [1,1], padding='VALID', stride=[1,1], bn_decay=bn_decay, bn=bn, is_training=is_training, 85 | weight_decay=wd, scope='fold2/conv1') 86 | net2 = tf_util.conv2d(net2, 256, [1,1], padding='VALID', stride=[1,1], bn_decay=bn_decay, bn=bn, is_training=is_training, 87 | weight_decay=wd, scope='fold2/conv2') 88 | pred = tf_util.conv2d(net2, 1, [1,1], padding='VALID', stride=[1,1], activation_fn=None, bn=False, weight_decay=wd, scope='fold2/conv5') 89 | 90 | pred = tf.reshape(pred, [batch_size, -1, 1]) 91 | 92 | return pred 93 | 94 | 95 | def get_sdf_basic2_binary(src_pc, globalfeats, is_training, batch_size, num_point, bn, bn_decay, wd=None): 96 | 97 | net2 = tf_util.conv2d(tf.expand_dims(src_pc,2), 64, [1,1], padding='VALID', stride=[1,1], bn_decay=bn_decay, bn=bn, is_training=is_training, 98 | weight_decay=wd, scope='fold1/conv1') 99 | net2 = tf_util.conv2d(net2, 256, [1,1], padding='VALID', stride=[1,1], bn_decay=bn_decay, bn=bn, is_training=is_training, 100 | weight_decay=wd, scope='fold1/conv2') 101 | net2 = tf_util.conv2d(net2, 512, [1,1], padding='VALID', stride=[1,1], bn_decay=bn_decay, bn=bn, is_training=is_training, 102 | weight_decay=wd, scope='fold1/conv3') 103 | 104 | globalfeats = tf.reshape(globalfeats, [batch_size, 1, 1, -1]) 105 | globalfeats_expand = tf.tile(globalfeats, [1, src_pc.get_shape()[1], 1, 1]) 106 | print( 'net2', net2.shape) 107 | print( 'globalfeats_expand', globalfeats_expand.shape) 108 | concat = tf.concat(axis=3, values=[net2, globalfeats_expand]) 109 | 110 | net2 = tf_util.conv2d(concat, 512, [1,1], padding='VALID', stride=[1,1], bn_decay=bn_decay, bn=bn, is_training=is_training, 111 | weight_decay=wd, scope='fold2/conv1') 112 | net2 = tf_util.conv2d(net2, 256, [1,1], padding='VALID', stride=[1,1], bn_decay=bn_decay, bn=bn, is_training=is_training, 113 | weight_decay=wd, scope='fold2/conv2') 114 | pred = tf_util.conv2d(net2, 2, [1,1], padding='VALID', stride=[1,1], activation_fn=None, bn=False, weight_decay=wd, scope='fold2/conv5_bi') 115 | 116 | pred = tf.reshape(pred, [batch_size, -1, 2]) 117 | 118 | return pred 119 | 120 | 121 | def get_sdf_basic2_imgfeat_onestream(src_pc, globalfeats, point_feat, is_training, batch_size, num_point, bn, bn_decay, wd=None): 122 | 123 | net2 = tf_util.conv2d(tf.expand_dims(src_pc,2), 64, [1,1], padding='VALID', stride=[1,1], bn_decay=bn_decay, bn=bn, is_training=is_training, 124 | weight_decay=wd, scope='fold1/conv1') 125 | net2 = tf_util.conv2d(net2, 256, [1,1], padding='VALID', stride=[1,1], bn_decay=bn_decay, bn=bn, is_training=is_training, 126 | weight_decay=wd, scope='fold1/conv2') 127 | net2 = tf_util.conv2d(net2, 512, [1,1], padding='VALID', stride=[1,1], bn_decay=bn_decay, bn=bn, is_training=is_training, 128 | weight_decay=wd, scope='fold1/conv3') 129 | 130 | globalfeats = tf.reshape(globalfeats, [batch_size, 1, 1, -1]) 131 | globalfeats_expand = tf.tile(globalfeats, [1, src_pc.get_shape()[1], 1, 1]) 132 | print('net2', net2.shape) 133 | print('globalfeats_expand', globalfeats_expand.shape) 134 | concat = tf.concat(axis=3, values=[net2, globalfeats_expand, point_feat]) 135 | 136 | net2 = tf_util.conv2d(concat, 512, [1,1], padding='VALID', stride=[1,1], bn_decay=bn_decay, bn=bn, is_training=is_training, 137 | weight_decay=wd, scope='fold2/conv1') 138 | net2 = tf_util.conv2d(net2, 256, [1,1], padding='VALID', stride=[1,1], bn_decay=bn_decay, bn=bn, is_training=is_training, 139 | weight_decay=wd, scope='fold2/conv2') 140 | pred = tf_util.conv2d(net2, 1, [1,1], padding='VALID', stride=[1,1], activation_fn=None, bn=False, weight_decay=wd, scope='fold2/conv5') 141 | 142 | pred = tf.reshape(pred, [batch_size, -1, 1]) 143 | 144 | return pred 145 | 146 | def get_sdf_basic2_imgfeat_onestream_binary(src_pc, globalfeats, point_feat, is_training, batch_size, num_point, bn, bn_decay, wd=None): 147 | 148 | net2 = tf_util.conv2d(tf.expand_dims(src_pc,2), 64, [1,1], padding='VALID', stride=[1,1], bn_decay=bn_decay, bn=bn, is_training=is_training, 149 | weight_decay=wd, scope='fold1/conv1') 150 | net2 = tf_util.conv2d(net2, 256, [1,1], padding='VALID', stride=[1,1], bn_decay=bn_decay, bn=bn, is_training=is_training, 151 | weight_decay=wd, scope='fold1/conv2') 152 | net2 = tf_util.conv2d(net2, 512, [1,1], padding='VALID', stride=[1,1], bn_decay=bn_decay, bn=bn, is_training=is_training, 153 | weight_decay=wd, scope='fold1/conv3') 154 | 155 | globalfeats = tf.reshape(globalfeats, [batch_size, 1, 1, -1]) 156 | globalfeats_expand = tf.tile(globalfeats, [1, src_pc.get_shape()[1], 1, 1]) 157 | print('net2', net2.shape) 158 | print('globalfeats_expand', globalfeats_expand.shape) 159 | concat = tf.concat(axis=3, values=[net2, globalfeats_expand, point_feat]) 160 | 161 | net2 = tf_util.conv2d(concat, 512, [1,1], padding='VALID', stride=[1,1], bn_decay=bn_decay, bn=bn, is_training=is_training, 162 | weight_decay=wd, scope='fold2/conv1') 163 | net2 = tf_util.conv2d(net2, 256, [1,1], padding='VALID', stride=[1,1], bn_decay=bn_decay, bn=bn, is_training=is_training, 164 | weight_decay=wd, scope='fold2/conv2') 165 | pred = tf_util.conv2d(net2, 2, [1,1], padding='VALID', stride=[1,1], activation_fn=None, bn=False, weight_decay=wd, scope='fold2/conv5_bi') 166 | 167 | pred = tf.reshape(pred, [batch_size, -1, 2]) 168 | 169 | return pred 170 | 171 | def get_sdf_basic2_imgfeat_twostream(src_pc, point_feat, is_training, batch_size, num_point, bn, bn_decay, wd=None): 172 | 173 | net2 = tf_util.conv2d(tf.expand_dims(src_pc,2), 64, [1,1], padding='VALID', stride=[1,1], bn_decay=bn_decay, bn=bn, is_training=is_training, 174 | weight_decay=wd, scope='fold1/conv1') 175 | net2 = tf_util.conv2d(net2, 256, [1,1], padding='VALID', stride=[1,1], bn_decay=bn_decay, bn=bn, is_training=is_training, 176 | weight_decay=wd, scope='fold1/conv2') 177 | net2 = tf_util.conv2d(net2, 512, [1,1], padding='VALID', stride=[1,1], bn_decay=bn_decay, bn=bn, is_training=is_training, 178 | weight_decay=wd, scope='fold1/conv3') 179 | 180 | concat = tf.concat(axis=3, values=[net2, point_feat]) 181 | 182 | net2 = tf_util.conv2d(concat, 512, [1,1], padding='VALID', stride=[1,1], bn_decay=bn_decay, bn=bn, is_training=is_training, 183 | weight_decay=wd, scope='fold2/conv1') 184 | net2 = tf_util.conv2d(net2, 256, [1,1], padding='VALID', stride=[1,1], bn_decay=bn_decay, bn=bn, is_training=is_training, 185 | weight_decay=wd, scope='fold2/conv2') 186 | pred = tf_util.conv2d(net2, 1, [1,1], padding='VALID', stride=[1,1], activation_fn=None, bn=False, weight_decay=wd, scope='fold2/conv5') 187 | 188 | pred = tf.reshape(pred, [batch_size, -1, 1]) 189 | 190 | return pred 191 | 192 | def get_sdf_basic2_imgfeat_twostream_binary(src_pc, point_feat, is_training, batch_size, num_point, bn, bn_decay, wd=None): 193 | 194 | net2 = tf_util.conv2d(tf.expand_dims(src_pc,2), 64, [1,1], padding='VALID', stride=[1,1], bn_decay=bn_decay, bn=bn, is_training=is_training, 195 | weight_decay=wd, scope='fold1/conv1') 196 | net2 = tf_util.conv2d(net2, 256, [1,1], padding='VALID', stride=[1,1], bn_decay=bn_decay, bn=bn, is_training=is_training, 197 | weight_decay=wd, scope='fold1/conv2') 198 | net2 = tf_util.conv2d(net2, 512, [1,1], padding='VALID', stride=[1,1], bn_decay=bn_decay, bn=bn, is_training=is_training, 199 | weight_decay=wd, scope='fold1/conv3') 200 | 201 | concat = tf.concat(axis=3, values=[net2, point_feat]) 202 | 203 | net2 = tf_util.conv2d(concat, 512, [1,1], padding='VALID', stride=[1,1], bn_decay=bn_decay, bn=bn, is_training=is_training, 204 | weight_decay=wd, scope='fold2/conv1') 205 | net2 = tf_util.conv2d(net2, 256, [1,1], padding='VALID', stride=[1,1], bn_decay=bn_decay, bn=bn, is_training=is_training, 206 | weight_decay=wd, scope='fold2/conv2') 207 | pred = tf_util.conv2d(net2, 2, [1,1], padding='VALID', stride=[1,1], activation_fn=None, bn=False, weight_decay=wd, scope='fold2/conv5_bi') 208 | 209 | pred = tf.reshape(pred, [batch_size, -1, 2]) 210 | 211 | return pred 212 | -------------------------------------------------------------------------------- /models/tf_ops/approxmatch/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laughtervv/DISN/f8206adb45f8a0714eaefcae8433337cd562b82a/models/tf_ops/approxmatch/__init__.py -------------------------------------------------------------------------------- /models/tf_ops/approxmatch/tf_approxmatch.py: -------------------------------------------------------------------------------- 1 | """ Approxmiate algorithm for computing the Earch Mover's Distance. 2 | 3 | Original author: Haoqiang Fan 4 | Modified by Charles R. Qi 5 | """ 6 | 7 | import tensorflow as tf 8 | from tensorflow.python.framework import ops 9 | import sys 10 | import os 11 | BASE_DIR = os.path.dirname(os.path.abspath(__file__)) 12 | approxmatch_module=tf.load_op_library(os.path.join(BASE_DIR, 'tf_approxmatch_so.so')) 13 | def approx_match(xyz1,xyz2): 14 | ''' 15 | input: 16 | xyz1 : batch_size * #dataset_points * 3 17 | xyz2 : batch_size * #query_points * 3 18 | returns: 19 | match : batch_size * #query_points * #dataset_points 20 | ''' 21 | return approxmatch_module.approx_match(xyz1,xyz2) 22 | ops.NoGradient('ApproxMatch') 23 | #@tf.RegisterShape('ApproxMatch') 24 | #def _approx_match_shape(op): 25 | # shape1=op.inputs[0].get_shape().with_rank(3) 26 | # shape2=op.inputs[1].get_shape().with_rank(3) 27 | # return [tf.TensorShape([shape1.dims[0],shape2.dims[1],shape1.dims[1]])] 28 | 29 | def match_cost(xyz1,xyz2,match): 30 | ''' 31 | input: 32 | xyz1 : batch_size * #dataset_points * 3 33 | xyz2 : batch_size * #query_points * 3 34 | match : batch_size * #query_points * #dataset_points 35 | returns: 36 | cost : batch_size 37 | ''' 38 | return approxmatch_module.match_cost(xyz1,xyz2,match) 39 | #@tf.RegisterShape('MatchCost') 40 | #def _match_cost_shape(op): 41 | # shape1=op.inputs[0].get_shape().with_rank(3) 42 | # shape2=op.inputs[1].get_shape().with_rank(3) 43 | # shape3=op.inputs[2].get_shape().with_rank(3) 44 | # return [tf.TensorShape([shape1.dims[0]])] 45 | @tf.RegisterGradient('MatchCost') 46 | def _match_cost_grad(op,grad_cost): 47 | xyz1=op.inputs[0] 48 | xyz2=op.inputs[1] 49 | match=op.inputs[2] 50 | grad_1,grad_2=approxmatch_module.match_cost_grad(xyz1,xyz2,match) 51 | return [grad_1*tf.expand_dims(tf.expand_dims(grad_cost,1),2),grad_2*tf.expand_dims(tf.expand_dims(grad_cost,1),2),None] 52 | 53 | if __name__=='__main__': 54 | alpha=0.5 55 | beta=2.0 56 | import numpy as np 57 | import math 58 | import random 59 | import cv2 60 | 61 | 62 | npoint=100 63 | 64 | pt_in=tf.placeholder(tf.float32,shape=(1,npoint*4,3)) 65 | mypoints=tf.Variable(np.random.randn(1,npoint,3).astype('float32')) 66 | match=approx_match(pt_in,mypoints) 67 | loss=tf.reduce_sum(match_cost(pt_in,mypoints,match)) 68 | #match=approx_match(mypoints,pt_in) 69 | #loss=tf.reduce_sum(match_cost(mypoints,pt_in,match)) 70 | #loss=tf.reduce_sum((distf+1e-9)**0.5)*0.5+tf.reduce_sum((distb+1e-9)**0.5)*0.5 71 | #loss=tf.reduce_max((distf+1e-9)**0.5)*0.5*npoint+tf.reduce_max((distb+1e-9)**0.5)*0.5*npoint 72 | 73 | optimizer=tf.train.GradientDescentOptimizer(1e-4).minimize(loss) 74 | 75 | with tf.Session('') as sess: 76 | sess.run(tf.initialize_all_variables()) 77 | while True: 78 | meanloss=0 79 | meantrueloss=0 80 | for i in xrange(1001): 81 | #phi=np.random.rand(4*npoint)*math.pi*2 82 | #tpoints=(np.hstack([np.cos(phi)[:,None],np.sin(phi)[:,None],(phi*0)[:,None]])*random.random())[None,:,:] 83 | #tpoints=((np.random.rand(400)-0.5)[:,None]*[0,2,0]+[(random.random()-0.5)*2,0,0]).astype('float32')[None,:,:] 84 | tpoints=np.hstack([np.linspace(-1,1,400)[:,None],(random.random()*2*np.linspace(1,0,400)**2)[:,None],np.zeros((400,1))])[None,:,:] 85 | trainloss,_=sess.run([loss,optimizer],feed_dict={pt_in:tpoints.astype('float32')}) 86 | trainloss,trainmatch=sess.run([loss,match],feed_dict={pt_in:tpoints.astype('float32')}) 87 | #trainmatch=trainmatch.transpose((0,2,1)) 88 | show=np.zeros((400,400,3),dtype='uint8')^255 89 | trainmypoints=sess.run(mypoints) 90 | for i in xrange(len(tpoints[0])): 91 | u=np.random.choice(range(len(trainmypoints[0])),p=trainmatch[0].T[i]) 92 | # cv2.line(show, 93 | # (int(tpoints[0][i,1]*100+200),int(tpoints[0][i,0]*100+200)), 94 | # (int(trainmypoints[0][u,1]*100+200),int(trainmypoints[0][u,0]*100+200))) 95 | # for x,y,z in tpoints[0]: 96 | # cv2.circle(show,(int(y*100+200),int(x*100+200)),2) 97 | # for x,y,z in trainmypoints[0]: 98 | # cv2.circle(show,(int(y*100+200),int(x*100+200)),3) 99 | cost=((tpoints[0][:,None,:]-np.repeat(trainmypoints[0][None,:,:],4,axis=1))**2).sum(axis=2)**0.5 100 | print (trainloss,np.mean(cost)) 101 | cv2.imshow('show',show) 102 | cmd=cv2.waitKey(10)%256 103 | if cmd==ord('q'): 104 | break 105 | -------------------------------------------------------------------------------- /models/tf_ops/approxmatch/tf_approxmatch_compile.sh: -------------------------------------------------------------------------------- 1 | #/bin/bash 2 | /usr/local/cuda/bin/nvcc tf_approxmatch_g.cu -o tf_approxmatch_g.cu.o -c -O2 -DGOOGLE_CUDA=1 -x cu -Xcompiler -fPIC 3 | g++ -std=c++11 tf_approxmatch.cpp tf_approxmatch_g.cu.o -o tf_approxmatch_so.so -shared -fPIC -I /home/xharlie/anaconda3/envs/tf110/lib/python3.6/site-packages/tensorflow/include -I /usr/local/cuda/include -I /home/xharlie/anaconda3/envs/tf110/lib/python3.6/site-packages/tensorflow/include/external/nsync/public -lcudart -L /usr/local/cuda/lib64/ -L//home/xharlie/anaconda3/envs/tf110/lib/python3.6/site-packages/tensorflow -ltensorflow_framework -O2 # -D_GLIBCXX_USE_CXX11_ABI=0 4 | -------------------------------------------------------------------------------- /models/tf_ops/approxmatch/tf_approxmatch_g.cu: -------------------------------------------------------------------------------- 1 | __global__ void approxmatch(int b,int n,int m,const float * __restrict__ xyz1,const float * __restrict__ xyz2,float * __restrict__ match,float * temp){ 2 | float * remainL=temp+blockIdx.x*(n+m)*2, * remainR=temp+blockIdx.x*(n+m)*2+n,*ratioL=temp+blockIdx.x*(n+m)*2+n+m,*ratioR=temp+blockIdx.x*(n+m)*2+n+m+n; 3 | float multiL,multiR; 4 | if (n>=m){ 5 | multiL=1; 6 | multiR=n/m; 7 | }else{ 8 | multiL=m/n; 9 | multiR=1; 10 | } 11 | const int Block=1024; 12 | __shared__ float buf[Block*4]; 13 | for (int i=blockIdx.x;i=-2;j--){ 22 | float level=-powf(4.0f,j); 23 | if (j==-2){ 24 | level=0; 25 | } 26 | for (int k0=0;k0>>(b,n,m,xyz1,xyz2,match,temp); 182 | } 183 | __global__ void matchcost(int b,int n,int m,const float * __restrict__ xyz1,const float * __restrict__ xyz2,const float * __restrict__ match,float * __restrict__ out){ 184 | __shared__ float allsum[512]; 185 | const int Block=1024; 186 | __shared__ float buf[Block*3]; 187 | for (int i=blockIdx.x;i>>(b,n,m,xyz1,xyz2,match,out); 228 | } 229 | __global__ void matchcostgrad2(int b,int n,int m,const float * __restrict__ xyz1,const float * __restrict__ xyz2,const float * __restrict__ match,float * __restrict__ grad2){ 230 | __shared__ float sum_grad[256*3]; 231 | for (int i=blockIdx.x;i>>(b,n,m,xyz1,xyz2,match,grad1); 294 | matchcostgrad2<<>>(b,n,m,xyz1,xyz2,match,grad2); 295 | } 296 | 297 | -------------------------------------------------------------------------------- /models/tf_ops/approxmatch/tf_approxmatch_so.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laughtervv/DISN/f8206adb45f8a0714eaefcae8433337cd562b82a/models/tf_ops/approxmatch/tf_approxmatch_so.so -------------------------------------------------------------------------------- /models/tf_ops/nn_distance/README.md: -------------------------------------------------------------------------------- 1 | From https://github.com/fanhqme/PointSetGeneration/tree/master/depthestimate 2 | -------------------------------------------------------------------------------- /models/tf_ops/nn_distance/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laughtervv/DISN/f8206adb45f8a0714eaefcae8433337cd562b82a/models/tf_ops/nn_distance/__init__.py -------------------------------------------------------------------------------- /models/tf_ops/nn_distance/tf_nndistance.py: -------------------------------------------------------------------------------- 1 | """ Compute Chamfer's Distance. 2 | 3 | Original author: Haoqiang Fan. 4 | Modified by Charles R. Qi 5 | """ 6 | 7 | import tensorflow as tf 8 | from tensorflow.python.framework import ops 9 | import sys 10 | import os 11 | BASE_DIR = os.path.dirname(os.path.abspath(__file__)) 12 | nn_distance_module=tf.load_op_library(os.path.join(BASE_DIR, 'tf_nndistance_so.so')) 13 | 14 | def nn_distance(xyz1,xyz2): 15 | ''' 16 | Computes the distance of nearest neighbors for a pair of point clouds 17 | input: xyz1: (batch_size,#points_1,3) the first point cloud 18 | input: xyz2: (batch_size,#points_2,3) the second point cloud 19 | output: dist1: (batch_size,#point_1) distance from first to second 20 | output: idx1: (batch_size,#point_1) nearest neighbor from first to second 21 | output: dist2: (batch_size,#point_2) distance from second to first 22 | output: idx2: (batch_size,#point_2) nearest neighbor from second to first 23 | ''' 24 | return nn_distance_module.nn_distance(xyz1,xyz2) 25 | #@tf.RegisterShape('NnDistance') 26 | #def _nn_distance_shape(op): 27 | #shape1=op.inputs[0].get_shape().with_rank(3) 28 | #shape2=op.inputs[1].get_shape().with_rank(3) 29 | #return [tf.TensorShape([shape1.dims[0],shape1.dims[1]]),tf.TensorShape([shape1.dims[0],shape1.dims[1]]), 30 | #tf.TensorShape([shape2.dims[0],shape2.dims[1]]),tf.TensorShape([shape2.dims[0],shape2.dims[1]])] 31 | @ops.RegisterGradient('NnDistance') 32 | def _nn_distance_grad(op,grad_dist1,grad_idx1,grad_dist2,grad_idx2): 33 | xyz1=op.inputs[0] 34 | xyz2=op.inputs[1] 35 | idx1=op.outputs[1] 36 | idx2=op.outputs[3] 37 | return nn_distance_module.nn_distance_grad(xyz1,xyz2,grad_dist1,idx1,grad_dist2,idx2) 38 | 39 | 40 | if __name__=='__main__': 41 | import numpy as np 42 | import random 43 | import time 44 | from tensorflow.python.ops.gradient_checker import compute_gradient 45 | random.seed(100) 46 | np.random.seed(100) 47 | with tf.Session('') as sess: 48 | xyz1=np.random.randn(32,16384,3).astype('float32') 49 | xyz2=np.random.randn(32,1024,3).astype('float32') 50 | #with tf.device('/gpu:0'): 51 | if True: 52 | inp1=tf.Variable(xyz1) 53 | inp2=tf.constant(xyz2) 54 | reta,retb,retc,retd=nn_distance(inp1,inp2) 55 | loss=tf.reduce_sum(reta)+tf.reduce_sum(retc) 56 | train=tf.train.GradientDescentOptimizer(learning_rate=0.05).minimize(loss) 57 | sess.run(tf.initialize_all_variables()) 58 | t0=time.time() 59 | t1=t0 60 | best=1e100 61 | for i in xrange(100): 62 | trainloss,_=sess.run([loss,train]) 63 | newt=time.time() 64 | best=min(best,newt-t1) 65 | print (i,trainloss,(newt-t0)/(i+1),best) 66 | t1=newt 67 | #print sess.run([inp1,retb,inp2,retd]) 68 | #grads=compute_gradient([inp1,inp2],[(16,32,3),(16,32,3)],loss,(1,),[xyz1,xyz2]) 69 | #for i,j in grads: 70 | #print i.shape,j.shape,np.mean(np.abs(i-j)),np.mean(np.abs(i)),np.mean(np.abs(j)) 71 | #for i in xrange(10): 72 | #t0=time.time() 73 | #a,b,c,d=sess.run([reta,retb,retc,retd],feed_dict={inp1:xyz1,inp2:xyz2}) 74 | #print 'time',time.time()-t0 75 | #print a.shape,b.shape,c.shape,d.shape 76 | #print a.dtype,b.dtype,c.dtype,d.dtype 77 | #samples=np.array(random.sample(range(xyz2.shape[1]),100),dtype='int32') 78 | #dist1=((xyz1[:,samples,None,:]-xyz2[:,None,:,:])**2).sum(axis=-1).min(axis=-1) 79 | #idx1=((xyz1[:,samples,None,:]-xyz2[:,None,:,:])**2).sum(axis=-1).argmin(axis=-1) 80 | #print np.abs(dist1-a[:,samples]).max() 81 | #print np.abs(idx1-b[:,samples]).max() 82 | #dist2=((xyz2[:,samples,None,:]-xyz1[:,None,:,:])**2).sum(axis=-1).min(axis=-1) 83 | #idx2=((xyz2[:,samples,None,:]-xyz1[:,None,:,:])**2).sum(axis=-1).argmin(axis=-1) 84 | #print np.abs(dist2-c[:,samples]).max() 85 | #print np.abs(idx2-d[:,samples]).max() 86 | 87 | 88 | -------------------------------------------------------------------------------- /models/tf_ops/nn_distance/tf_nndistance_compile.sh: -------------------------------------------------------------------------------- 1 | /usr/local/cuda/bin/nvcc tf_nndistance_g.cu -o tf_nndistance_g.cu.o -c -O2 -DGOOGLE_CUDA=1 -x cu -Xcompiler -fPIC 2 | g++ -std=c++11 tf_nndistance.cpp tf_nndistance_g.cu.o -o tf_nndistance_so.so -shared -fPIC -I /home/xharlie/anaconda3/envs/tf110/lib/python3.6/site-packages/tensorflow/include -I /usr/local/cuda/include -I /home/xharlie/anaconda3/envs/tf110/lib/python3.6/site-packages/tensorflow/include//external/nsync/public -lcudart -L /usr/local/cuda/lib64/ -L/home/xharlie/anaconda3/envs/tf110/lib/python3.6/site-packages/tensorflow -ltensorflow_framework -O2 -D_GLIBCXX_USE_CXX11_ABI=0 3 | -------------------------------------------------------------------------------- /models/tf_ops/nn_distance/tf_nndistance_cpu.py: -------------------------------------------------------------------------------- 1 | import tensorflow as tf 2 | import numpy as np 3 | 4 | def nn_distance_cpu(pc1, pc2): 5 | ''' 6 | Input: 7 | pc1: float TF tensor in shape (B,N,C) the first point cloud 8 | pc2: float TF tensor in shape (B,M,C) the second point cloud 9 | Output: 10 | dist1: float TF tensor in shape (B,N) distance from first to second 11 | idx1: int32 TF tensor in shape (B,N) nearest neighbor from first to second 12 | dist2: float TF tensor in shape (B,M) distance from second to first 13 | idx2: int32 TF tensor in shape (B,M) nearest neighbor from second to first 14 | ''' 15 | N = pc1.get_shape()[1].value 16 | M = pc2.get_shape()[1].value 17 | pc1_expand_tile = tf.tile(tf.expand_dims(pc1,2), [1,1,M,1]) 18 | pc2_expand_tile = tf.tile(tf.expand_dims(pc2,1), [1,N,1,1]) 19 | pc_diff = pc1_expand_tile - pc2_expand_tile # B,N,M,C 20 | pc_dist = tf.reduce_sum(pc_diff ** 2, axis=-1) # B,N,M 21 | dist1 = tf.reduce_min(pc_dist, axis=2) # B,N 22 | idx1 = tf.argmin(pc_dist, axis=2) # B,N 23 | dist2 = tf.reduce_min(pc_dist, axis=1) # B,M 24 | idx2 = tf.argmin(pc_dist, axis=1) # B,M 25 | return dist1, idx1, dist2, idx2 26 | 27 | 28 | def verify_nn_distance_cup(): 29 | np.random.seed(0) 30 | sess = tf.Session() 31 | pc1arr = np.random.random((1,5,3)) 32 | pc2arr = np.random.random((1,6,3)) 33 | pc1 = tf.constant(pc1arr) 34 | pc2 = tf.constant(pc2arr) 35 | dist1, idx1, dist2, idx2 = nn_distance_cpu(pc1, pc2) 36 | print(sess.run(dist1)) 37 | print(sess.run(idx1)) 38 | print(sess.run(dist2)) 39 | print(sess.run(idx2)) 40 | 41 | dist = np.zeros((5,6)) 42 | for i in range(5): 43 | for j in range(6): 44 | dist[i,j] = np.sum((pc1arr[0,i,:] - pc2arr[0,j,:]) ** 2) 45 | print(dist) 46 | 47 | if __name__ == '__main__': 48 | verify_nn_distance_cup() 49 | -------------------------------------------------------------------------------- /models/tf_ops/nn_distance/tf_nndistance_g.cu: -------------------------------------------------------------------------------- 1 | #if GOOGLE_CUDA 2 | #define EIGEN_USE_GPU 3 | //#include "third_party/eigen3/unsupported/Eigen/CXX11/Tensor" 4 | 5 | __global__ void NmDistanceKernel(int b,int n,const float * xyz,int m,const float * xyz2,float * result,int * result_i){ 6 | const int batch=512; 7 | __shared__ float buf[batch*3]; 8 | for (int i=blockIdx.x;ibest){ 120 | result[(i*n+j)]=best; 121 | result_i[(i*n+j)]=best_i; 122 | } 123 | } 124 | __syncthreads(); 125 | } 126 | } 127 | } 128 | void NmDistanceKernelLauncher(int b,int n,const float * xyz,int m,const float * xyz2,float * result,int * result_i,float * result2,int * result2_i){ 129 | NmDistanceKernel<<>>(b,n,xyz,m,xyz2,result,result_i); 130 | NmDistanceKernel<<>>(b,m,xyz2,n,xyz,result2,result2_i); 131 | } 132 | __global__ void NmDistanceGradKernel(int b,int n,const float * xyz1,int m,const float * xyz2,const float * grad_dist1,const int * idx1,float * grad_xyz1,float * grad_xyz2){ 133 | for (int i=blockIdx.x;i>>(b,n,xyz1,m,xyz2,grad_dist1,idx1,grad_xyz1,grad_xyz2); 156 | NmDistanceGradKernel<<>>(b,m,xyz2,n,xyz1,grad_dist2,idx2,grad_xyz2,grad_xyz1); 157 | } 158 | 159 | #endif 160 | 161 | -------------------------------------------------------------------------------- /models/tf_ops/nn_distance/tf_nndistance_so.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laughtervv/DISN/f8206adb45f8a0714eaefcae8433337cd562b82a/models/tf_ops/nn_distance/tf_nndistance_so.so -------------------------------------------------------------------------------- /postprocessing/clean_smallparts.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | import numpy as np 3 | import tensorflow as tf 4 | import pymesh 5 | import os 6 | import sys 7 | from joblib import Parallel, delayed 8 | BASE_DIR = os.path.dirname(os.path.abspath(__file__)) 9 | sys.path.append(BASE_DIR) # model 10 | sys.path.append(os.path.join(BASE_DIR, 'models')) 11 | sys.path.append(os.path.join(BASE_DIR, 'data')) 12 | sys.path.append(os.path.join(BASE_DIR, 'utils')) 13 | sys.path.append(os.path.join(BASE_DIR, 'preprocessing')) 14 | slim = tf.contrib.slim 15 | 16 | 17 | 18 | parser = argparse.ArgumentParser() 19 | parser.add_argument('--src_dir', type=str, default="", help='src directory, before clean') 20 | parser.add_argument('--tar_dir', type=str, default="", help='where to store') 21 | parser.add_argument('--thread_n', type=int, default=10, help='parallelism') 22 | 23 | FLAGS = parser.parse_args() 24 | print('pid: %s'%(str(os.getpid()))) 25 | print(FLAGS) 26 | 27 | def separate_single_mesh(src_mesh, tar_mesh): 28 | src_mesh = pymesh.load_mesh(src_mesh) 29 | dis_meshes = pymesh.separate_mesh(src_mesh, connectivity_type='auto') 30 | pymesh.save_mesh_raw(tar_mesh+".obj", src_mesh.vertices, src_mesh.faces) 31 | count=0 32 | for dis_mesh in dis_meshes: 33 | print("dis_mesh.vertices.shape",dis_mesh.vertices.shape) 34 | print("dis_mesh.faces.shape",dis_mesh.faces.shape) 35 | pymesh.save_mesh_raw(tar_mesh+"_"+str(count)+".obj", dis_mesh.vertices, dis_mesh.faces) 36 | count+=1 37 | 38 | def clean_single_mesh(src_mesh, tar_mesh, dist_thresh, num_thresh): 39 | src_mesh_obj = pymesh.load_mesh(src_mesh) 40 | dis_meshes = pymesh.separate_mesh(src_mesh_obj, connectivity_type='auto') 41 | max_mesh_verts = 0 42 | for dis_mesh in dis_meshes: 43 | if dis_mesh.vertices.shape[0] > max_mesh_verts: 44 | max_mesh_verts = dis_mesh.vertices.shape[0] 45 | 46 | collection=[] 47 | for dis_mesh in dis_meshes: 48 | if dis_mesh.vertices.shape[0] > max_mesh_verts*num_thresh: 49 | centroid = np.mean(dis_mesh.vertices, axis=0) 50 | if np.sqrt(np.sum(np.square(centroid))) < dist_thresh: 51 | collection.append(dis_mesh) 52 | tar_mesh_obj = pymesh.merge_meshes(collection) 53 | pymesh.save_mesh_raw(tar_mesh, tar_mesh_obj.vertices, tar_mesh_obj.faces) 54 | print("threshes:", str(dist_thresh), str(num_thresh), " clean: ", src_mesh, " create: ",tar_mesh) 55 | 56 | def clean_meshes(cats, src_dir, tar_dir,dist_thresh=0.5, num_thresh=0.3, thread_n=12): 57 | for cat_nm, cat_id in cats.items(): 58 | src_cat_dir=os.path.join(src_dir,cat_id) 59 | tar_cat_dir=os.path.join(tar_dir,cat_id) 60 | os.makedirs(tar_cat_dir, exist_ok=True) 61 | _,_,src_file_lst, tar_file_lst = build_file_dict(src_cat_dir, tar_cat_dir) 62 | dist_thresh_lst=[dist_thresh for i in range(len(src_file_lst))] 63 | num_thresh_lst=[num_thresh for i in range(len(src_file_lst))] 64 | with Parallel(n_jobs=thread_n) as parallel: 65 | parallel(delayed(clean_single_mesh) 66 | (src_mesh, tar_mesh, dist_thresh, num_thresh) 67 | for src_mesh, tar_mesh, dist_thresh, num_thresh in 68 | zip(src_file_lst, tar_file_lst, dist_thresh_lst,num_thresh_lst)) 69 | print("done with ", cat_nm, cat_id) 70 | print("done!") 71 | 72 | def build_file_dict(src_dir, tar_dir): 73 | src_file_dict = {} 74 | tar_file_dict = {} 75 | src_file_lst=[] 76 | tar_file_lst=[] 77 | for file in os.listdir(src_dir): 78 | src_full_path = os.path.join(src_dir, file) 79 | tar_full_path = os.path.join(tar_dir, file) 80 | if os.path.isfile(src_full_path): 81 | obj_id = file.split("_")[1] 82 | if obj_id in src_file_dict.keys(): 83 | src_file_dict[obj_id].append(src_full_path) 84 | else: 85 | src_file_dict[obj_id] = [src_full_path] 86 | src_file_lst.append(src_full_path) 87 | if obj_id in tar_file_dict.keys(): 88 | tar_file_dict[obj_id].append(tar_full_path) 89 | else: 90 | tar_file_dict[obj_id] = [tar_full_path] 91 | tar_file_lst.append(tar_full_path) 92 | 93 | return src_file_dict, tar_file_dict,src_file_lst,tar_file_lst 94 | 95 | 96 | if __name__ == "__main__": 97 | 98 | 99 | cats = { 100 | # "chair": "03001627", 101 | # "bench": "02828884", 102 | # "car": "02958343", 103 | # "airplane": "02691156", 104 | # "sofa": "04256520", 105 | # "table": "04379243", 106 | # "phone": "04401088", 107 | "cabinet": "02933112", 108 | "display": "03211117", 109 | # "lamp": "03636649", 110 | "speaker": "03691459", 111 | "rifle": "04090263", 112 | "watercraft": "04530566" 113 | } 114 | # src_dir = "checkpoint/all_best/sdf_2d_sdfproj_twostream_wd_2048_weight10_ftprev_inweight/test_objs/65_0.0" 115 | # tar_dir = "checkpoint/all_best/sdf_2d_sdfproj_twostream_wd_2048_weight10_ftprev_inweight/test_objs/65_0.0_sep" 116 | clean_meshes(cats, FLAGS.src_dir, FLAGS.tar_dir, dist_thresh=0.5, num_thresh=0.3, thread_n=FLAGS.thread_n) 117 | 118 | -------------------------------------------------------------------------------- /preprocessing/create_file_lst.py: -------------------------------------------------------------------------------- 1 | import json 2 | import os 3 | CUR_PATH = os.path.dirname(os.path.realpath(__file__)) 4 | 5 | def get_all_info(): 6 | with open(CUR_PATH+'/info.json') as json_file: 7 | data = json.load(json_file) 8 | lst_dir, cats, all_cats, raw_dirs = data["lst_dir"], data['cats'], data['all_cats'], data["raw_dirs_v1"] 9 | return lst_dir, cats, all_cats, raw_dirs 10 | 11 | if __name__ == "__main__": 12 | 13 | # nohup python -u create_file_lst.py &> create_imgh5.log & 14 | 15 | lst_dir, cats, all_cats, raw_dirs = get_all_info() 16 | -------------------------------------------------------------------------------- /preprocessing/create_img_h5.py: -------------------------------------------------------------------------------- 1 | import h5py 2 | import os 3 | import numpy as np 4 | CUR_PATH = os.path.dirname(os.path.realpath(__file__)) 5 | import cv2 6 | import trimesh 7 | import create_file_lst 8 | from joblib import Parallel, delayed 9 | 10 | rot90y = np.array([[0, 0, -1], 11 | [0, 1, 0], 12 | [1, 0, 0]], dtype=np.float32) 13 | 14 | def getBlenderProj(az, el, distance_ratio, img_w=137, img_h=137): 15 | """Calculate 4x3 3D to 2D projection matrix given viewpoint parameters.""" 16 | F_MM = 35. # Focal length 17 | SENSOR_SIZE_MM = 32. 18 | PIXEL_ASPECT_RATIO = 1. # pixel_aspect_x / pixel_aspect_y 19 | RESOLUTION_PCT = 100. 20 | SKEW = 0. 21 | CAM_MAX_DIST = 1.75 22 | CAM_ROT = np.asarray([[1.910685676922942e-15, 4.371138828673793e-08, 1.0], 23 | [1.0, -4.371138828673793e-08, -0.0], 24 | [4.371138828673793e-08, 1.0, -4.371138828673793e-08]]) 25 | 26 | # Calculate intrinsic matrix. 27 | # 2 atan(35 / 2*32) 28 | scale = RESOLUTION_PCT / 100 29 | # print('scale', scale) 30 | f_u = F_MM * img_w * scale / SENSOR_SIZE_MM 31 | f_v = F_MM * img_h * scale * PIXEL_ASPECT_RATIO / SENSOR_SIZE_MM 32 | # print('f_u', f_u, 'f_v', f_v) 33 | u_0 = img_w * scale / 2 34 | v_0 = img_h * scale / 2 35 | K = np.matrix(((f_u, SKEW, u_0), (0, f_v, v_0), (0, 0, 1))) 36 | 37 | # Calculate rotation and translation matrices. 38 | # Step 1: World coordinate to object coordinate. 39 | sa = np.sin(np.radians(-az)) 40 | ca = np.cos(np.radians(-az)) 41 | se = np.sin(np.radians(-el)) 42 | ce = np.cos(np.radians(-el)) 43 | R_world2obj = np.transpose(np.matrix(((ca * ce, -sa, ca * se), 44 | (sa * ce, ca, sa * se), 45 | (-se, 0, ce)))) 46 | 47 | # Step 2: Object coordinate to camera coordinate. 48 | R_obj2cam = np.transpose(np.matrix(CAM_ROT)) 49 | R_world2cam = R_obj2cam * R_world2obj 50 | cam_location = np.transpose(np.matrix((distance_ratio * CAM_MAX_DIST, 51 | 0, 52 | 0))) 53 | # print('distance', distance_ratio * CAM_MAX_DIST) 54 | T_world2cam = -1 * R_obj2cam * cam_location 55 | 56 | # Step 3: Fix blender camera's y and z axis direction. 57 | R_camfix = np.matrix(((1, 0, 0), (0, -1, 0), (0, 0, -1))) 58 | R_world2cam = R_camfix * R_world2cam 59 | T_world2cam = R_camfix * T_world2cam 60 | 61 | RT = np.hstack((R_world2cam, T_world2cam)) 62 | 63 | return K, RT 64 | 65 | def get_rotate_matrix(rotation_angle1): 66 | cosval = np.cos(rotation_angle1) 67 | sinval = np.sin(rotation_angle1) 68 | 69 | rotation_matrix_x = np.array([[1, 0, 0, 0], 70 | [0, cosval, -sinval, 0], 71 | [0, sinval, cosval, 0], 72 | [0, 0, 0, 1]]) 73 | rotation_matrix_y = np.array([[cosval, 0, sinval, 0], 74 | [0, 1, 0, 0], 75 | [-sinval, 0, cosval, 0], 76 | [0, 0, 0, 1]]) 77 | rotation_matrix_z = np.array([[cosval, -sinval, 0, 0], 78 | [sinval, cosval, 0, 0], 79 | [0, 0, 1, 0], 80 | [0, 0, 0, 1]]) 81 | scale_y_neg = np.array([ 82 | [1, 0, 0, 0], 83 | [0, -1, 0, 0], 84 | [0, 0, 1, 0], 85 | [0, 0, 0, 1] 86 | ]) 87 | 88 | neg = np.array([ 89 | [-1, 0, 0, 0], 90 | [0, -1, 0, 0], 91 | [0, 0, -1, 0], 92 | [0, 0, 0, 1] 93 | ]) 94 | # y,z swap = x rotate -90, scale y -1 95 | # new_pts0[:, 1] = new_pts[:, 2] 96 | # new_pts0[:, 2] = new_pts[:, 1] 97 | # 98 | # x y swap + negative = z rotate -90, scale y -1 99 | # new_pts0[:, 0] = - new_pts0[:, 1] = - new_pts[:, 2] 100 | # new_pts0[:, 1] = - new_pts[:, 0] 101 | 102 | # return np.linalg.multi_dot([rotation_matrix_z, rotation_matrix_y, rotation_matrix_y, scale_y_neg, rotation_matrix_z, scale_y_neg, rotation_matrix_x]) 103 | return np.linalg.multi_dot([neg, rotation_matrix_z, rotation_matrix_z, scale_y_neg, rotation_matrix_x]) 104 | 105 | 106 | def get_norm_matrix(sdf_h5_file): 107 | with h5py.File(sdf_h5_file, 'r') as h5_f: 108 | norm_params = h5_f['norm_params'][:] 109 | center, m, = norm_params[:3], norm_params[3] 110 | x,y,z = center[0], center[1], center[2] 111 | M_inv = np.asarray( 112 | [[m, 0., 0., 0.], 113 | [0., m, 0., 0.], 114 | [0., 0., m, 0.], 115 | [0., 0., 0., 1.]] 116 | ) 117 | T_inv = np.asarray( 118 | [[1.0 , 0., 0., x], 119 | [0., 1.0 , 0., y], 120 | [0., 0., 1.0 , z], 121 | [0., 0., 0., 1.]] 122 | ) 123 | return np.matmul(T_inv, M_inv) 124 | 125 | 126 | def convert_img2h5(source_dir, target_dir, file_lst_dir, cats, sdf_dir): 127 | os.makedirs(target_dir, exist_ok=True) 128 | for keys, vals in cats.items(): 129 | fs = [] 130 | cat_target_dir = os.path.join(target_dir, vals) 131 | os.makedirs(cat_target_dir, exist_ok=True) 132 | lst_train_file = os.path.join(file_lst_dir, vals+"_train.lst") 133 | lst_test_file = os.path.join(file_lst_dir, vals+"_test.lst") 134 | 135 | with open(lst_train_file, "r") as f: 136 | list_obj = f.readlines() 137 | list_obj = [obj.rstrip('\r\n') for obj in list_obj] 138 | fs+=list_obj 139 | with open(lst_test_file, "r") as f: 140 | list_obj = f.readlines() 141 | list_obj = [obj.rstrip('\r\n') for obj in list_obj] 142 | fs+=list_obj 143 | repeat = len(fs) 144 | source_dir_lst = [source_dir for i in range(repeat)] 145 | cat_target_dir_lst = [cat_target_dir for i in range(repeat)] 146 | sdf_dir_lst = [sdf_dir for i in range(repeat)] 147 | vals_lst = [vals for i in range(repeat)] 148 | 149 | with Parallel(n_jobs=10) as parallel: 150 | parallel(delayed(gen_obj_img_h5) 151 | (source_dir, cat_target_dir, sdf_dir,vals, obj) 152 | for source_dir, cat_target_dir, sdf_dir, vals, obj in 153 | zip(source_dir_lst, cat_target_dir_lst, sdf_dir_lst, vals_lst, fs)) 154 | 155 | 156 | def gen_obj_img_h5(source_dir, cat_target_dir, sdf_dir, vals, obj): 157 | img_dir = os.path.join(source_dir, vals, obj, "rendering") 158 | tar_obj_dir = os.path.join(cat_target_dir, obj) 159 | os.makedirs(tar_obj_dir, exist_ok=True) 160 | sdf_fl = os.path.join(sdf_dir, vals, obj, "ori_sample.h5") 161 | norm_mat = get_norm_matrix(sdf_fl) 162 | rot_mat = get_rotate_matrix(-np.pi / 2) 163 | with open(img_dir + "/renderings.txt", 'r') as f: 164 | lines = f.read().splitlines() 165 | file_lst = [line.strip() for line in lines] 166 | params = np.loadtxt(img_dir + "/rendering_metadata.txt") 167 | param_lst = [params[num, ...].astype(np.float32) for num in range(len(file_lst))] 168 | for i in range(len(file_lst)): 169 | h5_file = os.path.join(tar_obj_dir, file_lst[i][:2] + ".h5") 170 | if os.path.exists(h5_file): 171 | try: 172 | with h5py.File(h5_file, 'r') as h5_f: 173 | trans_mat_shape = h5_f["trans_mat"][:].shape[0] 174 | print("{} exist! trans first shape is {}".format(h5_file, str(trans_mat_shape))) 175 | continue 176 | except: 177 | print("{} exist! but file error".format(h5_file)) 178 | camR, _ = get_img_cam(param_lst[i]) 179 | obj_rot_mat = np.dot(rot90y, camR) 180 | img_file = os.path.join(img_dir, file_lst[i]) 181 | img_arr = cv2.imread(img_file, cv2.IMREAD_UNCHANGED).astype(np.uint8) 182 | az, el, distance_ratio = param_lst[i][0], param_lst[i][1], param_lst[i][3] 183 | K, RT = getBlenderProj(az, el, distance_ratio, img_w=137, img_h=137) 184 | trans_mat = np.linalg.multi_dot([K, RT, rot_mat, norm_mat]) 185 | trans_mat_right = np.transpose(trans_mat) 186 | regress_mat = np.transpose(np.linalg.multi_dot([RT, rot_mat, norm_mat])) 187 | 188 | with h5py.File(h5_file, 'w') as f1: 189 | f1.create_dataset('img_arr', data=img_arr, compression='gzip', 190 | dtype='uint8', compression_opts=4) 191 | f1.create_dataset('trans_mat', data=trans_mat_right, compression='gzip', 192 | dtype='float32', compression_opts=4) 193 | f1.create_dataset('K', data=K, compression='gzip', 194 | dtype='float32', compression_opts=4) 195 | f1.create_dataset('RT', data=RT, compression='gzip', 196 | dtype='float32', compression_opts=4) 197 | f1.create_dataset('obj_rot_mat', data=obj_rot_mat, compression='gzip', 198 | dtype='float32', compression_opts=4) 199 | f1.create_dataset('regress_mat', data=regress_mat, compression='gzip', 200 | dtype='float32', compression_opts=4) 201 | print("write:", h5_file) 202 | 203 | 204 | def get_img_cam(param): 205 | cam_mat, cam_pos = camera_info(degree2rad(param)) 206 | 207 | return cam_mat, cam_pos 208 | 209 | def degree2rad(params): 210 | params_new = np.zeros_like(params) 211 | params_new[0] = np.deg2rad(params[0] + 180.0) 212 | params_new[1] = np.deg2rad(params[1]) 213 | params_new[2] = np.deg2rad(params[2]) 214 | return params_new 215 | 216 | def unit(v): 217 | norm = np.linalg.norm(v) 218 | if norm == 0: 219 | return v 220 | return v / norm 221 | 222 | def camera_info(param): 223 | az_mat = get_az(param[0]) 224 | el_mat = get_el(param[1]) 225 | inl_mat = get_inl(param[2]) 226 | cam_mat = np.transpose(np.matmul(np.matmul(inl_mat, el_mat), az_mat)) 227 | cam_pos = get_cam_pos(param) 228 | return cam_mat, cam_pos 229 | 230 | def get_cam_pos(param): 231 | camX = 0 232 | camY = 0 233 | camZ = param[3] 234 | cam_pos = np.array([camX, camY, camZ]) 235 | return -1 * cam_pos 236 | 237 | def get_az(az): 238 | cos = np.cos(az) 239 | sin = np.sin(az) 240 | mat = np.asarray([cos, 0.0, sin, 0.0, 1.0, 0.0, -1.0 * sin, 0.0, cos], dtype=np.float32) 241 | mat = np.reshape(mat, [3, 3]) 242 | return mat 243 | 244 | def get_el(el): 245 | cos = np.cos(el) 246 | sin = np.sin(el) 247 | mat = np.asarray([1.0, 0.0, 0.0, 0.0, cos, -1.0 * sin, 0.0, sin, cos], dtype=np.float32) 248 | mat = np.reshape(mat, [3, 3]) 249 | return mat 250 | 251 | def get_inl(inl): 252 | cos = np.cos(inl) 253 | sin = np.sin(inl) 254 | # zeros = np.zeros_like(inl) 255 | # ones = np.ones_like(inl) 256 | mat = np.asarray([cos, -1.0 * sin, 0.0, sin, cos, 0.0, 0.0, 0.0, 1.0], dtype=np.float32) 257 | mat = np.reshape(mat, [3, 3]) 258 | return mat 259 | 260 | def get_img_points(sample_pc, trans_mat_right): 261 | sample_pc = sample_pc.reshape((-1,3)) 262 | homo_pc = np.concatenate((sample_pc, np.ones((sample_pc.shape[0],1),dtype=np.float32)),axis=-1) 263 | pc_xyz = np.dot(homo_pc, trans_mat_right).reshape((-1,3)) 264 | print("pc_xyz shape: ", pc_xyz.shape) 265 | pc_xy = pc_xyz[:,:2] / np.expand_dims(pc_xyz[:,2], axis=1) 266 | return pc_xy.astype(np.int32) 267 | 268 | def get_points(obj_fl): 269 | sample_pc = np.zeros((0,3), dtype=np.float32) 270 | mesh_lst = trimesh.load_mesh(obj_fl, process=False) 271 | if not isinstance(mesh_lst, list): 272 | mesh_lst = [mesh_lst] 273 | for mesh in mesh_lst: 274 | choice = np.random.randint(mesh.vertices.shape[0], size=1000) 275 | sample_pc = np.concatenate((sample_pc, mesh.vertices[choice,...]), axis=0) #[choice,...] 276 | # color = [[255,0,0], [0,255,0], [0,0,255], [255, 0, 255]] 277 | color = 255*np.ones_like(sample_pc,dtype=np.uint8) 278 | color[:,0] = 0 279 | color[:,1] = 0 280 | return sample_pc, np.asarray(color, dtype=np.uint8) 281 | 282 | def get_img(img_h5): 283 | with h5py.File(img_h5, 'r') as h5_f: 284 | print("read", img_h5) 285 | trans_mat= h5_f["trans_mat"][:].astype(np.float32) 286 | regress_mat= h5_f["regress_mat"][:].astype(np.float32) 287 | obj_rot_mat= h5_f["obj_rot_mat"][:].astype(np.float32) 288 | K= h5_f["K"][:].astype(np.float32) 289 | img_arr = h5_f["img_arr"][:][:, :, :3].copy() 290 | trans_mat2 = np.dot(regress_mat, np.transpose(K)) 291 | print(trans_mat2-trans_mat) 292 | return img_arr, trans_mat, obj_rot_mat, regress_mat 293 | 294 | def test_img_h5(img_h5_fl, num, march_obj_fl): 295 | img_arr, trans_mat, obj_rot_mat, regress_mat = get_img(img_h5_fl) 296 | new_pts, colors = get_points(march_obj_fl) 297 | pc_xy = get_img_points(new_pts, trans_mat) 298 | for j in range(pc_xy.shape[0]): 299 | y = int(pc_xy[j, 1]) 300 | x = int(pc_xy[j, 0]) 301 | # print (y,x) 302 | # print(img_arr[y, x, :]) 303 | # print(tuple([int(x) for x in colors[j]])) 304 | cv2.circle(img_arr, (x, y), 3, tuple([int(x) for x in colors[j]]), -1) 305 | rot_pc = np.dot(new_pts, obj_rot_mat) 306 | np.savetxt(os.path.join("send/", "{}_{}_{}.txt".format("03001627", "184b4797cea77beb5ca1c42bb8ac17a", str(num))), rot_pc) 307 | 308 | print("send/184b4797cea77beb5ca1c42bb8ac17a_{}.png".format(str(num))) 309 | cv2.imwrite("send/184b4797cea77beb5ca1c42bb8ac17a_{}.png".format(str(num)), img_arr) 310 | 311 | 312 | if __name__ == "__main__": 313 | 314 | # nohup python -u create_file_lst.py &> create_imgh5.log & 315 | 316 | lst_dir, cats, all_cats, raw_dirs = create_file_lst.get_all_info() 317 | convert_img2h5(raw_dirs["rendered_dir"], 318 | raw_dirs["renderedh5_dir"], 319 | lst_dir, cats, 320 | raw_dirs["sdf_dir"]) 321 | 322 | 323 | # test_img_h5("/ssd1/datasets/ShapeNet/ShapeNetRenderingh5_v1/03001627/184b4797cea77beb5ca1c42bb8ac17a/05.h5", 5, 324 | # "/ssd1/datasets/ShapeNet/march_cube_objs_v1/03001627/184b4797cea77beb5ca1c42bb8ac17a/isosurf.obj") 325 | 326 | # gen_obj_img_h5("/ssd1/datasets/ShapeNet/ShapeNetRendering", 327 | # "send/03001627", "/ssd1/datasets/ShapeNet/SDF_v1/256_expr_1.2_bw_0.1/", "03001627", "184b4797cea77beb5ca1c42bb8ac17a") 328 | # 329 | # test_img_h5("send/03001627/184b4797cea77beb5ca1c42bb8ac17a/00.h5",0, 330 | # "/ssd1/datasets/ShapeNet/march_cube_objs_v1/03001627/184b4797cea77beb5ca1c42bb8ac17a/isosurf.obj") 331 | # test_img_h5("send/03001627/184b4797cea77beb5ca1c42bb8ac17a/01.h5",1, 332 | # "/ssd1/datasets/ShapeNet/march_cube_objs_v1/03001627/184b4797cea77beb5ca1c42bb8ac17a/isosurf.obj") 333 | -------------------------------------------------------------------------------- /preprocessing/info.json: -------------------------------------------------------------------------------- 1 | { 2 | "lst_dir": "./data/filelists", 3 | "cats": { 4 | "watercraft": "04530566", 5 | "rifle": "04090263", 6 | "display": "03211117", 7 | "lamp": "03636649", 8 | "speaker": "03691459", 9 | "cabinet": "02933112", 10 | "chair": "03001627", 11 | "bench": "02828884", 12 | "car": "02958343", 13 | "airplane": "02691156", 14 | "sofa": "04256520", 15 | "table": "04379243", 16 | "phone": "04401088" 17 | }, 18 | "all_cats": [ 19 | "airplane", 20 | "bench", 21 | "cabinet", 22 | "car", 23 | "chair", 24 | "display", 25 | "lamp", 26 | "speaker", 27 | "rifle", 28 | "sofa", 29 | "table", 30 | "phone", 31 | "watercraft" 32 | ], 33 | "raw_dirs_v1": { 34 | "mesh_dir": "/ssd1/datasets/ShapeNet/ShapeNetCore.v1/", 35 | "norm_mesh_dir": "/ssd1/datasets/ShapeNet/march_cube_objs_v1/", 36 | "norm_mesh_dir_v2": "/ssd1/datasets/ShapeNet/march_cube_objs/", 37 | "sdf_dir": "/ssd1/datasets/ShapeNet/SDF_v1/", 38 | "sdf_dir_v2": "/ssd1/datasets/ShapeNet/SDF_v2/", 39 | "rendered_dir": "/ssd1/datasets/ShapeNet/ShapeNetRendering/", 40 | "renderedh5_dir": "/ssd1/datasets/ShapeNet/ShapeNetRenderingh5_v1/", 41 | "renderedh5_dir_v2": "/ssd1/datasets/ShapeNet/ShapeNetRenderingh5_v2/", 42 | "renderedh5_dir_est": "/ssd1/datasets/ShapeNet/ShapeNetRenderingh5_v1_pred_3d/", 43 | "3dnnsdf_dir": "/ssd1/datasets/ShapeNet/SDF_full/" 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/laughtervv/DISN/f8206adb45f8a0714eaefcae8433337cd562b82a/result.png -------------------------------------------------------------------------------- /test/command: -------------------------------------------------------------------------------- 1 | cp -r 65_0.0_sep/02933112 65_0.0_comb/ & 2 | cp -r 65_0.0_sep/03211117 65_0.0_comb/ & 3 | cp -r 65_0.0_sep/03691459 65_0.0_comb/ & 4 | cp -r 65_0.0_sep/04090263 65_0.0_comb/ & 5 | cp -r 65_0.0_sep/04530566 65_0.0_comb/ & 6 | cp -r 65_0.0/02691156 65_0.0_comb/ & 7 | cp -r 65_0.0/02828884 65_0.0_comb/ & 8 | cp -r 65_0.0/02958343 65_0.0_comb/ & 9 | cp -r 65_0.0/03001627 65_0.0_comb/ & 10 | cp -r 65_0.0/03636649 65_0.0_comb/ & 11 | cp -r 65_0.0/04256520 65_0.0_comb/ & 12 | cp -r 65_0.0/04379243 65_0.0_comb/ & 13 | cp -r 65_0.0/04401088 65_0.0_comb/ & 14 | 15 | 16 | 17 | cp -r camest_65_0.0_sep/02933112 camest_65_0.0_comb/ & 18 | cp -r camest_65_0.0_sep/03211117 camest_65_0.0_comb/ & 19 | cp -r camest_65_0.0_sep/03691459 camest_65_0.0_comb/ & 20 | cp -r camest_65_0.0_sep/04090263 camest_65_0.0_comb/ & 21 | cp -r camest_65_0.0_sep/04530566 camest_65_0.0_comb/ & 22 | cp -r camest_65_0.0/02691156 camest_65_0.0_comb/ & 23 | cp -r camest_65_0.0/02828884 camest_65_0.0_comb/ & 24 | cp -r camest_65_0.0/02958343 camest_65_0.0_comb/ & 25 | cp -r camest_65_0.0/03001627 camest_65_0.0_comb/ & 26 | cp -r camest_65_0.0/03636649 camest_65_0.0_comb/ & 27 | cp -r camest_65_0.0/04256520 camest_65_0.0_comb/ & 28 | cp -r camest_65_0.0/04379243 camest_65_0.0_comb/ & 29 | cp -r camest_65_0.0/04401088 camest_65_0.0_comb/ & 30 | 31 | 32 | 33 | cp -r 65_0.0_sep/02933112 65_0.0_comb/ & 34 | cp -r 65_0.0_sep/04090263 65_0.0_comb/ & 35 | cp -r 65_0.0/02691156 65_0.0_comb/ & 36 | cp -r 65_0.0/02828884 65_0.0_comb/ & 37 | cp -r 65_0.0/02958343 65_0.0_comb/ & 38 | cp -r 65_0.0/03001627 65_0.0_comb/ & 39 | cp -r 65_0.0/03636649 65_0.0_comb/ & 40 | cp -r 65_0.0/04256520 65_0.0_comb/ & 41 | cp -r 65_0.0/04379243 65_0.0_comb/ & 42 | cp -r 65_0.0/04401088 65_0.0_comb/ & 43 | cp -r 65_0.0/04530566 65_0.0_comb/ & 44 | cp -r 65_0.0/03211117 65_0.0_comb/ & 45 | cp -r 65_0.0/03691459 65_0.0_comb/ & 46 | 47 | 48 | -------------------------------------------------------------------------------- /test/test_iou.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | import math 3 | from datetime import datetime 4 | import numpy as np 5 | import random 6 | import tensorflow as tf 7 | import socket 8 | import pymesh 9 | import os 10 | import sys 11 | from joblib import Parallel, delayed 12 | BASE_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..") 13 | sys.path.append(BASE_DIR) # model 14 | sys.path.append(os.path.join(BASE_DIR, 'models')) 15 | sys.path.append(os.path.join(BASE_DIR, 'data')) 16 | sys.path.append(os.path.join(BASE_DIR, 'utils')) 17 | sys.path.append(os.path.join(BASE_DIR, 'preprocessing')) 18 | from tensorflow.contrib.framework.python.framework import checkpoint_utils 19 | import create_file_lst 20 | 21 | slim = tf.contrib.slim 22 | lst_dir, cats, all_cats, raw_dirs = create_file_lst.get_all_info() 23 | 24 | parser = argparse.ArgumentParser() 25 | parser.add_argument('--store', action='store_true') 26 | parser.add_argument('--max_epoch', type=int, default=1, help='Epoch to run [default: 201]') 27 | parser.add_argument('--img_h', type=int, default=137, help='Image Height') 28 | parser.add_argument('--img_w', type=int, default=137, help='Image Width') 29 | parser.add_argument('--learning_rate', type=float, default=1e-4, help='Initial learning rate [default: 0.001]') 30 | parser.add_argument('--decay_step', type=int, default=200000, help='Decay step for lr decay [default: 200000]') 31 | parser.add_argument('--decay_rate', type=float, default=0.9, help='Decay rate for lr decay [default: 0.7]') 32 | parser.add_argument('--num_classes', type=int, default=1024, help='vgg global embedding dimensions') 33 | parser.add_argument('--num_points', type=int, default=1, help='Point Number [default: 2048]') 34 | parser.add_argument('--dim', type=int, default=110) 35 | parser.add_argument('--alpha', action='store_true') 36 | parser.add_argument('--rot', action='store_true') 37 | parser.add_argument('--tanh', action='store_true') 38 | parser.add_argument('--cat_limit', type=int, default=168000, help="balance each category, 1500 * 24 = 36000") 39 | parser.add_argument('--sdf_res', type=int, default=64, help='sdf grid') 40 | parser.add_argument('--binary', action='store_true') 41 | parser.add_argument('--num_sample_points', type=int, default=2048, help='Sample Point Number for each obj to test[default: 2048]') 42 | parser.add_argument('--gpu', type=str, default='0', help='GPU to use [default: GPU 0]') 43 | parser.add_argument('--batch_size', type=int, default=1, help='Batch Size during training [default: 32]') 44 | parser.add_argument('--cam_est', action='store_true') 45 | 46 | 47 | parser.add_argument('--log_dir', default='checkpoint/exp_200', help='Log dir [default: log]') 48 | parser.add_argument('--test_lst_dir', default=lst_dir, help='test mesh data list') 49 | parser.add_argument('--threedcnn', action='store_true') 50 | parser.add_argument('--img_feat_onestream', action='store_true') 51 | parser.add_argument('--img_feat_twostream', action='store_true') 52 | parser.add_argument('--category', default="all", help='Which single class to train on [default: None]') 53 | parser.add_argument('--view_num', type=int, default=24, help="how many views do you want to create for each obj") 54 | parser.add_argument('--cal_dir', type=str, default="", help="target obj directory that needs to be tested") 55 | 56 | FLAGS = parser.parse_args() 57 | print('pid: %s'%(str(os.getpid()))) 58 | print(FLAGS) 59 | 60 | EPOCH_CNT = 0 61 | GPU_INDEX = FLAGS.gpu 62 | PRETRAINED_MODEL_PATH = FLAGS.log_dir 63 | LOG_DIR = FLAGS.log_dir 64 | SDF_WEIGHT = 10. 65 | 66 | os.environ["CUDA_VISIBLE_DEVICES"] = GPU_INDEX 67 | if not os.path.exists(LOG_DIR): os.makedirs(LOG_DIR) 68 | RESULT_PATH = os.path.join(LOG_DIR, 'test_results_allpts') 69 | if not os.path.exists(RESULT_PATH): os.mkdir(RESULT_PATH) 70 | LOG_FOUT = open(os.path.join(LOG_DIR, 'log_test.txt'), 'w') 71 | LOG_FOUT.write(str(FLAGS)+'\n') 72 | 73 | 74 | HOSTNAME = socket.gethostname() 75 | print("HOSTNAME:", HOSTNAME) 76 | VV = False 77 | VV = VV and (HOSTNAME == "ubuntu") 78 | 79 | def log_string(out_str): 80 | LOG_FOUT.write(out_str+'\n') 81 | LOG_FOUT.flush() 82 | print(out_str) 83 | 84 | 85 | if FLAGS.threedcnn: 86 | info = {'rendered_dir': raw_dirs["renderedh5_dir_v2"], 87 | 'sdf_dir': raw_dirs["3dnnsdf_dir"], 88 | 'gt_marching_cube':raw_dirs['norm_mesh_dir_v2']} 89 | elif FLAGS.img_feat_onestream or FLAGS.img_feat_twostream: 90 | info = {'rendered_dir': raw_dirs["renderedh5_dir"], 91 | 'sdf_dir': raw_dirs["sdf_dir"], 92 | 'gt_marching_cube':raw_dirs['norm_mesh_dir']} 93 | if FLAGS.cam_est: 94 | info['rendered_dir']= raw_dirs["renderedh5_dir_est"] 95 | else: 96 | info = {'rendered_dir': raw_dirs["renderedh5_dir_v2"], 97 | 'sdf_dir': raw_dirs['sdf_dir_v2'], 98 | 'gt_marching_cube':raw_dirs['norm_mesh_dir_v2']} 99 | 100 | print(info) 101 | 102 | def load_model(sess, LOAD_MODEL_FILE, prefixs, strict=False): 103 | 104 | vars_in_pretrained_model = dict(checkpoint_utils.list_variables(LOAD_MODEL_FILE)) 105 | vars_in_defined_model = [] 106 | 107 | for var in tf.trainable_variables(): 108 | if isinstance(prefixs, list): 109 | for prefix in prefixs: 110 | if (var.op.name.startswith(prefix)) and (var.op.name in vars_in_pretrained_model.keys()) and ('logits' not in var.op.name): 111 | if (list(var.shape) == vars_in_pretrained_model[var.op.name]): 112 | vars_in_defined_model.append(var) 113 | else: 114 | if (var.op.name.startswith(prefixs)) and (var.op.name in vars_in_pretrained_model.keys()) and ('logits' not in var.op.name): 115 | if (list(var.shape) == vars_in_pretrained_model[var.op.name]): 116 | vars_in_defined_model.append(var) 117 | saver = tf.train.Saver(vars_in_defined_model) 118 | saver.restore(sess, LOAD_MODEL_FILE) 119 | print( "Model loaded in file: %s" % (LOAD_MODEL_FILE)) 120 | 121 | return True 122 | 123 | def build_file_dict(dir): 124 | file_dict = {} 125 | for file in os.listdir(dir): 126 | full_path = os.path.join(dir, file) 127 | if os.path.isfile(full_path) and os.stat(full_path)[6] > 200: 128 | obj_id = file.split("_")[1] 129 | if obj_id in file_dict.keys(): 130 | file_dict[obj_id].append(full_path) 131 | else: 132 | file_dict[obj_id] = [full_path] 133 | for obj_id in file_dict.keys(): 134 | paths = file_dict[obj_id] 135 | if len(paths) == 0: 136 | print("{} no ok files ".format(obj_id)) 137 | elif len(paths) < FLAGS.view_num: 138 | choice = np.random.randint(len(paths), size=FLAGS.view_num) 139 | # print(obj_id," choice: ",choice) 140 | file_dict[obj_id] = [] 141 | for ind in choice: 142 | file_dict[obj_id].append(paths[ind]) 143 | else: 144 | file_dict[obj_id] = random.sample(paths, FLAGS.view_num) 145 | return file_dict 146 | 147 | class NoStdStreams(object): 148 | def __init__(self,stdout = None, stderr = None): 149 | self.devnull = open(os.devnull,'w') 150 | self._stdout = stdout or self.devnull or sys.stdout 151 | self._stderr = stderr or self.devnull or sys.stderr 152 | 153 | def __enter__(self): 154 | self.old_stdout, self.old_stderr = sys.stdout, sys.stderr 155 | self.old_stdout.flush(); self.old_stderr.flush() 156 | sys.stdout, sys.stderr = self._stdout, self._stderr 157 | 158 | def __exit__(self, exc_type, exc_value, traceback): 159 | self._stdout.flush(); self._stderr.flush() 160 | sys.stdout = self.old_stdout 161 | sys.stderr = self.old_stderr 162 | self.devnull.close() 163 | 164 | 165 | def iou_all(cats, pred_dir, gt_dir, test_lst_dir, dim=110): 166 | for cat_nm, cat_id in cats.items(): 167 | pred_dir_cat = os.path.join(pred_dir, cat_id) 168 | gt_dir_cat = os.path.join(gt_dir, cat_id) 169 | test_lst_f = os.path.join(test_lst_dir, cat_id + "_test.lst") 170 | iou_avg, best_iou_pred_lst = iou_cat(pred_dir_cat, gt_dir_cat, test_lst_f, dim=dim) 171 | print("cat_nm: {}, cat_id: {}, iou_avg: {}".format(cat_nm, cat_id, iou_avg)) 172 | print("done!") 173 | 174 | def iou_cat(pred_dir, gt_dir, test_lst_f, dim=110): 175 | pred_dict = build_file_dict(pred_dir) 176 | iou_sum = 0.0 177 | count = 0.0 178 | best_iou_pred_lst = [] 179 | with open(test_lst_f, "r") as f: 180 | test_objs = f.readlines() 181 | for obj_id in test_objs: 182 | obj_id = obj_id.rstrip('\r\n') 183 | src_path = os.path.join(gt_dir, obj_id, "isosurf.obj") 184 | src_path_lst = [src_path for i in range(len(pred_dict[obj_id]))] 185 | dim_lst = [dim for i in range(len(pred_dict[obj_id]))] 186 | if obj_id not in pred_dict.keys(): 187 | print("skip error obj id, no key:", obj_id) 188 | continue 189 | pred_path_lst = pred_dict[obj_id] 190 | if len(pred_path_lst) == 0: 191 | print("skip error obj id:", obj_id) 192 | continue 193 | with Parallel(n_jobs=min(12, FLAGS.view_num)) as parallel: 194 | result_lst = parallel(delayed(iou_pymesh) 195 | (src_path, pred_path, dim) 196 | for src_path, pred_path, dim in 197 | zip(src_path_lst, pred_path_lst, dim_lst)) 198 | iou_vals = np.asarray([result[0] for result in result_lst], dtype=np.float32) 199 | sum_iou = np.sum(iou_vals) 200 | iou_sum += sum_iou 201 | count += len(iou_vals) 202 | avg_iou = np.mean(iou_vals) 203 | ind = np.argmax(iou_vals) 204 | best_iou_pred_lst.append(result_lst[ind]) 205 | print("obj_id iou avg: ", avg_iou, " best pred: ", result_lst[ind]) 206 | return iou_sum / count, best_iou_pred_lst 207 | 208 | def iou_pymesh(mesh_src, mesh_pred, dim=FLAGS.dim): 209 | try: 210 | mesh1 = pymesh.load_mesh(mesh_src) 211 | grid1 = pymesh.VoxelGrid(2./dim) 212 | grid1.insert_mesh(mesh1) 213 | grid1.create_grid() 214 | 215 | ind1 = ((grid1.mesh.vertices + 1.1) / 2.4 * dim).astype(np.int) 216 | v1 = np.zeros([dim, dim, dim]) 217 | v1[ind1[:,0], ind1[:,1], ind1[:,2]] = 1 218 | 219 | 220 | mesh2 = pymesh.load_mesh(mesh_pred) 221 | grid2 = pymesh.VoxelGrid(2./dim) 222 | grid2.insert_mesh(mesh2) 223 | grid2.create_grid() 224 | 225 | ind2 = ((grid2.mesh.vertices + 1.1) / 2.4 * dim).astype(np.int) 226 | v2 = np.zeros([dim, dim, dim]) 227 | v2[ind2[:,0], ind2[:,1], ind2[:,2]] = 1 228 | 229 | intersection = np.sum(np.logical_and(v1, v2)) 230 | union = np.sum(np.logical_or(v1, v2)) 231 | return [float(intersection) / union, mesh_pred] 232 | except: 233 | print("error mesh {} / {}".format(mesh_src, mesh_pred)) 234 | 235 | 236 | if __name__ == "__main__": 237 | 238 | 239 | ############################################################ 240 | 241 | cats_all = { 242 | "watercraft": "04530566", 243 | "rifle": "04090263", 244 | "display": "03211117", 245 | "lamp": "03636649", 246 | "speaker": "03691459", 247 | "chair": "03001627", 248 | "bench": "02828884", 249 | "cabinet": "02933112", 250 | "car": "02958343", 251 | "airplane": "02691156", 252 | "sofa": "04256520", 253 | "table": "04379243", 254 | "phone": "04401088" 255 | } 256 | if FLAGS.category == "all": 257 | cats = cats_all 258 | elif FLAGS.category == "clean": 259 | cats = {"cabinet": "02933112", 260 | "display": "03211117", 261 | "lamp": "03636649", 262 | "speaker": "03691459", 263 | "rifle": "04090263", 264 | "watercraft": "04530566" 265 | } 266 | else: 267 | cats = {FLAGS.category: cats_all[FLAGS.category]} 268 | 269 | iou_all(cats, FLAGS.cal_dir, info["gt_marching_cube"], FLAGS.test_lst_dir, dim=110) 270 | 271 | -------------------------------------------------------------------------------- /test/test_sdf_acc.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | from datetime import datetime 3 | import tensorflow as tf 4 | import os 5 | import sys 6 | BASE_DIR = os.path.dirname(os.path.abspath(__file__)) 7 | sys.path.append(BASE_DIR) # model 8 | sys.path.append(os.path.join(BASE_DIR, 'models')) 9 | sys.path.append(os.path.join(BASE_DIR, 'data')) 10 | sys.path.append(os.path.join(BASE_DIR, 'utils')) 11 | sys.path.append(os.path.join(BASE_DIR, 'preprocessing')) 12 | import model_normalization as model 13 | import data_sdf_h5_queue # as data 14 | import create_file_lst 15 | slim = tf.contrib.slim 16 | 17 | parser = argparse.ArgumentParser() 18 | parser.add_argument('--max_epoch', type=int, default=1, help='Epoch to run [default: 201]') 19 | parser.add_argument('--img_h', type=int, default=137, help='Image Height') 20 | parser.add_argument('--img_w', type=int, default=137, help='Image Width') 21 | parser.add_argument('--learning_rate', type=float, default=1e-4, help='Initial learning rate [default: 0.001]') 22 | parser.add_argument('--decay_step', type=int, default=200000, help='Decay step for lr decay [default: 200000]') 23 | parser.add_argument('--decay_rate', type=float, default=0.9, help='Decay rate for lr decay [default: 0.7]') 24 | parser.add_argument('--num_classes', type=int, default=1024, help='vgg global embedding dimensions') 25 | parser.add_argument('--num_points', type=int, default=1, help='Point Number [default: 2048]') 26 | parser.add_argument('--mask_weight', type=float, default=4.0) 27 | parser.add_argument('--alpha', action='store_true') 28 | parser.add_argument('--rot', action='store_true') 29 | parser.add_argument('--tanh', action='store_true') 30 | parser.add_argument('--cat_limit', type=int, default=168000, help="balance each category, 1500 * 24 = 36000") 31 | 32 | parser.add_argument('--gpu', type=str, default='0', help='GPU to use [default: GPU 0]') 33 | parser.add_argument('--batch_size', type=int, default=1, help='Batch Size during training [default: 32]') 34 | parser.add_argument('--sdf_res', type=int, default=64, help='sdf grid') 35 | parser.add_argument('--log_dir', default='checkpoint/exp_200', help='Log dir [default: log]') 36 | parser.add_argument('--test_lst_dir', default='', help='test mesh data list') 37 | parser.add_argument('--num_sample_points', type=int, default=2048, help='Sample Point Number for each obj to test[default: 2048]') 38 | parser.add_argument('--threedcnn', action='store_true') 39 | parser.add_argument('--img_feat', action='store_true') 40 | parser.add_argument('--img_feat_far', action='store_true') 41 | parser.add_argument('--img_feat_twostream', action='store_true') 42 | parser.add_argument('--category', default="all", help='Which single class to train on [default: None]') 43 | parser.add_argument('--binary', action='store_true') 44 | parser.add_argument('--create_obj', action='store_true', help="create_obj or test accuracy on test set") 45 | parser.add_argument('--store', action='store_true') 46 | parser.add_argument('--multi_view', action='store_true') 47 | parser.add_argument('--cam_est', action='store_true') 48 | parser.add_argument('--backcolorwhite', action='store_true') 49 | 50 | FLAGS = parser.parse_args() 51 | print('pid: %s'%(str(os.getpid()))) 52 | print(FLAGS) 53 | 54 | EPOCH_CNT = 0 55 | NUM_POINTS = FLAGS.num_points 56 | BATCH_SIZE = FLAGS.batch_size 57 | NUM_SAMPLE_POINTS = FLAGS.num_sample_points 58 | GPU_INDEX = FLAGS.gpu 59 | PRETRAINED_MODEL_PATH = FLAGS.log_dir 60 | LOG_DIR = FLAGS.log_dir 61 | SDF_WEIGHT = 10. 62 | 63 | os.environ["CUDA_VISIBLE_DEVICES"] = GPU_INDEX 64 | 65 | if not os.path.exists(LOG_DIR): os.makedirs(LOG_DIR) 66 | 67 | RESULT_PATH = os.path.join(LOG_DIR, 'test_results_allpts') 68 | if not os.path.exists(RESULT_PATH): os.mkdir(RESULT_PATH) 69 | 70 | LOG_FOUT = open(os.path.join(LOG_DIR, 'log_test.txt'), 'w') 71 | LOG_FOUT.write(str(FLAGS)+'\n') 72 | 73 | IMG_SIZE = FLAGS.img_h 74 | 75 | 76 | ########### load test lst info 77 | TEST_LISTINFO = [] 78 | lst_dir, cats, all_cats, raw_dirs = create_file_lst.get_all_info() 79 | 80 | cat_ids = [] 81 | cats_limit = {} 82 | 83 | if FLAGS.category == "all": 84 | for key, value in cats.items(): 85 | cat_ids.append(value) 86 | cats_limit[value] = 0 87 | else: 88 | cat_ids.append(cats[FLAGS.category]) 89 | cats_limit[cats[FLAGS.category]] = 0 90 | 91 | for cat_id in cat_ids: 92 | test_lst = os.path.join(FLAGS.test_lst_dir, cat_id+"_test.lst") 93 | with open(test_lst, 'r') as f: 94 | lines = f.read().splitlines() 95 | for line in lines: 96 | render_list = range(24) 97 | for render in render_list: 98 | cats_limit[cat_id]+=1 99 | TEST_LISTINFO += [(cat_id, line.strip(), render)] 100 | 101 | def log_string(out_str): 102 | LOG_FOUT.write(out_str+'\n') 103 | LOG_FOUT.flush() 104 | print(out_str) 105 | 106 | 107 | if FLAGS.threedcnn: 108 | info = {'rendered_dir': '/ssd1/datasets/ShapeNet/ShapeNetRenderingh5_v2', 109 | 'sdf_dir': '/ssd1/datasets/ShapeNet/SDF_full/64_expr_1.2'} 110 | elif FLAGS.img_feat or FLAGS.img_feat_far or FLAGS.img_feat_twostream: 111 | info = {'rendered_dir': '/ssd1/datasets/ShapeNet/ShapeNetRenderingh5_v1', 112 | 'sdf_dir': '/ssd1/datasets/ShapeNet/SDF_v1/256_expr_1.2_bw_0.1'} 113 | if FLAGS.cam_est: 114 | info = {'rendered_dir': '/ssd1/datasets/ShapeNet/ShapeNetRenderingh5_v1_pred_3d', 115 | 'sdf_dir': '/ssd1/datasets/ShapeNet/SDF_v1/256_expr_1.2_bw_0.1'} 116 | else: 117 | info = {'rendered_dir': '/ssd1/datasets/ShapeNet/ShapeNetRenderingh5_v2', 118 | 'sdf_dir': '/ssd1/datasets/ShapeNet/SDF_neg/simp_256_expr_1.2_bw_0.1'} 119 | TEST_DATASET = data_sdf_h5_queue.Pt_sdf_img(FLAGS, listinfo=TEST_LISTINFO, info=info, cats_limit=cats_limit) 120 | print(info) 121 | 122 | def test(): 123 | log_string(LOG_DIR) 124 | 125 | input_pls = model.placeholder_inputs(BATCH_SIZE, NUM_POINTS, (IMG_SIZE, IMG_SIZE), 126 | num_sample_pc=NUM_SAMPLE_POINTS, scope='inputs_pl', FLAGS=FLAGS) 127 | is_training_pl = tf.placeholder(tf.bool, shape=()) 128 | print(is_training_pl) 129 | batch = tf.Variable(0, name='batch') 130 | 131 | print("--- Get model and loss") 132 | # Get model and loss 133 | 134 | end_points = model.get_model(input_pls, NUM_POINTS, is_training_pl, bn=False,FLAGS=FLAGS) 135 | 136 | loss, end_points = model.get_loss(end_points, sdf_weight=SDF_WEIGHT, mask_weight = FLAGS.mask_weight, 137 | num_sample_points=NUM_SAMPLE_POINTS, FLAGS=FLAGS) 138 | # Create a session 139 | gpu_options = tf.GPUOptions() 140 | config = tf.ConfigProto(gpu_options=gpu_options) 141 | config.gpu_options.allow_growth = True 142 | config.allow_soft_placement = True 143 | config.log_device_placement = False 144 | sess = tf.Session(config=config) 145 | 146 | init = tf.global_variables_initializer() 147 | sess.run(init) 148 | 149 | ######### Loading Checkpoint ############### 150 | saver = tf.train.Saver([v for v in tf.get_collection_ref(tf.GraphKeys.GLOBAL_VARIABLES) if 151 | ('lr' not in v.name) and ('batch' not in v.name)]) 152 | ckptstate = tf.train.get_checkpoint_state(PRETRAINED_MODEL_PATH) 153 | 154 | if ckptstate is not None: 155 | LOAD_MODEL_FILE = os.path.join(PRETRAINED_MODEL_PATH, os.path.basename(ckptstate.model_checkpoint_path)) 156 | try: 157 | with NoStdStreams(): 158 | saver.restore(sess, LOAD_MODEL_FILE) 159 | print("Model loaded in file: %s" % LOAD_MODEL_FILE) 160 | except: 161 | print("Fail to load overall modelfile: %s" % PRETRAINED_MODEL_PATH) 162 | 163 | ########################################### 164 | 165 | ops = {'input_pls': input_pls, 166 | 'is_training_pl': is_training_pl, 167 | 'loss': loss, 168 | 'step': batch, 169 | 'end_points': end_points} 170 | 171 | TEST_DATASET.start() 172 | test_one_epoch(sess, ops) 173 | TEST_DATASET.shutdown() 174 | 175 | class NoStdStreams(object): 176 | def __init__(self,stdout = None, stderr = None): 177 | self.devnull = open(os.devnull,'w') 178 | self._stdout = stdout or self.devnull or sys.stdout 179 | self._stderr = stderr or self.devnull or sys.stderr 180 | 181 | def __enter__(self): 182 | self.old_stdout, self.old_stderr = sys.stdout, sys.stderr 183 | self.old_stdout.flush(); self.old_stderr.flush() 184 | sys.stdout, sys.stderr = self._stdout, self._stderr 185 | 186 | def __exit__(self, exc_type, exc_value, traceback): 187 | self._stdout.flush(); self._stderr.flush() 188 | sys.stdout = self.old_stdout 189 | sys.stderr = self.old_stderr 190 | self.devnull.close() 191 | 192 | def test_one_epoch(sess, ops): 193 | is_training = False 194 | 195 | # Shuffle train samples 196 | num_batches = int(len(TEST_DATASET)) // FLAGS.batch_size 197 | print() 198 | print('num_batches', num_batches) 199 | log_string(str(datetime.now())) 200 | losses = {} 201 | for lossname in ops['end_points']['losses'].keys(): 202 | losses[lossname] = 0 203 | 204 | for batch_idx in range(num_batches): 205 | batch_data = TEST_DATASET.fetch() 206 | 207 | feed_dict = {ops['is_training_pl']: is_training, 208 | ops['input_pls']['sample_pc']: batch_data['sdf_pt'], 209 | ops['input_pls']['sample_pc_rot']: batch_data['sdf_pt_rot'], 210 | ops['input_pls']['sdf']: batch_data['sdf_val'] - 0.003, 211 | ops['input_pls']['imgs']: batch_data['img'], 212 | ops['input_pls']['trans_mat']: batch_data['trans_mat']} 213 | output_list = [ops['end_points']['pred_sdf'], ops['end_points']['ref_img'], 214 | ops['end_points']['sample_img_points']] 215 | loss_list = [] 216 | for il, lossname in enumerate(losses.keys()): 217 | loss_list += [ops['end_points']['losses'][lossname]] 218 | outputs = sess.run(output_list + loss_list, feed_dict=feed_dict) 219 | pred_sdf_val, ref_img_val, sample_img_points_val = outputs[:-len(losses)] 220 | outstr = ' -- %03d / %03d -- ' % (batch_idx + 1, num_batches) 221 | for il, lossname in enumerate(losses.keys()): 222 | losses[lossname] += outputs[len(output_list) + il] 223 | outstr += '%s: %f, ' % (lossname, outputs[len(output_list) + il]) 224 | log_string(outstr) 225 | # summary 226 | outstr = "Summary: " 227 | for lossname in losses.keys(): 228 | outstr += '%s: %f, ' % (lossname, losses[lossname] / num_batches) 229 | log_string(outstr) 230 | 231 | if __name__ == "__main__": 232 | 233 | # test accuracy 234 | test() 235 | 236 | -------------------------------------------------------------------------------- /utils/output_utils.py: -------------------------------------------------------------------------------- 1 | import json 2 | import os 3 | import sys 4 | import struct 5 | BASE_DIR = os.path.dirname(os.path.abspath(__file__)) 6 | sys.path.append(os.path.dirname(os.path.abspath(__file__))) # model 7 | import numpy as np 8 | import matplotlib as mpl 9 | import matplotlib.pyplot as plt 10 | mpl.use('Agg') 11 | 12 | def save_sdf_bin(bin_fn, output_sdf, res): 13 | f_sdf_bin = open(bin_fn, 'wb') 14 | 15 | f_sdf_bin.write(struct.pack('i', -(res-1))) # write an int 16 | f_sdf_bin.write(struct.pack('i', (res-1))) # write an int 17 | f_sdf_bin.write(struct.pack('i', (res-1))) # write an int 18 | 19 | positions = [-1.,-1.,-1.,1.,1.,1.] 20 | positions = struct.pack('d'*len(positions), *positions) 21 | f_sdf_bin.write(positions) 22 | 23 | sdf = struct.pack('f'*len(output_sdf), *output_sdf) 24 | f_sdf_bin.write(sdf) 25 | f_sdf_bin.close() 26 | 27 | ############################ 28 | ## Visualize Results ## 29 | ############################ 30 | 31 | color_map = json.load(open(os.path.join(BASE_DIR, 'part_color_mapping.json'), 'r')) 32 | 33 | def output_bounding_box_withcorners(box_corners, seg, out_file): 34 | # ############## 0 1 2 3 4 5 6 7 35 | corner_indexes = [[0, 1, 2], [0, 1, 5], [0, 4, 2], [0, 4, 5], [3, 1, 2], [3, 1, 5], [3, 4, 2], [3, 4, 5]] 36 | line_indexes = [[0, 1], [0, 2], [0, 4], [1, 3], [1, 5], [2, 3], [2, 6], [3, 7], [4, 5], [4, 6], [5, 7], [6, 7]] 37 | with open(out_file, 'w') as f: 38 | l = box_corners.shape[0] 39 | for i in range(l): 40 | box = box_corners[i] 41 | color = color_map[seg[i]] 42 | for line_index in line_indexes: 43 | corner0 = box[line_index[0]] 44 | corner1 = box[line_index[1]] 45 | print(corner0.shape) 46 | dist = np.linalg.norm(corner0 - corner1) 47 | dot_num = int(dist / 0.005) 48 | delta = (corner1 - corner0) / dot_num 49 | for idot in range(dot_num): 50 | plotdot = corner0 + idot * delta 51 | f.write( 52 | 'v %f %f %f %f %f %f\n' % (plotdot[0], plotdot[1], plotdot[2], color[0], color[1], color[2])) 53 | 54 | 55 | def output_bounding_box(boxes, seg, out_file): 56 | # ############## 0 1 2 3 4 5 6 7 57 | #box:nx8x3 58 | corner_indexes = [[0, 1, 2], [0, 1, 5], [0, 4, 2], [0, 4, 5], [3, 1, 2], [3, 1, 5], [3, 4, 2], [3, 4, 5]] 59 | line_indexes = [[0, 1], [0, 2], [0, 4], [1, 3], [1, 5], [2, 3], [2, 6], [3, 7], [4, 5], [4, 6], [5, 7], [6, 7]] 60 | with open(out_file, 'w') as f: 61 | l = boxes.shape[0] 62 | for i in range(l): 63 | box = boxes[i] 64 | color = color_map[seg[i]] 65 | for line_index in line_indexes: 66 | corner0 = box[corner_indexes[line_index[0]]] 67 | corner1 = box[corner_indexes[line_index[1]]] 68 | dist = np.linalg.norm(corner0 - corner1) 69 | dot_num = int(dist / 0.005) 70 | delta = (corner1 - corner0) / dot_num 71 | for idot in range(dot_num): 72 | plotdot = corner0 + idot * delta 73 | f.write( 74 | 'v %f %f %f %f %f %f\n' % (plotdot[0], plotdot[1], plotdot[2], color[0], color[1], color[2])) 75 | 76 | 77 | def output_color_point_cloud(data, seg, out_file): 78 | with open(out_file, 'w') as f: 79 | l = len(seg) 80 | for i in range(l): 81 | color = color_map[seg[i]] 82 | f.write('v %f %f %f %f %f %f\n' % (data[i][0], data[i][1], data[i][2], color[0], color[1], color[2])) 83 | 84 | 85 | def output_point_cloud_rgb(data, rgb, out_file): 86 | with open(out_file, 'w') as f: 87 | l = len(data) 88 | for i in range(l): 89 | f.write('v %f %f %f %f %f %f\n' % (data[i][0], data[i][1], data[i][2], rgb[i][0], rgb[i][1], rgb[i][2])) 90 | 91 | 92 | def output_color_point_cloud_red_blue(data, seg, out_file): 93 | with open(out_file, 'w') as f: 94 | l = len(seg) 95 | for i in range(l): 96 | if seg[i] == 1: 97 | color = [0, 0, 1] 98 | elif seg[i] == 0: 99 | color = [1, 0, 0] 100 | else: 101 | color = [0, 0, 0] 102 | f.write('v %f %f %f %f %f %f\n' % (data[i][0], data[i][1], data[i][2], color[0], color[1], color[2])) 103 | 104 | 105 | ##define color heat map 106 | norm = mpl.colors.Normalize(vmin=0, vmax=255) 107 | magma_cmap = plt.cm.get_cmap('magma') 108 | magma_rgb = [] 109 | for i in range(0, 255): 110 | k = mpl.colors.colorConverter.to_rgb(magma_cmap(norm(i))) 111 | magma_rgb.append(k) 112 | 113 | 114 | def output_scale_point_cloud(data, scales, out_file): 115 | with open(out_file, 'w') as f: 116 | l = len(scales) 117 | for i in range(l): 118 | scale = int(scales[i]*254) 119 | if scale > 254: 120 | scale = 254 121 | if scale < 0: 122 | scale = 0 123 | color = magma_rgb[scale] 124 | f.write('v %f %f %f %f %f %f\n' % (data[i][0], data[i][1], data[i][2], color[0], color[1], color[2])) 125 | -------------------------------------------------------------------------------- /utils/part_color_mapping.json: -------------------------------------------------------------------------------- 1 | [[0.57, 0.15, 0.43], [0.85, 0.57, 0.29], [0.7100000000000001, 0.7100000000000001, 0.01], [0.01, 0.7100000000000001, 0.15], [0.01, 0.57, 0.85], [0.43, 0.01, 0.7100000000000001], [0.43, 0.7100000000000001, 0.57], [0.29, 0.29, 0.29], [0.29, 0.7100000000000001, 0.7100000000000001], [0.57, 0.57, 0.29], [0.57, 0.7100000000000001, 0.7100000000000001], [0.01, 0.01, 0.29], [0.29, 0.57, 0.7100000000000001], [0.29, 0.15, 0.57], [0.29, 0.7100000000000001, 0.43], [0.57, 0.29, 0.01], [0.29, 0.15, 0.15], [0.7100000000000001, 0.29, 0.01], [0.01, 0.85, 0.15], [0.85, 0.01, 0.01], [0.29, 0.15, 0.7100000000000001], [0.7100000000000001, 0.15, 0.43], [0.29, 0.43, 0.7100000000000001], [0.43, 0.43, 0.7100000000000001], [0.29, 0.57, 0.01], [0.57, 0.29, 0.29], [0.57, 0.85, 0.15], [0.15, 0.29, 0.29], [0.15, 0.7100000000000001, 0.15], [0.85, 0.01, 0.29], [0.43, 0.85, 0.29], [0.43, 0.29, 0.85], [0.57, 0.85, 0.85], [0.15, 0.57, 0.01], [0.57, 0.29, 0.15], [0.7100000000000001, 0.85, 0.57], [0.57, 0.01, 0.57], [0.01, 0.85, 0.43], [0.01, 0.01, 0.01], [0.85, 0.01, 0.43], [0.57, 0.43, 0.57], [0.85, 0.01, 0.57], [0.01, 0.43, 0.43], [0.01, 0.29, 0.85], [0.57, 0.57, 0.7100000000000001], [0.7100000000000001, 0.29, 0.57], [0.57, 0.7100000000000001, 0.43], [0.29, 0.15, 0.01], [0.57, 0.15, 0.15], [0.85, 0.57, 0.85], [0.85, 0.29, 0.85], [0.85, 0.15, 0.01], [0.85, 0.7100000000000001, 0.01], [0.01, 0.57, 0.15], [0.43, 0.01, 0.43], [0.57, 0.15, 0.85], [0.01, 0.29, 0.57], [0.29, 0.85, 0.43], [0.57, 0.29, 0.43], [0.43, 0.01, 0.29], [0.15, 0.85, 0.7100000000000001], [0.85, 0.57, 0.43], [0.01, 0.15, 0.57], [0.7100000000000001, 0.7100000000000001, 0.29], [0.7100000000000001, 0.15, 0.57], [0.43, 0.43, 0.29], [0.7100000000000001, 0.43, 0.43], [0.01, 0.43, 0.57], [0.57, 0.01, 0.15], [0.57, 0.57, 0.01], [0.29, 0.01, 0.29], [0.7100000000000001, 0.01, 0.29], [0.85, 0.85, 0.7100000000000001], [0.85, 0.15, 0.29], [0.43, 0.29, 0.57], [0.43, 0.43, 0.85], [0.85, 0.15, 0.85], [0.57, 0.85, 0.29], [0.57, 0.7100000000000001, 0.01], [0.7100000000000001, 0.85, 0.15], [0.85, 0.7100000000000001, 0.43], [0.01, 0.15, 0.01], [0.85, 0.29, 0.43], [0.43, 0.85, 0.15], [0.15, 0.01, 0.15], [0.7100000000000001, 0.7100000000000001, 0.85], [0.43, 0.29, 0.01], [0.15, 0.43, 0.29], [0.7100000000000001, 0.57, 0.15], [0.29, 0.85, 0.29], [0.29, 0.7100000000000001, 0.57], [0.57, 0.85, 0.7100000000000001], [0.15, 0.01, 0.85], [0.43, 0.15, 0.57], [0.57, 0.57, 0.15], [0.01, 0.57, 0.01], [0.15, 0.29, 0.57], [0.29, 0.57, 0.43], [0.15, 0.7100000000000001, 0.01], [0.15, 0.15, 0.15], [0.43, 0.29, 0.15], [0.7100000000000001, 0.29, 0.7100000000000001], [0.7100000000000001, 0.85, 0.43], [0.15, 0.29, 0.7100000000000001], [0.15, 0.43, 0.57], [0.01, 0.7100000000000001, 0.01], [0.85, 0.29, 0.01], [0.15, 0.01, 0.57], [0.29, 0.29, 0.7100000000000001], [0.15, 0.7100000000000001, 0.29], [0.01, 0.15, 0.43], [0.7100000000000001, 0.01, 0.15], [0.57, 0.43, 0.01], [0.85, 0.43, 0.01], [0.43, 0.85, 0.7100000000000001], [0.85, 0.43, 0.43], [0.85, 0.01, 0.15], [0.01, 0.43, 0.85], [0.15, 0.15, 0.7100000000000001], [0.29, 0.57, 0.85], [0.43, 0.15, 0.15], [0.29, 0.85, 0.85], [0.15, 0.57, 0.29], [0.85, 0.85, 0.85], [0.29, 0.43, 0.43], [0.01, 0.43, 0.29], [0.43, 0.15, 0.7100000000000001], [0.7100000000000001, 0.01, 0.57], [0.7100000000000001, 0.43, 0.15], [0.01, 0.85, 0.01], [0.85, 0.01, 0.7100000000000001], [0.57, 0.43, 0.43], [0.57, 0.85, 0.01], [0.01, 0.57, 0.43], [0.15, 0.15, 0.01], [0.85, 0.43, 0.85], [0.57, 0.15, 0.29], [0.7100000000000001, 0.7100000000000001, 0.57], [0.57, 0.01, 0.85], [0.29, 0.43, 0.15], [0.7100000000000001, 0.57, 0.7100000000000001], [0.43, 0.7100000000000001, 0.85], [0.01, 0.15, 0.15], [0.85, 0.85, 0.57], [0.43, 0.85, 0.01], [0.15, 0.15, 0.85], [0.29, 0.29, 0.43], [0.29, 0.43, 0.57], [0.7100000000000001, 0.29, 0.85], [0.15, 0.15, 0.43], [0.85, 0.7100000000000001, 0.85], [0.85, 0.15, 0.43], [0.43, 0.43, 0.15], [0.57, 0.7100000000000001, 0.15], [0.7100000000000001, 0.43, 0.57], [0.7100000000000001, 0.43, 0.01], [0.85, 0.29, 0.29], [0.85, 0.15, 0.15], [0.43, 0.57, 0.85], [0.01, 0.85, 0.29], [0.29, 0.7100000000000001, 0.15], [0.57, 0.85, 0.57], [0.43, 0.43, 0.57], [0.01, 0.7100000000000001, 0.7100000000000001], [0.57, 0.15, 0.57], [0.57, 0.57, 0.43], [0.85, 0.57, 0.57], [0.85, 0.7100000000000001, 0.7100000000000001], [0.57, 0.7100000000000001, 0.85], [0.15, 0.85, 0.85], [0.29, 0.57, 0.57], [0.15, 0.7100000000000001, 0.85], [0.57, 0.01, 0.29], [0.29, 0.7100000000000001, 0.01], [0.7100000000000001, 0.29, 0.15], [0.85, 0.01, 0.85], [0.29, 0.01, 0.57], [0.29, 0.01, 0.7100000000000001], [0.7100000000000001, 0.85, 0.29], [0.85, 0.29, 0.7100000000000001], [0.43, 0.15, 0.43], [0.01, 0.01, 0.15], [0.01, 0.7100000000000001, 0.57], [0.7100000000000001, 0.15, 0.01], [0.7100000000000001, 0.15, 0.15], [0.29, 0.29, 0.85], [0.01, 0.43, 0.7100000000000001], [0.57, 0.15, 0.01], [0.85, 0.15, 0.7100000000000001], [0.43, 0.43, 0.01], [0.29, 0.85, 0.57], [0.01, 0.29, 0.43], [0.57, 0.43, 0.29], [0.43, 0.29, 0.43], [0.85, 0.7100000000000001, 0.29], [0.7100000000000001, 0.85, 0.85], [0.43, 0.43, 0.43], [0.43, 0.29, 0.7100000000000001], [0.7100000000000001, 0.57, 0.57], [0.57, 0.29, 0.85], [0.01, 0.15, 0.7100000000000001], [0.7100000000000001, 0.7100000000000001, 0.15], [0.15, 0.85, 0.01], [0.43, 0.7100000000000001, 0.7100000000000001], [0.43, 0.57, 0.43], [0.7100000000000001, 0.01, 0.85], [0.29, 0.43, 0.29], [0.57, 0.15, 0.7100000000000001], [0.29, 0.57, 0.15], [0.15, 0.29, 0.43], [0.43, 0.85, 0.57], [0.43, 0.57, 0.57], [0.7100000000000001, 0.01, 0.01], [0.85, 0.85, 0.29], [0.15, 0.01, 0.29], [0.85, 0.29, 0.15], [0.15, 0.01, 0.01], [0.01, 0.01, 0.57], [0.15, 0.57, 0.15], [0.15, 0.43, 0.85], [0.01, 0.01, 0.7100000000000001], [0.85, 0.15, 0.57], [0.29, 0.15, 0.29], [0.15, 0.29, 0.15], [0.43, 0.85, 0.43], [0.01, 0.15, 0.29], [0.85, 0.7100000000000001, 0.15], [0.01, 0.01, 0.85], [0.7100000000000001, 0.57, 0.85], [0.01, 0.85, 0.57], [0.29, 0.85, 0.7100000000000001], [0.15, 0.01, 0.7100000000000001], [0.85, 0.57, 0.15], [0.15, 0.57, 0.85], [0.15, 0.43, 0.15], [0.15, 0.85, 0.57], [0.7100000000000001, 0.85, 0.01], [0.7100000000000001, 0.01, 0.7100000000000001], [0.15, 0.43, 0.43], [0.01, 0.57, 0.7100000000000001], [0.43, 0.01, 0.57], [0.01, 0.57, 0.57], [0.57, 0.43, 0.7100000000000001], [0.7100000000000001, 0.29, 0.29], [0.15, 0.43, 0.7100000000000001], [0.57, 0.43, 0.15], [0.01, 0.7100000000000001, 0.29], [0.7100000000000001, 0.57, 0.01], [0.01, 0.29, 0.15], [0.29, 0.85, 0.01], [0.57, 0.29, 0.57], [0.85, 0.43, 0.29], [0.7100000000000001, 0.43, 0.29], [0.29, 0.7100000000000001, 0.85], [0.85, 0.57, 0.01], [0.01, 0.29, 0.7100000000000001], [0.15, 0.57, 0.7100000000000001], [0.85, 0.57, 0.7100000000000001], [0.85, 0.43, 0.7100000000000001], [0.15, 0.57, 0.43], [0.15, 0.85, 0.29], [0.15, 0.29, 0.85], [0.7100000000000001, 0.29, 0.43], [0.15, 0.15, 0.29], [0.43, 0.7100000000000001, 0.01], [0.29, 0.7100000000000001, 0.29], [0.7100000000000001, 0.7100000000000001, 0.43], [0.29, 0.85, 0.15], [0.43, 0.15, 0.29], [0.29, 0.01, 0.15], [0.57, 0.01, 0.01], [0.85, 0.85, 0.15], [0.43, 0.7100000000000001, 0.15], [0.43, 0.7100000000000001, 0.29], [0.7100000000000001, 0.57, 0.43], [0.29, 0.29, 0.57], [0.29, 0.01, 0.43], [0.85, 0.7100000000000001, 0.57], [0.57, 0.29, 0.7100000000000001], [0.43, 0.29, 0.29], [0.7100000000000001, 0.43, 0.7100000000000001], [0.43, 0.57, 0.29], [0.43, 0.01, 0.15], [0.15, 0.7100000000000001, 0.57], [0.01, 0.29, 0.29], [0.29, 0.01, 0.01], [0.7100000000000001, 0.15, 0.85], [0.57, 0.7100000000000001, 0.29], [0.57, 0.7100000000000001, 0.57], [0.15, 0.29, 0.01], [0.29, 0.43, 0.01], [0.7100000000000001, 0.15, 0.7100000000000001], [0.85, 0.85, 0.43], [0.7100000000000001, 0.15, 0.29], [0.7100000000000001, 0.7100000000000001, 0.7100000000000001], [0.29, 0.57, 0.29], [0.85, 0.43, 0.57], [0.01, 0.57, 0.29], [0.57, 0.01, 0.43], [0.01, 0.29, 0.01], [0.29, 0.01, 0.85], [0.43, 0.57, 0.15], [0.85, 0.85, 0.01], [0.29, 0.15, 0.43], [0.29, 0.29, 0.15], [0.01, 0.43, 0.01], [0.43, 0.85, 0.85], [0.15, 0.7100000000000001, 0.7100000000000001], [0.15, 0.85, 0.43], [0.7100000000000001, 0.85, 0.7100000000000001], [0.7100000000000001, 0.01, 0.43], [0.15, 0.43, 0.01], [0.43, 0.57, 0.01], [0.7100000000000001, 0.57, 0.29], [0.01, 0.85, 0.85], [0.01, 0.85, 0.7100000000000001], [0.01, 0.7100000000000001, 0.85], [0.43, 0.7100000000000001, 0.43], [0.43, 0.15, 0.01], [0.57, 0.85, 0.43], [0.85, 0.43, 0.15], [0.01, 0.15, 0.85], [0.85, 0.29, 0.57], [0.01, 0.01, 0.43], [0.57, 0.01, 0.7100000000000001], [0.29, 0.29, 0.01], [0.57, 0.43, 0.85], [0.43, 0.15, 0.85], [0.01, 0.7100000000000001, 0.43], [0.15, 0.57, 0.57], [0.15, 0.15, 0.57], [0.29, 0.43, 0.85], [0.43, 0.01, 0.01], [0.57, 0.57, 0.85], [0.15, 0.7100000000000001, 0.43], [0.43, 0.01, 0.85], [0.15, 0.01, 0.43], [0.43, 0.57, 0.7100000000000001], [0.29, 0.15, 0.85], [0.15, 0.85, 0.15], [0.7100000000000001, 0.43, 0.85], [0.01, 0.43, 0.15], [0.57, 0.57, 0.57]] 2 | --------------------------------------------------------------------------------