Commit 5e008c87 authored by Vadim Pisarevsky's avatar Vadim Pisarevsky

Merge pull request #276 from Wangyida:cnn_3dobj

parents 8d2c1321 44663a24
......@@ -47,7 +47,7 @@ $ cmake -D OPENCV_EXTRA_MODULES_PATH=<opencv_contrib>/modules -D BUILD_opencv_re
19. **opencv_xfeatures2d**: Extra 2D Features Framework containing experimental and non-free 2D feature algorithms.
20. **opencv_ximgproc**: Extended Image Processing: Structured Forests / Domain Transform Filter / Guided Filter / Adaptive Manifold Filter / Joint Bilateral Filter / Superpixels.
21. **opencv_xobjdetect**: Integral Channel Features Detector Framework.
22. **opencv_xphoto**: Additional photo processing algorithms: Color balance / Denoising / Inpainting.
......
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR})
find_package(Caffe)
if(Caffe_FOUND)
message(STATUS "Caffe: YES")
set(HAVE_CAFFE 1)
else()
message(STATUS "Caffe: NO")
endif()
find_package(Protobuf)
if(Protobuf_FOUND)
message(STATUS "Protobuf: YES")
set(HAVE_PROTOBUF 1)
else()
message(STATUS "Protobuf: NO")
endif()
find_package(Glog)
if(Glog_FOUND)
message(STATUS "Glog: YES")
set(HAVE_GLOG 1)
else()
message(STATUS "Glog: NO")
endif()
if(HAVE_CAFFE)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cnn_3dobj_config.hpp.in
${CMAKE_CURRENT_SOURCE_DIR}/include/opencv2/cnn_3dobj_config.hpp @ONLY)
include_directories(${CMAKE_CURRENT_BINARY_DIR})
if(${Caffe_FOUND})
include_directories(${Caffe_INCLUDE_DIR})
endif()
set(the_description "CNN for 3D object recognition and pose estimation including a completed Sphere View on 3D objects")
ocv_define_module(cnn_3dobj opencv_core opencv_imgproc opencv_viz opencv_highgui OPTIONAL WRAP python)
if(${Caffe_FOUND})
target_link_libraries(opencv_cnn_3dobj ${Caffe_LIBS} ${Glog_LIBS} ${Protobuf_LIBS})
endif()
endif()
# Caffe package for CNN Triplet training
unset(Caffe_FOUND)
find_path(Caffe_INCLUDE_DIR NAMES caffe/caffe.hpp caffe/common.hpp caffe/net.hpp caffe/proto/caffe.pb.h caffe/util/io.hpp caffe/vision_layers.hpp
HINTS
/usr/local/include)
find_library(Caffe_LIBS NAMES caffe
HINTS
/usr/local/lib)
if(Caffe_LIBS AND Caffe_INCLUDE_DIR)
set(Caffe_FOUND 1)
endif()
# Glog package for CNN Triplet training
unset(Glog_FOUND)
find_library(Glog_LIBS NAMES glog
HINTS
/usr/local/lib)
if(Glog_LIBS)
set(Glog_FOUND 1)
endif()
# Protobuf package for CNN Triplet training
unset(Protobuf_FOUND)
find_library(Protobuf_LIBS NAMES protobuf
HINTS
/usr/local/lib)
if(Protobuf_LIBS)
set(Protobuf_FOUND 1)
endif()
#Convolutional Neural Network for 3D object classification and pose estimation.
===========================================================
#Module Description on cnn_3dobj:
####This learning structure construction and feature extraction concept is based on Convolutional Neural Network, the main reference paper could be found at:
<https://cvarlab.icg.tugraz.at/pubs/wohlhart_cvpr15.pdf>.
####The author provided Codes on Theano on:
<https://cvarlab.icg.tugraz.at/projects/3d_object_detection/>.
####I implemented the training and feature extraction codes mainly based on CAFFE project(<http://caffe.berkeleyvision.org/>) which will be compiled as libcaffe for the cnn_3dobj OpenCV module, codes are mainly concentrating on triplet and pair-wise jointed loss layer, the training data arrangement is also important which basic training information.
####Codes about my triplet version of caffe are released on Github:
<https://github.com/Wangyida/caffe/tree/cnn_triplet>.
####You can git it through:
```
$ git clone https://github.com/Wangyida/caffe/tree/cnn_triplet.
```
===========================================================
#Module Building Process:
####Prerequisite for this module: protobuf and caffe, for the libcaffe installation, you can install it on standard system path for the aim of being able to be linked by this OpenCV module when compiling and function using. Using: -D CMAKE_INSTALL_PREFIX=/usr/local as an building option when you cmake, the building process on Caffe on system could be like this:
```
$ cd <caffe_source_directory>
$ mkdir biuld
$ cd build
$ cmake -D CMAKE_INSTALL_PREFIX=/usr/local ..
$ make all -j4
$ sudo make install
```
####After all these steps, the headers and libs of CAFFE will be set on /usr/local/ path, and when you compiling opencv with opencv_contrib modules as below, the protobuf and caffe will be recognized as already installed while building. Protobuf is needed.
#Compiling OpenCV
```
$ cd <opencv_source_directory>
$ mkdir build
$ cd build
$ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=ON -D WITH_V4L=ON -D WITH_QT=OFF -D WITH_OPENGL=ON -D WITH_VTK=ON -D INSTALL_TESTS=ON -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules ..
$ make -j4
$ sudo make install
```
##Tips on compiling problems:
####If you encouter the no declaration errors when you 'make', it might becaused that you have installed the older version of cnn_3dobj module and the header file changed in a newly released version of codes. This problem is the cmake and make can't detect the header should be updated and it keeps the older header remains in /usr/local/include/opencv2 whithout updating. This error could be solved by remove the installed older version of cnn_3dobj module by:
```
$ cd /
$ cd usr/local/include/opencv2/
$ sudo rm -rf cnn_3dobj.hpp
```
####And redo the compiling steps above again.
===========================================================
#Building samples
```
$ cd <opencv_contrib>/modules/cnn_3dobj/samples
$ mkdir build
$ cd build
$ cmake ..
$ make
```
===========================================================
#Demos
##Demo1: training data generation
####Imagas generation from different pose, by default there are 4 models used, there will be 276 images in all which each class contains 69 iamges, if you want to use additional .ply models, it is necessary to change the class number parameter to the new class number and also give it a new class label. If you will train net work and extract feature from RGB images set the parameter rgb_use as 1.
```
$ ./sphereview_test -plymodel=../data/3Dmodel/ape.ply -label_class=0 -cam_head_x=0 -cam_head_y=0 -cam_head_z=1
```
####press 'Q' to start 2D image genaration
```
$ ./sphereview_test -plymodel=../data/3Dmodel/ant.ply -label_class=1 -cam_head_x=0 -cam_head_y=-1 -cam_head_z=0
```
```
$ ./sphereview_test -plymodel=../data/3Dmodel/cow.ply -label_class=2 -cam_head_x=0 -cam_head_y=-1 -cam_head_z=0
```
```
$ ./sphereview_test -plymodel=../data/3Dmodel/plane.ply -label_class=3 -cam_head_x=0 -cam_head_y=-1 -cam_head_z=0
```
```
$ ./sphereview_test -plymodel=../data/3Dmodel/bunny.ply -label_class=4 -cam_head_x=0 -cam_head_y=-1 -cam_head_z=0
```
```
$ ./sphereview_test -plymodel=../data/3Dmodel/horse.ply -label_class=5 -cam_head_x=0 -cam_head_y=0 -cam_head_z=-1
```
####When all images are created in images_all folder as a collection of training images for network tranining and as a gallery of reference images for the classification part, then proceed on.
####After this demo, the binary files of images and labels will be stored as 'binary_image' and 'binary_label' in current path, you should copy them into the leveldb folder in Caffe triplet training, for example: copy these 2 files in <caffe_source_directory>/data/linemod and rename them as 'binary_image_train', 'binary_image_test' and 'binary_label_train', 'binary_label_train'. Here I use the same as trianing and testing data, you can use different data for training and testing the performance in the CAFFE training process. It's important to observe the loss of testing data to check whether training data is suitable for the your aim. Loss should be obseved as keep decreasing and remain on a much smaller number than the initial loss.
####You could start triplet tranining using Caffe like this:
```
$ cd
$ cd <caffe_source_directory>
$ ./examples/triplet/create_3d_triplet.sh
$ ./examples/triplet/train_3d_triplet.sh
```
####After doing this, you will get .caffemodel files as the trained parameter of net work. I have already provide the net definition .prototxt files and the pretrained .caffemodel in <opencv_contrib>/modules/cnn_3dobj/testdata/cv folder, you could just use them without training in caffe.
===========================================================
##Demo2: feature extraction and classification
```
$ cd
$ cd <opencv_contrib>/modules/cnn_3dobj/samples/build
```
####Classifier, this will extracting the feature of a single image and compare it with features of gallery samples for prediction. This demo uses a set of images for feature extraction in a given path, these features will be a reference for prediction on target image. The caffe model and network prototxt file is attached in <opencv_contrib>/modules/cnn_3dobj/testdata/cv. Just run:
```
$ ./classify_test
```
####if the classification and pose estimation issue need to extract mean got from all training images, you can run this:
```
$ ./classify_test -mean_file=../data/images_mean/triplet_mean.binaryproto
```
===========================================================
##Demo3: model performance test
####This demo will have a test on the performance of trained CNN model on several images. If the the model fail on telling different samples from seperate classes or confused on samples with similar pose but from different classes, it will give some information on the model analysis.
```
$ ./model_test
```
===========================================================
#Test
####If you want to have a test on cnn_3dobj module, the path of test data must be set in advance:
```
$ export OPENCV_TEST_DATA_PATH=<opencv_contrib>/modules/cnn_3dobj/testdata
```
#ifndef __OPENCV_CNN_3DOBJ_CONFIG_HPP__
#define __OPENCV_CNN_3DOBJ_CONFIG_HPP__
// HAVE CAFFE
#cmakedefine HAVE_CAFFE
#endif
@Article{hinterstoisser2008panter,
author = {Hinterstoisser, S. and Benhimane, S. and and Lepetit, V. and Navab, N.},
title = {Simultaneous Recognition and Homography Extraction of Local Patches with a Simple Linear Classifier},
booktitle = {BMVC British Machine Vision Conference 2008},
year = {2008}
}
@inproceedings{wohlhart15,
author = {Paul Wohlhart and Vincent Lepetit},
title = {Learning Descriptors for Object Recognition and 3D Pose Estimation},
booktitle = {Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition},
year = {2015}
}
/*
By downloading, copying, installing or using the software you agree to this license.
If you do not agree to this license, do not download, install,
copy or use the software.
License Agreement
For Open Source Computer Vision Library
(3-clause BSD License)
Copyright (C) 2000-2015, Intel Corporation, all rights reserved.
Copyright (C) 2009-2011, Willow Garage Inc., all rights reserved.
Copyright (C) 2009-2015, NVIDIA Corporation, all rights reserved.
Copyright (C) 2010-2013, Advanced Micro Devices, Inc., all rights reserved.
Copyright (C) 2015, OpenCV Foundation, all rights reserved.
Copyright (C) 2015, Itseez Inc., all rights reserved.
Third party copyrights are property of their respective owners.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the names of the copyright holders nor the names of the contributors
may be used to endorse or promote products derived from this software
without specific prior written permission.
This software is provided by the copyright holders and contributors "as is" and
any express or implied warranties, including, but not limited to, the implied
warranties of merchantability and fitness for a particular purpose are disclaimed.
In no event shall copyright holders or contributors be liable for any direct,
indirect, incidental, special, exemplary, or consequential damages
(including, but not limited to, procurement of substitute goods or services;
loss of use, data, or profits; or business interruption) however caused
and on any theory of liability, whether in contract, strict liability,
or tort (including negligence or otherwise) arising in any way out of
the use of this software, even if advised of the possibility of such damage.
*/
#ifndef __OPENCV_CNN_3DOBJ_HPP__
#define __OPENCV_CNN_3DOBJ_HPP__
#ifdef __cplusplus
#include <string>
#include <fstream>
#include <vector>
#include <stdio.h>
#include <math.h>
#include <iostream>
#include <set>
#include <string.h>
#include <stdlib.h>
#include <dirent.h>
#define CPU_ONLY
#include <opencv2/cnn_3dobj_config.hpp>
#ifdef HAVE_CAFFE
#include <caffe/blob.hpp>
#include <caffe/common.hpp>
#include <caffe/net.hpp>
#include <caffe/proto/caffe.pb.h>
#include <caffe/util/io.hpp>
#include <caffe/vision_layers.hpp>
#endif
#include "opencv2/viz/vizcore.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/highgui/highgui_c.h"
#include "opencv2/imgproc.hpp"
using caffe::Blob;
using caffe::Caffe;
using caffe::Datum;
using caffe::Net;
/** @defgroup cnn_3dobj 3D object recognition and pose estimation API
As CNN based learning algorithm shows better performance on the classification issues,
the rich labeled data could be more useful in the training stage. 3D object classification and pose estimation
is a jointed mission aimming at seperate different posed apart in the descriptor form.
In the training stage, we prepare 2D training images generated from our module with their
class label and pose label. We fully exploit the information lies in their labels
by using a triplet and pair-wise jointed loss function in CNN training.
As CNN based learning algorithm shows better performance on the classification issues,
the rich labeled data could be more useful in the training stage. 3D object classification and pose estimation
is a jointed mission aiming at separate different posea apart in the descriptor form.
In the training stage, we prepare 2D training images generated from our module with their
class label and pose label. We fully exploit the information that lies in their labels
by using a triplet and pair-wise jointed loss function in CNN training.
Both class and pose label are in consideration in the triplet loss. The loss score
will be smaller when features from the same class and same pose is more similar
and features from different classes or different poses will lead to a much larger loss score.
This loss is also jointed with a pair wise component to make sure the loss is never be zero
and have a restriction on the model scale.
About the training and feature extraction process, it is a rough implementation by using OpenCV
and Caffe from the idea of Paul Wohlhart. The principal purpose of this API is constructing
a well labeled database from .ply models for CNN training with triplet loss and extracting features
with the constructed model for prediction or other purpose of pattern recognition, algorithms into two main Class:
**icoSphere: methods belonging to this class generates 2D images from a 3D model, together with their class and pose from camera view labels.
**descriptorExtractor: methods belonging to this class extract descriptors from 2D images which is
discriminant on category prediction and pose estimation.
@note This API need Caffe with triplet version which is designed for this module
<https://github.com/Wangyida/caffe/tree/cnn_triplet>.
*/
namespace cv
{
namespace cnn_3dobj
{
//! @addtogroup cnn_3dobj
//! @{
/** @brief Icosohedron based camera view data generator.
The class create some sphere views of camera towards a 3D object meshed from .ply files @cite hinterstoisser2008panter .
*/
/************************************ Data Generation Class ************************************/
class CV_EXPORTS_W icoSphere
{
private:
/** @brief X position of one base point on the initial Icosohedron sphere,
Y is set to be 0 as default.
*/
float X;
/** @brief Z position of one base point on the initial Icosohedron sphere.
*/
float Z;
/** @brief A threshold for the dupicated points elimination.
*/
float diff;
/** @brief Temp camera position for duplex position elimination.
*/
std::vector<cv::Point3d> CameraPos_temp;
/** @brief Make all view points having the same distance from the focal point used by the camera view.
*/
CV_WRAP void norm(float v[]);
/** @brief Add a new view point.
*/
CV_WRAP void add(float v[]);
/** @brief Generate new view points from all triangles.
*/
CV_WRAP void subdivide(float v1[], float v2[], float v3[], int depth);
public:
/** @brief Camera position on the sphere after duplicated points elimination.
*/
std::vector<cv::Point3d> CameraPos;
/** @brief Generating a sphere by mean of a iteration based points selection process.
@param radius_in Another radius used for adjusting the view distance.
@param depth_in Number of interations for increasing the points on sphere.
*/
icoSphere(float radius_in, int depth_in);
/** @brief Get the center of points on surface in .ply model.
@param cloud Point cloud used for computing the center point.
*/
CV_WRAP cv::Point3d getCenter(cv::Mat cloud);
/** @brief Get the proper camera radius from the view point to the center of model.
@param cloud Point cloud used for computing the center point.
@param center center point of the point cloud.
*/
CV_WRAP float getRadius(cv::Mat cloud, cv::Point3d center);
/** @brief Suit the position of bytes in 4 byte data structure for particular system.
*/
CV_WRAP static int swapEndian(int val);
/** @brief Create header in binary files collecting the image data and label.
@param num_item Number of items.
@param rows Rows of a single sample image.
@param cols Columns of a single sample image.
@param headerPath Path where the header will be stored.
*/
CV_WRAP static void createHeader(int num_item, int rows, int cols, const char* headerPath);
/** @brief Write binary files used for training in other open source project including Caffe.
@param filenameImg Path which including a set of images.
@param binaryPath Path which will output a binary file.
@param headerPath Path which header belongs to.
@param num_item Number of samples.
@param label_class Class label of the sample.
@param x Pose label of X.
@param y Pose label of Y.
@param z Pose label of Z.
@param isrgb Option for choice of using RGB images or not.
*/
CV_WRAP static void writeBinaryfile(String filenameImg, const char* binaryPath, const char* headerPath, int num_item, int label_class, int x, int y, int z, int isrgb);
};
/** @brief Caffe based 3D images descriptor.
A class to extract features from an image. The so obtained descriptors can be used for classification and pose estimation goals @cite wohlhart15.
*/
/************************************ Feature Extraction Class ************************************/
class CV_EXPORTS_W descriptorExtractor
{
private:
caffe::Net<float>* convnet;
cv::Size input_geometry;
int num_channels;
bool net_set;
int net_ready;
cv::Mat mean_;
String deviceType;
int deviceId;
/** @brief Load the mean file in binaryproto format if it is needed.
@param mean_file Path of mean file which stores the mean of training images, it is usually generated by Caffe tool.
*/
void setMean(const String& mean_file);
/** @brief Wrap the input layer of the network in separate cv::Mat objects(one per channel).
This way we save one memcpy operation and we don't need to rely on cudaMemcpy2D.
The last preprocessing operation will write the separate channels directly to the input layer.
*/
void wrapInput(std::vector<cv::Mat>* input_channels);
/** @brief Convert the input image to the input image format of the network.
*/
void preprocess(const cv::Mat& img, std::vector<cv::Mat>* input_channels);
public:
/** @brief Set the device for feature extraction, if the GPU is used, there should be a device_id.
@param device_type CPU or GPU.
@param device_id ID of GPU.
*/
descriptorExtractor(const String& device_type, int device_id = 0);
/** @brief Get device type information for feature extraction.
*/
String getDeviceType();
/** @brief Get device ID information for feature extraction.
*/
int getDeviceId();
/** @brief Set device type information for feature extraction.
Useful to change device without the need to reload the net.
@param device_type CPU or GPU.
*/
void setDeviceType(const String& device_type);
/** @brief Set device ID information for feature extraction.
Useful to change device without the need to reload the net. Only used for GPU.
@param device_id ID of GPU.
*/
void setDeviceId(const int& device_id);
/** @brief Initiate a classification structure, the net work parameter is stored in model_file,
the network structure is stored in trained_file, you can decide whether to use mean images or not.
@param model_file Path of caffemodel which including all parameters in CNN.
@param trained_file Path of prototxt which defining the structure of CNN.
@param mean_file Path of mean file(option).
*/
void loadNet(const String& model_file, const String& trained_file, const String& mean_file = "");
/** @brief Extract features from a single image or from a vector of images.
If loadNet was not called before, this method invocation will fail.
@param inputimg Input images.
@param feature Output features.
@param feature_blob Layer which the feature is extracted from.
*/
void extract(InputArrayOfArrays inputimg, OutputArray feature, String feature_blob);
};
//! @}
}
}
#endif /* CNN_3DOBJ_HPP_ */
#endif
cmake_minimum_required(VERSION 2.8)
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb ")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
project(cnn_3dobj)
find_package(OpenCV REQUIRED)
set(SOURCES_generator demo_sphereview_data.cpp)
include_directories(${OpenCV_INCLUDE_DIRS})
add_executable(sphereview_test ${SOURCES_generator})
target_link_libraries(sphereview_test opencv_core opencv_imgproc opencv_highgui opencv_cnn_3dobj opencv_xfeatures2d)
set(SOURCES_classifier demo_classify.cpp)
add_executable(classify_test ${SOURCES_classifier})
target_link_libraries(classify_test opencv_core opencv_imgproc opencv_highgui opencv_cnn_3dobj opencv_xfeatures2d)
set(SOURCES_modelanalysis demo_model_analysis.cpp)
add_executable(model_test ${SOURCES_modelanalysis})
target_link_libraries(model_test opencv_core opencv_imgproc opencv_highgui opencv_cnn_3dobj opencv_xfeatures2d)
set(SOURCES_video demo_video.cpp)
add_executable(video_test ${SOURCES_video})
target_link_libraries(video_test opencv_core opencv_imgproc opencv_highgui opencv_cnn_3dobj opencv_xfeatures2d)
ply
format ascii 1.0
element vertex 486
property float32 x
property float32 y
property float32 z
element face 912
property list uint8 int32 vertex_indices
end_header
-1.106 3.844 9.073
-0.3523 0.4402 11.07
1.028 3.76 9.209
0.137 -0.5632 10.73
2.01 4.503 5.887
0.07813 5.232 6.794
-0.7266 3.741 3.839
-2.789 3.179 5.07
-0.9185 2.402 3.279
1.445 2.139 3.394
-3.114 1.498 5.285
-1.317 -1.269 8.385
-0.854 -1.319 5.036
-0.9351 5.347 0.6162
-0.8184 2.622 3.235
0.4875 5.529 -0.2241
3.193 2.756 1.633
3.213 1.145 -2.568
-2.25 1.208 2.767
0.3225 0.8339 3.323
1.354 -1.725 1.105
0.1887 1.133 -5.785
-3.637 2.696 0.3325
-3.706 0.8936 -0.5452
-0.4326 -0.8737 -4.095
-2.994 -0.4858 0.9023
0.1252 -2.079 -1.51
2.856 -0.7459 -1.187
2.32 3.733 8.13
2.031 3.721 9.095
2.819 3.567 8.537
1.994 2.581 9.711
2.64 2.491 9.542
3.187 2.528 8.375
1.628 2.491 7.518
1.62 3.721 8.274
0.9868 2.471 8.914
1.552 2.106 9.414
2.657 1.774 8.918
-1.805 3.733 8.13
-2.094 3.721 9.095
-1.306 3.567 8.537
-2.131 2.581 9.711
-1.485 2.491 9.542
-0.938 2.528 8.375
-2.497 2.491 7.518
-2.505 3.721 8.274
-3.138 2.471 8.914
-2.573 2.106 9.414
-1.469 1.774 8.918
1.549 3.638 6.803
1.355 3.638 6.7
1.424 5.126 6.883
1.615 5.083 6.981
1.169 3.638 6.815
1.237 5.115 6.997
1.176 3.638 7.035
1.241 5.061 7.21
1.369 3.638 7.138
1.433 5.018 7.308
1.556 3.638 7.023
1.62 5.029 7.194
1.625 6.512 7.421
1.811 6.429 7.504
1.437 6.49 7.531
1.434 6.386 7.724
1.619 6.304 7.807
1.808 6.326 7.697
1.945 7.702 8.276
2.121 7.585 8.335
1.754 7.672 8.38
1.74 7.525 8.542
1.916 7.408 8.601
2.107 7.439 8.497
2.362 8.615 9.391
2.526 8.473 9.417
2.168 8.578 9.487
2.138 8.398 9.608
2.303 8.255 9.635
2.497 8.293 9.539
2.847 9.189 10.69
2.998 9.03 10.68
2.649 9.148 10.78
2.603 8.947 10.85
2.753 8.788 10.84
2.95 8.83 10.75
3.368 9.385 12.08
3.503 9.22 12.03
3.167 9.342 12.16
3.101 9.134 12.18
3.236 8.97 12.13
3.438 9.013 12.06
3.889 9.189 13.48
4.01 9.03 13.39
3.684 9.148 13.54
3.599 8.947 13.51
3.719 8.788 13.42
3.925 8.83 13.36
4.374 8.615 14.77
4.481 8.473 14.65
4.165 8.578 14.83
4.063 8.398 14.76
4.17 8.255 14.63
4.379 8.293 14.57
4.791 7.702 15.89
4.886 7.585 15.73
4.579 7.672 15.94
4.462 7.525 15.82
4.556 7.408 15.66
4.769 7.439 15.62
5.111 6.512 16.74
5.196 6.429 16.56
4.896 6.49 16.78
4.768 6.386 16.64
4.853 6.304 16.46
5.068 6.326 16.42
-1.141 5.126 6.883
-1.072 3.638 6.7
-1.266 3.638 6.803
-1.332 5.083 6.981
-0.9541 5.115 6.997
-0.886 3.638 6.815
-0.9585 5.061 7.21
-0.8928 3.638 7.035
-1.15 5.018 7.308
-1.086 3.638 7.138
-1.337 5.029 7.194
-1.272 3.638 7.023
-1.342 6.512 7.421
-1.528 6.429 7.504
-1.154 6.49 7.531
-1.151 6.386 7.724
-1.336 6.304 7.807
-1.525 6.326 7.697
-1.662 7.702 8.276
-1.838 7.585 8.335
-1.471 7.672 8.38
-1.457 7.525 8.542
-1.633 7.408 8.601
-1.824 7.439 8.497
-2.079 8.615 9.391
-2.243 8.473 9.417
-1.885 8.578 9.487
-1.855 8.398 9.608
-2.02 8.255 9.635
-2.214 8.293 9.539
-2.564 9.189 10.69
-2.715 9.03 10.68
-2.366 9.148 10.78
-2.32 8.947 10.85
-2.47 8.788 10.84
-2.667 8.83 10.75
-3.085 9.385 12.08
-3.22 9.22 12.03
-2.884 9.342 12.16
-2.818 9.134 12.18
-2.953 8.97 12.13
-3.155 9.013 12.06
-3.606 9.189 13.48
-3.726 9.03 13.39
-3.4 9.148 13.54
-3.316 8.947 13.51
-3.437 8.788 13.42
-3.642 8.83 13.36
-4.091 8.615 14.77
-4.198 8.473 14.65
-3.882 8.578 14.83
-3.78 8.398 14.76
-3.887 8.255 14.63
-4.096 8.293 14.57
-4.508 7.702 15.89
-4.603 7.585 15.73
-4.296 7.672 15.94
-4.179 7.525 15.82
-4.273 7.408 15.66
-4.485 7.439 15.62
-4.828 6.512 16.74
-4.913 6.429 16.56
-4.613 6.49 16.78
-4.484 6.386 16.64
-4.57 6.304 16.46
-4.784 6.326 16.42
-1.519 -2.27 2.989
-1.987 -1.082 3.408
-2.709 -1.989 3.536
-1.513 -2.259 2.974
-2.524 -1.536 2.471
-4.318 -0.3933 4.187
-4.692 -0.6204 3.123
-6.274 0.9227 4.173
-5.533 1.852 4.043
-6.084 1.387 3.082
-6.844 2.279 4.015
-6.83 1.957 4.012
-6.886 2.118 3.737
-7.536 1.346 4.658
-7.229 0.9683 4.298
-8.053 1.724 3.821
-7.747 1.346 3.46
-9.085 -0.1982 5.078
-9.347 -0.1982 3.597
-8.702 -0.7393 4.247
-10.91 -1.528 5.154
-10.39 -2.11 4.847
-11.08 -1.528 4.148
-10.49 -2.11 4.26
-11.58 -2.509 4.768
-11.57 -2.523 4.76
-11.59 -2.509 4.742
-11.57 -2.523 4.744
-12.39 -3.546 5.269
-11.93 -3.852 5.034
-12.52 -3.546 4.548
-12.87 -4.803 5.622
-12.58 -5.09 4.606
-13.49 -4.516 4.767
-13.11 -6.264 5.38
-14.78 -6.803 5.643
-14.49 -7.092 4.622
-15.35 -8.042 5.637
-14.73 -8.43 5.528
-15.15 -8.236 4.95
-15.78 -9.378 5.503
-15.77 -9.385 5.497
-15.78 -9.375 5.495
-15.78 -9.378 5.486
-15.77 -9.383 5.484
-1.522 -2.262 -1.24
-1.519 -2.258 -1.231
-1.522 -2.262 -1.222
-1.529 -2.27 -1.222
-1.529 -2.27 -1.24
-2.061 -1.082 -0.8906
-2.428 -1.536 -1.907
-3.082 -0.4963 -0.5522
-3.082 -0.4963 -1.91
-3.759 -1.333 -1.628
-5.567 0.1257 -0.8323
-5.665 1.852 -0.8818
-6.417 0.9227 -0.8818
-6.041 1.387 -1.924
-6.95 2.279 -1.137
-6.937 1.957 -1.326
-6.943 2.118 -1.418
-7.378 0.9683 -0.9246
-8.108 1.724 -0.9246
-7.743 1.346 -1.84
-8.797 0.8371 -0.6052
-9.793 0.269 -1.611
-8.891 -0.6654 -1.611
-10.59 -2.11 -0.9326
-10.57 -0.523 -0.8679
-11.3 -1.375 -0.9326
-10.94 -1.742 -1.823
-11.75 -2.506 -1.223
-11.73 -2.523 -1.223
-11.74 -2.514 -1.247
-12.76 -3.466 -1.017
-12.14 -3.852 -1.017
-12.45 -3.659 -1.656
-13.16 -4.803 -0.6001
-12.7 -5.09 -1.55
-13.62 -4.516 -1.55
-13.36 -6.264 -0.8809
-15.05 -6.803 -0.9114
-14.58 -7.092 -1.866
-15.6 -8.042 -1.016
-14.98 -8.43 -1.016
-15.29 -8.236 -1.658
-16.01 -9.378 -1.222
-15.99 -9.385 -1.226
-16.01 -9.375 -1.231
-16.01 -9.378 -1.24
-16 -9.383 -1.24
-1.522 -2.27 -4.918
-2.105 -1.082 -4.684
-2.827 -1.989 -4.812
-1.513 -2.262 -4.935
-2.29 -1.536 -5.749
-4.562 -0.3933 -4.75
-4.55 -0.6204 -5.878
-6.395 0.9227 -5.432
-5.655 1.852 -5.302
-5.844 1.387 -6.393
-6.877 2.279 -5.776
-6.863 1.957 -5.773
-6.821 2.118 -6.051
-7.747 1.346 -5.408
-7.335 0.9683 -5.641
-7.947 1.724 -6.372
-7.536 1.346 -6.605
-9.347 -0.1982 -5.543
-9.085 -0.1982 -7.025
-8.702 -0.7393 -6.193
-11.08 -1.528 -6.095
-10.49 -2.11 -6.206
-10.91 -1.528 -7.101
-10.39 -2.11 -6.794
-11.59 -2.509 -6.689
-11.57 -2.523 -6.691
-11.58 -2.509 -6.715
-11.57 -2.523 -6.707
-12.52 -3.546 -6.495
-12.01 -3.852 -6.559
-12.39 -3.546 -7.217
-13.09 -4.803 -6.326
-12.47 -5.09 -7.18
-13.38 -4.516 -7.341
-13.24 -6.264 -6.637
-14.89 -6.803 -6.96
-14.27 -7.092 -7.819
-15.42 -8.042 -7.159
-14.8 -8.43 -7.051
-15 -8.236 -7.738
-15.78 -9.378 -7.432
-15.77 -9.385 -7.434
-15.78 -9.375 -7.442
-15.78 -9.378 -7.45
-15.77 -9.383 -7.448
1.522 -2.27 -4.918
1.511 -2.258 -4.926
1.513 -2.262 -4.935
2.828 -1.989 -4.812
2.105 -1.082 -4.684
2.29 -1.536 -5.749
4.55 -0.6204 -5.878
4.562 -0.3933 -4.75
6.395 0.9227 -5.432
5.655 1.852 -5.302
5.844 1.387 -6.393
6.877 2.279 -5.776
6.863 1.957 -5.773
6.821 2.118 -6.051
7.335 0.9683 -5.641
7.747 1.346 -5.408
7.947 1.724 -6.372
7.536 1.346 -6.605
9.347 -0.1982 -5.543
9.086 -0.1982 -7.025
8.702 -0.7393 -6.193
11.08 -1.528 -6.095
10.49 -2.11 -6.206
10.91 -1.528 -7.101
10.39 -2.11 -6.794
11.59 -2.509 -6.689
11.57 -2.523 -6.691
11.58 -2.509 -6.715
11.57 -2.523 -6.707
12.52 -3.546 -6.495
12.01 -3.852 -6.559
12.39 -3.546 -7.217
12.47 -5.09 -7.18
13.09 -4.803 -6.326
13.38 -4.516 -7.341
13.24 -6.264 -6.637
14.89 -6.803 -6.96
14.27 -7.092 -7.819
15.42 -8.042 -7.159
14.8 -8.43 -7.051
15 -8.236 -7.738
15.78 -9.378 -7.432
15.77 -9.385 -7.434
15.78 -9.375 -7.442
15.78 -9.378 -7.45
15.77 -9.383 -7.448
-0.9592 -0.9547 10.35
0.007813 0.3928 11.6
-0.7324 1.062 10.63
0.007813 -1.855 11.37
0.007813 -2.459 10.63
0.007813 0.3928 9.662
-0.3928 1.509 10.63
0.7327 1.062 10.63
-0.007813 0.3928 11.6
0.9595 -0.9547 10.35
-0.007813 -1.855 11.37
-0.007813 -2.459 10.63
-0.007813 0.3928 9.662
0.3931 1.509 10.63
1.513 -2.262 2.988
1.511 -2.258 2.979
1.516 -2.262 2.97
1.522 -2.27 2.971
1.52 -2.27 2.989
1.987 -1.082 3.408
2.524 -1.536 2.471
2.933 -0.4963 3.919
3.168 -0.4963 2.581
3.786 -1.333 2.977
5.429 0.1257 4.074
5.534 1.852 4.042
6.274 0.9227 4.173
6.085 1.387 3.082
6.863 1.957 3.827
6.844 2.279 4.015
6.886 2.118 3.737
7.229 0.9683 4.298
7.947 1.724 4.425
7.747 1.346 3.46
8.57 0.8371 4.859
9.726 0.269 4.042
8.838 -0.6654 3.885
10.39 -2.11 4.847
10.37 -0.523 4.909
11.09 -1.375 4.97
10.89 -1.742 4.032
11.59 -2.506 4.763
11.57 -2.523 4.76
11.58 -2.514 4.739
12.55 -3.466 5.142
11.93 -3.852 5.034
12.35 -3.659 4.459
12.58 -5.09 4.606
12.87 -4.803 5.622
13.49 -4.516 4.767
13.11 -6.264 5.38
14.78 -6.803 5.643
14.49 -7.092 4.622
15.35 -8.042 5.637
14.73 -8.43 5.528
15.15 -8.236 4.95
15.78 -9.378 5.503
15.77 -9.385 5.497
15.78 -9.375 5.495
15.78 -9.378 5.486
15.77 -9.383 5.484
1.529 -2.27 -1.222
1.519 -2.258 -1.231
1.522 -2.262 -1.24
2.795 -1.989 -0.8906
2.062 -1.082 -0.8906
2.428 -1.536 -1.907
4.677 -0.6204 -1.642
4.493 -0.3933 -0.5283
6.417 0.9227 -0.8818
5.665 1.852 -0.8818
6.041 1.387 -1.924
6.951 2.279 -1.137
6.937 1.957 -1.137
6.944 2.118 -1.418
7.379 0.9683 -0.9246
7.743 1.346 -0.623
8.108 1.724 -1.538
7.743 1.346 -1.84
9.343 -0.1982 -0.4792
9.343 -0.1982 -1.983
8.82 -0.7393 -1.231
11.15 -1.528 -0.7207
10.59 -2.11 -0.9326
11.15 -1.528 -1.742
10.59 -2.11 -1.53
11.75 -2.509 -1.218
11.73 -2.523 -1.223
11.75 -2.509 -1.245
11.73 -2.523 -1.239
12.63 -3.546 -0.8647
12.14 -3.852 -1.017
12.63 -3.546 -1.598
12.7 -5.09 -1.55
13.16 -4.803 -0.6001
13.62 -4.516 -1.55
13.36 -6.264 -0.8804
15.05 -6.803 -0.9111
14.58 -7.092 -1.866
15.6 -8.042 -1.016
14.98 -8.43 -1.016
15.29 -8.236 -1.658
16.01 -9.378 -1.222
15.99 -9.385 -1.226
16.01 -9.375 -1.231
16.01 -9.378 -1.24
16 -9.383 -1.24
-0.7932 4.462 -7.734
-0.3843 1.974 -5.495
1.95 3.241 -7.348
1.167 0.6428 -6.109
3.808 0.1871 -9.572
3.644 1.688 -11.88
0.07617 4.961 -10.12
3.28 -0.5704 -14.15
0.2488 -1.848 -16.78
-0.9744 -2.686 -16.57
0.7307 -3.159 -16.47
-2.678 2.963 -8.185
-2.616 -2.779 -12.24
-1.159 -1.533 -8.922
3 0 1 2
3 1 3 2
3 2 4 5
3 4 6 5
3 5 6 7
3 7 6 8
3 2 3 9
3 2 9 4
3 4 9 6
3 6 9 8
3 5 0 2
3 5 7 0
3 8 10 7
3 7 10 0
3 0 10 1
3 1 10 11
3 1 11 3
3 10 12 11
3 11 12 3
3 3 12 9
3 10 8 12
3 12 8 9
3 13 14 15
3 15 14 16
3 17 15 16
3 18 19 14
3 14 19 16
3 19 20 16
3 15 17 21
3 15 21 13
3 14 13 18
3 21 22 13
3 13 22 18
3 21 23 22
3 21 24 23
3 23 25 22
3 22 25 18
3 18 25 20
3 18 20 19
3 23 26 25
3 25 26 20
3 23 24 26
3 26 24 27
3 26 27 20
3 20 27 16
3 24 21 27
3 27 21 17
3 27 17 16
3 28 29 30
3 31 32 29
3 29 32 30
3 32 33 30
3 30 33 28
3 28 33 34
3 28 34 35
3 35 34 36
3 28 35 29
3 35 36 29
3 29 36 31
3 36 37 31
3 31 37 32
3 37 38 32
3 32 38 33
3 36 34 37
3 37 34 38
3 38 34 33
3 39 40 41
3 42 43 40
3 40 43 41
3 43 44 41
3 41 44 39
3 39 44 45
3 39 45 46
3 46 45 47
3 39 46 40
3 46 47 40
3 40 47 42
3 47 48 42
3 42 48 43
3 48 49 43
3 43 49 44
3 47 45 48
3 48 45 49
3 49 45 44
3 50 51 52
3 50 52 53
3 51 54 55
3 51 55 52
3 54 56 57
3 54 57 55
3 56 58 59
3 56 59 57
3 58 60 61
3 58 61 59
3 60 50 53
3 60 53 61
3 53 52 62
3 53 62 63
3 52 55 64
3 52 64 62
3 55 57 65
3 55 65 64
3 57 59 66
3 57 66 65
3 59 61 67
3 59 67 66
3 61 53 63
3 61 63 67
3 63 62 68
3 63 68 69
3 62 64 70
3 62 70 68
3 64 65 71
3 64 71 70
3 65 66 72
3 65 72 71
3 66 67 73
3 66 73 72
3 67 63 69
3 67 69 73
3 69 68 74
3 69 74 75
3 68 70 76
3 68 76 74
3 70 71 77
3 70 77 76
3 71 72 78
3 71 78 77
3 72 73 79
3 72 79 78
3 73 69 75
3 73 75 79
3 75 74 80
3 75 80 81
3 74 76 82
3 74 82 80
3 76 77 83
3 76 83 82
3 77 78 84
3 77 84 83
3 78 79 85
3 78 85 84
3 79 75 81
3 79 81 85
3 81 80 86
3 81 86 87
3 80 82 88
3 80 88 86
3 82 83 89
3 82 89 88
3 83 84 90
3 83 90 89
3 84 85 91
3 84 91 90
3 85 81 87
3 85 87 91
3 87 86 92
3 87 92 93
3 86 88 94
3 86 94 92
3 88 89 95
3 88 95 94
3 89 90 96
3 89 96 95
3 90 91 97
3 90 97 96
3 91 87 93
3 91 93 97
3 93 92 98
3 93 98 99
3 92 94 100
3 92 100 98
3 94 95 101
3 94 101 100
3 95 96 102
3 95 102 101
3 96 97 103
3 96 103 102
3 97 93 99
3 97 99 103
3 99 98 104
3 99 104 105
3 98 100 106
3 98 106 104
3 100 101 107
3 100 107 106
3 101 102 108
3 101 108 107
3 102 103 109
3 102 109 108
3 103 99 105
3 103 105 109
3 105 104 110
3 105 110 111
3 104 106 112
3 104 112 110
3 106 107 113
3 106 113 112
3 107 108 114
3 107 114 113
3 108 109 115
3 108 115 114
3 109 105 111
3 109 111 115
3 54 51 50
3 56 54 50
3 58 56 50
3 60 58 50
3 112 113 110
3 113 114 110
3 114 115 110
3 115 111 110
3 116 117 118
3 119 116 118
3 120 121 117
3 116 120 117
3 122 123 121
3 120 122 121
3 124 125 123
3 122 124 123
3 126 127 125
3 124 126 125
3 119 118 127
3 126 119 127
3 128 116 119
3 129 128 119
3 130 120 116
3 128 130 116
3 131 122 120
3 130 131 120
3 132 124 122
3 131 132 122
3 133 126 124
3 132 133 124
3 129 119 126
3 133 129 126
3 134 128 129
3 135 134 129
3 136 130 128
3 134 136 128
3 137 131 130
3 136 137 130
3 138 132 131
3 137 138 131
3 139 133 132
3 138 139 132
3 135 129 133
3 139 135 133
3 140 134 135
3 141 140 135
3 142 136 134
3 140 142 134
3 143 137 136
3 142 143 136
3 144 138 137
3 143 144 137
3 145 139 138
3 144 145 138
3 141 135 139
3 145 141 139
3 146 140 141
3 147 146 141
3 148 142 140
3 146 148 140
3 149 143 142
3 148 149 142
3 150 144 143
3 149 150 143
3 151 145 144
3 150 151 144
3 147 141 145
3 151 147 145
3 152 146 147
3 153 152 147
3 154 148 146
3 152 154 146
3 155 149 148
3 154 155 148
3 156 150 149
3 155 156 149
3 157 151 150
3 156 157 150
3 153 147 151
3 157 153 151
3 158 152 153
3 159 158 153
3 160 154 152
3 158 160 152
3 161 155 154
3 160 161 154
3 162 156 155
3 161 162 155
3 163 157 156
3 162 163 156
3 159 153 157
3 163 159 157
3 164 158 159
3 165 164 159
3 166 160 158
3 164 166 158
3 167 161 160
3 166 167 160
3 168 162 161
3 167 168 161
3 169 163 162
3 168 169 162
3 165 159 163
3 169 165 163
3 170 164 165
3 171 170 165
3 172 166 164
3 170 172 164
3 173 167 166
3 172 173 166
3 174 168 167
3 173 174 167
3 175 169 168
3 174 175 168
3 171 165 169
3 175 171 169
3 176 170 171
3 177 176 171
3 178 172 170
3 176 178 170
3 179 173 172
3 178 179 172
3 180 174 173
3 179 180 173
3 181 175 174
3 180 181 174
3 177 171 175
3 181 177 175
3 118 117 121
3 118 121 123
3 118 123 125
3 118 125 127
3 176 179 178
3 176 180 179
3 176 181 180
3 176 177 181
3 182 183 184
3 182 185 183
3 185 186 183
3 185 182 186
3 182 184 186
3 184 187 188
3 184 183 187
3 186 184 188
3 188 187 189
3 187 190 189
3 187 183 190
3 183 191 190
3 183 186 191
3 186 188 191
3 189 190 192
3 189 192 193
3 190 191 194
3 190 194 192
3 191 188 194
3 188 189 193
3 188 193 194
3 193 195 196
3 193 192 195
3 192 197 195
3 192 194 197
3 194 198 197
3 194 193 196
3 195 199 196
3 198 200 197
3 194 196 201
3 194 201 198
3 196 199 201
3 195 197 199
3 198 201 200
3 201 199 202
3 201 202 203
3 199 197 204
3 199 204 202
3 197 200 204
3 200 205 204
3 200 201 203
3 200 203 205
3 203 202 206
3 203 206 207
3 202 204 208
3 202 208 206
3 204 205 209
3 204 209 208
3 205 203 207
3 205 207 209
3 207 206 210
3 207 210 211
3 206 208 212
3 206 212 210
3 208 209 212
3 209 207 211
3 211 213 214
3 211 210 213
3 210 215 213
3 210 212 215
3 212 214 215
3 212 209 214
3 209 211 214
3 214 213 216
3 216 213 217
3 213 215 217
3 215 218 217
3 215 214 218
3 216 217 219
3 216 219 220
3 217 218 221
3 217 221 219
3 218 214 221
3 214 216 220
3 220 219 222
3 220 222 223
3 219 224 222
3 219 221 224
3 221 225 224
3 221 226 225
3 221 214 226
3 214 220 223
3 214 223 226
3 222 224 225
3 225 226 223
3 223 222 225
3 227 228 229
3 230 231 227
3 227 229 230
3 230 229 232
3 229 228 232
3 228 227 233
3 228 233 232
3 227 231 233
3 230 232 234
3 232 233 235
3 233 231 236
3 231 230 236
3 230 234 237
3 232 235 234
3 233 236 235
3 236 230 237
3 237 234 238
3 237 238 239
3 234 235 238
3 235 240 238
3 235 236 240
3 236 237 239
3 236 239 240
3 239 241 242
3 239 238 241
3 238 240 243
3 238 243 241
3 240 242 243
3 240 239 242
3 242 241 244
3 241 245 244
3 241 243 246
3 241 246 245
3 243 242 246
3 244 245 247
3 245 246 248
3 246 242 249
3 242 244 249
3 249 244 250
3 244 247 250
3 245 248 247
3 246 249 248
3 250 247 251
3 247 248 251
3 250 251 252
3 251 248 253
3 251 253 252
3 248 249 253
3 250 252 254
3 250 254 255
3 252 253 256
3 252 256 254
3 253 249 256
3 249 250 255
3 249 255 256
3 255 254 257
3 255 257 258
3 254 256 259
3 254 259 257
3 256 255 258
3 258 260 261
3 258 257 260
3 257 262 260
3 257 259 262
3 259 261 262
3 259 256 261
3 256 258 261
3 261 260 263
3 263 260 264
3 260 262 264
3 262 265 264
3 262 261 265
3 263 264 266
3 263 266 267
3 264 265 268
3 264 268 266
3 265 261 268
3 261 263 267
3 267 266 269
3 267 269 270
3 266 271 269
3 266 268 271
3 268 272 271
3 268 273 272
3 268 261 273
3 261 267 270
3 261 270 273
3 269 271 272
3 272 273 270
3 270 269 272
3 274 275 276
3 274 277 275
3 277 278 275
3 277 276 278
3 277 274 276
3 276 279 280
3 276 275 279
3 278 276 280
3 280 279 281
3 279 282 281
3 279 275 282
3 275 283 282
3 275 278 283
3 278 280 283
3 281 282 284
3 281 284 285
3 282 283 286
3 282 286 284
3 283 280 286
3 280 281 285
3 280 285 286
3 285 287 288
3 285 284 287
3 284 289 287
3 284 286 289
3 286 290 289
3 286 285 288
3 287 291 288
3 290 292 289
3 286 288 293
3 286 293 290
3 288 291 293
3 287 289 291
3 290 293 292
3 293 291 294
3 293 294 295
3 291 289 296
3 291 296 294
3 289 292 296
3 292 297 296
3 292 293 295
3 292 295 297
3 295 294 298
3 295 298 299
3 294 296 300
3 294 300 298
3 296 297 301
3 296 301 300
3 297 295 299
3 297 299 301
3 299 298 302
3 299 302 303
3 298 300 304
3 298 304 302
3 300 301 304
3 301 299 303
3 303 305 306
3 303 302 305
3 302 307 305
3 302 304 307
3 304 306 307
3 304 301 306
3 301 303 306
3 306 305 308
3 308 305 309
3 305 307 309
3 307 310 309
3 307 306 310
3 308 309 311
3 308 311 312
3 309 310 313
3 309 313 311
3 310 306 313
3 306 308 312
3 312 311 314
3 312 314 315
3 311 316 314
3 311 313 316
3 313 317 316
3 313 318 317
3 313 306 318
3 306 312 315
3 306 315 318
3 314 316 317
3 317 318 315
3 315 314 317
3 319 320 321
3 322 323 319
3 323 320 319
3 324 321 320
3 323 324 320
3 324 322 321
3 322 319 321
3 325 326 322
3 326 323 322
3 325 322 324
3 327 326 325
3 327 328 326
3 328 323 326
3 328 329 323
3 329 324 323
3 329 325 324
3 330 328 327
3 331 330 327
3 332 329 328
3 330 332 328
3 332 325 329
3 331 327 325
3 332 331 325
3 333 334 331
3 334 330 331
3 334 335 330
3 335 332 330
3 335 336 332
3 333 331 332
3 333 337 334
3 335 338 336
3 339 333 332
3 336 339 332
3 339 337 333
3 337 335 334
3 338 339 336
3 340 337 339
3 341 340 339
3 342 335 337
3 340 342 337
3 342 338 335
3 342 343 338
3 341 339 338
3 343 341 338
3 344 340 341
3 345 344 341
3 346 342 340
3 344 346 340
3 347 343 342
3 346 347 342
3 345 341 343
3 347 345 343
3 348 344 345
3 349 348 345
3 350 346 344
3 348 350 344
3 350 347 346
3 349 345 347
3 351 352 349
3 352 348 349
3 352 353 348
3 353 350 348
3 353 351 350
3 351 347 350
3 351 349 347
3 354 352 351
3 355 352 354
3 355 353 352
3 355 356 353
3 356 351 353
3 357 355 354
3 358 357 354
3 359 356 355
3 357 359 355
3 359 351 356
3 358 354 351
3 360 357 358
3 361 360 358
3 360 362 357
3 362 359 357
3 362 363 359
3 363 364 359
3 364 351 359
3 361 358 351
3 364 361 351
3 363 362 360
3 361 364 363
3 363 360 361
3 365 366 367
3 365 368 366
3 368 365 369
3 365 370 369
3 365 367 370
3 367 371 370
3 367 366 371
3 368 369 370
3 368 370 371
3 368 371 366
3 372 373 374
3 373 375 374
3 376 374 375
3 376 377 374
3 377 372 374
3 377 378 372
3 378 373 372
3 377 376 375
3 378 377 375
3 373 378 375
3 379 380 381
3 381 382 383
3 383 379 381
3 384 379 383
3 384 380 379
3 384 385 380
3 385 381 380
3 385 382 381
3 386 384 383
3 387 385 384
3 388 382 385
3 388 383 382
3 389 386 383
3 386 387 384
3 387 388 385
3 389 383 388
3 390 386 389
3 391 390 389
3 390 387 386
3 390 392 387
3 392 388 387
3 391 389 388
3 392 391 388
3 393 394 391
3 394 390 391
3 395 392 390
3 394 395 390
3 395 393 392
3 393 391 392
3 396 394 393
3 396 397 394
3 398 395 394
3 397 398 394
3 398 393 395
3 399 397 396
3 400 398 397
3 401 393 398
3 401 396 393
3 402 396 401
3 402 399 396
3 399 400 397
3 400 401 398
3 403 399 402
3 403 400 399
3 404 403 402
3 405 400 403
3 404 405 403
3 405 401 400
3 406 404 402
3 407 406 402
3 408 405 404
3 406 408 404
3 408 401 405
3 407 402 401
3 408 407 401
3 409 406 407
3 410 409 407
3 411 408 406
3 409 411 406
3 410 407 408
3 412 413 410
3 413 409 410
3 413 414 409
3 414 411 409
3 414 412 411
3 412 408 411
3 412 410 408
3 415 413 412
3 416 413 415
3 416 414 413
3 416 417 414
3 417 412 414
3 418 416 415
3 419 418 415
3 420 417 416
3 418 420 416
3 420 412 417
3 419 415 412
3 421 418 419
3 422 421 419
3 421 423 418
3 423 420 418
3 423 424 420
3 424 425 420
3 425 412 420
3 422 419 412
3 425 422 412
3 424 423 421
3 422 425 424
3 424 421 422
3 426 427 428
3 429 430 426
3 430 427 426
3 431 428 427
3 430 431 427
3 431 429 428
3 429 426 428
3 432 433 429
3 433 430 429
3 432 429 431
3 434 433 432
3 434 435 433
3 435 430 433
3 435 436 430
3 436 431 430
3 436 432 431
3 437 435 434
3 438 437 434
3 439 436 435
3 437 439 435
3 439 432 436
3 438 434 432
3 439 438 432
3 440 441 438
3 441 437 438
3 441 442 437
3 442 439 437
3 442 443 439
3 440 438 439
3 440 444 441
3 442 445 443
3 446 440 439
3 443 446 439
3 446 444 440
3 444 442 441
3 445 446 443
3 447 444 446
3 448 447 446
3 449 442 444
3 447 449 444
3 449 445 442
3 449 450 445
3 448 446 445
3 450 448 445
3 451 447 448
3 452 451 448
3 453 449 447
3 451 453 447
3 454 450 449
3 453 454 449
3 452 448 450
3 454 452 450
3 455 451 452
3 456 455 452
3 457 453 451
3 455 457 451
3 457 454 453
3 456 452 454
3 458 459 456
3 459 455 456
3 459 460 455
3 460 457 455
3 460 458 457
3 458 454 457
3 458 456 454
3 461 459 458
3 462 459 461
3 462 460 459
3 462 463 460
3 463 458 460
3 464 462 461
3 465 464 461
3 466 463 462
3 464 466 462
3 466 458 463
3 465 461 458
3 467 464 465
3 468 467 465
3 467 469 464
3 469 466 464
3 469 470 466
3 470 471 466
3 471 458 466
3 468 465 458
3 471 468 458
3 470 469 467
3 468 471 470
3 470 467 468
3 472 473 474
3 473 475 474
3 475 476 474
3 474 476 477
3 474 478 472
3 474 477 478
3 477 476 479
3 477 479 480
3 477 480 478
3 478 480 481
3 479 482 480
3 480 482 481
3 478 483 472
3 472 483 473
3 478 481 483
3 483 481 484
3 483 484 473
3 484 485 473
3 473 485 475
3 475 485 476
3 484 481 482
3 484 482 485
3 485 482 476
3 482 479 476
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
ply
format ascii 1.0
element vertex 1335
property float32 x
property float32 y
property float32 z
element face 2452
property list uint8 int32 vertex_indices
end_header
896.994 48.7601 82.2656
906.593 48.7601 80.7452
907.539 55.4902 83.6581
896.994 55.4902 85.3283
896.994 42.8477 77.825
905.221 42.8477 76.522
896.994 38.0305 72.2152
903.487 38.0305 71.1868
896.994 34.5348 65.6995
901.474 34.5348 64.9899
896.994 32.5246 58.5837
899.275 32.5246 58.2225
896.994 32.0943 51.202
915.252 48.7601 76.333
917.053 55.4902 78.8108
912.642 42.8477 72.7405
909.345 38.0305 68.2021
905.515 34.5348 62.9307
901.333 32.5246 57.174
922.125 48.7601 69.4607
924.602 55.4902 71.261
918.532 42.8477 66.8506
913.994 38.0305 63.5533
908.722 34.5348 59.7234
902.966 32.5246 55.5409
926.537 48.7601 60.8012
929.45 55.4902 61.7476
922.314 42.8477 59.429
916.978 38.0305 57.6955
910.782 34.5348 55.682
904.014 32.5246 53.4831
928.057 48.7601 51.202
931.12 55.4902 51.202
923.617 42.8477 51.202
918.007 38.0305 51.202
911.491 34.5348 51.202
904.375 32.5246 51.202
926.537 48.7601 41.6029
929.45 55.4902 40.6564
922.314 42.8477 42.9751
916.978 38.0305 44.7086
910.782 34.5348 46.7221
904.014 32.5246 48.9209
922.125 48.7601 32.9433
924.602 55.4902 31.1431
918.532 42.8477 35.5534
913.994 38.0305 38.8508
908.722 34.5348 42.6806
902.966 32.5246 46.8632
915.252 48.7601 26.0711
917.053 55.4902 23.5932
912.642 42.8477 29.6635
909.345 38.0305 34.202
905.515 34.5348 39.4733
901.333 32.5246 45.2301
906.593 48.7601 21.6588
907.539 55.4902 18.746
905.221 42.8477 25.882
903.487 38.0305 31.2173
901.474 34.5348 37.4141
899.275 32.5246 44.1816
896.994 48.7601 20.1385
896.994 55.4902 17.0757
896.994 42.8477 24.579
896.994 38.0305 30.1888
896.994 34.5348 36.7045
896.994 32.5246 43.8203
887.395 48.7601 21.6588
886.448 55.4902 18.746
888.767 42.8477 25.882
890.5 38.0305 31.2173
892.514 34.5348 37.4141
894.713 32.5246 44.1816
878.735 48.7601 26.0711
876.935 55.4902 23.5932
881.345 42.8477 29.6635
884.642 38.0305 34.202
888.472 34.5348 39.4733
892.655 32.5246 45.2301
871.863 48.7601 32.9433
869.385 55.4902 31.1431
875.455 42.8477 35.5534
879.994 38.0305 38.8508
885.265 34.5348 42.6806
891.022 32.5246 46.8632
867.451 48.7601 41.6029
864.538 55.4902 40.6564
871.674 42.8477 42.9751
877.009 38.0305 44.7086
883.206 34.5348 46.7221
889.973 32.5246 48.9209
865.93 48.7601 51.202
862.867 55.4902 51.202
870.371 42.8477 51.202
875.98 38.0305 51.202
882.496 34.5348 51.202
889.612 32.5246 51.202
867.451 48.7601 60.8012
864.538 55.4902 61.7476
871.674 42.8477 59.429
877.009 38.0305 57.6955
883.206 34.5348 55.682
889.973 32.5246 53.4831
871.863 48.7601 69.4607
869.385 55.4902 71.261
875.455 42.8477 66.8506
879.994 38.0305 63.5533
885.265 34.5348 59.7234
891.022 32.5246 55.5409
878.735 48.7601 76.333
876.935 55.4902 78.8108
881.345 42.8477 72.7405
884.642 38.0305 68.2021
888.472 34.5348 62.9307
892.655 32.5246 57.174
887.395 48.7601 80.7452
886.448 55.4902 83.6581
888.767 42.8477 76.522
890.5 38.0305 71.1868
892.514 34.5348 64.9899
894.713 32.5246 58.2225
896.994 955.49 2.7645
921.01 955.49 6.56826
923.358 895.49 -8.2572
896.994 895.49 -12.4329
896.994 1015.49 16.0985
918.949 1015.49 19.5759
896.994 1075.49 35.5104
915.95 1075.49 38.5128
896.994 1135.49 84.3781
908.4 1135.49 86.1847
896.994 1195.49 108.921
904.607 1195.49 110.127
896.994 1237.5 126.461
901.896 1237.49 127.245
942.675 955.49 17.6071
947.141 895.49 3.861
938.756 1015.49 29.6678
933.051 1075.49 47.2261
918.689 1135.49 91.4273
911.476 1195.49 113.627
906.319 1237.49 129.498
959.868 955.49 34.8007
966.016 895.49 22.7356
954.474 1015.49 45.3864
946.622 1075.49 60.7974
926.855 1135.49 99.5931
916.927 1195.49 119.078
909.829 1237.49 133.008
970.907 955.49 56.4657
978.134 895.49 46.5189
964.566 1015.49 65.1929
955.335 1075.49 77.8982
932.097 1135.49 109.882
920.426 1195.49 125.946
912.082 1237.49 137.431
974.711 955.49 80.4816
982.309 895.49 72.883
968.044 1015.49 87.1486
958.338 1075.49 96.8546
933.904 1135.49 121.288
921.632 1195.49 133.56
912.859 1237.49 142.334
970.907 955.49 104.498
978.134 895.49 99.247
964.566 1015.49 109.104
955.335 1075.49 115.811
932.097 1135.49 132.694
920.426 1195.49 141.174
912.082 1237.49 147.236
959.868 955.49 126.163
966.016 895.49 123.03
954.474 1015.49 128.911
946.622 1075.49 132.912
926.855 1135.49 142.984
916.927 1195.49 148.042
909.829 1237.49 151.659
942.675 955.49 143.356
947.141 895.49 141.905
938.756 1015.49 144.629
933.051 1075.49 146.483
918.689 1135.49 151.149
911.476 1195.49 153.493
906.319 1237.49 155.169
921.01 955.49 154.395
923.358 895.49 154.023
918.949 1015.49 154.721
915.95 1075.49 155.196
908.4 1135.49 156.392
904.607 1195.49 156.993
901.896 1237.49 157.422
896.994 955.49 158.199
896.994 895.49 158.199
896.994 1015.49 158.199
896.994 1075.49 158.199
896.994 1135.49 158.199
896.994 1195.49 158.199
896.994 1237.5 158.206
896.994 115.49 0
915.429 115.49 2.91996
907.539 55.4902 18.7459
896.994 175.49 -9.65898
921.232 175.49 -5.82
896.994 235.49 -12.4329
923.358 235.49 -8.2572
932.06 115.49 11.3939
943.098 175.49 5.3211
947.141 235.49 3.861
945.259 115.49 24.5924
960.45 175.49 22.6738
966.016 235.49 22.7356
953.733 115.49 41.2235
971.591 175.49 44.5395
978.134 235.49 46.5189
956.653 115.49 59.6593
975.43 175.49 68.7778
982.309 235.49 72.883
953.733 115.49 78.095
971.591 175.49 93.0161
978.134 235.49 99.247
945.259 115.49 94.7261
960.45 175.49 114.882
966.016 235.49 123.03
932.06 115.49 107.925
943.098 175.49 132.234
947.141 235.49 141.905
915.429 115.49 116.399
921.232 175.49 143.376
923.358 235.49 154.023
896.994 115.49 119.319
896.994 175.49 147.215
896.994 235.49 158.199
896.994 475.49 -17.7412
928.19 475.49 -17.2253
923.358 415.49 -8.2572
896.994 415.49 -12.4329
896.994 535.49 -17.7412
928.19 535.49 -17.2253
896.994 595.49 -17.7412
928.19 595.49 -17.2253
896.994 655.49 -17.7412
928.19 655.49 -17.2253
896.994 715.49 -12.4329
923.358 715.49 -8.2572
958.915 475.49 -12.4545
947.141 415.49 3.861
958.915 535.49 -12.4545
958.915 595.49 -12.4545
958.915 655.49 -12.4545
947.141 715.49 3.861
977.014 475.49 10.782
966.016 415.49 22.7356
977.014 535.49 10.782
977.014 595.49 10.782
977.014 655.49 10.782
966.016 715.49 22.7356
980.825 475.49 41.7158
978.134 415.49 46.5189
980.825 535.49 41.7158
980.825 595.49 41.7158
980.825 655.49 41.7158
978.134 715.49 46.5189
982.309 475.49 72.883
982.309 415.49 72.883
982.309 535.49 72.883
982.309 595.49 72.883
982.309 655.49 72.883
982.309 715.49 72.883
978.134 475.49 99.247
978.134 415.49 99.247
978.134 535.49 99.247
978.134 595.49 99.247
978.134 655.49 99.247
978.134 715.49 99.247
966.016 475.49 123.03
966.016 415.49 123.03
966.016 535.49 123.03
966.016 595.49 123.03
966.016 655.49 123.03
966.016 715.49 123.03
947.141 475.49 141.905
947.141 415.49 141.905
947.141 535.49 141.905
947.141 595.49 141.905
947.141 655.49 141.905
947.141 715.49 141.905
923.358 475.49 154.023
923.358 415.49 154.023
923.358 535.49 154.023
923.358 595.49 154.023
923.358 655.49 154.023
923.358 715.49 154.023
896.994 475.49 158.199
896.994 415.49 158.199
896.994 535.49 158.199
896.994 595.49 158.199
896.994 655.49 158.199
896.994 715.49 158.199
896.994 295.49 -12.4329
923.358 295.49 -8.2572
896.994 355.49 -12.4329
923.358 355.49 -8.2572
947.141 295.49 3.861
947.141 355.49 3.861
966.016 295.49 22.7356
966.016 355.49 22.7356
978.134 295.49 46.5189
978.134 355.49 46.5189
982.309 295.49 72.883
982.309 355.49 72.883
978.134 295.49 99.247
978.134 355.49 99.247
966.016 295.49 123.03
966.016 355.49 123.03
947.141 295.49 141.905
947.141 355.49 141.905
923.358 295.49 154.023
923.358 355.49 154.023
896.994 295.49 158.199
896.994 355.49 158.199
896.994 775.49 -12.4329
923.358 775.49 -8.2572
896.994 835.49 -12.4329
923.358 835.49 -8.2572
947.141 775.49 3.861
947.141 835.49 3.861
966.016 775.49 22.7356
966.016 835.49 22.7356
978.134 775.49 46.5189
978.134 835.49 46.5189
982.309 775.49 72.883
982.309 835.49 72.883
978.134 775.49 99.247
978.134 835.49 99.247
966.016 775.49 123.03
966.016 835.49 123.03
947.141 775.49 141.905
947.141 835.49 141.905
923.358 775.49 154.023
923.358 835.49 154.023
896.994 775.49 158.199
896.994 835.49 158.199
897.233 1237.59 157.975
897.444 1255.06 184.218
898.44 1245.36 184.218
898.354 1226.67 157.975
899.436 1235.66 184.218
899.476 1215.74 157.975
900.342 1225.95 184.218
900.495 1204.81 157.975
901.075 1216.22 184.218
901.321 1193.86 157.975
901.747 1206.49 184.218
902.077 1182.9 157.975
902.143 1196.74 184.218
902.523 1171.93 157.975
902.326 1186.99 184.218
902.729 1160.95 157.975
902.163 1177.24 184.218
902.546 1149.97 157.975
901.227 1167.54 184.218
901.492 1139.05 157.975
897.444 1159.01 184.218
897.233 1129.44 157.975
897.835 1277.52 221.494
898.643 1269.65 221.494
899.451 1261.78 221.494
900.184 1253.91 221.494
900.779 1246.02 221.494
901.323 1238.13 221.494
901.645 1230.23 221.494
901.793 1222.32 221.494
901.661 1214.42 221.494
900.902 1206.55 221.494
897.835 1199.63 221.494
897.274 1298.31 250.987
897.924 1291.98 250.987
898.574 1285.64 250.987
899.165 1279.3 250.987
899.644 1272.95 250.987
900.082 1266.6 250.987
900.341 1260.24 250.987
900.461 1253.88 250.987
900.354 1247.51 250.987
899.743 1241.18 250.987
897.274 1235.61 250.987
897.929 1319.95 282.13
897.425 1315.04 282.13
898.938 1310.12 282.13
899.396 1305.21 282.13
899.768 1300.28 282.13
900.107 1295.35 282.13
900.308 1290.42 282.13
900.401 1285.48 282.13
900.318 1280.55 282.13
899.844 1275.63 282.13
897.929 1271.31 282.13
1103.57 1225.26 165.506
1102.13 1221.79 168.635
1103.33 1216.26 166.165
1103.03 1231.06 165.506
1100.82 1227.79 169.896
1102 1236.78 165.506
1099.49 1233.88 170.638
1100.73 1242.46 165.506
1098.16 1240.01 170.901
1099.31 1248.11 165.506
1096.83 1246.13 170.607
1097.75 1253.71 165.506
1095.5 1252.23 169.881
1096.1 1259.29 165.506
1094.18 1258.29 168.943
1094.35 1264.85 165.506
1092.86 1264.34 167.87
1092.55 1270.38 165.506
1091.55 1270.36 166.714
1090.7 1275.9 165.506
1090.24 1276.38 165.506
1046.28 1196.29 164.832
1047.76 1189.51 161.801
1044.68 1203.67 166.38
1043.05 1211.14 167.291
1041.41 1218.66 167.614
1039.78 1226.18 167.254
1038.15 1233.65 166.362
1036.53 1241.1 165.211
1034.91 1248.51 163.894
1033.3 1255.91 162.475
1031.69 1263.3 160.993
990.44 1170.8 161.03
992.189 1162.77 157.438
988.537 1179.54 162.865
986.609 1188.39 163.944
984.668 1197.31 164.327
982.728 1206.22 163.9
980.798 1215.08 162.843
978.877 1223.9 161.479
976.963 1232.69 159.918
975.054 1241.46 158.236
973.147 1250.22 156.48
934.754 1144.58 155.668
936.793 1135.22 151.482
932.538 1154.76 157.805
930.29 1165.08 159.062
928.029 1175.46 159.508
925.769 1185.85 159.011
923.52 1196.17 157.78
921.282 1206.45 156.19
919.052 1216.69 154.371
916.827 1226.91 152.412
914.605 1237.11 150.366
1102.25 1221.23 163.48
1100.93 1227.3 162.632
1099.59 1233.43 162.364
1098.26 1239.56 162.482
1096.93 1245.68 162.862
1095.59 1251.79 163.401
1094.26 1257.9 163.978
1092.93 1264.01 164.534
1091.6 1270.13 164.988
1090.27 1276.26 165.263
1046.43 1195.61 158.506
1044.81 1203.06 157.465
1043.17 1210.58 157.137
1041.53 1218.11 157.281
1039.9 1225.62 157.747
1038.27 1233.12 158.409
1036.63 1240.62 159.118
1035 1248.12 159.8
1033.36 1255.62 160.357
990.617 1169.99 153.532
988.693 1178.82 152.299
986.753 1187.73 151.909
984.81 1196.65 152.08
982.871 1205.56 152.633
980.936 1214.45 153.417
979.001 1223.33 154.257
977.066 1232.22 155.065
975.128 1241.12 155.726
934.961 1143.63 146.931
932.719 1153.93 145.494
930.458 1164.31 145.04
928.195 1174.7 145.239
925.936 1185.08 145.883
923.68 1195.44 146.797
921.426 1205.79 147.776
919.171 1216.14 148.717
916.913 1226.51 149.488
1654 661.263 56.4944
1651.83 658.171 59.6234
1651.83 652.518 57.1537
1654.71 667.037 56.4944
1651.83 664.318 60.8845
1654.93 672.852 56.4944
1651.83 670.55 61.6264
1654.89 678.672 56.4944
1651.83 676.821 61.8896
1654.7 684.489 56.4944
1651.83 683.09 61.5962
1654.37 690.3 56.4944
1651.83 689.325 60.8699
1653.94 696.104 56.4944
1651.83 695.532 59.9317
1653.42 701.901 56.4944
1651.83 701.717 58.8586
1652.84 707.691 56.4944
1651.83 707.887 57.7024
1652.21 713.477 56.4944
1651.83 714.048 56.495
1591.84 645.144 55.8212
1591.84 638.206 52.7902
1591.84 652.689 57.3688
1591.84 660.337 58.2794
1591.84 668.032 58.6024
1591.84 675.726 58.2424
1591.84 683.378 57.3511
1591.84 690.996 56.1996
1591.84 698.587 54.8827
1591.84 706.159 53.4635
1591.84 713.72 51.9818
1531.85 632.117 52.019
1531.85 623.894 48.4267
1531.85 641.059 53.8532
1531.85 650.123 54.9325
1531.85 659.244 55.3153
1531.85 668.363 54.8885
1531.85 677.432 53.8322
1531.85 686.46 52.4675
1531.85 695.456 50.9066
1531.85 704.431 49.2248
1531.85 713.392 47.4686
1471.86 618.345 46.6564
1471.86 608.764 42.4706
1471.86 628.764 48.7936
1471.86 639.326 50.0511
1471.86 649.953 50.497
1471.86 660.578 49.9999
1471.86 671.145 48.769
1471.86 681.665 47.1789
1471.86 692.147 45.3602
1471.86 702.605 43.4005
1471.86 713.046 41.3543
1411.87 603.829 44.2106
1411.87 592.816 39.3994
1411.87 615.805 46.6672
1411.87 627.945 48.1126
1411.87 640.16 48.6251
1411.87 652.373 48.0537
1411.87 664.519 46.639
1411.87 676.61 44.8112
1411.87 688.659 42.7208
1411.87 700.679 40.4683
1411.87 712.68 38.1163
1351.88 589.934 41.1997
1351.88 577.55 35.7898
1351.88 603.4 43.9619
1351.88 617.051 45.5872
1351.88 630.786 46.1636
1351.88 644.518 45.521
1351.88 658.176 43.9302
1351.88 671.772 41.875
1351.88 685.32 39.5245
1351.88 698.836 36.9916
1351.88 712.331 34.3469
1291.9 575.542 36.4022
1291.9 561.739 30.3721
1291.9 590.552 39.481
1291.9 605.767 41.2926
1291.9 621.076 41.9351
1291.9 636.383 41.2189
1291.9 651.606 39.4457
1291.9 666.761 37.1549
1291.9 681.862 34.5349
1291.9 696.927 31.7118
1291.9 711.969 28.7639
1231.91 560.654 34.2955
1231.91 545.382 27.624
1231.91 577.26 37.7019
1231.91 594.094 39.7062
1231.91 611.032 40.417
1231.91 627.968 39.6246
1231.91 644.81 37.6628
1231.91 661.577 35.1283
1231.91 678.285 32.2296
1231.91 694.952 29.1062
1231.91 711.594 25.8447
1171.92 547.007 31.0585
1171.92 530.389 23.7989
1171.92 565.076 34.7651
1171.92 583.394 36.9461
1171.92 601.825 37.7195
1171.92 620.253 36.8573
1171.92 638.58 34.7226
1171.92 656.825 31.9647
1171.92 675.005 28.8105
1171.92 693.142 25.4117
1171.92 711.251 21.8628
1111.94 520.709 30.3918
1111.94 501.498 21.9991
1111.94 541.6 34.6769
1111.94 562.776 37.1983
1111.94 584.084 38.0925
1111.94 605.389 37.0957
1111.94 626.576 34.6277
1111.94 647.668 31.4394
1111.94 668.686 27.7929
1111.94 689.654 23.8637
1111.94 710.589 19.7608
1051.96 494.402 27.4954
1051.96 472.596 17.9692
1051.96 518.114 32.3593
1051.96 542.151 35.2213
1051.96 566.336 36.2362
1051.96 590.518 35.1047
1051.96 614.567 32.3035
1051.96 638.508 28.6845
1051.96 662.365 24.5455
1051.96 686.164 20.0856
1051.96 709.927 15.4286
987.323 467.355 25.2727
987.323 442.881 14.5811
987.323 493.968 30.7316
987.323 520.945 33.9437
987.323 548.09 35.0828
987.323 575.23 33.8129
987.323 602.221 30.669
987.323 629.09 26.6073
987.323 655.866 21.9619
987.323 682.577 16.9564
987.323 709.246 11.7297
1651.83 657.599 54.4685
1651.83 663.815 53.6203
1651.83 670.085 53.3527
1651.83 676.361 53.4702
1651.83 682.627 53.8504
1651.83 688.882 54.3893
1651.83 695.133 54.967
1651.83 701.386 55.5226
1651.83 707.647 55.977
1651.83 713.918 56.2518
1591.84 644.442 49.4948
1591.84 652.071 48.4538
1591.84 659.766 48.1253
1591.84 667.468 48.2696
1591.84 675.158 48.7361
1591.84 682.834 49.3976
1591.84 690.506 50.1065
1591.84 698.18 50.7883
1591.84 705.864 51.3461
1591.84 713.561 51.6833
1531.85 631.284 44.5211
1531.85 640.326 43.2872
1531.85 649.447 42.898
1531.85 658.575 43.069
1531.85 667.689 43.6219
1531.85 676.787 44.4058
1531.85 685.879 45.246
1531.85 694.975 46.0541
1531.85 704.082 46.7152
1531.85 713.204 47.1149
1471.86 617.375 37.9199
1471.86 627.911 36.4823
1471.86 638.538 36.0287
1471.86 649.174 36.2279
1471.86 659.793 36.8721
1471.86 670.394 37.7856
1471.86 680.988 38.7646
1471.86 691.586 39.7062
1471.86 702.197 40.4765
1411.87 602.715 34.1687
1411.87 614.825 32.5163
1411.87 627.039 31.9949
1411.87 639.265 32.2238
1411.87 651.471 32.9644
1411.87 663.655 34.0144
1411.87 675.833 35.1396
1411.87 688.014 36.2219
1411.87 700.211 37.1072
1411.87 712.428 37.6425
1351.88 588.68 29.9081
1351.88 602.297 28.05
1351.88 616.032 27.4638
1351.88 629.779 27.7213
1351.88 643.504 28.5539
1351.88 657.205 29.7346
1351.88 670.898 30.9998
1351.88 684.595 32.2168
1351.88 698.31 33.2123
1351.88 712.047 33.8142
1291.9 574.145 23.8163
1291.9 589.323 21.7453
1291.9 604.632 21.0919
1291.9 619.954 21.3788
1291.9 635.253 22.3069
1291.9 650.524 23.6228
1291.9 665.786 25.0331
1291.9 681.054 26.3896
1291.9 696.341 27.4993
1291.9 711.652 28.1701
1231.91 559.108 20.3707
1231.91 575.9 18.0793
1231.91 592.839 17.3564
1231.91 609.791 17.6739
1231.91 626.717 18.7007
1231.91 643.612 20.1567
1231.91 660.499 21.717
1231.91 677.39 23.2178
1231.91 694.303 24.4455
1231.91 711.244 25.1878
1171.92 545.324 15.9064
1171.92 563.597 13.413
1171.92 582.028 12.6264
1171.92 600.474 12.9718
1171.92 618.892 14.0891
1171.92 637.277 15.6734
1171.92 655.652 17.3713
1171.92 674.032 19.0044
1171.92 692.436 20.3403
1171.92 710.87 21.148
1111.94 518.764 12.8746
1111.94 539.889 9.99216
1111.94 561.197 9.08274
1111.94 582.522 9.4821
1111.94 603.815 10.7738
1111.94 625.069 12.6054
1111.94 646.312 14.5682
1111.94 667.561 16.4563
1111.94 688.838 18.0007
1111.94 710.148 18.9344
1051.96 492.194 7.61238
1051.96 516.172 4.34058
1051.96 540.358 3.30834
1051.96 564.564 3.76164
1051.96 588.732 5.22774
1051.96 612.857 7.30674
1051.96 636.969 9.53472
1051.96 661.088 11.6777
1051.96 685.238 13.4307
1051.96 709.427 14.4905
987.323 464.878 2.95728
987.323 491.789 -0.71478
987.323 518.933 -1.87332
987.323 546.1 -1.36452
987.323 573.225 0.28098
987.323 600.301 2.61432
987.323 627.363 5.11482
987.323 654.432 7.51998
987.323 681.537 9.48744
870.63 895.49 -8.2572
872.978 955.49 6.56826
875.038 1015.49 19.5759
878.037 1075.49 38.5128
885.588 1135.49 86.1847
889.38 1195.49 110.127
892.091 1237.49 127.245
846.846 895.49 3.861
851.313 955.49 17.6071
855.231 1015.49 29.6678
860.936 1075.49 47.2261
875.298 1135.49 91.4273
882.511 1195.49 113.627
887.668 1237.49 129.498
827.972 895.49 22.7356
834.119 955.49 34.8007
839.513 1015.49 45.3864
847.365 1075.49 60.7974
867.133 1135.49 99.5931
877.06 1195.49 119.078
884.159 1237.49 133.008
815.854 895.49 46.5189
823.08 955.49 56.4657
829.421 1015.49 65.1929
838.652 1075.49 77.8982
861.89 1135.49 109.882
873.561 1195.49 125.946
881.905 1237.49 137.431
811.678 895.49 72.883
819.277 955.49 80.4816
825.943 1015.49 87.1486
835.65 1075.49 96.8546
860.083 1135.49 121.288
872.355 1195.49 133.56
881.129 1237.49 142.334
815.854 895.49 99.247
823.08 955.49 104.498
829.421 1015.49 109.104
838.652 1075.49 115.811
861.89 1135.49 132.694
873.561 1195.49 141.174
881.905 1237.49 147.236
827.972 895.49 123.03
834.119 955.49 126.163
839.513 1015.49 128.911
847.365 1075.49 132.912
867.133 1135.49 142.984
877.06 1195.49 148.042
884.159 1237.49 151.659
846.846 895.49 141.905
851.313 955.49 143.356
855.231 1015.49 144.629
860.936 1075.49 146.483
875.298 1135.49 151.149
882.511 1195.49 153.493
887.668 1237.49 155.169
870.63 895.49 154.023
872.978 955.49 154.395
875.038 1015.49 154.721
878.037 1075.49 155.196
885.588 1135.49 156.392
889.38 1195.49 156.993
892.091 1237.49 157.422
886.448 55.4902 18.7459
878.558 115.49 2.91996
872.755 175.49 -5.82
870.63 235.49 -8.2572
861.927 115.49 11.3939
850.89 175.49 5.3211
846.846 235.49 3.861
848.728 115.49 24.5924
833.537 175.49 22.6738
827.972 235.49 22.7356
840.254 115.49 41.2235
822.396 175.49 44.5395
815.854 235.49 46.5189
837.334 115.49 59.6593
818.557 175.49 68.7778
811.678 235.49 72.883
840.254 115.49 78.095
822.396 175.49 93.0161
815.854 235.49 99.247
848.728 115.49 94.7261
833.537 175.49 114.882
827.972 235.49 123.03
861.927 115.49 107.925
850.89 175.49 132.234
846.846 235.49 141.905
878.558 115.49 116.399
872.755 175.49 143.376
870.63 235.49 154.023
870.63 415.49 -8.2572
865.797 475.49 -17.2253
865.797 535.49 -17.2253
865.797 595.49 -17.2253
865.797 655.49 -17.2253
870.63 715.49 -8.2572
846.846 415.49 3.861
835.073 475.49 -12.4545
835.073 535.49 -12.4545
835.073 595.49 -12.4545
835.073 655.49 -12.4545
846.846 715.49 3.861
827.972 415.49 22.7356
816.973 475.49 10.782
816.973 535.49 10.782
816.973 595.49 10.782
816.973 655.49 10.782
827.972 715.49 22.7356
815.854 415.49 46.5189
813.162 475.49 41.7158
813.162 535.49 41.7158
813.162 595.49 41.7158
813.162 655.49 41.7158
815.854 715.49 46.5189
811.678 415.49 72.883
811.678 475.49 72.883
811.678 535.49 72.883
811.678 595.49 72.883
811.678 655.49 72.883
811.678 715.49 72.883
815.854 415.49 99.247
815.854 475.49 99.247
815.854 535.49 99.247
815.854 595.49 99.247
815.854 655.49 99.247
815.854 715.49 99.247
827.972 415.49 123.03
827.972 475.49 123.03
827.972 535.49 123.03
827.972 595.49 123.03
827.972 655.49 123.03
827.972 715.49 123.03
846.846 415.49 141.905
846.846 475.49 141.905
846.846 535.49 141.905
846.846 595.49 141.905
846.846 655.49 141.905
846.846 715.49 141.905
870.63 415.49 154.023
870.63 475.49 154.023
870.63 535.49 154.023
870.63 595.49 154.023
870.63 655.49 154.023
870.63 715.49 154.023
870.63 295.49 -8.2572
870.63 355.49 -8.2572
846.846 295.49 3.861
846.846 355.49 3.861
827.972 295.49 22.7356
827.972 355.49 22.7356
815.854 295.49 46.5189
815.854 355.49 46.5189
811.678 295.49 72.883
811.678 355.49 72.883
815.854 295.49 99.247
815.854 355.49 99.247
827.972 295.49 123.03
827.972 355.49 123.03
846.846 295.49 141.905
846.846 355.49 141.905
870.63 295.49 154.023
870.63 355.49 154.023
870.63 775.49 -8.2572
870.63 835.49 -8.2572
846.846 775.49 3.861
846.846 835.49 3.861
827.972 775.49 22.7356
827.972 835.49 22.7356
815.854 775.49 46.5189
815.854 835.49 46.5189
811.678 775.49 72.883
811.678 835.49 72.883
815.854 775.49 99.247
815.854 835.49 99.247
827.972 775.49 123.03
827.972 835.49 123.03
846.846 775.49 141.905
846.846 835.49 141.905
870.63 775.49 154.023
870.63 835.49 154.023
895.633 1226.67 157.975
895.547 1245.36 184.218
896.543 1255.06 184.218
896.755 1237.59 157.975
894.511 1215.74 157.975
894.551 1235.66 184.218
893.492 1204.81 157.975
893.646 1225.95 184.218
892.666 1193.86 157.975
892.912 1216.22 184.218
891.91 1182.9 157.975
892.241 1206.49 184.218
891.464 1171.93 157.975
891.844 1196.74 184.218
891.258 1160.95 157.975
891.661 1186.99 184.218
891.441 1149.97 157.975
891.824 1177.24 184.218
892.496 1139.05 157.975
892.761 1167.54 184.218
896.755 1129.44 157.975
896.543 1159.01 184.218
895.345 1269.65 221.494
896.152 1277.52 221.494
894.537 1261.78 221.494
893.803 1253.91 221.494
893.208 1246.02 221.494
892.664 1238.13 221.494
892.342 1230.23 221.494
892.194 1222.32 221.494
892.326 1214.42 221.494
893.085 1206.55 221.494
896.152 1199.63 221.494
896.063 1291.98 250.987
896.714 1298.31 250.987
895.413 1285.64 250.987
894.822 1279.3 250.987
894.343 1272.95 250.987
893.905 1266.6 250.987
893.646 1260.24 250.987
893.527 1253.88 250.987
893.633 1247.51 250.987
894.244 1241.18 250.987
896.714 1235.61 250.987
896.563 1315.04 282.13
896.058 1319.95 282.13
895.049 1310.12 282.13
894.591 1305.21 282.13
894.22 1300.28 282.13
893.88 1295.35 282.13
893.679 1290.42 282.13
893.586 1285.48 282.13
893.669 1280.55 282.13
894.143 1275.63 282.13
896.058 1271.31 282.13
690.656 1216.26 166.165
691.859 1221.79 168.635
690.419 1225.26 165.506
693.167 1227.79 169.896
690.952 1231.06 165.506
694.493 1233.88 170.638
691.983 1236.78 165.506
695.827 1240.01 170.901
693.259 1242.46 165.506
697.161 1246.13 170.607
694.679 1248.11 165.506
698.487 1252.23 169.881
696.235 1253.71 165.506
699.808 1258.29 168.943
697.892 1259.29 165.506
701.124 1264.34 167.87
699.636 1264.85 165.506
702.437 1270.36 166.714
701.438 1270.38 165.506
703.747 1276.38 165.506
703.285 1275.9 165.506
746.227 1189.51 161.801
747.703 1196.29 164.832
749.308 1203.67 166.38
750.936 1211.14 167.291
752.573 1218.66 167.614
754.21 1226.18 167.254
755.838 1233.65 166.362
757.459 1241.1 165.211
759.074 1248.51 163.894
760.685 1255.91 162.475
762.294 1263.3 160.993
801.798 1162.77 157.438
803.547 1170.8 161.03
805.45 1179.54 162.865
807.379 1188.39 163.944
809.319 1197.31 164.327
811.259 1206.22 163.9
813.189 1215.08 162.843
815.11 1223.9 161.479
817.024 1232.69 159.918
818.934 1241.46 158.236
820.84 1250.22 156.48
857.194 1135.22 151.482
859.233 1144.58 155.668
861.45 1154.76 157.805
863.697 1165.08 159.062
865.958 1175.46 159.508
868.219 1185.85 159.011
870.467 1196.17 157.78
872.705 1206.45 156.19
874.936 1216.69 154.371
877.161 1226.91 152.412
879.382 1237.11 150.366
691.737 1221.23 163.48
693.06 1227.3 162.632
694.394 1233.43 162.364
695.729 1239.56 162.482
697.062 1245.68 162.862
698.393 1251.79 163.401
699.723 1257.9 163.978
701.053 1264.01 164.534
702.386 1270.13 164.988
703.72 1276.26 165.263
747.554 1195.61 158.506
749.177 1203.06 157.465
750.814 1210.58 157.137
752.453 1218.11 157.281
754.089 1225.62 157.747
755.722 1233.12 158.409
757.355 1240.62 159.118
758.988 1248.12 159.8
760.622 1255.62 160.357
803.37 1169.99 153.532
805.294 1178.82 152.299
807.235 1187.73 151.909
809.177 1196.65 152.08
811.116 1205.56 152.633
813.052 1214.45 153.417
814.986 1223.33 154.257
816.922 1232.22 155.065
818.859 1241.12 155.726
859.027 1143.63 146.931
861.268 1153.93 145.494
863.529 1164.31 145.04
865.792 1174.7 145.239
868.052 1185.08 145.883
870.307 1195.44 146.797
872.561 1205.79 147.776
874.816 1216.14 148.717
877.074 1226.51 149.488
142.157 652.518 57.1537
142.157 658.171 59.6234
139.983 661.263 56.4944
142.157 664.318 60.8845
139.272 667.037 56.4944
142.157 670.55 61.6264
139.061 672.852 56.4944
142.157 676.821 61.8896
139.099 678.672 56.4944
142.157 683.09 61.5962
139.286 684.489 56.4944
142.157 689.325 60.8699
139.614 690.3 56.4944
142.157 695.532 59.9317
140.045 696.104 56.4944
142.157 701.717 58.8586
140.568 701.901 56.4944
142.157 707.887 57.7024
141.151 707.691 56.4944
142.157 714.048 56.495
141.782 713.477 56.4944
202.147 638.206 52.7902
202.147 645.144 55.8212
202.147 652.689 57.3688
202.147 660.337 58.2794
202.147 668.032 58.6024
202.147 675.726 58.2424
202.147 683.378 57.3511
202.147 690.996 56.1996
202.147 698.587 54.8827
202.147 706.159 53.4635
202.147 713.72 51.9818
262.136 623.894 48.4267
262.136 632.117 52.019
262.136 641.059 53.8532
262.136 650.123 54.9325
262.136 659.244 55.3153
262.136 668.363 54.8885
262.136 677.432 53.8322
262.136 686.46 52.4675
262.136 695.456 50.9066
262.136 704.431 49.2248
262.136 713.392 47.4686
322.126 608.764 42.4706
322.126 618.345 46.6564
322.126 628.764 48.7936
322.126 639.326 50.0511
322.126 649.953 50.497
322.126 660.578 49.9999
322.126 671.145 48.769
322.126 681.665 47.1789
322.126 692.147 45.3602
322.126 702.605 43.4005
322.126 713.046 41.3543
382.114 592.816 39.3994
382.114 603.829 44.2106
382.114 615.805 46.6672
382.114 627.945 48.1126
382.114 640.16 48.6251
382.114 652.373 48.0537
382.114 664.519 46.639
382.114 676.61 44.8112
382.114 688.659 42.7208
382.114 700.679 40.4683
382.114 712.68 38.1163
442.103 577.55 35.7898
442.103 589.934 41.1997
442.103 603.4 43.9619
442.103 617.051 45.5872
442.103 630.786 46.1636
442.103 644.518 45.521
442.103 658.176 43.9302
442.103 671.772 41.875
442.103 685.32 39.5245
442.103 698.836 36.9916
442.103 712.331 34.3469
502.092 561.739 30.3721
502.092 575.542 36.4022
502.092 590.552 39.481
502.092 605.767 41.2926
502.092 621.076 41.9351
502.092 636.383 41.2189
502.092 651.606 39.4457
502.092 666.761 37.1549
502.092 681.862 34.5349
502.092 696.927 31.7118
502.092 711.969 28.7639
562.08 545.382 27.624
562.08 560.654 34.2955
562.08 577.26 37.7019
562.08 594.094 39.7062
562.08 611.032 40.417
562.08 627.968 39.6246
562.08 644.81 37.6628
562.08 661.577 35.1283
562.08 678.285 32.2296
562.08 694.952 29.1062
562.08 711.594 25.8447
622.069 530.389 23.7989
622.069 547.007 31.0585
622.069 565.076 34.7651
622.069 583.394 36.9461
622.069 601.825 37.7195
622.069 620.253 36.8573
622.069 638.58 34.7226
622.069 656.825 31.9647
622.069 675.005 28.8105
622.069 693.142 25.4117
622.069 711.251 21.8628
682.049 501.498 21.9991
682.049 520.709 30.3918
682.049 541.6 34.6769
682.049 562.776 37.1983
682.049 584.084 38.0925
682.049 605.389 37.0957
682.049 626.576 34.6277
682.049 647.668 31.4394
682.049 668.686 27.7929
682.049 689.654 23.8637
682.049 710.589 19.7608
742.028 472.596 17.9692
742.028 494.402 27.4954
742.028 518.114 32.3593
742.028 542.151 35.2213
742.028 566.336 36.2362
742.028 590.518 35.1047
742.028 614.567 32.3035
742.028 638.508 28.6845
742.028 662.365 24.5455
742.028 686.164 20.0856
742.028 709.927 15.4286
806.665 442.881 14.5811
806.665 467.355 25.2727
806.665 493.968 30.7316
806.665 520.945 33.9437
806.665 548.09 35.0828
806.665 575.23 33.8129
806.665 602.221 30.669
806.665 629.09 26.6073
806.665 655.866 21.9619
806.665 682.577 16.9564
806.665 709.246 11.7297
142.157 657.599 54.4685
142.157 663.815 53.6203
142.157 670.085 53.3527
142.157 676.361 53.4702
142.157 682.627 53.8504
142.157 688.882 54.3893
142.157 695.133 54.967
142.157 701.386 55.5226
142.157 707.647 55.977
142.157 713.918 56.2518
202.147 644.442 49.4948
202.147 652.071 48.4538
202.147 659.766 48.1253
202.147 667.468 48.2696
202.147 675.158 48.7361
202.147 682.834 49.3976
202.147 690.506 50.1065
202.147 698.18 50.7883
202.147 705.864 51.3461
202.147 713.561 51.6833
262.136 631.284 44.5211
262.136 640.326 43.2872
262.136 649.447 42.898
262.136 658.575 43.069
262.136 667.689 43.6219
262.136 676.787 44.4058
262.136 685.879 45.246
262.136 694.975 46.0541
262.136 704.082 46.7152
262.136 713.204 47.1149
322.126 617.375 37.9199
322.126 627.911 36.4823
322.126 638.538 36.0287
322.126 649.174 36.2279
322.126 659.793 36.8721
322.126 670.394 37.7856
322.126 680.988 38.7646
322.126 691.586 39.7062
322.126 702.197 40.4765
382.114 602.715 34.1687
382.114 614.825 32.5163
382.114 627.039 31.9949
382.114 639.265 32.2238
382.114 651.471 32.9644
382.114 663.655 34.0144
382.114 675.833 35.1396
382.114 688.014 36.2219
382.114 700.211 37.1072
382.114 712.428 37.6425
442.103 588.68 29.9081
442.103 602.297 28.05
442.103 616.032 27.4638
442.103 629.779 27.7213
442.103 643.504 28.5539
442.103 657.205 29.7346
442.103 670.898 30.9998
442.103 684.595 32.2168
442.103 698.31 33.2123
442.103 712.047 33.8142
502.092 574.145 23.8163
502.092 589.323 21.7453
502.092 604.632 21.0919
502.092 619.954 21.3788
502.092 635.253 22.3069
502.092 650.524 23.6228
502.092 665.786 25.0331
502.092 681.054 26.3896
502.092 696.341 27.4993
502.092 711.652 28.1701
562.08 559.108 20.3707
562.08 575.9 18.0793
562.08 592.839 17.3564
562.08 609.791 17.6739
562.08 626.717 18.7007
562.08 643.612 20.1567
562.08 660.499 21.717
562.08 677.39 23.2178
562.08 694.303 24.4455
562.08 711.244 25.1878
622.069 545.324 15.9064
622.069 563.597 13.413
622.069 582.028 12.6264
622.069 600.474 12.9718
622.069 618.892 14.0891
622.069 637.277 15.6734
622.069 655.652 17.3713
622.069 674.032 19.0044
622.069 692.436 20.3403
622.069 710.87 21.148
682.049 518.764 12.8746
682.049 539.889 9.99216
682.049 561.197 9.08274
682.049 582.522 9.4821
682.049 603.815 10.7738
682.049 625.069 12.6054
682.049 646.312 14.5682
682.049 667.561 16.4563
682.049 688.838 18.0007
682.049 710.148 18.9344
742.028 492.194 7.61238
742.028 516.172 4.34058
742.028 540.358 3.30834
742.028 564.564 3.76164
742.028 588.732 5.22774
742.028 612.857 7.30674
742.028 636.969 9.53472
742.028 661.088 11.6777
742.028 685.238 13.4307
742.028 709.427 14.4905
806.665 464.878 2.95728
806.665 491.789 -0.71478
806.665 518.933 -1.87332
806.665 546.1 -1.36452
806.665 573.225 0.28098
806.665 600.301 2.61432
806.665 627.363 5.11482
806.665 654.432 7.51998
806.665 681.537 9.48744
3 0 1 2
3 0 2 3
3 4 5 1
3 4 1 0
3 6 7 5
3 6 5 4
3 8 9 7
3 8 7 6
3 10 11 9
3 10 9 8
3 12 11 10
3 1 13 14
3 1 14 2
3 5 15 13
3 5 13 1
3 7 16 15
3 7 15 5
3 9 17 16
3 9 16 7
3 11 18 17
3 11 17 9
3 12 18 11
3 13 19 20
3 13 20 14
3 15 21 19
3 15 19 13
3 16 22 21
3 16 21 15
3 17 23 22
3 17 22 16
3 18 24 23
3 18 23 17
3 12 24 18
3 19 25 26
3 19 26 20
3 21 27 25
3 21 25 19
3 22 28 27
3 22 27 21
3 23 29 28
3 23 28 22
3 24 30 29
3 24 29 23
3 12 30 24
3 25 31 32
3 25 32 26
3 27 33 31
3 27 31 25
3 28 34 33
3 28 33 27
3 29 35 34
3 29 34 28
3 30 36 35
3 30 35 29
3 12 36 30
3 31 37 38
3 31 38 32
3 33 39 37
3 33 37 31
3 34 40 39
3 34 39 33
3 35 41 40
3 35 40 34
3 36 42 41
3 36 41 35
3 12 42 36
3 37 43 44
3 37 44 38
3 39 45 43
3 39 43 37
3 40 46 45
3 40 45 39
3 41 47 46
3 41 46 40
3 42 48 47
3 42 47 41
3 12 48 42
3 43 49 50
3 43 50 44
3 45 51 49
3 45 49 43
3 46 52 51
3 46 51 45
3 47 53 52
3 47 52 46
3 48 54 53
3 48 53 47
3 12 54 48
3 49 55 56
3 49 56 50
3 51 57 55
3 51 55 49
3 52 58 57
3 52 57 51
3 53 59 58
3 53 58 52
3 54 60 59
3 54 59 53
3 12 60 54
3 55 61 62
3 55 62 56
3 57 63 61
3 57 61 55
3 58 64 63
3 58 63 57
3 59 65 64
3 59 64 58
3 60 66 65
3 60 65 59
3 12 66 60
3 61 67 68
3 61 68 62
3 63 69 67
3 63 67 61
3 64 70 69
3 64 69 63
3 65 71 70
3 65 70 64
3 66 72 71
3 66 71 65
3 12 72 66
3 67 73 74
3 67 74 68
3 69 75 73
3 69 73 67
3 70 76 75
3 70 75 69
3 71 77 76
3 71 76 70
3 72 78 77
3 72 77 71
3 12 78 72
3 73 79 80
3 73 80 74
3 75 81 79
3 75 79 73
3 76 82 81
3 76 81 75
3 77 83 82
3 77 82 76
3 78 84 83
3 78 83 77
3 12 84 78
3 79 85 86
3 79 86 80
3 81 87 85
3 81 85 79
3 82 88 87
3 82 87 81
3 83 89 88
3 83 88 82
3 84 90 89
3 84 89 83
3 12 90 84
3 85 91 92
3 85 92 86
3 87 93 91
3 87 91 85
3 88 94 93
3 88 93 87
3 89 95 94
3 89 94 88
3 90 96 95
3 90 95 89
3 12 96 90
3 91 97 98
3 91 98 92
3 93 99 97
3 93 97 91
3 94 100 99
3 94 99 93
3 95 101 100
3 95 100 94
3 96 102 101
3 96 101 95
3 12 102 96
3 97 103 104
3 97 104 98
3 99 105 103
3 99 103 97
3 100 106 105
3 100 105 99
3 101 107 106
3 101 106 100
3 102 108 107
3 102 107 101
3 12 108 102
3 103 109 110
3 103 110 104
3 105 111 109
3 105 109 103
3 106 112 111
3 106 111 105
3 107 113 112
3 107 112 106
3 108 114 113
3 108 113 107
3 12 114 108
3 109 115 116
3 109 116 110
3 111 117 115
3 111 115 109
3 112 118 117
3 112 117 111
3 113 119 118
3 113 118 112
3 114 120 119
3 114 119 113
3 12 120 114
3 115 0 3
3 115 3 116
3 117 4 0
3 117 0 115
3 118 6 4
3 118 4 117
3 119 8 6
3 119 6 118
3 120 10 8
3 120 8 119
3 12 10 120
3 121 122 123
3 121 123 124
3 125 126 122
3 125 122 121
3 127 128 126
3 127 126 125
3 129 130 128
3 129 128 127
3 131 132 130
3 131 130 129
3 133 134 132
3 133 132 131
3 122 135 136
3 122 136 123
3 126 137 135
3 126 135 122
3 128 138 137
3 128 137 126
3 130 139 138
3 130 138 128
3 132 140 139
3 132 139 130
3 134 141 140
3 134 140 132
3 135 142 143
3 135 143 136
3 137 144 142
3 137 142 135
3 138 145 144
3 138 144 137
3 139 146 145
3 139 145 138
3 140 147 146
3 140 146 139
3 141 148 147
3 141 147 140
3 142 149 150
3 142 150 143
3 144 151 149
3 144 149 142
3 145 152 151
3 145 151 144
3 146 153 152
3 146 152 145
3 147 154 153
3 147 153 146
3 148 155 154
3 148 154 147
3 149 156 157
3 149 157 150
3 151 158 156
3 151 156 149
3 152 159 158
3 152 158 151
3 153 160 159
3 153 159 152
3 154 161 160
3 154 160 153
3 155 162 161
3 155 161 154
3 156 163 164
3 156 164 157
3 158 165 163
3 158 163 156
3 159 166 165
3 159 165 158
3 160 167 166
3 160 166 159
3 161 168 167
3 161 167 160
3 162 169 168
3 162 168 161
3 163 170 171
3 163 171 164
3 165 172 170
3 165 170 163
3 166 173 172
3 166 172 165
3 167 174 173
3 167 173 166
3 168 175 174
3 168 174 167
3 169 176 175
3 169 175 168
3 170 177 178
3 170 178 171
3 172 179 177
3 172 177 170
3 173 180 179
3 173 179 172
3 174 181 180
3 174 180 173
3 175 182 181
3 175 181 174
3 176 183 182
3 176 182 175
3 177 184 185
3 177 185 178
3 179 186 184
3 179 184 177
3 180 187 186
3 180 186 179
3 181 188 187
3 181 187 180
3 182 189 188
3 182 188 181
3 183 190 189
3 183 189 182
3 184 191 192
3 184 192 185
3 186 193 191
3 186 191 184
3 187 194 193
3 187 193 186
3 188 195 194
3 188 194 187
3 189 196 195
3 189 195 188
3 190 197 196
3 190 196 189
3 198 199 200
3 198 200 62
3 201 202 199
3 201 199 198
3 203 204 202
3 203 202 201
3 199 205 50
3 199 50 200
3 202 206 205
3 202 205 199
3 204 207 206
3 204 206 202
3 205 208 44
3 205 44 50
3 206 209 208
3 206 208 205
3 207 210 209
3 207 209 206
3 208 211 38
3 208 38 44
3 209 212 211
3 209 211 208
3 210 213 212
3 210 212 209
3 211 214 32
3 211 32 38
3 212 215 214
3 212 214 211
3 213 216 215
3 213 215 212
3 214 217 26
3 214 26 32
3 215 218 217
3 215 217 214
3 216 219 218
3 216 218 215
3 217 220 20
3 217 20 26
3 218 221 220
3 218 220 217
3 219 222 221
3 219 221 218
3 220 223 14
3 220 14 20
3 221 224 223
3 221 223 220
3 222 225 224
3 222 224 221
3 223 226 2
3 223 2 14
3 224 227 226
3 224 226 223
3 225 228 227
3 225 227 224
3 226 229 3
3 226 3 2
3 227 230 229
3 227 229 226
3 228 231 230
3 228 230 227
3 232 233 234
3 232 234 235
3 236 237 233
3 236 233 232
3 238 239 237
3 238 237 236
3 240 241 239
3 240 239 238
3 242 243 241
3 242 241 240
3 233 244 245
3 233 245 234
3 237 246 244
3 237 244 233
3 239 247 246
3 239 246 237
3 241 248 247
3 241 247 239
3 243 249 248
3 243 248 241
3 244 250 251
3 244 251 245
3 246 252 250
3 246 250 244
3 247 253 252
3 247 252 246
3 248 254 253
3 248 253 247
3 249 255 254
3 249 254 248
3 250 256 257
3 250 257 251
3 252 258 256
3 252 256 250
3 253 259 258
3 253 258 252
3 254 260 259
3 254 259 253
3 255 261 260
3 255 260 254
3 256 262 263
3 256 263 257
3 258 264 262
3 258 262 256
3 259 265 264
3 259 264 258
3 260 266 265
3 260 265 259
3 261 267 266
3 261 266 260
3 262 268 269
3 262 269 263
3 264 270 268
3 264 268 262
3 265 271 270
3 265 270 264
3 266 272 271
3 266 271 265
3 267 273 272
3 267 272 266
3 268 274 275
3 268 275 269
3 270 276 274
3 270 274 268
3 271 277 276
3 271 276 270
3 272 278 277
3 272 277 271
3 273 279 278
3 273 278 272
3 274 280 281
3 274 281 275
3 276 282 280
3 276 280 274
3 277 283 282
3 277 282 276
3 278 284 283
3 278 283 277
3 279 285 284
3 279 284 278
3 280 286 287
3 280 287 281
3 282 288 286
3 282 286 280
3 283 289 288
3 283 288 282
3 284 290 289
3 284 289 283
3 285 291 290
3 285 290 284
3 286 292 293
3 286 293 287
3 288 294 292
3 288 292 286
3 289 295 294
3 289 294 288
3 290 296 295
3 290 295 289
3 291 297 296
3 291 296 290
3 298 299 204
3 298 204 203
3 300 301 299
3 300 299 298
3 235 234 301
3 235 301 300
3 299 302 207
3 299 207 204
3 301 303 302
3 301 302 299
3 234 245 303
3 234 303 301
3 302 304 210
3 302 210 207
3 303 305 304
3 303 304 302
3 245 251 305
3 245 305 303
3 304 306 213
3 304 213 210
3 305 307 306
3 305 306 304
3 251 257 307
3 251 307 305
3 306 308 216
3 306 216 213
3 307 309 308
3 307 308 306
3 257 263 309
3 257 309 307
3 308 310 219
3 308 219 216
3 309 311 310
3 309 310 308
3 263 269 311
3 263 311 309
3 310 312 222
3 310 222 219
3 311 313 312
3 311 312 310
3 269 275 313
3 269 313 311
3 312 314 225
3 312 225 222
3 313 315 314
3 313 314 312
3 275 281 315
3 275 315 313
3 314 316 228
3 314 228 225
3 315 317 316
3 315 316 314
3 281 287 317
3 281 317 315
3 316 318 231
3 316 231 228
3 317 319 318
3 317 318 316
3 287 293 319
3 287 319 317
3 320 321 243
3 320 243 242
3 322 323 321
3 322 321 320
3 124 123 323
3 124 323 322
3 321 324 249
3 321 249 243
3 323 325 324
3 323 324 321
3 123 136 325
3 123 325 323
3 324 326 255
3 324 255 249
3 325 327 326
3 325 326 324
3 136 143 327
3 136 327 325
3 326 328 261
3 326 261 255
3 327 329 328
3 327 328 326
3 143 150 329
3 143 329 327
3 328 330 267
3 328 267 261
3 329 331 330
3 329 330 328
3 150 157 331
3 150 331 329
3 330 332 273
3 330 273 267
3 331 333 332
3 331 332 330
3 157 164 333
3 157 333 331
3 332 334 279
3 332 279 273
3 333 335 334
3 333 334 332
3 164 171 335
3 164 335 333
3 334 336 285
3 334 285 279
3 335 337 336
3 335 336 334
3 171 178 337
3 171 337 335
3 336 338 291
3 336 291 285
3 337 339 338
3 337 338 336
3 178 185 339
3 178 339 337
3 338 340 297
3 338 297 291
3 339 341 340
3 339 340 338
3 185 192 341
3 185 341 339
3 342 343 344
3 342 344 345
3 345 344 346
3 345 346 347
3 347 346 348
3 347 348 349
3 349 348 350
3 349 350 351
3 351 350 352
3 351 352 353
3 353 352 354
3 353 354 355
3 355 354 356
3 355 356 357
3 357 356 358
3 357 358 359
3 359 358 360
3 359 360 361
3 361 360 362
3 361 362 363
3 343 364 365
3 343 365 344
3 344 365 366
3 344 366 346
3 346 366 367
3 346 367 348
3 348 367 368
3 348 368 350
3 350 368 369
3 350 369 352
3 352 369 370
3 352 370 354
3 354 370 371
3 354 371 356
3 356 371 372
3 356 372 358
3 358 372 373
3 358 373 360
3 360 373 374
3 360 374 362
3 364 375 376
3 364 376 365
3 365 376 377
3 365 377 366
3 366 377 378
3 366 378 367
3 367 378 379
3 367 379 368
3 368 379 380
3 368 380 369
3 369 380 381
3 369 381 370
3 370 381 382
3 370 382 371
3 371 382 383
3 371 383 372
3 372 383 384
3 372 384 373
3 373 384 385
3 373 385 374
3 375 386 387
3 375 387 376
3 376 387 388
3 376 388 377
3 377 388 389
3 377 389 378
3 378 389 390
3 378 390 379
3 379 390 391
3 379 391 380
3 380 391 392
3 380 392 381
3 381 392 393
3 381 393 382
3 382 393 394
3 382 394 383
3 383 394 395
3 383 395 384
3 384 395 396
3 384 396 385
3 397 398 399
3 400 401 398
3 400 398 397
3 402 403 401
3 402 401 400
3 404 405 403
3 404 403 402
3 406 407 405
3 406 405 404
3 408 409 407
3 408 407 406
3 410 411 409
3 410 409 408
3 412 413 411
3 412 411 410
3 414 415 413
3 414 413 412
3 416 417 415
3 416 415 414
3 398 418 419
3 398 419 399
3 401 420 418
3 401 418 398
3 403 421 420
3 403 420 401
3 405 422 421
3 405 421 403
3 407 423 422
3 407 422 405
3 409 424 423
3 409 423 407
3 411 425 424
3 411 424 409
3 413 426 425
3 413 425 411
3 415 427 426
3 415 426 413
3 417 428 427
3 417 427 415
3 418 429 430
3 418 430 419
3 420 431 429
3 420 429 418
3 421 432 431
3 421 431 420
3 422 433 432
3 422 432 421
3 423 434 433
3 423 433 422
3 424 435 434
3 424 434 423
3 425 436 435
3 425 435 424
3 426 437 436
3 426 436 425
3 427 438 437
3 427 437 426
3 428 439 438
3 428 438 427
3 429 440 441
3 429 441 430
3 431 442 440
3 431 440 429
3 432 443 442
3 432 442 431
3 433 444 443
3 433 443 432
3 434 445 444
3 434 444 433
3 435 446 445
3 435 445 434
3 436 447 446
3 436 446 435
3 437 448 447
3 437 447 436
3 438 449 448
3 438 448 437
3 439 450 449
3 439 449 438
3 399 451 397
3 397 451 452
3 397 452 400
3 400 452 453
3 400 453 402
3 402 453 454
3 402 454 404
3 404 454 455
3 404 455 406
3 406 455 456
3 406 456 408
3 408 456 457
3 408 457 410
3 410 457 458
3 410 458 412
3 412 458 459
3 412 459 414
3 414 459 460
3 414 460 417
3 399 419 461
3 399 461 451
3 451 461 462
3 451 462 452
3 452 462 463
3 452 463 453
3 453 463 464
3 453 464 454
3 454 464 465
3 454 465 455
3 455 465 466
3 455 466 456
3 456 466 467
3 456 467 457
3 457 467 468
3 457 468 458
3 458 468 469
3 458 469 459
3 459 469 428
3 459 428 460
3 419 430 470
3 419 470 461
3 461 470 471
3 461 471 462
3 462 471 472
3 462 472 463
3 463 472 473
3 463 473 464
3 464 473 474
3 464 474 465
3 465 474 475
3 465 475 466
3 466 475 476
3 466 476 467
3 467 476 477
3 467 477 468
3 468 477 478
3 468 478 469
3 469 478 439
3 469 439 428
3 430 441 479
3 430 479 470
3 470 479 480
3 470 480 471
3 471 480 481
3 471 481 472
3 472 481 482
3 472 482 473
3 473 482 483
3 473 483 474
3 474 483 484
3 474 484 475
3 475 484 485
3 475 485 476
3 476 485 486
3 476 486 477
3 477 486 487
3 477 487 478
3 478 487 450
3 478 450 439
3 488 489 490
3 491 492 489
3 491 489 488
3 493 494 492
3 493 492 491
3 495 496 494
3 495 494 493
3 497 498 496
3 497 496 495
3 499 500 498
3 499 498 497
3 501 502 500
3 501 500 499
3 503 504 502
3 503 502 501
3 505 506 504
3 505 504 503
3 507 508 506
3 507 506 505
3 489 509 510
3 489 510 490
3 492 511 509
3 492 509 489
3 494 512 511
3 494 511 492
3 496 513 512
3 496 512 494
3 498 514 513
3 498 513 496
3 500 515 514
3 500 514 498
3 502 516 515
3 502 515 500
3 504 517 516
3 504 516 502
3 506 518 517
3 506 517 504
3 508 519 518
3 508 518 506
3 509 520 521
3 509 521 510
3 511 522 520
3 511 520 509
3 512 523 522
3 512 522 511
3 513 524 523
3 513 523 512
3 514 525 524
3 514 524 513
3 515 526 525
3 515 525 514
3 516 527 526
3 516 526 515
3 517 528 527
3 517 527 516
3 518 529 528
3 518 528 517
3 519 530 529
3 519 529 518
3 520 531 532
3 520 532 521
3 522 533 531
3 522 531 520
3 523 534 533
3 523 533 522
3 524 535 534
3 524 534 523
3 525 536 535
3 525 535 524
3 526 537 536
3 526 536 525
3 527 538 537
3 527 537 526
3 528 539 538
3 528 538 527
3 529 540 539
3 529 539 528
3 530 541 540
3 530 540 529
3 531 542 543
3 531 543 532
3 533 544 542
3 533 542 531
3 534 545 544
3 534 544 533
3 535 546 545
3 535 545 534
3 536 547 546
3 536 546 535
3 537 548 547
3 537 547 536
3 538 549 548
3 538 548 537
3 539 550 549
3 539 549 538
3 540 551 550
3 540 550 539
3 541 552 551
3 541 551 540
3 542 553 554
3 542 554 543
3 544 555 553
3 544 553 542
3 545 556 555
3 545 555 544
3 546 557 556
3 546 556 545
3 547 558 557
3 547 557 546
3 548 559 558
3 548 558 547
3 549 560 559
3 549 559 548
3 550 561 560
3 550 560 549
3 551 562 561
3 551 561 550
3 552 563 562
3 552 562 551
3 553 564 565
3 553 565 554
3 555 566 564
3 555 564 553
3 556 567 566
3 556 566 555
3 557 568 567
3 557 567 556
3 558 569 568
3 558 568 557
3 559 570 569
3 559 569 558
3 560 571 570
3 560 570 559
3 561 572 571
3 561 571 560
3 562 573 572
3 562 572 561
3 563 574 573
3 563 573 562
3 564 575 576
3 564 576 565
3 566 577 575
3 566 575 564
3 567 578 577
3 567 577 566
3 568 579 578
3 568 578 567
3 569 580 579
3 569 579 568
3 570 581 580
3 570 580 569
3 571 582 581
3 571 581 570
3 572 583 582
3 572 582 571
3 573 584 583
3 573 583 572
3 574 585 584
3 574 584 573
3 575 586 587
3 575 587 576
3 577 588 586
3 577 586 575
3 578 589 588
3 578 588 577
3 579 590 589
3 579 589 578
3 580 591 590
3 580 590 579
3 581 592 591
3 581 591 580
3 582 593 592
3 582 592 581
3 583 594 593
3 583 593 582
3 584 595 594
3 584 594 583
3 585 596 595
3 585 595 584
3 586 597 598
3 586 598 587
3 588 599 597
3 588 597 586
3 589 600 599
3 589 599 588
3 590 601 600
3 590 600 589
3 591 602 601
3 591 601 590
3 592 603 602
3 592 602 591
3 593 604 603
3 593 603 592
3 594 605 604
3 594 604 593
3 595 606 605
3 595 605 594
3 596 607 606
3 596 606 595
3 597 608 609
3 597 609 598
3 599 610 608
3 599 608 597
3 600 611 610
3 600 610 599
3 601 612 611
3 601 611 600
3 602 613 612
3 602 612 601
3 603 614 613
3 603 613 602
3 604 615 614
3 604 614 603
3 605 616 615
3 605 615 604
3 606 617 616
3 606 616 605
3 607 618 617
3 607 617 606
3 608 619 620
3 608 620 609
3 610 621 619
3 610 619 608
3 611 622 621
3 611 621 610
3 612 623 622
3 612 622 611
3 613 624 623
3 613 623 612
3 614 625 624
3 614 624 613
3 615 626 625
3 615 625 614
3 616 627 626
3 616 626 615
3 617 628 627
3 617 627 616
3 618 629 628
3 618 628 617
3 490 630 488
3 488 630 631
3 488 631 491
3 491 631 632
3 491 632 493
3 493 632 633
3 493 633 495
3 495 633 634
3 495 634 497
3 497 634 635
3 497 635 499
3 499 635 636
3 499 636 501
3 501 636 637
3 501 637 503
3 503 637 638
3 503 638 505
3 505 638 639
3 505 639 507
3 490 510 640
3 490 640 630
3 630 640 641
3 630 641 631
3 631 641 642
3 631 642 632
3 632 642 643
3 632 643 633
3 633 643 644
3 633 644 634
3 634 644 645
3 634 645 635
3 635 645 646
3 635 646 636
3 636 646 647
3 636 647 637
3 637 647 648
3 637 648 638
3 638 648 649
3 638 649 639
3 510 521 650
3 510 650 640
3 640 650 651
3 640 651 641
3 641 651 652
3 641 652 642
3 642 652 653
3 642 653 643
3 643 653 654
3 643 654 644
3 644 654 655
3 644 655 645
3 645 655 656
3 645 656 646
3 646 656 657
3 646 657 647
3 647 657 658
3 647 658 648
3 648 658 659
3 648 659 649
3 521 532 660
3 521 660 650
3 650 660 661
3 650 661 651
3 651 661 662
3 651 662 652
3 652 662 663
3 652 663 653
3 653 663 664
3 653 664 654
3 654 664 665
3 654 665 655
3 655 665 666
3 655 666 656
3 656 666 667
3 656 667 657
3 657 667 668
3 657 668 658
3 658 668 541
3 658 541 659
3 532 543 669
3 532 669 660
3 660 669 670
3 660 670 661
3 661 670 671
3 661 671 662
3 662 671 672
3 662 672 663
3 663 672 673
3 663 673 664
3 664 673 674
3 664 674 665
3 665 674 675
3 665 675 666
3 666 675 676
3 666 676 667
3 667 676 677
3 667 677 668
3 668 677 678
3 668 678 541
3 543 554 679
3 543 679 669
3 669 679 680
3 669 680 670
3 670 680 681
3 670 681 671
3 671 681 682
3 671 682 672
3 672 682 683
3 672 683 673
3 673 683 684
3 673 684 674
3 674 684 685
3 674 685 675
3 675 685 686
3 675 686 676
3 676 686 687
3 676 687 677
3 677 687 688
3 677 688 678
3 554 565 689
3 554 689 679
3 679 689 690
3 679 690 680
3 680 690 691
3 680 691 681
3 681 691 692
3 681 692 682
3 682 692 693
3 682 693 683
3 683 693 694
3 683 694 684
3 684 694 695
3 684 695 685
3 685 695 696
3 685 696 686
3 686 696 697
3 686 697 687
3 687 697 698
3 687 698 688
3 565 576 699
3 565 699 689
3 689 699 700
3 689 700 690
3 690 700 701
3 690 701 691
3 691 701 702
3 691 702 692
3 692 702 703
3 692 703 693
3 693 703 704
3 693 704 694
3 694 704 705
3 694 705 695
3 695 705 706
3 695 706 696
3 696 706 707
3 696 707 697
3 697 707 708
3 697 708 698
3 576 587 709
3 576 709 699
3 699 709 710
3 699 710 700
3 700 710 711
3 700 711 701
3 701 711 712
3 701 712 702
3 702 712 713
3 702 713 703
3 703 713 714
3 703 714 704
3 704 714 715
3 704 715 705
3 705 715 716
3 705 716 706
3 706 716 717
3 706 717 707
3 707 717 718
3 707 718 708
3 587 598 719
3 587 719 709
3 709 719 720
3 709 720 710
3 710 720 721
3 710 721 711
3 711 721 722
3 711 722 712
3 712 722 723
3 712 723 713
3 713 723 724
3 713 724 714
3 714 724 725
3 714 725 715
3 715 725 726
3 715 726 716
3 716 726 727
3 716 727 717
3 717 727 728
3 717 728 718
3 598 609 729
3 598 729 719
3 719 729 730
3 719 730 720
3 720 730 731
3 720 731 721
3 721 731 732
3 721 732 722
3 722 732 733
3 722 733 723
3 723 733 734
3 723 734 724
3 724 734 735
3 724 735 725
3 725 735 736
3 725 736 726
3 726 736 737
3 726 737 727
3 727 737 738
3 727 738 728
3 609 620 739
3 609 739 729
3 729 739 740
3 729 740 730
3 730 740 741
3 730 741 731
3 731 741 742
3 731 742 732
3 732 742 743
3 732 743 733
3 733 743 744
3 733 744 734
3 734 744 745
3 734 745 735
3 735 745 746
3 735 746 736
3 736 746 747
3 736 747 737
3 737 747 629
3 737 629 738
3 124 748 749
3 124 749 121
3 121 749 750
3 121 750 125
3 125 750 751
3 125 751 127
3 127 751 752
3 127 752 129
3 129 752 753
3 129 753 131
3 131 753 754
3 131 754 133
3 748 755 756
3 748 756 749
3 749 756 757
3 749 757 750
3 750 757 758
3 750 758 751
3 751 758 759
3 751 759 752
3 752 759 760
3 752 760 753
3 753 760 761
3 753 761 754
3 755 762 763
3 755 763 756
3 756 763 764
3 756 764 757
3 757 764 765
3 757 765 758
3 758 765 766
3 758 766 759
3 759 766 767
3 759 767 760
3 760 767 768
3 760 768 761
3 762 769 770
3 762 770 763
3 763 770 771
3 763 771 764
3 764 771 772
3 764 772 765
3 765 772 773
3 765 773 766
3 766 773 774
3 766 774 767
3 767 774 775
3 767 775 768
3 769 776 777
3 769 777 770
3 770 777 778
3 770 778 771
3 771 778 779
3 771 779 772
3 772 779 780
3 772 780 773
3 773 780 781
3 773 781 774
3 774 781 782
3 774 782 775
3 776 783 784
3 776 784 777
3 777 784 785
3 777 785 778
3 778 785 786
3 778 786 779
3 779 786 787
3 779 787 780
3 780 787 788
3 780 788 781
3 781 788 789
3 781 789 782
3 783 790 791
3 783 791 784
3 784 791 792
3 784 792 785
3 785 792 793
3 785 793 786
3 786 793 794
3 786 794 787
3 787 794 795
3 787 795 788
3 788 795 796
3 788 796 789
3 790 797 798
3 790 798 791
3 791 798 799
3 791 799 792
3 792 799 800
3 792 800 793
3 793 800 801
3 793 801 794
3 794 801 802
3 794 802 795
3 795 802 803
3 795 803 796
3 797 804 805
3 797 805 798
3 798 805 806
3 798 806 799
3 799 806 807
3 799 807 800
3 800 807 808
3 800 808 801
3 801 808 809
3 801 809 802
3 802 809 810
3 802 810 803
3 804 192 191
3 804 191 805
3 805 191 193
3 805 193 806
3 806 193 194
3 806 194 807
3 807 194 195
3 807 195 808
3 808 195 196
3 808 196 809
3 809 196 197
3 809 197 810
3 62 811 812
3 62 812 198
3 198 812 813
3 198 813 201
3 201 813 814
3 201 814 203
3 811 74 815
3 811 815 812
3 812 815 816
3 812 816 813
3 813 816 817
3 813 817 814
3 74 80 818
3 74 818 815
3 815 818 819
3 815 819 816
3 816 819 820
3 816 820 817
3 80 86 821
3 80 821 818
3 818 821 822
3 818 822 819
3 819 822 823
3 819 823 820
3 86 92 824
3 86 824 821
3 821 824 825
3 821 825 822
3 822 825 826
3 822 826 823
3 92 98 827
3 92 827 824
3 824 827 828
3 824 828 825
3 825 828 829
3 825 829 826
3 98 104 830
3 98 830 827
3 827 830 831
3 827 831 828
3 828 831 832
3 828 832 829
3 104 110 833
3 104 833 830
3 830 833 834
3 830 834 831
3 831 834 835
3 831 835 832
3 110 116 836
3 110 836 833
3 833 836 837
3 833 837 834
3 834 837 838
3 834 838 835
3 116 3 229
3 116 229 836
3 836 229 230
3 836 230 837
3 837 230 231
3 837 231 838
3 235 839 840
3 235 840 232
3 232 840 841
3 232 841 236
3 236 841 842
3 236 842 238
3 238 842 843
3 238 843 240
3 240 843 844
3 240 844 242
3 839 845 846
3 839 846 840
3 840 846 847
3 840 847 841
3 841 847 848
3 841 848 842
3 842 848 849
3 842 849 843
3 843 849 850
3 843 850 844
3 845 851 852
3 845 852 846
3 846 852 853
3 846 853 847
3 847 853 854
3 847 854 848
3 848 854 855
3 848 855 849
3 849 855 856
3 849 856 850
3 851 857 858
3 851 858 852
3 852 858 859
3 852 859 853
3 853 859 860
3 853 860 854
3 854 860 861
3 854 861 855
3 855 861 862
3 855 862 856
3 857 863 864
3 857 864 858
3 858 864 865
3 858 865 859
3 859 865 866
3 859 866 860
3 860 866 867
3 860 867 861
3 861 867 868
3 861 868 862
3 863 869 870
3 863 870 864
3 864 870 871
3 864 871 865
3 865 871 872
3 865 872 866
3 866 872 873
3 866 873 867
3 867 873 874
3 867 874 868
3 869 875 876
3 869 876 870
3 870 876 877
3 870 877 871
3 871 877 878
3 871 878 872
3 872 878 879
3 872 879 873
3 873 879 880
3 873 880 874
3 875 881 882
3 875 882 876
3 876 882 883
3 876 883 877
3 877 883 884
3 877 884 878
3 878 884 885
3 878 885 879
3 879 885 886
3 879 886 880
3 881 887 888
3 881 888 882
3 882 888 889
3 882 889 883
3 883 889 890
3 883 890 884
3 884 890 891
3 884 891 885
3 885 891 892
3 885 892 886
3 887 293 292
3 887 292 888
3 888 292 294
3 888 294 889
3 889 294 295
3 889 295 890
3 890 295 296
3 890 296 891
3 891 296 297
3 891 297 892
3 203 814 893
3 203 893 298
3 298 893 894
3 298 894 300
3 300 894 839
3 300 839 235
3 814 817 895
3 814 895 893
3 893 895 896
3 893 896 894
3 894 896 845
3 894 845 839
3 817 820 897
3 817 897 895
3 895 897 898
3 895 898 896
3 896 898 851
3 896 851 845
3 820 823 899
3 820 899 897
3 897 899 900
3 897 900 898
3 898 900 857
3 898 857 851
3 823 826 901
3 823 901 899
3 899 901 902
3 899 902 900
3 900 902 863
3 900 863 857
3 826 829 903
3 826 903 901
3 901 903 904
3 901 904 902
3 902 904 869
3 902 869 863
3 829 832 905
3 829 905 903
3 903 905 906
3 903 906 904
3 904 906 875
3 904 875 869
3 832 835 907
3 832 907 905
3 905 907 908
3 905 908 906
3 906 908 881
3 906 881 875
3 835 838 909
3 835 909 907
3 907 909 910
3 907 910 908
3 908 910 887
3 908 887 881
3 838 231 318
3 838 318 909
3 909 318 319
3 909 319 910
3 910 319 293
3 910 293 887
3 242 844 911
3 242 911 320
3 320 911 912
3 320 912 322
3 322 912 748
3 322 748 124
3 844 850 913
3 844 913 911
3 911 913 914
3 911 914 912
3 912 914 755
3 912 755 748
3 850 856 915
3 850 915 913
3 913 915 916
3 913 916 914
3 914 916 762
3 914 762 755
3 856 862 917
3 856 917 915
3 915 917 918
3 915 918 916
3 916 918 769
3 916 769 762
3 862 868 919
3 862 919 917
3 917 919 920
3 917 920 918
3 918 920 776
3 918 776 769
3 868 874 921
3 868 921 919
3 919 921 922
3 919 922 920
3 920 922 783
3 920 783 776
3 874 880 923
3 874 923 921
3 921 923 924
3 921 924 922
3 922 924 790
3 922 790 783
3 880 886 925
3 880 925 923
3 923 925 926
3 923 926 924
3 924 926 797
3 924 797 790
3 886 892 927
3 886 927 925
3 925 927 928
3 925 928 926
3 926 928 804
3 926 804 797
3 892 297 340
3 892 340 927
3 927 340 341
3 927 341 928
3 928 341 192
3 928 192 804
3 929 930 931
3 929 931 932
3 933 934 930
3 933 930 929
3 935 936 934
3 935 934 933
3 937 938 936
3 937 936 935
3 939 940 938
3 939 938 937
3 941 942 940
3 941 940 939
3 943 944 942
3 943 942 941
3 945 946 944
3 945 944 943
3 947 948 946
3 947 946 945
3 949 950 948
3 949 948 947
3 930 951 952
3 930 952 931
3 934 953 951
3 934 951 930
3 936 954 953
3 936 953 934
3 938 955 954
3 938 954 936
3 940 956 955
3 940 955 938
3 942 957 956
3 942 956 940
3 944 958 957
3 944 957 942
3 946 959 958
3 946 958 944
3 948 960 959
3 948 959 946
3 950 961 960
3 950 960 948
3 951 962 963
3 951 963 952
3 953 964 962
3 953 962 951
3 954 965 964
3 954 964 953
3 955 966 965
3 955 965 954
3 956 967 966
3 956 966 955
3 957 968 967
3 957 967 956
3 958 969 968
3 958 968 957
3 959 970 969
3 959 969 958
3 960 971 970
3 960 970 959
3 961 972 971
3 961 971 960
3 962 973 974
3 962 974 963
3 964 975 973
3 964 973 962
3 965 976 975
3 965 975 964
3 966 977 976
3 966 976 965
3 967 978 977
3 967 977 966
3 968 979 978
3 968 978 967
3 969 980 979
3 969 979 968
3 970 981 980
3 970 980 969
3 971 982 981
3 971 981 970
3 972 983 982
3 972 982 971
3 984 985 986
3 986 985 987
3 986 987 988
3 988 987 989
3 988 989 990
3 990 989 991
3 990 991 992
3 992 991 993
3 992 993 994
3 994 993 995
3 994 995 996
3 996 995 997
3 996 997 998
3 998 997 999
3 998 999 1000
3 1000 999 1001
3 1000 1001 1002
3 1002 1001 1003
3 1002 1003 1004
3 984 1005 1006
3 984 1006 985
3 985 1006 1007
3 985 1007 987
3 987 1007 1008
3 987 1008 989
3 989 1008 1009
3 989 1009 991
3 991 1009 1010
3 991 1010 993
3 993 1010 1011
3 993 1011 995
3 995 1011 1012
3 995 1012 997
3 997 1012 1013
3 997 1013 999
3 999 1013 1014
3 999 1014 1001
3 1001 1014 1015
3 1001 1015 1003
3 1005 1016 1017
3 1005 1017 1006
3 1006 1017 1018
3 1006 1018 1007
3 1007 1018 1019
3 1007 1019 1008
3 1008 1019 1020
3 1008 1020 1009
3 1009 1020 1021
3 1009 1021 1010
3 1010 1021 1022
3 1010 1022 1011
3 1011 1022 1023
3 1011 1023 1012
3 1012 1023 1024
3 1012 1024 1013
3 1013 1024 1025
3 1013 1025 1014
3 1014 1025 1026
3 1014 1026 1015
3 1016 1027 1028
3 1016 1028 1017
3 1017 1028 1029
3 1017 1029 1018
3 1018 1029 1030
3 1018 1030 1019
3 1019 1030 1031
3 1019 1031 1020
3 1020 1031 1032
3 1020 1032 1021
3 1021 1032 1033
3 1021 1033 1022
3 1022 1033 1034
3 1022 1034 1023
3 1023 1034 1035
3 1023 1035 1024
3 1024 1035 1036
3 1024 1036 1025
3 1025 1036 1037
3 1025 1037 1026
3 986 1038 984
3 988 1039 1038
3 988 1038 986
3 990 1040 1039
3 990 1039 988
3 992 1041 1040
3 992 1040 990
3 994 1042 1041
3 994 1041 992
3 996 1043 1042
3 996 1042 994
3 998 1044 1043
3 998 1043 996
3 1000 1045 1044
3 1000 1044 998
3 1002 1046 1045
3 1002 1045 1000
3 1003 1047 1046
3 1003 1046 1002
3 1038 1048 1005
3 1038 1005 984
3 1039 1049 1048
3 1039 1048 1038
3 1040 1050 1049
3 1040 1049 1039
3 1041 1051 1050
3 1041 1050 1040
3 1042 1052 1051
3 1042 1051 1041
3 1043 1053 1052
3 1043 1052 1042
3 1044 1054 1053
3 1044 1053 1043
3 1045 1055 1054
3 1045 1054 1044
3 1046 1056 1055
3 1046 1055 1045
3 1047 1015 1056
3 1047 1056 1046
3 1048 1057 1016
3 1048 1016 1005
3 1049 1058 1057
3 1049 1057 1048
3 1050 1059 1058
3 1050 1058 1049
3 1051 1060 1059
3 1051 1059 1050
3 1052 1061 1060
3 1052 1060 1051
3 1053 1062 1061
3 1053 1061 1052
3 1054 1063 1062
3 1054 1062 1053
3 1055 1064 1063
3 1055 1063 1054
3 1056 1065 1064
3 1056 1064 1055
3 1015 1026 1065
3 1015 1065 1056
3 1057 1066 1027
3 1057 1027 1016
3 1058 1067 1066
3 1058 1066 1057
3 1059 1068 1067
3 1059 1067 1058
3 1060 1069 1068
3 1060 1068 1059
3 1061 1070 1069
3 1061 1069 1060
3 1062 1071 1070
3 1062 1070 1061
3 1063 1072 1071
3 1063 1071 1062
3 1064 1073 1072
3 1064 1072 1063
3 1065 1074 1073
3 1065 1073 1064
3 1026 1037 1074
3 1026 1074 1065
3 1075 1076 1077
3 1077 1076 1078
3 1077 1078 1079
3 1079 1078 1080
3 1079 1080 1081
3 1081 1080 1082
3 1081 1082 1083
3 1083 1082 1084
3 1083 1084 1085
3 1085 1084 1086
3 1085 1086 1087
3 1087 1086 1088
3 1087 1088 1089
3 1089 1088 1090
3 1089 1090 1091
3 1091 1090 1092
3 1091 1092 1093
3 1093 1092 1094
3 1093 1094 1095
3 1075 1096 1097
3 1075 1097 1076
3 1076 1097 1098
3 1076 1098 1078
3 1078 1098 1099
3 1078 1099 1080
3 1080 1099 1100
3 1080 1100 1082
3 1082 1100 1101
3 1082 1101 1084
3 1084 1101 1102
3 1084 1102 1086
3 1086 1102 1103
3 1086 1103 1088
3 1088 1103 1104
3 1088 1104 1090
3 1090 1104 1105
3 1090 1105 1092
3 1092 1105 1106
3 1092 1106 1094
3 1096 1107 1108
3 1096 1108 1097
3 1097 1108 1109
3 1097 1109 1098
3 1098 1109 1110
3 1098 1110 1099
3 1099 1110 1111
3 1099 1111 1100
3 1100 1111 1112
3 1100 1112 1101
3 1101 1112 1113
3 1101 1113 1102
3 1102 1113 1114
3 1102 1114 1103
3 1103 1114 1115
3 1103 1115 1104
3 1104 1115 1116
3 1104 1116 1105
3 1105 1116 1117
3 1105 1117 1106
3 1107 1118 1119
3 1107 1119 1108
3 1108 1119 1120
3 1108 1120 1109
3 1109 1120 1121
3 1109 1121 1110
3 1110 1121 1122
3 1110 1122 1111
3 1111 1122 1123
3 1111 1123 1112
3 1112 1123 1124
3 1112 1124 1113
3 1113 1124 1125
3 1113 1125 1114
3 1114 1125 1126
3 1114 1126 1115
3 1115 1126 1127
3 1115 1127 1116
3 1116 1127 1128
3 1116 1128 1117
3 1118 1129 1130
3 1118 1130 1119
3 1119 1130 1131
3 1119 1131 1120
3 1120 1131 1132
3 1120 1132 1121
3 1121 1132 1133
3 1121 1133 1122
3 1122 1133 1134
3 1122 1134 1123
3 1123 1134 1135
3 1123 1135 1124
3 1124 1135 1136
3 1124 1136 1125
3 1125 1136 1137
3 1125 1137 1126
3 1126 1137 1138
3 1126 1138 1127
3 1127 1138 1139
3 1127 1139 1128
3 1129 1140 1141
3 1129 1141 1130
3 1130 1141 1142
3 1130 1142 1131
3 1131 1142 1143
3 1131 1143 1132
3 1132 1143 1144
3 1132 1144 1133
3 1133 1144 1145
3 1133 1145 1134
3 1134 1145 1146
3 1134 1146 1135
3 1135 1146 1147
3 1135 1147 1136
3 1136 1147 1148
3 1136 1148 1137
3 1137 1148 1149
3 1137 1149 1138
3 1138 1149 1150
3 1138 1150 1139
3 1140 1151 1152
3 1140 1152 1141
3 1141 1152 1153
3 1141 1153 1142
3 1142 1153 1154
3 1142 1154 1143
3 1143 1154 1155
3 1143 1155 1144
3 1144 1155 1156
3 1144 1156 1145
3 1145 1156 1157
3 1145 1157 1146
3 1146 1157 1158
3 1146 1158 1147
3 1147 1158 1159
3 1147 1159 1148
3 1148 1159 1160
3 1148 1160 1149
3 1149 1160 1161
3 1149 1161 1150
3 1151 1162 1163
3 1151 1163 1152
3 1152 1163 1164
3 1152 1164 1153
3 1153 1164 1165
3 1153 1165 1154
3 1154 1165 1166
3 1154 1166 1155
3 1155 1166 1167
3 1155 1167 1156
3 1156 1167 1168
3 1156 1168 1157
3 1157 1168 1169
3 1157 1169 1158
3 1158 1169 1170
3 1158 1170 1159
3 1159 1170 1171
3 1159 1171 1160
3 1160 1171 1172
3 1160 1172 1161
3 1162 1173 1174
3 1162 1174 1163
3 1163 1174 1175
3 1163 1175 1164
3 1164 1175 1176
3 1164 1176 1165
3 1165 1176 1177
3 1165 1177 1166
3 1166 1177 1178
3 1166 1178 1167
3 1167 1178 1179
3 1167 1179 1168
3 1168 1179 1180
3 1168 1180 1169
3 1169 1180 1181
3 1169 1181 1170
3 1170 1181 1182
3 1170 1182 1171
3 1171 1182 1183
3 1171 1183 1172
3 1173 1184 1185
3 1173 1185 1174
3 1174 1185 1186
3 1174 1186 1175
3 1175 1186 1187
3 1175 1187 1176
3 1176 1187 1188
3 1176 1188 1177
3 1177 1188 1189
3 1177 1189 1178
3 1178 1189 1190
3 1178 1190 1179
3 1179 1190 1191
3 1179 1191 1180
3 1180 1191 1192
3 1180 1192 1181
3 1181 1192 1193
3 1181 1193 1182
3 1182 1193 1194
3 1182 1194 1183
3 1184 1195 1196
3 1184 1196 1185
3 1185 1196 1197
3 1185 1197 1186
3 1186 1197 1198
3 1186 1198 1187
3 1187 1198 1199
3 1187 1199 1188
3 1188 1199 1200
3 1188 1200 1189
3 1189 1200 1201
3 1189 1201 1190
3 1190 1201 1202
3 1190 1202 1191
3 1191 1202 1203
3 1191 1203 1192
3 1192 1203 1204
3 1192 1204 1193
3 1193 1204 1205
3 1193 1205 1194
3 1195 1206 1207
3 1195 1207 1196
3 1196 1207 1208
3 1196 1208 1197
3 1197 1208 1209
3 1197 1209 1198
3 1198 1209 1210
3 1198 1210 1199
3 1199 1210 1211
3 1199 1211 1200
3 1200 1211 1212
3 1200 1212 1201
3 1201 1212 1213
3 1201 1213 1202
3 1202 1213 1214
3 1202 1214 1203
3 1203 1214 1215
3 1203 1215 1204
3 1204 1215 1216
3 1204 1216 1205
3 1077 1217 1075
3 1079 1218 1217
3 1079 1217 1077
3 1081 1219 1218
3 1081 1218 1079
3 1083 1220 1219
3 1083 1219 1081
3 1085 1221 1220
3 1085 1220 1083
3 1087 1222 1221
3 1087 1221 1085
3 1089 1223 1222
3 1089 1222 1087
3 1091 1224 1223
3 1091 1223 1089
3 1093 1225 1224
3 1093 1224 1091
3 1095 1226 1225
3 1095 1225 1093
3 1217 1227 1096
3 1217 1096 1075
3 1218 1228 1227
3 1218 1227 1217
3 1219 1229 1228
3 1219 1228 1218
3 1220 1230 1229
3 1220 1229 1219
3 1221 1231 1230
3 1221 1230 1220
3 1222 1232 1231
3 1222 1231 1221
3 1223 1233 1232
3 1223 1232 1222
3 1224 1234 1233
3 1224 1233 1223
3 1225 1235 1234
3 1225 1234 1224
3 1226 1236 1235
3 1226 1235 1225
3 1227 1237 1107
3 1227 1107 1096
3 1228 1238 1237
3 1228 1237 1227
3 1229 1239 1238
3 1229 1238 1228
3 1230 1240 1239
3 1230 1239 1229
3 1231 1241 1240
3 1231 1240 1230
3 1232 1242 1241
3 1232 1241 1231
3 1233 1243 1242
3 1233 1242 1232
3 1234 1244 1243
3 1234 1243 1233
3 1235 1245 1244
3 1235 1244 1234
3 1236 1246 1245
3 1236 1245 1235
3 1237 1247 1118
3 1237 1118 1107
3 1238 1248 1247
3 1238 1247 1237
3 1239 1249 1248
3 1239 1248 1238
3 1240 1250 1249
3 1240 1249 1239
3 1241 1251 1250
3 1241 1250 1240
3 1242 1252 1251
3 1242 1251 1241
3 1243 1253 1252
3 1243 1252 1242
3 1244 1254 1253
3 1244 1253 1243
3 1245 1255 1254
3 1245 1254 1244
3 1246 1128 1255
3 1246 1255 1245
3 1247 1256 1129
3 1247 1129 1118
3 1248 1257 1256
3 1248 1256 1247
3 1249 1258 1257
3 1249 1257 1248
3 1250 1259 1258
3 1250 1258 1249
3 1251 1260 1259
3 1251 1259 1250
3 1252 1261 1260
3 1252 1260 1251
3 1253 1262 1261
3 1253 1261 1252
3 1254 1263 1262
3 1254 1262 1253
3 1255 1264 1263
3 1255 1263 1254
3 1128 1265 1264
3 1128 1264 1255
3 1256 1266 1140
3 1256 1140 1129
3 1257 1267 1266
3 1257 1266 1256
3 1258 1268 1267
3 1258 1267 1257
3 1259 1269 1268
3 1259 1268 1258
3 1260 1270 1269
3 1260 1269 1259
3 1261 1271 1270
3 1261 1270 1260
3 1262 1272 1271
3 1262 1271 1261
3 1263 1273 1272
3 1263 1272 1262
3 1264 1274 1273
3 1264 1273 1263
3 1265 1275 1274
3 1265 1274 1264
3 1266 1276 1151
3 1266 1151 1140
3 1267 1277 1276
3 1267 1276 1266
3 1268 1278 1277
3 1268 1277 1267
3 1269 1279 1278
3 1269 1278 1268
3 1270 1280 1279
3 1270 1279 1269
3 1271 1281 1280
3 1271 1280 1270
3 1272 1282 1281
3 1272 1281 1271
3 1273 1283 1282
3 1273 1282 1272
3 1274 1284 1283
3 1274 1283 1273
3 1275 1285 1284
3 1275 1284 1274
3 1276 1286 1162
3 1276 1162 1151
3 1277 1287 1286
3 1277 1286 1276
3 1278 1288 1287
3 1278 1287 1277
3 1279 1289 1288
3 1279 1288 1278
3 1280 1290 1289
3 1280 1289 1279
3 1281 1291 1290
3 1281 1290 1280
3 1282 1292 1291
3 1282 1291 1281
3 1283 1293 1292
3 1283 1292 1282
3 1284 1294 1293
3 1284 1293 1283
3 1285 1295 1294
3 1285 1294 1284
3 1286 1296 1173
3 1286 1173 1162
3 1287 1297 1296
3 1287 1296 1286
3 1288 1298 1297
3 1288 1297 1287
3 1289 1299 1298
3 1289 1298 1288
3 1290 1300 1299
3 1290 1299 1289
3 1291 1301 1300
3 1291 1300 1290
3 1292 1302 1301
3 1292 1301 1291
3 1293 1303 1302
3 1293 1302 1292
3 1294 1304 1303
3 1294 1303 1293
3 1295 1305 1304
3 1295 1304 1294
3 1296 1306 1184
3 1296 1184 1173
3 1297 1307 1306
3 1297 1306 1296
3 1298 1308 1307
3 1298 1307 1297
3 1299 1309 1308
3 1299 1308 1298
3 1300 1310 1309
3 1300 1309 1299
3 1301 1311 1310
3 1301 1310 1300
3 1302 1312 1311
3 1302 1311 1301
3 1303 1313 1312
3 1303 1312 1302
3 1304 1314 1313
3 1304 1313 1303
3 1305 1315 1314
3 1305 1314 1304
3 1306 1316 1195
3 1306 1195 1184
3 1307 1317 1316
3 1307 1316 1306
3 1308 1318 1317
3 1308 1317 1307
3 1309 1319 1318
3 1309 1318 1308
3 1310 1320 1319
3 1310 1319 1309
3 1311 1321 1320
3 1311 1320 1310
3 1312 1322 1321
3 1312 1321 1311
3 1313 1323 1322
3 1313 1322 1312
3 1314 1324 1323
3 1314 1323 1313
3 1315 1325 1324
3 1315 1324 1314
3 1316 1326 1206
3 1316 1206 1195
3 1317 1327 1326
3 1317 1326 1316
3 1318 1328 1327
3 1318 1327 1317
3 1319 1329 1328
3 1319 1328 1318
3 1320 1330 1329
3 1320 1329 1319
3 1321 1331 1330
3 1321 1330 1320
3 1322 1332 1331
3 1322 1331 1321
3 1323 1333 1332
3 1323 1332 1322
3 1324 1334 1333
3 1324 1333 1323
3 1325 1216 1334
3 1325 1334 1324
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/aeroplane/01.ply -label_class=1 -label_item=1 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/aeroplane_pascal/ -semisphere=0
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/aeroplane/02.ply -label_class=1 -label_item=2 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/aeroplane_pascal/ -semisphere=0
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/aeroplane/03.ply -label_class=1 -label_item=3 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/aeroplane_pascal/ -semisphere=0
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/aeroplane/04.ply -label_class=1 -label_item=4 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/aeroplane_pascal/ -semisphere=0
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/aeroplane/05.ply -label_class=1 -label_item=5 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/aeroplane_pascal/ -semisphere=0
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/aeroplane/06.ply -label_class=1 -label_item=6 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/aeroplane_pascal/ -semisphere=0
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/aeroplane/07.ply -label_class=1 -label_item=7 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/aeroplane_pascal/ -semisphere=0
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/aeroplane/08.ply -label_class=1 -label_item=8 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/aeroplane_pascal/ -semisphere=0
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bicycle/01.ply -label_class=2 -label_item=1 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bicycle_pascal/ -z_range=0.6
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bicycle/02.ply -label_class=2 -label_item=2 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bicycle_pascal/ -z_range=0.6
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bicycle/03.ply -label_class=2 -label_item=3 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bicycle_pascal/ -z_range=0.6
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bicycle/04.ply -label_class=2 -label_item=4 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bicycle_pascal/ -z_range=0.6
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bicycle/05.ply -label_class=2 -label_item=5 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bicycle_pascal/ -z_range=0.6
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bicycle/06.ply -label_class=2 -label_item=6 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bicycle_pascal/ -z_range=0.6
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/boat/01.ply -label_class=3 -label_item=1 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/boat_pascal/ -z_range=0.6
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/boat/02.ply -label_class=3 -label_item=2 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/boat_pascal/ -z_range=0.6
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/boat/03.ply -label_class=3 -label_item=3 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/boat_pascal/ -z_range=0.6
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/boat/04.ply -label_class=3 -label_item=4 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/boat_pascal/ -z_range=0.6
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/boat/05.ply -label_class=3 -label_item=5 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/boat_pascal/ -z_range=0.6
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/boat/06.ply -label_class=3 -label_item=6 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/boat_pascal/ -z_range=0.6
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bottle/01.ply -label_class=4 -label_item=1 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bottle_pascal/ -z_range=0.5
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bottle/02.ply -label_class=4 -label_item=2 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bottle_pascal/ -z_range=0.5
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bottle/03.ply -label_class=4 -label_item=3 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bottle_pascal/ -z_range=0.5
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bottle/04.ply -label_class=4 -label_item=4 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bottle_pascal/ -z_range=0.5
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bottle/05.ply -label_class=4 -label_item=5 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bottle_pascal/ -z_range=0.5
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bottle/06.ply -label_class=4 -label_item=6 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bottle_pascal/ -z_range=0.5
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bottle/07.ply -label_class=4 -label_item=7 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bottle_pascal/ -z_range=0.5
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bottle/08.ply -label_class=4 -label_item=8 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bottle_pascal/ -z_range=0.5
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bus/01.ply -label_class=5 -label_item=1 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bus_pascal/ -z_range=0.2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bus/02.ply -label_class=5 -label_item=2 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bus_pascal/ -z_range=0.2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bus/03.ply -label_class=5 -label_item=3 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bus_pascal/ -z_range=0.2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bus/04.ply -label_class=5 -label_item=4 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bus_pascal/ -z_range=0.2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bus/05.ply -label_class=5 -label_item=5 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bus_pascal/ -z_range=0.2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bus/06.ply -label_class=5 -label_item=6 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bus_pascal/ -z_range=0.2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/car/01.ply -label_class=6 -label_item=1 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/car_pascal/ -z_range=0.5
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/car/02.ply -label_class=6 -label_item=2 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/car_pascal/ -z_range=0.5
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/car/03.ply -label_class=6 -label_item=3 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/car_pascal/ -z_range=0.5
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/car/04.ply -label_class=6 -label_item=4 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/car_pascal/ -z_range=0.5
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/car/05.ply -label_class=6 -label_item=5 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/car_pascal/ -z_range=0.5
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/car/06.ply -label_class=6 -label_item=6 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/car_pascal/ -z_range=0.5
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/car/07.ply -label_class=6 -label_item=7 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/car_pascal/ -z_range=0.5
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/car/08.ply -label_class=6 -label_item=8 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/car_pascal/ -z_range=0.5
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/car/09.ply -label_class=6 -label_item=9 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/car_pascal/ -z_range=0.5
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/car/10.ply -label_class=6 -label_item=10 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/car_pascal/ -z_range=0.5
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/chair/01.ply -label_class=7 -label_item=1 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/chair_pascal/ -z_range=0.6
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/chair/02.ply -label_class=7 -label_item=2 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/chair_pascal/ -z_range=0.6
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/chair/03.ply -label_class=7 -label_item=3 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/chair_pascal/ -z_range=0.6
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/chair/04.ply -label_class=7 -label_item=4 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/chair_pascal/ -z_range=0.6
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/chair/05.ply -label_class=7 -label_item=5 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/chair_pascal/ -z_range=0.6
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/chair/06.ply -label_class=7 -label_item=6 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/chair_pascal/ -z_range=0.6
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/chair/07.ply -label_class=7 -label_item=7 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/chair_pascal/ -z_range=0.6
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/chair/08.ply -label_class=7 -label_item=8 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/chair_pascal/ -z_range=0.6
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/chair/09.ply -label_class=7 -label_item=9 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/chair_pascal/ -z_range=0.6
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/chair/10.ply -label_class=7 -label_item=10 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/chair_pascal/ -z_range=0.6
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/diningtable/01.ply -label_class=8 -label_item=1 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/diningtable_pascal/ -z_range=0.6
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/diningtable/02.ply -label_class=8 -label_item=2 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/diningtable_pascal/ -z_range=0.6
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/diningtable/03.ply -label_class=8 -label_item=3 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/diningtable_pascal/ -z_range=0.6
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/diningtable/04.ply -label_class=8 -label_item=4 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/diningtable_pascal/ -z_range=0.6
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/diningtable/05.ply -label_class=8 -label_item=5 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/diningtable_pascal/ -z_range=0.6
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/diningtable/06.ply -label_class=8 -label_item=6 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/diningtable_pascal/ -z_range=0.6
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/diningtable/07.ply -label_class=8 -label_item=7 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/diningtable_pascal/ -z_range=0.6
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/diningtable/08.ply -label_class=8 -label_item=8 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/diningtable_pascal/ -z_range=0.6
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/diningtable/09.ply -label_class=8 -label_item=9 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/diningtable_pascal/ -z_range=0.6
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/diningtable/10.ply -label_class=8 -label_item=10 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/diningtable_pascal/ -z_range=0.6
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/diningtable/11.ply -label_class=8 -label_item=11 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/diningtable_pascal/ -z_range=0.6
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/diningtable/12.ply -label_class=8 -label_item=12 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/diningtable_pascal/ -z_range=0.6
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/motorbike/01.ply -label_class=9 -label_item=1 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/motorbike_pascal/ -z_range=0.5
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/motorbike/02.ply -label_class=9 -label_item=2 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/motorbike_pascal/ -z_range=0.5
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/motorbike/03.ply -label_class=9 -label_item=3 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/motorbike_pascal/ -z_range=0.5
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/motorbike/04.ply -label_class=9 -label_item=4 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/motorbike_pascal/ -z_range=0.5
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/motorbike/05.ply -label_class=9 -label_item=5 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/motorbike_pascal/ -z_range=0.5
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/sofa/01.ply -label_class=10 -label_item=1 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/sofa_pascal/ -z_range=0.6
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/sofa/02.ply -label_class=10 -label_item=2 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/sofa_pascal/ -z_range=0.6
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/sofa/03.ply -label_class=10 -label_item=3 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/sofa_pascal/ -z_range=0.6
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/sofa/04.ply -label_class=10 -label_item=4 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/sofa_pascal/ -z_range=0.6
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/sofa/05.ply -label_class=10 -label_item=5 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/sofa_pascal/ -z_range=0.6
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/sofa/06.ply -label_class=10 -label_item=6 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/sofa_pascal/ -z_range=0.6
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/train/01.ply -label_class=11 -label_item=1 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/train_pascal/ -z_range=0.2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/train/02.ply -label_class=11 -label_item=2 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/train_pascal/ -z_range=0.2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/train/03.ply -label_class=11 -label_item=3 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/train_pascal/ -z_range=0.2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/train/04.ply -label_class=11 -label_item=4 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/train_pascal/ -z_range=0.2
\ No newline at end of file
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/aeroplane/01.ply -label_class=1 -label_item=1 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/aeroplane_pascal/ -semisphere=0 -view_region=2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/aeroplane/02.ply -label_class=1 -label_item=2 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/aeroplane_pascal/ -semisphere=0 -view_region=2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/aeroplane/03.ply -label_class=1 -label_item=3 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/aeroplane_pascal/ -semisphere=0 -view_region=2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/aeroplane/04.ply -label_class=1 -label_item=4 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/aeroplane_pascal/ -semisphere=0 -view_region=2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/aeroplane/05.ply -label_class=1 -label_item=5 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/aeroplane_pascal/ -semisphere=0 -view_region=2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/aeroplane/06.ply -label_class=1 -label_item=6 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/aeroplane_pascal/ -semisphere=0 -view_region=2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/aeroplane/07.ply -label_class=1 -label_item=7 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/aeroplane_pascal/ -semisphere=0 -view_region=2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/aeroplane/08.ply -label_class=1 -label_item=8 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/aeroplane_pascal/ -semisphere=0 -view_region=2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bicycle/01.ply -label_class=2 -label_item=1 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bicycle_pascal/ -z_range=0.6 -view_region=2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bicycle/02.ply -label_class=2 -label_item=2 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bicycle_pascal/ -z_range=0.6 -view_region=2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bicycle/03.ply -label_class=2 -label_item=3 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bicycle_pascal/ -z_range=0.6 -view_region=2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bicycle/04.ply -label_class=2 -label_item=4 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bicycle_pascal/ -z_range=0.6 -view_region=2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bicycle/05.ply -label_class=2 -label_item=5 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bicycle_pascal/ -z_range=0.6 -view_region=2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bicycle/06.ply -label_class=2 -label_item=6 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bicycle_pascal/ -z_range=0.6 -view_region=2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/boat/01.ply -label_class=3 -label_item=1 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/boat_pascal/ -z_range=0.6 -view_region=2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/boat/02.ply -label_class=3 -label_item=2 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/boat_pascal/ -z_range=0.6 -view_region=2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/boat/04.ply -label_class=3 -label_item=4 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/boat_pascal/ -z_range=0.6 -view_region=2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/boat/05.ply -label_class=3 -label_item=5 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/boat_pascal/ -z_range=0.6 -view_region=2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/boat/06.ply -label_class=3 -label_item=6 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/boat_pascal/ -z_range=0.6 -view_region=2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bus/01.ply -label_class=5 -label_item=1 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bus_pascal/ -z_range=0.2 -view_region=2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bus/02.ply -label_class=5 -label_item=2 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bus_pascal/ -z_range=0.2 -view_region=2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bus/03.ply -label_class=5 -label_item=3 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bus_pascal/ -z_range=0.2 -view_region=2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bus/04.ply -label_class=5 -label_item=4 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bus_pascal/ -z_range=0.2 -view_region=2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bus/05.ply -label_class=5 -label_item=5 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bus_pascal/ -z_range=0.2 -view_region=2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bus/06.ply -label_class=5 -label_item=6 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bus_pascal/ -z_range=0.2 -view_region=2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/car/01.ply -label_class=6 -label_item=1 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/car_pascal/ -z_range=0.5 -view_region=2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/car/02.ply -label_class=6 -label_item=2 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/car_pascal/ -z_range=0.5 -view_region=2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/car/03.ply -label_class=6 -label_item=3 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/car_pascal/ -z_range=0.5 -view_region=2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/car/04.ply -label_class=6 -label_item=4 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/car_pascal/ -z_range=0.5 -view_region=2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/car/05.ply -label_class=6 -label_item=5 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/car_pascal/ -z_range=0.5 -view_region=2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/car/06.ply -label_class=6 -label_item=6 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/car_pascal/ -z_range=0.5 -view_region=2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/car/07.ply -label_class=6 -label_item=7 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/car_pascal/ -z_range=0.5 -view_region=2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/car/08.ply -label_class=6 -label_item=8 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/car_pascal/ -z_range=0.5 -view_region=2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/car/09.ply -label_class=6 -label_item=9 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/car_pascal/ -z_range=0.5 -view_region=2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/car/10.ply -label_class=6 -label_item=10 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/car_pascal/ -z_range=0.5 -view_region=2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/motorbike/01.ply -label_class=9 -label_item=1 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/motorbike_pascal/ -z_range=0.5 -view_region=2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/motorbike/02.ply -label_class=9 -label_item=2 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/motorbike_pascal/ -z_range=0.5 -view_region=2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/motorbike/03.ply -label_class=9 -label_item=3 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/motorbike_pascal/ -z_range=0.5 -view_region=2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/motorbike/04.ply -label_class=9 -label_item=4 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/motorbike_pascal/ -z_range=0.5 -view_region=2
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/motorbike/05.ply -label_class=9 -label_item=5 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/motorbike_pascal/ -z_range=0.5 -view_region=2
\ No newline at end of file
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/aeroplane/01.ply -label_class=1 -label_item=1 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/aeroplane_pascal/ -semisphere=0 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/aeroplane/02.ply -label_class=1 -label_item=2 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/aeroplane_pascal/ -semisphere=0 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/aeroplane/03.ply -label_class=1 -label_item=3 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/aeroplane_pascal/ -semisphere=0 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/aeroplane/04.ply -label_class=1 -label_item=4 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/aeroplane_pascal/ -semisphere=0 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/aeroplane/05.ply -label_class=1 -label_item=5 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/aeroplane_pascal/ -semisphere=0 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/aeroplane/06.ply -label_class=1 -label_item=6 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/aeroplane_pascal/ -semisphere=0 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/aeroplane/07.ply -label_class=1 -label_item=7 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/aeroplane_pascal/ -semisphere=0 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/aeroplane/08.ply -label_class=1 -label_item=8 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/aeroplane_pascal/ -semisphere=0 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bicycle/01.ply -label_class=2 -label_item=1 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bicycle_pascal/ -z_range=0.6 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bicycle/02.ply -label_class=2 -label_item=2 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bicycle_pascal/ -z_range=0.6 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bicycle/03.ply -label_class=2 -label_item=3 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bicycle_pascal/ -z_range=0.6 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bicycle/04.ply -label_class=2 -label_item=4 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bicycle_pascal/ -z_range=0.6 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bicycle/05.ply -label_class=2 -label_item=5 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bicycle_pascal/ -z_range=0.6 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bicycle/06.ply -label_class=2 -label_item=6 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bicycle_pascal/ -z_range=0.6 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/boat/01.ply -label_class=3 -label_item=1 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/boat_pascal/ -z_range=0.6 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/boat/02.ply -label_class=3 -label_item=2 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/boat_pascal/ -z_range=0.6 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/boat/04.ply -label_class=3 -label_item=4 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/boat_pascal/ -z_range=0.6 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/boat/05.ply -label_class=3 -label_item=5 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/boat_pascal/ -z_range=0.6 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/boat/06.ply -label_class=3 -label_item=6 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/boat_pascal/ -z_range=0.6 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bus/01.ply -label_class=5 -label_item=1 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bus_pascal/ -z_range=0.2 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bus/02.ply -label_class=5 -label_item=2 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bus_pascal/ -z_range=0.2 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bus/03.ply -label_class=5 -label_item=3 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bus_pascal/ -z_range=0.2 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bus/04.ply -label_class=5 -label_item=4 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bus_pascal/ -z_range=0.2 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bus/05.ply -label_class=5 -label_item=5 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bus_pascal/ -z_range=0.2 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/bus/06.ply -label_class=5 -label_item=6 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/bus_pascal/ -z_range=0.2 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/car/01.ply -label_class=6 -label_item=1 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/car_pascal/ -z_range=0.5 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/car/02.ply -label_class=6 -label_item=2 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/car_pascal/ -z_range=0.5 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/car/03.ply -label_class=6 -label_item=3 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/car_pascal/ -z_range=0.5 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/car/04.ply -label_class=6 -label_item=4 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/car_pascal/ -z_range=0.5 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/car/05.ply -label_class=6 -label_item=5 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/car_pascal/ -z_range=0.5 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/car/06.ply -label_class=6 -label_item=6 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/car_pascal/ -z_range=0.5 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/car/07.ply -label_class=6 -label_item=7 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/car_pascal/ -z_range=0.5 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/car/08.ply -label_class=6 -label_item=8 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/car_pascal/ -z_range=0.5 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/car/09.ply -label_class=6 -label_item=9 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/car_pascal/ -z_range=0.5 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/car/10.ply -label_class=6 -label_item=10 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/car_pascal/ -z_range=0.5 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/motorbike/01.ply -label_class=9 -label_item=1 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/motorbike_pascal/ -z_range=0.5 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/motorbike/02.ply -label_class=9 -label_item=2 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/motorbike_pascal/ -z_range=0.5 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/motorbike/03.ply -label_class=9 -label_item=3 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/motorbike_pascal/ -z_range=0.5 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/motorbike/04.ply -label_class=9 -label_item=4 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/motorbike_pascal/ -z_range=0.5 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/motorbike/05.ply -label_class=9 -label_item=5 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/motorbike_pascal/ -z_range=0.5 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/train/01.ply -label_class=11 -label_item=1 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/train_pascal/ -z_range=0.2 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/train/02.ply -label_class=11 -label_item=2 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/train_pascal/ -z_range=0.2 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/train/03.ply -label_class=11 -label_item=3 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/train_pascal/ -z_range=0.2 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/train/04.ply -label_class=11 -label_item=4 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/train_pascal/ -z_range=0.2 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/train/05.ply -label_class=11 -label_item=5 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/train_pascal/ -z_range=0.2 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/tvmonitor/01.ply -label_class=12 -label_item=1 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/tvmonitor_pascal/ -z_range=0.3 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/tvmonitor/02.ply -label_class=12 -label_item=2 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/tvmonitor_pascal/ -z_range=0.3 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/tvmonitor/03.ply -label_class=12 -label_item=3 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/tvmonitor_pascal/ -z_range=0.3 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/tvmonitor/04.ply -label_class=12 -label_item=4 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/tvmonitor_pascal/ -z_range=0.3 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/tvmonitor/05.ply -label_class=12 -label_item=5 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/tvmonitor_pascal/ -z_range=0.3 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/tvmonitor/06.ply -label_class=12 -label_item=6 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/tvmonitor_pascal/ -z_range=0.3 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/tvmonitor/07.ply -label_class=12 -label_item=7 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/tvmonitor_pascal/ -z_range=0.3 -view_region=1
./sphereview_test -plymodel=/Users/yidawang/Documents/database/PASCAL3D+_release1.1/CAD/tvmonitor/08.ply -label_class=12 -label_item=8 -bakgrdir=/Users/yidawang/Documents/database/backgrd_pascal/tvmonitor_pascal/ -z_range=0.3 -view_region=1
\ No newline at end of file
/*
* Software License Agreement (BSD License)
*
* Copyright (c) 2009, Willow Garage, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
* * Neither the name of Willow Garage, Inc. nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
/**
* @file demo_classify.cpp
* @brief Feature extraction and classification.
* @author Yida Wang
*/
#include <opencv2/cnn_3dobj.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <iomanip>
using namespace cv;
using namespace std;
using namespace cv::cnn_3dobj;
/**
* @function listDir
* @brief Making all files names under a directory into a list
*/
void listDir(const char *path, std::vector<String>& files, bool r)
{
DIR *pDir;
struct dirent *ent;
char childpath[512];
pDir = opendir(path);
memset(childpath, 0, sizeof(childpath));
while ((ent = readdir(pDir)) != NULL)
{
if (ent->d_type & DT_DIR)
{
if (strcmp(ent->d_name, ".") == 0 || strcmp(ent->d_name, "..") == 0 || strcmp(ent->d_name, ".DS_Store") == 0)
{
continue;
}
if (r)
{
sprintf(childpath, "%s/%s", path, ent->d_name);
listDir(childpath,files,false);
}
}
else
{
if (strcmp(ent->d_name, ".DS_Store") != 0)
files.push_back(ent->d_name);
}
}
sort(files.begin(),files.end());
};
/**
* @function featureWrite
* @brief Writing features of gallery images into binary files
*/
int featureWrite(const Mat &features, const String &fname)
{
ofstream ouF;
ouF.open(fname.c_str(), std::ofstream::binary);
if (!ouF)
{
cerr << "failed to open the file : " << fname << endl;
return 0;
}
for (int r = 0; r < features.rows; r++)
{
ouF.write(reinterpret_cast<const char*>(features.ptr(r)), features.cols*features.elemSize());
}
ouF.close();
return 1;
}
/**
* @function main
*/
int main(int argc, char** argv)
{
const String keys = "{help | | This sample will extract features from reference images and target image for classification. You can add a mean_file if there little variance in data such as human faces, otherwise it is not so useful}"
"{src_dir | ../data/images_all/ | Source direction of the images ready for being used for extract feature as gallery.}"
"{caffemodel | ../../testdata/cv/3d_triplet_iter_30000.caffemodel | caffe model for feature exrtaction.}"
"{network_forIMG | ../../testdata/cv/3d_triplet_testIMG.prototxt | Network definition file used for extracting feature from a single image and making a classification}"
"{mean_file | no | The mean file generated by Caffe from all gallery images, this could be used for mean value substraction from all images. If you want to use the mean file, you can set this as ../data/images_mean/triplet_mean.binaryproto.}"
"{target_img | ../data/images_all/4_78.png | Path of image waiting to be classified.}"
"{feature_blob | feat | Name of layer which will represent as the feature, in this network, ip1 or feat is well.}"
"{num_candidate | 15 | Number of candidates in gallery as the prediction result.}"
"{device | CPU | Device type: CPU or GPU}"
"{dev_id | 0 | Device id}"
"{gallery_out | 0 | Option on output binary features on gallery images}";
/* get parameters from comand line */
cv::CommandLineParser parser(argc, argv, keys);
parser.about("Feature extraction and classification");
if (parser.has("help"))
{
parser.printMessage();
return 0;
}
String src_dir = parser.get<String>("src_dir");
String caffemodel = parser.get<String>("caffemodel");
String network_forIMG = parser.get<String>("network_forIMG");
String mean_file = parser.get<String>("mean_file");
String target_img = parser.get<String>("target_img");
String feature_blob = parser.get<String>("feature_blob");
int num_candidate = parser.get<int>("num_candidate");
String device = parser.get<String>("device");
int dev_id = parser.get<int>("dev_id");
int gallery_out = parser.get<int>("gallery_out");
/* Initialize a net work with Device */
cv::cnn_3dobj::descriptorExtractor descriptor(device);
std::cout << "Using" << descriptor.getDeviceType() << std::endl;
/* Load net with the caffe trained net work parameter and structure */
if (strcmp(mean_file.c_str(), "no") == 0)
descriptor.loadNet(network_forIMG, caffemodel);
else
descriptor.loadNet(network_forIMG, caffemodel, mean_file);
std::vector<String> name_gallery;
/* List the file names under a given path */
listDir(src_dir.c_str(), name_gallery, false);
if (gallery_out)
{
ofstream namelist_out("gallelist.txt");
/* Writing name of the reference images. */
for (unsigned int i = 0; i < name_gallery.size(); i++)
namelist_out << name_gallery.at(i) << endl;
}
for (unsigned int i = 0; i < name_gallery.size(); i++)
{
name_gallery[i] = src_dir + name_gallery[i];
}
std::vector<cv::Mat> img_gallery;
cv::Mat feature_reference;
for (unsigned int i = 0; i < name_gallery.size(); i++)
{
img_gallery.push_back(cv::imread(name_gallery[i]));
}
/* Extract feature from a set of images */
descriptor.extract(img_gallery, feature_reference, feature_blob);
if (gallery_out)
{
std::cout << std::endl << "---------- Features of gallery images ----------" << std::endl;
/* Print features of the reference images. */
for (unsigned int i = 0; i < feature_reference.rows; i++)
std::cout << feature_reference.row(i) << endl;
std::cout << std::endl << "---------- Saving features of gallery images into feature.bin ----------" << std::endl;
featureWrite(feature_reference, "feature.bin");
}
else
{
std::cout << std::endl << "---------- Prediction for " << target_img << " ----------" << std::endl;
cv::Mat img = cv::imread(target_img);
std::cout << std::endl << "---------- Features of gallery images ----------" << std::endl;
std::vector<std::pair<String, float> > prediction;
/* Print features of the reference images. */
for (unsigned int i = 0; i < feature_reference.rows; i++)
std::cout << feature_reference.row(i) << endl;
cv::Mat feature_test;
descriptor.extract(img, feature_test, feature_blob);
/* Initialize a matcher which using L2 distance. */
cv::BFMatcher matcher(NORM_L2);
std::vector<std::vector<cv::DMatch> > matches;
/* Have a KNN match on the target and reference images. */
matcher.knnMatch(feature_test, feature_reference, matches, num_candidate);
/* Print feature of the target image waiting to be classified. */
std::cout << std::endl << "---------- Features of target image: " << target_img << "----------" << endl << feature_test << std::endl;
/* Print the top N prediction. */
std::cout << std::endl << "---------- Prediction result(Distance - File Name in Gallery) ----------" << std::endl;
for (size_t i = 0; i < matches[0].size(); ++i)
{
std::cout << i << " - " << std::fixed << std::setprecision(2) << name_gallery[matches[0][i].trainIdx] << " - \"" << matches[0][i].distance << "\"" << std::endl;
}
}
return 0;
}
\ No newline at end of file
/*
* Software License Agreement (BSD License)
*
* Copyright (c) 2009, Willow Garage, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
* * Neither the name of Willow Garage, Inc. nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
/**
* @file sphereview_3dobj_demo.cpp
* @brief Generating training data for CNN with triplet loss.
* @author Yida Wang
*/
#include <iostream>
#include "opencv2/imgproc.hpp"
#include "opencv2/cnn_3dobj.hpp"
using namespace cv;
using namespace cv::cnn_3dobj;
int main(int argc, char** argv)
{
const String keys = "{help | | this demo will have an analysis on the trained model, it will print information about whether the model is suit for set different classes apart and also discriminant on object pose at the same time.}"
"{caffemodel | ../../testdata/cv/3d_triplet_iter_30000.caffemodel | caffe model for feature exrtaction.}"
"{network_forIMG | ../../testdata/cv/3d_triplet_testIMG.prototxt | Network definition file used for extracting feature from a single image and making a classification}"
"{mean_file | no | The mean file generated by Caffe from all gallery images, this could be used for mean value substraction from all images. If you want to use the mean file, you can set this as ../data/images_mean/triplet_mean.binaryproto.}"
"{target_img | ../data/images_all/4_78.png | Path of image in reference.}"
"{ref_img1 | ../data/images_all/4_79.png | Path of closest image.}"
"{ref_img2 | ../data/images_all/4_87.png | Path of less closer image in the same class with reference image.}"
"{ref_img3 | ../data/images_all/3_78.png | Path of image with the same pose in another class.}"
"{feature_blob | feat | Name of layer which will represent as the feature, in this network, ip1 or feat is well.}"
"{device | CPU | device}"
"{dev_id | 0 | dev_id}";
/* Get parameters from comand line. */
cv::CommandLineParser parser(argc, argv, keys);
parser.about("Demo for object data classification and pose estimation");
if (parser.has("help"))
{
parser.printMessage();
return 0;
}
String caffemodel = parser.get<String>("caffemodel");
String network_forIMG = parser.get<String>("network_forIMG");
String mean_file = parser.get<String>("mean_file");
String target_img = parser.get<String>("target_img");
String ref_img1 = parser.get<String>("ref_img1");
String ref_img2 = parser.get<String>("ref_img2");
String ref_img3 = parser.get<String>("ref_img3");
String feature_blob = parser.get<String>("feature_blob");
String device = parser.get<String>("device");
int dev_id = parser.get<int>("dev_id");
std::vector<String> ref_img;
/* Sample which is most closest in pose to reference image
*and also the same class.
*/
ref_img.push_back(ref_img1);
/* Sample which is less closest in pose to reference image
*and also the same class.
*/
ref_img.push_back(ref_img2);
/* Sample which is very close in pose to reference image
*but not the same class.
*/
ref_img.push_back(ref_img3);
/* Initialize a net work with Device. */
cv::cnn_3dobj::descriptorExtractor descriptor(device, dev_id);
/* Load net with the caffe trained net work parameter and structure. */
if (strcmp(mean_file.c_str(), "no") == 0)
descriptor.loadNet(network_forIMG, caffemodel);
else
descriptor.loadNet(network_forIMG, caffemodel, mean_file);
cv::Mat img_base = cv::imread(target_img, -1);
if (img_base.empty())
{
printf("could not read reference image %s\n, make sure the path of images are set properly.", target_img.c_str());
}
std::vector<cv::Mat> img;
for (unsigned int i = 0; i < ref_img.size(); i++)
{
img.push_back(cv::imread(ref_img[i], -1));
if (img[i].empty()) {
printf("could not read reference image %s\n, make sure the path of images are set properly.", ref_img[i].c_str());
}
}
cv::Mat feature_test;
descriptor.extract(img_base, feature_test, feature_blob);
if (feature_test.empty()) {
printf("could not extract feature from test image which is read into cv::Mat.");
}
cv::Mat feature_reference;
descriptor.extract(img, feature_reference, feature_blob);
if (feature_reference.empty()) {
printf("could not extract feature from reference images which is already stored in vector<cv::Mat>.");
}
std::vector<float> matches;
for (int i = 0; i < feature_reference.rows; i++)
{
cv::Mat distance = feature_test-feature_reference.row(i);
matches.push_back(cv::norm(distance));
}
bool pose_pass = false;
bool class_pass = false;
/* Have comparations on the distance between reference image and 3 other images
*distance between closest sample and reference image should be smallest and
*distance between sample in another class and reference image should be largest.
*/
if (matches[0] < matches[1] && matches[0] < matches[2])
pose_pass = true;
if (matches[1] < matches[2])
class_pass = true;
if (!pose_pass)
{
printf("\n =========== Model %s ========== \nIs not trained properly that the similar pose could not be tell from a cluster of features.\n", caffemodel.c_str());
}
else if (!class_pass)
{
printf("\n =========== Model %s ========== \nIs not trained properly that feature from the same class is not discriminant from the one of another class with similar pose.\n", caffemodel.c_str());
}
else
{
printf("\n =========== Model %s ========== \nSuits for setting different classes apart and also discriminant on object pose at the same time.\n", caffemodel.c_str());
}
return 0;
}
/*
* Software License Agreement (BSD License)
*
* Copyright (c) 2009, Willow Garage, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
* * Neither the name of Willow Garage, Inc. nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
/**
* @file demo_sphereview_data.cpp
* @brief Generating training data for CNN with triplet loss.
* @author Yida Wang
*/
#include <opencv2/cnn_3dobj.hpp>
#include <opencv2/viz/vizcore.hpp>
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace cv;
using namespace std;
using namespace cv::cnn_3dobj;
/**
* @function listDir
* @brief Making all files names under a directory into a list
*/
void listDir(const char *path, std::vector<String>& files, bool r)
{
DIR *pDir;
struct dirent *ent;
char childpath[512];
pDir = opendir(path);
memset(childpath, 0, sizeof(childpath));
while ((ent = readdir(pDir)) != NULL)
{
if (ent->d_type & DT_DIR)
{
if (strcmp(ent->d_name, ".") == 0 || strcmp(ent->d_name, "..") == 0 || strcmp(ent->d_name, ".DS_Store") == 0)
{
continue;
}
if (r)
{
sprintf(childpath, "%s/%s", path, ent->d_name);
listDir(childpath,files,false);
}
}
else
{
if (strcmp(ent->d_name, ".DS_Store") != 0)
files.push_back(ent->d_name);
}
}
sort(files.begin(),files.end());
};
int main(int argc, char *argv[])
{
const String keys = "{help | | demo :$ ./sphereview_test -ite_depth=2 -plymodel=../data/3Dmodel/ape.ply -imagedir=../data/images_all/ -labeldir=../data/label_all.txt -num_class=6 -label_class=0, then press 'q' to run the demo for images generation when you see the gray background and a coordinate.}"
"{ite_depth | 3 | Iteration of sphere generation.}"
"{plymodel | ../data/3Dmodel/ape.ply | Path of the '.ply' file for image rendering. }"
"{imagedir | ../data/images_all/ | Path of the generated images for one particular .ply model. }"
"{labeldir | ../data/label_all.txt | Path of the generated images for one particular .ply model. }"
"{bakgrdir | | Path of the backgroud images sets. }"
"{cam_head_x | 0 | Head of the camera. }"
"{cam_head_y | 0 | Head of the camera. }"
"{cam_head_z | -1 | Head of the camera. }"
"{semisphere | 1 | Camera only has positions on half of the whole sphere. }"
"{z_range | 0.6 | Maximum camera position on z axis. }"
"{center_gen | 0 | Find center from all points. }"
"{image_size | 128 | Size of captured images. }"
"{label_class | | Class label of current .ply model. }"
"{label_item | | Item label of current .ply model. }"
"{rgb_use | 0 | Use RGB image or grayscale. }"
"{num_class | 6 | Total number of classes of models. }"
"{binary_out | 0 | Produce binaryfiles for images and label. }"
"{view_region | 0 | Take a special view of front or back angle}";
/* Get parameters from comand line. */
cv::CommandLineParser parser(argc, argv, keys);
parser.about("Generating training data for CNN with triplet loss");
if (parser.has("help"))
{
parser.printMessage();
return 0;
}
int ite_depth = parser.get<int>("ite_depth");
String plymodel = parser.get<String>("plymodel");
String imagedir = parser.get<String>("imagedir");
string labeldir = parser.get<String>("labeldir");
String bakgrdir = parser.get<string>("bakgrdir");
int label_class = parser.get<int>("label_class");
int label_item = parser.get<int>("label_item");
float cam_head_x = parser.get<float>("cam_head_x");
float cam_head_y = parser.get<float>("cam_head_y");
float cam_head_z = parser.get<float>("cam_head_z");
int semisphere = parser.get<int>("semisphere");
float z_range = parser.get<float>("z_range");
int center_gen = parser.get<int>("center_gen");
int image_size = parser.get<int>("image_size");
int rgb_use = parser.get<int>("rgb_use");
int num_class = parser.get<int>("num_class");
int binary_out = parser.get<int>("binary_out");
int view_region = parser.get<int>("view_region");
double obj_dist, bg_dist, y_range;
if (view_region == 1 || view_region == 2)
{
/* Set for TV */
if (label_class == 12)
obj_dist = 340;
else
obj_dist = 250;
ite_depth = ite_depth + 1;
bg_dist = 700;
y_range = 0.85;
}
else if (view_region == 0)
{
obj_dist = 370;
bg_dist = 400;
}
if (label_class == 5 | label_class == 10 | label_class == 11 | label_class == 12)
ite_depth = ite_depth + 1;
cv::cnn_3dobj::icoSphere ViewSphere(10,ite_depth);
std::vector<cv::Point3d> campos;
std::vector<cv::Point3d> campos_temp = ViewSphere.CameraPos;
/* Regular objects on the ground using a semisphere view system */
if (semisphere == 1)
{
if (view_region == 1)
{
for (int pose = 0; pose < static_cast<int>(campos_temp.size()); pose++)
{
if (campos_temp.at(pose).z >= 0 && campos_temp.at(pose).z < z_range && campos_temp.at(pose).y < -y_range)
campos.push_back(campos_temp.at(pose));
}
}
else if (view_region == 2)
{
for (int pose = 0; pose < static_cast<int>(campos_temp.size()); pose++)
{
if (campos_temp.at(pose).z >= 0 && campos_temp.at(pose).z < z_range && campos_temp.at(pose).y > y_range)
campos.push_back(campos_temp.at(pose));
}
}
else
{
/* Set for sofa */
if (label_class == 10)
{
for (int pose = 0; pose < static_cast<int>(campos_temp.size()); pose++)
{
if (campos_temp.at(pose).z >= 0 && campos_temp.at(pose).z < z_range && campos_temp.at(pose).y < -0.4)
campos.push_back(campos_temp.at(pose));
}
}
else
{
for (int pose = 0; pose < static_cast<int>(campos_temp.size()); pose++)
{
if (campos_temp.at(pose).z >= 0 && campos_temp.at(pose).z < z_range)
campos.push_back(campos_temp.at(pose));
}
}
}
}
/* Special object such as plane using a full space of view sphere */
else
{
if (view_region == 1)
{
for (int pose = 0; pose < static_cast<int>(campos_temp.size()); pose++)
{
if (campos_temp.at(pose).z < 0.2 && campos_temp.at(pose).z > -0.2 && campos_temp.at(pose).y < -y_range)
campos.push_back(campos_temp.at(pose));
}
}
else if (view_region == 2)
{
for (int pose = 0; pose < static_cast<int>(campos_temp.size()); pose++)
{
if (campos_temp.at(pose).z < 0.2 && campos_temp.at(pose).z > -0.2 && campos_temp.at(pose).y > y_range)
campos.push_back(campos_temp.at(pose));
}
}
else
{
for (int pose = 0; pose < static_cast<int>(campos_temp.size()); pose++)
{
if (campos_temp.at(pose).z < 0.2 && campos_temp.at(pose).z > -0.6)
campos.push_back(campos_temp.at(pose));
}
}
}
std::fstream imglabel;
char* p=(char*)labeldir.data();
imglabel.open(p, fstream::app|fstream::out);
bool camera_pov = true;
/* Create a window using viz. */
viz::Viz3d myWindow("Coordinate Frame");
/* Set window size. */
myWindow.setWindowSize(Size(image_size,image_size));
/* Set background color. */
myWindow.setBackgroundColor(viz::Color::gray());
myWindow.spin();
/* Create a Mesh widget, loading .ply models. */
viz::Mesh objmesh = viz::Mesh::load(plymodel);
/* Get the center of the generated mesh widget, cause some .ply files, this could be ignored if you are using PASCAL database*/
Point3d cam_focal_point;
if (center_gen)
cam_focal_point = ViewSphere.getCenter(objmesh.cloud);
else
cam_focal_point = Point3d(0,0,0);
const char* headerPath = "../data/header_for_";
const char* binaryPath = "../data/binary_";
if (binary_out)
{
ViewSphere.createHeader(static_cast<int>(campos.size()), image_size, image_size, headerPath);
}
float radius = ViewSphere.getRadius(objmesh.cloud, cam_focal_point);
objmesh.cloud = objmesh.cloud/radius*100;
cam_focal_point = cam_focal_point/radius*100;
Point3d cam_y_dir;
cam_y_dir.x = cam_head_x;
cam_y_dir.y = cam_head_y;
cam_y_dir.z = cam_head_z;
char* temp = new char;
char* bgname = new char;
std::vector<String> name_bkg;
if (bakgrdir.size() != 0)
{
/* List the file names under a given path */
listDir(bakgrdir.c_str(), name_bkg, false);
for (unsigned int i = 0; i < name_bkg.size(); i++)
{
name_bkg.at(i) = bakgrdir + name_bkg.at(i);
}
}
/* Images will be saved as .png files. */
int cnt_img;
srand((int)time(0));
do
{
cnt_img = 0;
for(int pose = 0; pose < static_cast<int>(campos.size()); pose++){
/* Add light. */
// double alpha1 = rand()%(314/2)/100;
// double alpha2 = rand()%(314*2)/100;
// printf("%f %f %f/n", ceil(10000*sqrt(1 - sin(alpha1)*sin(alpha1))*sin(alpha2)), 10000*sqrt(1 - sin(alpha1)*sin(alpha1))*cos(alpha2), sin(alpha1)*10000);
// myWindow.addLight(Vec3d(10000*sqrt(1 - sin(alpha1)*sin(alpha1))*sin(alpha2),10000*sqrt(1 - sin(alpha1)*sin(alpha1))*cos(alpha2),sin(alpha1)*10000), Vec3d(0,0,0), viz::Color::white(), viz::Color::white(), viz::Color::black(), viz::Color::white());
int label_x, label_y, label_z;
label_x = static_cast<int>(campos.at(pose).x*100);
label_y = static_cast<int>(campos.at(pose).y*100);
label_z = static_cast<int>(campos.at(pose).z*100);
sprintf (temp,"%02i_%02i_%04i_%04i_%04i_%02i", label_class, label_item, label_x, label_y, label_z, static_cast<int>(obj_dist/100));
String filename = temp;
filename += ".png";
imglabel << filename << ' ' << label_class << endl;
filename = imagedir + filename;
/* Get the pose of the camera using makeCameraPoses. */
if (view_region != 0)
{
cam_focal_point.x = cam_focal_point.y - label_x/5;
}
Affine3f cam_pose = viz::makeCameraPose(campos.at(pose)*obj_dist+cam_focal_point, cam_focal_point, cam_y_dir*obj_dist+cam_focal_point);
/* Get the transformation matrix from camera coordinate system to global. */
Affine3f transform = viz::makeTransformToGlobal(Vec3f(1.0f,0.0f,0.0f), Vec3f(0.0f,1.0f,0.0f), Vec3f(0.0f,0.0f,1.0f), campos.at(pose));
viz::WMesh mesh_widget(objmesh);
/* Pose of the widget in camera frame. */
Affine3f cloud_pose = Affine3f().translate(Vec3f(1.0f,1.0f,1.0f));
/* Pose of the widget in global frame. */
Affine3f cloud_pose_global = transform * cloud_pose;
/* Visualize camera frame. */
if (!camera_pov)
{
viz::WCameraPosition cpw(1); // Coordinate axes
viz::WCameraPosition cpw_frustum(Vec2f(0.5, 0.5)); // Camera frustum
myWindow.showWidget("CPW", cpw, cam_pose);
myWindow.showWidget("CPW_FRUSTUM", cpw_frustum, cam_pose);
}
/* Visualize widget. */
if (bakgrdir.size() != 0)
{
cv::Mat img_bg = cv::imread(name_bkg.at(rand()%name_bkg.size()));
/* Back ground images has a distance of 2 times of radius of camera view distance */
cv::viz::WImage3D background_widget(img_bg, Size2d(image_size*4.2, image_size*4.2), Vec3d(-campos.at(pose)*bg_dist+cam_focal_point), Vec3d(campos.at(pose)*bg_dist-cam_focal_point), Vec3d(0,0,-1)*bg_dist+Vec3d(0,2*cam_focal_point.y,0));
myWindow.showWidget("bgwidget", background_widget, cloud_pose_global);
}
// mesh_widget.setRenderingProperty(viz::LINE_WIDTH, 4.0);
myWindow.showWidget("targetwidget", mesh_widget, cloud_pose_global);
/* Set the viewer pose to that of camera. */
if (camera_pov)
myWindow.setViewerPose(cam_pose);
/* Save screen shot as images. */
myWindow.saveScreenshot(filename);
if (binary_out)
{
/* Write images into binary files for further using in CNN training. */
ViewSphere.writeBinaryfile(filename, binaryPath, headerPath,static_cast<int>(campos.size())*num_class, label_class, static_cast<int>(campos.at(pose).x*100), static_cast<int>(campos.at(pose).y*100), static_cast<int>(campos.at(pose).z*100), rgb_use);
}
cnt_img++;
}
} while (cnt_img != campos.size());
imglabel.close();
return 1;
};
#include <opencv2/viz/vizcore.hpp>
#include <opencv2/calib3d/calib3d.hpp>
#include <iostream>
#include <fstream>
#include <opencv2/cnn_3dobj.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <iomanip>
using namespace cv;
using namespace std;
using namespace cv::cnn_3dobj;
/**
* @function listDir
* @brief Making all files names under a directory into a list
*/
void listDir(const char *path, std::vector<String>& files, bool r)
{
DIR *pDir;
struct dirent *ent;
char childpath[512];
pDir = opendir(path);
memset(childpath, 0, sizeof(childpath));
while ((ent = readdir(pDir)) != NULL)
{
if (ent->d_type & DT_DIR)
{
if (strcmp(ent->d_name, ".") == 0 || strcmp(ent->d_name, "..") == 0)
{
continue;
}
if(r)
{
sprintf(childpath, "%s/%s", path, ent->d_name);
listDir(childpath,files,false);
}
}
else
{
files.push_back(ent->d_name);
}
}
sort(files.begin(),files.end());
};
/**
* @function cvcloud_load
* @brief load bunny.ply
*/
Mat cvcloud_load(Mat feature_reference)
{
Mat cloud(1, feature_reference.rows, CV_32FC3);
Point3f* data = cloud.ptr<cv::Point3f>();
float dummy1, dummy2;
for(size_t i = 0; i < feature_reference.rows; ++i)
{
data[i].x = feature_reference.at<float>(i,0);
data[i].y = feature_reference.at<float>(i,1);
data[i].z = feature_reference.at<float>(i,2);
}
cloud *= 5.0f;
return cloud;
}
/**
* @function main
*/
int main(int argc, char **argv)
{
const String keys = "{help | | This sample will extract featrues from reference images and target image for classification. You can add a mean_file if there little variance in data such as human faces, otherwise it is not so useful}"
"{src_dir | ../data/images_all/ | Source direction of the images ready for being used for extract feature as gallery.}"
"{caffemodellist | ../../testdata/cv/caffemodel_list.txt | caffe model for feature exrtaction.}"
"{network_forIMG | ../../testdata/cv/3d_triplet_testIMG.prototxt | Network definition file used for extracting feature from a single image and making a classification}"
"{mean_file | no | The mean file generated by Caffe from all gallery images, this could be used for mean value substraction from all images. If you want to use the mean file, you can set this as ../data/images_mean/triplet_mean.binaryproto.}"
"{target_img1 | ../data/images_all/0_48.png | Path of image waiting to be classified.}"
"{target_img2 | ../data/images_all/1_339.png | Path of image waiting to be classified.}"
"{target_img3 | ../data/images_all/2_296.png | Path of image waiting to be classified.}"
"{target_img4 | ../data/images_all/3_466.png | Path of image waiting to be classified.}"
"{target_img5 | ../data/images_all/4_117.png | Path of image waiting to be classified.}"
"{target_img6 | ../data/images_all/5_236.png | Path of image waiting to be classified.}"
"{feature_blob | feat | Name of layer which will represent as the feature, in this network, ip1 or feat is well.}"
"{num_candidate | 4 | Number of candidates in gallery as the prediction result.}"
"{device | CPU | Device type: CPU or GPU}"
"{dev_id | 0 | Device id}";
/* get parameters from comand line */
cv::CommandLineParser parser(argc, argv, keys);
parser.about("Feature extraction and classification");
if (parser.has("help"))
{
parser.printMessage();
return 0;
}
String src_dir = parser.get<String>("src_dir");
String caffemodellist = parser.get<String>("caffemodellist");
String network_forIMG = parser.get<String>("network_forIMG");
String mean_file = parser.get<String>("mean_file");
String target_img1 = parser.get<String>("target_img1");
String target_img2 = parser.get<String>("target_img2");
String target_img3 = parser.get<String>("target_img3");
String target_img4 = parser.get<String>("target_img4");
String target_img5 = parser.get<String>("target_img5");
String target_img6 = parser.get<String>("target_img6");
String feature_blob = parser.get<String>("feature_blob");
int num_candidate = parser.get<int>("num_candidate");
String device = parser.get<String>("device");
int dev_id = parser.get<int>("dev_id");
ifstream namelist_model(caffemodellist.c_str(), ios::in);
vector<String> caffemodel;
char *buf = new char[512];
int number_model = 0;
while (!namelist_model.eof())
{
namelist_model.getline(buf, 512);
caffemodel.push_back(buf);
number_model++;
}
/* List the file names under a given path */
std::vector<String> name_gallery;
listDir(src_dir.c_str(), name_gallery, false);
for (unsigned int i = 0; i < name_gallery.size(); i++)
{
name_gallery[i] = src_dir + name_gallery[i];
}
std::vector<cv::Mat> img_gallery;
cv::Mat temp_feat;
vector<cv::Mat> feature_reference;
vector<cv::Mat> feature_test1;
vector<cv::Mat> feature_test2;
vector<cv::Mat> feature_test3;
vector<cv::Mat> feature_test4;
vector<cv::Mat> feature_test5;
vector<cv::Mat> feature_test6;
cv::Mat img_test1 = cv::imread(target_img1, -1);
cv::Mat img_test2 = cv::imread(target_img2, -1);
cv::Mat img_test3 = cv::imread(target_img3, -1);
cv::Mat img_test4 = cv::imread(target_img4, -1);
cv::Mat img_test5 = cv::imread(target_img5, -1);
cv::Mat img_test6 = cv::imread(target_img6, -1);
for (int num_model = 0; num_model < number_model; ++num_model)
{
feature_reference.push_back(temp_feat);
feature_test1.push_back(temp_feat);
feature_test2.push_back(temp_feat);
feature_test3.push_back(temp_feat);
feature_test4.push_back(temp_feat);
feature_test5.push_back(temp_feat);
feature_test6.push_back(temp_feat);
}
for (unsigned int i = 0; i < name_gallery.size(); i++)
{
img_gallery.push_back(cv::imread(name_gallery[i], -1));
}
/* Initialize a net work with Device */
cv::cnn_3dobj::descriptorExtractor descriptor(device);
std::cout << "Using" << descriptor.getDeviceType() << std::endl;
/* Load net with the caffe trained net work parameter and structure */
for (int num_model = 0; num_model < number_model; ++num_model)
{
if (strcmp(mean_file.c_str(), "no") == 0)
descriptor.loadNet(network_forIMG, caffemodel[num_model]);
else
descriptor.loadNet(network_forIMG, caffemodel[num_model], mean_file);
/* Part1: Extract feature from a set of images and a single image*/
descriptor.extract(img_gallery, feature_reference[num_model], feature_blob);
descriptor.extract(img_test1, feature_test1[num_model], feature_blob);
descriptor.extract(img_test2, feature_test2[num_model], feature_blob);
descriptor.extract(img_test3, feature_test3[num_model], feature_blob);
descriptor.extract(img_test4, feature_test4[num_model], feature_blob);
descriptor.extract(img_test5, feature_test5[num_model], feature_blob);
descriptor.extract(img_test6, feature_test6[num_model], feature_blob);
}
/* Initialize a matcher which using L2 distance. */
cv::BFMatcher matcher(NORM_L2);
vector<vector<vector<cv::DMatch> > > matches1;
vector<vector<vector<cv::DMatch> > > matches2;
vector<vector<vector<cv::DMatch> > > matches3;
vector<vector<vector<cv::DMatch> > > matches4;
vector<vector<vector<cv::DMatch> > > matches5;
vector<vector<vector<cv::DMatch> > > matches6;
vector<vector<cv::DMatch> > matches_temp;
for (int num_model = 0; num_model < number_model; ++num_model)
{
matches1.push_back(matches_temp);
matches2.push_back(matches_temp);
matches3.push_back(matches_temp);
matches4.push_back(matches_temp);
matches5.push_back(matches_temp);
matches6.push_back(matches_temp);
}
/* Have a KNN match on the target and reference images. */
for (int num_model = 0; num_model < number_model; ++num_model)
{
matcher.knnMatch(feature_test1[num_model], feature_reference[num_model], matches1[num_model], num_candidate+1);
matcher.knnMatch(feature_test2[num_model], feature_reference[num_model], matches2[num_model], num_candidate+1);
matcher.knnMatch(feature_test3[num_model], feature_reference[num_model], matches3[num_model], num_candidate+1);
matcher.knnMatch(feature_test4[num_model], feature_reference[num_model], matches4[num_model], num_candidate+1);
matcher.knnMatch(feature_test5[num_model], feature_reference[num_model], matches5[num_model], num_candidate+1);
matcher.knnMatch(feature_test6[num_model], feature_reference[num_model], matches6[num_model], num_candidate+1);
}
vector<Mat> img_merge;
/* Part2: Start to have a show */
bool camera_pov = true;
viz::Viz3d myWindow0("Instruction");
viz::Viz3d myWindow1("Point Cloud");
viz::Viz3d myWindow2("Prediction sample");
/* Set window size as 1024*1024, we use this scale as default. */
myWindow0.setWindowSize(Size(1300,100));
myWindow0.setWindowPosition(Point(0,800));
myWindow1.setWindowSize(Size(700,600));
myWindow1.setWindowPosition(Point(600,0));
myWindow2.setWindowSize(Size(600,600));
myWindow2.setWindowPosition(Point(-20,0));
/* Pose of the widget in camera frame */
Affine3f cloud_pose = Affine3f().translate(Vec3f(1.0f,1.0f,1.0f));
Point3d campos(1,0,0);
/* Get the transformation matrix from camera coordinate system to global. */
Affine3f transform = viz::makeTransformToGlobal(Vec3f(1.0f,0.0f,0.0f), Vec3f(0.0f,1.0f,0.0f), Vec3f(0.0f,0.0f,1.0f), campos);
/* Pose of the widget in global frame */
Affine3f cloud_pose_global = transform * cloud_pose;
/* Set background color. */
myWindow0.setBackgroundColor(viz::Color::white());
myWindow1.setBackgroundColor(viz::Color::white());
myWindow2.setBackgroundColor(viz::Color::white());
Point3d cam_y_dir(0.0f,0.0f,1.0f);
cv::cnn_3dobj::icoSphere ViewSphere(1,0);
Mat bunny_cloud;
Point3d cam_focal_point;
float radius;
float translation_phase = 0.0;
int count_pre, num_rotate, max_rotate;
String titlename, Hint, Pred("prediction: ");
vector<viz::WImageOverlay> imagepredict;
String widgename[24] = {"1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24"};
vector<Mat> slide;
slide.push_back(imread("1.png"));
slide.push_back(imread("2.png"));
slide.push_back(imread("3.png"));
slide.push_back(imread("4.png"));
slide.push_back(imread("5.png"));
slide.push_back(imread("6.png"));
slide.push_back(imread("7.png"));
slide.push_back(imread("8.png"));
slide.push_back(imread("9.png"));
slide.push_back(imread("10.png"));
/// Create a window
viz::Viz3d myWindowS("Slide Show");
myWindowS.setWindowSize(Size(1300,700));
myWindowS.setWindowPosition(Point(0,0));
myWindowS.setBackgroundColor(viz::Color::white());
for (int i = 0; i < slide.size(); ++i)
{
/// Create a triangle widget
viz::WImageOverlay slide1(slide[i],Rect(0, 0, 1300, 700));
/// Show widget in the visualizer window
num_rotate = 0;
if (i == 0)
max_rotate = 2000;
else
max_rotate = 230;
while (num_rotate != max_rotate)
{
myWindowS.showWidget("Slide1", slide1);
/// Start event loop
myWindowS.spinOnce(1, true);
num_rotate++;
}
}
for (int num_model = 0; num_model < number_model; ++num_model)
{
if (num_model == 0)
Hint = "Start training.";
else if (num_model == 28)
Hint = "Different Classes Are Clustered.";
else if(num_model == 40)
Hint = "Poses Are Set apart.";
else if(num_model == 42)
Hint = "Finished. Model could: tell both classes and poses.";
titlename = caffemodel[num_model];
titlename = "Prediction Result of Model Trained on Iteration " + titlename.substr(34, titlename.length() - 44);
viz::WText title(titlename, Point(100, 50), 30, viz::Color::black());
viz::WText hint(Hint, Point(400, 20), 25, viz::Color::black());
viz::WImageOverlay image3d1(img_test1, Rect(20, 40, img_test4.rows, img_test4.cols));
viz::WText arrow1(Pred, Point(90,60), 15, viz::Color::red());
viz::WImageOverlay image3d2(img_test2, Rect(20, 40+75, img_test4.rows, img_test4.cols));
viz::WText arrow2(Pred, Point(90,60+75), 15, viz::Color::green());
viz::WImageOverlay image3d3(img_test3, Rect(20, 40+75*2, img_test4.rows, img_test4.cols));
viz::WText arrow3(Pred, Point(90,60+75*2), 15, viz::Color::purple());
viz::WImageOverlay image3d4(img_test4, Rect(20, 40+75*3, img_test4.rows, img_test4.cols));
viz::WText arrow4(Pred, Point(90,60+75*3), 15, viz::Color::blue());
viz::WImageOverlay image3d5(img_test5, Rect(20, 40+75*4, img_test4.rows, img_test4.cols));
viz::WText arrow5(Pred, Point(90,60+75*4), 15, viz::Color::yellow());
viz::WImageOverlay image3d6(img_test6, Rect(20, 40+75*5, img_test4.rows, img_test4.cols));
viz::WText arrow6(Pred, Point(90,60+75*5), 15, viz::Color::orange());
viz::WText text_target(String("Query Image"), Point2d(20,530), 20, viz::Color::purple());
viz::WText text_pred(String("Predicted Images using 4 NN"), Point2d(80+110,530), 20, viz::Color::purple());
viz::WText text3d1(String("1st"), Point2d(80 + 110,500), 20, viz::Color::orange());
viz::WText text3d2(String("2nd"), Point2d(80 + 2*110,500), 20, viz::Color::orange());
viz::WText text3d3(String("3rd"), Point2d(80 + 3*110,500), 20, viz::Color::orange());
viz::WText text3d4(String("4th"), Point2d(80 + 4*110,500), 20, viz::Color::orange());
viz::WText classname1(String("ape: red"), Point2d(20,10), 11, viz::Color::red());
viz::WText classname2(String("ant: green"), Point2d(120,10), 11, viz::Color::green());
viz::WText classname3(String("cow: purple"), Point2d(220,10), 11, viz::Color::purple());
viz::WText classname4(String("plane: blue"), Point2d(320,10), 11, viz::Color::blue());
viz::WText classname5(String("bunny: yellow"), Point2d(420,10), 11, viz::Color::yellow());
viz::WText classname6(String("horse: orange"), Point2d(500,10), 11, viz::Color::orange());
myWindow0.showWidget("title", title, Affine3f().translate(Vec3f(0.0f,0.0f,0.0f)));
myWindow0.showWidget("hint", hint, Affine3f().translate(Vec3f(0.0f,0.0f,0.0f)));
myWindow2.showWidget("image3d1", image3d1, Affine3f().translate(Vec3f(1.0f,1.0f,1.0f)));
myWindow2.showWidget("image3d2", image3d2, Affine3f().translate(Vec3f(1.0f,1.0f,1.0f)));
myWindow2.showWidget("image3d3", image3d3, Affine3f().translate(Vec3f(1.0f,1.0f,1.0f)));
myWindow2.showWidget("image3d4", image3d4, Affine3f().translate(Vec3f(1.0f,1.0f,1.0f)));
myWindow2.showWidget("image3d5", image3d5, Affine3f().translate(Vec3f(1.0f,1.0f,1.0f)));
myWindow2.showWidget("image3d6", image3d6, Affine3f().translate(Vec3f(1.0f,1.0f,1.0f)));
myWindow2.showWidget("arrow1", arrow1, Affine3f().translate(Vec3f(1.0f,1.0f,1.0f)));
myWindow2.showWidget("arrow2", arrow2, Affine3f().translate(Vec3f(1.0f,1.0f,1.0f)));
myWindow2.showWidget("arrow3", arrow3, Affine3f().translate(Vec3f(1.0f,1.0f,1.0f)));
myWindow2.showWidget("arrow4", arrow4, Affine3f().translate(Vec3f(1.0f,1.0f,1.0f)));
myWindow2.showWidget("arrow5", arrow5, Affine3f().translate(Vec3f(1.0f,1.0f,1.0f)));
myWindow2.showWidget("arrow6", arrow6, Affine3f().translate(Vec3f(1.0f,1.0f,1.0f)));
myWindow2.showWidget("text_target", text_target, Affine3f().translate(Vec3f(0.0f,0.0f,0.0f)));
myWindow2.showWidget("text_pred", text_pred, Affine3f().translate(Vec3f(0.0f,0.0f,0.0f)));
myWindow2.showWidget("text3d1", text3d1, Affine3f().translate(Vec3f(0.0f,0.0f,0.0f)));
myWindow2.showWidget("text3d2", text3d2, Affine3f().translate(Vec3f(0.0f,0.0f,0.0f)));
myWindow2.showWidget("text3d3", text3d3, Affine3f().translate(Vec3f(0.0f,0.0f,0.0f)));
myWindow2.showWidget("text3d4", text3d4, Affine3f().translate(Vec3f(0.0f,0.0f,0.0f)));
myWindow2.showWidget("classname1", classname1, Affine3f().translate(Vec3f(0.0f,0.0f,0.0f)));
myWindow2.showWidget("classname2", classname2, Affine3f().translate(Vec3f(0.0f,0.0f,0.0f)));
myWindow2.showWidget("classname3", classname3, Affine3f().translate(Vec3f(0.0f,0.0f,0.0f)));
myWindow2.showWidget("classname4", classname4, Affine3f().translate(Vec3f(0.0f,0.0f,0.0f)));
myWindow2.showWidget("classname5", classname5, Affine3f().translate(Vec3f(0.0f,0.0f,0.0f)));
myWindow2.showWidget("classname6", classname6, Affine3f().translate(Vec3f(0.0f,0.0f,0.0f)));
bunny_cloud = cvcloud_load(feature_reference[num_model]);
cam_focal_point = ViewSphere.getCenter(bunny_cloud);
radius = ViewSphere.getRadius(bunny_cloud, cam_focal_point);
viz::WCloud cloud_widget1(bunny_cloud.colRange(Range(0,641)), viz::Color::red());
viz::WCloud cloud_widget2(bunny_cloud.colRange(Range(642,642*2-1)), viz::Color::green());
viz::WCloud cloud_widget3(bunny_cloud.colRange(Range(642*2,642*3-1)), viz::Color::purple());
viz::WCloud cloud_widget4(bunny_cloud.colRange(Range(642*3,642*4-1)), viz::Color::blue());
viz::WCloud cloud_widget5(bunny_cloud.colRange(Range(642*4,642*5-1)), viz::Color::yellow());
viz::WCloud cloud_widget6(bunny_cloud.colRange(Range(642*5,642*6-1)), viz::Color::orange());
myWindow1.showWidget("obj1", cloud_widget1, cloud_pose_global);
myWindow1.setRenderingProperty("obj1",0,3);
myWindow1.showWidget("obj2", cloud_widget2, cloud_pose_global);
myWindow1.setRenderingProperty("obj2",0,3);
myWindow1.showWidget("obj3", cloud_widget3, cloud_pose_global);
myWindow1.setRenderingProperty("obj3",0,3);
myWindow1.showWidget("obj4", cloud_widget4, cloud_pose_global);
myWindow1.setRenderingProperty("obj4",0,3);
myWindow1.showWidget("obj5", cloud_widget5, cloud_pose_global);
myWindow1.setRenderingProperty("obj5",0,3);
myWindow1.showWidget("obj6", cloud_widget6, cloud_pose_global);
myWindow1.setRenderingProperty("obj6",0,3);
count_pre = 0;
for (int j = 1; j < num_candidate+1; ++j)
{
myWindow2.showWidget(widgename[count_pre], viz::WImageOverlay(img_gallery[matches1[num_model][0][j].trainIdx], Rect(80+110*j, 40+75*0, img_test4.rows, img_test4.cols)), Affine3f().translate(Vec3f(1.0f,1.0f,1.0f)));
count_pre++;
myWindow2.showWidget(widgename[count_pre], viz::WImageOverlay(img_gallery[matches2[num_model][0][j].trainIdx], Rect(80+110*j, 40+75*1, img_test4.rows, img_test4.cols)), Affine3f().translate(Vec3f(1.0f,1.0f,1.0f)));
count_pre++;
myWindow2.showWidget(widgename[count_pre], viz::WImageOverlay(img_gallery[matches3[num_model][0][j].trainIdx], Rect(80+110*j, 40+75*2, img_test4.rows, img_test4.cols)), Affine3f().translate(Vec3f(1.0f,1.0f,1.0f)));
count_pre++;
myWindow2.showWidget(widgename[count_pre], viz::WImageOverlay(img_gallery[matches4[num_model][0][j].trainIdx], Rect(80+110*j, 40+75*3, img_test4.rows, img_test4.cols)), Affine3f().translate(Vec3f(1.0f,1.0f,1.0f)));
count_pre++;
myWindow2.showWidget(widgename[count_pre], viz::WImageOverlay(img_gallery[matches5[num_model][0][j].trainIdx], Rect(80+110*j, 40+75*4, img_test4.rows, img_test4.cols)), Affine3f().translate(Vec3f(1.0f,1.0f,1.0f)));
count_pre++;
myWindow2.showWidget(widgename[count_pre], viz::WImageOverlay(img_gallery[matches6[num_model][0][j].trainIdx], Rect(80+110*j, 40+75*5, img_test4.rows, img_test4.cols)), Affine3f().translate(Vec3f(1.0f,1.0f,1.0f)));
count_pre++;
}
num_rotate = 0;
max_rotate = 15;
if (num_model == number_model-1)
max_rotate = 30000;
while (num_rotate != max_rotate)
{
translation_phase += CV_PI * 0.01f;
campos.x = sin(translation_phase);
campos.y = cos(translation_phase);
campos.z = 0;
/* Get the pose of the camera using makeCameraPoses. */
Affine3f cam_pose = viz::makeCameraPose(campos*radius*3.5+cam_focal_point, cam_focal_point, cam_y_dir*radius*3.5+cam_focal_point);
myWindow1.setViewerPose(cam_pose);
myWindow1.spinOnce(1, true);
myWindow2.spinOnce(1, true);
myWindow0.spinOnce(1, true);
num_rotate++;
}
myWindow0.removeAllWidgets();
myWindow1.removeAllWidgets();
myWindow2.removeAllWidgets();
}
return 0;
}
\ No newline at end of file
./classify_test --src_dir=/Users/yidawang/Downloads/PASCAL3D+_release1.1/ImageCollection/ --network_forIMG=/Users/yidawang/Documents/buildboat/caffe/examples/triplet/pascal_triplet.prototxt --caffemodel=/Users/yidawang/Documents/buildboat/caffe/examples/triplet/pascal_triplet_iter_10000.caffemodel --gallery_out=1
\ No newline at end of file
#include "precomp.hpp"
using namespace caffe;
namespace cv
{
namespace cnn_3dobj
{
descriptorExtractor::descriptorExtractor(const String& device_type, int device_id)
{
net_ready = 0;
if (strcmp(device_type.c_str(), "CPU") == 0 || strcmp(device_type.c_str(), "GPU") == 0)
{
if (strcmp(device_type.c_str(), "CPU") == 0)
{
caffe::Caffe::set_mode(caffe::Caffe::CPU);
deviceType = "CPU";
std::cout << "Using CPU" << std::endl;
}
else
{
caffe::Caffe::set_mode(caffe::Caffe::GPU);
caffe::Caffe::SetDevice(device_id);
deviceType = "GPU";
std::cout << "Using GPU" << std::endl;
std::cout << "Using Device_id=" << device_id << std::endl;
}
net_set = true;
}
else
{
std::cout << "Error: Device name must be 'GPU' together with an device number or 'CPU'." << std::endl;
net_set = false;
}
};
String descriptorExtractor::getDeviceType()
{
String device_info_out;
device_info_out = deviceType;
return device_info_out;
};
int descriptorExtractor::getDeviceId()
{
int device_info_out;
device_info_out = deviceId;
return device_info_out;
};
void descriptorExtractor::setDeviceType(const String& device_type)
{
if (strcmp(device_type.c_str(), "CPU") == 0 || strcmp(device_type.c_str(), "GPU") == 0)
{
if (strcmp(device_type.c_str(), "CPU") == 0)
{
caffe::Caffe::set_mode(caffe::Caffe::CPU);
deviceType = "CPU";
std::cout << "Using CPU" << std::endl;
}
else
{
caffe::Caffe::set_mode(caffe::Caffe::GPU);
deviceType = "GPU";
std::cout << "Using GPU" << std::endl;
}
}
else
{
std::cout << "Error: Device name must be 'GPU' or 'CPU'." << std::endl;
}
};
void descriptorExtractor::setDeviceId(const int& device_id)
{
if (strcmp(deviceType.c_str(), "GPU") == 0)
{
caffe::Caffe::SetDevice(device_id);
deviceId = device_id;
std::cout << "Using GPU with Device ID = " << device_id << std::endl;
}
else
{
std::cout << "Error: Device ID only need to be set when GPU is used." << std::endl;
}
};
void descriptorExtractor::loadNet(const String& model_file, const String& trained_file, const String& mean_file)
{
if (net_set)
{
/* Load the network. */
convnet = new Net<float>(model_file, TEST);
convnet->CopyTrainedLayersFrom(trained_file);
if (convnet->num_inputs() != 1)
std::cout << "Network should have exactly one input." << std::endl;
if (convnet->num_outputs() != 1)
std::cout << "Network should have exactly one output." << std::endl;
Blob<float>* input_layer = convnet->input_blobs()[0];
num_channels = input_layer->channels();
if (num_channels != 3 && num_channels != 1)
std::cout << "Input layer should have 1 or 3 channels." << std::endl;
input_geometry = cv::Size(input_layer->width(), input_layer->height());
/* Load the binaryproto mean file. */
if (!mean_file.empty())
{
setMean(mean_file);
net_ready = 2;
}
else
{
net_ready = 1;
}
}
else
{
std::cout << "Error: Net is not set properly in advance using construtor." << std::endl;
}
};
/* Load the mean file in binaryproto format. */
void descriptorExtractor::setMean(const String& mean_file)
{
BlobProto blob_proto;
ReadProtoFromBinaryFileOrDie(mean_file.c_str(), &blob_proto);
/* Convert from BlobProto to Blob<float> */
Blob<float> mean_blob;
mean_blob.FromProto(blob_proto);
if (mean_blob.channels() != num_channels)
std::cout << "Number of channels of mean file doesn't match input layer." << std::endl;
/* The format of the mean file is planar 32-bit float BGR or grayscale. */
std::vector<cv::Mat> channels;
float* data = mean_blob.mutable_cpu_data();
for (int i = 0; i < num_channels; ++i)
{
/* Extract an individual channel. */
cv::Mat channel(mean_blob.height(), mean_blob.width(), CV_32FC1, data);
channels.push_back(channel);
data += mean_blob.height() * mean_blob.width();
}
/* Merge the separate channels into a single image. */
cv::Mat mean;
cv::merge(channels, mean);
/* Compute the global mean pixel value and create a mean image
* filled with this value. */
cv::Scalar channel_mean = cv::mean(mean);
mean_ = cv::Mat(input_geometry, mean.type(), channel_mean);
};
void descriptorExtractor::extract(InputArrayOfArrays inputimg, OutputArray feature, String feature_blob)
{
if (net_ready)
{
Blob<float>* input_layer = convnet->input_blobs()[0];
input_layer->Reshape(1, num_channels,
input_geometry.height, input_geometry.width);
/* Forward dimension change to all layers. */
convnet->Reshape();
std::vector<cv::Mat> input_channels;
wrapInput(&input_channels);
if (inputimg.kind() == 65536)
{/* this is a Mat */
Mat img = inputimg.getMat();
preprocess(img, &input_channels);
convnet->ForwardPrefilled();
/* Copy the output layer to a std::vector */
Blob<float>* output_layer = convnet->blob_by_name(feature_blob).get();
const float* begin = output_layer->cpu_data();
const float* end = begin + output_layer->channels();
std::vector<float> featureVec = std::vector<float>(begin, end);
cv::Mat feature_mat = cv::Mat(featureVec, true).t();
feature_mat.copyTo(feature);
}
else
{/* This is a vector<Mat> */
vector<Mat> img;
inputimg.getMatVector(img);
Mat feature_vector;
for (unsigned int i = 0; i < img.size(); ++i)
{
preprocess(img[i], &input_channels);
convnet->ForwardPrefilled();
/* Copy the output layer to a std::vector */
Blob<float>* output_layer = convnet->blob_by_name(feature_blob).get();
const float* begin = output_layer->cpu_data();
const float* end = begin + output_layer->channels();
std::vector<float> featureVec = std::vector<float>(begin, end);
if (i == 0)
{
feature_vector = cv::Mat(featureVec, true).t();
int dim_feature = feature_vector.cols;
feature_vector.resize(img.size(), dim_feature);
}
feature_vector.row(i) = cv::Mat(featureVec, true).t();
}
feature_vector.copyTo(feature);
}
}
else
std::cout << "Device must be set properly using constructor and the net must be set in advance using loadNet.";
};
/* Wrap the input layer of the network in separate cv::Mat objects
* (one per channel). This way we save one memcpy operation and we
* don't need to rely on cudaMemcpy2D. The last preprocessing
* operation will write the separate channels directly to the input
* layer. */
void descriptorExtractor::wrapInput(std::vector<cv::Mat>* input_channels)
{
Blob<float>* input_layer = convnet->input_blobs()[0];
int width = input_layer->width();
int height = input_layer->height();
float* input_data = input_layer->mutable_cpu_data();
for (int i = 0; i < input_layer->channels(); ++i)
{
cv::Mat channel(height, width, CV_32FC1, input_data);
input_channels->push_back(channel);
input_data += width * height;
}
};
void descriptorExtractor::preprocess(const cv::Mat& img, std::vector<cv::Mat>* input_channels)
{
/* Convert the input image to the input image format of the network. */
cv::Mat sample;
if (img.channels() == 3 && num_channels == 1)
cv::cvtColor(img, sample, CV_BGR2GRAY);
else if (img.channels() == 4 && num_channels == 1)
cv::cvtColor(img, sample, CV_BGRA2GRAY);
else if (img.channels() == 4 && num_channels == 3)
cv::cvtColor(img, sample, CV_BGRA2BGR);
else if (img.channels() == 1 && num_channels == 3)
cv::cvtColor(img, sample, CV_GRAY2BGR);
else
sample = img;
cv::Mat sample_resized;
if (sample.size() != input_geometry)
cv::resize(sample, sample_resized, input_geometry);
else
sample_resized = sample;
cv::Mat sample_float;
if (num_channels == 3)
sample_resized.convertTo(sample_float, CV_32FC3);
else
sample_resized.convertTo(sample_float, CV_32FC1);
cv::Mat sample_normalized;
if (net_ready == 2)
cv::subtract(sample_float, mean_, sample_normalized);
else
sample_normalized = sample_float;
/* This operation will write the separate BGR planes directly to the
* input layer of the network because it is wrapped by the cv::Mat
* objects in input_channels. */
cv::split(sample_normalized, *input_channels);
if (reinterpret_cast<float*>(input_channels->at(0).data)
!= convnet->input_blobs()[0]->cpu_data())
std::cout << "Input channels are not wrapping the input layer of the network." << std::endl;
};
} /* namespace cnn_3dobj */
} /* namespace cv */
#include "precomp.hpp"
using namespace cv;
using namespace std;
namespace cv
{
namespace cnn_3dobj
{
icoSphere::icoSphere(float radius_in, int depth_in)
{
X = 0.5f;
Z = 0.5f;
float vdata[12][3] = { { -X, 0.0f, Z }, { X, 0.0f, Z },
{ -X, 0.0f, -Z }, { X, 0.0f, -Z }, { 0.0f, Z, X }, { 0.0f, Z, -X },
{ 0.0f, -Z, X }, { 0.0f, -Z, -X }, { Z, X, 0.0f }, { -Z, X, 0.0f },
{ Z, -X, 0.0f }, { -Z, -X, 0.0f } };
int tindices[20][3] = { { 0, 4, 1 }, { 0, 9, 4 }, { 9, 5, 4 },
{ 4, 5, 8 }, { 4, 8, 1 }, { 8, 10, 1 }, { 8, 3, 10 }, { 5, 3, 8 },
{ 5, 2, 3 }, { 2, 7, 3 }, { 7, 10, 3 }, { 7, 6, 10 }, { 7, 11, 6 },
{ 11, 0, 6 }, { 0, 1, 6 }, { 6, 1, 10 }, { 9, 0, 11 },
{ 9, 11, 2 }, { 9, 2, 5 }, { 7, 2, 11 } };
diff = 0.00000001;
X *= (int)radius_in;
Z *= (int)radius_in;
// Iterate over points
for (int i = 0; i < 20; ++i)
{
subdivide(vdata[tindices[i][0]], vdata[tindices[i][1]],
vdata[tindices[i][2]], depth_in);
}
CameraPos_temp.push_back(CameraPos[0]);
for (unsigned int j = 1; j < CameraPos.size(); ++j)
{
for (unsigned int k = 0; k < j; ++k)
{
float dist_x, dist_y, dist_z;
dist_x = (CameraPos.at(k).x-CameraPos.at(j).x) * (CameraPos.at(k).x-CameraPos.at(j).x);
dist_y = (CameraPos.at(k).y-CameraPos.at(j).y) * (CameraPos.at(k).y-CameraPos.at(j).y);
dist_z = (CameraPos.at(k).z-CameraPos.at(j).z) * (CameraPos.at(k).z-CameraPos.at(j).z);
if (dist_x < diff && dist_y < diff && dist_z < diff)
break;
else if (k == j-1)
CameraPos_temp.push_back(CameraPos[j]);
}
}
CameraPos = CameraPos_temp;
cout << "View points in total: " << CameraPos.size() << endl;
cout << "The coordinate of view point: " << endl;
for(unsigned int i = 0; i < CameraPos.size(); i++)
{
cout << CameraPos.at(i).x <<' '<< CameraPos.at(i).y << ' ' << CameraPos.at(i).z << endl;
}
};
void icoSphere::norm(float v[])
{
float len = 0;
for (int i = 0; i < 3; ++i)
{
len += v[i] * v[i];
}
len = sqrt(len);
for (int i = 0; i < 3; ++i)
{
v[i] /= ((float)len);
}
};
void icoSphere::add(float v[])
{
Point3f temp_Campos;
std::vector<float>* temp = new std::vector<float>;
for (int k = 0; k < 3; ++k)
{
temp->push_back(v[k]);
}
temp_Campos.x = temp->at(0);temp_Campos.y = temp->at(1);temp_Campos.z = temp->at(2);
CameraPos.push_back(temp_Campos);
};
void icoSphere::subdivide(float v1[], float v2[], float v3[], int depth)
{
norm(v1);
norm(v2);
norm(v3);
if (depth == 0)
{
add(v1);
add(v2);
add(v3);
return;
}
float* v12 = new float[3];
float* v23 = new float[3];
float* v31 = new float[3];
for (int i = 0; i < 3; ++i)
{
v12[i] = (v1[i] + v2[i]) / 2;
v23[i] = (v2[i] + v3[i]) / 2;
v31[i] = (v3[i] + v1[i]) / 2;
}
norm(v12);
norm(v23);
norm(v31);
subdivide(v1, v12, v31, depth - 1);
subdivide(v2, v23, v12, depth - 1);
subdivide(v3, v31, v23, depth - 1);
subdivide(v12, v23, v31, depth - 1);
};
int icoSphere::swapEndian(int val)
{
val = ((val << 8) & 0xFF00FF00) | ((val >> 8) & 0xFF00FF);
return (val << 16) | (val >> 16);
};
cv::Point3d icoSphere::getCenter(cv::Mat cloud)
{
Point3f* data = cloud.ptr<cv::Point3f>();
Point3d dataout;
for(int i = 0; i < cloud.cols; ++i)
{
dataout.x += data[i].x;
dataout.y += data[i].y;
dataout.z += data[i].z;
}
dataout.x = dataout.x/cloud.cols;
dataout.y = dataout.y/cloud.cols;
dataout.z = dataout.z/cloud.cols;
return dataout;
};
float icoSphere::getRadius(cv::Mat cloud, cv::Point3d center)
{
float radiusCam = 0;
Point3f* data = cloud.ptr<cv::Point3f>();
Point3d datatemp;
for(int i = 0; i < cloud.cols; ++i)
{
datatemp.x = data[i].x - (float)center.x;
datatemp.y = data[i].y - (float)center.y;
datatemp.z = data[i].z - (float)center.z;
float Radius = sqrt(pow(datatemp.x,2)+pow(datatemp.y,2)+pow(datatemp.z,2));
if(Radius > radiusCam)
{
radiusCam = Radius;
}
}
return radiusCam;
};
void icoSphere::createHeader(int num_item, int rows, int cols, const char* headerPath)
{
char* a0 = (char*)malloc(1024);
strcpy(a0, headerPath);
char a1[] = "image";
char a2[] = "label";
char* headerPathimg = (char*)malloc(1024);
strcpy(headerPathimg, a0);
strcat(headerPathimg, a1);
char* headerPathlab = (char*)malloc(1024);
strcpy(headerPathlab, a0);
strcat(headerPathlab, a2);
std::ofstream headerImg(headerPathimg, ios::out|ios::binary);
std::ofstream headerLabel(headerPathlab, ios::out|ios::binary);
int headerimg[4] = {2051,num_item,rows,cols};
for (int i=0; i<4; i++)
headerimg[i] = swapEndian(headerimg[i]);
int headerlabel[2] = {2050,num_item};
for (int i=0; i<2; i++)
headerlabel[i] = swapEndian(headerlabel[i]);
headerImg.write(reinterpret_cast<const char*>(headerimg), sizeof(int)*4);
headerImg.close();
headerLabel.write(reinterpret_cast<const char*>(headerlabel), sizeof(int)*2);
headerLabel.close();
};
void icoSphere::writeBinaryfile(String filenameImg, const char* binaryPath, const char* headerPath, int num_item, int label_class, int x, int y, int z, int isrgb)
{
cv::Mat ImgforBin = cv::imread(filenameImg, isrgb);
char* A0 = (char*)malloc(1024);
strcpy(A0, binaryPath);
char A1[] = "image";
char A2[] = "label";
char* binPathimg = (char*)malloc(1024);
strcpy(binPathimg, A0);
strcat(binPathimg, A1);
char* binPathlab = (char*)malloc(1024);
strcpy(binPathlab, A0);
strcat(binPathlab, A2);
fstream img_file, lab_file;
img_file.open(binPathimg,ios::in);
lab_file.open(binPathlab,ios::in);
if(!img_file)
{
cout << "Creating the training data at: " << binaryPath << ". " << endl;
char* a0 = (char*)malloc(1024);
strcpy(a0, headerPath);
char a1[] = "image";
char a2[] = "label";
char* headerPathimg = (char*)malloc(1024);
strcpy(headerPathimg, a0);
strcat(headerPathimg,a1);
char* headerPathlab = (char*)malloc(1024);
strcpy(headerPathlab, a0);
strcat(headerPathlab,a2);
createHeader(num_item, 64, 64, binaryPath);
img_file.open(binPathimg,ios::out|ios::binary|ios::app);
lab_file.open(binPathlab,ios::out|ios::binary|ios::app);
if (isrgb == 0)
{
for (int r = 0; r < ImgforBin.rows; r++)
{
img_file.write(reinterpret_cast<const char*>(ImgforBin.ptr(r)), ImgforBin.cols*ImgforBin.elemSize());
}
}
else
{
std::vector<cv::Mat> Img3forBin;
cv::split(ImgforBin,Img3forBin);
for (unsigned int i = 0; i < Img3forBin.size(); i++)
{
for (int r = 0; r < Img3forBin[i].rows; r++)
{
img_file.write(reinterpret_cast<const char*>(Img3forBin[i].ptr(r)), Img3forBin[i].cols*Img3forBin[i].elemSize());
}
}
}
signed char templab = (signed char)label_class;
lab_file << templab << (signed char)x << (signed char)y << (signed char)z;
}
else
{
img_file.close();
lab_file.close();
img_file.open(binPathimg,ios::out|ios::binary|ios::app);
lab_file.open(binPathlab,ios::out|ios::binary|ios::app);
cout <<"Concatenating the training data at: " << binaryPath << ". " << endl;
if (isrgb == 0)
{
for (int r = 0; r < ImgforBin.rows; r++)
{
img_file.write(reinterpret_cast<const char*>(ImgforBin.ptr(r)), ImgforBin.cols*ImgforBin.elemSize());
}
}
else
{
std::vector<cv::Mat> Img3forBin;
cv::split(ImgforBin,Img3forBin);
for (unsigned int i = 0; i < Img3forBin.size(); i++)
{
for (int r = 0; r < Img3forBin[i].rows; r++)
{
img_file.write(reinterpret_cast<const char*>(Img3forBin[i].ptr(r)), Img3forBin[i].cols*Img3forBin[i].elemSize());
}
}
}
signed char templab = (signed char)label_class;
lab_file << templab << (signed char)x << (signed char)y << (signed char)z;
}
img_file.close();
lab_file.close();
};
} /* namespace cnn_3dobj */
} /* namespace cv */
/*
By downloading, copying, installing or using the software you agree to this
license. If you do not agree to this license, do not download, install,
copy or use the software.
License Agreement
For Open Source Computer Vision Library
(3-clause BSD License)
Copyright (C) 2013, OpenCV Foundation, all rights reserved.
Third party copyrights are property of their respective owners.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the names of the copyright holders nor the names of the contributors
may be used to endorse or promote products derived from this software
without specific prior written permission.
This software is provided by the copyright holders and contributors "as is" and
any express or implied warranties, including, but not limited to, the implied
warranties of merchantability and fitness for a particular purpose are
disclaimed. In no event shall copyright holders or contributors be liable for
any direct, indirect, incidental, special, exemplary, or consequential damages
(including, but not limited to, procurement of substitute goods or services;
loss of use, data, or profits; or business interruption) however caused
and on any theory of liability, whether in contract, strict liability,
or tort (including negligence or otherwise) arising in any way out of
the use of this software, even if advised of the possibility of such damage.
*/
#ifndef __OPENCV_CNN_3DOBJ_PRECOMP_HPP__
#define __OPENCV_CNN_3DOBJ_PRECOMP_HPP__
#include <opencv2/cnn_3dobj.hpp>
#endif
/*
* Created on: Aug 14, 2015
* Author: Yida Wang
*/
#include "test_precomp.hpp"
using namespace cv;
using namespace cv::cnn_3dobj;
class CV_CNN_Feature_Test : public cvtest::BaseTest
{
public:
CV_CNN_Feature_Test();
protected:
void run(int);
};
CV_CNN_Feature_Test::CV_CNN_Feature_Test()
{
}
/**
* This test checks the following:
* Feature extraction by the triplet trained CNN model
*/
void CV_CNN_Feature_Test::run(int)
{
String caffemodel = String(ts->get_data_path()) + "3d_triplet_iter_30000.caffemodel";
String network_forIMG = cvtest::TS::ptr()->get_data_path() + "3d_triplet_testIMG.prototxt";
String mean_file = "no";
std::vector<String> ref_img;
String target_img = String(ts->get_data_path()) + "1_8.png";
String feature_blob = "feat";
String device = "CPU";
int dev_id = 0;
cv::Mat img_base = cv::imread(target_img, -1);
if (img_base.empty())
{
ts->printf(cvtest::TS::LOG, "could not read reference image %s\n", target_img.c_str(), "make sure the path of images are set properly.");
ts->set_failed_test_info(cvtest::TS::FAIL_MISSING_TEST_DATA);
return;
}
cv::cnn_3dobj::descriptorExtractor descriptor(device, dev_id);
if (strcmp(mean_file.c_str(), "no") == 0)
descriptor.loadNet(network_forIMG, caffemodel);
else
descriptor.loadNet(network_forIMG, caffemodel, mean_file);
cv::Mat feature_test;
descriptor.extract(img_base, feature_test, feature_blob);
Mat feature_reference = (Mat_<float>(1,16) << -134.03548, -203.48265, -105.96752, 55.343075, -211.36378, 487.85968, -182.15063, 62.229042, 297.19876, 206.07578, 291.74951, -19.906454, -464.09152, 135.79895, 420.43616, 2.2887282);
printf("Reference feature is computed by Caffe extract_features tool by \n To generate values for different images, use extract_features \n with the resetted image list in prototxt.");
float dist = norm(feature_test - feature_reference);
if (dist > 5) {
ts->printf(cvtest::TS::LOG, "Extracted featrue is not the same from the one extracted from Caffe.");
ts->set_failed_test_info(cvtest::TS::FAIL_MISSING_TEST_DATA);
return;
}
}
TEST(CNN_FEATURE, accuracy) { CV_CNN_Feature_Test test; test.safe_run(); }
#include "test_precomp.hpp"
CV_TEST_MAIN("cv")
#ifdef __GNUC__
# pragma GCC diagnostic ignored "-Wmissing-declarations"
# if defined __clang__ || defined __APPLE__
# pragma GCC diagnostic ignored "-Wmissing-prototypes"
# pragma GCC diagnostic ignored "-Wextra"
# endif
#endif
#ifndef __OPENCV_TEST_PRECOMP_HPP__
#define __OPENCV_TEST_PRECOMP_HPP__
#include <iostream>
#include "opencv2/ts.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/cnn_3dobj_config.hpp"
#include "opencv2/cnn_3dobj.hpp"
#endif
name: "3d_triplet"
input: "data"
input_dim: 1
input_dim: 1
input_dim: 64
input_dim: 64
layer {
name: "conv1"
type: "Convolution"
bottom: "data"
top: "conv1"
convolution_param {
num_output: 16
kernel_size: 8
stride: 1
}
}
layer {
name: "pool1"
type: "Pooling"
bottom: "conv1"
top: "pool1"
pooling_param {
pool: MAX
kernel_size: 2
stride: 2
}
}
layer {
name: "relu1"
type: "ReLU"
bottom: "pool1"
top: "pool1"
}
layer {
name: "conv2"
type: "Convolution"
bottom: "pool1"
top: "conv2"
convolution_param {
num_output: 7
kernel_size: 5
stride: 1
}
}
layer {
name: "pool2"
type: "Pooling"
bottom: "conv2"
top: "pool2"
pooling_param {
pool: MAX
kernel_size: 2
stride: 2
}
}
layer {
name: "relu2"
type: "ReLU"
bottom: "pool2"
top: "pool2"
}
layer {
name: "ip1"
type: "InnerProduct"
bottom: "pool2"
top: "ip1"
inner_product_param {
num_output: 256
}
}
layer {
name: "relu3"
type: "ReLU"
bottom: "ip1"
top: "ip1"
}
layer {
name: "feat"
type: "InnerProduct"
bottom: "ip1"
top: "feat"
inner_product_param {
num_output: 3
}
}
../../testdata/cv/3d_triplet_iter_1.caffemodel
../../testdata/cv/3d_triplet_iter_2.caffemodel
../../testdata/cv/3d_triplet_iter_3.caffemodel
../../testdata/cv/3d_triplet_iter_4.caffemodel
../../testdata/cv/3d_triplet_iter_5.caffemodel
../../testdata/cv/3d_triplet_iter_6.caffemodel
../../testdata/cv/3d_triplet_iter_7.caffemodel
../../testdata/cv/3d_triplet_iter_8.caffemodel
../../testdata/cv/3d_triplet_iter_9.caffemodel
../../testdata/cv/3d_triplet_iter_10.caffemodel
../../testdata/cv/3d_triplet_iter_20.caffemodel
../../testdata/cv/3d_triplet_iter_30.caffemodel
../../testdata/cv/3d_triplet_iter_40.caffemodel
../../testdata/cv/3d_triplet_iter_50.caffemodel
../../testdata/cv/3d_triplet_iter_60.caffemodel
../../testdata/cv/3d_triplet_iter_70.caffemodel
../../testdata/cv/3d_triplet_iter_80.caffemodel
../../testdata/cv/3d_triplet_iter_90.caffemodel
../../testdata/cv/3d_triplet_iter_100.caffemodel
../../testdata/cv/3d_triplet_iter_200.caffemodel
../../testdata/cv/3d_triplet_iter_300.caffemodel
../../testdata/cv/3d_triplet_iter_400.caffemodel
../../testdata/cv/3d_triplet_iter_500.caffemodel
../../testdata/cv/3d_triplet_iter_600.caffemodel
../../testdata/cv/3d_triplet_iter_700.caffemodel
../../testdata/cv/3d_triplet_iter_800.caffemodel
../../testdata/cv/3d_triplet_iter_900.caffemodel
../../testdata/cv/3d_triplet_iter_1000.caffemodel
../../testdata/cv/3d_triplet_iter_2000.caffemodel
../../testdata/cv/3d_triplet_iter_3000.caffemodel
../../testdata/cv/3d_triplet_iter_4000.caffemodel
../../testdata/cv/3d_triplet_iter_5000.caffemodel
../../testdata/cv/3d_triplet_iter_6000.caffemodel
../../testdata/cv/3d_triplet_iter_7000.caffemodel
../../testdata/cv/3d_triplet_iter_8000.caffemodel
../../testdata/cv/3d_triplet_iter_9000.caffemodel
../../testdata/cv/3d_triplet_iter_10000.caffemodel
../../testdata/cv/3d_triplet_iter_20000.caffemodel
../../testdata/cv/3d_triplet_iter_30000.caffemodel
../../testdata/cv/3d_triplet_iter_40000.caffemodel
../../testdata/cv/3d_triplet_iter_50000.caffemodel
../../testdata/cv/3d_triplet_iter_60000.caffemodel
../../testdata/cv/3d_triplet_iter_70000.caffemodel
../../testdata/cv/3d_triplet_iter_110000.caffemodel
../../testdata/cv/3d_triplet_iter_120000.caffemodel
../../testdata/cv/3d_triplet_iter_130000.caffemodel
../../testdata/cv/3d_triplet_iter_140000.caffemodel
../../testdata/cv/3d_triplet_iter_150000.caffemodel
../../testdata/cv/3d_triplet_iter_160000.caffemodel
../../testdata/cv/3d_triplet_iter_170000.caffemodel
../../testdata/cv/3d_triplet_iter_180000.caffemodel
../../testdata/cv/3d_triplet_iter_190000.caffemodel
\ No newline at end of file
Training data generation using Icosphere {#tutorial_data_generation}
=============
Goal
----
In this tutorial you will learn how to
- Conduct a point cloud of camera view on sphere.
- Generate training images using 3D model.
Code
----
You can download the code from [here ](https://github.com/Wangyida/opencv_contrib/blob/cnn_3dobj/samples/demo_sphereview_data.cpp).
@include cnn_3dobj/samples/demo_sphereview_data.cpp
Explanation
-----------
Here is the general structure of the program:
- Create a window.
@code{.cpp}
viz::Viz3d myWindow("Coordinate Frame");
@endcode
- Set window size as 64*64, we use this scale as default.
@code{.cpp}
myWindow.setWindowSize(Size(64,64));
@endcode
- Add coordinate axes.
@code{.cpp}
myWindow.showWidget("Coordinate Widget", viz::WCoordinateSystem());
myWindow.setBackgroundColor(viz::Color::gray());
myWindow.spin();
@endcode
- Create a Mesh widget, loading .ply models.
@code{.cpp}
viz::Mesh objmesh = viz::Mesh::load(plymodel);
@endcode
- Get the center of the generated mesh widget, cause some .ply files.
@code{.cpp}
Point3d cam_focal_point = ViewSphere.getCenter(objmesh.cloud);
@endcode
- Get the pose of the camera using makeCameraPoses.
@code{.cpp}
Affine3f cam_pose = viz::makeCameraPose(campos.at(pose)*radius+cam_focal_point, cam_focal_point, cam_y_dir*radius+cam_focal_point);
@endcode
- Get the transformation matrix from camera coordinate system to global.
@code{.cpp}
Affine3f transform = viz::makeTransformToGlobal(Vec3f(1.0f,0.0f,0.0f), Vec3f(0.0f,1.0f,0.0f), Vec3f(0.0f,0.0f,1.0f), campos.at(pose));
viz::WMesh mesh_widget(objmesh);
@endcode
- Save screen shot as images.
@code{.cpp}
myWindow.saveScreenshot(filename);
@endcode
- Write images into binary files for further using in CNN training.
@code{.cpp}
ViewSphere.writeBinaryfile(filename, binaryPath, headerPath,(int)campos.size()*num_class, label_class, (int)(campos.at(pose).x*100), (int)(campos.at(pose).y*100), (int)(campos.at(pose).z*100), rgb_use);
@endcode
Results
-------
Here is collection images created by this demo using 4 model.
![](images_all/1_8.png)
Classify {#tutorial_classify}
===============
Goal
----
In this tutorial you will learn how to
- How to extract feature from an image
- How to extract features from images under a given root path
- How to make a prediction using reference images and target image
Code
----
You can download the code from [here ](https://github.com/Wangyida/opencv_contrib/blob/cnn_3dobj/samples/demo_classify.cpp).
@include cnn_3dobj/samples/demo_classify.cpp
Explanation
-----------
Here is the general structure of the program:
- Initialize a net work with Device.
@code{.cpp}
cv::cnn_3dobj::descriptorExtractor descriptor(device);
@endcode
- Load net with the caffe trained net work parameter and structure.
@code{.cpp}
if (strcmp(mean_file.c_str(), "no") == 0)
descriptor.loadNet(network_forIMG, caffemodel);
else
descriptor.loadNet(network_forIMG, caffemodel, mean_file);
@endcode
- List the file names under a given path.
@code{.cpp}
listDir(src_dir.c_str(), name_gallery, false);
for (unsigned int i = 0; i < name_gallery.size(); i++)
{
name_gallery[i] = src_dir + name_gallery[i];
}
@endcode
- Extract feature from a set of images.
@code{.cpp}
descriptor.extract(img_gallery, feature_reference, feature_blob);
@endcode
- Initialize a matcher which using L2 distance.
@code{.cpp}
cv::BFMatcher matcher(NORM_L2);
std::vector<std::vector<cv::DMatch> > matches;
@endcode
- Have a KNN match on the target and reference images.
@code{.cpp}
matcher.knnMatch(feature_test, feature_reference, matches, num_candidate);
@endcode
- Print features of the reference images.
@code{.cpp}std::cout << std::endl << "---------- Features of target image: " << target_img << "----------" << endl << feature_test << std::endl;
@endcode
Results
-------
Training data generation using Icosphere {#tutorial_model_analysis}
=============
Goal
----
In this tutorial you will learn how to
- Extract feature from particular image.
- Have a meaningful comparation on the extracted feature.
Code
----
You can download the code from [here ](https://github.com/Wangyida/opencv_contrib/blob/cnn_3dobj/samples/demo_model_analysis.cpp).
@include cnn_3dobj/samples/demo_model_analysis.cpp
Explanation
-----------
Here is the general structure of the program:
- Sample which is most closest in pose to reference image and also the same class.
@code{.cpp}
ref_img.push_back(ref_img1);
@endcode
- Sample which is less closest in pose to reference image and also the same class.
@code{.cpp}
ref_img.push_back(ref_img2);
@endcode
- Sample which is very close in pose to reference image but not the same class.
@code{.cpp}
ref_img.push_back(ref_img3);
@endcode
- Initialize a net work with Device.
@code{.cpp}
cv::cnn_3dobj::descriptorExtractor descriptor(device, dev_id);
@endcode
- Load net with the caffe trained net work parameter and structure.
@code{.cpp}
if (strcmp(mean_file.c_str(), "no") == 0)
descriptor.loadNet(network_forIMG, caffemodel);
else
descriptor.loadNet(network_forIMG, caffemodel, mean_file);
@endcode
- Have comparations on the distance between reference image and 3 other images
distance between closest sample and reference image should be smallest and
distance between sample in another class and reference image should be largest.
@code{.cpp}
if (matches[0] < matches[1] && matches[0] < matches[2])
pose_pass = true;
if (matches[1] < matches[2])
class_pass = true;
@endcode
Results
-------
CNN for 3D Object Classification and Pose Estimation {#tutorial_table_of_content_cnn_3dobj}
==========
- @subpage tutorial_data_generation
*Compatibility:* \> OpenCV 3.0.0
*Author:* Yida Wang
You will learn how to generate training images from 3D models with proper poses for CNN training.
- @subpage tutorial_feature_classification
*Compatibility:* \> OpenCV 3.0.0
*Author:* Yida Wang
You will learn how to extract features from images and make a prediction using descriptor.
- @subpage tutorial_model_analysis
*Compatibility:* \> OpenCV 3.0.0
*Author:* Yida Wang
You will learn how to have an analysis on performance of the trained Model.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment