From 620662a50afbf6a7888548d5308fbdf5c6801787 Mon Sep 17 00:00:00 2001 From: Abraham Monrroy Cano Date: Sat, 27 Apr 2019 16:38:18 +0900 Subject: [PATCH] GPU support on Melodic (#2173) * Feature/edit typo (#1769) Fix language. * Update README.md * Update contact details * Feature/update autoware launcher (#2056) * Add prototype of plugin file editor * Change logger level * Support command line options * Update gazebo simulator panel * Add plugin edit tool and update plugins * Fix a bug of transform edit * Fix setup.py to install all packages * Update the code for compatibility with python3 * Update the code for colcon build * updated plugin for lane_rule, lane_stop, and voxel_grid_filter * Fix that the plugin_description is not installed * Fix launch file error * Fix test failed * Skip test of unbuilt packages * Add run script * Add profile description * Fix launch file install path of point_downsampler * Update README file * Update README file for plugin file * Fix README file * Add notice to run script * Update CHANGELOGs * Replace URI in CHANGELOGs * Set version 1.10.0 * Creanup rst format * 1.11.0 * Change RTM default topic to match UKF node launch file (#2142) * Remove old issue and PR templates (#2148) * Update repository info files (#2149) * Add missing info files * Update contributing info file * Merge left over features from around the 1.11 release (#2151) * Fix deceleration value bug in following state inv_time will be negatived when forward object too close, but deceleration_critical will be smaller than max_deceleration * fix bug of max split size * change conversion formula from GB to Byte * Update twist_filter.cpp (#1932) * Feature/edit typo (#1769) Fix language. * Update twist_filter.cpp * Fix/compare map filter squared distance (#1896) * fix squared distance * update default param * update default param * update launch file * update interface.yaml * Added AW Lexus model (#2117) * Added AW Lexus model * Adapt urdf to match mesh orientation * Replace IV texture with AW (#2119) * Update rect_class_score.h (#1825) fixed typo for class label for OVEN - 'over' should be 'oven' * Fixed wrong assignement of message type to package (#1706) The message type ConfigWaypointLoader has been assigned to autoware_config_msgs in https://github.com/CPFL/Autoware/commit/8bf1c47fbc18a0303fda23c601dfe959a3afbc41. This fixes the issue https://github.com/CPFL/Autoware/issues/1705. * fix RuntimeManager on lxterminal #1203 (#1204) * fix RuntimeManager on lxterminal #1203 * Modify the different behavior in gnome-terminal environment * Set OPTION_TITLE in meta-terminal and xfce4-terminal environment * Update run * Add missing install for image resources on camera calibrator (#2137) * Add missing install for image resources * Switched to share * Add CMake, CUDA, Eigen version checks for the CUDA accelerated nodes Add CUDA enabled CI Signed-off-by: amc-nu * Remove deprecated vision_detector DPM Signed-off-by: amc-nu * Switch CI to use colcon insead of catkin tools Signed-off-by: amc-nu * Fix travis ci syntax file Signed-off-by: amc-nu * switch from colcon to catkin tools on kinetic(not supported on industrial_ci) Signed-off-by: amc-nu * CUDA CMake checks for lidar_localizer Signed-off-by: amc-nu * CUDA CMake checks for lidar_apollo_cnn_seg_detect Signed-off-by: amc-nu * CUDA CMake checks for vision_segment_enet_detect Signed-off-by: amc-nu * CUDA CMake checks for vision_ssd_detect Signed-off-by: amc-nu * CUDA CMake checks for lidar_point_pillars Signed-off-by: amc-nu * Add .repos file for setting up an Autoware workspace using vcs (#2161) * Add .repos file for setting up an Autoware workspace using vcs Signed-off-by: Geoffrey Biggs * Use https protocol for git repositories Signed-off-by: Geoffrey Biggs * Use lgsvl_msgs from binaries Signed-off-by: Geoffrey Biggs * Use American English for repository names Signed-off-by: Geoffrey Biggs * Break spelling Signed-off-by: Geoffrey Biggs * Remove non-required Eigen check on lidar_apollo_cnn_seg_detect package Signed-off-by: amc-nu * Add Driveworks check on ARM64/CUDA devices for autoware_driveworks_gmsl_interface package Signed-off-by: amc-nu * Add Driveworks check on ARM64/CUDA devices for autoware_driveworks_interface package Signed-off-by: amc-nu * Remove enablePlannerDynamicSwitch (#1919) * Remove enablePlannerDynamicSwitch from lane_select.launch Signed-off-by: Kenji Funaoka * Remove enablePlannerDynamicSwitch from lane_select_core.cpp Signed-off-by: Kenji Funaoka * Remove enablePlannerDynamicSwitch from velocity_set.launch Signed-off-by: Kenji Funaoka * Remove enablePlannerDynamicSwitch from velocity_set.cpp Signed-off-by: Kenji Funaoka * Remove enablePlannerDynamicSwitch from dp_planner_core.h Signed-off-by: Kenji Funaoka * Remove enablePlannerDynamicSwitch from dp_planner.launch Signed-off-by: Kenji Funaoka * Remove enablePlannerDynamicSwitch from dp_planner_core.cpp Signed-off-by: Kenji Funaoka * Remove enablePlannerDynamicSwitch from autoware_launcher Signed-off-by: Kenji Funaoka * Updated paths in quick_start launch files and parameters in default.rviz (#2206) Signed-off-by: sgermanserrano * Fix bug that limits the data rate of DataRateCheckerPlugin (#2205) * Repair bug that limits the data rate of DataRateCheckerPlugin - A larger message buffer was added to message callbacks of the topic subscribers in DataRateCheckerPlugin - Handling of timing was changed from std::chrono to ros::Time - Maximum frequency selection from the Min. Hz option was increased - Exception handling was improved to be more similar to the Python tool rostopic hz Signed-off-by: David * Remove unused variable in header file Signed-off-by: David * Apply ROS clang format Signed-off-by: David * Revert "Apply ROS clang format" This reverts commit 88563f1aa768430d78b6e4f9f9612d0680ae2385. Signed-off-by: David * Adding install directive for node (#2195) Issue: executable is not found/built with colcon_release, added install targets. Signed-off-by: snehagn * Remove unnecesary gstreamer1.0-plugins-good dependency from pointgrey_drivers Signed-off-by: amc-nu * fix install directive for waypoint extractor (#2219) Signed-off-by: wep21 Signed-off-by: Joshua Whitley --- .travis.yml | 17 +- docs/quick_start/my_mission_planning.launch | 2 +- .../CMakeLists.txt | 20 +- .../CMakeLists.txt | 17 +- .../lidar_point_pillars/CMakeLists.txt | 15 +- .../libs/dpm_ttic/CHANGELOG.rst | 280 --- .../libs/dpm_ttic/CMakeLists.txt | 144 -- .../libs/dpm_ttic/common/common.cpp | 49 - .../libs/dpm_ttic/common/common.hpp | 18 - .../libs/dpm_ttic/cpu/MODEL_info.h | 95 - .../libs/dpm_ttic/cpu/detect.cpp | 74 - .../libs/dpm_ttic/cpu/detect.hpp | 9 - .../vision_detector/libs/dpm_ttic/cpu/dt.cpp | 82 - .../vision_detector/libs/dpm_ttic/cpu/dt.hpp | 9 - .../libs/dpm_ttic/cpu/fconvsMT.cpp | 284 --- .../libs/dpm_ttic/cpu/fconvsMT.hpp | 10 - .../libs/dpm_ttic/cpu/featurepyramid.cpp | 541 ---- .../libs/dpm_ttic/cpu/featurepyramid.hpp | 15 - .../libs/dpm_ttic/cpu/get_boxes.cpp | 513 ---- .../libs/dpm_ttic/cpu/get_boxes.hpp | 9 - .../libs/dpm_ttic/cpu/load_model.cpp | 303 --- .../libs/dpm_ttic/cpu/load_model.hpp | 10 - .../libs/dpm_ttic/cpu/main.cpp | 75 - .../vision_detector/libs/dpm_ttic/cpu/nms.cpp | 181 -- .../vision_detector/libs/dpm_ttic/cpu/nms.hpp | 9 - .../libs/dpm_ttic/cpu/resize.cpp | 119 - .../libs/dpm_ttic/cpu/resize.hpp | 8 - .../libs/dpm_ttic/cpu/switch_float.h | 30 - .../libs/dpm_ttic/cpu/tracking.cpp | 120 - .../libs/dpm_ttic/cpu/tracking.hpp | 10 - .../libs/dpm_ttic/gpu/GPU_function.cu | 1703 ------------- .../libs/dpm_ttic/gpu/GPU_init.cpp | 514 ---- .../libs/dpm_ttic/gpu/GPU_init.hpp | 9 - .../libs/dpm_ttic/gpu/MODEL_info.h | 73 - .../libs/dpm_ttic/gpu/cuda_util.cpp | 109 - .../libs/dpm_ttic/gpu/cuda_util.hpp | 22 - .../libs/dpm_ttic/gpu/detect.cpp | 76 - .../libs/dpm_ttic/gpu/detect.hpp | 21 - .../libs/dpm_ttic/gpu/drvapi_error_string.h | 335 --- .../libs/dpm_ttic/gpu/dt_GPU.cpp | 913 ------- .../libs/dpm_ttic/gpu/dt_GPU.hpp | 24 - .../libs/dpm_ttic/gpu/fconvsMT.cpp | 968 -------- .../libs/dpm_ttic/gpu/fconvsMT.hpp | 28 - .../libs/dpm_ttic/gpu/featurepyramid.cpp | 1473 ----------- .../libs/dpm_ttic/gpu/featurepyramid.hpp | 13 - .../libs/dpm_ttic/gpu/for_use_GPU.h | 69 - .../libs/dpm_ttic/gpu/get_boxes.cpp | 1259 ---------- .../libs/dpm_ttic/gpu/get_boxes.hpp | 9 - .../libs/dpm_ttic/gpu/load_model.cpp | 494 ---- .../libs/dpm_ttic/gpu/load_model.hpp | 7 - .../libs/dpm_ttic/gpu/multithreading.cpp | 39 - .../libs/dpm_ttic/gpu/multithreading.h | 70 - .../vision_detector/libs/dpm_ttic/gpu/nms.cpp | 175 -- .../vision_detector/libs/dpm_ttic/gpu/nms.hpp | 10 - .../libs/dpm_ttic/gpu/obstacle_detection.cpp | 123 - .../libs/dpm_ttic/gpu/resize_GPU.cc | 539 ---- .../libs/dpm_ttic/gpu/resize_GPU.cpp | 538 ---- .../libs/dpm_ttic/gpu/resize_GPU.hpp | 18 - .../libs/dpm_ttic/gpu/switch_float.h | 55 - .../libs/dpm_ttic/gpu/switch_release.h | 22 - .../libs/dpm_ttic/gpu/tracking.cpp | 121 - .../libs/dpm_ttic/gpu/tracking.hpp | 11 - .../dpm_ttic/include/libdpm_ttic/dpm_ttic.hpp | 52 - .../vision_detector/libs/dpm_ttic/package.xml | 23 - .../util/capability_version_checker.cpp | 214 -- .../vision_darknet_detect/CMakeLists.txt | 11 +- .../vision_dpm_ttic_detect/CHANGELOG.rst | 264 -- .../vision_dpm_ttic_detect/CMakeLists.txt | 111 - .../vision_dpm_ttic_detect/data/car.xml | Bin 133667 -> 0 bytes .../vision_dpm_ttic_detect/data/car_2008.xml | Bin 133690 -> 0 bytes .../vision_dpm_ttic_detect/data/car_comp.csv | 84 - .../vision_dpm_ttic_detect/data/car_part.csv | 2195 ----------------- .../vision_dpm_ttic_detect/data/car_root.csv | 623 ----- .../vision_dpm_ttic_detect/data/person.xml | Bin 143339 -> 0 bytes .../data/person_comp.csv | 84 - .../data/person_part.csv | 2133 ---------------- .../data/person_root.csv | 313 --- .../vision_dpm_ttic_detect/interface.yaml | 3 - .../launch/vision_dpm_ttic_detect.launch | 55 - .../vision_dpm_ttic_detect.cpp | 198 -- .../vision_dpm_ttic_detect/package.xml | 30 - .../vision_segment_enet_detect/CMakeLists.txt | 9 + .../packages/vision_ssd_detect/CMakeLists.txt | 25 +- .../packages/vision_ssd_detect/package.xml | 2 - .../localization/lib/ndt_gpu/CMakeLists.txt | 17 +- .../packages/lidar_localizer/CMakeLists.txt | 22 +- .../dp_planner/nodes/dp_planner_core.cpp | 24 - .../CMakeLists.txt | 9 +- .../CMakeLists.txt | 7 +- .../camera/packages/pointgrey/package.xml | 1 - .../runtime_manager/scripts/computing.yaml | 25 - 91 files changed, 131 insertions(+), 19311 deletions(-) delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/CHANGELOG.rst delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/CMakeLists.txt delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/common/common.cpp delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/common/common.hpp delete mode 100755 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/MODEL_info.h delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/detect.cpp delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/detect.hpp delete mode 100755 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/dt.cpp delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/dt.hpp delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/fconvsMT.cpp delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/fconvsMT.hpp delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/featurepyramid.cpp delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/featurepyramid.hpp delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/get_boxes.cpp delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/get_boxes.hpp delete mode 100755 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/load_model.cpp delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/load_model.hpp delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/main.cpp delete mode 100755 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/nms.cpp delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/nms.hpp delete mode 100755 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/resize.cpp delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/resize.hpp delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/switch_float.h delete mode 100755 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/tracking.cpp delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/tracking.hpp delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/GPU_function.cu delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/GPU_init.cpp delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/GPU_init.hpp delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/MODEL_info.h delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/cuda_util.cpp delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/cuda_util.hpp delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/detect.cpp delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/detect.hpp delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/drvapi_error_string.h delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/dt_GPU.cpp delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/dt_GPU.hpp delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/fconvsMT.cpp delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/fconvsMT.hpp delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/featurepyramid.cpp delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/featurepyramid.hpp delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/for_use_GPU.h delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/get_boxes.cpp delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/get_boxes.hpp delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/load_model.cpp delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/load_model.hpp delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/multithreading.cpp delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/multithreading.h delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/nms.cpp delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/nms.hpp delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/obstacle_detection.cpp delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/resize_GPU.cc delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/resize_GPU.cpp delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/resize_GPU.hpp delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/switch_float.h delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/switch_release.h delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/tracking.cpp delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/tracking.hpp delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/include/libdpm_ttic/dpm_ttic.hpp delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/package.xml delete mode 100644 ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/util/capability_version_checker.cpp delete mode 100644 ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/CHANGELOG.rst delete mode 100644 ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/CMakeLists.txt delete mode 100644 ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/data/car.xml delete mode 100644 ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/data/car_2008.xml delete mode 100755 ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/data/car_comp.csv delete mode 100755 ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/data/car_part.csv delete mode 100755 ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/data/car_root.csv delete mode 100644 ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/data/person.xml delete mode 100755 ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/data/person_comp.csv delete mode 100755 ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/data/person_part.csv delete mode 100755 ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/data/person_root.csv delete mode 100644 ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/interface.yaml delete mode 100644 ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/launch/vision_dpm_ttic_detect.launch delete mode 100644 ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/nodes/vision_dpm_ttic_detect/vision_dpm_ttic_detect.cpp delete mode 100644 ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/package.xml diff --git a/.travis.yml b/.travis.yml index 2c55680c191..3d37e9ea0b9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,20 +1,15 @@ language: generic services: - docker -cache: - directories: - - $HOME/.ccache -env: - global: - - CCACHE_DIR=$HOME/.ccache + +env: matrix: - ROS_DISTRO="kinetic" _GUARD_INTERVAL=10 CATKIN_PARALLEL_JOBS='-p2' ROS_PARALLEL_JOBS='-j2' NOT_TEST_BUILD='true' NOT_TEST_INSTALL='true' - - ROS_DISTRO="melodic" _GUARD_INTERVAL=10 CATKIN_PARALLEL_JOBS='-p2' ROS_PARALLEL_JOBS='-j2' NOT_TEST_BUILD='true' NOT_TEST_INSTALL='true' -matrix: - allow_failures: - - env: ROS_DISTRO="melodic" _GUARD_INTERVAL=10 CATKIN_PARALLEL_JOBS='-p2' ROS_PARALLEL_JOBS='-j2' NOT_TEST_BUILD='true' NOT_TEST_INSTALL='true' + - ROS_DISTRO="kinetic" _GUARD_INTERVAL=10 CATKIN_PARALLEL_JOBS='-p2' ROS_PARALLEL_JOBS='-j2' NOT_TEST_BUILD='true' NOT_TEST_INSTALL='true' DOCKER_BASE_IMAGE=nvidia/cuda:9.0-cudnn7-devel-ubuntu16.04 + - ROS_DISTRO="melodic" _GUARD_INTERVAL=10 CATKIN_PARALLEL_JOBS='-p2' ROS_PARALLEL_JOBS='-j2' NOT_TEST_BUILD='true' NOT_TEST_INSTALL='true' BUILDER=colcon + - ROS_DISTRO="melodic" _GUARD_INTERVAL=10 CATKIN_PARALLEL_JOBS='-p2' ROS_PARALLEL_JOBS='-j2' NOT_TEST_BUILD='true' NOT_TEST_INSTALL='true' DOCKER_BASE_IMAGE=nvidia/cuda:10.0-cudnn7-devel-ubuntu18.04 BUILDER=colcon install: - - git clone --quiet --depth 1 https://github.com/ros-industrial/industrial_ci.git .industrial_ci + - git clone --branch colcon --quiet --depth 1 https://github.com/ipa-mdl/industrial_ci.git .industrial_ci script: - .industrial_ci/travis.sh \ No newline at end of file diff --git a/docs/quick_start/my_mission_planning.launch b/docs/quick_start/my_mission_planning.launch index 91a656c146f..6e79ed1e5cf 100644 --- a/docs/quick_start/my_mission_planning.launch +++ b/docs/quick_start/my_mission_planning.launch @@ -17,7 +17,7 @@ diff --git a/ros/src/computing/perception/detection/lidar_detector/packages/lidar_apollo_cnn_seg_detect/CMakeLists.txt b/ros/src/computing/perception/detection/lidar_detector/packages/lidar_apollo_cnn_seg_detect/CMakeLists.txt index 91250f35ee0..7342ca788fb 100755 --- a/ros/src/computing/perception/detection/lidar_detector/packages/lidar_apollo_cnn_seg_detect/CMakeLists.txt +++ b/ros/src/computing/perception/detection/lidar_detector/packages/lidar_apollo_cnn_seg_detect/CMakeLists.txt @@ -28,17 +28,25 @@ catkin_package( autoware_msgs ) -IF (CUDA_FOUND) +###CAFFE +set(CAFFE_PATH "$ENV{HOME}/caffe/distribute") + +####### Melodic Checks +SET (CPU_ONLY FALSE) +if (CUDA_FOUND AND "$ENV{ROS_DISTRO}" STREQUAL "melodic" ) + if(${CMAKE_VERSION} VERSION_LESS "3.12.3") + message("GPU support on Melodic requires CMake version>= 3.12.3") + SET (CPU_ONLY TRUE) + endif() +endif() +####### End Melodic Checks + +if (NOT CPU_ONLY AND ${CUDA_FOUND} AND EXISTS "${CAFFE_PATH}") include_directories(${CUDA_INCLUDE_DIRS}) IF ("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "^arm") link_directories(/usr/lib/arm-linux-gnueabihf/tegra) endif () -ENDIF () -###CAFFE -set(CAFFE_PATH "$ENV{HOME}/caffe/distribute") - -if (EXISTS "${CAFFE_PATH}") include_directories( include diff --git a/ros/src/computing/perception/detection/lidar_detector/packages/lidar_euclidean_cluster_detect/CMakeLists.txt b/ros/src/computing/perception/detection/lidar_detector/packages/lidar_euclidean_cluster_detect/CMakeLists.txt index d6a4724c637..39b917a75bc 100644 --- a/ros/src/computing/perception/detection/lidar_detector/packages/lidar_euclidean_cluster_detect/CMakeLists.txt +++ b/ros/src/computing/perception/detection/lidar_detector/packages/lidar_euclidean_cluster_detect/CMakeLists.txt @@ -64,7 +64,22 @@ add_executable(lidar_euclidean_cluster_detect nodes/lidar_euclidean_cluster_detect/cluster.cpp) find_package(CUDA) -if (${CUDA_FOUND}) +find_package(Eigen3 QUIET) +####### Melodic Checks +SET (CPU_ONLY FALSE) +if (CUDA_FOUND AND "$ENV{ROS_DISTRO}" STREQUAL "melodic" ) + if(${CMAKE_VERSION} VERSION_LESS "3.12.3") + message("GPU support on Melodic requires CMake version>= 3.12.3") + SET (CPU_ONLY TRUE) + else() + if (${EIGEN3_VERSION_STRING} VERSION_LESS "3.3.5") + message("GPU support on Melodic requires Eigen version>= 3.3.5") + SET (CPU_ONLY TRUE) + endif() + endif() +endif() +####### End Melodic Checks +if (NOT CPU_ONLY AND ${CUDA_FOUND}) INCLUDE(FindCUDA) message("-- USING ACCELERATED CLUSTERING --") message("Version: " ${CUDA_VERSION}) diff --git a/ros/src/computing/perception/detection/lidar_detector/packages/lidar_point_pillars/CMakeLists.txt b/ros/src/computing/perception/detection/lidar_detector/packages/lidar_point_pillars/CMakeLists.txt index 87d2a5728b8..c562def108e 100755 --- a/ros/src/computing/perception/detection/lidar_detector/packages/lidar_point_pillars/CMakeLists.txt +++ b/ros/src/computing/perception/detection/lidar_detector/packages/lidar_point_pillars/CMakeLists.txt @@ -4,13 +4,24 @@ project(lidar_point_pillars) # set flags for CUDA availability option(CUDA_AVAIL "CUDA available" OFF) find_package(CUDA) -if (CUDA_FOUND) + +####### Melodic Checks +SET (CPU_ONLY FALSE) +if (NOT CPU_ONLY AND CUDA_FOUND AND "$ENV{ROS_DISTRO}" STREQUAL "melodic" ) + if(${CMAKE_VERSION} VERSION_LESS "3.12.3") + message("GPU support on Melodic requires CMake version>= 3.12.3") + SET (CPU_ONLY TRUE) + endif() +endif() +####### End Melodic Checks + +if (NOT CPU_ONLY AND CUDA_FOUND) message("CUDA is available!") message("CUDA Libs: ${CUDA_LIBRARIES}") message("CUDA Headers: ${CUDA_INCLUDE_DIRS}") set(CUDA_AVAIL ON) else() - message("CUDA NOT FOUND") + message("CUDA NOT FOUND OR INCOMPATIBLE CMAKE VERSION FOUND") set(CUDA_AVAIL OFF) endif (CUDA_FOUND) diff --git a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/CHANGELOG.rst b/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/CHANGELOG.rst deleted file mode 100644 index 32a6e58ddf9..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/CHANGELOG.rst +++ /dev/null @@ -1,280 +0,0 @@ -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Changelog for package libdpm_ttic -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -1.11.0 (2019-03-21) -------------------- -* [fix] Install commands for all the packages (`#1861 `_) - * Initial fixes to detection, sensing, semantics and utils - * fixing wrong filename on install command - * Fixes to install commands - * Hokuyo fix name - * Fix obj db - * Obj db include fixes - * End of final cleaning sweep - * Incorrect command order in runtime manager - * Param tempfile not required by runtime_manager - * * Fixes to runtime manager install commands - * Remove devel directory from catkin, if any - * Updated launch files for robosense - * Updated robosense - * Fix/add missing install (`#1977 `_) - * Added launch install to lidar_kf_contour_track - * Added install to op_global_planner - * Added install to way_planner - * Added install to op_local_planner - * Added install to op_simulation_package - * Added install to op_utilities - * Added install to sync - * * Improved installation script for pointgrey packages - * Fixed nodelet error for gmsl cameras - * USe install space in catkin as well - * add install to catkin - * Fix install directives (`#1990 `_) - * Fixed installation path - * Fixed params installation path - * Fixed cfg installation path - * Delete cache on colcon_release -* Fix license notice in corresponding package.xml -* Contributors: Abraham Monrroy Cano, amc-nu - -1.10.0 (2019-01-17) -------------------- -* Switch to Apache 2 license (develop branch) (`#1741 `_) - * Switch to Apache 2 - * Replace BSD-3 license header with Apache 2 and reassign copyright to the - Autoware Foundation. - * Update license on Python files - * Update copyright years - * Add #ifndef/define _POINTS_IMAGE_H\_ - * Updated license comment -* Use colcon as the build tool (`#1704 `_) - * Switch to colcon as the build tool instead of catkin - * Added cmake-target - * Added note about the second colcon call - * Added warning about catkin* scripts being deprecated - * Fix COLCON_OPTS - * Added install targets - * Update Docker image tags - * Message packages fixes - * Fix missing dependency -* Contributors: Esteve Fernandez - -1.9.1 (2018-11-06) ------------------- - -1.9.0 (2018-10-31) ------------------- - -1.8.0 (2018-08-31) ------------------- -* [Feature] Cross compile for NVIDIA DriveWorks (`#1447 `_) -* [Fix] Moved C++11 flag to autoware_build_flags (`#1395 `_) -* [Feature] Makes sure that all binaries have their dependencies linked (`#1385 `_) -* [Feature] Cross compile Autoware for aarch64 (`#1375 `_) -* Contributors: Esteve Fernandez - -1.7.0 (2018-05-18) ------------------- -* update Version from 1.6.3 to 1.7.0 in package.xml and CHANGELOG.rst -* [Fix] rename packages (`#1269 `_) - * rename lidar_tracker - * Modify pf_lidar_track's cmake file - * Refactor code - * Rename from euclidean_lidar_tracker to lidar_euclidean_track - * Rename from kf_contour_track to lidar_kf_contour_track - * Rename from kf_lidar_track to lidar_kf_track, but need some modification in euclidean cluster(Cluster.h) - * Rename from pf_lidar_tarck to lidar_pf_track - * Rename range_fusion - * Rename obj_reproj - * Rename euclidean_cluster to lidar_euclidean_cluster_detect - * Rename svm_lidar_detect to lidar_svm_detect - * Rename kf_lidar_track to lidar_kf_track - * Change version 1.6.3 to 1.7.0 in pacakge.xml - * Modify CMake so that extrenal header would be loaded - * Remove obj_reproj from cv_tracker - * Add interface.yaml - * Rename road_wizard to trafficlight_recognizer - * create common directory - * Add lidar_imm_ukf_pda_track - * create vision_detector and moved cv - * Modify interface.yaml and package.xml - * remove dpm_ocv - * moved directory - * Delete unnecessary launch file - * Delete rcnn related file and code - * separated dummy_track from cv_tracker - * separated klt_track from cv_tracker - * Fix a cmake - * Remove unnecessary dependency of lidar_euclidean_cluster_detect package - * Rename image_segmenter to vision_segment_enet_detect - * Remove unnecessary dependency of lidar_svm_detect package - * separated kf_track and fix a some compiling issue - * move viewers - * merge ndt_localizer and icp_localizer, and rename to lidar_localizer - * Remove unnecessary dependency of lidar_euclidean_track - * moved image lib - * add launch - * lib move under lidar_tracker - * Rename dpm_ttic to vision_dpm_ttic_detect - * rename yolo3detector to vision_yolo3_detect - * Modify cmake and package.xml in vision_dpm_ttic_detect - * moved sourcefiles into nodes dir - * moved sourcefiles into nodes dir - * Move cv_tracker/data folder and delete cv_tracker/model folder - * fix a package file and cmake - * Rename yolo2 -> vision_yolo2_detect - * fix a package file and cmake - * Fix package name of launch file - * Rename ssd to vision_ssd_detect - * fixed cmake and package for decerese dependencies - * remove top packages dir for detection - * fixed cmake for cuda - * Rename lane_detector to vision_lane_detect - * Modify package.xml in lidar-related packages - * Remove unnecessary dependencies in lidar_detector and lidar_tracker - * Modify computing.yaml for dpm_ttic - * Modify dpm_ttic launch file - * Remove/Add dependencies to trafficlight_recognizer - * Update data folder in dpm_ttic - * Modified CMake and package file in dpm_ttic. - * Remove src dir in imm_ukf_pda_track - * removed unnecessary comments - * rename lidar_tracker - * Modify pf_lidar_track's cmake file - * Refactor code - * Rename from euclidean_lidar_tracker to lidar_euclidean_track - * Rename from kf_contour_track to lidar_kf_contour_track - * Rename from kf_lidar_track to lidar_kf_track, but need some modification in euclidean cluster(Cluster.h) - * Rename from pf_lidar_tarck to lidar_pf_track - * Rename range_fusion - * Rename obj_reproj - * Rename road_wizard to trafficlight_recognizer - * Rename euclidean_cluster to lidar_euclidean_cluster_detect - * Rename svm_lidar_detect to lidar_svm_detect - * Rename kf_lidar_track to lidar_kf_track - * Change version 1.6.3 to 1.7.0 in pacakge.xml - * Modify CMake so that extrenal header would be loaded - * Remove obj_reproj from cv_tracker - * Add interface.yaml - * create common directory - * Add lidar_imm_ukf_pda_track - * create vision_detector and moved cv - * Modify interface.yaml and package.xml - * remove dpm_ocv - * moved directory - * Delete unnecessary launch file - * Delete rcnn related file and code - * separated dummy_track from cv_tracker - * separated klt_track from cv_tracker - * Fix a cmake - * Remove unnecessary dependency of lidar_euclidean_cluster_detect package - * Rename image_segmenter to vision_segment_enet_detect - * Remove unnecessary dependency of lidar_svm_detect package - * separated kf_track and fix a some compiling issue - * move viewers - * merge ndt_localizer and icp_localizer, and rename to lidar_localizer - * Remove unnecessary dependency of lidar_euclidean_track - * moved image lib - * add launch - * lib move under lidar_tracker - * Rename dpm_ttic to vision_dpm_ttic_detect - * rename yolo3detector to vision_yolo3_detect - * Modify cmake and package.xml in vision_dpm_ttic_detect - * moved sourcefiles into nodes dir - * moved sourcefiles into nodes dir - * Move cv_tracker/data folder and delete cv_tracker/model folder - * fix a package file and cmake - * Rename yolo2 -> vision_yolo2_detect - * fix a package file and cmake - * Fix package name of launch file - * Rename ssd to vision_ssd_detect - * fixed cmake and package for decerese dependencies - * remove top packages dir for detection - * fixed cmake for cuda - * Rename lane_detector to vision_lane_detect - * Modify package.xml in lidar-related packages - * Remove unnecessary dependencies in lidar_detector and lidar_tracker - * Modify computing.yaml for dpm_ttic - * Modify dpm_ttic launch file - * Remove/Add dependencies to trafficlight_recognizer - * Update data folder in dpm_ttic - * Modified CMake and package file in dpm_ttic. - * Remove src dir in imm_ukf_pda_track - * Fix bug for not starting run time manager - * Remove invalid dependency -* Contributors: Kosuke Murakami - -1.6.3 (2018-03-06) ------------------- - -1.6.2 (2018-02-27) ------------------- -* Update CHANGELOG -* Contributors: Yusuke FUJII - -1.6.1 (2018-01-20) ------------------- -* update CHANGELOG -* Contributors: Yusuke FUJII - -1.6.0 (2017-12-11) ------------------- - -1.5.1 (2017-09-25) ------------------- -* Release/1.5.1 (`#816 `_) - * fix a build error by gcc version - * fix build error for older indigo version - * update changelog for v1.5.1 - * 1.5.1 -* Contributors: Yusuke FUJII - -1.5.0 (2017-09-21) ------------------- -* Update changelog -* Contributors: Yusuke FUJII - -1.4.0 (2017-08-04) ------------------- -* version number must equal current release number so we can start releasing in the future -* added changelogs -* Contributors: Dejan Pangercic - -1.3.1 (2017-07-16) ------------------- - -1.3.0 (2017-07-14) ------------------- -* convert to autoware_msgs -* Contributors: YamatoAndo - -1.2.0 (2017-06-07) ------------------- -* fix circular-dependency -* Contributors: Shohei Fujii - -1.1.2 (2017-02-27 23:10) ------------------------- - -1.1.1 (2017-02-27 22:25) ------------------------- - -1.1.0 (2017-02-24) ------------------- - -1.0.1 (2017-01-14) ------------------- - -1.0.0 (2016-12-22) ------------------- -* Remove needless compiling flags -* Fix CUDA_ERROR_LAUNCH_FAILED error occurred in dpm_ttic - * Correct memory allocate & copy size - * Correct address calculation on device side -* Improve cmake CUDA configuration - Use cmake CUDA feature as possible for removing absolute paths. -* Use c++11 option instead of c++0x - We can use newer compilers which support 'c++11' option -* Initial commit for public release -* Contributors: Manato Hirabayashi, Shinpei Kato, Syohei YOSHIDA diff --git a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/CMakeLists.txt b/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/CMakeLists.txt deleted file mode 100644 index e28fc154c40..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/CMakeLists.txt +++ /dev/null @@ -1,144 +0,0 @@ -cmake_minimum_required(VERSION 2.8.3) -project(libdpm_ttic) - - -find_package(autoware_build_flags REQUIRED) -find_package(catkin REQUIRED COMPONENTS - sensor_msgs - std_msgs - ) -find_package(OpenCV REQUIRED) -find_package(CUDA) - -catkin_package( - INCLUDE_DIRS include - LIBRARIES libdpm_ttic -) - -set(CMAKE_C_FLAGS "-O2 -g -Wall -Wno-unused-result ${CMAKE_C_FLAGS}") -set(CMAKE_CXX_FLAGS "-O2 -g -Wall -Wno-unused-result ${CMAKE_CXX_FLAGS}") - -if(CUDA_FOUND) - include_directories( - include - ${catkin_INCLUDE_DIRS} - ${CUDA_INCLUDE_DIRS} - "common" - "cpu" - "gpu" - ) - - if("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "^arm") - link_directories(/usr/lib/arm-linux-gnueabihf/tegra) - endif() - - file(GLOB DPM_TTIC_COMMON_IMPL_SOURCES "common/*.cpp") - file(GLOB DPM_TTIC_CPU_IMPL_SOURCES "cpu/*.cpp") - file(GLOB DPM_TTIC_GPU_IMPL_SOURCES "gpu/*.cpp") - - ## Declare a cpp library - add_library(libdpm_ttic - ${DPM_TTIC_COMMON_IMPL_SOURCES} - ${DPM_TTIC_CPU_IMPL_SOURCES} - ${DPM_TTIC_GPU_IMPL_SOURCES} - ) - #SET_TARGET_PROPERTIES(libdpm_ttic PROPERTIES OUTPUT_NAME dpm_ttic) - - target_link_libraries(libdpm_ttic - ${catkin_LIBRARIES} - ${OpenCV_LIBS} - ${CUDA_CUDA_LIBRARY} - ) - - set(CUDA_COMPILER "${CUDA_TOOLKIT_ROOT_DIR}/bin/nvcc") - - if("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "^arm") - set(CUDA_LDFLAGS -L/usr/lib/arm-linux-gnueabihf/tegra -lcuda) - else() - set(CUDA_LDFLAGS -lcuda) - endif() - - if(CMAKE_CROSSCOMPILING) - if(NOT CUDA_ARCH) - message(FATAL_ERROR "Please define the CUDA_ARCH CMake variable") - endif() - else() - set(CUDA_CAPABILITY_VERSION_CHECKER - "${CATKIN_DEVEL_PREFIX}/lib/capability_version_checker" - ) - - execute_process( - COMMAND - ${CUDA_COMPILER} - -o ${CUDA_CAPABILITY_VERSION_CHECKER} - "${CMAKE_CURRENT_SOURCE_DIR}/util/capability_version_checker.cpp" - ${CUDA_LDFLAGS} - ) - - execute_process( - COMMAND ${CUDA_CAPABILITY_VERSION_CHECKER} - OUTPUT_VARIABLE CUDA_CAPABILITY_VERSION - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - - if("${CUDA_CAPABILITY_VERSION}" MATCHES "^[1-9][0-9]+$") - set(CUDA_ARCH "sm_${CUDA_CAPABILITY_VERSION}") - else() - set(CUDA_ARCH "sm_52") - endif() - endif() - - set(CUDA_FILE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/gpu") - add_custom_command( - OUTPUT GPU_function.cubin - COMMAND - ${CUDA_COMPILER} "-arch=${CUDA_ARCH}" - "-o" "${CATKIN_DEVEL_PREFIX}/lib/GPU_function.cubin" - "-cubin" "-Xptxas" "-v" "--maxrregcount" "32" "-I${CUDA_FILE_PATH}" - "${CMAKE_CURRENT_SOURCE_DIR}/gpu/GPU_function.cu" - DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/gpu/GPU_function.cu" - ) - - add_custom_target(cuda_binary DEPENDS GPU_function.cubin) - add_dependencies(libdpm_ttic - cuda_binary - ) - -else() - - include_directories( - include - ${catkin_INCLUDE_DIRS} - "common" - "cpu" - ) - - file(GLOB DPM_TTIC_COMMON_IMPL_SOURCES "common/*.cpp") - file(GLOB DPM_TTIC_CPU_IMPL_SOURCES "cpu/*.cpp") - - ## Declare a cpp library - add_library(libdpm_ttic - ${DPM_TTIC_COMMON_IMPL_SOURCES} - ${DPM_TTIC_CPU_IMPL_SOURCES} - ) - #SET_TARGET_PROPERTIES(libdpm_ttic PROPERTIES OUTPUT_NAME dpm_ttic) - - target_link_libraries(libdpm_ttic - ${catkin_LIBRARIES} - ${OpenCV_LIBS} - ) - - -endif() - -install(DIRECTORY include/${PROJECT_NAME}/ - DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} - FILES_MATCHING PATTERN "*.hpp" - ) - -install(TARGETS - libdpm_ttic - ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} - LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} - RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} - ) diff --git a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/common/common.cpp b/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/common/common.cpp deleted file mode 100644 index 439f8f5ac42..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/common/common.cpp +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2015-2019 Autoware Foundation. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "common.hpp" - -void dpm_ttic_add_part_calculation(FLOAT *score, FLOAT*M,int *rootsize,int *partsize,int ax,int ay) -{ - FLOAT *S = score; - int jj_L = ax+2*(rootsize[1]-1)-1; - int ii_L = ay+2*(rootsize[0]-1); - int axm = ax-1; - - //add part score(resolution of part is 2x of root) - for(int jj=axm;jj<=jj_L;jj+=2) - { - int L = jj*partsize[0]; - for(int ii=ay;ii<=ii_L;ii+=2) - { - *S -= M[ii+L-1]; - S++; - } - } -} - -//initialize accumulated score -FLOAT *dpm_ttic_init_accumulated_score(IplImage *image, size_t& accumulated_size) -{ - size_t num = image->height * image->width; - accumulated_size = num * sizeof(FLOAT); - - FLOAT *scores = (FLOAT *)calloc(num, sizeof(FLOAT)); - for(size_t i = 0; i < num; i++) - scores[i] = -100.0; - - return scores; -} diff --git a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/common/common.hpp b/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/common/common.hpp deleted file mode 100644 index 91cf68a1460..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/common/common.hpp +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef _COMMON_H_ -#define _COMMON_H_ - -#include -#include - -#include "switch_float.h" - -//release function (for safety release) -#define s_free(a) do { \ - std::free(a); \ - a = nullptr; \ -} while(0) - -extern void dpm_ttic_add_part_calculation(FLOAT *score, FLOAT*M,int *rootsize,int *partsize,int ax,int ay); -extern FLOAT *dpm_ttic_init_accumulated_score(IplImage *image, size_t& accumulated_size); - -#endif /* _COMMON_H_ */ diff --git a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/MODEL_info.h b/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/MODEL_info.h deleted file mode 100755 index 505ac3eccf7..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/MODEL_info.h +++ /dev/null @@ -1,95 +0,0 @@ -/////////////////////////Car tracking project with laser_radar_data_fusion///////////////////////////////////////// -//////////////////////////////////////////////////////////////////////Copyright 2009-10 Akihiro Takeuchi/////////// - -///////////MODEL_info.h Detector-Model information & definition header ///////////////////////////////////////// - -//OpenCV library -#ifndef INCLUDED_Minfo_ -#define INCLUDED_Minfo_ - -#include -#include "switch_float.h" - -///////////////////// -//file information/// -///////////////////// - -//struct for model component information -struct Model_info { - //basic information - //from xxxcomp.csv - int numcomponent; //number of component - int sbin; //cell size - int interval; //interval (for hierachical detection) - int max_X; - int max_Y; - //from calculation - int padx; //pad information - int pady; - int max_scale; - //image size information - int IM_WIDTH; - int IM_HEIGHT; - - //per root - int *ridx; //root index information - int *oidx; //offsetindex information - FLOAT *offw; //offset weight - int *rsize; //root size - int *numpart; //number of part filter per component - - //per part - int **pidx; //part index information - int **didx; //define index of part - int **psize; - - //defs - FLOAT *def; //defs - int *anchor; //anchor - - //least_square info - FLOAT **x1; - FLOAT **y1; - FLOAT **x2; - FLOAT **y2; - - bool ini; //flag for initialization - FLOAT ratio; //ratio of zooming image -}; - -//struct for root_filter_information -struct Rootfilters { - int NoR; //number of root filter - int **root_size; //size of root filter - FLOAT **rootfilter; //weight of root filter - int *rootsym; //symmetric information -}; - -//struct for part_filter_information -struct Partfilters { - int NoP; //number of part filter - int **part_size; //size of part filter - FLOAT **partfilter; //weight of root filter - int *part_partner; //symmetric-partner information - int *part_sym; //symmetric information of part filter -}; - -//model information -struct MODEL { - Model_info *MI; - Rootfilters *RF; - Partfilters *PF; -}; - -//Result of Detection -struct RESULT { - int num; - int *point; - int *OR_point; - IplImage **IM; - int *type; - FLOAT *scale; - FLOAT *score; -}; - -#endif diff --git a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/detect.cpp b/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/detect.cpp deleted file mode 100644 index b43bde3795b..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/detect.cpp +++ /dev/null @@ -1,74 +0,0 @@ -/////////////////////////Car tracking project with laser_radar_data_fusion///////////////////////////////////////// -//////////////////////////////////////////////////////////////////////Copyright 2009-10 Akihiro Takeuchi/////////// - -/////detect.cpp Detect car from an image /////////////////////////////////////////////////////////////////////// - -//OpenCV library -#include -#include -#include - -//C++ library -#include -#include -#include - -//ORIGINAL header files -#include "MODEL_info.h" //File information -#include "common.hpp" - -#include "switch_float.h" -#include "tracking.hpp" -#include "nms.hpp" -#include "get_boxes.hpp" -#include "featurepyramid.hpp" - -//definiton of functions// - -//create and resize Iplimage -//initialize accumulated score - -//detect car-boundary-boxes - -static FLOAT *detect(IplImage *IM,MODEL *MO,FLOAT thresh,int *D_NUMS,FLOAT *A_SCORE) -{ - //for time measurement - struct timeval tv; - struct timeval tv_calc_f_pyramid_start, tv_calc_f_pyramid_end; - - //initialize scale information for hierachical detection - FLOAT *scales = dpm_ttic_cpu_ini_scales(MO->MI,IM,IM->width,IM->height); - - //initialize feature-size matrix - int *featsize = dpm_ttic_cpu_ini_featsize(MO->MI); - //calculate feature pyramid - - gettimeofday(&tv_calc_f_pyramid_start, NULL); - FLOAT **feature = dpm_ttic_cpu_calc_f_pyramid(IM,MO->MI,featsize,scales); - gettimeofday(&tv_calc_f_pyramid_end, NULL); - tvsub(&tv_calc_f_pyramid_end, &tv_calc_f_pyramid_start, &tv); - printf("\n"); - printf("calc_f_pyramid %f[ms]\n", tv.tv_sec * 1000.0 + (float)tv.tv_usec / 1000.0); - - //detect boundary boxes - FLOAT *boxes = dpm_ttic_cpu_get_boxes(feature,scales,featsize,MO,D_NUMS,A_SCORE,thresh); - - free(scales); - free(featsize); - dpm_ttic_cpu_free_features(feature, MO->MI); - - return boxes; -} - -RESULT *dpm_ttic_cpu_car_detection(IplImage *image, MODEL *model, FLOAT thresh, int *D_NUMS, - FLOAT *A_SCORE,FLOAT overlap) -{ - FLOAT *boxes = detect(image,model,thresh,D_NUMS,A_SCORE); //detect high-score region - FLOAT *rects = dpm_ttic_cpu_nms(boxes,overlap,D_NUMS,model); //get boundary-rectangles of car - RESULT *result = dpm_ttic_cpu_get_new_rects(image,model,rects,D_NUMS); //get current result - - s_free(boxes); - s_free(rects); - - return result; -} diff --git a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/detect.hpp b/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/detect.hpp deleted file mode 100644 index 8cc4beb06c0..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/detect.hpp +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef _DETECT_H_ -#define _DETECT_H_ - -#include "switch_float.h" - -extern RESULT *dpm_ttic_cpu_car_detection(IplImage *image, MODEL *model, FLOAT thresh, int *D_NUMS, - FLOAT *A_SCORE,FLOAT overlap); - -#endif /* _DETECT_H_ */ diff --git a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/dt.cpp b/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/dt.cpp deleted file mode 100755 index 639cafbf2fb..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/dt.cpp +++ /dev/null @@ -1,82 +0,0 @@ -// Car tracking project with laser_radar_data_fusion -// Copyright 2009-10 Akihiro Takeuchi - -/////dt.cpp Decide best filter position by dynamic programing - -//C++ library -#include -#include - -#include "switch_float.h" -#include "dt.hpp" - -static inline void dt_helper(FLOAT *src, FLOAT *dst, int *ptr, int step, int s1, int s2, int d1, int d2, FLOAT a, FLOAT b) -{ - if (d2 >= d1) - { - int d = (d1+d2) >> 1; - int ds =d*step; - int s = s1; - FLOAT src_ss = *(src+s*step); - for (int p = s1+1; p <= s2; p++) - { - int t1 = d-s; - int t2 = d-p; - if (src_ss + a*t1*t1 + b*t1 > *(src+p*step) + a*t2*t2 + b*t2) - { - s = p; - src_ss = *(src+s*step); - } - } - int D = d-s; - dst[ds] = *(src+s*step) + a*D*D + b*D; - ptr[ds] = s; - dt_helper(src, dst, ptr, step, s1, s, d1, d-1, a, b); - dt_helper(src, dst, ptr, step, s, s2, d+1, d2, a, b); - } -} - -//sub function of dt -static void dt1d(FLOAT *src, FLOAT *dst, int *ptr, int step, int n, FLOAT a, FLOAT b) -{ - dt_helper(src, dst, ptr, step, 0, n-1, 0, n-1, a, b); -} - -//Decide best filter position by dynamic programing -FLOAT *dpm_ttic_cpu_dt(FLOAT *vals,FLOAT ax,FLOAT bx,FLOAT ay,FLOAT by,int *dims,int *Ix,int *Iy) -{ - const int SQ = dims[0]*dims[1]; - FLOAT *M = (FLOAT*)malloc(sizeof(FLOAT)*SQ); - FLOAT *tmpM = (FLOAT*)malloc(sizeof(FLOAT)*SQ); - int *tmpIx = (int*)malloc(sizeof(int)*SQ); - int *tmpIy = (int*)malloc(sizeof(int)*SQ); - int XD=0; - - for (int x = 0; x < dims[1]; x++) - { - dt1d(vals+XD, tmpM+XD, tmpIy+XD, 1, dims[0], ay, by); - XD+=dims[0]; - } - for (int y = 0; y < dims[0]; y++) - { - dt1d(tmpM+y, M+y, tmpIx+y, dims[0], dims[1], ax, bx); - } - - int *IX_P = Ix; - int *IY_P = Iy; - int *tmpIx_P=tmpIx; - for (int x = 0; x < dims[1]; x++) - { - for (int y = 0; y < dims[0]; y++) - { - *(IX_P++) = *tmpIx_P; - *(IY_P++) = tmpIy[*tmpIx_P*dims[0]+y]; - tmpIx_P++; - } - } - - free(tmpM); - free(tmpIx); - free(tmpIy); - return(M); -} diff --git a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/dt.hpp b/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/dt.hpp deleted file mode 100644 index 66de8739594..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/dt.hpp +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef _DT_H_ -#define _DT_H_ - -#include "switch_float.h" - -//decide optimum part position -extern FLOAT *dpm_ttic_cpu_dt(FLOAT *vals,FLOAT ax,FLOAT bx,FLOAT ay,FLOAT by,int *dims,int *Ix,int *Iy); - -#endif /* _DT_H_ */ diff --git a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/fconvsMT.cpp b/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/fconvsMT.cpp deleted file mode 100644 index fed8533e1c5..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/fconvsMT.cpp +++ /dev/null @@ -1,284 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////Car tracking project with laser_radar_data_fusion///////////////////////////////////////// -//////////////////////////////////////////////////////////////////////Copyright 2009-10 Akihiro Takeuchi/////////// - -/////fconvsMT.cpp convolute features and filter ///////////////////////////////////////////////////////////////// - -//C++ library (thread-functions are only supported by windows) -#include -#include - -#include - -//Original header -#include "MODEL_info.h" //File information -#include "common.hpp" -#include "switch_float.h" - -struct thread_data { - FLOAT *A; - FLOAT *B; - FLOAT *C; - FLOAT *F; - FLOAT *T; - int A_dims[3]; - int B_dims[3]; - int C_dims[2]; -}; - -//thread process -// convolve A and B(non_symmetric) -static void* process(void *thread_arg) { - thread_data *args = (thread_data *)thread_arg; - FLOAT *A = args->A; //feature - FLOAT *B = args->B; //filter - FLOAT *C = args->C; //output - int *A_dims = args->A_dims; - int *B_dims = args->B_dims; - int *C_dims = args->C_dims; - int num_features = A_dims[2]; - - const int A_SQ = A_dims[0]*A_dims[1]; - const int B_SQ = B_dims[0]*B_dims[1]; - - for (int f = 0; f < num_features; f++) - { - FLOAT *dst = C; - FLOAT *A_src = A + f*A_SQ; - FLOAT *B_src = B + f*B_SQ; - int XA0 = 0; - for (int x = 0; x < C_dims[1]; x++) - { - FLOAT *A_src2 =A_src+XA0; - XA0+=A_dims[0]; - for (int y = 0; y < C_dims[0]; y++) - { - FLOAT val = 0; - FLOAT *A_off = A_src2+y; - FLOAT *B_off = B_src; - for (int xp = 0; xp < B_dims[1]; xp++) - { - switch(B_dims[0]) - { - case 20: val += A_off[19] * B_off[19]; - case 19: val += A_off[18] * B_off[18]; - case 18: val += A_off[17] * B_off[17]; - case 17: val += A_off[16] * B_off[16]; - case 16: val += A_off[15] * B_off[15]; - case 15: val += A_off[14] * B_off[14]; - case 14: val += A_off[13] * B_off[13]; - case 13: val += A_off[12] * B_off[12]; - case 12: val += A_off[11] * B_off[11]; - case 11: val += A_off[10] * B_off[10]; - case 10: val += A_off[9] * B_off[9]; - case 9: val += A_off[8] * B_off[8]; - case 8: val += A_off[7] * B_off[7]; - case 7: val += A_off[6] * B_off[6]; - case 6: val += A_off[5] * B_off[5]; - case 5: val += A_off[4] * B_off[4]; - case 4: val += A_off[3] * B_off[3]; - case 3: val += A_off[2] * B_off[2]; - case 2: val += A_off[1] * B_off[1]; - case 1: val += A_off[0] * B_off[0]; - break; - default: - FLOAT *A_temp = A_off; - FLOAT *B_temp = B_off; - for (int yp = 0; yp < B_dims[0]; yp++) - { - val += *(A_temp++) * *(B_temp++); - } - } - A_off+=A_dims[0]; - B_off+=B_dims[0]; - } - *(dst++) += val; - } - } - A_src+=A_SQ; - B_src+=B_SQ; - } - - pthread_exit((void*)thread_arg); - return nullptr; -} - -// convolve A and B when B is symmetric -static void* processS(void *thread_arg) -{ - thread_data *args = (thread_data *)thread_arg; - FLOAT *A = args->A; - FLOAT *B = args->B; - FLOAT *C = args->C; - FLOAT *F = args->F; - FLOAT *T = args->T; - int *A_dims = args->A_dims; - int *B_dims = args->B_dims; - int *C_dims = args->C_dims; - int num_features = A_dims[2]; - int width1 = (int)(B_dims[1]/2.0+0.99); - int width2 = (int)(B_dims[1]/2.0); - - const int A_SQ = A_dims[0]*A_dims[1]; - const int B_SQ = B_dims[0]*B_dims[1]; - const int T_L = width2*A_dims[0]; - const int CP_L = width1*A_dims[0]; - const int XF_L = A_dims[1]-width1-width2; - const int CP_L_S = CP_L*sizeof(FLOAT); - - for (int f = 0; f < num_features; f++) - { - FLOAT *dst = C; - FLOAT *A_src = A + f*A_SQ; - FLOAT *B_src = B + f*B_SQ; - FLOAT *F_src = F + f*A_SQ; - int XA = 0; - for (int x = 0; x < C_dims[1]; x++) - { - // generate tmp data for band of output - memcpy(T, A_src + XA, CP_L_S); - XA+=A_dims[0]; - int xf = XF_L-x; - FLOAT *copy_dst = T; - FLOAT *copy_end = T + T_L; - FLOAT *copy_src = F_src + xf*A_dims[0]; - while (copy_dst < copy_end) - { - *copy_dst += *copy_src; - copy_dst++; - copy_src++; - } - - for (int y = 0; y < C_dims[0]; y++) - { - FLOAT val = 0; - FLOAT *T_off = T+y; - FLOAT *B_off = B_src; - for (int xp = 0; xp < width1; xp++) - { - switch(B_dims[0]) { - case 20: val += T_off[19] * B_off[19]; - case 19: val += T_off[18] * B_off[18]; - case 18: val += T_off[17] * B_off[17]; - case 17: val += T_off[16] * B_off[16]; - case 16: val += T_off[15] * B_off[15]; - case 15: val += T_off[14] * B_off[14]; - case 14: val += T_off[13] * B_off[13]; - case 13: val += T_off[12] * B_off[12]; - case 12: val += T_off[11] * B_off[11]; - case 11: val += T_off[10] * B_off[10]; - case 10: val += T_off[9] * B_off[9]; - case 9: val += T_off[8] * B_off[8]; - case 8: val += T_off[7] * B_off[7]; - case 7: val += T_off[6] * B_off[6]; - case 6: val += T_off[5] * B_off[5]; - case 5: val += T_off[4] * B_off[4]; - case 4: val += T_off[3] * B_off[3]; - case 3: val += T_off[2] * B_off[2]; - case 2: val += T_off[1] * B_off[1]; - case 1: val += T_off[0] * B_off[0]; - break; - default: - FLOAT *T_temp = T_off; - FLOAT *B_temp = B_off; - for (int yp = 0; yp < B_dims[0]; yp++) - { - val += *(T_temp++) * *(B_temp++); - } - } - T_off+=A_dims[0]; - B_off+=B_dims[0]; - } - - *(dst++) += val; - } - } - } - - pthread_exit((void*)thread_arg); - - return nullptr; -} - -//Input(feat,flipfeat,filter,symmetric info,1,length) -//Output Score -FLOAT **dpm_ttic_cpu_fconvsMT(FLOAT*feat,FLOAT*flfeat,FLOAT**filter,int *sym_info, - int start,int end,int *A_SIZE,int **B_SIZE,int *M_size) -{ - start=start-1; - end=end-1; - - const int len=end-start+1; - FLOAT **Output=(FLOAT**)malloc(sizeof(FLOAT*)*len); //Output (cell) - // start threads - thread_data *td = (thread_data *)calloc(len, sizeof(thread_data)); - pthread_t *ts = (pthread_t *)calloc(len, sizeof(pthread_t)); - - for(int ii=0;ii -#include -#include - -//C++ library -#include -#include -#include - -#include -#include -#include - -using namespace std; - -//Header files -#include "switch_float.h" -#include "MODEL_info.h" //File information -#include "common.hpp" -#include "resize.hpp" -#include "featurepyramid.hpp" - -//definition of constant -#define eps 0.0001 - -//definition of sin and cos -static const FLOAT Hcos[9]={1.0000,0.9397,0.7660,0.5000,0.1736,-0.1736,-0.5000,-0.7660,-0.9397}; -static const FLOAT Hsin[9]={0.0000,0.3420,0.6428,0.8660,0.9848,0.9848,0.8660,0.6428,0.3420}; - -//definition of structure -struct thread_data { - FLOAT *IM; - int ISIZE[3]; - int FSIZE[2]; - int F_C; - int sbin; - FLOAT *Out; -}; - -//inline functions(Why does not use stddard libary) -static inline int max_i(int x,int y) -{ - return (x >= y ? x : y); -} - -static inline int min_i(int x,int y) -{ - return (x <= y ? x : y); -} - -static inline FLOAT min_2(FLOAT x) -{ - return (x <= 0.2 ? x :0.2); -} - -//initialization functions - -//initialize scales -FLOAT *dpm_ttic_cpu_ini_scales(Model_info *MI,IplImage *IM,int X,int Y) //X,Y length of image -{ - int interval,max_scale; - - if(MI->ini) - { - //calculate max scale - //MI->interval/=2; //reduce calculation time - const int sbin = MI->sbin; - interval = MI->interval; - const FLOAT sc = pow(2.0,(1/(double)interval));//縮小比を表している。 - const int numcomponent = MI->numcomponent; - max_scale = 36; - const int L_NUM = interval+max_scale; - - FLOAT MRY =(FLOAT)MI->rsize[0]; - FLOAT MRX =(FLOAT)MI->rsize[1]; - - for(int kk=1;kkrsize[kk*2]rsize[kk*2]; - if(MI->rsize[kk*2+1]rsize[kk*2+1]; - } - - MRY/=2; - MRX/=2; - - FLOAT height =(FLOAT)IM->height/(FLOAT)sbin; - FLOAT width = (FLOAT)IM->width/(FLOAT)sbin; - FLOAT sc_step =1/sc; //縮小率 - - for(int kk=0;kkmax_scale=max_scale; - printf("max_scale:%d\n",max_scale); - MI->IM_HEIGHT=IM->height; - /*printf("高さ%d\n",MI->IM_HEIGHT);*/ - MI->IM_WIDTH=IM->width; - /*printf("横%d\n",MI->IM_WIDTH);*/ - MI->ini=false; - } - else - { - interval = MI->interval; - max_scale = MI->max_scale; - MI->IM_HEIGHT = IM->height; - MI->IM_WIDTH = IM->width; - } - - //return - FLOAT *scales = (FLOAT*)calloc((max_scale+interval),sizeof(FLOAT)); //Model information - return(scales); -} - -//initialize feature size matrix - -int *dpm_ttic_cpu_ini_featsize(Model_info *MI) -{ - const int LofFeat=MI->max_scale+MI->interval; - int *featsize = (int*)calloc(LofFeat*2,sizeof(FLOAT)); // feature size information matrix - return(featsize); -} - -//calculate HOG features from Image -//HOG features are calculated for each block(BSL*BSL pixels) -static FLOAT *calc_feature(FLOAT *SRC,int *ISIZE,int *FTSIZE,int sbin) -{ - //input size - const int height=ISIZE[0]; //{268,268,134,67,233,117,203,203,177,154,89,203,154,77} - const int width=ISIZE[1]; //{448,112,224,390,195,340,170,296,257,148,340,257,129} - const int dims[2]={height,width}; - - //size of Histgrams and Norm calculation space size - const int blocks[2] = {(int)floor(double(height)/double(sbin)+0.5),(int)floor(double(width)/double(sbin)+0.5)};//{67,112}....sbine=4 - const int BLOCK_SQ = blocks[0]*blocks[1];//{7504}... - const int BX = blocks[0]+1;//68... - - //Output features size(Output) - const int OUT_SIZE[3]={max_i(blocks[0]-2,0),max_i(blocks[1]-2,0),27+4};//{65,110,31}..... - const int O_DIM=OUT_SIZE[0]*OUT_SIZE[1];//{7150}..... - const int DIM_N =9*BLOCK_SQ;//{67536} - - //Visible range (eliminate border blocks) - const int visible[2]={blocks[0]*sbin,blocks[1]*sbin}; - const int vis_R[2] ={visible[0]-1,visible[1]-1}; - const int vp0=dims[0]-2; - const int vp1=dims[1]-2; - const int SQUARE =dims[0]*dims[1]; - const FLOAT SBIN = FLOAT(sbin); - - - //HOG Histgram and Norm - FLOAT *HHist = (FLOAT*)calloc(BLOCK_SQ*18,sizeof(FLOAT)); // HOG histgram - FLOAT *Norm = (FLOAT*)calloc(BLOCK_SQ,sizeof(FLOAT)); // Norm - - //feature(Output) - FLOAT *feat=(FLOAT*)calloc(OUT_SIZE[0]*OUT_SIZE[1]*OUT_SIZE[2],sizeof(FLOAT)); - - //calculate HOG histgram - for(int x=1;x=blocks[1]) {flag2=false;flagX=false;} - int YC=min_i(x,vp1)*dims[0]; - FLOAT *SRC_YC = SRC+YC; - - for(int y=1;yv){v=v2;dx=dx2;dy=dy2;} - if(v3>v){v=v3;dx=dx3;dy=dy3;} - - FLOAT best_dot=0.0; - int best_o=0; - - //snap to one of 18 orientations - for(int o=0;o<9;o++) - { - FLOAT dot=Hcos[o]*dx+Hsin[o]*dy; - if(dot>best_dot) {best_dot=dot;best_o=o;} - else if (-dot>best_dot) {best_dot=-dot;best_o=o+9;} - } - - //Add to 4 histgrams around pixel using linear interpolation - FLOAT yp=((FLOAT)y+0.5)/SBIN-0.5; - int iyp=(int)floor(yp); - int iypp=iyp+1; - FLOAT vy0=yp-(FLOAT)iyp; - FLOAT vy1=1.0-vy0; - v=sqrt(v); - int ODim=best_o*BLOCK_SQ; - FLOAT *Htemp = HHist+ODim; - FLOAT vx1Xv =vx1*v; - FLOAT vx0Xv = vx0*v; - - if(flagX) - { - if(iyp>=0) - { - *(Htemp+ ixp_b+iyp)+=vy1*vx1Xv; //1-少数をxyでかけたものにエッジ強度の2乗をかけたもの - *(Htemp+ ixpp_b+iyp)+=vy1*vx0Xv; - } - if (iypp=0) *(Htemp+ixp_b+iyp)+=vy1*vx1Xv; - if (iypp=0) *(Htemp+ixpp_b+iyp)+=vy1*vx0Xv; - if(iyppwidth; - printf("%d\n",width); - const int height = Input->height; - printf("%d\n",height); - const int nChannels = Input->nChannels; - printf("%d\n",nChannels); - const int SQ = height*width; - const int WS = Input->widthStep; - - FLOAT *Output = (FLOAT *)malloc(sizeof(FLOAT)*height*width*nChannels); - printf("%d",height*width*nChannels); - - FLOAT *R= Output; - FLOAT *G= Output+SQ; - FLOAT *B= Output+2*SQ; - char *IDATA = Input->imageData; - - //pick intensity of pixel (color) - for(int x=0;xIM,args->ISIZE,args->FSIZE,args->sbin); - args->Out =Out; - //_endthreadex(0); - //return(0); - pthread_exit((void*)thread_arg); -} - -//void initialize thread data -static void ini_thread_data(thread_data *TD,FLOAT *IM,int *INSIZE,int sbin,int level) -{ - TD->IM=IM; - //memcpy_s(TD->ISIZE,sizeof(int)*3,INSIZE,sizeof(int)*3); - memcpy(TD->ISIZE, INSIZE,sizeof(int)*3); - TD->FSIZE[0]=0; - TD->FSIZE[1]=0; - TD->sbin=sbin; - TD->F_C=level; -} - -//calculate feature pyramid (extended to main.cpp) -FLOAT **dpm_ttic_cpu_calc_f_pyramid(IplImage *Image,Model_info *MI,int *FTSIZE,FLOAT *scale) //calculate feature pyramid -{ - //constant parameters - const int max_scale = MI->max_scale; - const int interval = MI->interval; - const int sbin = MI->sbin; - const int sbin2 = (int)floor((double)sbin/2.0); - const int LEN = max_scale+interval; - const FLOAT sc = pow(2,(1.0/(double)interval)); - int INSIZE[3]={Image->height,Image->width,Image->nChannels}; - int RISIZE[3]={0,0,0},OUTSIZE[3] ={0,0,0}; - - //Original image (FLOAT) - FLOAT *D_I = Ipl_to_FLOAT(Image); - - //features - FLOAT **feat=(FLOAT**)malloc(sizeof(FLOAT*)*LEN); //Model information - - //thread for feature calculation - thread_data *td = (thread_data *)calloc(LEN, sizeof(thread_data)); - pthread_t *ts = (pthread_t *)calloc(LEN, sizeof(pthread_t)); - - FLOAT **RIM_S =(FLOAT**)calloc(LEN,sizeof(FLOAT*)); - - int *RI_S = (int*)calloc(interval*3,sizeof(int)); - FLOAT *RIM_T; - int t_count=0; - - //calculate resized image - for(int ii=0;iimax_scale+MI->interval; - if(features!=NULL) - { - for (int ii=0;ii -#include -#include - -//Header files -#include "MODEL_info.h" //File information -#include "common.hpp" - -#include "switch_float.h" -#include "get_boxes.hpp" -#include "dt.hpp" -#include "fconvsMT.hpp" - -static void free_rootmatch(FLOAT **rootmatch, MODEL *MO) -{ - if (rootmatch == nullptr) - return; - - for(int i = 0; i < MO->RF->NoR; i++) { - free(rootmatch[i]); - - } - s_free(rootmatch); -} - -//free part-matching result -static void free_partmatch(FLOAT **partmatch, MODEL *MO) -{ - if (partmatch == nullptr) - return; - - for(int i = 0; i < MO->PF->NoP; i++) { - s_free(partmatch[i]); - } - s_free(partmatch); -} - -//sub functions -//padd zeros to image -static FLOAT *padarray(FLOAT *feature,int *size,int padx,int pady) -{ - const int NEW_Y=size[0]+pady*2; - const int NEW_X=size[1]+padx*2; - const int L=NEW_Y*padx; - const int SPL=size[0]+pady; - const int M_S = sizeof(FLOAT)*size[0]; - FLOAT *new_feature = (FLOAT*)calloc(NEW_Y*NEW_X*size[2],sizeof(FLOAT)); // feature (pad-added) - FLOAT *P=new_feature; - FLOAT *S=feature; - - for(int ii=0;iithresh) - { - NUM++; - if(*P>MAX_SCORE) MAX_SCORE=*P; - } - P++; - } - - int *Out =(int*)malloc(NUM*2*sizeof(int)); - P=score; - - int ii=0,qq=0; - while(qqthresh) - { - Out[2*qq]=ii%ssize[0]; //Y coordinate of match - Out[2*qq+1]=ii/ssize[0]; //X coordinate of match - qq++; - } - ii++; - P++; - } - - *GMN = NUM; - return(Out); -} - -//get root-box pixel coordinate -static FLOAT *rootbox(int x,int y,FLOAT scale,int padx,int pady,int *rsize) -{ - FLOAT *Out=(FLOAT*)malloc(sizeof(FLOAT)*4); - Out[0]=((FLOAT)y-(FLOAT)pady+1)*scale; //Y1 - Out[1]=((FLOAT)x-(FLOAT)padx+1)*scale; //X1 - Out[2]=Out[0]+(FLOAT)rsize[0]*scale-1.0; //Y2 - Out[3]=Out[1]+(FLOAT)rsize[1]*scale-1.0; //X2 - return(Out); -} - -//get part-box pixel coordinate -static FLOAT *partbox(int x,int y,int ax,int ay,FLOAT scale,int padx,int pady,int *psize,int *lx,int *ly,int *ssize) -{ - FLOAT *Out=(FLOAT*)malloc(sizeof(FLOAT)*4); - int probex = (x-1)*2+ax; - int probey = (y-1)*2+ay; - int P = probey+probex*ssize[0]; - - FLOAT px = (FLOAT)lx[P]+1.0; - FLOAT py = (FLOAT)ly[P]+1.0; - - Out[0]=((py-2.0)/2.0+1.0-(FLOAT)pady)*scale; //Y1 - Out[1]=((px-2.0)/2.0+1.0-(FLOAT)padx)*scale; //X1 - Out[2]=Out[0]+(FLOAT)psize[0]*scale/2.0-1.0; //Y2 - Out[3]=Out[1]+(FLOAT)psize[1]*scale/2.0-1.0; //X2 - return(Out); -} - -//calculate accumulated HOG detector score -static void calc_a_score(FLOAT *ac_score,FLOAT *score,int *ssize,int *rsize,Model_info *MI,FLOAT scale) -{ - const int IHEI = MI->IM_HEIGHT; - const int IWID = MI->IM_WIDTH; - int pady_n = MI->pady; - int padx_n = MI->padx; - int block_pad = (int)(scale/2.0); - - int RY = (int)((FLOAT)rsize[0]*scale/2.0-1.0+block_pad); - int RX = (int)((FLOAT)rsize[1]*scale/2.0-1.0+block_pad); - - for(int ii=0;ii*PP) *PP=sc; //save max score - } - } - } - } -} - -//free detected boxes result -static void free_boxes(FLOAT **boxes, int LofFeat) -{ - if (boxes == nullptr) - return; - - for(int i = 0; i < LofFeat; i++) - { - s_free(boxes[i]); - } - s_free(boxes); -} - -//detect boundary box -FLOAT *dpm_ttic_cpu_get_boxes(FLOAT **features,FLOAT *scales,int *FSIZE,MODEL *MO, - int *Dnum,FLOAT *A_SCORE,FLOAT thresh) -{ - //constant parameters - const int max_scale = MO->MI->max_scale; - const int interval = MO->MI->interval; - const int sbin = MO->MI->sbin; - const int padx = MO->MI->padx; - const int pady = MO->MI->pady; - const int NoR = MO->RF->NoR; - const int NoP = MO->PF->NoP; - const int NoC = MO->MI->numcomponent; - const int *numpart = MO->MI->numpart; - const int LofFeat=(max_scale+interval)*NoC; - const int L_MAX = max_scale+interval; - - /* for measurement */ - struct timeval tv; - struct timeval tv_root_score_start, tv_root_score_end; - float time_root_score = 0; - struct timeval tv_part_score_start, tv_part_score_end; - float time_part_score = 0; - struct timeval tv_dt_start, tv_dt_end; - float time_dt = 0; - struct timeval tv_calc_a_score_start, tv_calc_a_score_end; - float time_calc_a_score = 0; - - int **RF_size = MO->RF->root_size; - int *rootsym = MO->RF->rootsym; - int *part_sym = MO->PF->part_sym; - int **part_size = MO->PF->part_size; - FLOAT **rootfilter = MO->RF->rootfilter; - FLOAT **partfilter=MO->PF->partfilter; - int **psize = MO->MI->psize; - - int *rm_size = (int*)malloc(sizeof(int)*NoC*2); //size of root-matching-score-matrix - int *pm_size = (int*)malloc(sizeof(int)*NoP*2); //size of part-matching-score-matrix - - FLOAT **Tboxes=(FLOAT**)calloc(LofFeat,sizeof(FLOAT*)); //box coordinate information(Temp) - int *b_nums =(int*)calloc(LofFeat,sizeof(int)); //length of Tboxes - int count = 0; - int D_NUMS=0; //number of detected boundary box - - ///////level - for (int level=interval;levelMI->max_Y ||(FSIZE[level*2+1]+2*padxMI->max_X)) - { - Tboxes[count]=nullptr; - count++; - continue; - } - - ///////root calculation///////// - - //convolve feature maps with filters - int PADsize[3]={FSIZE[level*2],FSIZE[level*2+1],31}; - FLOAT *featp=padarray(features[level],PADsize,padx,pady); //pad zero to matrix - FLOAT *flipfeat =flip_feat(featp,PADsize); //flip features (to reduce calculation time) - - //calculate model score (only root) - gettimeofday(&tv_root_score_start, nullptr); - rootmatch = dpm_ttic_cpu_fconvsMT(featp,flipfeat,rootfilter,rootsym,1,NoR,PADsize,RF_size,rm_size); - gettimeofday(&tv_root_score_end, nullptr); - tvsub(&tv_root_score_end, &tv_root_score_start, &tv); - time_root_score += tv.tv_sec * 1000.0 + (float)tv.tv_usec / 1000.0; - - //release feature - s_free(featp); - s_free(flipfeat); - - ///////part calculation///////// - if(NoP>0) - { - //convolve feature maps with filters - int PADsize2[3]={FSIZE[L*2],FSIZE[L*2+1],31}; - featp=padarray(features[L],PADsize2,padx*2,pady*2); //pad zero to matrix - flipfeat=flip_feat(featp,PADsize2); //flip features (to reduce calculation time) - - //calculate model score (only part) - gettimeofday(&tv_part_score_start, nullptr); - partmatch = dpm_ttic_cpu_fconvsMT(featp,flipfeat,partfilter,part_sym,1, - NoP,PADsize2,part_size,pm_size); - gettimeofday(&tv_part_score_end, nullptr); - tvsub(&tv_part_score_end, &tv_part_score_start, &tv); - time_part_score += tv.tv_sec * 1000.0 + (float)tv.tv_usec / 1000.0; - - //release feature - s_free(featp); - s_free(flipfeat); - } - - ////nucom - //combine root and part score and detect boundary box for each-component - for(int jj=0;jjMI->ridx[jj]; //root-index - int RL_S =sizeof(FLOAT)*RL; - - FLOAT OFF = MO->MI->offw[RI]; //offset information - FLOAT *SCORE = (FLOAT*)malloc(RL_S); //Matching score matrix - - //add offset - //memcpy_s(SCORE,RL_S,rootmatch[jj],RL_S); - memcpy(SCORE, rootmatch[jj],RL_S); - FLOAT *SC_S = SCORE; - FLOAT *SC_E = SCORE+RL; - while(SC_S0) - { - for (int kk=0;kkMI->didx[jj][kk]; - int DID_4 = DIDX*4; - int PIDX = MO->MI->pidx[jj][kk]; - //anchor - ax[kk] = MO->MI->anchor[DIDX*2]+1; - ay[kk] = MO->MI->anchor[DIDX*2+1]+1; - //set part-match - FLOAT *match = partmatch[PIDX]; - //size of part-matching - int PSSIZE[2] ={pm_size[PIDX*2],pm_size[PIDX*2+1]}; - - FLOAT *Q = match; - for(int ss=0;ssMI->def[DID_4],MO->MI->def[DID_4+1], - MO->MI->def[DID_4+2],MO->MI->def[DID_4+3], - PSSIZE,Ix[kk],Iy[kk]); - gettimeofday(&tv_dt_end, nullptr); - tvsub(&tv_dt_end, &tv_dt_start, &tv); - time_dt += tv.tv_sec * 1000.0 + (float)tv.tv_usec / 1000.0; - - //add part score - dpm_ttic_add_part_calculation(SCORE,M,R_S,PSSIZE,ax[kk],ay[kk]); - s_free(M); - } - } - - //get all good matches - int GMN; - int *GMPC = get_gmpc(SCORE,thresh,R_S,&GMN); - int RSIZE[2]={MO->MI->rsize[jj*2],MO->MI->rsize[jj*2+1]}; - - int GL = (numpart[jj]+1)*4+3; //31 - - //calculate accumulated score - gettimeofday(&tv_calc_a_score_start, nullptr); - calc_a_score(A_SCORE,SCORE,R_S,RSIZE,MO->MI,scale); - gettimeofday(&tv_calc_a_score_end, nullptr); - tvsub(&tv_calc_a_score_end, &tv_calc_a_score_start, &tv); - time_calc_a_score += tv.tv_sec * 1000.0 + (float)tv.tv_usec / 1000.0; - - - //detected box coordinate(current level) - FLOAT *t_boxes = (FLOAT*)calloc(GMN*GL,sizeof(FLOAT)); - - for(int kk=0;kkMI->pidx[jj][pp]*2],pm_size[MO->MI->pidx[jj][pp]*2+1]}; - - //calculate part box coordinate - FLOAT *PB = partbox(x,y,ax[pp],ay[pp],scale,padx,pady,PBSIZE,Ix[pp],Iy[pp],Isize); - //memcpy_s(P_temp,sizeof(FLOAT)*4,PB,sizeof(FLOAT)*4); - memcpy(P_temp, PB,sizeof(FLOAT)*4); - P_temp+=4; - s_free(PB); - } - //component number and score - *(P_temp++)=(FLOAT)jj; //component number - *(P_temp++)=SCORE[x*R_S[0]+y]; //score of good match - *P_temp = scale; - } - - //save box information - if(GMN>0) Tboxes[count]=t_boxes; - else Tboxes[count]=nullptr; - b_nums[count]=GMN; - count++; - D_NUMS+=GMN; //number of detected box - - //release - s_free(GMPC); - s_free(SCORE); - s_free(ax); - s_free(ay); - - for(int ss=0;ss0) - { - memcpy(T1, T2,sizeof(FLOAT)*num_t); - T1+=num_t; - } - } - - FLOAT AS_OFF = std::abs(thresh); - - //accumulated score calculation - FLOAT max_ac = 0.0; - - //add offset to accumulated score - for(int ii=0;iiMI->IM_HEIGHT*MO->MI->IM_WIDTH;ii++) - { - if(A_SCORE[ii]max_ac) max_ac=A_SCORE[ii]; - } - } - //normalization - if(max_ac>0.0) - { - FLOAT ac_ratio = 1.0/max_ac; - for(int ii=0;iiMI->IM_HEIGHT*MO->MI->IM_WIDTH;ii++){A_SCORE[ii]*=ac_ratio;} - } - - //release - free_boxes(Tboxes,LofFeat); - s_free(b_nums); - - //output result - *Dnum=D_NUMS; - return(boxes); -} diff --git a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/get_boxes.hpp b/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/get_boxes.hpp deleted file mode 100644 index b260dedb136..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/get_boxes.hpp +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef _GET_BOXES_H_ -#define _GET_BOXES_H_ - -#include "switch_float.h" - -//Object-detection function (extended to main) -FLOAT *dpm_ttic_cpu_get_boxes(FLOAT **features,FLOAT *scales,int *FSIZE,MODEL *MO,int *Dnum,FLOAT *A_SCORE,FLOAT thresh); - -#endif /* _GET_BOXES_H_ */ diff --git a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/load_model.cpp b/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/load_model.cpp deleted file mode 100755 index 009aaace110..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/load_model.cpp +++ /dev/null @@ -1,303 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////Car tracking project with laser_radar_data_fusion///////////////////////////////////////// -//////////////////////////////////////////////////////////////////////Copyright 2009-10 Akihiro Takeuchi/////////// - -/////load_model.cpp load detection-model information //////////////////////////////////////////////////////////// - -//C++ library -#include -#include -#include - -//Header files -#include "MODEL_info.h" //Model-structure definition -#include "common.hpp" - -#include "switch_float.h" - -#ifdef FLOAT_IS_float -#define FLOAT_SCAN_FMT "%f," -#else -#define FLOAT_SCAN_FMT "%lf," -#endif - -#define FLOAT_SCAN_FMT2 FLOAT_SCAN_FMT FLOAT_SCAN_FMT -#define FLOAT_SCAN_FMT3 FLOAT_SCAN_FMT2 FLOAT_SCAN_FMT -#define FLOAT_SCAN_FMT4 FLOAT_SCAN_FMT3 FLOAT_SCAN_FMT - -//load model basic information -static Model_info *load_modelinfo(const char *filename) -{ - FILE *file; //File - Model_info *MI=(Model_info*)malloc(sizeof(Model_info)); //Model information - - if( (file=fopen(filename, "r")) == NULL ) - { - printf("Model information file not found \n"); - exit(-1); - } - FLOAT t1,t2,t3,t4; - - //load basic information - fscanf(file,FLOAT_SCAN_FMT,&t1); - MI->numcomponent=(int)t1; //number of components - fscanf(file,FLOAT_SCAN_FMT,&t1); - MI->sbin=(int)t1; //sbin - fscanf(file,FLOAT_SCAN_FMT,&t1); - MI->interval=(int)t1; //interval - fscanf(file,FLOAT_SCAN_FMT,&t1); - MI->max_Y=(int)t1; //max_Y - fscanf(file,FLOAT_SCAN_FMT,&t1); - MI->max_X=(int)t1; //max_X - - //root filter information - MI->ridx = (int*)malloc(sizeof(int)*MI->numcomponent); - MI->oidx = (int*)malloc(sizeof(int)*MI->numcomponent); - MI->offw = (FLOAT*)malloc(sizeof(FLOAT)*MI->numcomponent); - MI->rsize = (int*)malloc(sizeof(int)*MI->numcomponent*2); - MI->numpart = (int*)malloc(sizeof(int)*MI->numcomponent); - - //part filter information - MI->pidx = (int**)malloc(sizeof(int*)*MI->numcomponent); - MI->didx = (int**)malloc(sizeof(int*)*MI->numcomponent); - MI->psize = (int**)malloc(sizeof(int*)*MI->numcomponent); - - for(int ii=0;iinumcomponent;ii++) //LOOP (component) - { - fscanf(file,FLOAT_SCAN_FMT,&t1); - MI->ridx[ii]=(int)t1-1; //root index - fscanf(file,FLOAT_SCAN_FMT,&t1); - MI->oidx[ii]=(int)t1-1; //offset index - fscanf(file,FLOAT_SCAN_FMT,&t1); - MI->offw[ii]=t1; //offset weight (FLOAT) - fscanf(file,FLOAT_SCAN_FMT2,&t1,&t2); - MI->rsize[ii*2]=(int)t1; //rsize (Y) - MI->rsize[ii*2+1]=(int)t2; //rsize (X) - fscanf(file,FLOAT_SCAN_FMT,&t1); - MI->numpart[ii]=(int)t1; //number of part filter - - - MI->pidx[ii]=(int*)malloc(sizeof(int)*MI->numpart[ii]); - MI->didx[ii]=(int*)malloc(sizeof(int)*MI->numpart[ii]); - MI->psize[ii]=(int*)malloc(sizeof(int)*MI->numpart[ii]*2); - - for(int jj=0;jjnumpart[ii];jj++) //LOOP (part-filter) - { - fscanf(file,FLOAT_SCAN_FMT,&t1); - MI->pidx[ii][jj]=(int)t1-1; //part index - fscanf(file,FLOAT_SCAN_FMT,&t1); - MI->didx[ii][jj]=(int)t1-1; //define-index of part - fscanf(file,FLOAT_SCAN_FMT2,&t1,&t2); - MI->psize[ii][jj*2]=(int)t1; - MI->psize[ii][jj*2+1]=(int)t2; - } - } - - //get defs information - fscanf(file,FLOAT_SCAN_FMT,&t1); - - int DefL = int(t1); - MI->def = (FLOAT*)malloc(sizeof(FLOAT)*DefL*4); - MI->anchor = (int*)malloc(sizeof(int)*DefL*2); - - for (int kk=0;kkdef[kk*4]=t1; - MI->def[kk*4+1]=t2; - MI->def[kk*4+2]=t3; - MI->def[kk*4+3]=t4; - fscanf(file,FLOAT_SCAN_FMT2,&t1,&t2); - MI->anchor[kk*2]=(int)t1; - MI->anchor[kk*2+1]=(int)t2; - } - - //get least_square information - MI->x1 = (FLOAT **)malloc(sizeof(FLOAT*)*MI->numcomponent); - MI->x2 = (FLOAT **)malloc(sizeof(FLOAT*)*MI->numcomponent); - MI->y1 = (FLOAT **)malloc(sizeof(FLOAT*)*MI->numcomponent); - MI->y2 = (FLOAT **)malloc(sizeof(FLOAT*)*MI->numcomponent); - - for(int ii=0;iinumcomponent;ii++) - { - int GL = 1+2*(1+MI->numpart[ii]); - MI->x1[ii] =(FLOAT *)malloc(sizeof(FLOAT)*GL); - MI->y1[ii] =(FLOAT *)malloc(sizeof(FLOAT)*GL); - MI->x2[ii] =(FLOAT *)malloc(sizeof(FLOAT)*GL); - MI->y2[ii] =(FLOAT *)malloc(sizeof(FLOAT)*GL); - - for (int jj=0;jjx1[ii][jj]=t1;} - for (int jj=0;jjy1[ii][jj]=t1;} - for (int jj=0;jjx2[ii][jj]=t1;} - for (int jj=0;jjy2[ii][jj]=t1;} - } - - MI->padx=(int)ceil((FLOAT)MI->max_X/2.0+1.0); //padx - MI->pady=(int)ceil((FLOAT)MI->max_Y/2.0+1.0); //padY - - MI->ini=true; - - - //fclose - fclose(file); - - return(MI); -} - -static Rootfilters *load_rootfilter(const char *filename) -{ - FILE *file; - Rootfilters *RF=(Rootfilters*)malloc(sizeof(Rootfilters)); //Root filter - - if( (file=fopen(filename, "r"))==NULL ) - { - printf("Root-filter file not found \n"); - exit(-1); - } - - FLOAT t1,t2,t3; - fscanf(file,FLOAT_SCAN_FMT,&t1); - RF->NoR=(int)t1; //number of root filter - - RF->root_size=(int**)malloc(sizeof(int*)*RF->NoR); //size of root filter - RF->rootfilter=(FLOAT**)malloc(sizeof(FLOAT*)*RF->NoR); //weight of root filter - RF->rootsym=(int*)malloc(sizeof(int)*RF->NoR); //symmetric information of root - - for (int ii=0;iiNoR;ii++) - { - fscanf(file,FLOAT_SCAN_FMT3,&t1,&t2,&t3); //number of components - RF->root_size[ii]=(int*)malloc(sizeof(int)*3); - RF->root_size[ii][0]=(int)t1; - RF->root_size[ii][1]=(int)t2; - RF->root_size[ii][2]=(int)t3; - int NUMB=RF->root_size[ii][0]*RF->root_size[ii][1]*RF->root_size[ii][2]; - RF->rootfilter[ii]=(FLOAT*)malloc(sizeof(FLOAT)*NUMB); //weight of root filter - for (int jj=0;jjrootfilter[ii][jj]=t1; - } - RF->rootsym[ii]=1; - - //test - printf("root No.%d size %d %d \n",ii,RF->root_size[ii][0],RF->root_size[ii][1]); - - } - - //fclose - fclose(file); - return(RF); -} - -static Partfilters *load_partfilter(const char *filename) -{ - FILE *file; - Partfilters *PF=(Partfilters*)malloc(sizeof(Partfilters)); //Part filter - - //fopen - if( (file=fopen(filename, "r"))==NULL ) - { - printf("Part-filter file not found \n"); - exit(-1); - } - - FLOAT t1,t2,t3; - fscanf(file,FLOAT_SCAN_FMT,&t1); - PF->NoP=(int)t1; //number of part filter - - PF->part_size=(int**)malloc(sizeof(int*)*PF->NoP); //size of part filter - PF->partfilter=(FLOAT**)malloc(sizeof(FLOAT*)*PF->NoP); //weight of part filter - PF->part_partner=(int*)malloc(sizeof(int)*PF->NoP); //symmetric information of part - PF->part_sym=(int*)malloc(sizeof(int)*PF->NoP); //symmetric information of part - - - for (int ii=0;iiNoP;ii++) - { - fscanf(file,FLOAT_SCAN_FMT3,&t1,&t2,&t3); //number of components - PF->part_size[ii]=(int*)malloc(sizeof(int)*3); - PF->part_size[ii][0]=(int)t1; - PF->part_size[ii][1]=(int)t2; - PF->part_size[ii][2]=(int)t3; - //printf("%f %f %f\n",t1,t2,t3); - int NUMB=PF->part_size[ii][0]*PF->part_size[ii][1]*PF->part_size[ii][2]; - PF->partfilter[ii]=(FLOAT*)malloc(sizeof(FLOAT)*NUMB); //weight of root filter - for (int jj=0;jjpartfilter[ii][jj]=t1; - } - - fscanf(file,FLOAT_SCAN_FMT,&t1); - PF->part_partner[ii]=(int)t1; //symmetric information of part - if(PF->part_partner[ii]==0) PF->part_sym[ii]=1; - else PF->part_sym[ii]=0; - } - //fclose - fclose(file); - return(PF); -} - -//load model infroamtion -MODEL *dpm_ttic_cpu_load_model(FLOAT ratio, const char *com_csv, const char *root_csv, const char *part_csv) -{ - MODEL *model = (MODEL*)malloc(sizeof(MODEL)); - - model->MI = load_modelinfo(com_csv); - model->RF = load_rootfilter(root_csv); - model->PF = load_partfilter(part_csv); - model->MI->ratio = ratio; - - model->MI->padx = 0; - model->MI->pady = 0; - - return model; -} - -//release model -void dpm_ttic_cpu_free_model(MODEL *MO) -{ - //free model information - for(int ii=0;iiMI->numcomponent;ii++) - { - s_free(MO->MI->didx[ii]); - s_free(MO->MI->pidx[ii]); - s_free(MO->MI->psize[ii]); - s_free(MO->MI->x1[ii]); - s_free(MO->MI->x2[ii]); - s_free(MO->MI->y1[ii]); - s_free(MO->MI->y2[ii]); - } - s_free(MO->MI->anchor); - s_free(MO->MI->def); - s_free(MO->MI->numpart); - s_free(MO->MI->offw); - s_free(MO->MI->oidx); - s_free(MO->MI->ridx); - s_free(MO->MI->rsize); - s_free(MO->MI->x1); - s_free(MO->MI->x2); - s_free(MO->MI->y1); - s_free(MO->MI->y2); - s_free(MO->MI); - - //free root-filter information - for(int ii=0;iiRF->NoR;ii++) - { - s_free(MO->RF->root_size[ii]); - s_free(MO->RF->rootfilter[ii]); - } - s_free(MO->RF->rootsym); - s_free(MO->RF); - - //free root-filter information - for(int ii=0;iiPF->NoP;ii++) - { - s_free(MO->PF->part_size[ii]); - s_free(MO->PF->partfilter[ii]); - } - s_free(MO->PF->part_partner); - s_free(MO->PF->part_sym); - s_free(MO->PF); - - s_free(MO); -} diff --git a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/load_model.hpp b/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/load_model.hpp deleted file mode 100644 index f5b843c4989..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/load_model.hpp +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef _LOAD_MODEL_H_ -#define _LOAD_MODEL_H_ - -#include "switch_float.h" -#include "MODEL_info.h" - -extern MODEL *dpm_ttic_cpu_load_model(FLOAT ratio, const char *com_csv, const char *root_csv, const char *part_csv); -extern void dpm_ttic_cpu_free_model(MODEL *MO); - -#endif /* _LOAD_MODEL_H_ */ diff --git a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/main.cpp b/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/main.cpp deleted file mode 100644 index a2f2b2d6c33..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/main.cpp +++ /dev/null @@ -1,75 +0,0 @@ -/// Car tracking project with laser_radar_data_fusion -/// Copyright 2009-10 Akihiro Takeuchi - -///main.cpp main function of car tracking - -//OpenCV library - -#include -#include - -#include - -#include "MODEL_info.h" -#include "switch_float.h" -#include "detect.hpp" -#include "load_model.hpp" - -DPMTTIC::DPMTTIC(const char *com_csv, const char *root_csv, const char *part_csv) -{ - constexpr double RATIO = 1; - model_ = dpm_ttic_cpu_load_model(RATIO, com_csv, root_csv, part_csv); -} - -DPMTTIC::~DPMTTIC() -{ - dpm_ttic_cpu_free_model(model_); -} - -static FLOAT *init_accumulated_score(IplImage *image) -{ - int size = image->height * image->width; - FLOAT *score = (FLOAT *)calloc(size,sizeof(FLOAT)); - - for(int i = 0; i < size; ++i) - score[i] = -100.0; - - return score; -} - -DPMTTICResult DPMTTIC::detect_objects(IplImage *image, const DPMTTICParam& param) -{ - // model_->MI->interval = param.lambda; - // model_->MI->sbin = param.num_cells; - - int detected_objects; - FLOAT *ac_score = init_accumulated_score(image); - RESULT *cars = dpm_ttic_cpu_car_detection(image, model_, param.threshold, &detected_objects, ac_score, - param.overlap); - free(ac_score); - - DPMTTICResult result; - result.num = cars->num; - for (int i = 0; i < cars->num; ++i) { - result.type.push_back(cars->type[i]); - } - - for (int i = 0; i < cars->num; ++i) { - int base = i * 4; - int *data = &(cars->OR_point[base]); - - result.corner_points.push_back(data[0]); - result.corner_points.push_back(data[1]); - result.corner_points.push_back(data[2] - data[0]); - result.corner_points.push_back(data[3] - data[1]); - result.score.push_back(cars->score[i]); - } - - free(cars->point); - free(cars->type); - free(cars->scale); - free(cars->score); - free(cars->IM); - - return result; -} diff --git a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/nms.cpp b/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/nms.cpp deleted file mode 100755 index 2eadfc527a1..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/nms.cpp +++ /dev/null @@ -1,181 +0,0 @@ -/////////////////////////Car tracking project with laser_radar_data_fusion///////////////////////////////////////// -//////////////////////////////////////////////////////////////////////Copyright 2009-10 Akihiro Takeuchi/////////// - -/////nms.cpp non_maximum suppression of detected box //////////////////////////////////////////////////////////// - -//C++ include header -#include -#include -#include - -#include "MODEL_info.h" //File information -#include "switch_float.h" -#include "nms.hpp" - -//inline function(Why does not use standard library ?) -static inline FLOAT max_d(FLOAT x,FLOAT y) -{ - return (x >= y ? x : y); -} - -static inline FLOAT min_d(FLOAT x,FLOAT y) -{ - return (x <= y ? x : y); -} - -//sub functions -static inline void exchangeOfValues(FLOAT *x , FLOAT *y) -{ - FLOAT tmp; - tmp = *x; *x = *y ; *y = tmp; - return; -} - -static inline void exchangeOfOrders(int *x , int *y) -{ - int tmp; - tmp = *x; *x = *y ; *y = tmp; - return; -} - -static void quickSort(FLOAT *ary , int *Order, int first_index , int last_index) -{ - int i = first_index, j = last_index; - FLOAT key = *(ary + (first_index + last_index) / 2); - - while(1) { - while (*(ary + i ) > key) i++; - while (*(ary + j ) < key) j--; - if (i >= j) - break; - exchangeOfValues(ary + i , ary + j); - exchangeOfOrders(&Order[i],&Order[j]); - i++; j--; - } - if (first_index < i - 1) - quickSort(ary , Order,first_index , i - 1); - if (last_index > j + 1) - quickSort(ary , Order,j + 1 , last_index); -} - -FLOAT *dpm_ttic_cpu_nms(FLOAT *boxes,FLOAT overlap,int *num,MODEL *MO) -{ - int NUM = *num; - if (NUM <= 0) - return nullptr; - - const int *numpart = MO->MI->numpart; - const int GL = (numpart[0]+1)*4+3; - FLOAT *area = (FLOAT*)calloc(NUM,sizeof(FLOAT)); - FLOAT *scores = (FLOAT*)calloc(NUM,sizeof(FLOAT)); - int *sorted_orders = (int *)calloc(NUM,sizeof(int)); - FLOAT *P=boxes; - //calculate area of each boundary-box - - FLOAT *score_t = scores; - int *so_t =sorted_orders; - for(int ii=0;ii0) - { - int A=sorted_orders[cur]; - P=boxes+GL*A; - FLOAT Ay1 = P[0]; - FLOAT Ax1 = P[1]; - FLOAT Ay2 = P[2]; - FLOAT Ax2 = P[3]; - checked[A]=1; - cnum--; - cur++; - pi_num++; - - for(int kk=cur;kk0&&h>0) - { - FLOAT o = w*h/R_AREA; //compute overlap - if(o>overlap) - { - checked[B]=-1; //suppress - cnum--; - } - } - //full over-lap - else if(Ay1P[2]&&Ax2>P[3]) - { - checked[B]=-1; //suppress - cnum--; - } - else if(Ay1>P[0]&&Ax1>P[1]&&Ay2 -#include -#include - -#include "common.hpp" -#include "switch_float.h" -#include "resize.hpp" - -// struct used for caching interpolation values -struct alphainfo { - int si, di; - FLOAT alpha; -}; - -//sub functions -// copy src into dst using precomputed interpolation values -static inline void alphacopy(FLOAT *src, FLOAT *dst, struct alphainfo *ofs, int n) -{ - struct alphainfo *end = ofs + n; - while (ofs != end) - { - dst[ofs->di] += ofs->alpha * src[ofs->si]; - ofs++; - } -} - -// resize along each column -// result is transposed, so we can apply it twice for a complete resize -static void resize1dtran(FLOAT *src, int sheight, FLOAT *dst, int dheight, int width, int chan) -{ - FLOAT scale = (FLOAT)dheight/(FLOAT)sheight; - FLOAT invscale = (FLOAT)sheight/(FLOAT)dheight; - // we cache the interpolation values since they can be - // shared among different columns - int len = (int)(dheight*invscale+0.99) + 2*dheight; - alphainfo *ofs; - ofs = (alphainfo*)malloc(sizeof(alphainfo)*len); - int WD =width*dheight; - int WS =width*sheight; - - int k = 0; - for (int dy = 0; dy < dheight; dy++) - { - FLOAT fsy1 = dy * invscale; - FLOAT fsy2 = fsy1 + invscale; - int sy1 = (int)(fsy1+0.99); - int sy2 = (int)fsy2; - int dyW = dy*width; - - if (sy1 - fsy1 > 1e-3) { - ofs[k].di = dyW; - ofs[k].si = sy1-1; - ofs[k++].alpha = (sy1 - fsy1) * scale; - } - - for (int sy = sy1; sy < sy2; sy++) - { - ofs[k].di = dyW; - ofs[k].si = sy; - ofs[k++].alpha = scale; - } - - if (fsy2 - sy2 > 1e-3) - { - ofs[k].di = dyW; - ofs[k].si = sy2; - ofs[k++].alpha = (fsy2 - sy2) * scale; - } - } - // resize each column of each color channel - memset(dst,0, chan*WD*sizeof(FLOAT)); - for (int c = 0; c < chan; c++) - { - int CWS = c*WS; - int CWD = c*WD; - FLOAT *s = src + CWS; - FLOAT *d = dst + CWD; - for (int x = 0; x < width; x++) { - alphacopy(s, d, ofs, k); - s+=sheight; - d++; - } - } - - free(ofs); -} - -// main function (resize) -// takes a FLOAT color image and a scaling factor -// returns resized image -FLOAT *dpm_ttic_cpu_resize(FLOAT *src,int *sdims,int *odims,FLOAT scale) -{ - FLOAT *dst; - if(scale==1.0) - { - memcpy(odims, sdims,sizeof(int)*3); - int DL = odims[0]*odims[1]*odims[2]; - dst = (FLOAT*)calloc(DL,sizeof(FLOAT)); - memcpy(dst, src,sizeof(FLOAT)*DL); - } - else - { - odims[0] = (int)((FLOAT)sdims[0]*scale+0.5); - odims[1] = (int)((FLOAT)sdims[1]*scale+0.5); - odims[2] = sdims[2]; - dst = (FLOAT*)calloc(odims[0]*odims[1]*sdims[2],sizeof(FLOAT)); - FLOAT *tmp = (FLOAT*)calloc(odims[0]*sdims[1]*sdims[2],sizeof(FLOAT)); - resize1dtran(src, sdims[0], tmp, odims[0], sdims[1], sdims[2]); - resize1dtran(tmp, sdims[1], dst, odims[1], odims[0], sdims[2]); - free(tmp); - } - return(dst); -} diff --git a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/resize.hpp b/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/resize.hpp deleted file mode 100644 index 56fbe3238b5..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/resize.hpp +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef _RESIZE_H_ -#define _RESIZE_H_ - -#include "switch_float.h" - -extern FLOAT *dpm_ttic_cpu_resize(FLOAT *src,int *sdims,int *odims,FLOAT scale); //resize image - -#endif /* _RESIZE_H_ */ diff --git a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/switch_float.h b/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/switch_float.h deleted file mode 100644 index f9af6a0abbd..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/switch_float.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef _SWITCH_FLOAT_H_ -#define _SWITCH_FLOAT_H_ - -/* typedef to switch float and double */ -#define FLOAT_IS_float -typedef float FLOAT; -//typedef double FLOAT; - -#ifndef TVSUB -#define TVSUB - -/* for measurement */ -#include -/* tvsub: ret = x - y. */ -static inline void tvsub( - struct timeval *x, - struct timeval *y, - struct timeval *ret) -{ - ret->tv_sec = x->tv_sec - y->tv_sec; - ret->tv_usec = x->tv_usec - y->tv_usec; - if (ret->tv_usec < 0) { - ret->tv_sec--; - ret->tv_usec += 1000000; - } -} -/* for measurement */ -#endif - -#endif /* _SWITCH_FLOAT_H_ */ diff --git a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/tracking.cpp b/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/tracking.cpp deleted file mode 100755 index a5362e12b75..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/tracking.cpp +++ /dev/null @@ -1,120 +0,0 @@ -/////////////////////////Car tracking project with laser_radar_data_fusion///////////////////////////////////////// -//////////////////////////////////////////////////////////////////////Copyright 2009-10 Akihiro Takeuchi/////////// - -/////tracking.cpp calculate_time-variation information ////////////////////////////////////////////////////////// - -//OpenCV library -#include -#include -#include -//C++ library -#include -#include -#include -#include - -#include "MODEL_info.h" //Model-structure definition -#include "common.hpp" - -#include "switch_float.h" -#include "tracking.hpp" - -//create new_result data -static RESULT *create_result(int num) -{ - RESULT *RES = (RESULT *)malloc(sizeof(RESULT)); - RES->num=num; - if(num==0) - { - RES->point = NULL; - RES->type = NULL; - RES->score = NULL; - RES->scale = NULL; - RES->IM = NULL; - RES->OR_point = NULL; - } - else - { - RES->point = (int *)calloc(num*4,sizeof(int)); - RES->OR_point = (int *)calloc(num*4,sizeof(int)); - RES->type = (int *)calloc(num,sizeof(int)); - RES->score = (FLOAT *)calloc(num,sizeof(FLOAT)); - RES->scale = (FLOAT *)calloc(num,sizeof(FLOAT)); - RES->IM = (IplImage **)malloc(sizeof(IplImage *)*num); - } - return(RES); -} - -//get new_rectangle information -RESULT *dpm_ttic_cpu_get_new_rects(IplImage *Image,MODEL *MO,FLOAT *boxes,int *NUM) -{ - const int *numpart = MO->MI->numpart; - const int GL = (numpart[0]+1)*4+3; - const FLOAT ratio = MO->MI->ratio; - - int LL = GL-3; - FLOAT **x1 = MO->MI->x1; FLOAT **x2 = MO->MI->x2; - FLOAT **y1 = MO->MI->y1; FLOAT **y2 = MO->MI->y2; - int ML = 1+2*(1+numpart[0]); - - RESULT *CUR =create_result(*NUM); - - //no_rectangle was detected - if(*NUM==0) return(CUR); - - FLOAT *Avec = (FLOAT *)calloc(ML,sizeof(FLOAT)); - for(int ii=0;ii<*NUM;ii++) - { - FLOAT *P = boxes+GL*ii; - FLOAT *Avec_T = Avec; - int CNUM = (int)(*(P+GL-3)); - int PP[4]; - - *(Avec_T++)=P[3]-P[1]; - - for(int kk=0;kk0) {PP[0]=(int)XP1;} - else {PP[0]=0;} - if(YP1>0) {PP[1]=(int)YP1;} - else {PP[1]=0;} - if(XP2width){PP[2]=(int)XP2;} - else {PP[2]=Image->width;} - if(YP2height) {PP[3]=(int)YP2;} - else {PP[3]=Image->height;} - //memcpy_s(CUR->point+ii*4,4*sizeof(int),PP,4*sizeof(int)); - memcpy(CUR->point+ii*4, PP,4*sizeof(int)); - CUR->scale[ii]=*(P+GL-1); CUR->score[ii]=*(P+GL-2); CUR->type[ii] = CNUM; - - //calculate image coodinate for ORIGINAL-scale-image[640x480] - int *OPP = CUR->OR_point+ii*4; - OPP[0] = (int)((FLOAT)PP[0]/ratio); - OPP[1] = (int)((FLOAT)PP[1]/ratio); - OPP[2] = (int)((FLOAT)PP[2]/ratio); - OPP[3] = (int)((FLOAT)PP[3]/ratio); - - //for debug - printf("scale:%f score:%f type:%d\n",CUR->scale[ii],CUR->score[ii],CUR->type[ii]); - } - s_free(Avec); - return(CUR); -} - diff --git a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/tracking.hpp b/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/tracking.hpp deleted file mode 100644 index d3e2e83622e..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/cpu/tracking.hpp +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef _TRACKING_H_ -#define _TRACKING_H_ - -#include "MODEL_info.h" -#include "switch_float.h" - -//get new_rectangle pixel_point -extern RESULT *dpm_ttic_cpu_get_new_rects(IplImage *Image,MODEL *MO,FLOAT *boxes,int *NUM); - -#endif /* _TRACKING_H_ */ diff --git a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/GPU_function.cu b/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/GPU_function.cu deleted file mode 100644 index 5a5afaa3aa6..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/GPU_function.cu +++ /dev/null @@ -1,1703 +0,0 @@ -#include -#include -#include -#include "for_use_GPU.h" -#include "switch_release.h" -#define FROM_GPU -#include "switch_float.h" - -/* declaration of texture memory */ -//texture A; -//texture B; -texture A; -texture B; -texture A_double; -texture B_double; - -//thread process -// convolve A and B(non_symmetric) -//unsigned __stdcall process(void *thread_arg) { - -/********************************************/ -/* function for calculating root */ -/********************************************/ -extern "C" -__global__ -void -process_root -( - //FLOAT *A, - //FLOAT *B, - FLOAT *C, - int *A_dims_array, - int *B_dims_array, - int len, - int interval, - int L_MAX, - int *error_array, - int error_array_num, - int pid, - int device_number -) -{ - int idx_x = blockIdx.x * blockDim.x + threadIdx.x; - int idx_y = blockIdx.y * blockDim.y + threadIdx.y; - int ii = blockIdx.z % len; - int level = blockIdx.z / len; - - int A_dims[3] = { A_dims_array[level*3], A_dims_array[level*3+1], A_dims_array[level*3+2] }; - int B_dims[3] = { B_dims_array[ii*3], B_dims_array[ii*3+1], B_dims_array[ii*3+2] }; - int C_dims[2] = { A_dims[0] - B_dims[0] + 1, A_dims[1] - B_dims[1] + 1 }; - - int C_x = C_dims[1]/device_number; - - if(C_dims[1]%device_number != 0){ - C_x++; - } - - idx_x = idx_x + pid * C_x; - - if(idx_x < C_x * pid || idx_x >= C_x * (pid + 1)){ - return ; - } - - if(0 <= ii && ii < len && 0 <= idx_x && idx_x < C_dims[1] && 0 <= idx_y && idx_y < C_dims[0] && interval <= level && level < L_MAX ) { - - - int num_features = A_dims[2]; - const int A_SQ = A_dims[0]*A_dims[1]; - const int B_SQ = B_dims[0]*B_dims[1]; - FLOAT add_val = 0; - - int x = idx_x; - int y = idx_y; - int XA0 = A_dims[0]*x; - - - /* apply loop condition */ - for(int i=0; i= C_x * (pid + 1)){ - return ; - } - - if(0 <= ii && ii < len && 0 <= idx_x && idx_x < C_dims[1] && 0 <= idx_y && idx_y < C_dims[0] && 0 <= level && level < (L_MAX - interval) ) { - int num_features = A_dims[2]; - const int A_SQ = A_dims[0]*A_dims[1]; - const int B_SQ = B_dims[0]*B_dims[1]; - FLOAT add_val = 0; - - int x = idx_x; - int y = idx_y; - int XA0 = A_dims[0]*x; - - /* apply loop condition */ - for(int i=0; i= C_y * (pid + 1)){ - return ; - } - } else return ; - - - if(0<=L && L < (L_MAX-interval)) - { - - /* loop condition */ - for(int h=0; h= d1) - { - int d = (d1+d2) >> 1; - int ds =d*step; - int s = s1; - FLOAT src_ss = *(src+s*step); - for (int p = s1+1; p <= s2; p++) - { - int t1 = d-s; - int t2 = d-p; - if (src_ss + a*t1*t1 + b*t1 > *(src+p*step) + a*t2*t2 + b*t2) - { - s = p; - src_ss = *(src+s*step); - } - } - int D = d-s; - dst[ds] = *(src+s*step) + a*D*D + b*D; - ptr[ds] = s; - dt_helper(src, dst, ptr, step, s1, s, d1, d-1, a, b); - dt_helper(src, dst, ptr, step, s, s2, d+1, d2, a, b); - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//sub function of dt -extern "C" -__global__ -void -dt1d_x( - FLOAT *src_start, // part_C_dev - FLOAT *dst_start, // tmpM_dev - int *ptr_start, // tmpIy_dev - int *DID_4_array, // DID_4_array_dev - FLOAT *def_array, // def_array_dev - int *size_array, // pm_size_array_dev - int NoP, // NoP - int *PIDX_array, // PIDX_array_dev - int *error_array, // part_error_array_dev - int error_array_num, // part_error_array_num - int *numpart, // numpart_jj - int NoC, // NoC - int max_numpart, // max_numpart - int interval, // interval - int L_MAX, // L_MAX - int pid, // pid - int device_number // device_number - - ) -{ - int idx = blockIdx.x * blockDim.x + threadIdx.x; - int kk = blockIdx.y * blockDim.y + threadIdx.y; - int jj = threadIdx.z; - int L = blockIdx.z; - int numpart_jj; - int C_y; - - if(0<=jj && jj= C_y * (pid + 1)){ - return ; - } - } else{ - return ; - } - - - if(0<=L && L<(L_MAX-interval)) - { - /* loop condition */ - for(int h=0; h= C_y * (pid + 1)){ - return ; - } - } else{ - return ; - } - - - if(0<=L && L<(L_MAX-interval)) - { - /* loop condition */ - for(int h=0; h*PP) *PP=sc; - } - } - } - } - - /*************************************************************/ - /*************************************************************/ - /* original source of calc_a_score loop */ - // for(int ii=0;ii*PP) *PP=sc; //save max score - // } - // } - // } - // } - /*************************************************************/ - /*************************************************************/ - -} - - - -__device__ -static inline int -min_i(int x, int y) -{return (x <= y ? x : y);} - -#ifdef USE_FLOAT_AS_DECIMAL -/************************************************/ -/* atomic function dealing with float precision */ -__device__ -static inline float -atomicAdd_float(float *address, float val) -{ - return atomicAdd(address, val); // atomicAdd must be called from "__device__" function -} -/*************************************************/ - -#else /* ifdef USE_FLOAT_AS_DECIMAL */ - -/*************************************************/ -/* atomic function dealing with double precision */ -__device__ -static inline double -atomicAdd_double -(double *address, double val) -{ - uintptr_t *address_as_ull = (uintptr_t *)address; - uintptr_t old = *address_as_ull, assumed; - do { - assumed = old; - old = atomicCAS(address_as_ull, assumed, __double_as_longlong(val + __longlong_as_double(assumed))); - }while(assumed != old); - return __longlong_as_double(old); -} -/*************************************************/ -#endif /* ifdef USE_FLOAT_AS_DECIMAL */ - - -/***********************************************************/ -/* function which cast from int2 to unsigned long long int */ -__device__ -static inline unsigned long long int -hiloint2uint64(int hi, int lo) -{ - int combined[] = {hi, lo}; - return *reinterpret_cast(combined); -} -/***********************************************************/ - - -/* declaration of texture memory */ -#ifdef USE_FLOAT_AS_DECIMAL -texture resized_image; -#else -texture resized_image_double; -#endif - -texture resized_image_size; -texture image_idx_incrementer; -texture hist_ptr_incrementer; -texture norm_ptr_incrementer; -texture feat_ptr_incrementer; - -extern "C" -__global__ -void -calc_hist -( - FLOAT *hist_top, - int sbin, - int visible_0, - int visible_1, - int level - ) -{ - /* index of each pixels */ - int x = blockIdx.x * blockDim.x + threadIdx.x; - int y = blockIdx.y * blockDim.y + threadIdx.y; - - const FLOAT Hcos[9] = {1.0000, 0.9397, 0.7660, 0.5000, 0.1736, -0.1736, -0.5000, -0.7660, -0.9397}; - const FLOAT Hsin[9] = {0.0000, 0.3420, 0.6428, 0.8660, 0.9848, 0.9848, 0.8660, 0.6428, 0.3420}; - - /* adjust pointer position */ - int base_index = tex1Dfetch(image_idx_incrementer, level); - uint2 ptr_hist_uint2 = tex1Dfetch(hist_ptr_incrementer, level); - uintptr_t ptr_hist = (uintptr_t)hist_top + hiloint2uint64(ptr_hist_uint2.x, ptr_hist_uint2.y); // convert uint2 -> unsigned long long int - FLOAT *hist = (FLOAT *)ptr_hist; - - /* input size */ - const int height = tex1Dfetch(resized_image_size, level*3); - const int width = tex1Dfetch(resized_image_size, level*3 + 1); - - const int dims[2] = {height, width}; - - /* size of Histgrams and Norm calculation space */ - const int blocks[2] = { - (int)floor((double)height/(double)sbin+0.5), - (int)floor((double)width/(double)sbin+0.5) - }; - - - // for (int x=1; x v) { - // v = v2; - // dx = dx2; - // dy = dy2; - // } - dx = (v2 > v) ? dx2 : dx; - dy = (v2 > v) ? dy2 : dy; - v = (v2 > v) ? v2 : v; - // if (v3 > v) { - // v = v3; - // dx = dx3; - // dy = dy3; - // } - dx = (v3 > v) ? dx3 : dx; - dy = (v3 > v) ? dy3 : dy; - v = (v3 > v) ? v3 : v; - - - /* snap to one of 18 orientations */ - FLOAT best_dot = 0; - int best_o = 0; - -#pragma unroll 9 - for (int o=0; o<9; o++) { - FLOAT dot = Hcos[o]*dx + Hsin[o]*dy; - - if (dot > best_dot) { - best_dot = dot; - best_o = o; - } - else if (-dot > best_dot) { - best_dot = -dot; - best_o = o + 9; - } - } - - /*add to 4 histgrams aroud pixel using linear interpolation*/ - FLOAT xp = ((FLOAT)x+0.5)/(FLOAT)sbin - 0.5; - FLOAT yp = ((FLOAT)y+0.5)/(FLOAT)sbin - 0.5; - int ixp = (int)floor((double)xp); - int iyp = (int)floor((double)yp); - FLOAT vx0 = xp - ixp; - FLOAT vy0 = yp - iyp; - FLOAT vx1 = 1.0 - vx0; - FLOAT vy1 = 1.0 - vy0; - v = sqrtf((double)v); - - -#ifdef USE_FLOAT_AS_DECIMAL - { - /* dummy variable to reduce warp divergence */ - // float retval = 0; - if (ixp >= 0 && iyp >= 0) - { - atomicAdd_float((float *)(hist + ixp*blocks[0] + iyp + best_o*blocks[0]*blocks[1]), (float)vx1*vy1*v); - } - // retval = (ixp >= 0 && iyp >= 0) ? - // atomicAdd_float((float *)(hist + ixp*blocks[0] + iyp + best_o*blocks[0]*blocks[1]), (float)vx1*vy1*v) : - // 0; - - if (ixp+1 < blocks[1] && iyp >= 0) - { - atomicAdd_float((float *)(hist + (ixp+1)*blocks[0] + iyp + best_o*blocks[0]*blocks[1]), (float)vx0*vy1*v); - } - // retval = (ixp+1 < blocks[1] && iyp >= 0) ? - // atomicAdd_float((float *)(hist + (ixp+1)*blocks[0] + iyp + best_o*blocks[0]*blocks[1]), (float)vx0*vy1*v) : - // 0; - - if (ixp >= 0 && iyp+1 < blocks[0]) - { - atomicAdd_float((float *)(hist + ixp*blocks[0] + (iyp+1) + best_o*blocks[0]*blocks[1]), (float)vx1*vy0*v); - } - // retval = (ixp >= 0 && iyp+1 < blocks[0]) ? - // atomicAdd_float((float *)(hist + ixp*blocks[0] + (iyp+1) + best_o*blocks[0]*blocks[1]), (float)vx1*vy0*v) : - // 0; - - if (ixp+1 < blocks[1] && iyp+1 < blocks[0]) - { - atomicAdd_float((float *)(hist + (ixp+1)*blocks[0] + (iyp+1) + best_o*blocks[0]*blocks[1]), (float)vx0*vy0*v); - } - // retval = (ixp+1 < blocks[1] && iyp+1 < blocks[0]) ? - // atomicAdd_float((float *)(hist + (ixp+1)*blocks[0] + (iyp+1) + best_o*blocks[0]*blocks[1]), (float)vx0*vy0*v) : - // 0; - } -#else /* ifdef USE_FLOAT_AS_DECIMAL */ - { - if (ixp >= 0 && iyp >= 0) - { - atomicAdd_double((double *)(hist + ixp*blocks[0] + iyp + best_o*blocks[0]*blocks[1]), (double)vx1*vy1*v); - } - - if (ixp+1 < blocks[1] && iyp >= 0) - { - atomicAdd_double((double *)(hist + (ixp+1)*blocks[0] + iyp + best_o*blocks[0]*blocks[1]), (double)vx0*vy1*v); - } - - if (ixp >= 0 && iyp+1 < blocks[0]) - { - atomicAdd_double((double *)(hist + ixp*blocks[0] + (iyp+1) + best_o*blocks[0]*blocks[1]), (double)vx1*vy0*v); - } - - if (ixp+1 < blocks[1] && iyp+1 < blocks[0]) - { - atomicAdd_double((double *)(hist + (ixp+1)*blocks[0] + (iyp+1) + best_o*blocks[0]*blocks[1]), (double)vx0*vy0*v); - } - } -#endif /* ifdef USE_FLOAT_AS_DECIMAL */ - - } - - // } - // } - - - - /*************************************************************/ - /* original source of calc hist loop */ - // for (int x=1; x v) { - // v = v2; - // dx = dx2; - // dy = dy2; - // } - // if (v3 > v) { - // v = v3; - // dx = dx3; - // dy = dy3; - // } - - // /* snap to one of 18 orientations */ - // FLOAT best_dot = 0; - // int best_o = 0; - // for (int o=0; o<9; o++) { - // FLOAT dot = Hcos[o]*dx + Hsin[o]*dy; - - // if (dot > best_dot) { - // best_dot = dot; - // best_o = o; - // } - // else if (-dot > best_dot) { - // best_dot = -dot; - // best_o = o + 9; - // } - - // } - - // /*add to 4 histgrams aroud pixel using linear interpolation*/ - // FLOAT xp = ((FLOAT)x+0.5)/(FLOAT)sbin - 0.5; - // FLOAT yp = ((FLOAT)y+0.5)/(FLOAT)sbin - 0.5; - // int ixp = (int)floor(xp); - // int iyp = (int)floor(yp); - // FLOAT vx0 = xp - ixp; - // FLOAT vy0 = yp - iyp; - // FLOAT vx1 = 1.0 - vx0; - // FLOAT vy1 = 1.0 - vy0; - // v = sqrtf(v); - - // if (ixp >= 0 && iyp >= 0) { - // *(hist + ixp*blocks[0] + iyp + best_o*blocks[0]*blocks[1]) += vx1*vy1*v; - // } - // if (ixp+1 < blocks[1] && iyp >= 0) { - // *(hist + (ixp+1)*blocks[0] + iyp + best_o*blocks[0]*blocks[1]) += vx0*vy1*v; - // } - - // if (ixp >= 0 && iyp+1 < blocks[0]) { - // *(hist + ixp*blocks[0] + (iyp+1) + best_o*blocks[0]*blocks[1]) += vx1*vy0*v; - // } - - // if (ixp+1 < blocks[1] && iyp+1 < blocks[0]) { - // *(hist + (ixp+1)*blocks[0] + (iyp+1) + best_o*blocks[0]*blocks[1]) += vx0*vy0*v; - // } - // } - // } - - /*************************************************************/ - /*************************************************************/ - - -} - - -extern "C" -__global__ -void -calc_norm -( - FLOAT *hist_top, - FLOAT *norm_top, - int blocks_0, - int blocks_1, - int level - ) -{ - /* index of each element of norm */ - int x = blockIdx.x * blockDim.x + threadIdx.x; - int y = blockIdx.y * blockDim.y + threadIdx.y; - - if (x unsigned long long int - - - ptr_uint2 = tex1Dfetch(norm_ptr_incrementer, level); - uintptr_t ptr_norm = (uintptr_t)norm_top + hiloint2uint64(ptr_uint2.x, ptr_uint2.y); // convert uint2 -> unsigned long long int - FLOAT *dst = (FLOAT *)(ptr_norm + (x*blocks_0 + y)*sizeof(FLOAT)); - - - FLOAT add_val = 0; -#pragma unroll 9 - for (int orient=0; orient<9; orient++) - { - FLOAT *src1 = (FLOAT *)(ptr_hist + (orient*blocks_0*blocks_1 + x*blocks_0 + y)*sizeof(FLOAT)); - FLOAT *src2 = (FLOAT *)(ptr_hist + ((orient+9)*blocks_0*blocks_1 + x*blocks_0 + y)*sizeof(FLOAT)); - add_val += (*src1 + *src2) * (*src1 + *src2); - } - *(dst) += add_val; - } - /*************************************************************/ - /* original source of compute_energy loop */ - - // /* compute energy in each block by summing over orientations */ - // for (int o=0; o<9; o++) { - // FLOAT *src1 = hist + o*blocks[0]*blocks[1]; - // FLOAT *src2 = hist + (o+9)*blocks[0]*blocks[1]; - // FLOAT *dst = norm; - // FLOAT *end = norm + blocks[0]*blocks[1]; - - // while(dst < end) { - // *(dst++) += (*src1 + *src2) * (*src1 + *src2); - // src1++; - // src2++; - // } - // } - - - /*************************************************************/ - /*************************************************************/ - -} - -/* definition of constant */ -#define EPS 0.0001 - -//return minimum number (FLOAT) -__device__ -static inline FLOAT -min_2(FLOAT x) -{return (x <= 0.2 ? x :0.2);} - - -extern "C" -__global__ -void -calc_feat -( - FLOAT *hist_top, - FLOAT *norm_top, - FLOAT *feat_top, - int out_0, - int out_1, - int blocks_0, - int blocks_1, - int level - ) -{ - /* index of each element of feat */ - int x = blockIdx.x * blockDim.x + threadIdx.x; - int y = blockIdx.y * blockDim.y + threadIdx.y; - - /* adjust pointer position */ - uint2 ptr_uint2 = tex1Dfetch(hist_ptr_incrementer, level); - uintptr_t ptr_hist = (uintptr_t)hist_top + hiloint2uint64(ptr_uint2.x, ptr_uint2.y); // convert uint2 -> unsigned long long int - FLOAT *hist = (FLOAT *)ptr_hist; - - ptr_uint2 = tex1Dfetch(norm_ptr_incrementer, level); - uintptr_t ptr_norm = (uintptr_t)norm_top + hiloint2uint64(ptr_uint2.x, ptr_uint2.y); // convert uint2 -> unsigned long long int - FLOAT *norm = (FLOAT *)ptr_norm; - - ptr_uint2 = tex1Dfetch(feat_ptr_incrementer, level); - uintptr_t ptr_feat = (uintptr_t)feat_top + hiloint2uint64(ptr_uint2.x, ptr_uint2.y); // convert uint2 -> unsigned long long int - FLOAT *feat = (FLOAT *)ptr_feat; - - if (x org_image; -#else -texture org_image; -#endif - -#ifndef USE_FLOAT_AS_DECIMAL -#define NO_HARDWARE_SUPPORT -#endif - -#ifdef NO_HARDWARE_SUPPORT -__device__ -static inline -double getPixelVal(int x, int y, int width, int height, int channel) -{ - int access_x = (x < 0) ? 0 : - (x < width) ? x : (width-1); - - int access_y = (y < 0) ? 0 : - (y < height) ? y : (height-1); - - int2 retval = tex1Dfetch(org_image, channel*height*width + access_y*width + access_x); - return __hiloint2double(retval.y, retval.x); -} -#endif - -extern "C" -__global__ -void -resize -( - int src_height, - int src_width, - FLOAT *dst_top, - int dst_height, - int dst_width, - FLOAT hfactor, - FLOAT wfactor, - int level - ) -{ - int dst_x = blockIdx.x*blockDim.x + threadIdx.x; - int dst_y = blockIdx.y*blockDim.y + threadIdx.y; - int channel = blockIdx.z; - - FLOAT *dst = dst_top + tex1Dfetch(image_idx_incrementer, level) + channel*dst_height*dst_width; - // unsigned long long int dst_ptr = (unsigned long long int)dst_top + - // (unsigned long long int)(tex1Dfetch(image_idx_incrementer, level) + channel*dst_height*dst_width)*sizeof(FLOAT); - // FLOAT *dst = (FLOAT *)dst_ptr; - - FLOAT src_x_decimal = wfactor * dst_x + 0.5f; - FLOAT src_y_decimal = hfactor * dst_y + 0.5f; - -#ifdef USE_FLOAT_AS_DECIMAL - if (dst_x < dst_width && dst_y < dst_height) - { - dst[dst_y*dst_width + dst_x] = (FLOAT)tex2DLayered(org_image, src_x_decimal, src_y_decimal, channel); - } -#else - /* if "double" type is used to express decimal value, there is no hardware support */ - int src_x = (int)src_x_decimal; - int src_y = (int)src_y_decimal; - - double color[4] = { - getPixelVal(src_x, src_y, src_width, src_height, channel), - getPixelVal(src_x+1, src_y, src_width, src_height, channel), - getPixelVal(src_x, src_y+1, src_width, src_height, channel), - getPixelVal(src_x+1, src_y+1, src_width, src_height, channel) - }; - - double new_element = (src_x + 1 - src_x_decimal)*(src_y + 1 - src_y_decimal)*color[0] + - (src_x_decimal - src_x)*(src_y + 1 - src_y_decimal)*color[1] + - (src_x + 1 - src_x_decimal)*(src_y_decimal - src_y)*color[2] + - (src_x_decimal - src_x)*(src_y_decimal - src_y)*color[3]; - - if (dst_x < dst_width && dst_y < dst_height) - { - dst[dst_y*dst_width + dst_x] = new_element; - } - -#endif -} diff --git a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/GPU_init.cpp b/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/GPU_init.cpp deleted file mode 100644 index c05f0af95cd..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/GPU_init.cpp +++ /dev/null @@ -1,514 +0,0 @@ -/* - * Copyright 2015-2019 Autoware Foundation. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include - -#include "for_use_GPU.h" -#include "drvapi_error_string.h" -#include -#include "switch_release.h" -#include "GPU_init.hpp" - -#define SIZE_FEATP2 100000000 -#define SIZE_A_SIZE 1000 -#define SIZE_B 100000 -#define SIZE_B_DIMS 1000 -#define SIZE_ERROR_ARRAY 100 -#define SIZE_C 50000000 -#define SIZE_PM 10000 -#define SIZE_DEF 1000 -#define SIZE_NUMPART 100 -#define SIZE_PIDX 10000 -#define SIZE_DID 10000 -#define SIZE_M 30000000 -#define SIZE_TMPM 30000000 -#define SIZE_TMPIX 30000000 -#define SIZE_TMPIY 30000000 - -/*** for debug(Linux) ***/ -#include - -/* declaration of global variables */ - -//extern CUdevice dev; -CUdevice *dev; -CUcontext *ctx; -CUfunction *func_process_root, *func_process_part, *func_dt1d_x, *func_dt1d_y, *func_calc_a_score, *func_inverse_Q, *func_calc_hist, *func_calc_norm, *func_calc_feat, *func_resize; -CUmodule *module; -int *NR_MAXTHREADS_X, *NR_MAXTHREADS_Y; -CUdeviceptr *A_SIZE_dev, *featp2_dev, *B_dev, *B_dims_dev, *fconvs_error_array_dev, *fconvs_C_dev, *part_C_dev, *part_error_array_dev, *pm_size_array_dev; -CUdeviceptr *PIDX_array_dev, *def_array_dev, *DID_4_array_dev, *numpart_dev,*M_dev, *tmpM_dev, *tmpIx_dev, *tmpIy_dev; - -/* init_cuda - initialization device to use CUDA function - */ -void dpm_ttic_gpu_init_cuda(void) -{ - //const char file_name[43] = "./gccDebug/GPU_function.cubin"; -#ifdef RELEASE - const char file_name[256] = "/usr/local/geye_with_cam/bin/car_detecter/GPU_function.cubin"; -#else - const char file_name[43] = "./gccRelease/GPU_function.cubin"; -#endif - dpm_ttic_gpu_init_cuda_with_cubin(file_name); -}/* init_cuda */ - -void dpm_ttic_gpu_init_cuda_with_cubin(const char *cubin_path) -{ - /* initnialize GPU */ - CUresult res = cuInit(0); - if(res != CUDA_SUCCESS){ - printf("\ncuInit failed: res = %s\n", getCudaDrvErrorString(res)); - exit(1); - } - - /* count the number of usable GPU */ - res = cuDeviceGetCount(&device_num); - if(res != CUDA_SUCCESS) { - printf("cuDeviceGetCount() failed: res = %s\n", getCudaDrvErrorString(res)); - exit(1); - } - - // device_num = 2; - printf("\ncar detection program %d GPUs found\n", device_num); - - /* get device */ - dev = (CUdevice*)malloc(device_num*sizeof(CUdevice)); - for(int i=0; i -#include -#include - -#include -#include -#include - -//ORIGINAL header files -#include "MODEL_info.h" //File information -#include "featurepyramid.hpp" -#include "detect.hpp" -#include "nms.hpp" -#include "get_boxes.hpp" -#include "tracking.hpp" - -#include "switch_float.h" -#include "switch_release.h" - -//definiton of functions// - -//initialize accumulated score -size_t gpu_size_A_SCORE; - -//detect and save detected boxes -static FLOAT *detect(IplImage *IM,GPUModel *MO,FLOAT thresh,int *D_NUMS,FLOAT *A_SCORE) -{ - /* for measurement */ - struct timeval tv, tv_calc_f_pyramid_start, tv_calc_f_pyramid_end; - float time_calc_f_pyramid = 0; - - //initialize scale information for hierachical detection - FLOAT *scales = gpu_init_scales(MO->MI,IM,IM->width,IM->height); - - //initialize feature-size matrix - int *featsize = gpu_init_featsize(MO->MI); - - //calculate feature pyramid - gettimeofday(&tv_calc_f_pyramid_start, NULL); - FLOAT **feature = gpu_calc_f_pyramid(IM,MO->MI,featsize,scales); - gettimeofday(&tv_calc_f_pyramid_end, NULL); - tvsub(&tv_calc_f_pyramid_end, &tv_calc_f_pyramid_start, &tv); - - time_kernel += tv.tv_sec * 1000.0 + (float)tv.tv_usec / 1000.0; - time_calc_f_pyramid += tv.tv_sec * 1000.0 + (float)tv.tv_usec / 1000.0; -#ifdef PRINT_INFO - printf("\n"); - printf("calc_f_pyramid %f[ms]\n", time_calc_f_pyramid); -#endif - - //detect boundary boxes - FLOAT *boxes = dpm_ttic_gpu_get_boxes(feature,scales,featsize,MO,D_NUMS,A_SCORE,thresh); - - free(scales); - free(featsize); - gpu_free_features(feature,MO->MI); - - return boxes; -} - -//detect car-boundary-boxes -RESULT *dpm_ttic_gpu_car_detection(IplImage *IM,GPUModel *MO,FLOAT thresh,int *D_NUMS,FLOAT *A_SCORE,FLOAT overlap) -{ - FLOAT *boxes = detect(IM,MO,thresh,D_NUMS,A_SCORE); //detect high-score region - FLOAT *rects = dpm_ttic_gpu_nms(boxes,overlap,D_NUMS,MO); //get boundary-rectangles of car - RESULT *result = dpm_ttic_gpu_get_new_rects(IM,MO,rects,D_NUMS); //get current result - - free(boxes); - free(rects); - return result; -} diff --git a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/detect.hpp b/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/detect.hpp deleted file mode 100644 index 9da0d110432..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/detect.hpp +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef _DETECT_H_ -#define _DETECT_H_ - -#include -#include "switch_float.h" - -//Result of Detection -struct RESULT { - int num; - int *point; - int *OR_point; - IplImage **IM; - int *type; - FLOAT *scale; - FLOAT *score; -}; - -extern size_t gpu_size_A_SCORE; -extern RESULT *dpm_ttic_gpu_car_detection(IplImage *IM,GPUModel *MO,FLOAT thresh,int *D_NUMS,FLOAT *A_SCORE,FLOAT overlap); - -#endif /* _DETECT_H_ */ diff --git a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/drvapi_error_string.h b/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/drvapi_error_string.h deleted file mode 100644 index 3d932e5d30c..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/drvapi_error_string.h +++ /dev/null @@ -1,335 +0,0 @@ -/* - * Copyright 1993-2012 NVIDIA Corporation. All rights reserved. - * - * Please refer to the NVIDIA end user license agreement (EULA) associated - * with this source code for terms and conditions that govern your use of - * this software. Any use, reproduction, disclosure, or distribution of - * this software and related documentation outside the terms of the EULA - * is strictly prohibited. - * - */ - -#ifndef _DRVAPI_ERROR_STRING_H_ -#define _DRVAPI_ERROR_STRING_H_ - -#include -#include -#include - -// Error Code string definitions here -struct s_CudaErrorStr -{ - char const *error_string; - int error_id; -}; - -/** - * Error codes - */ -static s_CudaErrorStr sCudaDrvErrorString[] = -{ - /** - * The API call returned with no errors. In the case of query calls, this - * can also mean that the operation being queried is complete (see - * ::cuEventQuery() and ::cuStreamQuery()). - */ - { "CUDA_SUCCESS", 0 }, - - /** - * This indicates that one or more of the parameters passed to the API call - * is not within an acceptable range of values. - */ - { "CUDA_ERROR_INVALID_VALUE", 1 }, - - /** - * The API call failed because it was unable to allocate enough memory to - * perform the requested operation. - */ - { "CUDA_ERROR_OUT_OF_MEMORY", 2 }, - - /** - * This indicates that the CUDA driver has not been initialized with - * ::cuInit() or that initialization has failed. - */ - { "CUDA_ERROR_NOT_INITIALIZED", 3 }, - - /** - * This indicates that the CUDA driver is in the process of shutting down. - */ - { "CUDA_ERROR_DEINITIALIZED", 4 }, - - /** - * This indicates profiling APIs are called while application is running - * in visual profiler mode. - */ - { "CUDA_ERROR_PROFILER_DISABLED", 5 }, - /** - * This indicates profiling has not been initialized for this context. - * Call cuProfilerInitialize() to resolve this. - */ - { "CUDA_ERROR_PROFILER_NOT_INITIALIZED", 6 }, - /** - * This indicates profiler has already been started and probably - * cuProfilerStart() is incorrectly called. - */ - { "CUDA_ERROR_PROFILER_ALREADY_STARTED", 7 }, - /** - * This indicates profiler has already been stopped and probably - * cuProfilerStop() is incorrectly called. - */ - { "CUDA_ERROR_PROFILER_ALREADY_STOPPED", 8 }, - /** - * This indicates that no CUDA-capable devices were detected by the installed - * CUDA driver. - */ - { "CUDA_ERROR_NO_DEVICE (no CUDA-capable devices were detected)", 100 }, - - /** - * This indicates that the device ordinal supplied by the user does not - * correspond to a valid CUDA device. - */ - { "CUDA_ERROR_INVALID_DEVICE (device specified is not a valid CUDA device)", 101 }, - - - /** - * This indicates that the device kernel image is invalid. This can also - * indicate an invalid CUDA module. - */ - { "CUDA_ERROR_INVALID_IMAGE", 200 }, - - /** - * This most frequently indicates that there is no context bound to the - * current thread. This can also be returned if the context passed to an - * API call is not a valid handle (such as a context that has had - * ::cuCtxDestroy() invoked on it). This can also be returned if a user - * mixes different API versions (i.e. 3010 context with 3020 API calls). - * See ::cuCtxGetApiVersion() for more details. - */ - { "CUDA_ERROR_INVALID_CONTEXT", 201 }, - - /** - * This indicated that the context being supplied as a parameter to the - * API call was already the active context. - * \deprecated - * This error return is deprecated as of CUDA 3.2. It is no longer an - * error to attempt to push the active context via ::cuCtxPushCurrent(). - */ - { "CUDA_ERROR_CONTEXT_ALREADY_CURRENT", 202 }, - - /** - * This indicates that a map or register operation has failed. - */ - { "CUDA_ERROR_MAP_FAILED", 205 }, - - /** - * This indicates that an unmap or unregister operation has failed. - */ - { "CUDA_ERROR_UNMAP_FAILED", 206 }, - - /** - * This indicates that the specified array is currently mapped and thus - * cannot be destroyed. - */ - { "CUDA_ERROR_ARRAY_IS_MAPPED", 207 }, - - /** - * This indicates that the resource is already mapped. - */ - { "CUDA_ERROR_ALREADY_MAPPED", 208 }, - - /** - * This indicates that there is no kernel image available that is suitable - * for the device. This can occur when a user specifies code generation - * options for a particular CUDA source file that do not include the - * corresponding device configuration. - */ - { "CUDA_ERROR_NO_BINARY_FOR_GPU", 209 }, - - /** - * This indicates that a resource has already been acquired. - */ - { "CUDA_ERROR_ALREADY_ACQUIRED", 210 }, - - /** - * This indicates that a resource is not mapped. - */ - { "CUDA_ERROR_NOT_MAPPED", 211 }, - - /** - * This indicates that a mapped resource is not available for access as an - * array. - */ - { "CUDA_ERROR_NOT_MAPPED_AS_ARRAY", 212 }, - - /** - * This indicates that a mapped resource is not available for access as a - * pointer. - */ - { "CUDA_ERROR_NOT_MAPPED_AS_POINTER", 213 }, - - /** - * This indicates that an uncorrectable ECC error was detected during - * execution. - */ - { "CUDA_ERROR_ECC_UNCORRECTABLE", 214 }, - - /** - * This indicates that the ::CUlimit passed to the API call is not - * supported by the active device. - */ - { "CUDA_ERROR_UNSUPPORTED_LIMIT", 215 }, - - /** - * This indicates that the ::CUcontext passed to the API call can - * only be bound to a single CPU thread at a time but is already - * bound to a CPU thread. - */ - { "CUDA_ERROR_CONTEXT_ALREADY_IN_USE", 216 }, - - /** - * This indicates that the device kernel source is invalid. - */ - { "CUDA_ERROR_INVALID_SOURCE", 300 }, - - /** - * This indicates that the file specified was not found. - */ - { "CUDA_ERROR_FILE_NOT_FOUND", 301 }, - - /** - * This indicates that a link to a shared object failed to resolve. - */ - { "CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND", 302 }, - - /** - * This indicates that initialization of a shared object failed. - */ - { "CUDA_ERROR_SHARED_OBJECT_INIT_FAILED", 303 }, - - /** - * This indicates that an OS call failed. - */ - { "CUDA_ERROR_OPERATING_SYSTEM", 304 }, - - - /** - * This indicates that a resource handle passed to the API call was not - * valid. Resource handles are opaque types like ::CUstream and ::CUevent. - */ - { "CUDA_ERROR_INVALID_HANDLE", 400 }, - - - /** - * This indicates that a named symbol was not found. Examples of symbols - * are global/constant variable names, texture names }, and surface names. - */ - { "CUDA_ERROR_NOT_FOUND", 500 }, - - - /** - * This indicates that asynchronous operations issued previously have not - * completed yet. This result is not actually an error, but must be indicated - * differently than ::CUDA_SUCCESS (which indicates completion). Calls that - * may return this value include ::cuEventQuery() and ::cuStreamQuery(). - */ - { "CUDA_ERROR_NOT_READY", 600 }, - - - /** - * An exception occurred on the device while executing a kernel. Common - * causes include dereferencing an invalid device pointer and accessing - * out of bounds shared memory. The context cannot be used }, so it must - * be destroyed (and a new one should be created). All existing device - * memory allocations from this context are invalid and must be - * reconstructed if the program is to continue using CUDA. - */ - { "CUDA_ERROR_LAUNCH_FAILED", 700 }, - - /** - * This indicates that a launch did not occur because it did not have - * appropriate resources. This error usually indicates that the user has - * attempted to pass too many arguments to the device kernel, or the - * kernel launch specifies too many threads for the kernel's register - * count. Passing arguments of the wrong size (i.e. a 64-bit pointer - * when a 32-bit int is expected) is equivalent to passing too many - * arguments and can also result in this error. - */ - { "CUDA_ERROR_LAUNCH_OUT_OF_RESOURCES", 701 }, - - /** - * This indicates that the device kernel took too long to execute. This can - * only occur if timeouts are enabled - see the device attribute - * ::CU_DEVICE_ATTRIBUTE_KERNEL_EXEC_TIMEOUT for more information. The - * context cannot be used (and must be destroyed similar to - * ::CUDA_ERROR_LAUNCH_FAILED). All existing device memory allocations from - * this context are invalid and must be reconstructed if the program is to - * continue using CUDA. - */ - { "CUDA_ERROR_LAUNCH_TIMEOUT", 702 }, - - /** - * This error indicates a kernel launch that uses an incompatible texturing - * mode. - */ - { "CUDA_ERROR_LAUNCH_INCOMPATIBLE_TEXTURING", 703 }, - - /** - * This error indicates that a call to ::cuCtxEnablePeerAccess() is - * trying to re-enable peer access to a context which has already - * had peer access to it enabled. - */ - { "CUDA_ERROR_PEER_ACCESS_ALREADY_ENABLED", 704 }, - - /** - * This error indicates that ::cuCtxDisablePeerAccess() is - * trying to disable peer access which has not been enabled yet - * via ::cuCtxEnablePeerAccess(). - */ - { "CUDA_ERROR_PEER_ACCESS_NOT_ENABLED", 705 }, - - /** - * This error indicates that the primary context for the specified device - * has already been initialized. - */ - { "CUDA_ERROR_PRIMARY_CONTEXT_ACTIVE", 708 }, - - /** - * This error indicates that the context current to the calling thread - * has been destroyed using ::cuCtxDestroy }, or is a primary context which - * has not yet been initialized. - */ - { "CUDA_ERROR_CONTEXT_IS_DESTROYED", 709 }, - - /** - * A device-side assert triggered during kernel execution. The context - * cannot be used anymore, and must be destroyed. All existing device - * memory allocations from this context are invalid and must be - * reconstructed if the program is to continue using CUDA. - */ - { "CUDA_ERROR_ASSERT", 710 }, - - /** - * This indicates that an unknown internal error has occurred. - */ - { "CUDA_ERROR_UNKNOWN", 999 }, - { NULL, -1 } -}; - -// This is just a linear search through the array, since the error_id's are not -// always ocurring consecutively -inline const char * getCudaDrvErrorString(CUresult error_id) -{ - int index = 0; - while (sCudaDrvErrorString[index].error_id != error_id && - sCudaDrvErrorString[index].error_id != -1) - { - index++; - } - - if(sCudaDrvErrorString[index].error_id == error_id) - return (const char *)sCudaDrvErrorString[index].error_string; - else - return (const char *)"CUDA_ERROR not found!"; -} - -#endif diff --git a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/dt_GPU.cpp b/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/dt_GPU.cpp deleted file mode 100644 index 776629403a2..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/dt_GPU.cpp +++ /dev/null @@ -1,913 +0,0 @@ -/* - * Copyright 2015-2019 Autoware Foundation. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include - -#include - -#include "multithreading.h" -#include "for_use_GPU.h" -#include "dt_GPU.hpp" -#include "fconvsMT.hpp" - -struct dt_partition { - int NoP; - int NoC; - int interval; - int L_MAX; - int sum_size_SQ; - int max_numpart; - int max_dim0; - int max_dim1; - FLOAT *dst_M; - int *dst_tmpIx; - int *dst_tmpIy; - int ***PIDX_array; - int **size_array; - const int *numpart; - int *FSIZE; - int padx; - int pady; - int max_X; - int max_Y; - FLOAT *def; - int tmp_array_size; - int *dst_PIDX; - int *dst_DID_4; - int pid; -}; - -//CUdeviceptr *part_error_array_dev; -//CUdeviceptr *part_C_dev; - -static CUT_THREADPROC dt_thread_func(void *p) -{ - dt_partition *pt = (dt_partition *)p; - struct timeval tv; - CUresult res; - int thread_num_x=0, thread_num_y=0; - int block_num_x=0, block_num_y=0; - - res = cuCtxSetCurrent(ctx[pt->pid]); - if(res != CUDA_SUCCESS) { - printf("cuCtxSetCurrent(ctx[%d]) failed: res = %s\n", pt->pid, cuda_response_to_string(res)); - exit(1); - } - - /* allocate GPU memory */ - - //printf("part_error_array_num = %d\n",part_error_array_num); - - - if(pt->pid == 0){ - gettimeofday(&tv_memcpy_start, NULL); - } - - res = cuMemcpyHtoD(part_C_dev[pt->pid], dst_C, SUM_SIZE_C); - if(res != CUDA_SUCCESS) { - printf("cuMemcpyHtoD(part_C_dev) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - res = cuMemcpyHtoD(part_error_array_dev[pt->pid], part_error_array, part_error_array_num*sizeof(int)); - if(res != CUDA_SUCCESS) { - printf("cuMemcpyHtoD(part_error_array_dev) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - res = cuMemcpyHtoD(pm_size_array_dev[pt->pid], &pt->size_array[0][0], pt->NoP*2*pt->L_MAX*sizeof(int)); - if(res != CUDA_SUCCESS) { - printf("cuMemcpyHtoD(pm_size_array_dev) falied: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - res = cuMemcpyHtoD(def_array_dev[pt->pid], pt->def, sum_size_def_array); - if(res != CUDA_SUCCESS) { - printf("cuMemcpyHtoD(def_array_dev) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - res = cuMemcpyHtoD(numpart_dev[pt->pid], pt->numpart, pt->NoC*sizeof(int)); - if(res != CUDA_SUCCESS) { - printf("cuMemcpyHtoD(cuMemcpyHtoD(numpart_dev) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - res = cuMemcpyHtoD(PIDX_array_dev[pt->pid], pt->dst_PIDX, pt->tmp_array_size); - if(res != CUDA_SUCCESS) { - printf("cuMemcpyHtoD(PIDX_array) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - res = cuMemcpyHtoD(DID_4_array_dev[pt->pid], pt->dst_DID_4, pt->tmp_array_size); - if(res != CUDA_SUCCESS) { - printf("cuMemcpyHtoD(DID_4__array) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - - if(pt->pid == 0){ - gettimeofday(&tv_memcpy_end, NULL); - tvsub(&tv_memcpy_end, &tv_memcpy_start, &tv); - time_memcpy += tv.tv_sec * 1000.0 + (float)tv.tv_usec / 1000.0; - } - - int sharedMemBytes = 0; - - /* get max thread num per block */ - int max_threads_num = 0; - res = cuDeviceGetAttribute(&max_threads_num, CU_DEVICE_ATTRIBUTE_MAX_THREADS_PER_BLOCK, dev[pt->pid]); - if(res != CUDA_SUCCESS){ - printf("\ncuDeviceGetAttribute() failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - /* prepare for launch inverse_Q */ - void* kernel_args_inverse[] = { - &part_C_dev[pt->pid], - &pm_size_array_dev[pt->pid], - &part_error_array_dev[pt->pid], - &part_error_array_num, - (void*)&(pt->NoP), - &PIDX_array_dev[pt->pid], - &numpart_dev[pt->pid], - (void*)&(pt->NoC), - (void*)&(pt->max_numpart), - (void*)&(pt->interval), - (void*)&(pt->L_MAX), - (void*)&(pt->pid), - (void*)&(device_num) - }; - - /* define CUDA block shape */ - int upper_limit_th_num_x = max_threads_num/(pt->max_numpart*pt->NoC); - int upper_limit_th_num_y = max_threads_num/upper_limit_th_num_x; - if(upper_limit_th_num_x < 1) upper_limit_th_num_x++; - if(upper_limit_th_num_y < 1) upper_limit_th_num_y++; - - thread_num_x = (pt->max_dim0*pt->max_dim1 < upper_limit_th_num_x) ? (pt->max_dim0*pt->max_dim1) : upper_limit_th_num_x; - thread_num_y = (pt->max_numpart < upper_limit_th_num_y) ? pt->max_numpart : upper_limit_th_num_y; - - block_num_x = (pt->max_dim0*pt->max_dim1) / thread_num_x; - block_num_y = (pt->max_numpart) / thread_num_y; - if((pt->max_dim0*pt->max_dim1) % thread_num_x != 0) block_num_x++; - if(pt->max_numpart % thread_num_y != 0) block_num_y++; - - - int blockDimY = thread_num_y / device_num; - if(thread_num_y%device_num != 0){ - blockDimY++; - } - - /* launch iverse_Q */ - if(pt->pid == 0){ - gettimeofday(&tv_kernel_start, NULL); - } - res = cuLaunchKernel( - func_inverse_Q[pt->pid], // call function - block_num_x, // gridDimX - block_num_y, // gridDimY - pt->L_MAX-pt->interval, // gridDimZ - thread_num_x, // blockDimX - blockDimY, // blockDimY - pt->NoC, // blockDimZ - sharedMemBytes, // sharedMemBytes - NULL, // hStream - kernel_args_inverse, // kernelParams - NULL // extra - ); - if(res != CUDA_SUCCESS) { - printf("block_num_x %d, block_num_y %d, thread_num_x %d, thread_num_y %d\n", block_num_x, block_num_y, thread_num_x, thread_num_y); - printf("cuLaunchKernel(inverse_Q) failed : res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - res = cuCtxSynchronize(); - if(res != CUDA_SUCCESS) { - printf("cuCtxSynchronize(inverse_Q) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - if(pt->pid == 0){ - gettimeofday(&tv_kernel_end, NULL); - tvsub(&tv_kernel_end, &tv_kernel_start, &tv); - time_kernel += tv.tv_sec * 1000.0 + (float)tv.tv_usec / 1000.0; - } - - - /* prepare for launch dt1d_x */ - void* kernel_args_x[] = { - &part_C_dev[pt->pid], // FLOAT *src_start - &tmpM_dev[pt->pid], // FLOTA *dst - &tmpIy_dev[pt->pid], // int *ptr - &DID_4_array_dev[pt->pid], // int *DID_4_array, - &def_array_dev[pt->pid], // FLOAT *def_array, - &pm_size_array_dev[pt->pid], // int *size_array - (void*)&(pt->NoP), // int NoP - &PIDX_array_dev[pt->pid], // int *PIDX_array - &part_error_array_dev[pt->pid], // int *error_array - (void*)&(part_error_array_num), // int error_array_num - &numpart_dev[pt->pid], // int *numpart - (void*)&(pt->NoC), // int NoC - (void*)&(pt->max_numpart), // int max_numpart - (void*)&(pt->interval), // int interval - (void*)&(pt->L_MAX), // int L_MAX - (void*)&(pt->pid), // int pid - (void*)&(device_num) // int device_num - }; - - - max_threads_num = 64/pt->NoC; - if(max_threads_num < 1) max_threads_num++; - - thread_num_x = (pt->max_dim1 < max_threads_num) ? pt->max_dim1 : max_threads_num; - thread_num_y = (pt->max_numpart < max_threads_num) ? pt->max_numpart : max_threads_num; - - block_num_x = pt->max_dim1 / thread_num_x; - block_num_y = pt->max_numpart / thread_num_y; - if(pt->max_dim1 % thread_num_x != 0) block_num_x++; - if(pt->max_numpart % thread_num_y != 0) block_num_y++; - - blockDimY = thread_num_y / device_num; - if(thread_num_y%device_num != 0){ - blockDimY++; - } - - /* launch dt1d_x */ - if(pt->pid == 0){ - gettimeofday(&tv_kernel_start, NULL); - } - - res = cuLaunchKernel( - func_dt1d_x[pt->pid], // call function - block_num_x, // gridDimX - block_num_y, // gridDimY - pt->L_MAX-pt->interval, // gridDimZ - thread_num_x, // blockDimX - blockDimY, // blockDimY - pt->NoC, // blockDimZ - sharedMemBytes, // sharedMemBytes - NULL, // hStream - kernel_args_x, // kernelParams - NULL // extra - ); - if(res != CUDA_SUCCESS) { - - printf("block_num_x %d, block_num_y %d, thread_num_x %d, thread_num_y %d\n", block_num_x, block_num_y, thread_num_x, thread_num_y); - - printf("cuLaunchKernel(dt1d_x) failed : res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - res = cuCtxSynchronize(); - if(res != CUDA_SUCCESS) { - printf("cuCtxSynchronize(dt1d_x) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - if(pt->pid == 0){ - gettimeofday(&tv_kernel_end, NULL); - tvsub(&tv_kernel_end, &tv_kernel_start, &tv); - time_kernel += tv.tv_sec * 1000.0 + (float)tv.tv_usec / 1000.0; - } - - - /* prepare for launch dt1d_y */ - void* kernel_args_y[] = { - &tmpM_dev[pt->pid], // FLOAT *src_start - &M_dev[pt->pid], // FLOAT *dst_start - &tmpIx_dev[pt->pid], // int *ptr_start - &DID_4_array_dev[pt->pid], // int *DID_4_array, - &def_array_dev[pt->pid], // FLOAT *def_array, - (void*)&(pt->NoP), // int NoP - &pm_size_array_dev[pt->pid], // int *size_array - &numpart_dev[pt->pid], // int *numpart, - &PIDX_array_dev[pt->pid], // int *PIDX_array, - (void*)&(pt->NoC), // int NoC - (void*)&(pt->max_numpart), // int max_numpart - (void*)&(pt->interval), // int interval - (void*)&(pt->L_MAX), // int L_MAX - &part_error_array_dev[pt->pid], // int *error_array - (void*)&(part_error_array_num), // int error_array_num - (void*)&(pt->pid), // int pid - (void*)&(device_num) // int device_num - }; - - - thread_num_x = (pt->max_dim0 < max_threads_num) ? pt->max_dim0 : max_threads_num; - thread_num_y = (pt->max_numpart < max_threads_num) ? pt->max_numpart : max_threads_num; - - block_num_x = pt->max_dim0 / thread_num_x; - block_num_y = pt->max_numpart / thread_num_y; - if(pt->max_dim0 % thread_num_x != 0) block_num_x++; - if(pt->max_numpart % thread_num_y != 0) block_num_y++; - - blockDimY = thread_num_y / device_num; - if(thread_num_y%device_num != 0){ - blockDimY++; - } - - /* prepare for launch dt1d_y */ - if(pt->pid == 0){ - gettimeofday(&tv_kernel_start, NULL); - } - - res = cuLaunchKernel( - func_dt1d_y[pt->pid], // call functions - block_num_x, // gridDimX - block_num_y, // gridDimY - pt->L_MAX-pt->interval, // gridDimZ - thread_num_x, // blockDimX - blockDimY, // blockDimY - pt->NoC, // blockDimZ - sharedMemBytes, // sharedMemBytes - NULL, // hStream - kernel_args_y, // kernelParams - NULL // extra - ); - if(res != CUDA_SUCCESS) { - printf("cuLaunchKernel(dt1d_y failed : res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - - res = cuCtxSynchronize(); - if(res != CUDA_SUCCESS) { - printf("cuCtxSynchronize(dt1d_y) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - if(pt->pid == 0){ - gettimeofday(&tv_kernel_end, NULL); - tvsub(&tv_kernel_end, &tv_kernel_start, &tv); - time_kernel += tv.tv_sec * 1000.0 + (float)tv.tv_usec / 1000.0; - } - - - - /* downloads datas from GPU */ - - /* downloads M from GPU */ - - int sum_part_size = 0; - int sum_pointer_size = 0; - int sum_move_size = 0; - int part_size = 0; - int pointer_size = 0; - int part_y = 0; - int move_size = 0; - int start_kk = 0; - int end_kk = 0; - int part_end_kk = 0; - unsigned long long int pointer_dst_M = (unsigned long long int)pt->dst_M; - unsigned long long int pointer_M_dev = (unsigned long long int)M_dev[pt->pid]; - - for(int L=0; L<(pt->L_MAX-pt->interval); L++) { - - /**************************************************************************/ - /* loop condition */ - if( (pt->FSIZE[(L+pt->interval)*2]+2*pt->pady < pt->max_Y) || (pt->FSIZE[(L+pt->interval)*2+1]+2*pt->padx < pt->max_X) ) - { - continue; - } - /* loop conditon */ - /**************************************************************************/ - - - for(int jj=0; jjNoC; jj++) { - - part_y = pt->numpart[jj] / device_num; - if(pt->numpart[jj]%device_num != 0){ - part_y++; - } - - - start_kk = part_y * pt->pid; - end_kk = part_y * (pt->pid + 1); - - if(end_kk > pt->numpart[jj]){ - end_kk = pt->numpart[jj]; - } - - if(pt->pid > 0){ - part_end_kk = part_y * pt->pid; - } - - for(int kk=0; kknumpart[jj]; kk++) { - - int PIDX = pt->PIDX_array[L][jj][kk]; - int dims0 = pt->size_array[L][PIDX*2]; - int dims1 = pt->size_array[L][PIDX*2+1]; - if(start_kk <= kk && kk < end_kk){ - part_size += dims0 * dims1; - } - //if(pt->pid > 0 && part_start_kk <= kk && kk < part_end_kk){ - if(pt->pid > 0 && 0 <= kk && kk < part_end_kk){ - pointer_size += dims0 * dims1; - } - move_size += dims0 * dims1; - } - - sum_part_size += part_size; - sum_pointer_size += pointer_size; - sum_move_size += move_size; - - // error pt->pid == 2 && L == 24 && jj == 1 - - if(pt->pid*part_y < pt->numpart[jj]){ - - if(pt->pid == 0){ - gettimeofday(&tv_memcpy_start, NULL); - } - - - res = cuMemcpyDtoH((void *)(pointer_dst_M+(unsigned long long int)(pointer_size*sizeof(FLOAT))), (CUdeviceptr)(pointer_M_dev+(unsigned long long int)(pointer_size*sizeof(FLOAT))), part_size*sizeof(FLOAT)); - if(res != CUDA_SUCCESS) { - printf("error pid = %d\n",pt->pid); - printf("cuMemcpyDtoH(dst_M) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - if(pt->pid == 0){ - gettimeofday(&tv_memcpy_end, NULL); - tvsub(&tv_memcpy_end, &tv_memcpy_start, &tv); - time_memcpy += tv.tv_sec * 1000.0 + (float)tv.tv_usec / 1000.0; - } - - } - - pointer_dst_M += (unsigned long long int)(move_size * sizeof(FLOAT)); - pointer_M_dev += (unsigned long long int)(move_size * sizeof(FLOAT)); - - part_size = 0; - pointer_size = 0; - move_size = 0; - - } - - } - - - /* downloads tmpIx from GPU */ - - sum_part_size = 0; - sum_pointer_size = 0; - part_size = 0; - pointer_size = 0; - part_y = 0; - move_size = 0; - start_kk = 0; - end_kk = 0; - part_end_kk = 0; - unsigned long long int pointer_dst_tmpIx = (unsigned long long int)pt->dst_tmpIx; - unsigned long long int pointer_tmpIx_dev = (unsigned long long int)tmpIx_dev[pt->pid]; - - - for(int L=0; L<(pt->L_MAX-pt->interval); L++) { - - /**************************************************************************/ - /* loop condition */ - if( (pt->FSIZE[(L+pt->interval)*2]+2*pt->pady < pt->max_Y) || (pt->FSIZE[(L+pt->interval)*2+1]+2*pt->padx < pt->max_X) ) - { - continue; - } - /* loop conditon */ - /**************************************************************************/ - - - for(int jj=0; jjNoC; jj++) { - - part_y = pt->numpart[jj] / device_num; - if(pt->numpart[jj]%device_num != 0){ - part_y++; - } - - start_kk = part_y * pt->pid; - end_kk = part_y * (pt->pid + 1); - - if(end_kk > pt->numpart[jj]){ - end_kk = pt->numpart[jj]; - } - - if(pt->pid > 0){ - part_end_kk = part_y * pt->pid; - } - - for(int kk=0; kknumpart[jj]; kk++) { - - int PIDX = pt->PIDX_array[L][jj][kk]; - int dims0 = pt->size_array[L][PIDX*2]; - int dims1 = pt->size_array[L][PIDX*2+1]; - if(start_kk <= kk && kk < end_kk){ - part_size += dims0 * dims1; - } - if(pt->pid > 0){ - if(0 <= kk && kk < part_end_kk){ - pointer_size += dims0 * dims1; - } - } - move_size += dims0 * dims1; - } - - sum_part_size += part_size; - sum_pointer_size += pointer_size; - - - if(pt->pid*part_y < pt->numpart[jj]){ - - if(pt->pid == 0){ - gettimeofday(&tv_memcpy_start, NULL); - } - - - res = cuMemcpyDtoH((void *)(pointer_dst_tmpIx+(unsigned long long int)(pointer_size*sizeof(int))), (CUdeviceptr)(pointer_tmpIx_dev+(unsigned long long int)(pointer_size*sizeof(int))), part_size*sizeof(int)); - if(res != CUDA_SUCCESS) { - printf("error pid = %d\n",pt->pid); - printf("cuMemcpyDtoH(tmpIx) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - if(pt->pid == 0){ - gettimeofday(&tv_memcpy_end, NULL); - tvsub(&tv_memcpy_end, &tv_memcpy_start, &tv); - time_memcpy += tv.tv_sec * 1000.0 + (float)tv.tv_usec / 1000.0; - } - - } - - pointer_dst_tmpIx += (unsigned long long int)(move_size * sizeof(int)); - pointer_tmpIx_dev += (unsigned long long int)(move_size * sizeof(int)); - - part_size = 0; - pointer_size = 0; - move_size = 0; - - } - - } - - - /* downloads tmpIy from GPU */ - - sum_part_size = 0; - sum_pointer_size = 0; - part_size = 0; - pointer_size = 0; - part_y = 0; - move_size = 0; - start_kk = 0; - end_kk = 0; - part_end_kk = 0; - unsigned long long int pointer_dst_tmpIy = (unsigned long long int)pt->dst_tmpIy; - unsigned long long int pointer_tmpIy_dev = (unsigned long long int)tmpIy_dev[pt->pid]; - - - for(int L=0; L<(pt->L_MAX-pt->interval); L++) { - - /**************************************************************************/ - /* loop condition */ - if( (pt->FSIZE[(L+pt->interval)*2]+2*pt->pady < pt->max_Y) || (pt->FSIZE[(L+pt->interval)*2+1]+2*pt->padx < pt->max_X) ) - { - continue; - } - /* loop conditon */ - /**************************************************************************/ - - - for(int jj=0; jjNoC; jj++) { - - part_y = pt->numpart[jj] / device_num; - if(pt->numpart[jj]%device_num != 0){ - part_y++; - } - - start_kk = part_y * pt->pid; - end_kk = part_y * (pt->pid + 1); - - if(end_kk > pt->numpart[jj]){ - end_kk = pt->numpart[jj]; - } - - if(pt->pid > 0){ - part_end_kk = part_y * pt->pid; - } - - for(int kk=0; kknumpart[jj]; kk++) { - - int PIDX = pt->PIDX_array[L][jj][kk]; - int dims0 = pt->size_array[L][PIDX*2]; - int dims1 = pt->size_array[L][PIDX*2+1]; - if(start_kk <= kk && kk < end_kk){ - part_size += dims0 * dims1; - } - if(pt->pid > 0){ - if(0 <= kk && kk < part_end_kk){ - pointer_size += dims0 * dims1; - } - } - move_size += dims0 * dims1; - } - - sum_part_size += part_size; - sum_pointer_size += pointer_size; - - if(pt->pid*part_y < pt->numpart[jj]){ - - if(pt->pid == 0){ - gettimeofday(&tv_memcpy_start, NULL); - } - - res = cuMemcpyDtoH((void *)(pointer_dst_tmpIy+(unsigned long long int)(pointer_size*sizeof(int))), (CUdeviceptr)(pointer_tmpIy_dev+(unsigned long long int)(pointer_size*sizeof(int))), part_size*sizeof(int)); - if(res != CUDA_SUCCESS) { - printf("error pid = %d\n",pt->pid); - printf("cuMemcpyDtoH(tmpIy) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - if(pt->pid == 0){ - gettimeofday(&tv_memcpy_end, NULL); - tvsub(&tv_memcpy_end, &tv_memcpy_start, &tv); - time_memcpy += tv.tv_sec * 1000.0 + (float)tv.tv_usec / 1000.0; - } - - } - - pointer_dst_tmpIy += (unsigned long long int)(move_size * sizeof(int)); - pointer_tmpIy_dev += (unsigned long long int)(move_size * sizeof(int)); - - part_size = 0; - pointer_size = 0; - move_size = 0; - - } - - } - - - /* end of thread */ - CUT_THREADEND; -} - -FLOAT ****dt_GPU( - int ****Ix_array, - int ****Iy_array, - int ***PIDX_array, - int **size_array, - int NoP, - const int *numpart, - int NoC, - int interval, - int L_MAX, - int *FSIZE, - int padx, - int pady, - int max_X, - int max_Y, - FLOAT *def, - int tmp_array_size, - int *dst_PIDX, - int *dst_DID_4 - ) -{ - dt_partition *p = (dt_partition *)malloc(device_num*sizeof(dt_partition)); - - int max_dim0 = 0, max_dim1 = 0; - /* prepare for parallel execution */ - int sum_size_SQ = 0; - int sum_numpart = 0; - - for(int level=interval; level -#include -#include -#include - -#include "MODEL_info.h" //File information -#include "common.hpp" -#include "multithreading.h" -#include "for_use_GPU.h" -#include "drvapi_error_string.h" -#include "switch_release.h" - -#include - -// use for dt_GPU -int part_error_array_num; -int *part_error_array; -size_t SUM_SIZE_C; -FLOAT *dst_C; - -struct fconvs_partition { - FLOAT **featp2; - size_t SUM_SIZE_feat; - int *A_SIZE; - size_t SUM_SIZE_B; - size_t SUM_SIZE_C; - FLOAT *dst_C; - FLOAT **filter; - int len; - int calc_flag; - int error_array_num; - int start; - int *error_array; - int *B_dimension; - int interval; - int L_MAX; - int pid; - int max_height; - int max_width; -}; - -struct thread_data { - FLOAT *A; - FLOAT *B; - FLOAT *C; - FLOAT *F; - FLOAT *T; - int A_dims[3]; - int B_dims[3]; - int C_dims[2]; -}; - -static CUT_THREADPROC fconvs_thread_func(void *p) -{ - fconvs_partition *pt = (fconvs_partition *)p; - CUresult res; - struct timeval tv; - //CUdeviceptr part_root_C_dev; - //CUdeviceptr part_part_C_dev; - int thread_num_x, thread_num_y, block_num_x, block_num_y; - struct timeval tv_fconv_kernel_start, tv_fconv_kernel_end; - float time_fconv_kernel; - struct timeval tv_fconv_memcpyHtoD_start, tv_fconv_memcpyHtoD_end; - float time_fconv_memcpyHtoD; - struct timeval tv_fconv_memcpyDtoH_start, tv_fconv_memcpyDtoH_end; - float time_fconv_memcpyDtoH; - struct timeval tv_fconv_texture_start, tv_fconv_texture_end; - float time_fconv_texture; -#ifdef PRINT_INFO - float time_fconv_memalloc; -#endif - struct timeval tv_fconv_others_start, tv_fconv_others_end; - float time_fconv_others; - - if(pt->calc_flag == PART) part_error_array_num = pt->error_array_num; - - if(pt->pid == 0 && pt->calc_flag == PART){ - gettimeofday(&tv_fconv_others_start, NULL); - } - /* set CUDA context to this CPU thread */ - res = cuCtxSetCurrent(ctx[pt->pid]); - if(res != CUDA_SUCCESS) { - printf("cuCtxSetCurrent(ctx[%d]) failed: res = %s\n", pt->pid, cuda_response_to_string(res)); - exit(1); - } - - /* define CUDA block shape */ - int max_threads_num = 0; - res = cuDeviceGetAttribute(&max_threads_num, CU_DEVICE_ATTRIBUTE_MAX_THREADS_PER_BLOCK, dev[pt->pid]); - if(res != CUDA_SUCCESS){ - printf("\ncuDeviceGetAttribute() failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - - /* calculate max size of each block dimension */ - NR_MAXTHREADS_X[pt->pid] = (int)sqrt((FLOAT)max_threads_num); //(int)sqrt((FLOAT)max_threads_num/pt->len); - NR_MAXTHREADS_Y[pt->pid] = (int)sqrt((FLOAT)max_threads_num); //(int)sqrt((FLOAT)max_threads_num/pt->len); - if(NR_MAXTHREADS_X[pt->pid] < 1) NR_MAXTHREADS_X[0]++; - if(NR_MAXTHREADS_Y[pt->pid] < 1) NR_MAXTHREADS_Y[0]++; - - - thread_num_x = (pt->max_width < NR_MAXTHREADS_X[pt->pid]) ? pt->max_width : NR_MAXTHREADS_X[pt->pid]; - thread_num_y = (pt->max_height < NR_MAXTHREADS_Y[pt->pid]) ? pt->max_height : NR_MAXTHREADS_Y[pt->pid]; - - - block_num_x = pt->max_width / thread_num_x; - block_num_y = pt->max_height / thread_num_y; - if(pt->max_width % thread_num_x != 0) block_num_x++; - if(pt->max_height % thread_num_y != 0) block_num_y++; - - - if(pt->pid == 0 && pt->calc_flag == PART){ - gettimeofday(&tv_fconv_others_end, NULL); - tvsub(&tv_fconv_others_end, &tv_fconv_others_start, &tv); - time_fconv_others += tv.tv_sec * 1000.0 + (float)tv.tv_usec / 1000.0; - } - - - /* upload data to GPU memory */ - if(pt->pid == 0){ - gettimeofday(&tv_memcpy_start, NULL); - } - if(pt->pid == 0 && pt->calc_flag == PART){ - gettimeofday(&tv_fconv_memcpyHtoD_start, NULL); - } - /* upload resized source images to GPU */ - res = cuMemcpyHtoD(featp2_dev[pt->pid], pt->featp2[0], pt->SUM_SIZE_feat); - if(res != CUDA_SUCCESS) { - printf("cuMemcpyHtoD(featp2) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - /* upload resize image sizes to GPU */ - res = cuMemcpyHtoD(A_SIZE_dev[pt->pid], pt->A_SIZE, pt->L_MAX*3*sizeof(int)); - if(res != CUDA_SUCCESS) { - printf("cuMemcpyHtoD(new_PADsize) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - /* upload filter to GPU */ - res = cuMemcpyHtoD(B_dev[pt->pid], pt->filter[pt->start], pt->SUM_SIZE_B); - if(res != CUDA_SUCCESS){ - printf("cuMemcpyHtoD(B_dev) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - /* upload error condition to GPU */ - res = cuMemcpyHtoD(fconvs_error_array_dev[pt->pid], pt->error_array, pt->error_array_num*sizeof(int)); - if(res != CUDA_SUCCESS) { - printf("cuMemcpyHtoD(part_error_array_dev) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - if(pt->pid == 0 && pt->calc_flag == PART){ - gettimeofday(&tv_fconv_memcpyHtoD_end, NULL); - tvsub(&tv_fconv_memcpyHtoD_end, &tv_fconv_memcpyHtoD_start, &tv); - time_fconv_memcpyHtoD += tv.tv_sec * 1000.0 + (float)tv.tv_usec / 1000.0; - } - - - if(pt->pid == 0 && pt->calc_flag == PART){ - gettimeofday(&tv_fconv_texture_start, NULL); - } - /* get handle to a texture memory on GPU */ - CUtexref featp2_texref, B_texref; - if(sizeof(FLOAT) == sizeof(float)) // if configured to use single precision - { - res = cuModuleGetTexRef(&featp2_texref, module[pt->pid], "A"); - if(res != CUDA_SUCCESS) { - printf("cuModuleGetTexRef(featp2) failed: res = %d\n->%s\n", res, getCudaDrvErrorString(res)); - exit(1); - } - - res = cuModuleGetTexRef(&B_texref, module[pt->pid], "B"); - if(res != CUDA_SUCCESS) { - printf("cuModuleGetTexRef(B) failed: res = %d\n->%s\n", res, getCudaDrvErrorString(res)); - exit(1); - } - } - else // if configured to use double precision - { - res = cuModuleGetTexRef(&featp2_texref, module[pt->pid], "A_double"); - if(res != CUDA_SUCCESS) { - printf("cuModuleGetTexRef(featp2) failed: res = %d\n->%s\n", res, getCudaDrvErrorString(res)); - exit(1); - } - - res = cuModuleGetTexRef(&B_texref, module[pt->pid], "B_double"); - if(res != CUDA_SUCCESS) { - printf("cuModuleGetTexRef(B) failed: res = %d\n->%s\n", res, getCudaDrvErrorString(res)); - exit(1); - } - } - - /* bind to texture memory on GPU */ - res = cuTexRefSetAddress(NULL, featp2_texref, featp2_dev[pt->pid], pt->SUM_SIZE_feat); - if (res != CUDA_SUCCESS) { - printf("cuTexRefSetAddress(featp2_dev) failed: res = %d\n->%s\n", res, getCudaDrvErrorString(res)); - exit(1); - } - - - res = cuTexRefSetAddress(NULL, B_texref, B_dev[pt->pid], pt->SUM_SIZE_B); - if (res != CUDA_SUCCESS) { - printf("cuTexRefSetAddress(B_dev) failed: res = %d\n->%s\n", res, getCudaDrvErrorString(res)); - exit(1); - } - - /* texture memory configuration */ - res = cuTexRefSetFlags(featp2_texref, CU_TRSF_NORMALIZED_COORDINATES); - if (res != CUDA_SUCCESS) { - printf("cuTexRefSetFlags(featp2_texref) failed: res = %d\n->%s\n", res, getCudaDrvErrorString(res)); - exit(1); - } - - res = cuTexRefSetFlags(B_texref, CU_TRSF_NORMALIZED_COORDINATES); - if (res != CUDA_SUCCESS) { - printf("cuTexRefSetFlags(B_texref) failed: res = %d\n->%s\n", res, getCudaDrvErrorString(res)); - exit(1); - } - - if(sizeof(FLOAT) == sizeof(float)) // if configured to use single precision - { - res = cuTexRefSetFormat(featp2_texref, CU_AD_FORMAT_FLOAT, 1); - if (res != CUDA_SUCCESS) { - printf("cuTexRefSetFormat(featp2_texref) failed: res = %d\n->%s\n", res, getCudaDrvErrorString(res)); - exit(1); - } - - res = cuTexRefSetFormat(B_texref, CU_AD_FORMAT_FLOAT, 1); - if (res != CUDA_SUCCESS) { - printf("cuTexRefSetFormat(B_texref) failed: res = %d\n->%s\n", res, getCudaDrvErrorString(res)); - exit(1); - } - } - else // if configured to use double precision - { - res = cuTexRefSetFormat(featp2_texref, CU_AD_FORMAT_UNSIGNED_INT32, 2); - if (res != CUDA_SUCCESS) { - printf("cuTexRefSetFormat(featp2_texref) failed: res = %d\n->%s\n", res, getCudaDrvErrorString(res)); - exit(1); - } - - res = cuTexRefSetFormat(B_texref, CU_AD_FORMAT_UNSIGNED_INT32, 2); - if (res != CUDA_SUCCESS) { - printf("cuTexRefSetFormat(B_texref) failed: res = %d\n->%s\n", res, getCudaDrvErrorString(res)); - exit(1); - } - } - if(pt->pid == 0 && pt->calc_flag == PART){ - gettimeofday(&tv_fconv_texture_end, NULL); - tvsub(&tv_fconv_texture_end, &tv_fconv_texture_start, &tv); - time_fconv_texture += tv.tv_sec * 1000.0 + (float)tv.tv_usec / 1000.0; - } - - if(pt->pid == 0){ - gettimeofday(&tv_memcpy_end, NULL); - tvsub(&tv_memcpy_end, &tv_memcpy_start, &tv); - time_memcpy += tv.tv_sec * 1000.0 + (float)tv.tv_usec / 1000.0; - } - - - /* allocate output region on GPU memory and upload date to GPU*/ - - if(pt->pid == 0){ - gettimeofday(&tv_memcpy_start, NULL); - } - if(pt->pid == 0 && pt->calc_flag == PART){ - gettimeofday(&tv_fconv_memcpyHtoD_start, NULL); - } - - res = cuMemcpyHtoD(fconvs_C_dev[pt->pid], pt->dst_C, pt->SUM_SIZE_C); - if(res != CUDA_SUCCESS) { - printf("cuMemcpyHtoD(part_C_dev) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - res = cuMemcpyHtoD(B_dims_dev[pt->pid], pt->B_dimension, 3*pt->len*sizeof(int)); - if(res != CUDA_SUCCESS){ - printf("cuMemcpyHtoD(B_dims) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - if(pt->pid == 0 && pt->calc_flag == PART){ - gettimeofday(&tv_fconv_memcpyHtoD_end, NULL); - tvsub(&tv_fconv_memcpyHtoD_end, &tv_fconv_memcpyHtoD_start, &tv); - time_fconv_memcpyHtoD += tv.tv_sec * 1000.0 + (float)tv.tv_usec / 1000.0; - } - if(pt->pid == 0){ - gettimeofday(&tv_memcpy_end, NULL); - tvsub(&tv_memcpy_end, &tv_memcpy_start, &tv); - time_memcpy += tv.tv_sec * 1000.0 + (float)tv.tv_usec / 1000.0; - } - - /* launch kernel - grid shape : block_num_x * block_num_y * L_MAX, - block shape : thread_num_x * thread_num_y * len - */ - /* dealing with 1 feature(A) by 1 z_dimension of grid */ - /* dealing with 1 model(B) by 1 z_dimension of block */ - - void *kernel_args[] = { - // &featp2_dev, // kernel_args[0] - // &B_dev, // kernel_args[1] - &fconvs_C_dev[pt->pid], // kernel_args[2] - &A_SIZE_dev[pt->pid], // kernel_args[3] - &B_dims_dev[pt->pid], // kernel_args[4] - (void *)&(pt->len), // kernel_args[5] - (void *)&(pt->interval), // kernel_args[6] - (void *)&(pt->L_MAX), // kernel_args[7] - &fconvs_error_array_dev[pt->pid], // kernel_args[8] - (void *)&(pt->error_array_num), // kernel_args[9] - (void *)&(pt->pid), // kernel_args[10] - (void *)&(device_num) // kernel_args[11] - }; - -#ifdef PRINT_INFO - if(pt->calc_flag == PART){ - printf("block_num_x = %d\n",block_num_x); - printf("block_num_y = %d\n",block_num_y); - printf("block_num_z = %d\n",pt->L_MAX*pt->len); - printf("thread_num_x = %d\n",thread_num_x); - printf("thread_num_y = %d\n",thread_num_y); - printf("thread_num_z = 1\n"); - } -#endif - - int sharedMemBytes = 0; - - int blockDimX = thread_num_x / device_num; - if(thread_num_x % device_num != 0) blockDimX++; - - - if(pt->pid == 0){ - gettimeofday(&tv_kernel_start, NULL); - } - if(pt->pid == 0 && pt->calc_flag == PART){ - gettimeofday(&tv_fconv_kernel_start, NULL); - } - - switch(pt->calc_flag) { - case ROOT: - res = cuLaunchKernel( - func_process_root[pt->pid], // call function - block_num_x, // gridDimX - block_num_y, // gridDimY - (pt->L_MAX)*(pt->len), // gridDimZ - blockDimX, // blockDimX - thread_num_y, // blockDimY - 1, // blockDimZ - sharedMemBytes, // sharedMemBytes - NULL, // hStream - kernel_args, // kernelParams - NULL // extra - ); - if(res != CUDA_SUCCESS){ - printf("cuLaunchKernel(root) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - break; - - case PART: - res = cuLaunchKernel( - func_process_part[pt->pid], // call function - block_num_x, // gridDimX - block_num_y, // gridDimY - (pt->L_MAX)*(pt->len), // gridDimZ - blockDimX, // blockDimX - thread_num_y, // blockDimY - 1, // blockDimZ - sharedMemBytes, // sharedMemBytes - NULL, // hStream - kernel_args, // kernelParams - NULL // extra - ); - if(res != CUDA_SUCCESS){ - printf("cuLaunchKernel(part) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - break; - - default: - printf("NOT DEFINED value: calc_flag = %d\n", pt->calc_flag); - exit(1); - break; - } - - /* synchronize GPU threads */ - res = cuCtxSynchronize(); - if(res != CUDA_SUCCESS){ - printf("pid = %d, calc_flag = %d\n",pt->pid, pt->calc_flag); - printf("cuCtxSynchronize(process) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - if(pt->pid == 0 && pt->calc_flag == PART){ - gettimeofday(&tv_fconv_kernel_end, NULL); - tvsub(&tv_fconv_kernel_end, &tv_fconv_kernel_start, &tv); - time_fconv_kernel += tv.tv_sec * 1000.0 + (float)tv.tv_usec / 1000.0; - } - - if(pt->pid == 0){ - gettimeofday(&tv_kernel_end, NULL); - tvsub(&tv_kernel_end, &tv_kernel_start, &tv); - time_kernel += tv.tv_sec * 1000.0 + (float)tv.tv_usec / 1000.0; - } - - - /* download C from GPU */ - if(pt->pid == 0){ - gettimeofday(&tv_memcpy_start, NULL); - } - if(pt->pid == 0 && pt->calc_flag == PART){ - gettimeofday(&tv_fconv_memcpyDtoH_start, NULL); - } - - int C_dims0 = 0; - int C_dims1 = 0; - int C_x = 0; - size_t x_size = 0; - int error_flag = 0; - unsigned long long int pointer_C = (unsigned long long int)pt->dst_C; - unsigned long long int root_pointer_dev = (unsigned long long int)fconvs_C_dev[pt->pid]; - unsigned long long int part_pointer_dev = (unsigned long long int)fconvs_C_dev[pt->pid]; - - - switch(pt->calc_flag) { - case ROOT: - for(int lev = pt->interval; lev < pt->L_MAX; lev++){ - - /* loop condition */ - for(int k = 0; k < pt->error_array_num; k++) { - if(pt->error_array[k] == lev) - error_flag = 1; - } - - for(int ii = 0; ii < pt->len; ii++) { - - if(error_flag == 1) { - error_flag = 0; - break; - } - - C_dims0 = pt->A_SIZE[lev*3] - pt->B_dimension[ii*3] + 1; - C_dims1 = pt->A_SIZE[lev*3+1] - pt->B_dimension[ii*3+1] + 1; - - if(C_dims0 < 1 || C_dims1 < 1) continue; - - C_x = C_dims1 / device_num; - - if(C_dims1 % device_num != 0){ - C_x++; - } - - - if(pt->pid*C_x + C_x > C_dims1) - x_size = (C_dims1-pt->pid*C_x)*C_dims0*sizeof(FLOAT); - else - x_size = C_x*C_dims0*sizeof(FLOAT); - - if(pt->pid*C_x < C_dims1){ - - res = cuMemcpyDtoH((void *)(pointer_C+(unsigned long long int)(pt->pid*C_x*C_dims0*sizeof(FLOAT))), (CUdeviceptr)(root_pointer_dev+(unsigned long long int)(pt->pid*C_x*C_dims0*sizeof(FLOAT))), x_size); - if(res != CUDA_SUCCESS) { - printf("cuMemcpyDtoH(dst_C root) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - } - - - pointer_C += (unsigned long long int)(C_dims0 * C_dims1 * sizeof(FLOAT)); - root_pointer_dev += (unsigned long long int)(C_dims0 * C_dims1 * sizeof(FLOAT)); - - } - - } - - if(pt->pid == 0){ - gettimeofday(&tv_memcpy_end, NULL); - tvsub(&tv_memcpy_end, &tv_memcpy_start, &tv); - time_memcpy += tv.tv_sec * 1000.0 + (float)tv.tv_usec / 1000.0; - } - - break; - - case PART: - - for(int lev = 0; lev < (pt->L_MAX-pt->interval); lev++) { - - for(int k = 0; k < part_error_array_num; k++) { - if(pt->error_array[k] == lev) - error_flag = 1; - } - - for(int ii = 0; ii < pt->len; ii++) { - - if(error_flag == 1) { - error_flag = 0; - break; - } - - C_dims0 = pt->A_SIZE[lev*3] - pt->B_dimension[ii*3] + 1; - C_dims1 = pt->A_SIZE[lev*3+1] - pt->B_dimension[ii*3+1] + 1; - - if(C_dims0 < 1 || C_dims1 < 1) continue; - - C_x = C_dims1 / device_num; - - if(C_dims1 % device_num != 0) { - C_x++; - } - - if(pt->pid*C_x + C_x > C_dims1) - x_size = (C_dims1-pt->pid*C_x)*C_dims0*sizeof(FLOAT); - else - x_size = C_x*C_dims0*sizeof(FLOAT); - - if(pt->pid*C_x < C_dims1){ - - res = cuMemcpyDtoH((void *)(pointer_C+(unsigned long long int)(pt->pid*C_x*C_dims0*sizeof(FLOAT))), (CUdeviceptr)(part_pointer_dev+(unsigned long long int)(pt->pid*C_x*C_dims0*sizeof(FLOAT))), x_size); - if(res != CUDA_SUCCESS) { - printf("cuMemcpyDtoH(dst_C root) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - } - - pointer_C += (unsigned long long int)(C_dims0 * C_dims1 * sizeof(FLOAT)); - part_pointer_dev += (unsigned long long int)(C_dims0 * C_dims1 * sizeof(FLOAT)); - - - } - - } - - if(pt->pid == 0 && pt->calc_flag == PART){ - gettimeofday(&tv_fconv_memcpyDtoH_end, NULL); - tvsub(&tv_fconv_memcpyDtoH_end, &tv_fconv_memcpyDtoH_start, &tv); - time_fconv_memcpyDtoH += tv.tv_sec * 1000.0 + (float)tv.tv_usec / 1000.0; - } - - if(pt->pid == 0){ - gettimeofday(&tv_memcpy_end, NULL); - tvsub(&tv_memcpy_end, &tv_memcpy_start, &tv); - time_memcpy += tv.tv_sec * 1000.0 + (float)tv.tv_usec / 1000.0; - } - - break; - - default: - printf("NOT DEFINED value: calc_flag = %d\n", pt->calc_flag); - exit(1); - break; - - } - -#ifdef PRINT_INFO - if(pt->pid == 0 && pt->calc_flag == PART){ - printf("fconv_kernel : %f[ms]\n",time_fconv_kernel); - printf("fconv_texture : %f[ms]\n",time_fconv_texture); - printf("fconv_others : %f[ms]\n",time_fconv_others); - printf("fconv_memalloc : %f[ms]\n",time_fconv_memalloc); - printf("fconv_memfree : %f[ms]\n",time_fconv_memfree); - printf("fconv_memcpyHtoD : %f[ms]\n",time_fconv_memcpyHtoD); - printf("fconv_memcpyDtoH : %f[ms]\n",time_fconv_memcpyDtoH); - printf("fconv_thread_time : %f[ms]\n",time_fconv_kernel+time_fconv_texture+time_fconv_others+time_fconv_memcpyHtoD+time_fconv_memcpyDtoH); - } -#endif - - - /* end of thread */ - CUT_THREADEND; -} - -FLOAT ***fconvsMT_GPU( - FLOAT **featp2, - size_t SUM_SIZE_feat, - FLOAT **filter, - int *sym_info, - int start, - int end, - int *A_SIZE, - int **B_SIZE, - int **M_size_array, - int L_MAX, - int interval, - int *FSIZE, - int padx, - int pady, - int max_X, - int max_Y, - int calc_flag - ) -{ - - struct timeval tv_fconv_start, tv_fconv_end; - float time_fconv; - struct timeval tv_fconv_others_start, tv_fconv_others_end; - float time_fconv_others; - - if(calc_flag == PART){ -#ifdef PRINT_INFO - printf("*******fconv PART print*******\n"); -#endif - gettimeofday(&tv_fconv_others_start, NULL); - } - - fconvs_partition *p = (fconvs_partition *)malloc(device_num*sizeof(fconvs_partition)); - - for(int i = 0; i < device_num; i++){ - p[i].max_height = 0; - p[i].max_width = 0; - } - - start=start-1; - end=end-1; - - const int len=end-start+1; - FLOAT ***Output = (FLOAT ***)malloc(L_MAX*sizeof(FLOAT **)); // make FLOAT* Output[L_MAX][len] - - struct timeval tv; - - thread_data **td = (thread_data **)malloc(L_MAX*sizeof(thread_data *)); // make thread_data td[L_MAX][len] - thread_data *dst_td = (thread_data *)calloc(L_MAX*len, sizeof(thread_data)); - unsigned long long int ptr_td = (unsigned long long int)dst_td; - for(int i=0; i error_array_num) { - printf("beyond error_array_num!\n"); - exit(1); - } - } - } - - - /* allocate output region on CPU memory */ - res = cuMemHostAlloc((void **)&(dst_C), SUM_SIZE_C, CU_MEMHOSTALLOC_DEVICEMAP); - if(res != CUDA_SUCCESS){ - printf("cuMemHostAlloc(dst_C) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - memset(dst_C, 0, SUM_SIZE_C); //zero clear - - /* distribution */ - unsigned long long int pointer = (unsigned long long int)dst_C; - for(int level=interval; level -#include -#include - -#include -#include -#include -#include - -#include -#include -#include - -using namespace std; - -//Header files -#include "MODEL_info.h" //File information -#include "common.hpp" - -#include "switch_float.h" -#include "switch_release.h" -#include "drvapi_error_string.h" -#include "resize_GPU.hpp" - -extern CUcontext *ctx; -extern CUfunction *func_calc_hist; -extern CUfunction *func_calc_norm; -extern CUfunction *func_calc_feat; -extern CUmodule *module; - -//definition of constant -#define eps 0.0001 - -//definition of sin and cos -static const FLOAT Hcos[9] = {1.0000 , 0.9397, 0.7660, 0.5000, 0.1736, -0.1736, -0.5000, -0.7660, -0.9397}; -static const FLOAT Hsin[9] = {0.0000 , 0.3420, 0.6428, 0.8660, 0.9848, 0.9848, 0.8660, 0.6428, 0.3420}; - -//definition of structure -struct thread_data { - FLOAT *IM; - int ISIZE[3]; - int FSIZE[2]; - int F_C; - int sbin; - FLOAT *Out; -}; - -struct thread_data_forGPU { - // FLOAT *IM; - int ISIZE[3]; - int FSIZE[2]; - int F_C; - int sbin; - FLOAT *Out; - CUdeviceptr hist_dev; - CUdeviceptr norm_dev; - CUdeviceptr feat_dev; - CUstream stream; -}; - -//main function to calculate feature pyramid - - -//external function - -//resize.cc -extern FLOAT *resize(FLOAT *src,int *sdims,int *odims,FLOAT scale); //resize image - -// resize_GPU.cc - -//inline functions - -//return maximum number (integer) -static inline int max_i(int x,int y) -{ - return (x >= y ? x : y); -} - -//return minimum number (integer) -static inline int min_i(int x,int y) -{ - return (x <= y ? x : y); -} - -//return minimum number (FLOAT) -static inline FLOAT min_2(FLOAT x) -{ - return (x <= 0.2 ? x :0.2); -} - -//initialization functions - -//initialize scales -FLOAT *gpu_init_scales(Model_info *MI,IplImage *IM,int X,int Y) //X,Y length of image -{ - int interval,max_scale; - - if(MI->ini) - { - //calculate max scale - //MI->interval/=2; //reduce calculation time - const int sbin = MI->sbin; - interval = MI->interval; - const FLOAT sc = pow(2.0,(1/(double)interval));// represent down-scale rate - const int numcomponent = MI->numcomponent; - //max_scale = 1+int(floor(log(minsize/(5*FLOAT(sbin)))/log(sc))); - max_scale = 36; - const int L_NUM = interval+max_scale; - - FLOAT MRY =(FLOAT)MI->rsize[0]; - FLOAT MRX =(FLOAT)MI->rsize[1]; - - for(int kk=1;kkrsize[kk*2]rsize[kk*2]; - if(MI->rsize[kk*2+1]rsize[kk*2+1]; - } - - MRY/=2; - MRX/=2; - - FLOAT height =(FLOAT)IM->height/(FLOAT)sbin; - FLOAT width = (FLOAT)IM->width/(FLOAT)sbin; - FLOAT sc_step =1/sc; // down-scale rate - - for(int kk=0;kkmax_scale=max_scale; -#ifdef PRINT_INFO - printf("max_scale:%d\n",max_scale); -#endif - MI->IM_HEIGHT=IM->height; - - MI->IM_WIDTH=IM->width; - - MI->ini=false; - } - else - { - interval = MI->interval; - max_scale = MI->max_scale; - MI->IM_HEIGHT = IM->height; - MI->IM_WIDTH = IM->width; - } - - //return - FLOAT *scales = (FLOAT*)calloc((max_scale+interval),sizeof(FLOAT)); //Model information - return(scales); -} - -//initialize feature size matrix -int *gpu_init_featsize(Model_info *MI) -{ - const int LofFeat = MI->max_scale+MI->interval; - int *featsize = (int*)calloc(LofFeat*2,sizeof(FLOAT)); // feature size information matrix - return(featsize); -} - -//calculate HOG features from Image -//HOG features are calculated for each block(BSL*BSL pixels) -#ifdef ORIGINAL -static FLOAT *calc_feature -( - FLOAT *SRC, // resized image - int *ISIZE, // resized image size (3 dimension) - int *FTSIZE, // size of feature(output) - int sbin // block size desicion element for each filter - ) -{ - /* input size */ - const int height = ISIZE[0]; //{268,268,134,67,233,117,203,203,177,154,89,203,154,77} - const int width = ISIZE[1]; //{448,112,224,390,195,340,170,296,257,148,340,257,129} - const int dims[2] = {height, width}; - - /* size of Histgrams and Norm calculation space size */ - const int blocks[2] = {(int)floor(double(height)/double(sbin)+0.5), (int)floor(double(width)/double(sbin)+0.5)}; //{67,112}....sbine=4 - - /* Output features size(Output) */ - int out[3] = {max_i(blocks[0]-2, 0), max_i(blocks[1]-2, 0), 27+4}; - - /* Visible range (eliminate border blocks) */ - const int visible[2] = {blocks[0]*sbin, blocks[1]*sbin}; - - /* HOG Histgram and Norm */ - FLOAT *hist = (FLOAT *)calloc(blocks[0]*blocks[1]*18, sizeof(FLOAT)); // HOG histgram - FLOAT *norm = (FLOAT *)calloc(blocks[0]*blocks[1], sizeof(FLOAT)); // Norm - - /* feature(Output) */ - FLOAT *feat = (FLOAT *)calloc(out[0]*out[1]*out[2], sizeof(FLOAT)); - - // for time measurement - struct timeval hist_start, hist_end; - struct timeval tv; - float histCreate = 0.; - - gettimeofday(&hist_start, NULL); - - for (int x=1; x v) { - v = v2; - dx = dx2; - dy = dy2; - } - if (v3 > v) { - v = v3; - dx = dx3; - dy = dy3; - } - - /* snap to one of 18 orientations */ - FLOAT best_dot = 0; - int best_o = 0; - for (int o=0; o<9; o++) - { - FLOAT dot = Hcos[o]*dx + Hsin[o]*dy; - if (dot > best_dot) { - best_dot = dot; - best_o = o; - } - else if (-dot > best_dot) { - best_dot = -dot; - best_o = o + 9; - } - } - - /*add to 4 histgrams aroud pixel using linear interpolation*/ - FLOAT xp = ((FLOAT)x+0.5)/(FLOAT)sbin - 0.5; - FLOAT yp = ((FLOAT)y+0.5)/(FLOAT)sbin - 0.5; - int ixp = (int)floor(xp); - int iyp = (int)floor(yp); - FLOAT vx0 = xp - ixp; - FLOAT vy0 = yp - iyp; - FLOAT vx1 = 1.0 - vx0; - FLOAT vy1 = 1.0 - vy0; - v = sqrt(v); - - if (ixp >= 0 && iyp >= 0) { - *(hist + ixp*blocks[0] + iyp + best_o*blocks[0]*blocks[1]) += vx1*vy1*v; - } - - if (ixp+1 < blocks[1] && iyp >= 0) { - *(hist + (ixp+1)*blocks[0] + iyp + best_o*blocks[0]*blocks[1]) += vx0*vy1*v; - } - - if (ixp >= 0 && iyp+1 < blocks[0]) { - *(hist + ixp*blocks[0] + (iyp+1) + best_o*blocks[0]*blocks[1]) += vx1*vy0*v; - } - - if (ixp+1 < blocks[1] && iyp+1 < blocks[0]) { - *(hist + (ixp+1)*blocks[0] + (iyp+1) + best_o*blocks[0]*blocks[1]) += vx0*vy0*v; - } - } - } - /*****************************************************************/ - // for time measurement - /*****************************************************************/ - gettimeofday(&hist_end, NULL); - tvsub(&hist_end, &hist_start, &tv); - histCreate = tv.tv_sec * 1000.0 + (float)tv.tv_usec / 1000.0; - printf("histCreate %f\n", histCreate); - fflush(stdout); - /*****************************************************************/ - /*****************************************************************/ - - /* compute energy in each block by summing over orientations */ -#if 1 - for (int o=0; o<9; o++) { - FLOAT *src1 = hist + o*blocks[0]*blocks[1]; - FLOAT *src2 = hist + (o+9)*blocks[0]*blocks[1]; - FLOAT *dst = norm; - FLOAT *end = norm + blocks[0]*blocks[1]; - - while(dst < end) { - *(dst++) += (*src1 + *src2) * (*src1 + *src2); - src1++; - src2++; - } - } -#else - for (int o=0; o<18; o++) { - FLOAT *src1 = hist + o*blocks[0]*blocks[1]; - FLOAT *dst = norm; - FLOAT *end = norm + blocks[0]*blocks[1]; - - while(dst < end) { - *(dst++) += (*src1) * (*src1); - src1++; - } - } -#endif - - /* compute featuers */ - for (int x=0; x%s\n", (text), (res), getCudaDrvErrorString((res))); \ - exit(1); \ - } - -#define USE_STREAM - -static pthread_barrier_t barrier; - - -static void calc_feature_byGPU -( - // FLOAT *SRC, // resized image - int *ISIZE, // resized image size (3 dimension) - int *FTSIZE, // size of feature(output) - int sbin, // block size desicion element for each filter - int level, - CUdeviceptr hist_dev, - CUdeviceptr norm_dev, - CUdeviceptr feat_dev, - CUstream stream - ) -{ - /* rename argument */ - // FLOAT *resized_image = SRC; - - /* input size */ - const int height = ISIZE[0]; //{268,268,134,67,233,117,203,203,177,154,89,203,154,77} - const int width = ISIZE[1]; //{448,112,224,390,195,340,170,296,257,148,340,257,129} - - /* size of Histgrams and Norm calculation space size */ - const int blocks[2] = {(int)floor(double(height)/double(sbin)+0.5), (int)floor(double(width)/double(sbin)+0.5)}; //{67,112}....sbine=4 - - /* Output features size(Output) */ - int out[3] = {max_i(blocks[0]-2, 0), max_i(blocks[1]-2, 0), 27+4}; - - /* Visible range (eliminate border blocks) */ - const int visible[2] = {blocks[0]*sbin, blocks[1]*sbin}; - - /* attach CUDA Context on this p-thread */ - CUresult res; - res = cuCtxSetCurrent(ctx[0]); - MY_CUDA_CHECK(res, "cuCtxSetCurrent(ctx[0])"); - - - - - void *kernel_args_hist[] = { - &hist_dev, - (void *)&sbin, - (void *)&visible[0], - (void *)&visible[1], - (void *)&level - }; - - - /* decide CUDA block shape */ - int max_thread_num = 0; - // MY_CUDA_CHECK(res, "cuDeviceGetAttribure()"); - - // max_thread_num = 128; - max_thread_num = 1024; - - int thread_num_x = (visible[1]-1 < sqrt(max_thread_num)) ? - visible[1]-1 : sqrt(max_thread_num); - int thread_num_y = (visible[0]-1 < sqrt(max_thread_num)) ? - visible[0]-1 : sqrt(max_thread_num); - - int block_num_x = (visible[1]-1) / thread_num_x; - int block_num_y = (visible[0]-1) / thread_num_y; - if ((visible[1]-1) % thread_num_x != 0) block_num_x++; - if ((visible[0]-1) % thread_num_y != 0) block_num_y++; - - int sharedMemBytes = 0; - - /* p-thread barrier */ - pthread_barrier_wait(&barrier); - - /* execute GPU function */ -#ifdef USE_STREAM - res = cuLaunchKernel( - func_calc_hist[0], // call function - block_num_x, // gridDimX - block_num_y, // gridDimY - 1, // gridDimZ - thread_num_x, // blockDimX - thread_num_y, // blockDimY - 1, // blockDimZ - sharedMemBytes, // sharedMemBytes - stream, // hStream - kernel_args_hist, // kernel Parameter - NULL // extra - ); -#else - res = cuLaunchKernel( - func_calc_hist[0], // call function - block_num_x, // gridDimX - block_num_y, // gridDimY - 1, // gridDimZ - thread_num_x, // blockDimX - thread_num_y, // blockDimY - 1, // blockDimZ - sharedMemBytes, // sharedMemBytes - NULL, // hStream - kernel_args_hist, // kernel Parameter - NULL // extra - ); - -#endif - MY_CUDA_CHECK(res, "cuLaunchKernel(calc_hist)"); - -#ifdef USE_STREAM - /* p-thread barrier in order to enqueue Launch command in breadth first order */ - pthread_barrier_wait(&barrier); - - /* synchronize CUDA Stream */ - /* - A CUDA operation is dispatched from the engine queue - if preceding calls in the same stream have completed. - So, there is no need to synchronize CUDA Stream here. - */ - // res = cuStreamSynchronize(stream); - // MY_CUDA_CHECK(res, "cuStreamSynchronize(stream)"); -#else - /* synchronize GPU threads */ - res = cuCtxSynchronize(); - MY_CUDA_CHECK(res, "cuCtxSynchronize(calc_hist)"); -#endif - - - - - /* compute energy in each block by summing over orientations */ - void *kernel_args_norm[] = { - &hist_dev, - &norm_dev, - (void *)&blocks[0], - (void *)&blocks[1], - (void *)&level - }; - - /* decide CUDA block shape */ - thread_num_x = (blocks[1] < sqrt(max_thread_num)) ? - blocks[1] : sqrt(max_thread_num); - thread_num_y = (blocks[0] < sqrt(max_thread_num)) ? - blocks[0] : sqrt(max_thread_num); - - block_num_x = blocks[1] / thread_num_x; - block_num_y = blocks[0] / thread_num_y; - if (blocks[1] % thread_num_x != 0) block_num_x++; - if (blocks[0] % thread_num_y != 0) block_num_y++; - - sharedMemBytes = 0; - - /* execute GPU function */ -#ifdef USE_STREAM - res = cuLaunchKernel( - func_calc_norm[0], // call function - block_num_x, // gridDimX - block_num_y, // gridDimY - 1, // gridDimZ - thread_num_x, // blockDimX - thread_num_y, // blockDimY - 1, // blockDimZ - sharedMemBytes, // sharedMemBytes - stream, // hStream - kernel_args_norm, // kernel Parameter - NULL // extra - ); -#else - res = cuLaunchKernel( - func_calc_norm[0], // call function - block_num_x, // gridDimX - block_num_y, // gridDimY - 1, // gridDimZ - thread_num_x, // blockDimX - thread_num_y, // blockDimY - 1, // blockDimZ - sharedMemBytes, // sharedMemBytes - NULL, // hStream - kernel_args_norm, // kernel Parameter - NULL // extra - ); -#endif - MY_CUDA_CHECK(res, "cuLaunchKernel(calc_norm)"); - -#ifdef USE_STREAM - /* p-thread barrier in order to enqueue Launch command in breadth first order */ - pthread_barrier_wait(&barrier); - - /* synchronize CUDA Stream */ - /* - A CUDA operation is dispatched from the engine queue - if preceding calls in the same stream have completed. - So, there is no need to synchronize CUDA Stream here. - */ - // res = cuStreamSynchronize(stream); - // MY_CUDA_CHECK(res, "cuStreamSynchronize(stream)"); -#else - /* synchronize GPU threads */ - res = cuCtxSynchronize(); - MY_CUDA_CHECK(res, "cuCtxSynchronize(calc_norm)"); -#endif - - - - /* compute featuers */ - void *kernel_args_feat[] = { - &hist_dev, - &norm_dev, - &feat_dev, - (void *)&out[0], - (void *)&out[1], - (void *)&blocks[0], - (void *)&blocks[1], - (void *)&level - }; - - /* decide CUDA block shape */ - thread_num_x = (out[1] < sqrt(max_thread_num)) ? - out[1] : sqrt(max_thread_num); - thread_num_y = (out[0] < sqrt(max_thread_num)) ? - out[0] : sqrt(max_thread_num); - - if (thread_num_x == 0) thread_num_x++; - if (thread_num_y == 0) thread_num_y++; - - block_num_x = out[1] / thread_num_x; - block_num_y = out[0] / thread_num_y; - if (out[1] % thread_num_x != 0 || block_num_x == 0) block_num_x++; - if (out[0] % thread_num_y != 0 || block_num_y == 0) block_num_y++; - - sharedMemBytes = 0; - - /* execute GPU function */ -#ifdef USE_STREAM - res = cuLaunchKernel( - func_calc_feat[0], // call function - block_num_x, // gridDimX - block_num_y, // gridDimY - 1, // gridDimZ - thread_num_x, // blockDimX - thread_num_y, // blockDimY - 1, // blockDimZ - sharedMemBytes, // sharedMemBytes - stream, // hStream - kernel_args_feat, // kernel Parameter - NULL // extra - ); -#else - res = cuLaunchKernel( - func_calc_feat[0], // call function - block_num_x, // gridDimX - block_num_y, // gridDimY - 1, // gridDimZ - thread_num_x, // blockDimX - thread_num_y, // blockDimY - 1, // blockDimZ - sharedMemBytes, // sharedMemBytes - NULL, // hStream - kernel_args_feat, // kernel Parameter - NULL // extra - ); -#endif - MY_CUDA_CHECK(res, "cuLaunchKernel(calc_feat)"); - -#ifdef USE_STREAM - /* p-thread barrier in order to enqueue Launch command in breadth first order */ - pthread_barrier_wait(&barrier); - - /* synchronize CUDA Stream */ - res = cuStreamSynchronize(stream); - MY_CUDA_CHECK(res, "cuStreamSynchronize(stream)"); -#else - /* synchronize GPU threads */ - res = cuCtxSynchronize(); - MY_CUDA_CHECK(res, "cuCtxSynchronize(calc_feat)"); -#endif - - - - - // free(hist); - // free(norm); - - /* size of feature(output) */ - *FTSIZE = out[0]; - *(FTSIZE+1) = out[1]; - - - // printf("feat%f\n",*(feat)); - // return(feat); - -} - - - -//sub functions - -// get pixel-intensity(FLOAT) of image(IplImage) - -FLOAT *Ipl_to_FLOAT(IplImage *Input) //get intensity data (FLOAT) of input -{ - const int width = Input->width; -#ifdef PRINT_INFO - printf("%d\n",width); -#endif - const int height = Input->height; -#ifdef PRINT_INFO - printf("%d\n",height); -#endif - const int nChannels = Input->nChannels; -#ifdef PRINT_INFO - printf("%d\n",nChannels); -#endif - const int SQ = height*width; - const int WS = Input->widthStep; - - FLOAT *Output = (FLOAT *)malloc(sizeof(FLOAT)*height*width*nChannels); -#ifdef PRINT_INFO - printf("%d",height*width*nChannels); -#endif - - FLOAT *R = Output; - FLOAT *G = Output + SQ; - FLOAT *B = Output + 2*SQ; - char *IDATA = Input->imageData; - - //pick intensity of pixel (color) - for(int x=0; xIM, args->ISIZE, args->FSIZE, args->sbin); - args->Out = Out; - pthread_exit((void*)thread_arg); -} -#endif - -static void* feat_calc_forGPU(void *thread_arg) -{ - thread_data_forGPU *args = (thread_data_forGPU *)thread_arg; - // FLOAT *IM = args->IM; - int *ISIZE = args->ISIZE; - int *FSIZE = args->FSIZE; - int sbin = args->sbin; - int level = args->F_C; - CUdeviceptr hist_dev = args->hist_dev; - CUdeviceptr norm_dev = args->norm_dev; - CUdeviceptr feat_dev = args->feat_dev; - CUstream stream = args->stream; - calc_feature_byGPU(//IM, - ISIZE, - FSIZE, - sbin, - level, - hist_dev, - norm_dev, - feat_dev, - stream - ); - - pthread_exit((void*)thread_arg); -} - - -#ifdef ORIGINAL -//void initialize thread data -static void ini_thread_data(thread_data *TD,FLOAT *IM,int *INSIZE,int sbin,int level) -{ - TD->IM = IM; - memcpy(TD->ISIZE, INSIZE, sizeof(int)*3); - TD->FSIZE[0] = 0; - TD->FSIZE[1] = 0; - TD->sbin = sbin; - TD->F_C = level; -} -#else -static void ini_thread_data_fouGPU(thread_data_forGPU *TD, - int *INSIZE, - int sbin, - int level, - CUdeviceptr hist_dev, - CUdeviceptr norm_dev, - CUdeviceptr feat_dev, - CUstream stream - ) -{ - // TD->IM = IM; - memcpy(TD->ISIZE, INSIZE, sizeof(int)*3); - TD->FSIZE[0] = 0; - TD->FSIZE[1] = 0; - TD->sbin = sbin; - TD->F_C = level; - TD->hist_dev = hist_dev; - TD->norm_dev = norm_dev; - TD->feat_dev = feat_dev; - TD->stream = stream; -} -#endif - -//#define ORIGINAL -//calculate feature pyramid (extended to main.cpp) - -//calculate feature pyramid -FLOAT **gpu_calc_f_pyramid -( - IplImage *Image, - Model_info *MI, - int *FTSIZE, - FLOAT *scale - ) //calculate feature pyramid -{ - /* constant parameters */ - const int max_scale = MI->max_scale; - const int interval = MI->interval; - const int sbin = MI->sbin; // for part filter - const int sbin2 = (int)floor((double)sbin/2.0); // for root filter - const int LEN = max_scale + interval; - const FLOAT sc = pow(2, (1.0/(double)interval)); - - int org_image_size[3] = {Image->height, Image->width, Image->nChannels}; // original image size // (元INSIZE) - - /* Original image (FLOAT) */ - // pickup brightness values of each channel from IplImage // (originally D_I) - FLOAT *org_image = dpm_ttic_gpu_Ipl_to_FLOAT_forGPU(Image); - -#ifdef ORIGINAL - /* features */ - FLOAT **feat = (FLOAT**)malloc(sizeof(FLOAT*)*LEN); //Model information -#endif - - /* thread for feature calculation */ -#ifdef ORIGINAL - thread_data *td = (thread_data *)calloc(LEN, sizeof(thread_data)); -#else - thread_data_forGPU *td = (thread_data_forGPU *)calloc(LEN, sizeof(thread_data_forGPU)); -#endif - pthread_t *ts = (pthread_t *)calloc(LEN, sizeof(pthread_t)); - - // FLOAT **resized_image = (FLOAT**)calloc(LEN, sizeof(FLOAT*)); // resized image // (originally RIM_S) - int *resized_image_size = (int*)calloc(LEN*3, sizeof(int)); // resized image size // (originally RI_S) - int t_count = 0; - - CUresult res; - res = cuCtxSetCurrent(ctx[0]); - MY_CUDA_CHECK(res, "cuCtxCurrent(ctx[0])"); - - - /*****************************************************************/ - // for time measurement - /*****************************************************************/ - CUevent resize_start, resize_end; - res = cuEventCreate(&resize_start, CU_EVENT_DEFAULT); - MY_CUDA_CHECK(res, "cuEventCreate(resize_start)"); - res = cuEventCreate(&resize_end, CU_EVENT_DEFAULT); - MY_CUDA_CHECK(res, "cuEventCreate(resize_end)"); - - cuEventRecord(resize_start, NULL); - MY_CUDA_CHECK(res, "cuEventRecord(resize_start)"); - - /* calculate resized image size */ - dpm_ttic_gpu_calc_resized_image_size(org_image_size, - resized_image_size, - interval, - sc, - max_scale, - scale); - -#ifndef ORIGINAL - /* create CUDA Stream for each p-thread */ - CUstream *stream = (CUstream *)malloc(LEN*sizeof(CUstream)); - for (int level=0; level -#include "switch_float.h" -#include "MODEL_info.h" - -extern int *gpu_init_featsize(Model_info *MI); -extern FLOAT *gpu_init_scales(Model_info *MI, IplImage *IM,int X,int Y); -extern void gpu_free_features(FLOAT **features,Model_info *MI); -extern FLOAT **gpu_calc_f_pyramid(IplImage *Image,Model_info *MI,int *FTSIZE,FLOAT *scale); - -#endif /* _FEATURE_PYRAMID_H_ */ diff --git a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/for_use_GPU.h b/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/for_use_GPU.h deleted file mode 100644 index e76b4a6e658..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/for_use_GPU.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2015-2019 Autoware Foundation. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef _CUDA_H -#define _CUDA_H -#include -#endif - -#include "MODEL_info.h" - -#ifndef _SWITCH_FLOAT_H -#define _SWITCH_FLOAT_H -#include "switch_float.h" -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* define variables for using GPU */ - -extern CUdevice *dev; -extern CUcontext *ctx; -extern CUfunction *func_process_root, *func_process_part, *func_dt1d_x, *func_dt1d_y, *func_calc_a_score, *func_inverse_Q; -extern CUmodule *module; -extern int *NR_MAXTHREADS_X, *NR_MAXTHREADS_Y; -extern CUdeviceptr *featp2_dev; -extern CUdeviceptr *A_SIZE_dev; -extern CUdeviceptr *B_dev; -extern CUdeviceptr *B_dims_dev; -extern CUdeviceptr *fconvs_error_array_dev; -extern CUdeviceptr *fconvs_C_dev; -extern CUdeviceptr *part_C_dev; -extern CUdeviceptr *part_error_array_dev; -extern CUdeviceptr *M_dev; -extern CUdeviceptr *tmpM_dev; -extern CUdeviceptr *tmpIx_dev; -extern CUdeviceptr *tmpIy_dev; -extern CUdeviceptr *pm_size_array_dev; -extern CUdeviceptr *PIDX_array_dev; -extern CUdeviceptr *def_array_dev; -extern int sum_size_def_array; -extern CUdeviceptr *DID_4_array_dev; -extern CUdeviceptr *numpart_dev; -extern int max_numpart; -extern int device_num; - -/* definition of calc_flag */ -#define ROOT 0 -#define PART 1 - -/* switch define sentence which use original source or GPU function */ -//#define ORIGINAL -#ifdef __cplusplus -} -#endif diff --git a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/get_boxes.cpp b/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/get_boxes.cpp deleted file mode 100644 index ae814cd4a22..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/get_boxes.cpp +++ /dev/null @@ -1,1259 +0,0 @@ -/////////////////////////Car tracking project with laser_radar_data_fusion///////////////////////////////////////// -//////////////////////////////////////////////////////////////////////Copyright 2009-10 Akihiro Takeuchi/////////// - -/////get_boxes.cpp detect boundary-boxes-coordinate of oject ///////////////////////////////////////////////////// - -#include -#include -#include -#include -#include - -#include "MODEL_info.h" //File information -#include "common.hpp" - -#include "for_use_GPU.h" -#include "switch_float.h" -#include "switch_release.h" -#include "dt.hpp" -#include "dt_GPU.hpp" -#include "detect.hpp" -#include "fconvsMT.hpp" - -#include - -int max_numpart = 0; -static int max_RL_S = 0; - -//definiton of functions// - -//get good-matched pixel-coordinate -static int *get_gmpc(FLOAT *score,FLOAT thresh,int *ssize,int *good_matched) -{ - const int limit = ssize[0]*ssize[1]; - int matches = 0; - - std::vector indices; - for(int i = 0; i < limit; i++) { - if(score[i] > thresh) { - indices.push_back(i); - matches++; - } - } - - int *result = (int*)malloc(matches * 2 *sizeof(int)); - int i = 0; - for (const int index : indices) { - result[i*2] = index % ssize[0]; - result[i*2+1] = index / ssize[0]; - ++i; - } - - *good_matched = matches; - return result; -} - -//get root-box pixel coordinate -static FLOAT *rootbox(int x, int y, FLOAT scale, int pad_x, int pad_y, int *root_size) -{ - FLOAT *Out=(FLOAT*)malloc(sizeof(FLOAT)*4); - - Out[0]=((FLOAT)y-(FLOAT)pad_y+1)*scale; //Y1 - Out[1]=((FLOAT)x-(FLOAT)pad_x+1)*scale; //X1 - Out[2]=Out[0]+(FLOAT)root_size[0]*scale-1.0; //Y2 - Out[3]=Out[1]+(FLOAT)root_size[1]*scale-1.0; //X2 - - return(Out); -} - -//get part-box pixel coordinate -static FLOAT *partbox(int x,int y,int ax,int ay,FLOAT scale,int padx,int pady,int *psize,int *lx,int *ly,int *ssize) -{ - FLOAT *Out=(FLOAT*)malloc(sizeof(FLOAT)*4); - int probex = (x-1)*2+ax; - int probey = (y-1)*2+ay; - int P = probey+probex*ssize[0]; - - FLOAT px = (FLOAT)lx[P]+1.0; - FLOAT py = (FLOAT)ly[P]+1.0; - - Out[0]=((py-2.0)/2.0+1.0-(FLOAT)pady)*scale; //Y1 - Out[1]=((px-2.0)/2.0+1.0-(FLOAT)padx)*scale; //X1 - Out[2]=Out[0]+(FLOAT)psize[0]*scale/2.0-1.0; //Y2 - Out[3]=Out[1]+(FLOAT)psize[1]*scale/2.0-1.0; //X2 - return(Out); -} - -static void calc_a_score_GPU(FLOAT *ac_score, FLOAT **score, - int *ssize_start, Model_info *MI, - FLOAT scale, int *size_score_array, - int NoC) -{ - CUresult res; - - const int IHEI = MI->IM_HEIGHT; - const int IWID = MI->IM_WIDTH; - int pady_n = MI->pady; - int padx_n = MI->padx; - int block_pad = (int)(scale/2.0); - - struct timeval tv; - - int *RY_array, *RX_array; - res = cuMemHostAlloc((void**)&RY_array, NoC*sizeof(int), CU_MEMHOSTALLOC_DEVICEMAP); - if(res != CUDA_SUCCESS) { - printf("cuMemHostAlloc(RY_array) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - res = cuMemHostAlloc((void**)&RX_array, NoC*sizeof(int), CU_MEMHOSTALLOC_DEVICEMAP); - if(res != CUDA_SUCCESS) { - printf("cuMemHostAlloc(RX_array) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - for(int i = 0; i < NoC; i++) { - int rsize[2] = {MI->rsize[i*2], MI->rsize[i*2+1]}; - - RY_array[i] = (int)((FLOAT)rsize[0]*scale/2.0-1.0+block_pad); - RX_array[i] = (int)((FLOAT)rsize[1]*scale/2.0-1.0+block_pad); - } - - CUdeviceptr ac_score_dev, score_dev; - CUdeviceptr ssize_dev, size_score_dev; - CUdeviceptr RY_dev, RX_dev; - - int size_score=0; - for(int i = 0; i < NoC; i++) { - size_score += size_score_array[i]; - } - - /* allocate GPU memory */ - res = cuMemAlloc(&ac_score_dev, gpu_size_A_SCORE); - if(res != CUDA_SUCCESS) { - printf("cuMemAlloc(ac_score) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - res = cuMemAlloc(&score_dev, size_score); - if(res != CUDA_SUCCESS) { - printf("cuMemAlloc(score) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - res = cuMemAlloc(&ssize_dev, 2*NoC*sizeof(int)); - if(res != CUDA_SUCCESS) { - printf("cuMemAlloc(ssize) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - res = cuMemAlloc(&size_score_dev, NoC*sizeof(int)); - if(res != CUDA_SUCCESS) { - printf("cuMemAlloc(size_score) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - res = cuMemAlloc(&RY_dev, NoC*sizeof(int)); - if(res != CUDA_SUCCESS) { - printf("cuMemAlloc(RY) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - res = cuMemAlloc(&RX_dev, NoC*sizeof(int)); - if(res != CUDA_SUCCESS) { - printf("cuMemAlloc(RX) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - gettimeofday(&tv_memcpy_start, nullptr); - /* upload date to GPU */ - res = cuMemcpyHtoD(ac_score_dev, &ac_score[0], gpu_size_A_SCORE); - if(res != CUDA_SUCCESS) { - printf("cuMemcpyHtoD(ac_score) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - res = cuMemcpyHtoD(score_dev, &score[0][0], size_score); - if(res != CUDA_SUCCESS) { - printf("cuMemcpyHtoD(score) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - res = cuMemcpyHtoD(ssize_dev, &ssize_start[0], 2*NoC*sizeof(int)); - if(res != CUDA_SUCCESS) { - printf("cuMemcpyHtoD(ssize) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - res = cuMemcpyHtoD(size_score_dev, &size_score_array[0], NoC*sizeof(int)); - if(res != CUDA_SUCCESS) { - printf("cuMemcpyHtoD(size_score) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - res = cuMemcpyHtoD(RY_dev, &RY_array[0], NoC*sizeof(int)); - if(res != CUDA_SUCCESS) { - printf("cuMemcpyHtoD(RY) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - res = cuMemcpyHtoD(RX_dev, &RX_array[0], NoC*sizeof(int)); - if(res != CUDA_SUCCESS) { - printf("cuMemcpyHtoD(RX) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - gettimeofday(&tv_memcpy_end, nullptr); - tvsub(&tv_memcpy_end, &tv_memcpy_start, &tv); - time_memcpy += tv.tv_sec * 1000.0 + (float)tv.tv_usec / 1000.0; - - void* kernel_args[] = { - (void*)&IWID, - (void*)&IHEI, - (void*)&scale, - (void*)&padx_n, - (void*)&pady_n, - &RX_dev, - &RY_dev, - &ac_score_dev, - &score_dev, - &ssize_dev, - (void*)&NoC, - &size_score_dev - }; - - int sharedMemBytes = 0; - - /* define CUDA block shape */ - int max_threads_num = 0; - int thread_num_x, thread_num_y; - int block_num_x, block_num_y; - - res = cuDeviceGetAttribute(&max_threads_num, CU_DEVICE_ATTRIBUTE_MAX_THREADS_PER_BLOCK, dev[0]); - if(res != CUDA_SUCCESS){ - printf("\ncuDeviceGetAttribute() failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - NR_MAXTHREADS_X[0] = (int)sqrt((double)max_threads_num/NoC); - NR_MAXTHREADS_Y[0] = (int)sqrt((double)max_threads_num/NoC); - - thread_num_x = (IWID < NR_MAXTHREADS_X[0]) ? IWID : NR_MAXTHREADS_X[0]; - thread_num_y = (IHEI < NR_MAXTHREADS_Y[0]) ? IHEI : NR_MAXTHREADS_Y[0]; - - block_num_x = IWID / thread_num_x; - block_num_y = IHEI / thread_num_y; - if(IWID % thread_num_x != 0) block_num_x++; - if(IHEI % thread_num_y != 0) block_num_y++; - - gettimeofday(&tv_kernel_start, nullptr); - /* launch GPU kernel */ - res = cuLaunchKernel( - func_calc_a_score[0], // call function - block_num_x, // gridDimX - block_num_y, // gridDimY - 1, // gridDimZ - thread_num_x, // blockDimX - thread_num_y, // blockDimY - NoC, // blockDimZ - sharedMemBytes, // sharedMemBytes - nullptr, // hStream - kernel_args, // kernelParams - nullptr // extra - ); - if(res != CUDA_SUCCESS) { - printf("cuLaunchKernel(calc_a_score) failed : res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - res = cuCtxSynchronize(); - if(res != CUDA_SUCCESS) { - printf("cuCtxSynchronize(calc_a_score) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - gettimeofday(&tv_kernel_end, nullptr); - tvsub(&tv_kernel_end, &tv_kernel_start, &tv); - time_kernel += tv.tv_sec * 1000.0 + (float)tv.tv_usec / 1000.0; - - gettimeofday(&tv_memcpy_start, nullptr); - /* download data from GPU */ - res = cuMemcpyDtoH(ac_score, ac_score_dev, gpu_size_A_SCORE); - if(res != CUDA_SUCCESS) { - printf("cuMemcpyDtoH(ac_score) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - gettimeofday(&tv_memcpy_end, nullptr); - tvsub(&tv_memcpy_end, &tv_memcpy_start, &tv); - time_memcpy += tv.tv_sec * 1000.0 + (float)tv.tv_usec / 1000.0; - - /* free GPU memory */ - res = cuMemFree(ac_score_dev); - if(res != CUDA_SUCCESS) { - printf("cuMemFree(ac_score_dev) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - res = cuMemFree(score_dev); - if(res != CUDA_SUCCESS) { - printf("cuMemFree(score_dev) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - res = cuMemFree(ssize_dev); - if(res != CUDA_SUCCESS) { - printf("cuMemFree(ssize_dev) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - res = cuMemFree(size_score_dev); - if(res != CUDA_SUCCESS) { - printf("cuMemFree(size_score_dev) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - res = cuMemFree(RY_dev); - if(res != CUDA_SUCCESS) { - printf("cuMemFree(RY_dev) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - res = cuMemFree(RX_dev); - if(res != CUDA_SUCCESS) { - printf("cuMemFree(RX_dev) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - /* free CPU memory */ - res = cuMemFreeHost(RY_array); - if(res != CUDA_SUCCESS) { - printf("cuMemFreeHost(RY_array) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - res = cuMemFreeHost(RX_array); - if(res != CUDA_SUCCESS) { - printf("cuMemFreeHost(RX_array) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } -} - -//free detected boxes result -static void free_boxes(FLOAT **boxes, int LofFeat) -{ - if (boxes == nullptr) - return; - - for (int i = 0; i < LofFeat; i++) { - s_free(boxes[i]); - } - - s_free(boxes); -} - -//detect boundary box -FLOAT *dpm_ttic_gpu_get_boxes(FLOAT **features,FLOAT *scales,int *feature_size, GPUModel *MO, - int *detected_count, FLOAT *acc_score, FLOAT thresh) -{ - //constant parameters - const int max_scale = MO->MI->max_scale; - const int interval = MO->MI->interval; - const int sbin = MO->MI->sbin; - const int padx = MO->MI->padx; - const int pady = MO->MI->pady; - const int NoR = MO->RF->NoR; - const int NoP = MO->PF->NoP; - const int NoC = MO->MI->numcomponent; - const int *numpart = MO->MI->numpart; - const int LofFeat=(max_scale+interval)*NoC; - const int L_MAX = max_scale+interval; - - /* for measurement */ - struct timeval tv; - struct timeval tv_make_c_start, tv_make_c_end; - struct timeval tv_nucom_start, tv_nucom_end; - struct timeval tv_box_start, tv_box_end; - float time_box=0; - struct timeval tv_root_score_start, tv_root_score_end; - float time_root_score = 0; - struct timeval tv_part_score_start, tv_part_score_end; - float time_part_score = 0; - struct timeval tv_dt_start, tv_dt_end; - float time_dt = 0; - struct timeval tv_calc_a_score_start, tv_calc_a_score_end; - float time_calc_a_score = 0; - - gettimeofday(&tv_make_c_start, nullptr); - - int **RF_size = MO->RF->root_size; - int *rootsym = MO->RF->rootsym; - int *part_sym = MO->PF->part_sym; - int **part_size = MO->PF->part_size; - FLOAT **rootfilter = MO->RF->rootfilter; - FLOAT **partfilter=MO->PF->partfilter; - int **psize = MO->MI->psize; - - int **rm_size_array = (int **)malloc(sizeof(int *)*L_MAX); - int **pm_size_array = (int **)malloc(sizeof(int *)*L_MAX); - pm_size_array = (int **)malloc(sizeof(int *)*L_MAX); - - FLOAT **Tboxes=(FLOAT**)calloc(LofFeat,sizeof(FLOAT*)); //box coordinate information(Temp) - int *b_nums =(int*)calloc(LofFeat,sizeof(int)); //length of Tboxes - int count = 0; - int detected_boxes=0; - CUresult res; - - /* matched score (root and part) */ - FLOAT ***rootmatch,***partmatch = nullptr; - - int *new_PADsize; // need new_PADsize[L_MAX*3] - size_t SUM_SIZE_feat = 0; - - FLOAT **featp2 = (FLOAT **)malloc(L_MAX*sizeof(FLOAT *)); - - - if(featp2 == nullptr) { // error semantics - printf("allocate featp2 failed\n"); - exit(1); - } - - - /* allocate required memory for new_PADsize */ - new_PADsize = (int *)malloc(L_MAX*3*sizeof(int)); - if(new_PADsize == nullptr) { // error semantics - printf("allocate new_PADsize failed\n"); - exit(1); - } - - /* do padarray once and reuse it at calculating root and part time */ - - /* calculate sum of size of padded feature */ - for(int tmpL=0; tmpLMI->max_Y ||(feature_size[level*2+1]+2*padxMI->max_X)) - { - Tboxes[count]=nullptr; - count++; - continue; - } - } //for (level) // feature's loop(A's loop) 1level 1picture - - ///////root calculation///////// - /* calculate model score (only root) */ - - gettimeofday(&tv_root_score_start, nullptr); - rootmatch = fconvsMT_GPU( - featp2, - SUM_SIZE_feat, - rootfilter, - rootsym, - 1, - NoR, - new_PADsize, - RF_size, rm_size_array, - L_MAX, - interval, - feature_size, - padx, - pady, - MO->MI->max_X, - MO->MI->max_Y, - ROOT - ); - gettimeofday(&tv_root_score_end, nullptr); - tvsub(&tv_root_score_end, &tv_root_score_start, &tv); - time_root_score += tv.tv_sec * 1000.0 + (float)tv.tv_usec / 1000.0; - - ///////part calculation///////// - if(NoP>0) - { - /* calculate model score (only part) */ - gettimeofday(&tv_part_score_start, nullptr); - partmatch = fconvsMT_GPU( - featp2, - SUM_SIZE_feat, - partfilter, - part_sym, - 1, - NoP, - new_PADsize, - part_size, - pm_size_array, - L_MAX, - interval, - feature_size, - padx, - pady, - MO->MI->max_X, - MO->MI->max_Y, - PART - ); - gettimeofday(&tv_part_score_end, nullptr); - tvsub(&tv_part_score_end, &tv_part_score_start, &tv); - time_part_score += tv.tv_sec * 1000.0 + (float)tv.tv_usec / 1000.0; - - } - - res = cuCtxSetCurrent(ctx[0]); - if(res != CUDA_SUCCESS) { - printf("cuCtxSetCurrent(ctx[0]) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - gettimeofday(&tv_make_c_end, nullptr); - gettimeofday(&tv_nucom_start, nullptr); - - count = 0; - detected_boxes = 0; - - int **RL_array = (int **)malloc((L_MAX-interval)*sizeof(int*)); - int *dst_RL = (int *) malloc(NoC*(L_MAX-interval)*sizeof(int)); - - int **RI_array = (int **)malloc((L_MAX-interval)*sizeof(int*)); - int *dst_RI = (int *)malloc(NoC*(L_MAX-interval)*sizeof(int)); - - int **OI_array = (int **)malloc((L_MAX-interval)*sizeof(int*)); - int *dst_OI = (int *)malloc((NoC)*(L_MAX-interval)*sizeof(int)); - - int **RL_S_array = (int **)malloc((L_MAX-interval)*sizeof(int*)); - int *dst_RL_S = (int *)malloc(NoC*(L_MAX-interval)*sizeof(int)); - - - FLOAT **OFF_array = (FLOAT **)malloc((L_MAX-interval)*sizeof(FLOAT*)); - FLOAT *dst_OFF = (FLOAT *)malloc(NoC*(L_MAX-interval)*sizeof(FLOAT)); - - FLOAT ***SCORE_array = (FLOAT ***)malloc((L_MAX-interval)*sizeof(FLOAT **)); - FLOAT **sub_dst_SCORE = (FLOAT **)malloc(NoC*(L_MAX-interval)*sizeof(FLOAT*)); - - uintptr_t pointer_RL = (uintptr_t)dst_RL; - uintptr_t pointer_RI = (uintptr_t)dst_RI; - uintptr_t pointer_OI = (uintptr_t)dst_OI; - uintptr_t pointer_RL_S = (uintptr_t)dst_RL_S; - uintptr_t pointer_OFF = (uintptr_t)dst_OFF; - uintptr_t pointer_SCORE = (uintptr_t)sub_dst_SCORE; - for (int level=interval; levelMI->max_Y ||(feature_size[level*2+1]+2*padxMI->max_X)) - { - continue; - } - - for(int j=0; jMI->ridx[j]; //root-index - OI_array[L][j] = MO->MI->oidx[j]; //offset-index - RL_S_array[L][j] =sizeof(FLOAT)*RL_array[L][j]; - - - OFF_array[L][j] = MO->MI->offw[RI_array[L][j]]; //offset information - - - /* search max values */ - max_RL_S = (max_RL_S < RL_S_array[L][j]) ? RL_S_array[L][j] : max_RL_S; - max_numpart = (max_numpart < numpart[j]) ? numpart[j] : max_numpart; - } - } - - sum_RL_S = max_RL_S*NoC*(L_MAX-interval); - - /* root matching size */ - sum_SNJ = sizeof(int*)*max_numpart*NoC*(L_MAX-interval); - - /* consolidated allocation for SCORE_array and distribute region */ - FLOAT *dst_SCORE = (FLOAT *)malloc(sum_RL_S); - pointer_SCORE = (uintptr_t)dst_SCORE; - for(int level=interval; levelMI->max_Y ||(feature_size[level*2+1]+2*padxMI->max_X)) - { - continue; - } - - for(int j=0; jMI->max_Y ||(feature_size[level*2+1]+2*padxMI->max_X)) - { - continue; - } - - for(int j=0; jMI->max_Y ||(feature_size[level*2+1]+2*padxMI->max_X)) - { - continue; - } - - ax_array[L] = (int **)pointer_ax; - pointer_ax += (uintptr_t)(NoC*sizeof(int*)); - - ay_array[L] = (int **)pointer_ay; - pointer_ay += (uintptr_t)(NoC*sizeof(int*)); - - Ix_array[L] = (int ***)pointer_Ix; - pointer_Ix += (uintptr_t)(NoC*sizeof(int**)); - - Iy_array[L] = (int ***)pointer_Iy; - pointer_Iy += (uintptr_t)(NoC*sizeof(int**)); - } - - pointer_ax = (uintptr_t)dst_ax; - pointer_ay = (uintptr_t)dst_ay; - pointer_Ix = (uintptr_t)dst_Ix; - pointer_Iy = (uintptr_t)dst_Iy; - for(int level=interval; levelMI->max_Y ||(feature_size[level*2+1]+2*padxMI->max_X)) - { - continue; - } - - for(int j=0; j0) - { - /* arrays to store temporary loop variables */ - int tmp_array_size = 0; - for(int level=interval; levelMI->max_Y ||(feature_size[level*2+1]+2*padxMI->max_X)) - { - continue; - } - - for(int j=0; jMI->max_Y ||(feature_size[level*2+1]+2*padxMI->max_X)) - { - continue; - } - - DIDX_array[L] = (int **)pointer_DIDX; - pointer_DIDX += (uintptr_t)(NoC*sizeof(int*)); - - DID_4_array[L] = (int **)pointer_DID_4; - pointer_DID_4 += (uintptr_t)(NoC*sizeof(int*)); - - PIDX_array[L] = (int **)pointer_PIDX; - pointer_PIDX += (uintptr_t)(NoC*sizeof(int*)); - } - - pointer_DIDX = (uintptr_t)dst_DIDX; - pointer_DID_4 = (uintptr_t)dst_DID_4; - pointer_PIDX = (uintptr_t)dst_PIDX; - for(int level=interval; levelMI->max_Y ||(feature_size[level*2+1]+2*padxMI->max_X)) { - continue; - } - - for(int j=0; jMI->max_Y ||(feature_size[level*2+1]+2*padxMI->max_X)) { - continue; - } - - for(int j=0; jMI->didx[j][k]; - DID_4_array[L][j][k] = DIDX_array[L][j][k]*4; - PIDX_array[L][j][k] = MO->MI->pidx[j][k]; - - /* anchor */ - ax_array[L][j][k] = MO->MI->anchor[DIDX_array[L][j][k]*2]+1; - ay_array[L][j][k] = MO->MI->anchor[DIDX_array[L][j][k]*2+1]+1; - - int PSSIZE[2] ={pm_size_array[L][PIDX_array[L][j][k]*2], pm_size_array[L][PIDX_array[L][j][k]*2+1]}; // size of C - - /* index matrix */ - sum_size_index_matrix += sizeof(int)*PSSIZE[0]*PSSIZE[1]; - } - } - } - - int *dst_Ix_kk = (int *)malloc(sum_size_index_matrix); - int *dst_Iy_kk = (int *)malloc(sum_size_index_matrix); - uintptr_t pointer_Ix_kk = (uintptr_t)dst_Ix_kk; - uintptr_t pointer_Iy_kk = (uintptr_t)dst_Iy_kk; - for(int level=interval; levelMI->max_Y ||(feature_size[level*2+1]+2*padxMI->max_X)) - { - continue; - } - - for(int j=0; jMI->max_X, // int max_X - MO->MI->max_Y, // int max_Y - MO->MI->def, // FLOAT *def - tmp_array_size, // int tmp_array_size - dst_PIDX, // int *dst_PIDX - dst_DID_4 // int *DID_4 - ); - gettimeofday(&tv_dt_end, nullptr); - tvsub(&tv_dt_end, &tv_dt_start, &tv); - time_dt += tv.tv_sec * 1000.0 + (float)tv.tv_usec / 1000.0; - - /* add part score */ - for(int level=interval; levelMI->max_Y ||(feature_size[level*2+1]+2*padxMI->max_X)) - { - continue; - } - - for(int j=0; j0) - - /* combine root and part score and detect boundary box for each-component */ - - FLOAT *scale_array = (FLOAT *)malloc((L_MAX-interval)*sizeof(FLOAT)); - for(int level=interval; levelMI->max_Y ||(feature_size[level*2+1]+2*padxMI->max_X)) - { - Tboxes[count]=nullptr; - count++; - continue; - } - - scale_array[L] = (FLOAT)sbin/scales[level]; - } - - for (int level=interval; levelMI->max_Y ||(feature_size[level*2+1]+2*padxMI->max_X)) { - Tboxes[count]=nullptr; - count++; - continue; - } - - /* calculate accumulated score */ - gettimeofday(&tv_calc_a_score_start, nullptr); - - calc_a_score_GPU( - acc_score, // FLOAT *ac_score - SCORE_array[L], // FLOAT **score - rm_size_array[level], // int *ssize_start - MO->MI, // Model_info *MI - scale, // FLOAT scale - RL_S_array[L], // int *size_score_array - NoC // int NoC - ); - - gettimeofday(&tv_calc_a_score_end, nullptr); - tvsub(&tv_calc_a_score_end, &tv_calc_a_score_start, &tv); - time_calc_a_score += tv.tv_sec * 1000.0 + (float)tv.tv_usec / 1000.0; - - for(int j = 0; j MI->rsize[j*2], MO->MI->rsize[j*2+1]}; - - int GL = (numpart[j]+1)*4+3; //31 - - /* detected box coordinate(current level) */ - FLOAT *t_boxes = (FLOAT*)calloc(GMN*GL,sizeof(FLOAT)); - - gettimeofday(&tv_box_start, nullptr); - - // NO NEED TO USE GPU - for(int k = 0;k < GMN;k++) { - FLOAT *P_temp = t_boxes+GL*k; - int y = GMPC[2*k]; - int x = GMPC[2*k+1]; - - /* calculate root box coordinate */ - FLOAT *RB =rootbox(x,y,scale,padx,pady,RSIZE); - memcpy(P_temp, RB,sizeof(FLOAT)*4); - s_free(RB); - P_temp+=4; - - for(int pp=0;ppMI->pidx[j][pp]*2], pm_size_array[L][MO->MI->pidx[j][pp]*2+1]}; - - /* calculate part box coordinate */ - FLOAT *PB = partbox(x,y,ax_array[L][j][pp],ay_array[L][j][pp],scale,padx,pady,PBSIZE,Ix_array[L][j][pp],Iy_array[L][j][pp],Isize); - memcpy(P_temp, PB,sizeof(FLOAT)*4); - P_temp+=4; - s_free(PB); - } - /* component number and score */ - *(P_temp++)=(FLOAT)j; //component number - *(P_temp++)=SCORE_array[L][j][x*R_S[0]+y]; //score of good match - *P_temp = scale; - } - - // NO NEED TO USE GPU - gettimeofday(&tv_box_end, nullptr); - tvsub(&tv_box_end, &tv_box_start, &tv); - time_box += tv.tv_sec * 1000.0 + (float)tv.tv_usec / 1000.0; - - /* save box information */ - if (GMN > 0) - Tboxes[count] = t_boxes; - else - Tboxes[count] = nullptr; - - b_nums[count]=GMN; - count++; - detected_boxes+=GMN; //number of detected box - - /* release */ - s_free(GMPC); - } - ////numcom - } - ////level - - /* free temporary arrays */ - free(dst_RL); - free(RL_array); - - free(dst_RI); - free(RI_array); - - free(dst_OI); - free(OI_array); - - free(dst_RL_S); - free(RL_S_array); - - free(dst_OFF); - free(OFF_array); - - free(dst_SCORE); - free(sub_dst_SCORE); - free(SCORE_array); - - free(dst_ax); - free(sub_dst_ax); - free(ax_array); - - free(dst_ay); - free(sub_dst_ay); - free(ay_array); - - free(Ix_array[0][0][0]); - free(dst_Ix); - free(sub_dst_Ix); - free(Ix_array); - - free(Iy_array[0][0][0]); - free(dst_Iy); - free(sub_dst_Iy); - free(Iy_array); - - free(scale_array); - - gettimeofday(&tv_nucom_end, nullptr); - -#ifdef PRINT_INFO - printf("root SCORE : %f\n", time_root_score); - printf("part SCORE : %f\n", time_part_score); - printf("dt : %f\n", time_dt); - printf("calc_a_score : %f\n", time_calc_a_score); -#endif - res = cuCtxSetCurrent(ctx[0]); - if(res != CUDA_SUCCESS) { - printf("cuCtxSetCurrent(ctx[0]) failed: res = %s\n",cuda_response_to_string(res)); - exit(1); - } - - /* free memory regions */ - res = cuMemFreeHost((void *)featp2[0]); - if(res != CUDA_SUCCESS) { - printf("cuMemFreeHost(featp2[0]) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - s_free(featp2); - - res = cuMemFreeHost((void *)rootmatch[interval][0]); - if(res != CUDA_SUCCESS) { - printf("cuMemFreeHost(rootmatch[0][0]) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - s_free(rootmatch[0]); - s_free(rootmatch); - - if (partmatch != nullptr) { - res = cuMemFreeHost((void *)partmatch[0][0]); - if(res != CUDA_SUCCESS) { - printf("cuMemFreeHost(partmatch[0][0]) failed: res = %s\n", cuda_response_to_string(res)); - exit(1); - } - - s_free(partmatch[0]); - s_free(partmatch); - - s_free(new_PADsize); - } - - /* release */ - s_free(rm_size_array[0]); - s_free(rm_size_array); - s_free(pm_size_array[0]); - s_free(pm_size_array); - - /* Output boundary-box coorinate information */ - int GL=(numpart[0]+1)*4+3; - FLOAT *boxes=(FLOAT*)calloc(detected_boxes*GL,sizeof(FLOAT)); //box coordinate information(Temp) - - FLOAT *T1 = boxes; - for(int i = 0; i < LofFeat; i++) { - int num_t = b_nums[i]*GL; - if(num_t > 0) { - FLOAT *T2 = Tboxes[i]; - //memcpy_s(T1,sizeof(FLOAT)*num_t,T2,sizeof(FLOAT)*num_t); - memcpy(T1, T2,sizeof(FLOAT)*num_t); - T1 += num_t; - } - } - - FLOAT abs_threshold = abs(thresh); - - /* accumulated score calculation */ - FLOAT max_score = 0.0; - - /* add offset to accumulated score */ - for(int i = 0; i < MO->MI->IM_HEIGHT*MO->MI->IM_WIDTH; i++) { - if (acc_score[i] < thresh) { - acc_score[i] = 0.0; - } else { - acc_score[i] += abs_threshold; - - if (acc_score[i] > max_score) - max_score = acc_score[i]; - } - } - - /* normalization */ - if (max_score > 0.0) { - FLOAT ac_ratio = 1.0 / max_score; - - for (int i = 0; i < MO->MI->IM_HEIGHT*MO->MI->IM_WIDTH; i++) { - acc_score[i] *= ac_ratio; - } - } - - /* release */ - free_boxes(Tboxes,LofFeat); - s_free(b_nums); - - /* output result */ - *detected_count = detected_boxes; - return boxes; -} diff --git a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/get_boxes.hpp b/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/get_boxes.hpp deleted file mode 100644 index f68370e8f0b..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/get_boxes.hpp +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef _GET_BOXES_H_ -#define _GET_BOXES_H_ - -#include "switch_float.h" -#include "MODEL_info.h" - -extern FLOAT *dpm_ttic_gpu_get_boxes(FLOAT **features,FLOAT *scales,int *FSIZE,GPUModel *MO,int *Dnum,FLOAT *A_SCORE,FLOAT thresh); - -#endif /* _GET_BOXES_H_ */ diff --git a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/load_model.cpp b/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/load_model.cpp deleted file mode 100644 index 82824dc1293..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/load_model.cpp +++ /dev/null @@ -1,494 +0,0 @@ -/////////////////////////Car tracking project with laser_radar_data_fusion///////////////////////////////////////// -//////////////////////////////////////////////////////////////////////Copyright 2009-10 Akihiro Takeuchi/////////// - -/////load_model.cpp load detection-model information //////////////////////////////////////////////////////////// - -//C++ library -#include -#include -#include -#include -#include - -//Header files -#include "MODEL_info.h" //Model-structure definition -#include "common.hpp" - -#include "for_use_GPU.h" -#include "switch_float.h" -#include "switch_release.h" -#include "load_model.hpp" - -#include - -#ifdef USE_FLOAT_AS_DECIMAL -#define FLOAT_SCAN_FMT "%f," -#else -#define FLOAT_SCAN_FMT "%lf," -#endif - -#define FLOAT_SCAN_FMT2 FLOAT_SCAN_FMT FLOAT_SCAN_FMT -#define FLOAT_SCAN_FMT3 FLOAT_SCAN_FMT2 FLOAT_SCAN_FMT -#define FLOAT_SCAN_FMT4 FLOAT_SCAN_FMT3 FLOAT_SCAN_FMT - -int sum_size_def_array; - -//subfunctions - -//load model basic information -static Model_info * load_modelinfo(const char *filename) -{ - Model_info *MI=(Model_info*)malloc(sizeof(Model_info)); //Model information - - FILE *file = fopen(filename, "r"); - if (file == nullptr) { - std::cerr << std::strerror(errno) << std::endl; - std::exit(-1); - } - - FLOAT t1,t2,t3,t4; - - //load basic information - fscanf(file,FLOAT_SCAN_FMT ",",&t1); - MI->numcomponent=(int)t1; //number of components - fscanf(file,FLOAT_SCAN_FMT,&t1); - MI->sbin=(int)t1; //sbin - fscanf(file,FLOAT_SCAN_FMT,&t1); - MI->interval=(int)t1; //interval - fscanf(file,FLOAT_SCAN_FMT,&t1); - MI->max_Y=(int)t1; //max_Y - fscanf(file,FLOAT_SCAN_FMT,&t1); - MI->max_X=(int)t1; //max_X - - //root filter information - MI->ridx = (int*)malloc(sizeof(int)*MI->numcomponent); - MI->oidx = (int*)malloc(sizeof(int)*MI->numcomponent); - MI->offw = (FLOAT*)malloc(sizeof(FLOAT)*MI->numcomponent); - MI->rsize = (int*)malloc(sizeof(int)*MI->numcomponent*2); - MI->numpart = (int*)malloc(sizeof(int)*MI->numcomponent); - - //part filter information - MI->pidx = (int**)malloc(sizeof(int*)*MI->numcomponent); - MI->didx = (int**)malloc(sizeof(int*)*MI->numcomponent); - MI->psize = (int**)malloc(sizeof(int*)*MI->numcomponent); - - for(int i = 0; i < MI->numcomponent; i++) { - fscanf(file,FLOAT_SCAN_FMT,&t1); - MI->ridx[i]=(int)t1-1; //root index - fscanf(file,FLOAT_SCAN_FMT,&t1); - MI->oidx[i]=(int)t1-1; //offset index - fscanf(file,FLOAT_SCAN_FMT,&t1); - MI->offw[i]=t1; //offset weight (FLOAT) - fscanf(file,FLOAT_SCAN_FMT2,&t1,&t2); - MI->rsize[i*2]=(int)t1; //rsize (Y) - MI->rsize[i*2+1]=(int)t2; //rsize (X) - fscanf(file,FLOAT_SCAN_FMT,&t1); - MI->numpart[i]=(int)t1; //number of part filter - - MI->pidx[i]=(int*)malloc(sizeof(int)*MI->numpart[i]); - MI->didx[i]=(int*)malloc(sizeof(int)*MI->numpart[i]); - MI->psize[i]=(int*)malloc(sizeof(int)*MI->numpart[i]*2); - - //LOOP (part-filter) - for(int j = 0;j < MI->numpart[i]; j++) - { - fscanf(file,FLOAT_SCAN_FMT,&t1); - MI->pidx[i][j]=(int)t1-1; //part index - fscanf(file,FLOAT_SCAN_FMT,&t1); - MI->didx[i][j]=(int)t1-1; //define-index of part - fscanf(file,FLOAT_SCAN_FMT2,&t1,&t2); - MI->psize[i][j*2]=(int)t1; - MI->psize[i][j*2+1]=(int)t2; - } - } - - //get defs information - fscanf(file,FLOAT_SCAN_FMT,&t1); - - int DefL = int(t1); - - CUresult res = cuMemHostAlloc((void **)&(MI->def), sizeof(FLOAT)*DefL*4, CU_MEMHOSTALLOC_DEVICEMAP); - if(res != CUDA_SUCCESS) { - std::cerr << "Failed: cuMemHostAlloc(MI->def) : " - << cuda_response_to_string(res) << std::endl; - std::exit(1); - } - sum_size_def_array = sizeof(FLOAT)*DefL*4; - - MI->anchor = (int*)malloc(sizeof(int)*DefL*2); - - for (int i = 0; i < DefL; i++) { - fscanf(file,FLOAT_SCAN_FMT4,&t1,&t2,&t3,&t4); - MI->def[i*4]=t1; - MI->def[i*4+1]=t2; - MI->def[i*4+2]=t3; - MI->def[i*4+3]=t4; - fscanf(file,FLOAT_SCAN_FMT2,&t1,&t2); - MI->anchor[i*2]=(int)t1; - MI->anchor[i*2+1]=(int)t2; - } - - //get least_square information - MI->x1 = (FLOAT **)malloc(sizeof(FLOAT*)*MI->numcomponent); - MI->x2 = (FLOAT **)malloc(sizeof(FLOAT*)*MI->numcomponent); - MI->y1 = (FLOAT **)malloc(sizeof(FLOAT*)*MI->numcomponent); - MI->y2 = (FLOAT **)malloc(sizeof(FLOAT*)*MI->numcomponent); - - for(int i = 0; i < MI->numcomponent; i++) { - int GL = 1+2*(1+MI->numpart[i]); - MI->x1[i] =(FLOAT *)malloc(sizeof(FLOAT)*GL); - MI->y1[i] =(FLOAT *)malloc(sizeof(FLOAT)*GL); - MI->x2[i] =(FLOAT *)malloc(sizeof(FLOAT)*GL); - MI->y2[i] =(FLOAT *)malloc(sizeof(FLOAT)*GL); - - for (int j = 0; j < GL; j++) { - fscanf(file,FLOAT_SCAN_FMT,&t1); - MI->x1[i][j] = t1; - } - for (int j = 0; j < GL; j++) { - fscanf(file,FLOAT_SCAN_FMT,&t1); - MI->y1[i][j] = t1; - } - - for (int j = 0; j < GL; j++){ - fscanf(file,FLOAT_SCAN_FMT,&t1); - MI->x2[i][j] = t1; - } - - for (int j = 0; j < GL; j++){ - fscanf(file,FLOAT_SCAN_FMT,&t1); - MI->y2[i][j] = t1; - } - } - - MI->padx=(int)ceil((double)MI->max_X/2.0+1.0); //padx - MI->pady=(int)ceil((double)MI->max_Y/2.0+1.0); //padY - - MI->ini=true; - - fclose(file); - return(MI); -} - -static Rootfilters *load_rootfilter(const char *filename) -{ - FILE *file = fopen(filename, "r"); - if (file == nullptr) { - std::cerr << std::strerror(errno) << std::endl; - std::exit(-1); - } - - FLOAT t1,t2,t3; - FLOAT dummy_t1, dummy_t2, dummy_t3; // variable for dummy scan in order to adjust the location of file-pointer - - fscanf(file,FLOAT_SCAN_FMT,&t1); - - Rootfilters *RF=(Rootfilters*)malloc(sizeof(Rootfilters)); - RF->NoR=(int)t1; //number of root filter - - RF->root_size=(int**)malloc(sizeof(int*)*RF->NoR); //size of root filter - RF->rootfilter=(FLOAT**)malloc(sizeof(FLOAT*)*RF->NoR); //weight of root filter - RF->rootsym=(int*)malloc(sizeof(int)*RF->NoR); //symmetric information of root - - /* keep file pointer location */ - long before_loop_location = ftell(file); - - CUresult res; - size_t sum_size_root = 0; - for (int i = 0; i < RF-> NoR; i++) { - fscanf(file,FLOAT_SCAN_FMT3,&t1,&t2,&t3); //number of components - - RF->root_size[i]=(int*)malloc(sizeof(int)*3); - RF->root_size[i][0]=(int)t1; - RF->root_size[i][1]=(int)t2; - RF->root_size[i][2]=(int)t3; - - int NUMB=RF->root_size[i][0]*RF->root_size[i][1]*RF->root_size[i][2]; -#ifdef ORIGINAL - RF->rootfilter[i]=(FLOAT*)malloc(sizeof(FLOAT)*NUMB); //weight of root filter -#else -#ifdef SEPARETE_MEM - res = cuMemHostAlloc((void **)&(RF->rootfilter[i]), sizeof(FLOAT)*NUMB, CU_MEMHOSTALLOC_DEVICEMAP); - if(res != CUDA_SUCCESS){ - std::cerr << "Failed: cuMemHostAlloc(RF->rootfilter): " - << cuda_response_to_string(res) << std::endl; - std::exit(1); - } -#else - sum_size_root += NUMB*sizeof(FLOAT); -#endif -#endif - /* adjust the location of file-pointer */ - for(int j = 0; j < NUMB; j++) { - fscanf(file,FLOAT_SCAN_FMT,&dummy_t1); // this is dummy scan - } - } - -#ifndef ORIGINAL -#ifndef SEPARETE_MEM - /* allocate memory for root in a lump */ - FLOAT *dst_root; - res = cuMemHostAlloc((void **)&dst_root, sum_size_root , CU_MEMHOSTALLOC_DEVICEMAP); - if(res != CUDA_SUCCESS){ - std::cerr << "Failed: cuMemHostAlloc(dst_root): " - << cuda_response_to_string(res) << std::endl; - std::exit(1); - } - - /* distribution */ - unsigned long long int pointer = (unsigned long long int)dst_root; - for(int i = 0; i < RF->NoR; i++) { - RF->rootfilter[i] = (FLOAT *)pointer; - int NUMB=RF->root_size[i][0]*RF->root_size[i][1]*RF->root_size[i][2]; - pointer += NUMB*sizeof(FLOAT); - } -#endif -#endif - - /* reset the location of file pointer */ - fseek(file, before_loop_location, SEEK_SET); - - for(int i = 0; i < RF->NoR; i++) { - int NUMB = RF->root_size[i][0]*RF->root_size[i][1]*RF->root_size[i][2]; - - /* adjust the location of file-pointer */ - fscanf(file,FLOAT_SCAN_FMT3,&dummy_t1,&dummy_t2,&dummy_t3); // this is dummy scan - - for (int j = 0; j < NUMB;j++) { - fscanf(file,FLOAT_SCAN_FMT,&t1); - RF->rootfilter[i][j]=t1; - } - RF->rootsym[i] = 1; - -#ifdef PRINT_INFO - printf("root No.%d size %d %d \n",i,RF->root_size[i][0],RF->root_size[i][1]); -#endif - } - - fclose(file); - return(RF); -} - -static Partfilters *load_partfilter(const char *filename) -{ - CUresult res; - - Partfilters *PF=(Partfilters*)malloc(sizeof(Partfilters)); //Part filter - - FILE *file = fopen(filename, "r"); - if (file == nullptr) { - std::cerr << std::strerror(errno) << std::endl; - std::exit(-1); - } - - FLOAT t1,t2,t3; - FLOAT dummy_t1, dummy_t2, dummy_t3; // variable for dummy scan in order to adjust the location of file-pointer - - fscanf(file,FLOAT_SCAN_FMT,&t1); - - PF->NoP=(int)t1; //number of part filter - - PF->part_size=(int**)malloc(sizeof(int*)*PF->NoP); //size of part filter - PF->partfilter=(FLOAT**)malloc(sizeof(FLOAT*)*PF->NoP); //weight of part filter - PF->part_partner=(int*)malloc(sizeof(int)*PF->NoP); //symmetric information of part - PF->part_sym=(int*)malloc(sizeof(int)*PF->NoP); //symmetric information of part - - /* keep file pointer location */ - long before_loop_location = ftell(file); - - int SUM_SIZE_PART = 0; - for (int i = 0; i < PF->NoP; i++) { - fscanf(file,FLOAT_SCAN_FMT3,&t1,&t2,&t3); //number of components - - PF->part_size[i]=(int*)malloc(sizeof(int)*3); - PF->part_size[i][0]=(int)t1; - PF->part_size[i][1]=(int)t2; - PF->part_size[i][2]=(int)t3; - //printf("***************%f %f %f\n",t1,t2,t3); - int NUMB=PF->part_size[i][0]*PF->part_size[i][1]*PF->part_size[i][2]; -#ifdef ORIGINAL - PF->partfilter[i]=(FLOAT*)malloc(sizeof(FLOAT)*NUMB); //weight of root filter -#else -#ifdef SEPARETE_MEM - res = cuMemHostAlloc((void **)&(PF->partfilter[i]), sizeof(FLOAT)*NUMB, CU_MEMHOSTALLOC_DEVICEMAP); - if(res != CUDA_SUCCESS){ - std::cerr << "Failed: cuMemHostAlloc(PF->partfilter): " - << cuda_response_to_string(res) << std::endl; - std::exit(1); - } -#else - SUM_SIZE_PART += NUMB*sizeof(FLOAT); -#endif -#endif - /* adjust the location of file-pointer */ - for(int j = 0; j < NUMB; j++) { - fscanf(file,FLOAT_SCAN_FMT,&dummy_t1); // this is dummy scan - } - fscanf(file,FLOAT_SCAN_FMT,&dummy_t1); // this is dummy scan - } - -#ifndef ORIGINAL -#ifndef SEPARETE_MEM - /* allocate memory region for part in a lump */ - FLOAT *dst_part; - res = cuMemHostAlloc((void **)&dst_part, SUM_SIZE_PART, CU_MEMHOSTALLOC_DEVICEMAP); - if(res != CUDA_SUCCESS){ - std::cerr << "Failed: cuMemHostAlloc(dst_part): " - << cuda_response_to_string(res) << std::endl; - std::exit(1); - } - - /* distribution */ - uintptr_t pointer = (uintptr_t)dst_part; - for(int i = 0; i < PF->NoP; i++) { - PF->partfilter[i] = (FLOAT *)pointer; - int NUMB=PF->part_size[i][0]*PF->part_size[i][1]*PF->part_size[i][2]; - pointer += NUMB*sizeof(FLOAT); - } -#endif -#endif - /* reset the location of file-pointer */ - fseek(file, before_loop_location, SEEK_SET); - - for(int i = 0; i < PF->NoP; i++) { - int NUMB = PF->part_size[i][0]*PF->part_size[i][1]*PF->part_size[i][2]; - - /* adjust the location of file-pointer */ - fscanf(file,FLOAT_SCAN_FMT3,&dummy_t1,&dummy_t2,&dummy_t3); // this is dummy scan - - for (int j = 0; j < NUMB; j++) { - fscanf(file,FLOAT_SCAN_FMT,&t1); - PF->partfilter[i][j]=t1; - } - fscanf(file,FLOAT_SCAN_FMT,&t1); - - PF->part_partner[i]=(int)t1; //symmetric information of part - - if(PF->part_partner[i]==0) - PF->part_sym[i]=1; - else - PF->part_sym[i]=0; - } - - fclose(file); - return(PF); -} - -GPUModel *dpm_ttic_gpu_load_model(FLOAT ratio, const char *com_csv, const char *root_csv, const char *part_csv) -{ - GPUModel *model = (GPUModel*)malloc(sizeof(GPUModel)); - - // assign information into model.OO - model->MI = load_modelinfo(com_csv); - model->RF = load_rootfilter(root_csv); - model->PF = load_partfilter(part_csv); - - model->MI->ratio = ratio; - - /* added to reuse resized feature */ - model->MI->padx = 0; - model->MI->pady = 0; - - return model; -} - -//release model -void dpm_ttic_gpu_free_model(GPUModel *MO) -{ - //free model information - for(int i=0; i < MO->MI->numcomponent; i++) { - s_free(MO->MI->didx[i]); - s_free(MO->MI->pidx[i]); - s_free(MO->MI->psize[i]); - s_free(MO->MI->x1[i]); - s_free(MO->MI->x2[i]); - s_free(MO->MI->y1[i]); - s_free(MO->MI->y2[i]); - } - s_free(MO->MI->anchor); - - // s_free(MO->MI->def); - CUresult res = cuMemFreeHost((void *)MO->MI->def); - if(res != CUDA_SUCCESS) { - std::cerr << "Failed: cuMemFreeHost(MO->MI->def): " - << cuda_response_to_string(res) << std::endl; - std::exit(1); - } - - s_free(MO->MI->numpart); - s_free(MO->MI->offw); - s_free(MO->MI->oidx); - s_free(MO->MI->ridx); - s_free(MO->MI->rsize); - s_free(MO->MI->x1); - s_free(MO->MI->x2); - s_free(MO->MI->y1); - s_free(MO->MI->y2); - s_free(MO->MI); - - //free root-filter information - for(int i = 0; i < MO->RF->NoR; i++) { - s_free(MO->RF->root_size[i]); -#ifdef ORIGINAL - s_free(MO->RF->rootfilter[i]); -#else -#ifdef SEPARETE_MEM - res = cuMemFreeHost((void *)MO->RF->rootfilter[i]); - if(res != CUDA_SUCCESS){ - std::cerr << "Failed: cuMemFreeHost(MO->RF->rootfilter): " - << cuda_response_to_string(res) << std::endl; - std::exit(1); - } -#endif -#endif - } - -#ifndef ORIGINAL -#ifndef SEPARETE_MEM - /* free heap region in a lump */ - res = cuMemFreeHost((void *)MO->RF->rootfilter[0]); - if(res != CUDA_SUCCESS){ - std::cerr << "Failed: cuMemFreeHost(MO->RF->rootfilter[0]): " - << cuda_response_to_string(res) << std::endl; - std::exit(1); - } -#endif -#endif - s_free(MO->RF->rootsym); - s_free(MO->RF); - - //free root-filter information - for(int i = 0; i < MO->PF->NoP; i++) - { - s_free(MO->PF->part_size[i]); -#ifdef ORIGINAL - s_free(MO->PF->partfilter[i]); -#else -#ifdef SEPARETE_MEM - res = cuMemFreeHost((void *)MO->PF->partfilter[i]); - if(res != CUDA_SUCCESS){ - std::cerr << "Failed: cuMemFreeHost(MO->PF->partfilter): " - << cuda_response_to_string(res) << std::endl; - std::exit(1); - } -#endif -#endif - } - -#ifndef ORIGINAL -#ifndef SEPARETE_MEM - /* free heap region in a lump */ - res = cuMemFreeHost((void *)MO->PF->partfilter[0]); - if(res != CUDA_SUCCESS){ - std::cerr << "Failed: cuMemFreeHost(MO->PF->partfilter[0]): " - << cuda_response_to_string(res) << std::endl; - std::exit(1); - } -#endif -#endif - s_free(MO->PF->part_partner); - s_free(MO->PF->part_sym); - s_free(MO->PF); - - s_free(MO); -} diff --git a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/load_model.hpp b/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/load_model.hpp deleted file mode 100644 index 95ccf51c40b..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/load_model.hpp +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef _LOAD_MODEL_H_ -#define _LOAD_MODEL_H_ - -extern GPUModel *dpm_ttic_gpu_load_model(FLOAT ratio, const char *com_csv, const char *root_csv, const char *part_csv); -extern void dpm_ttic_gpu_free_model(GPUModel *MO); - -#endif /* _LOAD_MODEL_H_ */ diff --git a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/multithreading.cpp b/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/multithreading.cpp deleted file mode 100644 index 5d9897a35f1..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/multithreading.cpp +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. - * - * NVIDIA Corporation and its licensors retain all intellectual property and - * proprietary rights in and to this software and related documentation. - * Any use, reproduction, disclosure, or distribution of this software - * and related documentation without an express license agreement from - * NVIDIA Corporation is strictly prohibited. - * - * Please refer to the applicable NVIDIA end user license agreement (EULA) - * associated with this source code for terms and conditions that govern - * your use of this NVIDIA software. - * - */ - -#include "multithreading.h" - -CUTThread cutStartThread(CUT_THREADROUTINE func, void * data) -{ - pthread_t thread; - pthread_create(&thread, NULL, func, data); - return thread; -} - -void cutEndThread(CUTThread thread) -{ - pthread_join(thread, NULL); -} - -void cutDestroyThread(CUTThread thread) -{ - pthread_cancel(thread); -} - -void cutWaitForThreads(const CUTThread * threads, int num) -{ - for(int i = 0; i < num; i++) - cutEndThread(threads[i]); -} diff --git a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/multithreading.h b/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/multithreading.h deleted file mode 100644 index e48f5d2bf6a..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/multithreading.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 1993-2007 NVIDIA Corporation. All rights reserved. - * - * NOTICE TO USER: - * - * This source code is subject to NVIDIA ownership rights under U.S. and - * international Copyright laws. Users and possessors of this source code - * are hereby granted a nonexclusive, royalty-free license to use this code - * in individual and commercial software. - * - * NVIDIA MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE - * CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR - * IMPLIED WARRANTY OF ANY KIND. NVIDIA DISCLAIMS ALL WARRANTIES WITH - * REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE. - * IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, - * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS - * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE - * OR PERFORMANCE OF THIS SOURCE CODE. - * - * U.S. Government End Users. This source code is a "commercial item" as - * that term is defined at 48 C.F.R. 2.101 (OCT 1995), consisting of - * "commercial computer software" and "commercial computer software - * documentation" as such terms are used in 48 C.F.R. 12.212 (SEPT 1995) - * and is provided to the U.S. Government only as a commercial end item. - * Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through - * 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the - * source code with only those rights set forth herein. - * - * Any use of this source code in individual and commercial software must - * include, in the user documentation and internal comments to the code, - * the above Disclaimer and U.S. Government End Users Notice. - */ - -#ifndef MULTITHREADING_H -#define MULTITHREADING_H - -//Simple portable thread library. - -#include - -typedef pthread_t CUTThread; -typedef void *(*CUT_THREADROUTINE)(void *); - -#define CUT_THREADPROC void -#define CUT_THREADEND - - -#ifdef __cplusplus - extern "C" { -#endif - -//Create thread. -CUTThread cutStartThread(CUT_THREADROUTINE, void *data); - -//Wait for thread to finish. -void cutEndThread(CUTThread thread); - -//Destroy thread. -void cutDestroyThread(CUTThread thread); - -//Wait for multiple threads. -void cutWaitForThreads(const CUTThread *threads, int num); - -#ifdef __cplusplus -} //extern "C" -#endif - -#endif //MULTITHREADING_H diff --git a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/nms.cpp b/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/nms.cpp deleted file mode 100644 index b3fcbbbaa73..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/nms.cpp +++ /dev/null @@ -1,175 +0,0 @@ -/////////////////////////Car tracking project with laser_radar_data_fusion///////////////////////////////////////// -//////////////////////////////////////////////////////////////////////Copyright 2009-10 Akihiro Takeuchi/////////// - -/////nms.cpp non_maximum suppression of detected box //////////////////////////////////////////////////////////// - -#include -#include -#include -#include - -#include "MODEL_info.h" //File information -#include "common.hpp" - -#include "switch_float.h" - -//Non_maximum suppression function (extended to detect.cc) -FLOAT *nms(FLOAT *boxes,FLOAT overlap,int *num,GPUModel *MO); - -template -static inline void swap(T *a, T *b) -{ - T tmp = *a; - *a = *b; - *b = tmp; -} - -//Quick sort function -static void quickSort(FLOAT *data , int *Order, int first_index , int last_index) -{ - int i = first_index, j = last_index; - FLOAT pivot = *(data + (first_index + last_index) / 2); - - while (1) { - while (data[i] > pivot) i++; - while (data[j] < pivot) j--; - - if (i >= j) - break; - - swap(&data[i], &data[j]); - swap(&Order[i],&Order[j]); - - i++; - j--; - } - - if (first_index < i - 1) - quickSort(data , Order,first_index , i - 1); - - if (last_index > j + 1) - quickSort(data , Order,j + 1 , last_index); -} - -FLOAT *dpm_ttic_gpu_nms(FLOAT *boxes,FLOAT overlap,int *num,GPUModel *MO) -{ - int NUM = *num; - if(NUM<=0) - return nullptr; - - const int *numpart = MO->MI->numpart; - const int GL = (numpart[0]+1)*4+3; - FLOAT *area = (FLOAT*)calloc(NUM,sizeof(FLOAT)); - FLOAT *scores = (FLOAT*)calloc(NUM,sizeof(FLOAT)); - int *sorted_orders = (int *)calloc(NUM,sizeof(int)); - FLOAT *P=boxes; - //calculate area of each boundary-box - - FLOAT *score_t = scores; - int *so_t =sorted_orders; - for(int ii=0;ii0) - { - int A=sorted_orders[cur]; - P=boxes+GL*A; - FLOAT Ay1 = P[0]; - FLOAT Ax1 = P[1]; - FLOAT Ay2 = P[2]; - FLOAT Ax2 = P[3]; - checked[A]=1; - cnum--; - cur++; - pi_num++; - - for(int kk=cur;kk0&&h>0) - { - //FLOAT o = w*h/area[A]; //compute overlap - FLOAT o = w*h/R_AREA; //compute overlap - if(o>overlap) - { - checked[B]=-1; //suppress - cnum--; - } - } - //full over-lap - else if(Ay1P[2]&&Ax2>P[3]) - { - checked[B]=-1; //suppress - cnum--; - } - else if(Ay1>P[0]&&Ax1>P[1]&&Ay2 -#include -#include - -#include -#include -#include -#include -#include - -#include - -#include "for_use_GPU.h" -#include "load_model.hpp" -#include "detect.hpp" -#include "GPU_init.hpp" - -#include "common.hpp" - -struct timeval tv_memcpy_start, tv_memcpy_end; -float time_memcpy; -struct timeval tv_kernel_start, tv_kernel_end; -float time_kernel; - -int device_num; - -void dpm_ttic_gpu_init_cuda(const std::string& cubin_path) -{ - dpm_ttic_gpu_init_cuda_with_cubin(cubin_path.c_str()); -} - -void dpm_ttic_gpu_cleanup_cuda() -{ - dpm_ttic_gpu_clean_cuda(); - //free_model(MO); -} - -DPMTTICGPU::DPMTTICGPU(const char *com_csv, const char *root_csv, const char *part_csv) -{ - constexpr double RATIO = 1; - model_ = dpm_ttic_gpu_load_model(RATIO, com_csv, root_csv, part_csv); -} - -DPMTTICGPU::~DPMTTICGPU() -{ - dpm_ttic_gpu_free_model(model_); -} - -static FLOAT *init_accumulated_score(IplImage *image, size_t& accumulated_size) -{ - size_t num = image->height * image->width; - accumulated_size = num * sizeof(FLOAT); - - FLOAT *scores = (FLOAT *)calloc(num, sizeof(FLOAT)); - for(size_t i = 0; i < num; i++) - scores[i] = -100.0; - - return scores; -} - -DPMTTICResult DPMTTICGPU::detect_objects(IplImage *image, const DPMTTICParam& param) -{ - model_->MI->interval = param.lambda; - model_->MI->sbin = param.num_cells; - - int detected_objects; - FLOAT *ac_score = init_accumulated_score(image, gpu_size_A_SCORE); - RESULT *objects = dpm_ttic_gpu_car_detection(image, model_, param.threshold, - &detected_objects, ac_score, - param.overlap); - free(ac_score); - - DPMTTICResult result; - result.num = objects->num; - for (int i = 0; i < objects->num; ++i) { - result.type.push_back(objects->type[i]); - } - - for (int i = 0; i < objects->num; ++i) { - int base = i * 4; - int *data = &(objects->OR_point[base]); - - result.corner_points.push_back(data[0]); - result.corner_points.push_back(data[1]); - result.corner_points.push_back(data[2] - data[0]); - result.corner_points.push_back(data[3] - data[1]); - result.score.push_back(objects->score[i]); - } - - free(objects->point); - free(objects->type); - free(objects->scale); - free(objects->score); - free(objects->IM); - return result; -} diff --git a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/resize_GPU.cc b/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/resize_GPU.cc deleted file mode 100644 index 14fb97fa46b..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/resize_GPU.cc +++ /dev/null @@ -1,539 +0,0 @@ -/////////////////////////Car tracking project with laser_radar_data_fusion///////////////////////////////////////// -//////////////////////////////////////////////////////////////////////Copyright 2009-10 Akihiro Takeuchi/////////// - -/////resize.cpp resize image (Input and Output must be double-array) //////////////////////////////////////////// - -#include -#include -#include -#include -#include -#include -#include -#include - -//ORIGINAL header files -#include "common.hpp" - -#include "switch_float.h" -#include "switch_release.h" -#include "drvapi_error_string.h" - -//#define USE_PTHREAD - -/* cuda error handling macro */ -#define MY_CUDA_CHECK(res, text) \ - if ((res) != CUDA_SUCCESS) { \ - printf("%s failed: res = %d\n->%s\n", (text), (res), getCudaDrvErrorString((res))); \ - exit(1); \ - } - -/* structure to pass some data to pthread */ -typedef struct { - int *src_size; - int *dst_size; - CUstream stream; - int level; -} resize_thread_arg; - -/*********************************************************************/ -/* global variable for GPU */ -/*********************************************************************/ -static CUarray org_image_dev; -static CUdeviceptr resized_image_dev; -static CUdeviceptr image_idx_incrementer_dev; -static int *image_idx_incrementer; // Look-Up Table -extern CUdevice *dev; -extern CUmodule *module; -extern CUcontext *ctx; -extern CUfunction *func_resize; -static int sum_size_image; - -/*********************************************************************/ -/* sub function to devide pixel values into row-major array by color */ -/*********************************************************************/ -FLOAT *Ipl_to_FLOAT_forGPU(IplImage *Input) //get intensity data (FLOAT) of input -{ - const int width = Input->width; -#ifdef PRINT_INFO - printf("%d\n",width); -#endif - const int height = Input->height; -#ifdef PRINT_INFO - printf("%d\n",height); -#endif - const int nChannels = Input->nChannels; -#ifdef PRINT_INFO - printf("%d\n",nChannels); -#endif - const int SQ = height*width; - const int WS = Input->widthStep; - - FLOAT *Output = (FLOAT *)malloc(sizeof(FLOAT)*height*width*nChannels); -#ifdef PRINT_INFO - printf("%d",height*width*nChannels); -#endif - - FLOAT *R = Output; - FLOAT *G = Output + SQ; - FLOAT *B = Output + 2*SQ; - char *IDATA = Input->imageData; - - //pick intensity of pixel (color) - for(int y=0; ysrc_top; - int *src_size = this_arg->src_size; - // FLOAT *dst_top = this_arg->dst_top; - int *dst_size = this_arg->dst_size; - int level = this_arg->level; - CUstream stream = this_arg->stream; - - const int src_height = src_size[0]; - const int src_width = src_size[1]; - const int dst_height = dst_size[0]; - const int dst_width = dst_size[1]; - const int nChannels = dst_size[2]; - - const FLOAT hfactor = (FLOAT)src_height/dst_height; - const FLOAT wfactor = (FLOAT)src_width/dst_width; - - CUresult res; - - /* attach CUDA Context 0 on this pthread */ - res = cuCtxSetCurrent(ctx[0]); - MY_CUDA_CHECK(res, "cuCtxSetCurrent(ctx[0]"); - - - /* CUDA kernel argument */ - void *kernel_arg[] = { - (void *)&src_height, - (void *)&src_width, - &resized_image_dev, - (void *)&dst_height, - (void *)&dst_width, - (void *)&hfactor, - (void *)&wfactor, - (void *)&level - }; - - /* define CUDA kernel shape */ - int max_thread_num = 0; - res = cuDeviceGetAttribute(&max_thread_num, CU_DEVICE_ATTRIBUTE_MAX_THREADS_PER_BLOCK, dev[0]); - MY_CUDA_CHECK(res, "cuDeviceGetAttribute()"); - - int thread_num_x = (dst_width < sqrt(max_thread_num)) ? dst_width : sqrt(max_thread_num); - int thread_num_y = (dst_height < sqrt(max_thread_num)) ? dst_height : sqrt(max_thread_num); - - int block_num_x = dst_width / thread_num_x; - int block_num_y = dst_height / thread_num_y; - int block_num_z = nChannels; - if (dst_width % thread_num_x != 0) block_num_x++; - if (dst_height % thread_num_y != 0) block_num_y++; - - int sharedMemBytes = 0; - - /* execute GPU function */ - res = cuLaunchKernel( - func_resize[0], // call function - block_num_x, // gridDimX - block_num_y, // gridDimY - block_num_z, // gridDimZ - thread_num_x, // blockDimX - thread_num_y, // blockDimY - 1, // blockDimZ - sharedMemBytes, // sharedMemBytes - stream, // hStream - kernel_arg, // kernel Parameter - NULL // extra - ); - MY_CUDA_CHECK(res, "cuLaunchKernel(resize)"); - - // res = cuStreamSynchronize(stream); - // MY_CUDA_CHECK(res, "cuStreamSynchronize(stream)"); - - return (void *)NULL; -} /* bilinear_resizing() */ - -/* main function (resize) */ -void resize_byGPU(FLOAT *org_image, - int *org_image_size, - // FLOAT **resized_image, - int *resized_image_size, - int interval, - int LEN, - CUstream *stream_array) -{ - /* pthread handler */ - /* to calculate all resized image, the required number of threads is (LEN - interval) */ - pthread_t *thread = (pthread_t *)calloc(LEN - interval, sizeof(pthread_t)); - - /* structure to carry data to pthread function */ - resize_thread_arg *args = (resize_thread_arg *)calloc(LEN - interval, sizeof(resize_thread_arg)); - int thread_count = 0; - - - /* upload original image data to GPU */ - upload_org_image_toGPU(org_image, org_image_size); - - /* create Look-Up Table to adjust pointer in GPU */ - make_image_idx_incrementer(resized_image_size, LEN); - - CUresult res; - - /* allocate GPU memory resion for resized image */ - res = cuMemAlloc(&resized_image_dev, sum_size_image*sizeof(FLOAT)); - MY_CUDA_CHECK(res, "cuMemAlloc(resized_image)"); - -#ifdef USE_FLOAT_AS_DECIMAL - res = cuMemsetD32(resized_image_dev, 0, sum_size_image); - MY_CUDA_CHECK(res, "cuMemsetD32(resized_image_dev)"); -#else - res = cuMemsetD32(resized_image_dev, 0, sum_size_image*2); - MY_CUDA_CHECK(res, "cuMemsetD32(resized_image_dev)"); -#endif - -#ifdef DEBUG - printf("\n/*************************************************************************/\n"); - printf("!!!!!!!!!!!!!!!!!!!!!!!!!!Debug MODE is ON !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); - printf(" -> pthread is not created\n"); - printf("/*************************************************************************/\n"); -#endif - - /* resizing */ - for (int level=0; level -#include -#include -#include -#include -#include -#include -#include - -//ORIGINAL header files -#include "common.hpp" - -#include "switch_float.h" -#include "switch_release.h" -#include "drvapi_error_string.h" - -//#define USE_PTHREAD - -/* cuda error handling macro */ -#define MY_CUDA_CHECK(res, text) \ - if ((res) != CUDA_SUCCESS) { \ - printf("%s failed: res = %d\n->%s\n", (text), (res), getCudaDrvErrorString((res))); \ - exit(1); \ - } - -/* structure to pass some data to pthread */ -typedef struct { - int *src_size; - int *dst_size; - CUstream stream; - int level; -} resize_thread_arg; - -/*********************************************************************/ -/* global variable for GPU */ -/*********************************************************************/ -static CUarray org_image_dev; -static CUdeviceptr resized_image_dev; -static CUdeviceptr image_idx_incrementer_dev; -static int *image_idx_incrementer; // Look-Up Table -extern CUdevice *dev; -extern CUmodule *module; -extern CUcontext *ctx; -extern CUfunction *func_resize; -static int sum_size_image; - -/*********************************************************************/ -/* sub function to devide pixel values into row-major array by color */ -/*********************************************************************/ -FLOAT *dpm_ttic_gpu_Ipl_to_FLOAT_forGPU(IplImage *Input) //get intensity data (FLOAT) of input -{ - const int width = Input->width; -#ifdef PRINT_INFO - printf("%d\n",width); -#endif - const int height = Input->height; -#ifdef PRINT_INFO - printf("%d\n",height); -#endif - const int nChannels = Input->nChannels; -#ifdef PRINT_INFO - printf("%d\n",nChannels); -#endif - const int SQ = height*width; - const int WS = Input->widthStep; - - FLOAT *Output = (FLOAT *)malloc(sizeof(FLOAT)*height*width*nChannels); -#ifdef PRINT_INFO - printf("%d",height*width*nChannels); -#endif - - FLOAT *R = Output; - FLOAT *G = Output + SQ; - FLOAT *B = Output + 2*SQ; - char *IDATA = Input->imageData; - - //pick intensity of pixel (color) - for(int y=0; ysrc_top; - int *src_size = this_arg->src_size; - // FLOAT *dst_top = this_arg->dst_top; - int *dst_size = this_arg->dst_size; - int level = this_arg->level; - CUstream stream = this_arg->stream; - - const int src_height = src_size[0]; - const int src_width = src_size[1]; - const int dst_height = dst_size[0]; - const int dst_width = dst_size[1]; - const int nChannels = dst_size[2]; - - const FLOAT hfactor = (FLOAT)src_height/dst_height; - const FLOAT wfactor = (FLOAT)src_width/dst_width; - - CUresult res; - - /* attach CUDA Context 0 on this pthread */ - res = cuCtxSetCurrent(ctx[0]); - MY_CUDA_CHECK(res, "cuCtxSetCurrent(ctx[0]"); - - - /* CUDA kernel argument */ - void *kernel_arg[] = { - (void *)&src_height, - (void *)&src_width, - &resized_image_dev, - (void *)&dst_height, - (void *)&dst_width, - (void *)&hfactor, - (void *)&wfactor, - (void *)&level - }; - - /* define CUDA kernel shape */ - int max_thread_num = 0; - res = cuDeviceGetAttribute(&max_thread_num, CU_DEVICE_ATTRIBUTE_MAX_THREADS_PER_BLOCK, dev[0]); - MY_CUDA_CHECK(res, "cuDeviceGetAttribute()"); - - int thread_num_x = (dst_width < sqrt(max_thread_num)) ? dst_width : sqrt(max_thread_num); - int thread_num_y = (dst_height < sqrt(max_thread_num)) ? dst_height : sqrt(max_thread_num); - - int block_num_x = dst_width / thread_num_x; - int block_num_y = dst_height / thread_num_y; - int block_num_z = nChannels; - if (dst_width % thread_num_x != 0) block_num_x++; - if (dst_height % thread_num_y != 0) block_num_y++; - - int sharedMemBytes = 0; - - /* execute GPU function */ - res = cuLaunchKernel( - func_resize[0], // call function - block_num_x, // gridDimX - block_num_y, // gridDimY - block_num_z, // gridDimZ - thread_num_x, // blockDimX - thread_num_y, // blockDimY - 1, // blockDimZ - sharedMemBytes, // sharedMemBytes - stream, // hStream - kernel_arg, // kernel Parameter - NULL // extra - ); - MY_CUDA_CHECK(res, "cuLaunchKernel(resize)"); - - // res = cuStreamSynchronize(stream); - // MY_CUDA_CHECK(res, "cuStreamSynchronize(stream)"); - - return (void *)NULL; -} /* bilinear_resizing() */ - -/* main function (resize) */ -void dpm_ttic_gpu_resize_byGPU(FLOAT *org_image, - int *org_image_size, - int *resized_image_size, - int interval, - int LEN, - CUstream *stream_array) -{ - /* pthread handler */ - /* to calculate all resized image, the required number of threads is (LEN - interval) */ - pthread_t *thread = (pthread_t *)calloc(LEN - interval, sizeof(pthread_t)); - - /* structure to carry data to pthread function */ - resize_thread_arg *args = (resize_thread_arg *)calloc(LEN - interval, sizeof(resize_thread_arg)); - int thread_count = 0; - - - /* upload original image data to GPU */ - upload_org_image_toGPU(org_image, org_image_size); - - /* create Look-Up Table to adjust pointer in GPU */ - make_image_idx_incrementer(resized_image_size, LEN); - - CUresult res; - - /* allocate GPU memory resion for resized image */ - res = cuMemAlloc(&resized_image_dev, sum_size_image*sizeof(FLOAT)); - MY_CUDA_CHECK(res, "cuMemAlloc(resized_image)"); - -#ifdef USE_FLOAT_AS_DECIMAL - res = cuMemsetD32(resized_image_dev, 0, sum_size_image); - MY_CUDA_CHECK(res, "cuMemsetD32(resized_image_dev)"); -#else - res = cuMemsetD32(resized_image_dev, 0, sum_size_image*2); - MY_CUDA_CHECK(res, "cuMemsetD32(resized_image_dev)"); -#endif - -#ifdef DEBUG - printf("\n/*************************************************************************/\n"); - printf("!!!!!!!!!!!!!!!!!!!!!!!!!!Debug MODE is ON !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); - printf(" -> pthread is not created\n"); - printf("/*************************************************************************/\n"); -#endif - - /* resizing */ - for (int level=0; level -#include -#include -#include "switch_float.h" - -extern FLOAT *dpm_ttic_gpu_Ipl_to_FLOAT_forGPU(IplImage *Input); -extern void dpm_ttic_gpu_resize_byGPU(FLOAT *org_image, int *org_image_size, int *resized_image_size, - int interval, int LEN, CUstream *stream_array); -extern void *dpm_ttic_gpu_calc_resized_image_size(int *org_image_size, int *resized_image_size, int interval, - FLOAT sc, int max_scale, FLOAT *scale_array); - -extern void dpm_ttic_gpu_create_resized_image_texref(void); -extern void dpm_ttic_gpu_cleanup_about_resize(void); - -#endif /* _RESIZE_GPU_H_ */ diff --git a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/switch_float.h b/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/switch_float.h deleted file mode 100644 index ee760ad6bce..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/switch_float.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2015-2019 Autoware Foundation. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* typedef to switch float and double */ -#define USE_FLOAT_AS_DECIMAL - -#ifdef USE_FLOAT_AS_DECIMAL -typedef float FLOAT; -#ifdef FROM_GPU -#define sqrt sqrtf -#endif -#else -typedef double FLOAT; -#endif - -#ifndef TVSUB -#define TVSUB - -/* for measurement */ -#include -/* tvsub: ret = x - y. */ -static inline void tvsub -( - struct timeval *x, - struct timeval *y, - struct timeval *ret - ) -{ - ret->tv_sec = x->tv_sec - y->tv_sec; - ret->tv_usec = x->tv_usec - y->tv_usec; - if (ret->tv_usec < 0) { - ret->tv_sec--; - ret->tv_usec += 1000000; - } -} -/* for measurement */ -#endif - -extern struct timeval tv_memcpy_start, tv_memcpy_end; -extern float time_memcpy; -extern struct timeval tv_kernel_start, tv_kernel_end; -extern float time_kernel; diff --git a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/switch_release.h b/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/switch_release.h deleted file mode 100644 index f790c142df0..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/switch_release.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright 2015-2019 Autoware Foundation. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef _RELEASE_H -#define _RELEASE_H - -#define RELEASE - -#endif /* ifdef RELEASE_H */ diff --git a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/tracking.cpp b/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/tracking.cpp deleted file mode 100644 index 4023a90b0bd..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/tracking.cpp +++ /dev/null @@ -1,121 +0,0 @@ -/////////////////////////Car tracking project with laser_radar_data_fusion///////////////////////////////////////// -//////////////////////////////////////////////////////////////////////Copyright 2009-10 Akihiro Takeuchi/////////// - -/////tracking.cpp calculate_time-variation information ////////////////////////////////////////////////////////// - -#include -#include -#include -#include - -#include -#include -#include - -//Header files -#include "MODEL_info.h" //Model-structure definition -#include "switch_float.h" -#include "switch_release.h" -#include "tracking.hpp" - -//create new_result data -static RESULT *create_result(int num) -{ - RESULT *result = (RESULT *)malloc(sizeof(RESULT)); - result->num = num; - if(num==0) { - result->point = nullptr; - result->type = nullptr; - result->score = nullptr; - result->scale = nullptr; - result->IM = nullptr; - result->OR_point = nullptr; - } else { - result->point = (int *)calloc(num*4,sizeof(int)); - result->OR_point = (int *)calloc(num*4,sizeof(int)); - result->type = (int *)calloc(num,sizeof(int)); - result->score = (FLOAT *)calloc(num,sizeof(FLOAT)); - result->scale = (FLOAT *)calloc(num,sizeof(FLOAT)); - result->IM = (IplImage **)malloc(sizeof(IplImage *)*num); - } - return(result); -} - -//get new_rectangle information -RESULT *dpm_ttic_gpu_get_new_rects(IplImage *Image,GPUModel *MO,FLOAT *boxes,int *NUM) -{ - const int *numpart = MO->MI->numpart; - const int GL = (numpart[0]+1)*4+3; - const FLOAT ratio = MO->MI->ratio; - - int LL = GL-3; - FLOAT **x1 = MO->MI->x1; - FLOAT **x2 = MO->MI->x2; - FLOAT **y1 = MO->MI->y1; - FLOAT **y2 = MO->MI->y2; - int ML = 1+2*(1+numpart[0]); - - RESULT *CUR =create_result(*NUM); - - //no_rectangle was detected - if(*NUM==0) return(CUR); - - FLOAT *Avec = (FLOAT *)calloc(ML,sizeof(FLOAT)); - for(int ii=0;ii<*NUM;ii++) - { - FLOAT *P = boxes+GL*ii; - FLOAT *Avec_T = Avec; - int CNUM = (int)(*(P+GL-3)); - int PP[4]; - - *(Avec_T++)=P[3]-P[1]; - - for(int kk=0;kk0) {PP[0]=(int)XP1;} - else {PP[0]=0;} - if(YP1>0) {PP[1]=(int)YP1;} - else {PP[1]=0;} - if(XP2width){PP[2]=(int)XP2;} - else {PP[2]=Image->width;} - if(YP2height) {PP[3]=(int)YP2;} - else {PP[3]=Image->height;} - //memcpy_s(CUR->point+ii*4,4*sizeof(int),PP,4*sizeof(int)); - memcpy(CUR->point+ii*4, PP,4*sizeof(int)); - CUR->scale[ii]=*(P+GL-1); CUR->score[ii]=*(P+GL-2); CUR->type[ii] = CNUM; - - //calculate image coodinate for ORIGINAL-scale-image[640x480] - int *OPP = CUR->OR_point+ii*4; - OPP[0] = (int)((FLOAT)PP[0]/ratio); - OPP[1] = (int)((FLOAT)PP[1]/ratio); - OPP[2] = (int)((FLOAT)PP[2]/ratio); - OPP[3] = (int)((FLOAT)PP[3]/ratio); - -#ifdef PRINT_INFO - printf("scale:%f score:%f type:%d\n",CUR->scale[ii],CUR->score[ii],CUR->type[ii]); -#endif - } - - free(Avec); - return(CUR); -} diff --git a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/tracking.hpp b/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/tracking.hpp deleted file mode 100644 index ca55d4cd002..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/gpu/tracking.hpp +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef _TRACKING_H_ -#define _TRACKING_H_ - -#include -#include "detect.hpp" -#include "switch_float.h" - -//get object_rectangles -extern RESULT *dpm_ttic_gpu_get_new_rects(IplImage *Image,GPUModel *MO,FLOAT *boxes,int *NUM); - -#endif /* _TRACKING_H_ */ diff --git a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/include/libdpm_ttic/dpm_ttic.hpp b/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/include/libdpm_ttic/dpm_ttic.hpp deleted file mode 100644 index e7a5018b4ed..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/include/libdpm_ttic/dpm_ttic.hpp +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef _DPM_TTIC_H_ -#define _DPM_TTIC_H_ - -#include -#include -#include - -extern void dpm_ttic_gpu_init_cuda(const std::string& cubin_path); -extern void dpm_ttic_gpu_cleanup_cuda(); - -struct DPMTTICResult { - int num; - std::vector corner_points; - std::vector type; - std::vector score; -}; - -struct DPMTTICParam { - double threshold; - double overlap; - double lambda; - double num_cells; - - DPMTTICParam() = default; -}; - -struct MODEL; -class DPMTTIC { -private: - MODEL *model_; - -public: - DPMTTIC(const char *com_csv, const char *root_csv, const char *part_csv); - ~DPMTTIC(); - - DPMTTICResult detect_objects(IplImage *image, const DPMTTICParam& param); -}; - -struct GPUModel; -class DPMTTICGPU { -private: - GPUModel *model_; - double RATIO; - -public: - DPMTTICGPU(const char *com_csv, const char *root_csv, const char *part_csv); - ~DPMTTICGPU(); - - DPMTTICResult detect_objects(IplImage *image, const DPMTTICParam& param); -}; - -#endif /* _DPM_TTIC_H_ */ diff --git a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/package.xml b/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/package.xml deleted file mode 100644 index 0781e0d81ab..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/package.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - libdpm_ttic - 1.11.0 - The dpm_ttic package - Syohei YOSHIDA - Apache 2 - catkin - autoware_build_flags - - sensor_msgs - std_msgs - cv_bridge - libopencv-dev - - sensor_msgs - std_msgs - cv_bridge - libopencv-dev - - - - diff --git a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/util/capability_version_checker.cpp b/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/util/capability_version_checker.cpp deleted file mode 100644 index bd74bae02f1..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/libs/dpm_ttic/util/capability_version_checker.cpp +++ /dev/null @@ -1,214 +0,0 @@ -/* - * Copyright 2015-2019 Autoware Foundation. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include - -#include - -static void getDrvErrorCode(int error_id, std::string* str); - -int main(void) -{ - int deviceCount; - CUresult error_id = cuInit(0); - - error_id = cuDeviceGetCount(&deviceCount); - - if (error_id != CUDA_SUCCESS) { -#if CUDA_VERSION < 6000 // if CUDA version is under 6.0 - std::string error_string; - getDrvErrorCode(error_id, &error_string); -#else - const char *error_string; - cuGetErrorString(error_id, &error_string); -#endif - std::cerr << "Failed: cuDeviceGetCount()" - << " = " - << static_cast(error_id) - << " -> " - << error_string - << std::endl; - return -1; - } - - if (deviceCount == 0) { - std::cerr << "No CUDA GPU" << std::endl; - return -1; - } - - std::vector capability_versions; - for (int device = 0; device < deviceCount; ++device) { - CUdevice devHandle; - - cuDeviceGet(&devHandle, device); - - int major = 0, minor = 0; - cuDeviceComputeCapability(&major, &minor, devHandle); - - int capability_version = (10 * major) + minor; - capability_versions.push_back(capability_version); - } - - int min_version = *std::min_element(capability_versions.begin(), - capability_versions.end()); - - std::cout << min_version << std::endl; - return 0; -} - -static void getDrvErrorCode(int error_id, std::string* str) -{ - switch (error_id) - { - case 0 : - *str = "CUDA_SUCCESS"; - break; - case 1 : - *str = "CUDA_ERROR_INVALID_VALUE"; - break; - case 2 : - *str = "CUDA_ERROR_OUT_OF_MEMORY"; - break; - case 3 : - *str = "CUDA_ERROR_NOT_INITIALIZED"; - break; - case 4 : - *str = "CUDA_ERROR_DEINITIALIZED"; - break; - case 5 : - *str = "CUDA_ERROR_PROFILER_DISABLED"; - break; - case 6 : - *str = "CUDA_ERROR_PROFILER_NOT_INITIALIZED"; - break; - case 7 : - *str = "CUDA_ERROR_PROFILER_ALREADY_STARTED"; - break; - case 8 : - *str = "CUDA_ERROR_PROFILER_ALREADY_STOPPED"; - break; - case 100 : - *str = "CUDA_ERROR_NO_DEVICE (no CUDA-capable devices were detected)"; - break; - case 101 : - *str = "CUDA_ERROR_INVALID_DEVICE (device specified is not a valid CUDA device)"; - break; - case 200 : - *str = "CUDA_ERROR_INVALID_IMAGE"; - break; - case 201 : - *str = "CUDA_ERROR_INVALID_CONTEXT"; - break; - case 202 : - *str = "CUDA_ERROR_CONTEXT_ALREADY_CURRENT"; - break; - case 205 : - *str = "CUDA_ERROR_MAP_FAILED"; - break; - case 206 : - *str = "CUDA_ERROR_UNMAP_FAILED"; - break; - case 207 : - *str = "CUDA_ERROR_ARRAY_IS_MAPPED"; - break; - case 208 : - *str = "CUDA_ERROR_ALREADY_MAPPED"; - break; - case 209 : - *str = "CUDA_ERROR_NO_BINARY_FOR_GPU"; - break; - case 210 : - *str = "CUDA_ERROR_ALREADY_ACQUIRED"; - break; - case 211 : - *str = "CUDA_ERROR_NOT_MAPPED"; - break; - case 212 : - *str = "CUDA_ERROR_NOT_MAPPED_AS_ARRAY"; - break; - case 213 : - *str = "CUDA_ERROR_NOT_MAPPED_AS_POINTER"; - break; - case 214 : - *str = "CUDA_ERROR_ECC_UNCORRECTABLE"; - break; - case 215 : - *str = "CUDA_ERROR_UNSUPPORTED_LIMIT"; - break; - case 216 : - *str = "CUDA_ERROR_CONTEXT_ALREADY_IN_USE"; - break; - case 300 : - *str = "CUDA_ERROR_INVALID_SOURCE"; - break; - case 301 : - *str = "CUDA_ERROR_FILE_NOT_FOUND"; - break; - case 302 : - *str = "CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND"; - break; - case 303 : - *str = "CUDA_ERROR_SHARED_OBJECT_INIT_FAILED"; - break; - case 304 : - *str = "CUDA_ERROR_OPERATING_SYSTEM"; - break; - case 400 : - *str = "CUDA_ERROR_INVALID_HANDLE"; - break; - case 500 : - *str = "CUDA_ERROR_NOT_FOUND"; - break; - case 600 : - *str = "CUDA_ERROR_NOT_READY"; - break; - case 700 : - *str = "CUDA_ERROR_LAUNCH_FAILED"; - break; - case 701 : - *str = "CUDA_ERROR_LAUNCH_OUT_OF_RESOURCES"; - break; - case 702 : - *str = "CUDA_ERROR_LAUNCH_TIMEOUT"; - break; - case 703 : - *str = "CUDA_ERROR_LAUNCH_INCOMPATIBLE_TEXTURING"; - break; - case 704 : - *str = "CUDA_ERROR_PEER_ACCESS_ALREADY_ENABLED"; - break; - case 705 : - *str = "CUDA_ERROR_PEER_ACCESS_NOT_ENABLED"; - break; - case 708 : - *str = "CUDA_ERROR_PRIMARY_CONTEXT_ACTIVE"; - break; - case 709 : - *str = "CUDA_ERROR_CONTEXT_IS_DESTROYED"; - break; - case 710 : - *str = "CUDA_ERROR_ASSERT"; - break; - case 999 : - *str = "CUDA_ERROR_UNKNOWN"; - break; - default : - *str = "Not defined CUDA error in this program"; - break; - } -} diff --git a/ros/src/computing/perception/detection/vision_detector/packages/vision_darknet_detect/CMakeLists.txt b/ros/src/computing/perception/detection/vision_detector/packages/vision_darknet_detect/CMakeLists.txt index d764645fb94..5ac84b312c5 100644 --- a/ros/src/computing/perception/detection/vision_detector/packages/vision_darknet_detect/CMakeLists.txt +++ b/ros/src/computing/perception/detection/vision_detector/packages/vision_darknet_detect/CMakeLists.txt @@ -33,7 +33,16 @@ catkin_package(CATKIN_DEPENDS set(CMAKE_CXX_FLAGS "-O3 -g -Wall ${CMAKE_CXX_FLAGS}") -IF (CUDA_FOUND) +####### Melodic Checks +SET (CPU_ONLY FALSE) +if (CUDA_FOUND AND "$ENV{ROS_DISTRO}" STREQUAL "melodic" ) + if(${CMAKE_VERSION} VERSION_LESS "3.12.3") + message("GPU support on Melodic requires CMake version>= 3.12.3") + SET (CPU_ONLY TRUE) + endif() +endif() +####### End Melodic Checks +if (NOT CPU_ONLY AND ${CUDA_FOUND}) list(APPEND CUDA_NVCC_FLAGS "--std=c++11 -I$${PROJECT_SOURCE_DIR}/darknet/src -I${PROJECT_SOURCE_DIR}/src -DGPU") SET(CUDA_PROPAGATE_HOST_FLAGS OFF) diff --git a/ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/CHANGELOG.rst b/ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/CHANGELOG.rst deleted file mode 100644 index 8d5cedfc3df..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/CHANGELOG.rst +++ /dev/null @@ -1,264 +0,0 @@ -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Changelog for package vision_dpm_ttic_detect -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -1.11.0 (2019-03-21) -------------------- -* Fix/colcon build (`#2000 `_) - * Added lcuda link -* [fix] Install commands for all the packages (`#1861 `_) - * Initial fixes to detection, sensing, semantics and utils - * fixing wrong filename on install command - * Fixes to install commands - * Hokuyo fix name - * Fix obj db - * Obj db include fixes - * End of final cleaning sweep - * Incorrect command order in runtime manager - * Param tempfile not required by runtime_manager - * * Fixes to runtime manager install commands - * Remove devel directory from catkin, if any - * Updated launch files for robosense - * Updated robosense - * Fix/add missing install (`#1977 `_) - * Added launch install to lidar_kf_contour_track - * Added install to op_global_planner - * Added install to way_planner - * Added install to op_local_planner - * Added install to op_simulation_package - * Added install to op_utilities - * Added install to sync - * * Improved installation script for pointgrey packages - * Fixed nodelet error for gmsl cameras - * USe install space in catkin as well - * add install to catkin - * Fix install directives (`#1990 `_) - * Fixed installation path - * Fixed params installation path - * Fixed cfg installation path - * Delete cache on colcon_release -* Fix license notice in corresponding package.xml -* Contributors: Abraham Monrroy Cano, Servando, amc-nu - -1.10.0 (2019-01-17) -------------------- -* Fixes for catkin_make -* Switch to Apache 2 license (develop branch) (`#1741 `_) - * Switch to Apache 2 - * Replace BSD-3 license header with Apache 2 and reassign copyright to the - Autoware Foundation. - * Update license on Python files - * Update copyright years - * Add #ifndef/define _POINTS_IMAGE_H\_ - * Updated license comment -* Use colcon as the build tool (`#1704 `_) - * Switch to colcon as the build tool instead of catkin - * Added cmake-target - * Added note about the second colcon call - * Added warning about catkin* scripts being deprecated - * Fix COLCON_OPTS - * Added install targets - * Update Docker image tags - * Message packages fixes - * Fix missing dependency -* Fix Dpm/DPM naming convention -* Contributors: Esteve Fernandez, amc-nu - -1.9.1 (2018-11-06) ------------------- - -1.9.0 (2018-10-31) ------------------- -* Moved configuration messages to autoware_config_msgs -* [fix] PascalCase messages (`#1408 `_) - * Switch message files to pascal case - * Switch message names to pascal case in Runtime Manager - * Switch message names to pascal case in *.yaml - * Rename brake_cmd and steer_cmd to BrakeCmd and SteerCmd in main.yaml -* Contributors: Esteve Fernandez - -1.8.0 (2018-08-31) ------------------- -* [Fix] Moved C++11 flag to autoware_build_flags (`#1395 `_) -* [Feature] Makes sure that all binaries have their dependencies linked (`#1385 `_) -* [Feature] Cross compile Autoware for aarch64 (`#1375 `_) -* Contributors: Esteve Fernandez - -1.7.0 (2018-05-16) ------------------- -* update Version from 1.6.3 to 1.7.0 in package.xml and CHANGELOG.rst -* Modify package xml version other than 1.6.3 -* Remove history of sub-branches -* Add automatically-generated CHANGELOG.rst -* [Fix] rename packages (`#1269 `_) - * rename lidar_tracker - * Modify pf_lidar_track's cmake file - * Refactor code - * Rename from euclidean_lidar_tracker to lidar_euclidean_track - * Rename from kf_contour_track to lidar_kf_contour_track - * Rename from kf_lidar_track to lidar_kf_track, but need some modification in euclidean cluster(Cluster.h) - * Rename from pf_lidar_tarck to lidar_pf_track - * Rename range_fusion - * Rename obj_reproj - * Rename euclidean_cluster to lidar_euclidean_cluster_detect - * Rename svm_lidar_detect to lidar_svm_detect - * Rename kf_lidar_track to lidar_kf_track - * Change version 1.6.3 to 1.7.0 in pacakge.xml - * Modify CMake so that extrenal header would be loaded - * Remove obj_reproj from cv_tracker - * Add interface.yaml - * Rename road_wizard to trafficlight_recognizer - * create common directory - * Add lidar_imm_ukf_pda_track - * create vision_detector and moved cv - * Modify interface.yaml and package.xml - * remove dpm_ocv - * moved directory - * Delete unnecessary launch file - * Delete rcnn related file and code - * separated dummy_track from cv_tracker - * separated klt_track from cv_tracker - * Fix a cmake - * Remove unnecessary dependency of lidar_euclidean_cluster_detect package - * Rename image_segmenter to vision_segment_enet_detect - * Remove unnecessary dependency of lidar_svm_detect package - * separated kf_track and fix a some compiling issue - * move viewers - * merge ndt_localizer and icp_localizer, and rename to lidar_localizer - * Remove unnecessary dependency of lidar_euclidean_track - * moved image lib - * add launch - * lib move under lidar_tracker - * Rename dpm_ttic to vision_dpm_ttic_detect - * rename yolo3detector to vision_yolo3_detect - * Modify cmake and package.xml in vision_dpm_ttic_detect - * moved sourcefiles into nodes dir - * moved sourcefiles into nodes dir - * Move cv_tracker/data folder and delete cv_tracker/model folder - * fix a package file and cmake - * Rename yolo2 -> vision_yolo2_detect - * fix a package file and cmake - * Fix package name of launch file - * Rename ssd to vision_ssd_detect - * fixed cmake and package for decerese dependencies - * remove top packages dir for detection - * fixed cmake for cuda - * Rename lane_detector to vision_lane_detect - * Modify package.xml in lidar-related packages - * Remove unnecessary dependencies in lidar_detector and lidar_tracker - * Modify computing.yaml for dpm_ttic - * Modify dpm_ttic launch file - * Remove/Add dependencies to trafficlight_recognizer - * Update data folder in dpm_ttic - * Modified CMake and package file in dpm_ttic. - * Remove src dir in imm_ukf_pda_track - * removed unnecessary comments - * rename lidar_tracker - * Modify pf_lidar_track's cmake file - * Refactor code - * Rename from euclidean_lidar_tracker to lidar_euclidean_track - * Rename from kf_contour_track to lidar_kf_contour_track - * Rename from kf_lidar_track to lidar_kf_track, but need some modification in euclidean cluster(Cluster.h) - * Rename from pf_lidar_tarck to lidar_pf_track - * Rename range_fusion - * Rename obj_reproj - * Rename road_wizard to trafficlight_recognizer - * Rename euclidean_cluster to lidar_euclidean_cluster_detect - * Rename svm_lidar_detect to lidar_svm_detect - * Rename kf_lidar_track to lidar_kf_track - * Change version 1.6.3 to 1.7.0 in pacakge.xml - * Modify CMake so that extrenal header would be loaded - * Remove obj_reproj from cv_tracker - * Add interface.yaml - * create common directory - * Add lidar_imm_ukf_pda_track - * create vision_detector and moved cv - * Modify interface.yaml and package.xml - * remove dpm_ocv - * moved directory - * Delete unnecessary launch file - * Delete rcnn related file and code - * separated dummy_track from cv_tracker - * separated klt_track from cv_tracker - * Fix a cmake - * Remove unnecessary dependency of lidar_euclidean_cluster_detect package - * Rename image_segmenter to vision_segment_enet_detect - * Remove unnecessary dependency of lidar_svm_detect package - * separated kf_track and fix a some compiling issue - * move viewers - * merge ndt_localizer and icp_localizer, and rename to lidar_localizer - * Remove unnecessary dependency of lidar_euclidean_track - * moved image lib - * add launch - * lib move under lidar_tracker - * Rename dpm_ttic to vision_dpm_ttic_detect - * rename yolo3detector to vision_yolo3_detect - * Modify cmake and package.xml in vision_dpm_ttic_detect - * moved sourcefiles into nodes dir - * moved sourcefiles into nodes dir - * Move cv_tracker/data folder and delete cv_tracker/model folder - * fix a package file and cmake - * Rename yolo2 -> vision_yolo2_detect - * fix a package file and cmake - * Fix package name of launch file - * Rename ssd to vision_ssd_detect - * fixed cmake and package for decerese dependencies - * remove top packages dir for detection - * fixed cmake for cuda - * Rename lane_detector to vision_lane_detect - * Modify package.xml in lidar-related packages - * Remove unnecessary dependencies in lidar_detector and lidar_tracker - * Modify computing.yaml for dpm_ttic - * Modify dpm_ttic launch file - * Remove/Add dependencies to trafficlight_recognizer - * Update data folder in dpm_ttic - * Modified CMake and package file in dpm_ttic. - * Remove src dir in imm_ukf_pda_track - * Fix bug for not starting run time manager - * Remove invalid dependency -* Contributors: Kenji Funaoka, Kosuke Murakami - -1.6.3 (2018-03-06) ------------------- - -1.6.2 (2018-02-27) ------------------- - -1.6.1 (2018-01-20) ------------------- - -1.6.0 (2017-12-11) ------------------- - -1.5.1 (2017-09-25) ------------------- - -1.5.0 (2017-09-21) ------------------- - -1.4.0 (2017-08-04) ------------------- - -1.3.1 (2017-07-16) ------------------- - -1.3.0 (2017-07-14) ------------------- - -1.2.0 (2017-06-07) ------------------- - -1.1.2 (2017-02-27 23:10) ------------------------- - -1.1.1 (2017-02-27 22:25) ------------------------- - -1.1.0 (2017-02-24) ------------------- - -1.0.1 (2017-01-14) ------------------- - -1.0.0 (2016-12-22) ------------------- diff --git a/ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/CMakeLists.txt b/ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/CMakeLists.txt deleted file mode 100644 index 962212c132b..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/CMakeLists.txt +++ /dev/null @@ -1,111 +0,0 @@ -cmake_minimum_required(VERSION 2.8.12) -project(vision_dpm_ttic_detect) - -include(FindPkgConfig) - -find_package(autoware_msgs REQUIRED) - -find_package(autoware_config_msgs REQUIRED) - -FIND_PACKAGE(catkin REQUIRED COMPONENTS - cv_bridge - roscpp - sensor_msgs - std_msgs - libdpm_ttic - autoware_config_msgs - autoware_msgs - ) - -FIND_PACKAGE(CUDA) -FIND_PACKAGE(OpenCV REQUIRED) - -catkin_package( - CATKIN_DEPENDS cv_bridge - roscpp - sensor_msgs - std_msgs - autoware_config_msgs - autoware_msgs - libdpm_ttic -) - -########### -## Build ## -########### - -set(CMAKE_CXX_FLAGS "-O2 -g -Wall ${CMAKE_CXX_FLAGS}") - -include_directories( - ${autoware_config_msgs_INCLUDE_DIRS} - ${autoware_msgs_INCLUDE_DIRS} - ${catkin_INCLUDE_DIRS} -) - -IF (CUDA_FOUND) - include_directories(${CUDA_INCLUDE_DIRS}) - - set(CMAKE_CXX_FLAGS "-lcuda ${CMAKE_CXX_FLAGS}") - - IF ("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "^arm") - link_directories(/usr/lib/arm-linux-gnueabihf/tegra) - endif () -ENDIF () - -## dpm_ttic ## -#this must be fixed to use cmake cuda commands -IF (CUDA_FOUND) - - cuda_add_executable(vision_dpm_ttic_detect - nodes/vision_dpm_ttic_detect/vision_dpm_ttic_detect.cpp - ) - - target_link_libraries(vision_dpm_ttic_detect - ${catkin_LIBRARIES} - ${OpenCV_LIBRARIES} - ${CUDA_LIBRARIES} - ${CUDA_CUBLAS_LIBRARIES} - ${CUDA_curand_LIBRARY} - ) - - set_target_properties(vision_dpm_ttic_detect - PROPERTIES - COMPILE_FLAGS - "-DHAS_GPU -DDEFAULT_CUBIN=${CATKIN_DEVEL_PREFIX}/lib/GPU_function.cubin -DMODEL_DIR=${CMAKE_CURRENT_SOURCE_DIR}/data/" - ) -ELSE () - - add_executable(vision_dpm_ttic_detect - nodes/vision_dpm_ttic_detect/vision_dpm_ttic_detect.cpp - ) - - target_link_libraries(vision_dpm_ttic_detect - ${catkin_LIBRARIES} - ${OpenCV_LIBRARIES} - ) - - set_target_properties(vision_dpm_ttic_detect - PROPERTIES - COMPILE_FLAGS - "-DMODEL_DIR=${CMAKE_CURRENT_SOURCE_DIR}/data/" - ) -ENDIF () - -add_dependencies(vision_dpm_ttic_detect - ${catkin_EXPORTED_TARGETS} - autoware_msgs_generate_messages_cpp - ) - -install(TARGETS vision_dpm_ttic_detect - ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} - LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} - RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} - ) - -install(DIRECTORY launch/ - DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/launch - PATTERN ".svn" EXCLUDE) - -install(DIRECTORY data/ - DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/data - PATTERN ".svn" EXCLUDE) diff --git a/ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/data/car.xml b/ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/data/car.xml deleted file mode 100644 index faed5391bd11f19330c0226dacfa1d8d1282cdaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 133667 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 GnDt)+gH}5L diff --git a/ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/data/car_2008.xml b/ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/data/car_2008.xml deleted file mode 100644 index 990ccc736498bb91945d3e44a95a2604dde34d28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 133690 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 E19M^$i~s-t diff --git a/ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/data/person_comp.csv b/ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/data/person_comp.csv deleted file mode 100755 index ae211e39a33..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/data/person_comp.csv +++ /dev/null @@ -1,84 +0,0 @@ - 2.000000, - 8.000000, - 10.000000, - 11.000000, - 6.000000, - 1.000000, - 1.000000, - -3.870473, - 9.000000, 6.000000, - 6.000000, - 1.000000, - 1.000000, - 6.000000, 6.000000, - 2.000000, - 2.000000, - 6.000000, 6.000000, - 3.000000, - 3.000000, - 6.000000, 6.000000, - 4.000000, - 4.000000, - 5.000000, 8.000000, - 5.000000, - 5.000000, - 8.000000, 5.000000, - 6.000000, - 6.000000, - 8.000000, 5.000000, - 2.000000, - 2.000000, - -7.768403, - 11.000000, 4.000000, - 6.000000, - 7.000000, - 7.000000, - 5.000000, 6.000000, - 8.000000, - 8.000000, - 5.000000, 6.000000, - 9.000000, - 9.000000, - 8.000000, 4.000000, - 10.000000, - 10.000000, - 8.000000, 4.000000, - 11.000000, - 11.000000, - 5.000000, 6.000000, - 12.000000, - 12.000000, - 5.000000, 6.000000, - 12.000000, - 0.010000, -0.000859, 0.095677, -0.068975, - 4.000000, 1.000000, - 0.176845, -0.021574, 0.139697, 0.007492, - 1.000000, 13.000000, - 0.176845, 0.021574, 0.139697, 0.007492, - 7.000000, 13.000000, - 0.170431, -0.004628, 0.118436, -0.000726, - 3.000000, 8.000000, - 0.096880, -0.005785, 0.156044, 0.012473, - 1.000000, 3.000000, - 0.096880, 0.005785, 0.156044, 0.012473, - 8.000000, 3.000000, - 0.014843, 0.004110, 0.039375, -0.015048, - 2.000000, 1.000000, - 0.019670, -0.010310, 0.033563, -0.014228, - 2.000000, 18.000000, - 0.034110, 0.005425, 0.064583, -0.023019, - 1.000000, 6.000000, - 0.034110, -0.005425, 0.064583, -0.023019, - 5.000000, 6.000000, - 0.047971, 0.010106, 0.065751, 0.021115, - 2.000000, 13.000000, - 0.014843, 0.004110, 0.039375, -0.015048, - 2.000000, 1.000000, - -0.360437, 0.467205, -0.040957, -0.000351, -0.053752, 0.176932, 0.191602, 0.007509, 0.305793, 0.296878, -0.118002, 0.171159, -0.204647, -0.117765, -0.086562, - -0.023277, 0.017844, 0.562600, -0.024696, 0.537397, -0.060998, 0.178589, -0.121901, -0.042984, 0.237222, -0.013818, -0.024648, -0.094004, -0.018574, -0.152720, - 1.223475, 0.369665, 0.382996, 0.025191, -0.021035, 0.182647, -0.208963, 0.241732, -0.367897, -0.064073, 0.178055, 0.032274, -0.069688, 0.206442, 0.116463, - 1.141137, -0.600385, 0.455852, -0.035331, 0.126452, 0.230553, -0.006216, -0.027258, 0.230505, 0.114235, 0.158487, 0.289874, 0.109413, 0.034663, -0.058214, - -0.012501, 0.766460, 0.185964, 0.000000, -0.086611, 0.027561, 0.038182, 0.082110, -0.036991, -0.011241, -0.063745, 0.081622, -0.032373, 0.051740, 0.000000, - 0.128310, -0.083429, 0.400525, 0.000000, 0.612032, 0.049732, 0.035849, 0.064680, 0.028363, -0.070088, 0.019409, 0.013010, -0.098159, 0.023577, 0.000000, - 1.004976, 0.725244, -0.083330, 0.000000, 0.075375, -0.006217, -0.051608, 0.001207, 0.030261, 0.113033, 0.005743, 0.073103, 0.018147, 0.095311, 0.000000, - 1.405618, 0.153510, 0.377829, 0.000000, -0.052543, -0.073492, 0.512948, -0.008935, -0.005501, -0.009039, 0.012173, -0.045597, 0.156564, -0.013883, 0.000000, diff --git a/ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/data/person_part.csv b/ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/data/person_part.csv deleted file mode 100755 index 856ddc882a1..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/data/person_part.csv +++ /dev/null @@ -1,2133 +0,0 @@ - 12.000000, - 6.000000, 6.000000, 31.000000, - 0.065312, 0.002111, 0.016192, -0.022958, 0.027873, 0.029784, - 0.054416, -0.011061, 0.062297, 0.023973, 0.010480, -0.027617, - 0.044434, -0.021828, -0.015657, -0.006259, -0.003970, -0.025792, - -0.027099, -0.027294, -0.051812, 0.000962, 0.029533, -0.040175, - -0.047223, 0.027270, 0.065103, 0.008877, 0.012593, -0.019789, - 0.009437, 0.003676, 0.053325, 0.005127, -0.009205, -0.002090, - -0.021967, -0.008377, -0.019097, 0.010756, -0.039896, 0.019979, - -0.050592, 0.021343, 0.055906, 0.033948, -0.045333, -0.034260, - -0.043934, -0.025594, 0.023430, 0.001290, 0.002665, -0.028098, - -0.045585, -0.013442, -0.015174, 0.025307, -0.015734, -0.054717, - -0.012392, -0.065721, 0.069769, 0.079096, 0.039115, 0.027519, - -0.024355, -0.042433, 0.002856, -0.026309, -0.036759, -0.001533, - 0.010378, 0.014792, -0.034436, -0.028999, 0.080374, -0.045849, - -0.043557, 0.061458, 0.012744, 0.038861, -0.024926, -0.091966, - -0.090699, 0.048459, 0.017698, -0.016678, -0.009748, -0.022869, - -0.043706, -0.023516, -0.029268, 0.040867, 0.063760, 0.060156, - 0.000736, -0.042273, 0.022320, 0.071750, 0.029046, 0.016416, - -0.007547, -0.027199, 0.012972, -0.028282, 0.044366, 0.013482, - -0.001463, -0.064854, -0.025759, -0.050632, 0.046677, -0.061875, - 0.063768, 0.041209, -0.045899, -0.011327, -0.004025, -0.059045, - 0.041856, 0.065240, 0.027814, 0.007470, -0.031053, -0.000399, - 0.006279, -0.060065, 0.000853, 0.016461, 0.080424, 0.091616, - -0.024883, -0.055526, 0.002178, 0.042025, 0.045760, -0.045954, - -0.010487, -0.004241, -0.032534, -0.040382, 0.000890, 0.006561, - 0.021709, 0.043307, 0.031340, -0.016582, -0.001741, -0.034006, - 0.048512, -0.014854, -0.079060, -0.062616, 0.005013, -0.017975, - 0.075223, 0.049752, -0.014835, 0.073946, 0.028996, 0.046544, - 0.018088, -0.030578, 0.004188, 0.077045, 0.034764, 0.047606, - -0.042242, -0.031493, -0.049397, 0.023020, 0.028331, -0.023180, - -0.065059, 0.034139, 0.038029, -0.025140, -0.024301, -0.034898, - -0.065059, 0.034139, 0.038029, -0.025140, -0.024301, -0.034898, - -0.042242, -0.031493, -0.049397, 0.023020, 0.028331, -0.023180, - 0.018088, -0.030578, 0.004188, 0.077045, 0.034764, 0.047606, - 0.075223, 0.049752, -0.014835, 0.073946, 0.028996, 0.046544, - 0.048512, -0.014854, -0.079060, -0.062616, 0.005013, -0.017975, - 0.021709, 0.043307, 0.031340, -0.016582, -0.001741, -0.034006, - -0.010487, -0.004241, -0.032534, -0.040382, 0.000890, 0.006561, - -0.024883, -0.055526, 0.002178, 0.042025, 0.045760, -0.045954, - 0.006279, -0.060065, 0.000853, 0.016461, 0.080424, 0.091616, - 0.041856, 0.065240, 0.027814, 0.007470, -0.031053, -0.000399, - 0.063768, 0.041209, -0.045899, -0.011327, -0.004025, -0.059045, - -0.001463, -0.064854, -0.025759, -0.050632, 0.046677, -0.061875, - -0.007547, -0.027199, 0.012972, -0.028282, 0.044366, 0.013482, - 0.000736, -0.042273, 0.022320, 0.071750, 0.029046, 0.016416, - -0.043706, -0.023516, -0.029268, 0.040867, 0.063760, 0.060156, - -0.090699, 0.048459, 0.017698, -0.016678, -0.009748, -0.022869, - -0.043557, 0.061458, 0.012744, 0.038861, -0.024926, -0.091966, - 0.010378, 0.014792, -0.034436, -0.028999, 0.080374, -0.045849, - -0.024355, -0.042433, 0.002856, -0.026309, -0.036759, -0.001533, - -0.012392, -0.065721, 0.069769, 0.079096, 0.039115, 0.027519, - -0.045585, -0.013442, -0.015174, 0.025307, -0.015734, -0.054717, - -0.043934, -0.025594, 0.023430, 0.001290, 0.002665, -0.028098, - -0.050592, 0.021343, 0.055906, 0.033948, -0.045333, -0.034260, - -0.021967, -0.008377, -0.019097, 0.010756, -0.039896, 0.019979, - 0.009437, 0.003676, 0.053325, 0.005127, -0.009205, -0.002090, - -0.047223, 0.027270, 0.065103, 0.008877, 0.012593, -0.019789, - -0.027099, -0.027294, -0.051812, 0.000962, 0.029533, -0.040175, - 0.044434, -0.021828, -0.015657, -0.006259, -0.003970, -0.025792, - 0.054416, -0.011061, 0.062297, 0.023973, 0.010480, -0.027617, - 0.065312, 0.002111, 0.016192, -0.022958, 0.027873, 0.029784, - -0.040017, 0.031916, 0.028791, -0.089247, -0.081685, 0.017212, - -0.068981, 0.154195, 0.017148, -0.031730, -0.018634, -0.010678, - -0.100698, 0.024261, -0.119727, -0.005811, -0.051729, 0.035650, - 0.001354, -0.032858, -0.049112, -0.004725, -0.029066, 0.034297, - 0.032743, -0.012151, -0.021329, -0.010982, 0.010433, 0.048349, - -0.009311, -0.020572, 0.004956, -0.007116, 0.011697, -0.019385, - -0.058289, -0.029262, -0.027227, -0.078220, -0.014034, 0.071145, - 0.025651, 0.086389, -0.012041, -0.016463, 0.064076, 0.029137, - -0.009084, -0.003393, -0.112969, 0.003637, -0.000086, 0.000540, - -0.015587, -0.036017, -0.044649, 0.051594, 0.120653, 0.099086, - -0.028449, -0.040028, 0.006070, -0.000140, -0.030315, 0.012770, - -0.024287, -0.003267, -0.021622, -0.039086, -0.051754, -0.061123, - -0.030827, -0.066994, -0.008272, 0.016532, 0.077874, 0.056610, - 0.038497, -0.012348, -0.022859, 0.007886, 0.055686, 0.026959, - 0.132919, 0.059363, -0.048631, 0.002251, 0.039553, -0.031681, - -0.041933, -0.003413, 0.059725, -0.033274, 0.010079, 0.000574, - -0.063452, -0.040917, -0.010959, -0.067073, -0.041419, 0.006764, - 0.017457, 0.023212, -0.011637, 0.002645, -0.017623, -0.017039, - 0.027097, 0.053426, 0.051954, 0.055776, 0.049899, 0.035322, - -0.021150, -0.091735, 0.013363, 0.014050, 0.011150, 0.021765, - 0.082853, -0.023052, -0.040766, -0.058924, -0.046756, -0.025492, - -0.015471, -0.062907, 0.035565, -0.035184, -0.056914, 0.032265, - -0.025480, -0.068585, 0.000564, 0.022704, -0.040836, 0.001879, - 0.051216, 0.056912, 0.018567, 0.022481, 0.061995, -0.012493, - 0.051216, 0.056912, 0.018567, 0.022481, 0.061995, -0.012493, - -0.025480, -0.068585, 0.000564, 0.022704, -0.040836, 0.001879, - -0.015471, -0.062907, 0.035565, -0.035184, -0.056914, 0.032265, - 0.082853, -0.023052, -0.040766, -0.058924, -0.046756, -0.025492, - -0.021150, -0.091735, 0.013363, 0.014050, 0.011150, 0.021765, - 0.027097, 0.053426, 0.051954, 0.055776, 0.049899, 0.035322, - 0.017457, 0.023212, -0.011637, 0.002645, -0.017623, -0.017039, - -0.063452, -0.040917, -0.010959, -0.067073, -0.041419, 0.006764, - -0.041933, -0.003413, 0.059725, -0.033274, 0.010079, 0.000574, - 0.132919, 0.059363, -0.048631, 0.002251, 0.039553, -0.031681, - 0.038497, -0.012348, -0.022859, 0.007886, 0.055686, 0.026959, - -0.030827, -0.066994, -0.008272, 0.016532, 0.077874, 0.056610, - -0.024287, -0.003267, -0.021622, -0.039086, -0.051754, -0.061123, - -0.028449, -0.040028, 0.006070, -0.000140, -0.030315, 0.012770, - -0.015587, -0.036017, -0.044649, 0.051594, 0.120653, 0.099086, - -0.009084, -0.003393, -0.112969, 0.003637, -0.000086, 0.000540, - 0.025651, 0.086389, -0.012041, -0.016463, 0.064076, 0.029137, - -0.058289, -0.029262, -0.027227, -0.078220, -0.014034, 0.071145, - -0.009311, -0.020572, 0.004956, -0.007116, 0.011697, -0.019385, - 0.032743, -0.012151, -0.021329, -0.010982, 0.010433, 0.048349, - 0.001354, -0.032858, -0.049112, -0.004725, -0.029066, 0.034297, - -0.100698, 0.024261, -0.119727, -0.005811, -0.051729, 0.035650, - -0.068981, 0.154195, 0.017148, -0.031730, -0.018634, -0.010678, - -0.040017, 0.031916, 0.028791, -0.089247, -0.081685, 0.017212, - -0.009091, -0.022318, 0.046510, -0.017956, 0.020349, 0.038990, - -0.011766, 0.085197, 0.128469, 0.093760, 0.058280, 0.056943, - 0.001029, -0.056939, -0.077602, 0.001836, 0.021465, -0.002799, - 0.001029, -0.056939, -0.077602, 0.001836, 0.021465, -0.002799, - -0.011766, 0.085197, 0.128469, 0.093760, 0.058280, 0.056943, - -0.009091, -0.022318, 0.046510, -0.017956, 0.020349, 0.038990, - -0.027016, 0.043438, 0.041058, -0.025638, -0.074476, 0.008203, - -0.075750, 0.194536, 0.102422, 0.018605, -0.035016, -0.023149, - -0.104438, -0.003201, -0.090376, 0.027747, -0.056991, -0.016908, - -0.026897, -0.033271, -0.040691, 0.045391, 0.020604, 0.059533, - 0.040754, -0.044068, 0.080208, 0.066083, 0.076591, 0.058051, - -0.011797, -0.048725, 0.027920, -0.004163, -0.023246, 0.000199, - -0.024865, 0.017309, -0.006779, -0.063903, 0.046350, 0.039836, - 0.057749, 0.291129, 0.091507, 0.071580, 0.037118, -0.031998, - 0.023980, 0.091036, -0.065168, 0.037983, -0.018616, -0.018349, - -0.033575, -0.085878, -0.029487, 0.072876, 0.073592, 0.120935, - -0.032148, -0.075896, 0.038838, 0.047100, 0.030416, 0.040382, - -0.020444, -0.023851, 0.001185, -0.040379, -0.049209, -0.053478, - -0.020984, -0.088742, 0.003522, 0.031149, 0.074252, 0.049165, - 0.075235, 0.044033, -0.004112, 0.031635, 0.053846, 0.003508, - 0.201778, 0.150678, 0.000046, 0.055651, 0.004524, -0.012253, - -0.002881, -0.070115, 0.070934, 0.036062, 0.085424, 0.066447, - -0.069779, -0.082196, 0.012446, -0.026389, -0.000334, -0.041049, - 0.034400, 0.009420, -0.025685, -0.005732, 0.007268, -0.018682, - 0.027049, 0.018036, 0.033642, 0.028599, 0.038345, -0.006444, - 0.033191, -0.094253, -0.011594, -0.008444, 0.033820, -0.018835, - 0.171927, 0.029736, -0.010858, 0.014596, -0.028953, 0.002124, - 0.063024, -0.044746, 0.084287, 0.016203, -0.010323, 0.067800, - 0.007908, -0.054768, 0.021023, 0.058079, -0.009141, -0.045847, - 0.028120, 0.033679, 0.044156, -0.028545, 0.002530, -0.069711, - 0.028120, 0.033679, 0.044156, -0.028545, 0.002530, -0.069711, - 0.007908, -0.054768, 0.021023, 0.058079, -0.009141, -0.045847, - 0.063024, -0.044746, 0.084287, 0.016203, -0.010323, 0.067800, - 0.171927, 0.029736, -0.010858, 0.014596, -0.028953, 0.002124, - 0.033191, -0.094253, -0.011594, -0.008444, 0.033820, -0.018835, - 0.027049, 0.018036, 0.033642, 0.028599, 0.038345, -0.006444, - 0.034400, 0.009420, -0.025685, -0.005732, 0.007268, -0.018682, - -0.069779, -0.082196, 0.012446, -0.026389, -0.000334, -0.041049, - -0.002881, -0.070115, 0.070934, 0.036062, 0.085424, 0.066447, - 0.201778, 0.150678, 0.000046, 0.055651, 0.004524, -0.012253, - 0.075235, 0.044033, -0.004112, 0.031635, 0.053846, 0.003508, - -0.020984, -0.088742, 0.003522, 0.031149, 0.074252, 0.049165, - -0.020444, -0.023851, 0.001185, -0.040379, -0.049209, -0.053478, - -0.032148, -0.075896, 0.038838, 0.047100, 0.030416, 0.040382, - -0.033575, -0.085878, -0.029487, 0.072876, 0.073592, 0.120935, - 0.023980, 0.091036, -0.065168, 0.037983, -0.018616, -0.018349, - 0.057749, 0.291129, 0.091507, 0.071580, 0.037118, -0.031998, - -0.024865, 0.017309, -0.006779, -0.063903, 0.046350, 0.039836, - -0.011797, -0.048725, 0.027920, -0.004163, -0.023246, 0.000199, - 0.040754, -0.044068, 0.080208, 0.066083, 0.076591, 0.058051, - -0.026897, -0.033271, -0.040691, 0.045391, 0.020604, 0.059533, - -0.104438, -0.003201, -0.090376, 0.027747, -0.056991, -0.016908, - -0.075750, 0.194536, 0.102422, 0.018605, -0.035016, -0.023149, - -0.027016, 0.043438, 0.041058, -0.025638, -0.074476, 0.008203, - -0.084919, -0.036417, -0.017997, -0.076945, -0.009186, 0.031228, - -0.111890, -0.024596, -0.000145, 0.000426, -0.010700, 0.030705, - -0.066275, 0.012496, -0.063359, 0.007933, -0.007088, 0.064385, - -0.058587, -0.023263, -0.049575, 0.007575, 0.000405, 0.066995, - -0.077957, -0.017680, 0.023233, 0.012276, 0.017296, -0.014028, - -0.057475, 0.011666, 0.039393, -0.063765, -0.034140, 0.001825, - 0.038545, -0.019558, -0.036785, -0.049329, 0.022270, -0.020613, - 0.011550, -0.035691, 0.004229, 0.037963, 0.021076, -0.043539, - 0.036240, -0.039727, 0.001516, 0.034301, 0.043005, -0.014826, - 0.074107, -0.004603, -0.064569, 0.016175, 0.041634, -0.013264, - 0.100950, 0.033266, 0.013184, 0.027521, 0.022387, -0.038618, - 0.060950, 0.042562, 0.052345, 0.029933, 0.079814, -0.031389, - -0.057475, 0.011666, 0.039393, -0.063765, -0.034140, 0.001825, - -0.077957, -0.017680, 0.023233, 0.012276, 0.017296, -0.014028, - -0.058587, -0.023263, -0.049575, 0.007575, 0.000405, 0.066995, - -0.066275, 0.012496, -0.063359, 0.007933, -0.007088, 0.064385, - -0.111890, -0.024596, -0.000145, 0.000426, -0.010700, 0.030705, - -0.084919, -0.036417, -0.017997, -0.076945, -0.009186, 0.031228, - 0.060950, 0.042562, 0.052345, 0.029933, 0.079814, -0.031389, - 0.100950, 0.033266, 0.013184, 0.027521, 0.022387, -0.038618, - 0.074107, -0.004603, -0.064569, 0.016175, 0.041634, -0.013264, - 0.036240, -0.039727, 0.001516, 0.034301, 0.043005, -0.014826, - 0.011550, -0.035691, 0.004229, 0.037963, 0.021076, -0.043539, - 0.038545, -0.019558, -0.036785, -0.049329, 0.022270, -0.020613, - 0.000000, - 6.000000, 6.000000, 31.000000, - 0.010972, -0.049203, -0.019949, -0.056211, -0.044799, -0.018842, - 0.011693, 0.038502, 0.024014, -0.019381, -0.003194, -0.019456, - 0.015322, 0.014939, 0.034241, 0.001472, 0.033410, -0.030677, - -0.013184, 0.012891, 0.005805, 0.007095, 0.052474, -0.028992, - 0.011464, -0.002109, 0.012210, 0.033932, 0.009833, 0.022312, - 0.029625, -0.016050, -0.015339, 0.003296, -0.027620, -0.012010, - -0.017946, -0.017373, -0.018473, -0.046054, 0.003785, -0.016355, - -0.007135, 0.046733, 0.001935, 0.029827, -0.004503, 0.016479, - 0.027819, -0.027903, -0.007070, 0.050250, -0.023385, 0.009776, - 0.012547, 0.031760, 0.045821, 0.035944, 0.000990, -0.007728, - 0.006118, 0.008206, 0.026091, 0.009060, 0.005807, 0.026853, - -0.026703, -0.066007, 0.000020, -0.001755, 0.020791, -0.022349, - -0.011943, 0.032980, 0.009447, -0.025146, -0.020631, 0.009564, - 0.024701, 0.054368, -0.009956, 0.052650, -0.005873, 0.030722, - 0.031332, 0.010280, 0.003776, -0.012630, -0.028431, 0.029229, - 0.038500, 0.024167, 0.024864, -0.012565, -0.006641, -0.030265, - 0.018576, 0.038506, 0.026625, -0.009740, -0.017985, -0.037208, - 0.026023, -0.013342, 0.024804, 0.053457, -0.006094, -0.019222, - -0.009098, 0.010288, 0.018497, -0.004080, 0.026515, 0.008637, - -0.054784, 0.013346, 0.009119, 0.003052, -0.009528, -0.025677, - 0.015290, 0.007008, 0.020681, -0.008025, -0.010795, -0.043462, - -0.005154, -0.032979, -0.006678, -0.022283, 0.003790, -0.013164, - 0.001710, 0.008836, 0.005401, -0.011033, 0.015740, -0.007297, - 0.013741, 0.023915, 0.011975, -0.028249, -0.011373, -0.018831, - 0.028930, 0.056327, -0.002656, 0.061252, -0.036367, 0.021064, - 0.003973, -0.005653, 0.019605, 0.021961, -0.038524, -0.049465, - -0.016152, -0.005264, -0.016550, -0.000692, 0.015719, 0.023812, - -0.013576, -0.018223, 0.009610, 0.008528, -0.026262, 0.037150, - -0.057230, -0.024452, -0.031881, 0.016382, 0.017835, 0.051134, - -0.062320, 0.018965, -0.035952, -0.019794, 0.012663, 0.046800, - 0.064005, 0.062002, 0.017280, 0.010173, -0.009917, 0.001697, - 0.015104, 0.015314, 0.031344, 0.049108, 0.017430, 0.013942, - 0.003284, 0.016150, 0.006236, 0.002431, 0.014564, 0.047419, - 0.013482, 0.026466, 0.006416, -0.007626, 0.008344, 0.052193, - -0.015671, -0.007708, -0.018361, 0.040463, 0.029292, 0.045951, - -0.018143, 0.060647, 0.013517, 0.004380, 0.010185, 0.034423, - -0.046803, -0.041066, -0.046478, -0.035385, 0.004745, 0.022603, - -0.009272, -0.019351, -0.038578, -0.002765, 0.046645, 0.026553, - -0.012574, 0.024819, -0.010668, 0.022752, 0.023357, -0.026258, - -0.025676, 0.026340, 0.000279, -0.021939, 0.019913, -0.012059, - 0.019913, -0.048073, -0.013804, 0.016507, -0.043818, -0.028004, - 0.006101, -0.020599, -0.036596, 0.005023, -0.054630, -0.024972, - 0.016274, 0.023592, -0.000597, -0.027880, -0.014929, 0.028460, - 0.037987, 0.056488, 0.018523, -0.028868, 0.017303, -0.033976, - 0.020767, 0.003015, 0.001823, 0.000373, 0.041143, 0.038170, - 0.020458, -0.001089, 0.047739, 0.057677, 0.013767, -0.012926, - 0.035093, -0.014444, 0.011922, 0.022615, 0.014246, -0.053117, - -0.000337, -0.001447, -0.011391, 0.050181, 0.002397, -0.011598, - -0.030976, -0.002950, 0.000410, 0.006709, 0.037302, 0.030477, - -0.019850, -0.019391, 0.016032, -0.069632, -0.007924, -0.016721, - -0.013617, -0.006760, -0.041758, -0.078959, -0.029931, 0.078011, - -0.018748, -0.003520, 0.026379, 0.011052, 0.008918, 0.074677, - 0.034265, -0.006502, 0.000047, 0.012272, -0.010836, -0.027970, - 0.002305, -0.003712, -0.019794, -0.005018, 0.013998, -0.009341, - -0.025729, -0.011117, 0.013658, 0.007134, 0.052704, 0.016574, - -0.024857, -0.023084, 0.005057, 0.007317, 0.035590, -0.000961, - -0.025520, -0.004449, -0.017516, 0.006083, 0.001053, 0.091226, - -0.001929, 0.001380, -0.019715, -0.034334, 0.026260, 0.018052, - 0.012118, -0.042211, 0.024729, 0.033205, -0.004218, -0.017808, - -0.001248, 0.045986, 0.015764, -0.001496, 0.001678, -0.023088, - -0.021008, -0.024297, 0.027490, 0.029203, 0.014948, -0.015305, - 0.033703, 0.023054, 0.021729, -0.012511, 0.019674, -0.036115, - 0.076451, 0.000408, 0.030314, 0.071893, 0.006515, -0.010606, - 0.011268, -0.004529, 0.043869, 0.050809, 0.009399, -0.009330, - -0.014261, -0.014500, 0.028015, 0.005451, -0.016959, 0.006860, - -0.009465, 0.021905, -0.010024, -0.011255, 0.013944, 0.007638, - -0.054342, 0.006509, 0.004096, 0.002816, 0.017847, -0.048877, - 0.024036, 0.012616, -0.012010, -0.037142, 0.003183, -0.057568, - -0.015244, 0.058453, 0.043485, -0.001845, -0.030372, -0.040437, - 0.012709, -0.017112, 0.038573, 0.030531, -0.001031, 0.023903, - 0.017798, -0.003384, 0.055947, -0.002208, -0.018853, 0.016886, - 0.035567, 0.018173, -0.013601, -0.060308, -0.020258, 0.030223, - -0.036969, 0.001880, 0.026753, 0.041624, 0.004545, 0.061986, - 0.012438, 0.000693, -0.018115, 0.014087, 0.002124, 0.005855, - -0.035193, -0.005598, 0.010999, -0.003892, -0.001775, -0.000096, - -0.008549, 0.002718, -0.011195, -0.014771, 0.013629, 0.016009, - 0.034569, -0.018961, 0.005493, 0.008469, 0.032576, 0.023702, - -0.006079, 0.006591, 0.018607, -0.012542, 0.059098, 0.025197, - 0.050139, -0.002070, -0.004433, -0.001870, 0.018822, 0.026841, - 0.028831, 0.000774, 0.007473, 0.042050, 0.012992, -0.021905, - 0.007285, 0.031452, -0.033542, 0.010597, 0.013227, 0.035567, - 0.011457, 0.001687, -0.009179, 0.004687, 0.054063, -0.005455, - -0.001813, -0.049990, -0.032948, 0.016414, -0.013254, -0.043662, - 0.006305, 0.004716, -0.031008, 0.002108, 0.002979, 0.033604, - 0.017553, 0.043279, -0.018426, -0.019390, 0.021764, -0.021843, - 0.003342, 0.019975, -0.021273, 0.009116, 0.006827, 0.032530, - -0.033744, -0.014952, -0.013123, -0.017588, -0.016548, 0.049070, - -0.009737, -0.034264, -0.004092, -0.022615, -0.002725, 0.040318, - 0.020742, -0.050201, 0.015339, 0.026587, 0.006860, 0.046786, - 0.017035, -0.022899, -0.020564, 0.001860, -0.008161, 0.020750, - 0.010685, 0.026770, 0.045389, 0.019894, -0.019153, -0.009254, - 0.054215, -0.018513, 0.017035, 0.090851, 0.002117, 0.029181, - 0.025900, -0.000418, -0.016437, 0.046752, 0.031257, 0.029367, - 0.043611, -0.033315, -0.000872, -0.002849, 0.021433, 0.022835, - 0.029990, -0.003485, 0.018352, -0.031370, 0.011875, 0.022338, - 0.033010, 0.021859, 0.007469, 0.063812, 0.029094, 0.032395, - -0.012848, -0.053152, -0.013015, -0.007742, 0.008090, -0.012391, - 0.057226, -0.018215, 0.016417, -0.005754, -0.014335, 0.000002, - 0.022937, 0.023277, 0.035370, 0.012969, -0.000491, -0.004907, - -0.017876, -0.007855, 0.032834, -0.034639, -0.021635, -0.026586, - -0.015834, 0.000975, 0.012873, -0.042487, 0.016378, -0.000123, - 0.001349, 0.033129, 0.036235, -0.012712, 0.033910, 0.033051, - -0.010044, -0.026930, 0.016270, 0.023015, -0.000475, -0.044954, - -0.025421, 0.021985, -0.020354, 0.042339, 0.002784, -0.019593, - 0.038455, 0.030174, 0.035556, 0.014615, 0.009125, -0.027798, - -0.014338, -0.018716, 0.005877, 0.010355, 0.030997, -0.060395, - -0.011603, 0.004934, -0.029320, -0.004079, 0.023002, -0.018263, - 0.002417, 0.020568, 0.001649, 0.040105, -0.007970, -0.042104, - -0.026978, -0.051108, -0.053000, -0.042963, 0.014385, 0.007983, - 0.039455, 0.022344, 0.006909, -0.030415, -0.003828, -0.045740, - 0.042523, 0.008731, 0.021563, 0.015704, 0.012089, -0.024841, - -0.042966, -0.002106, 0.040929, -0.030430, 0.020650, -0.029741, - 0.002246, -0.030284, 0.030734, 0.025084, 0.004607, -0.015785, - -0.017225, 0.004165, -0.010937, -0.013659, -0.006848, -0.026292, - -0.045267, -0.031204, -0.017812, -0.033117, 0.007980, -0.062892, - 0.048197, 0.028797, 0.008171, 0.013262, 0.003377, -0.039746, - 0.058511, -0.015068, -0.012716, 0.006769, -0.020458, -0.014797, - 0.024741, -0.027300, -0.013591, 0.004141, 0.006858, -0.030345, - -0.008941, -0.047177, 0.007549, -0.019360, -0.013196, 0.018472, - -0.018491, -0.039110, -0.013292, -0.005785, 0.030094, -0.036458, - -0.077322, -0.018639, -0.012427, -0.027501, -0.041589, -0.017788, - -0.006694, 0.001171, -0.023360, 0.008375, -0.003423, -0.021754, - 0.017449, 0.027074, 0.005635, -0.017438, -0.034537, -0.027840, - 0.016691, -0.024130, 0.021268, -0.009962, -0.011295, -0.007292, - -0.021657, -0.035266, 0.035090, -0.021304, -0.051765, -0.026398, - 0.012562, -0.028861, -0.047205, -0.029464, -0.022489, 0.005098, - -0.047095, -0.003492, 0.021450, -0.013371, 0.001406, 0.038775, - -0.040250, -0.034677, -0.047486, 0.006505, -0.012775, -0.015759, - -0.016345, -0.003967, 0.005132, -0.023727, -0.019981, -0.059031, - -0.017109, -0.020654, -0.021474, -0.018732, -0.001241, -0.023458, - -0.011974, -0.023561, 0.006106, -0.020655, -0.012182, 0.006188, - -0.003578, 0.005771, -0.026313, -0.027526, 0.015213, -0.005655, - 0.048400, 0.026780, 0.006096, 0.007520, -0.021979, 0.006061, - 0.021619, -0.020086, 0.035616, -0.022215, -0.042346, -0.070343, - -0.033265, -0.007818, -0.055955, -0.028931, -0.006091, 0.008967, - -0.020427, -0.021045, -0.006082, -0.013077, -0.001139, 0.001600, - -0.026865, -0.043835, -0.044131, 0.017028, -0.002955, -0.024270, - -0.047746, 0.010037, -0.049928, -0.003015, -0.014354, -0.011042, - 0.063147, 0.034671, 0.018242, -0.022230, 0.003917, -0.022094, - 0.027006, 0.000389, 0.002464, 0.040540, 0.021688, -0.001182, - -0.052413, -0.015833, -0.021359, -0.017538, 0.008277, 0.018647, - -0.031593, -0.022127, -0.017183, -0.040626, 0.003604, 0.021913, - -0.027132, -0.064633, -0.010642, 0.032328, 0.019102, 0.005083, - -0.015269, -0.007100, -0.018245, 0.026701, -0.002373, -0.007860, - -0.013097, -0.009898, -0.004650, -0.025222, -0.015485, 0.011252, - 0.047534, -0.012392, -0.043530, 0.029730, 0.011006, 0.021252, - 0.006875, -0.013139, -0.048731, 0.026935, 0.003964, 0.007587, - 0.020842, -0.000456, -0.002044, -0.043152, 0.031101, 0.021282, - 0.018002, -0.040910, 0.002470, -0.008540, -0.029052, 0.018394, - 0.009580, 0.007232, -0.028628, 0.050638, -0.017442, 0.015983, - -0.026716, -0.035265, -0.010948, -0.041392, -0.035932, -0.006858, - 0.029559, -0.019856, 0.000051, -0.020146, 0.020418, -0.051154, - -0.010278, 0.004502, 0.020166, 0.015995, 0.003289, -0.011933, - -0.020796, -0.018719, 0.055052, -0.003573, 0.003273, -0.012844, - -0.028193, -0.034231, -0.007791, -0.016292, 0.026591, -0.051809, - -0.010155, -0.018414, -0.054793, 0.017930, 0.006426, 0.023304, - -0.048921, -0.052002, -0.019893, -0.012288, -0.005234, -0.019678, - -0.043605, -0.010795, -0.002780, -0.017000, 0.003344, -0.044943, - 0.011597, -0.007942, -0.052141, -0.037486, -0.017080, -0.013358, - -0.047446, -0.003896, 0.009206, -0.012010, 0.028744, 0.005538, - 0.007456, -0.018324, 0.004821, 0.030539, 0.025653, -0.017038, - 0.018920, -0.004534, 0.010551, -0.003490, 0.014134, -0.024699, - -0.027441, -0.010447, -0.012607, -0.008101, 0.006130, 0.000793, - 0.014923, 0.013988, 0.007929, 0.026113, 0.008796, -0.027486, - 0.050275, 0.050142, 0.020208, 0.029441, 0.009393, 0.021935, - 0.039068, 0.016665, 0.021530, 0.038030, 0.037605, 0.023567, - 0.015317, -0.044047, 0.026281, 0.031930, 0.016209, 0.012571, - -0.024948, -0.000079, 0.015474, 0.021621, 0.032409, 0.034554, - -0.023947, -0.023383, -0.009830, -0.033091, -0.038903, -0.034006, - 0.011626, 0.029852, 0.008081, 0.020642, -0.017172, -0.054129, - 0.026770, 0.050528, 0.033372, 0.023241, 0.004722, 0.001931, - 0.014463, 0.004881, 0.049580, 0.004011, 0.036895, -0.001285, - 0.034138, -0.037780, -0.002614, 0.011694, 0.005173, -0.001698, - 0.032916, 0.003784, -0.045142, -0.010624, -0.000341, -0.000918, - 0.002934, 0.021001, 0.023925, 0.038621, 0.060907, 0.052698, - 0.020185, 0.018493, 0.008522, 0.022013, 0.049908, 0.037517, - -0.004797, -0.020931, -0.017675, -0.002579, 0.020668, 0.068436, - -0.001664, -0.023581, 0.015642, -0.005660, 0.009881, 0.026384, - 0.009799, -0.024707, 0.003424, 0.033840, 0.002750, 0.017571, - 0.000319, 0.022565, 0.008745, 0.024299, 0.012549, 0.017125, - 0.011142, 0.029548, 0.024562, -0.007770, 0.002411, -0.000592, - 0.031485, 0.031776, 0.007522, 0.019057, -0.002505, -0.015379, - -0.009648, -0.006846, -0.004878, 0.004841, -0.012324, 0.024326, - -0.035243, -0.018797, 0.024658, -0.016084, 0.012578, -0.011785, - 0.000116, 0.000676, 0.027937, -0.011261, 0.002983, -0.014597, - 0.014899, 0.036143, -0.009354, -0.001782, -0.014149, -0.012782, - 3.000000, - 6.000000, 6.000000, 31.000000, - -0.001248, 0.045986, 0.015764, -0.001496, 0.001678, -0.023088, - 0.012118, -0.042211, 0.024729, 0.033205, -0.004218, -0.017808, - -0.001929, 0.001380, -0.019715, -0.034334, 0.026260, 0.018052, - -0.025520, -0.004449, -0.017516, 0.006083, 0.001053, 0.091226, - -0.024857, -0.023084, 0.005057, 0.007317, 0.035590, -0.000961, - -0.025729, -0.011117, 0.013658, 0.007134, 0.052704, 0.016574, - 0.002305, -0.003712, -0.019794, -0.005018, 0.013998, -0.009341, - 0.034265, -0.006502, 0.000047, 0.012272, -0.010836, -0.027970, - -0.018748, -0.003520, 0.026379, 0.011052, 0.008918, 0.074677, - -0.013617, -0.006760, -0.041758, -0.078959, -0.029931, 0.078011, - -0.019850, -0.019391, 0.016032, -0.069632, -0.007924, -0.016721, - -0.030976, -0.002950, 0.000410, 0.006709, 0.037302, 0.030477, - -0.000337, -0.001447, -0.011391, 0.050181, 0.002397, -0.011598, - 0.035093, -0.014444, 0.011922, 0.022615, 0.014246, -0.053117, - 0.020458, -0.001089, 0.047739, 0.057677, 0.013767, -0.012926, - 0.020767, 0.003015, 0.001823, 0.000373, 0.041143, 0.038170, - 0.037987, 0.056488, 0.018523, -0.028868, 0.017303, -0.033976, - 0.016274, 0.023592, -0.000597, -0.027880, -0.014929, 0.028460, - 0.006101, -0.020599, -0.036596, 0.005023, -0.054630, -0.024972, - 0.019913, -0.048073, -0.013804, 0.016507, -0.043818, -0.028004, - -0.025676, 0.026340, 0.000279, -0.021939, 0.019913, -0.012059, - -0.012574, 0.024819, -0.010668, 0.022752, 0.023357, -0.026258, - -0.009272, -0.019351, -0.038578, -0.002765, 0.046645, 0.026553, - -0.046803, -0.041066, -0.046478, -0.035385, 0.004745, 0.022603, - -0.018143, 0.060647, 0.013517, 0.004380, 0.010185, 0.034423, - -0.015671, -0.007708, -0.018361, 0.040463, 0.029292, 0.045951, - 0.013482, 0.026466, 0.006416, -0.007626, 0.008344, 0.052193, - 0.003284, 0.016150, 0.006236, 0.002431, 0.014564, 0.047419, - 0.015104, 0.015314, 0.031344, 0.049108, 0.017430, 0.013942, - 0.064005, 0.062002, 0.017280, 0.010173, -0.009917, 0.001697, - -0.062320, 0.018965, -0.035952, -0.019794, 0.012663, 0.046800, - -0.057230, -0.024452, -0.031881, 0.016382, 0.017835, 0.051134, - -0.013576, -0.018223, 0.009610, 0.008528, -0.026262, 0.037150, - -0.016152, -0.005264, -0.016550, -0.000692, 0.015719, 0.023812, - 0.003973, -0.005653, 0.019605, 0.021961, -0.038524, -0.049465, - 0.028930, 0.056327, -0.002656, 0.061252, -0.036367, 0.021064, - 0.013741, 0.023915, 0.011975, -0.028249, -0.011373, -0.018831, - 0.001710, 0.008836, 0.005401, -0.011033, 0.015740, -0.007297, - -0.005154, -0.032979, -0.006678, -0.022283, 0.003790, -0.013164, - 0.015290, 0.007008, 0.020681, -0.008025, -0.010795, -0.043462, - -0.054784, 0.013346, 0.009119, 0.003052, -0.009528, -0.025677, - -0.009098, 0.010288, 0.018497, -0.004080, 0.026515, 0.008637, - 0.026023, -0.013342, 0.024804, 0.053457, -0.006094, -0.019222, - 0.018576, 0.038506, 0.026625, -0.009740, -0.017985, -0.037208, - 0.038500, 0.024167, 0.024864, -0.012565, -0.006641, -0.030265, - 0.031332, 0.010280, 0.003776, -0.012630, -0.028431, 0.029229, - 0.024701, 0.054368, -0.009956, 0.052650, -0.005873, 0.030722, - -0.011943, 0.032980, 0.009447, -0.025146, -0.020631, 0.009564, - -0.026703, -0.066007, 0.000020, -0.001755, 0.020791, -0.022349, - 0.006118, 0.008206, 0.026091, 0.009060, 0.005807, 0.026853, - 0.012547, 0.031760, 0.045821, 0.035944, 0.000990, -0.007728, - 0.027819, -0.027903, -0.007070, 0.050250, -0.023385, 0.009776, - -0.007135, 0.046733, 0.001935, 0.029827, -0.004503, 0.016479, - -0.017946, -0.017373, -0.018473, -0.046054, 0.003785, -0.016355, - 0.029625, -0.016050, -0.015339, 0.003296, -0.027620, -0.012010, - 0.011464, -0.002109, 0.012210, 0.033932, 0.009833, 0.022312, - -0.013184, 0.012891, 0.005805, 0.007095, 0.052474, -0.028992, - 0.015322, 0.014939, 0.034241, 0.001472, 0.033410, -0.030677, - 0.011693, 0.038502, 0.024014, -0.019381, -0.003194, -0.019456, - 0.010972, -0.049203, -0.019949, -0.056211, -0.044799, -0.018842, - 0.002417, 0.020568, 0.001649, 0.040105, -0.007970, -0.042104, - -0.011603, 0.004934, -0.029320, -0.004079, 0.023002, -0.018263, - -0.014338, -0.018716, 0.005877, 0.010355, 0.030997, -0.060395, - 0.038455, 0.030174, 0.035556, 0.014615, 0.009125, -0.027798, - -0.025421, 0.021985, -0.020354, 0.042339, 0.002784, -0.019593, - -0.010044, -0.026930, 0.016270, 0.023015, -0.000475, -0.044954, - 0.001349, 0.033129, 0.036235, -0.012712, 0.033910, 0.033051, - -0.015834, 0.000975, 0.012873, -0.042487, 0.016378, -0.000123, - -0.017876, -0.007855, 0.032834, -0.034639, -0.021635, -0.026586, - 0.022937, 0.023277, 0.035370, 0.012969, -0.000491, -0.004907, - 0.057226, -0.018215, 0.016417, -0.005754, -0.014335, 0.000002, - -0.012848, -0.053152, -0.013015, -0.007742, 0.008090, -0.012391, - 0.033010, 0.021859, 0.007469, 0.063812, 0.029094, 0.032395, - 0.029990, -0.003485, 0.018352, -0.031370, 0.011875, 0.022338, - 0.043611, -0.033315, -0.000872, -0.002849, 0.021433, 0.022835, - 0.025900, -0.000418, -0.016437, 0.046752, 0.031257, 0.029367, - 0.054215, -0.018513, 0.017035, 0.090851, 0.002117, 0.029181, - 0.010685, 0.026770, 0.045389, 0.019894, -0.019153, -0.009254, - 0.017035, -0.022899, -0.020564, 0.001860, -0.008161, 0.020750, - 0.020742, -0.050201, 0.015339, 0.026587, 0.006860, 0.046786, - -0.009737, -0.034264, -0.004092, -0.022615, -0.002725, 0.040318, - -0.033744, -0.014952, -0.013123, -0.017588, -0.016548, 0.049070, - 0.003342, 0.019975, -0.021273, 0.009116, 0.006827, 0.032530, - 0.017553, 0.043279, -0.018426, -0.019390, 0.021764, -0.021843, - 0.006305, 0.004716, -0.031008, 0.002108, 0.002979, 0.033604, - -0.001813, -0.049990, -0.032948, 0.016414, -0.013254, -0.043662, - 0.011457, 0.001687, -0.009179, 0.004687, 0.054063, -0.005455, - 0.007285, 0.031452, -0.033542, 0.010597, 0.013227, 0.035567, - 0.028831, 0.000774, 0.007473, 0.042050, 0.012992, -0.021905, - 0.050139, -0.002070, -0.004433, -0.001870, 0.018822, 0.026841, - -0.006079, 0.006591, 0.018607, -0.012542, 0.059098, 0.025197, - 0.034569, -0.018961, 0.005493, 0.008469, 0.032576, 0.023702, - -0.008549, 0.002718, -0.011195, -0.014771, 0.013629, 0.016009, - -0.035193, -0.005598, 0.010999, -0.003892, -0.001775, -0.000096, - 0.012438, 0.000693, -0.018115, 0.014087, 0.002124, 0.005855, - -0.036969, 0.001880, 0.026753, 0.041624, 0.004545, 0.061986, - 0.035567, 0.018173, -0.013601, -0.060308, -0.020258, 0.030223, - 0.017798, -0.003384, 0.055947, -0.002208, -0.018853, 0.016886, - 0.012709, -0.017112, 0.038573, 0.030531, -0.001031, 0.023903, - -0.015244, 0.058453, 0.043485, -0.001845, -0.030372, -0.040437, - 0.024036, 0.012616, -0.012010, -0.037142, 0.003183, -0.057568, - -0.054342, 0.006509, 0.004096, 0.002816, 0.017847, -0.048877, - -0.009465, 0.021905, -0.010024, -0.011255, 0.013944, 0.007638, - -0.014261, -0.014500, 0.028015, 0.005451, -0.016959, 0.006860, - 0.011268, -0.004529, 0.043869, 0.050809, 0.009399, -0.009330, - 0.076451, 0.000408, 0.030314, 0.071893, 0.006515, -0.010606, - 0.033703, 0.023054, 0.021729, -0.012511, 0.019674, -0.036115, - -0.021008, -0.024297, 0.027490, 0.029203, 0.014948, -0.015305, - -0.017225, 0.004165, -0.010937, -0.013659, -0.006848, -0.026292, - 0.002246, -0.030284, 0.030734, 0.025084, 0.004607, -0.015785, - -0.042966, -0.002106, 0.040929, -0.030430, 0.020650, -0.029741, - 0.042523, 0.008731, 0.021563, 0.015704, 0.012089, -0.024841, - 0.039455, 0.022344, 0.006909, -0.030415, -0.003828, -0.045740, - -0.026978, -0.051108, -0.053000, -0.042963, 0.014385, 0.007983, - 0.018920, -0.004534, 0.010551, -0.003490, 0.014134, -0.024699, - 0.007456, -0.018324, 0.004821, 0.030539, 0.025653, -0.017038, - -0.047446, -0.003896, 0.009206, -0.012010, 0.028744, 0.005538, - 0.011597, -0.007942, -0.052141, -0.037486, -0.017080, -0.013358, - -0.043605, -0.010795, -0.002780, -0.017000, 0.003344, -0.044943, - -0.048921, -0.052002, -0.019893, -0.012288, -0.005234, -0.019678, - -0.010155, -0.018414, -0.054793, 0.017930, 0.006426, 0.023304, - -0.028193, -0.034231, -0.007791, -0.016292, 0.026591, -0.051809, - -0.020796, -0.018719, 0.055052, -0.003573, 0.003273, -0.012844, - -0.010278, 0.004502, 0.020166, 0.015995, 0.003289, -0.011933, - 0.029559, -0.019856, 0.000051, -0.020146, 0.020418, -0.051154, - -0.026716, -0.035265, -0.010948, -0.041392, -0.035932, -0.006858, - 0.009580, 0.007232, -0.028628, 0.050638, -0.017442, 0.015983, - 0.018002, -0.040910, 0.002470, -0.008540, -0.029052, 0.018394, - 0.020842, -0.000456, -0.002044, -0.043152, 0.031101, 0.021282, - 0.006875, -0.013139, -0.048731, 0.026935, 0.003964, 0.007587, - 0.047534, -0.012392, -0.043530, 0.029730, 0.011006, 0.021252, - -0.013097, -0.009898, -0.004650, -0.025222, -0.015485, 0.011252, - -0.015269, -0.007100, -0.018245, 0.026701, -0.002373, -0.007860, - -0.027132, -0.064633, -0.010642, 0.032328, 0.019102, 0.005083, - -0.031593, -0.022127, -0.017183, -0.040626, 0.003604, 0.021913, - -0.052413, -0.015833, -0.021359, -0.017538, 0.008277, 0.018647, - 0.027006, 0.000389, 0.002464, 0.040540, 0.021688, -0.001182, - 0.063147, 0.034671, 0.018242, -0.022230, 0.003917, -0.022094, - -0.047746, 0.010037, -0.049928, -0.003015, -0.014354, -0.011042, - -0.026865, -0.043835, -0.044131, 0.017028, -0.002955, -0.024270, - -0.020427, -0.021045, -0.006082, -0.013077, -0.001139, 0.001600, - -0.033265, -0.007818, -0.055955, -0.028931, -0.006091, 0.008967, - 0.021619, -0.020086, 0.035616, -0.022215, -0.042346, -0.070343, - 0.048400, 0.026780, 0.006096, 0.007520, -0.021979, 0.006061, - -0.003578, 0.005771, -0.026313, -0.027526, 0.015213, -0.005655, - -0.011974, -0.023561, 0.006106, -0.020655, -0.012182, 0.006188, - -0.017109, -0.020654, -0.021474, -0.018732, -0.001241, -0.023458, - -0.016345, -0.003967, 0.005132, -0.023727, -0.019981, -0.059031, - -0.040250, -0.034677, -0.047486, 0.006505, -0.012775, -0.015759, - -0.047095, -0.003492, 0.021450, -0.013371, 0.001406, 0.038775, - 0.012562, -0.028861, -0.047205, -0.029464, -0.022489, 0.005098, - -0.021657, -0.035266, 0.035090, -0.021304, -0.051765, -0.026398, - 0.016691, -0.024130, 0.021268, -0.009962, -0.011295, -0.007292, - 0.017449, 0.027074, 0.005635, -0.017438, -0.034537, -0.027840, - -0.006694, 0.001171, -0.023360, 0.008375, -0.003423, -0.021754, - -0.077322, -0.018639, -0.012427, -0.027501, -0.041589, -0.017788, - -0.018491, -0.039110, -0.013292, -0.005785, 0.030094, -0.036458, - -0.008941, -0.047177, 0.007549, -0.019360, -0.013196, 0.018472, - 0.024741, -0.027300, -0.013591, 0.004141, 0.006858, -0.030345, - 0.058511, -0.015068, -0.012716, 0.006769, -0.020458, -0.014797, - 0.048197, 0.028797, 0.008171, 0.013262, 0.003377, -0.039746, - -0.045267, -0.031204, -0.017812, -0.033117, 0.007980, -0.062892, - 0.000319, 0.022565, 0.008745, 0.024299, 0.012549, 0.017125, - 0.009799, -0.024707, 0.003424, 0.033840, 0.002750, 0.017571, - -0.001664, -0.023581, 0.015642, -0.005660, 0.009881, 0.026384, - -0.004797, -0.020931, -0.017675, -0.002579, 0.020668, 0.068436, - 0.020185, 0.018493, 0.008522, 0.022013, 0.049908, 0.037517, - 0.002934, 0.021001, 0.023925, 0.038621, 0.060907, 0.052698, - 0.014899, 0.036143, -0.009354, -0.001782, -0.014149, -0.012782, - 0.000116, 0.000676, 0.027937, -0.011261, 0.002983, -0.014597, - -0.035243, -0.018797, 0.024658, -0.016084, 0.012578, -0.011785, - -0.009648, -0.006846, -0.004878, 0.004841, -0.012324, 0.024326, - 0.031485, 0.031776, 0.007522, 0.019057, -0.002505, -0.015379, - 0.011142, 0.029548, 0.024562, -0.007770, 0.002411, -0.000592, - -0.024948, -0.000079, 0.015474, 0.021621, 0.032409, 0.034554, - 0.015317, -0.044047, 0.026281, 0.031930, 0.016209, 0.012571, - 0.039068, 0.016665, 0.021530, 0.038030, 0.037605, 0.023567, - 0.050275, 0.050142, 0.020208, 0.029441, 0.009393, 0.021935, - 0.014923, 0.013988, 0.007929, 0.026113, 0.008796, -0.027486, - -0.027441, -0.010447, -0.012607, -0.008101, 0.006130, 0.000793, - 0.032916, 0.003784, -0.045142, -0.010624, -0.000341, -0.000918, - 0.034138, -0.037780, -0.002614, 0.011694, 0.005173, -0.001698, - 0.014463, 0.004881, 0.049580, 0.004011, 0.036895, -0.001285, - 0.026770, 0.050528, 0.033372, 0.023241, 0.004722, 0.001931, - 0.011626, 0.029852, 0.008081, 0.020642, -0.017172, -0.054129, - -0.023947, -0.023383, -0.009830, -0.033091, -0.038903, -0.034006, - 2.000000, - 5.000000, 8.000000, 31.000000, - -0.023881, -0.025961, -0.016085, 0.002519, 0.002875, - 0.015524, 0.015195, 0.041155, 0.014466, -0.018378, - 0.002600, -0.020263, -0.007371, -0.011121, 0.024607, - -0.038269, -0.034545, -0.016056, -0.037035, 0.026626, - 0.015168, 0.022611, 0.003963, 0.027021, -0.006293, - 0.018793, 0.037255, -0.032588, 0.030653, -0.009351, - -0.009369, -0.016373, -0.026431, 0.030607, 0.023931, - -0.034287, 0.005759, -0.011178, -0.028852, -0.032704, - -0.049949, -0.046060, -0.050270, -0.031320, -0.008712, - 0.009246, -0.000610, -0.017364, 0.000636, -0.013102, - -0.011762, -0.024670, 0.005053, -0.002943, -0.027749, - 0.013194, 0.005866, -0.029562, 0.002844, 0.020366, - -0.002292, -0.020919, 0.018443, 0.020225, -0.048654, - 0.029229, 0.010745, 0.008019, 0.022995, -0.064247, - 0.024120, -0.046261, 0.004676, -0.010136, -0.037722, - -0.044361, 0.008900, 0.009107, -0.017279, -0.016118, - 0.017328, -0.003035, -0.044544, -0.057942, 0.020498, - 0.015473, 0.004866, -0.032876, -0.002717, -0.010467, - -0.014977, 0.012142, 0.023255, 0.012157, -0.022883, - 0.008335, 0.004445, 0.010890, 0.012698, 0.014643, - 0.023277, 0.008910, 0.014481, -0.040318, 0.020869, - 0.022242, 0.037748, 0.049446, 0.022385, 0.019759, - 0.053362, -0.000071, 0.009598, 0.018935, 0.032680, - -0.017829, 0.005274, 0.009873, 0.008174, 0.015407, - 0.018976, 0.040158, 0.028137, -0.024769, -0.010446, - -0.009321, 0.006491, -0.007564, 0.010089, 0.002611, - 0.033307, 0.006600, 0.000981, -0.020792, -0.043535, - 0.040042, 0.047468, 0.001502, 0.001901, -0.029270, - -0.012734, -0.014537, 0.013098, 0.052677, 0.016883, - -0.024375, 0.020558, -0.020641, 0.020166, 0.025277, - -0.041841, 0.016773, -0.011097, -0.025661, -0.002579, - 0.016984, -0.003951, 0.013407, 0.000553, 0.015755, - 0.013052, 0.032268, 0.001020, -0.022183, -0.001775, - 0.046064, 0.057633, -0.036273, 0.021392, -0.014841, - 0.013238, 0.010726, -0.040599, 0.005503, -0.022920, - -0.006856, 0.018504, 0.023139, 0.029012, -0.033354, - 0.056472, 0.008683, 0.028761, 0.021728, 0.004579, - -0.029364, -0.036749, 0.007219, 0.033030, 0.004004, - -0.022732, 0.024218, -0.005076, -0.020038, 0.010956, - 0.024865, 0.018618, -0.011487, -0.008006, 0.039102, - 0.024865, 0.018618, -0.011487, -0.008006, 0.039102, - -0.022732, 0.024218, -0.005076, -0.020038, 0.010956, - -0.029364, -0.036749, 0.007219, 0.033030, 0.004004, - 0.056472, 0.008683, 0.028761, 0.021728, 0.004579, - -0.006856, 0.018504, 0.023139, 0.029012, -0.033354, - 0.013238, 0.010726, -0.040599, 0.005503, -0.022920, - 0.046064, 0.057633, -0.036273, 0.021392, -0.014841, - 0.013052, 0.032268, 0.001020, -0.022183, -0.001775, - 0.016984, -0.003951, 0.013407, 0.000553, 0.015755, - -0.041841, 0.016773, -0.011097, -0.025661, -0.002579, - -0.024375, 0.020558, -0.020641, 0.020166, 0.025277, - -0.012734, -0.014537, 0.013098, 0.052677, 0.016883, - 0.040042, 0.047468, 0.001502, 0.001901, -0.029270, - 0.033307, 0.006600, 0.000981, -0.020792, -0.043535, - -0.009321, 0.006491, -0.007564, 0.010089, 0.002611, - 0.018976, 0.040158, 0.028137, -0.024769, -0.010446, - -0.017829, 0.005274, 0.009873, 0.008174, 0.015407, - 0.053362, -0.000071, 0.009598, 0.018935, 0.032680, - 0.022242, 0.037748, 0.049446, 0.022385, 0.019759, - 0.023277, 0.008910, 0.014481, -0.040318, 0.020869, - 0.008335, 0.004445, 0.010890, 0.012698, 0.014643, - -0.014977, 0.012142, 0.023255, 0.012157, -0.022883, - 0.015473, 0.004866, -0.032876, -0.002717, -0.010467, - 0.017328, -0.003035, -0.044544, -0.057942, 0.020498, - -0.044361, 0.008900, 0.009107, -0.017279, -0.016118, - 0.024120, -0.046261, 0.004676, -0.010136, -0.037722, - 0.029229, 0.010745, 0.008019, 0.022995, -0.064247, - -0.002292, -0.020919, 0.018443, 0.020225, -0.048654, - 0.013194, 0.005866, -0.029562, 0.002844, 0.020366, - -0.011762, -0.024670, 0.005053, -0.002943, -0.027749, - 0.009246, -0.000610, -0.017364, 0.000636, -0.013102, - -0.049949, -0.046060, -0.050270, -0.031320, -0.008712, - -0.034287, 0.005759, -0.011178, -0.028852, -0.032704, - -0.009369, -0.016373, -0.026431, 0.030607, 0.023931, - 0.018793, 0.037255, -0.032588, 0.030653, -0.009351, - 0.015168, 0.022611, 0.003963, 0.027021, -0.006293, - -0.038269, -0.034545, -0.016056, -0.037035, 0.026626, - 0.002600, -0.020263, -0.007371, -0.011121, 0.024607, - 0.015524, 0.015195, 0.041155, 0.014466, -0.018378, - -0.023881, -0.025961, -0.016085, 0.002519, 0.002875, - -0.033051, -0.011388, 0.001369, 0.004940, -0.011361, - -0.051972, -0.011891, 0.017125, 0.018837, 0.017944, - 0.002701, 0.012972, -0.008766, -0.001475, 0.018325, - -0.021534, 0.019131, -0.028363, -0.024874, -0.020324, - -0.027703, 0.009867, -0.022624, -0.027760, -0.028261, - 0.049538, 0.021646, -0.053261, -0.005324, -0.037437, - -0.032524, 0.030662, -0.010025, -0.035416, 0.024784, - -0.014036, 0.029433, 0.004521, 0.004555, 0.016158, - -0.039984, -0.031449, 0.035291, 0.057998, 0.007116, - -0.025035, -0.004194, 0.025334, 0.036313, 0.004419, - 0.016164, -0.023500, -0.053415, 0.006647, -0.028451, - -0.021501, -0.030092, -0.021744, -0.012407, -0.001125, - -0.030747, 0.020507, 0.010884, -0.044273, -0.016653, - 0.031025, 0.054962, -0.031325, -0.004482, -0.021204, - -0.023046, 0.000499, -0.019233, -0.013555, 0.048162, - 0.009558, -0.018011, -0.000268, -0.001155, 0.028687, - 0.014411, 0.009411, 0.030952, 0.039746, 0.020421, - 0.021760, 0.006950, 0.044536, 0.027433, 0.001321, - 0.056212, 0.033101, -0.032901, 0.039754, 0.003280, - -0.042054, 0.031725, -0.006520, 0.065960, -0.007671, - -0.000580, 0.043651, 0.064830, -0.003521, 0.000534, - -0.003280, 0.022030, 0.019882, -0.040564, 0.034328, - 0.003527, -0.015480, 0.027057, -0.006747, 0.014880, - -0.030563, -0.017677, 0.021342, -0.027424, 0.004677, - 0.018827, 0.021139, 0.030797, 0.011327, -0.015693, - -0.022562, 0.064580, 0.035354, 0.005436, -0.006215, - -0.020564, 0.036343, -0.022768, 0.002749, 0.009367, - -0.026935, 0.030335, 0.014219, 0.016778, 0.023476, - -0.028098, 0.020342, 0.049417, 0.003980, 0.003962, - -0.057404, -0.032523, -0.007595, -0.024520, 0.031693, - -0.050798, 0.021266, -0.035682, -0.032466, -0.011092, - 0.001143, 0.009638, -0.026090, -0.050751, 0.000675, - 0.001143, 0.009638, -0.026090, -0.050751, 0.000675, - -0.050798, 0.021266, -0.035682, -0.032466, -0.011092, - -0.057404, -0.032523, -0.007595, -0.024520, 0.031693, - -0.028098, 0.020342, 0.049417, 0.003980, 0.003962, - -0.026935, 0.030335, 0.014219, 0.016778, 0.023476, - -0.020564, 0.036343, -0.022768, 0.002749, 0.009367, - -0.022562, 0.064580, 0.035354, 0.005436, -0.006215, - 0.018827, 0.021139, 0.030797, 0.011327, -0.015693, - -0.030563, -0.017677, 0.021342, -0.027424, 0.004677, - 0.003527, -0.015480, 0.027057, -0.006747, 0.014880, - -0.003280, 0.022030, 0.019882, -0.040564, 0.034328, - -0.000580, 0.043651, 0.064830, -0.003521, 0.000534, - -0.042054, 0.031725, -0.006520, 0.065960, -0.007671, - 0.056212, 0.033101, -0.032901, 0.039754, 0.003280, - 0.021760, 0.006950, 0.044536, 0.027433, 0.001321, - 0.014411, 0.009411, 0.030952, 0.039746, 0.020421, - 0.009558, -0.018011, -0.000268, -0.001155, 0.028687, - -0.023046, 0.000499, -0.019233, -0.013555, 0.048162, - 0.031025, 0.054962, -0.031325, -0.004482, -0.021204, - -0.030747, 0.020507, 0.010884, -0.044273, -0.016653, - -0.021501, -0.030092, -0.021744, -0.012407, -0.001125, - 0.016164, -0.023500, -0.053415, 0.006647, -0.028451, - -0.025035, -0.004194, 0.025334, 0.036313, 0.004419, - -0.039984, -0.031449, 0.035291, 0.057998, 0.007116, - -0.014036, 0.029433, 0.004521, 0.004555, 0.016158, - -0.032524, 0.030662, -0.010025, -0.035416, 0.024784, - 0.049538, 0.021646, -0.053261, -0.005324, -0.037437, - -0.027703, 0.009867, -0.022624, -0.027760, -0.028261, - -0.021534, 0.019131, -0.028363, -0.024874, -0.020324, - 0.002701, 0.012972, -0.008766, -0.001475, 0.018325, - -0.051972, -0.011891, 0.017125, 0.018837, 0.017944, - -0.033051, -0.011388, 0.001369, 0.004940, -0.011361, - -0.021936, 0.005342, 0.010831, 0.006619, -0.017683, - 0.013186, -0.014929, -0.002308, 0.004053, -0.022676, - 0.029551, 0.011274, -0.015487, -0.001585, -0.041300, - -0.024702, -0.010491, -0.026663, -0.002467, -0.004365, - -0.024702, -0.010491, -0.026663, -0.002467, -0.004365, - 0.029551, 0.011274, -0.015487, -0.001585, -0.041300, - 0.013186, -0.014929, -0.002308, 0.004053, -0.022676, - -0.021936, 0.005342, 0.010831, 0.006619, -0.017683, - -0.020197, -0.014281, -0.008216, -0.001363, 0.022427, - -0.003503, 0.006206, -0.014128, -0.013760, -0.032265, - 0.000926, -0.011799, -0.008301, -0.021749, -0.052422, - -0.010005, -0.034603, -0.050361, -0.005057, -0.020688, - -0.011552, -0.028694, 0.031968, 0.023167, -0.037296, - 0.010486, 0.036698, -0.017024, -0.007807, -0.046967, - -0.010655, -0.009219, 0.012626, -0.019753, -0.018158, - -0.047156, 0.025321, 0.024272, -0.000999, 0.016812, - -0.017115, -0.011509, 0.034201, 0.012054, 0.023989, - 0.004763, -0.009106, 0.026241, -0.015840, -0.047706, - 0.020088, -0.002397, -0.020228, -0.024726, -0.058616, - -0.018765, -0.011123, -0.010169, 0.035512, 0.010438, - -0.040980, -0.009369, 0.028558, -0.043072, -0.034618, - 0.008994, 0.020182, 0.064923, 0.018270, -0.034891, - 0.012920, -0.008785, 0.001218, 0.010042, 0.028065, - 0.014125, -0.020115, 0.051346, 0.030030, -0.002570, - 0.015512, 0.007343, 0.007055, -0.017555, 0.007410, - -0.031703, -0.002448, 0.025458, 0.007401, 0.003219, - 0.018996, -0.001759, -0.009606, -0.009051, -0.011723, - -0.027328, 0.022679, -0.024686, 0.045427, -0.018759, - -0.056274, -0.005806, -0.009033, 0.011724, 0.008476, - -0.033651, 0.002450, 0.003563, -0.028496, 0.014609, - -0.032638, 0.012868, 0.016561, -0.031165, 0.007025, - -0.002390, -0.007010, 0.034271, -0.040462, 0.023088, - -0.007464, -0.002016, 0.007910, 0.006710, -0.033325, - -0.035499, 0.045063, 0.022952, 0.019610, -0.047399, - 0.005540, 0.005648, -0.039670, -0.017167, -0.021625, - -0.038612, -0.017867, 0.010468, -0.014198, -0.029169, - 0.017791, 0.000754, -0.001090, -0.018137, -0.009948, - -0.076262, 0.000096, -0.025819, -0.020393, 0.010121, - -0.050143, 0.008274, -0.028026, -0.035805, -0.035237, - 0.020445, 0.009985, -0.007280, -0.031890, -0.021853, - 0.020445, 0.009985, -0.007280, -0.031890, -0.021853, - -0.050143, 0.008274, -0.028026, -0.035805, -0.035237, - -0.076262, 0.000096, -0.025819, -0.020393, 0.010121, - 0.017791, 0.000754, -0.001090, -0.018137, -0.009948, - -0.038612, -0.017867, 0.010468, -0.014198, -0.029169, - 0.005540, 0.005648, -0.039670, -0.017167, -0.021625, - -0.035499, 0.045063, 0.022952, 0.019610, -0.047399, - -0.007464, -0.002016, 0.007910, 0.006710, -0.033325, - -0.002390, -0.007010, 0.034271, -0.040462, 0.023088, - -0.032638, 0.012868, 0.016561, -0.031165, 0.007025, - -0.033651, 0.002450, 0.003563, -0.028496, 0.014609, - -0.056274, -0.005806, -0.009033, 0.011724, 0.008476, - -0.027328, 0.022679, -0.024686, 0.045427, -0.018759, - 0.018996, -0.001759, -0.009606, -0.009051, -0.011723, - -0.031703, -0.002448, 0.025458, 0.007401, 0.003219, - 0.015512, 0.007343, 0.007055, -0.017555, 0.007410, - 0.014125, -0.020115, 0.051346, 0.030030, -0.002570, - 0.012920, -0.008785, 0.001218, 0.010042, 0.028065, - 0.008994, 0.020182, 0.064923, 0.018270, -0.034891, - -0.040980, -0.009369, 0.028558, -0.043072, -0.034618, - -0.018765, -0.011123, -0.010169, 0.035512, 0.010438, - 0.020088, -0.002397, -0.020228, -0.024726, -0.058616, - 0.004763, -0.009106, 0.026241, -0.015840, -0.047706, - -0.017115, -0.011509, 0.034201, 0.012054, 0.023989, - -0.047156, 0.025321, 0.024272, -0.000999, 0.016812, - -0.010655, -0.009219, 0.012626, -0.019753, -0.018158, - 0.010486, 0.036698, -0.017024, -0.007807, -0.046967, - -0.011552, -0.028694, 0.031968, 0.023167, -0.037296, - -0.010005, -0.034603, -0.050361, -0.005057, -0.020688, - 0.000926, -0.011799, -0.008301, -0.021749, -0.052422, - -0.003503, 0.006206, -0.014128, -0.013760, -0.032265, - -0.020197, -0.014281, -0.008216, -0.001363, 0.022427, - -0.007543, 0.026764, 0.022912, -0.025365, 0.007829, - -0.019694, 0.041436, 0.016541, 0.022769, -0.004208, - 0.018285, 0.008463, -0.051848, 0.031539, -0.019474, - 0.006206, 0.007294, 0.005832, 0.009484, -0.014247, - -0.050095, -0.001765, 0.035803, 0.050427, -0.011708, - -0.001971, 0.052423, 0.007726, 0.016917, -0.026010, - -0.020478, 0.034199, 0.013248, -0.031358, -0.011761, - -0.035318, 0.017099, 0.034775, -0.022791, -0.025607, - -0.003592, -0.008791, -0.004391, -0.008643, 0.027678, - 0.011327, 0.013308, 0.006583, 0.023909, 0.039757, - 0.030216, 0.024854, -0.040115, -0.028523, -0.006375, - 0.012416, 0.065794, 0.012210, -0.020440, -0.020862, - -0.016993, 0.019163, 0.006851, -0.009002, 0.018690, - 0.006891, -0.001301, -0.008806, 0.020049, 0.001356, - -0.018354, -0.016228, -0.034858, 0.002314, 0.007933, - -0.025576, -0.024200, -0.041089, -0.009135, 0.025250, - -0.035318, 0.017099, 0.034775, -0.022791, -0.025607, - -0.020478, 0.034199, 0.013248, -0.031358, -0.011761, - -0.001971, 0.052423, 0.007726, 0.016917, -0.026010, - -0.050095, -0.001765, 0.035803, 0.050427, -0.011708, - 0.006206, 0.007294, 0.005832, 0.009484, -0.014247, - 0.018285, 0.008463, -0.051848, 0.031539, -0.019474, - -0.019694, 0.041436, 0.016541, 0.022769, -0.004208, - -0.007543, 0.026764, 0.022912, -0.025365, 0.007829, - -0.025576, -0.024200, -0.041089, -0.009135, 0.025250, - -0.018354, -0.016228, -0.034858, 0.002314, 0.007933, - 0.006891, -0.001301, -0.008806, 0.020049, 0.001356, - -0.016993, 0.019163, 0.006851, -0.009002, 0.018690, - 0.012416, 0.065794, 0.012210, -0.020440, -0.020862, - 0.030216, 0.024854, -0.040115, -0.028523, -0.006375, - 0.011327, 0.013308, 0.006583, 0.023909, 0.039757, - -0.003592, -0.008791, -0.004391, -0.008643, 0.027678, - 0.000000, - 8.000000, 5.000000, 31.000000, - 0.022887, 0.056724, -0.000702, 0.022863, 0.053520, 0.072183, 0.022290, 0.005229, - 0.040167, 0.059008, 0.024929, 0.021105, -0.043107, -0.028788, 0.018564, -0.018111, - -0.021379, 0.027230, -0.015728, -0.037763, -0.001206, -0.027379, 0.009973, 0.038223, - -0.003445, 0.026841, -0.027398, -0.014284, -0.007368, -0.051858, -0.028280, 0.032946, - 0.048245, 0.019105, -0.006557, 0.008802, -0.015039, -0.037493, -0.002958, -0.005178, - -0.009041, 0.003526, -0.053238, -0.065874, 0.025895, 0.030425, 0.010324, 0.012503, - 0.023142, -0.007530, -0.008784, -0.018869, -0.023360, -0.041719, 0.029619, -0.015242, - 0.016987, -0.039373, -0.040454, -0.020339, -0.021966, -0.011918, -0.039189, -0.025038, - 0.000461, -0.056763, -0.038205, -0.026354, -0.019836, -0.006812, -0.002383, 0.005570, - 0.010386, 0.033274, 0.001373, 0.004893, -0.039785, 0.000525, 0.038941, 0.042735, - -0.027038, -0.026298, -0.022356, -0.012709, -0.004319, -0.013780, -0.030794, -0.017456, - -0.007364, -0.012957, -0.001309, 0.076955, 0.012220, 0.009517, 0.079565, 0.012248, - 0.048055, 0.031741, -0.014826, 0.058232, -0.015786, 0.030496, 0.022379, -0.081614, - 0.041169, -0.021015, -0.027685, -0.012383, -0.015871, -0.018460, 0.023982, -0.010902, - 0.038028, -0.038393, 0.016496, -0.022600, -0.002472, 0.008046, 0.025385, -0.010149, - -0.031165, -0.007812, -0.014553, -0.009645, -0.005535, 0.054686, 0.016289, -0.062422, - -0.027590, -0.008245, -0.014707, -0.010927, -0.033036, 0.028156, 0.035228, -0.019348, - -0.011412, -0.029939, 0.021498, 0.027910, -0.019078, 0.024269, -0.054514, 0.033241, - 0.032497, 0.002971, -0.003615, -0.009400, -0.021315, 0.014233, 0.016055, 0.021873, - 0.032871, -0.049404, -0.020953, 0.002104, 0.002491, -0.009485, -0.012530, -0.002238, - 0.022659, -0.015555, 0.030342, 0.046080, 0.018834, 0.034462, 0.010342, -0.004826, - 0.000153, 0.016447, 0.029365, -0.025935, 0.002813, 0.007626, -0.019985, 0.012518, - 0.009742, 0.029602, 0.021918, -0.023055, 0.048176, 0.013008, -0.035577, -0.008189, - -0.061579, 0.008055, 0.027092, -0.021110, 0.023286, 0.023398, 0.010402, -0.010639, - 0.008321, -0.061976, -0.007441, -0.002559, 0.036592, -0.045740, -0.064089, 0.013283, - 0.020154, 0.059441, 0.017961, -0.017119, 0.006805, -0.051747, 0.045698, -0.003164, - 0.010758, 0.063877, 0.053704, -0.025424, 0.016472, -0.045267, -0.001827, 0.019653, - 0.012806, 0.022907, 0.044233, -0.023612, -0.040727, -0.029642, 0.023392, 0.029432, - -0.026475, 0.001624, -0.018389, -0.032695, -0.003396, -0.020810, 0.014084, -0.003991, - 0.009139, 0.026217, -0.011675, -0.050890, -0.043001, 0.000663, 0.012765, 0.023600, - 0.011571, -0.011669, -0.005867, 0.019499, 0.011645, -0.013925, 0.006023, -0.057261, - -0.019032, -0.021849, 0.011449, 0.006722, -0.006882, -0.033538, -0.018829, 0.034018, - 0.013553, 0.012649, 0.012462, 0.021217, -0.005756, -0.035761, 0.017153, -0.007327, - -0.010933, -0.002843, -0.006318, -0.014423, -0.014901, 0.014145, 0.025907, 0.013068, - 0.003707, 0.034230, -0.011328, 0.033776, -0.043760, -0.009225, 0.029074, -0.011143, - -0.027927, -0.038110, -0.008558, 0.007416, -0.031753, 0.000222, -0.040530, -0.022088, - 0.025532, 0.028600, 0.003892, -0.009040, 0.007695, 0.006575, 0.015432, -0.016912, - -0.021405, 0.001612, 0.022025, 0.011906, 0.015854, 0.012004, 0.040879, 0.005756, - 0.033053, -0.023091, 0.001880, 0.063212, 0.028497, -0.002234, -0.020518, -0.003302, - 0.016004, 0.007333, 0.018708, 0.001380, 0.005912, -0.008736, -0.004154, 0.023287, - -0.012845, -0.017489, -0.000869, -0.000811, -0.005591, -0.024294, 0.014892, -0.017577, - 0.043215, -0.012677, 0.005608, -0.003495, 0.046338, 0.036744, -0.002679, 0.055908, - 0.007413, -0.047828, 0.003064, 0.022995, 0.023642, -0.003316, -0.017299, -0.030075, - 0.034387, 0.028106, 0.005801, 0.024551, 0.021852, -0.012704, -0.038819, 0.002407, - -0.013436, 0.002610, -0.006362, 0.005035, -0.003358, -0.007126, -0.025813, -0.014392, - 0.005406, 0.021139, 0.012704, -0.015038, 0.029762, 0.047204, 0.042191, 0.056422, - 0.001789, -0.008239, 0.026372, -0.013797, 0.003339, 0.029653, 0.002900, -0.032622, - -0.006127, -0.014794, -0.025321, -0.016259, -0.061573, 0.018514, 0.046379, -0.040289, - 0.001531, -0.004357, -0.036382, -0.020129, -0.011642, 0.006204, -0.009577, -0.049322, - 0.031383, 0.017313, 0.042873, -0.051132, -0.023373, 0.003749, -0.023687, -0.017449, - -0.049227, -0.010315, 0.038017, 0.003829, -0.020485, 0.008247, 0.006205, -0.005725, - -0.025172, 0.021343, -0.017085, -0.024599, 0.003239, 0.000952, -0.019548, -0.018309, - -0.042695, -0.017599, -0.025922, 0.004232, -0.011635, -0.018028, 0.004966, -0.051137, - -0.021257, -0.022593, 0.003263, 0.045806, 0.008347, -0.006508, 0.007900, -0.012836, - -0.003323, -0.027208, 0.019852, -0.015024, -0.057231, -0.038650, -0.035792, -0.057008, - -0.018522, -0.052593, -0.046539, 0.006641, -0.002763, 0.012591, -0.020287, -0.040198, - -0.044909, -0.004123, -0.007577, -0.045177, 0.029253, -0.004262, -0.021820, -0.001536, - -0.057294, 0.017297, -0.001943, -0.025488, 0.003809, -0.032496, 0.010213, 0.040211, - -0.034366, 0.024833, -0.024737, 0.018911, 0.006657, 0.003939, -0.041861, 0.003772, - -0.056116, -0.019186, 0.013215, -0.001725, -0.034396, -0.085786, -0.057076, -0.021760, - 0.013325, 0.029406, -0.038159, -0.016350, -0.056157, -0.027320, 0.033407, -0.061915, - -0.037750, 0.012845, -0.033434, 0.011402, 0.049346, 0.015225, -0.006489, -0.003506, - -0.045100, 0.006654, -0.014039, 0.036018, 0.014971, 0.029998, 0.031627, 0.003826, - 0.023098, -0.003290, -0.011557, 0.012370, 0.010736, 0.024772, -0.013798, -0.000572, - -0.012680, 0.015828, -0.010064, -0.018518, -0.023548, -0.019529, 0.053987, 0.033032, - 0.034623, 0.010375, 0.028654, 0.011832, -0.039285, 0.020609, 0.041331, 0.019405, - 0.035288, -0.015662, -0.023326, 0.000700, 0.033275, 0.007255, -0.016558, 0.044915, - -0.018000, -0.015321, 0.004044, 0.031068, 0.016467, 0.010887, -0.023030, -0.033097, - 0.014815, -0.018633, -0.016288, -0.012663, -0.005998, 0.004769, -0.030652, 0.000851, - 0.028468, -0.000220, -0.004193, -0.003445, -0.016045, 0.012671, 0.070789, -0.009969, - 0.052015, 0.022869, 0.040227, 0.029902, 0.020552, 0.049500, 0.025615, 0.041367, - 0.034880, -0.033333, 0.012003, 0.046551, -0.013186, 0.001548, 0.040315, 0.008344, - 0.005113, -0.021268, 0.003530, 0.037651, 0.039806, 0.013328, -0.005104, -0.039401, - 0.004533, -0.030365, 0.005539, -0.038143, -0.027120, -0.020620, 0.005451, -0.017145, - 0.020959, -0.013870, 0.017257, 0.025297, 0.028248, -0.012484, 0.024545, 0.004876, - 0.035842, 0.038132, 0.011246, 0.004324, 0.000583, -0.034723, -0.007670, 0.003935, - 0.035006, 0.038203, -0.016207, 0.033939, 0.005888, 0.022949, 0.028238, -0.020094, - 0.024487, 0.000067, -0.018222, 0.016394, -0.002650, 0.003719, -0.016407, -0.020799, - 0.010269, 0.003315, 0.031450, 0.036676, 0.005546, 0.006715, 0.013051, 0.005650, - -0.030897, 0.009579, 0.003036, 0.042495, 0.017748, 0.041216, 0.015006, 0.016631, - 0.003033, 0.013406, -0.006731, -0.022843, -0.000466, -0.016223, -0.042759, -0.008389, - -0.007705, -0.019363, -0.015179, -0.017529, 0.049011, 0.012967, 0.029781, -0.004910, - -0.004307, -0.023530, -0.013212, -0.049753, -0.005769, -0.007137, -0.039489, 0.019491, - 0.004149, -0.009637, -0.007452, 0.005909, -0.020620, -0.014185, -0.001739, 0.022654, - -0.055169, 0.024814, -0.000816, -0.041222, -0.030086, 0.005109, 0.025678, -0.015112, - -0.005150, -0.008449, -0.024668, -0.024936, 0.013955, -0.028004, 0.004242, -0.010275, - 0.006377, -0.015597, -0.016745, -0.006490, -0.017308, -0.024456, 0.048708, -0.002316, - 0.021414, 0.013804, 0.000221, -0.043668, -0.019998, -0.020281, 0.028248, 0.036828, - -0.027216, 0.007839, 0.043347, 0.014635, 0.062616, -0.028053, -0.034202, 0.020567, - 0.016631, 0.057386, 0.023740, -0.013403, 0.014428, 0.001836, -0.006669, 0.003730, - -0.001299, 0.003312, -0.017563, -0.000967, 0.031887, 0.007014, -0.001224, 0.000759, - 0.013961, 0.005987, 0.044525, 0.035718, 0.016137, 0.009231, 0.040465, 0.025759, - -0.015050, 0.015191, -0.015552, 0.027060, -0.001640, 0.035013, 0.045763, -0.006889, - 0.020803, -0.001180, -0.023424, 0.034733, 0.053866, -0.025464, -0.006746, 0.012014, - 0.056619, 0.039458, 0.013739, -0.025243, -0.045167, -0.024794, -0.001734, -0.020957, - -0.054540, 0.001595, 0.009346, -0.037227, 0.017819, 0.009852, 0.001002, 0.002328, - 0.017452, 0.032695, 0.010839, 0.023578, 0.035910, -0.016657, 0.055684, -0.007119, - -0.006259, -0.021603, -0.029518, -0.002680, -0.003285, 0.027453, 0.002178, -0.020382, - -0.002960, -0.017340, -0.016838, 0.046073, 0.017217, -0.000418, 0.005160, -0.010036, - 0.011024, 0.028413, -0.008518, -0.011281, -0.084453, -0.056053, 0.002971, -0.027038, - -0.028973, -0.086358, -0.046563, 0.013867, -0.007661, -0.034250, -0.045022, -0.030953, - -0.040620, -0.013646, 0.023129, 0.123788, 0.042910, 0.003621, 0.028863, 0.022601, - 0.010401, 0.042795, 0.042202, 0.050109, 0.020472, 0.020666, 0.036416, -0.026853, - -0.019638, -0.025944, 0.009061, 0.033364, -0.033603, -0.022525, -0.013329, 0.028016, - 0.005787, 0.019135, 0.016931, -0.016754, -0.028616, -0.039824, -0.038887, -0.018582, - -0.019414, 0.010611, -0.012690, -0.008562, -0.042688, 0.000321, 0.004736, -0.077901, - -0.019049, 0.003839, -0.015436, 0.051136, -0.004173, 0.009944, 0.018870, -0.022611, - -0.046969, -0.002199, 0.035712, 0.064126, -0.010815, 0.037003, -0.040448, -0.008995, - 0.041862, 0.048502, -0.011397, 0.011295, -0.008180, -0.009749, -0.008394, 0.014029, - 0.029198, 0.024275, -0.010067, 0.007797, 0.004541, -0.039684, 0.017931, 0.030236, - 0.040281, 0.048193, 0.060658, 0.039180, -0.009282, 0.006943, -0.000403, 0.017836, - 0.013312, 0.008188, 0.009195, -0.018794, -0.036787, 0.003538, -0.019216, 0.019707, - 0.010754, 0.011581, -0.000767, 0.011251, -0.044140, 0.005673, -0.052475, -0.049906, - -0.019964, -0.011748, 0.044465, 0.000814, -0.025106, -0.034134, -0.030595, -0.009367, - 0.054407, -0.031557, -0.023473, -0.010086, -0.013839, -0.042259, 0.011756, -0.003174, - 0.037603, 0.029407, 0.044815, 0.036289, -0.006324, 0.013516, 0.015073, -0.007735, - 0.038786, 0.020070, 0.023551, 0.009673, -0.031807, -0.039389, 0.011358, 0.005516, - -0.000287, -0.037053, 0.020601, -0.002744, -0.010932, 0.015829, -0.018076, -0.005560, - 0.008331, -0.012407, -0.001741, -0.075376, -0.035279, -0.033195, -0.006482, -0.015769, - 0.053321, 0.002207, -0.007473, -0.050860, -0.045562, -0.042989, 0.065565, -0.024057, - 0.019466, 0.030314, 0.000161, -0.011624, -0.003333, -0.012472, 0.000990, -0.039586, - -0.006657, 0.013016, 0.037187, -0.001993, -0.001901, 0.004316, 0.006882, -0.007126, - 0.018106, 0.014879, 0.002829, 0.006455, -0.013388, 0.016067, 0.015512, -0.033896, - 0.029754, 0.024563, 0.008785, 0.011723, -0.015988, 0.020471, 0.023423, 0.002534, - -0.022803, 0.055425, 0.013592, 0.036643, -0.012066, 0.006155, 0.046637, -0.011961, - 0.010253, -0.003426, -0.021714, -0.040039, -0.004392, -0.016979, -0.051311, -0.025769, - 0.031524, -0.020621, -0.007995, -0.045324, 0.026465, 0.011442, 0.052096, 0.032526, - -0.021965, 0.009173, 0.004996, -0.018889, -0.016406, 0.025130, 0.000898, 0.039740, - 0.036886, 0.022633, -0.026843, 0.028852, -0.014531, 0.008158, 0.008796, 0.037186, - -0.003542, 0.036837, -0.014037, -0.026694, -0.006700, -0.019657, -0.013002, 0.044073, - -0.003487, 0.004637, -0.006447, -0.017698, 0.014962, -0.035703, -0.001943, -0.050077, - 0.035078, -0.028333, -0.012750, -0.007591, 0.024320, -0.022683, 0.047137, 0.075649, - 0.016248, -0.005024, 0.014759, -0.013704, -0.020288, 0.004120, -0.002183, -0.004941, - 0.010669, 0.012762, 0.029306, 0.000175, 0.039344, -0.040833, -0.049802, 0.019116, - 0.016815, 0.055765, 0.039207, -0.005277, 0.018002, -0.038537, -0.020886, -0.000613, - 0.035395, 0.006386, -0.018021, -0.012289, -0.022202, -0.007952, 0.001500, -0.038212, - 0.020305, -0.040284, -0.009184, -0.038105, -0.008333, -0.005413, 0.036044, 0.016110, - -0.012156, -0.035379, -0.018535, 0.009536, 0.061355, 0.036485, 0.038581, 0.025651, - -0.002473, -0.020964, 0.001235, 0.041716, 0.075311, 0.038155, 0.026727, -0.007938, - 0.019499, -0.003529, 0.002604, -0.009582, -0.007884, -0.034920, -0.034749, -0.044092, - 0.006907, 0.042389, 0.014024, 0.016496, 0.020165, 0.007562, -0.007489, -0.052993, - 0.015402, 0.041987, -0.004910, 0.003245, -0.002914, 0.004206, 0.003457, -0.004062, - -0.016019, -0.005140, -0.001924, 0.000768, -0.012613, 0.047163, 0.035761, 0.026428, - -0.041461, -0.032990, -0.028484, 0.005225, 0.002954, 0.031360, 0.037795, 0.059971, - -0.018719, -0.030195, -0.012336, -0.026181, -0.057853, -0.047671, 0.007279, 0.004027, - -0.000020, -0.005769, -0.016163, -0.022771, -0.024217, 0.036693, 0.040318, 0.003984, - 0.021915, -0.003337, -0.004606, -0.008113, 0.003681, -0.005639, 0.044284, 0.005096, - 0.011267, -0.027027, -0.011590, -0.024730, -0.039623, -0.055412, -0.023161, -0.051253, - 0.027539, -0.026953, -0.025399, -0.027337, -0.005816, -0.051678, -0.043778, -0.011829, - 0.036241, 0.019548, 0.030082, 0.015736, 0.006458, 0.010838, 0.031588, -0.004601, - -0.023143, -0.011549, -0.000151, 0.003037, 0.033417, 0.020320, 0.030163, 0.005935, - -0.016712, 0.039699, 0.024814, 0.041131, 0.065082, 0.007382, 0.020212, -0.000788, - -0.015217, 0.045819, 0.014761, 0.027477, -0.029587, -0.042253, -0.049013, -0.062088, - 0.023321, 0.038951, 0.005673, -0.009946, -0.063271, -0.057465, -0.070240, -0.030470, - 0.006594, 0.031821, 0.016023, -0.025574, -0.047576, -0.022733, 0.025769, 0.043148, - 6.000000, - 8.000000, 5.000000, 31.000000, - 0.031383, 0.017313, 0.042873, -0.051132, -0.023373, 0.003749, -0.023687, -0.017449, - 0.001531, -0.004357, -0.036382, -0.020129, -0.011642, 0.006204, -0.009577, -0.049322, - -0.006127, -0.014794, -0.025321, -0.016259, -0.061573, 0.018514, 0.046379, -0.040289, - 0.001789, -0.008239, 0.026372, -0.013797, 0.003339, 0.029653, 0.002900, -0.032622, - 0.005406, 0.021139, 0.012704, -0.015038, 0.029762, 0.047204, 0.042191, 0.056422, - -0.013436, 0.002610, -0.006362, 0.005035, -0.003358, -0.007126, -0.025813, -0.014392, - 0.034387, 0.028106, 0.005801, 0.024551, 0.021852, -0.012704, -0.038819, 0.002407, - 0.007413, -0.047828, 0.003064, 0.022995, 0.023642, -0.003316, -0.017299, -0.030075, - 0.043215, -0.012677, 0.005608, -0.003495, 0.046338, 0.036744, -0.002679, 0.055908, - -0.012845, -0.017489, -0.000869, -0.000811, -0.005591, -0.024294, 0.014892, -0.017577, - 0.016004, 0.007333, 0.018708, 0.001380, 0.005912, -0.008736, -0.004154, 0.023287, - 0.033053, -0.023091, 0.001880, 0.063212, 0.028497, -0.002234, -0.020518, -0.003302, - -0.021405, 0.001612, 0.022025, 0.011906, 0.015854, 0.012004, 0.040879, 0.005756, - 0.025532, 0.028600, 0.003892, -0.009040, 0.007695, 0.006575, 0.015432, -0.016912, - -0.027927, -0.038110, -0.008558, 0.007416, -0.031753, 0.000222, -0.040530, -0.022088, - 0.003707, 0.034230, -0.011328, 0.033776, -0.043760, -0.009225, 0.029074, -0.011143, - -0.010933, -0.002843, -0.006318, -0.014423, -0.014901, 0.014145, 0.025907, 0.013068, - 0.013553, 0.012649, 0.012462, 0.021217, -0.005756, -0.035761, 0.017153, -0.007327, - -0.019032, -0.021849, 0.011449, 0.006722, -0.006882, -0.033538, -0.018829, 0.034018, - 0.011571, -0.011669, -0.005867, 0.019499, 0.011645, -0.013925, 0.006023, -0.057261, - 0.009139, 0.026217, -0.011675, -0.050890, -0.043001, 0.000663, 0.012765, 0.023600, - -0.026475, 0.001624, -0.018389, -0.032695, -0.003396, -0.020810, 0.014084, -0.003991, - 0.012806, 0.022907, 0.044233, -0.023612, -0.040727, -0.029642, 0.023392, 0.029432, - 0.010758, 0.063877, 0.053704, -0.025424, 0.016472, -0.045267, -0.001827, 0.019653, - 0.020154, 0.059441, 0.017961, -0.017119, 0.006805, -0.051747, 0.045698, -0.003164, - 0.008321, -0.061976, -0.007441, -0.002559, 0.036592, -0.045740, -0.064089, 0.013283, - -0.061579, 0.008055, 0.027092, -0.021110, 0.023286, 0.023398, 0.010402, -0.010639, - 0.009742, 0.029602, 0.021918, -0.023055, 0.048176, 0.013008, -0.035577, -0.008189, - 0.000153, 0.016447, 0.029365, -0.025935, 0.002813, 0.007626, -0.019985, 0.012518, - 0.022659, -0.015555, 0.030342, 0.046080, 0.018834, 0.034462, 0.010342, -0.004826, - 0.032871, -0.049404, -0.020953, 0.002104, 0.002491, -0.009485, -0.012530, -0.002238, - 0.032497, 0.002971, -0.003615, -0.009400, -0.021315, 0.014233, 0.016055, 0.021873, - -0.011412, -0.029939, 0.021498, 0.027910, -0.019078, 0.024269, -0.054514, 0.033241, - -0.027590, -0.008245, -0.014707, -0.010927, -0.033036, 0.028156, 0.035228, -0.019348, - -0.031165, -0.007812, -0.014553, -0.009645, -0.005535, 0.054686, 0.016289, -0.062422, - 0.038028, -0.038393, 0.016496, -0.022600, -0.002472, 0.008046, 0.025385, -0.010149, - 0.041169, -0.021015, -0.027685, -0.012383, -0.015871, -0.018460, 0.023982, -0.010902, - 0.048055, 0.031741, -0.014826, 0.058232, -0.015786, 0.030496, 0.022379, -0.081614, - -0.007364, -0.012957, -0.001309, 0.076955, 0.012220, 0.009517, 0.079565, 0.012248, - -0.027038, -0.026298, -0.022356, -0.012709, -0.004319, -0.013780, -0.030794, -0.017456, - 0.010386, 0.033274, 0.001373, 0.004893, -0.039785, 0.000525, 0.038941, 0.042735, - 0.000461, -0.056763, -0.038205, -0.026354, -0.019836, -0.006812, -0.002383, 0.005570, - 0.016987, -0.039373, -0.040454, -0.020339, -0.021966, -0.011918, -0.039189, -0.025038, - 0.023142, -0.007530, -0.008784, -0.018869, -0.023360, -0.041719, 0.029619, -0.015242, - -0.009041, 0.003526, -0.053238, -0.065874, 0.025895, 0.030425, 0.010324, 0.012503, - 0.048245, 0.019105, -0.006557, 0.008802, -0.015039, -0.037493, -0.002958, -0.005178, - -0.003445, 0.026841, -0.027398, -0.014284, -0.007368, -0.051858, -0.028280, 0.032946, - -0.021379, 0.027230, -0.015728, -0.037763, -0.001206, -0.027379, 0.009973, 0.038223, - 0.040167, 0.059008, 0.024929, 0.021105, -0.043107, -0.028788, 0.018564, -0.018111, - 0.022887, 0.056724, -0.000702, 0.022863, 0.053520, 0.072183, 0.022290, 0.005229, - 0.016631, 0.057386, 0.023740, -0.013403, 0.014428, 0.001836, -0.006669, 0.003730, - -0.027216, 0.007839, 0.043347, 0.014635, 0.062616, -0.028053, -0.034202, 0.020567, - 0.021414, 0.013804, 0.000221, -0.043668, -0.019998, -0.020281, 0.028248, 0.036828, - 0.006377, -0.015597, -0.016745, -0.006490, -0.017308, -0.024456, 0.048708, -0.002316, - -0.005150, -0.008449, -0.024668, -0.024936, 0.013955, -0.028004, 0.004242, -0.010275, - -0.055169, 0.024814, -0.000816, -0.041222, -0.030086, 0.005109, 0.025678, -0.015112, - 0.004149, -0.009637, -0.007452, 0.005909, -0.020620, -0.014185, -0.001739, 0.022654, - -0.004307, -0.023530, -0.013212, -0.049753, -0.005769, -0.007137, -0.039489, 0.019491, - -0.007705, -0.019363, -0.015179, -0.017529, 0.049011, 0.012967, 0.029781, -0.004910, - 0.003033, 0.013406, -0.006731, -0.022843, -0.000466, -0.016223, -0.042759, -0.008389, - -0.030897, 0.009579, 0.003036, 0.042495, 0.017748, 0.041216, 0.015006, 0.016631, - 0.010269, 0.003315, 0.031450, 0.036676, 0.005546, 0.006715, 0.013051, 0.005650, - 0.024487, 0.000067, -0.018222, 0.016394, -0.002650, 0.003719, -0.016407, -0.020799, - 0.035006, 0.038203, -0.016207, 0.033939, 0.005888, 0.022949, 0.028238, -0.020094, - 0.035842, 0.038132, 0.011246, 0.004324, 0.000583, -0.034723, -0.007670, 0.003935, - 0.020959, -0.013870, 0.017257, 0.025297, 0.028248, -0.012484, 0.024545, 0.004876, - 0.004533, -0.030365, 0.005539, -0.038143, -0.027120, -0.020620, 0.005451, -0.017145, - 0.005113, -0.021268, 0.003530, 0.037651, 0.039806, 0.013328, -0.005104, -0.039401, - 0.034880, -0.033333, 0.012003, 0.046551, -0.013186, 0.001548, 0.040315, 0.008344, - 0.052015, 0.022869, 0.040227, 0.029902, 0.020552, 0.049500, 0.025615, 0.041367, - 0.028468, -0.000220, -0.004193, -0.003445, -0.016045, 0.012671, 0.070789, -0.009969, - 0.014815, -0.018633, -0.016288, -0.012663, -0.005998, 0.004769, -0.030652, 0.000851, - -0.018000, -0.015321, 0.004044, 0.031068, 0.016467, 0.010887, -0.023030, -0.033097, - 0.035288, -0.015662, -0.023326, 0.000700, 0.033275, 0.007255, -0.016558, 0.044915, - 0.034623, 0.010375, 0.028654, 0.011832, -0.039285, 0.020609, 0.041331, 0.019405, - -0.012680, 0.015828, -0.010064, -0.018518, -0.023548, -0.019529, 0.053987, 0.033032, - 0.023098, -0.003290, -0.011557, 0.012370, 0.010736, 0.024772, -0.013798, -0.000572, - -0.045100, 0.006654, -0.014039, 0.036018, 0.014971, 0.029998, 0.031627, 0.003826, - -0.037750, 0.012845, -0.033434, 0.011402, 0.049346, 0.015225, -0.006489, -0.003506, - 0.013325, 0.029406, -0.038159, -0.016350, -0.056157, -0.027320, 0.033407, -0.061915, - -0.056116, -0.019186, 0.013215, -0.001725, -0.034396, -0.085786, -0.057076, -0.021760, - -0.034366, 0.024833, -0.024737, 0.018911, 0.006657, 0.003939, -0.041861, 0.003772, - -0.057294, 0.017297, -0.001943, -0.025488, 0.003809, -0.032496, 0.010213, 0.040211, - -0.044909, -0.004123, -0.007577, -0.045177, 0.029253, -0.004262, -0.021820, -0.001536, - -0.018522, -0.052593, -0.046539, 0.006641, -0.002763, 0.012591, -0.020287, -0.040198, - -0.003323, -0.027208, 0.019852, -0.015024, -0.057231, -0.038650, -0.035792, -0.057008, - -0.021257, -0.022593, 0.003263, 0.045806, 0.008347, -0.006508, 0.007900, -0.012836, - -0.042695, -0.017599, -0.025922, 0.004232, -0.011635, -0.018028, 0.004966, -0.051137, - -0.025172, 0.021343, -0.017085, -0.024599, 0.003239, 0.000952, -0.019548, -0.018309, - -0.049227, -0.010315, 0.038017, 0.003829, -0.020485, 0.008247, 0.006205, -0.005725, - 0.056619, 0.039458, 0.013739, -0.025243, -0.045167, -0.024794, -0.001734, -0.020957, - 0.020803, -0.001180, -0.023424, 0.034733, 0.053866, -0.025464, -0.006746, 0.012014, - -0.015050, 0.015191, -0.015552, 0.027060, -0.001640, 0.035013, 0.045763, -0.006889, - 0.013961, 0.005987, 0.044525, 0.035718, 0.016137, 0.009231, 0.040465, 0.025759, - -0.001299, 0.003312, -0.017563, -0.000967, 0.031887, 0.007014, -0.001224, 0.000759, - 0.016815, 0.055765, 0.039207, -0.005277, 0.018002, -0.038537, -0.020886, -0.000613, - 0.010669, 0.012762, 0.029306, 0.000175, 0.039344, -0.040833, -0.049802, 0.019116, - 0.016248, -0.005024, 0.014759, -0.013704, -0.020288, 0.004120, -0.002183, -0.004941, - 0.035078, -0.028333, -0.012750, -0.007591, 0.024320, -0.022683, 0.047137, 0.075649, - -0.003487, 0.004637, -0.006447, -0.017698, 0.014962, -0.035703, -0.001943, -0.050077, - -0.003542, 0.036837, -0.014037, -0.026694, -0.006700, -0.019657, -0.013002, 0.044073, - 0.036886, 0.022633, -0.026843, 0.028852, -0.014531, 0.008158, 0.008796, 0.037186, - -0.021965, 0.009173, 0.004996, -0.018889, -0.016406, 0.025130, 0.000898, 0.039740, - 0.031524, -0.020621, -0.007995, -0.045324, 0.026465, 0.011442, 0.052096, 0.032526, - 0.010253, -0.003426, -0.021714, -0.040039, -0.004392, -0.016979, -0.051311, -0.025769, - -0.022803, 0.055425, 0.013592, 0.036643, -0.012066, 0.006155, 0.046637, -0.011961, - 0.029754, 0.024563, 0.008785, 0.011723, -0.015988, 0.020471, 0.023423, 0.002534, - 0.018106, 0.014879, 0.002829, 0.006455, -0.013388, 0.016067, 0.015512, -0.033896, - -0.006657, 0.013016, 0.037187, -0.001993, -0.001901, 0.004316, 0.006882, -0.007126, - 0.019466, 0.030314, 0.000161, -0.011624, -0.003333, -0.012472, 0.000990, -0.039586, - 0.053321, 0.002207, -0.007473, -0.050860, -0.045562, -0.042989, 0.065565, -0.024057, - 0.008331, -0.012407, -0.001741, -0.075376, -0.035279, -0.033195, -0.006482, -0.015769, - -0.000287, -0.037053, 0.020601, -0.002744, -0.010932, 0.015829, -0.018076, -0.005560, - 0.038786, 0.020070, 0.023551, 0.009673, -0.031807, -0.039389, 0.011358, 0.005516, - 0.037603, 0.029407, 0.044815, 0.036289, -0.006324, 0.013516, 0.015073, -0.007735, - 0.054407, -0.031557, -0.023473, -0.010086, -0.013839, -0.042259, 0.011756, -0.003174, - -0.019964, -0.011748, 0.044465, 0.000814, -0.025106, -0.034134, -0.030595, -0.009367, - 0.010754, 0.011581, -0.000767, 0.011251, -0.044140, 0.005673, -0.052475, -0.049906, - 0.013312, 0.008188, 0.009195, -0.018794, -0.036787, 0.003538, -0.019216, 0.019707, - 0.040281, 0.048193, 0.060658, 0.039180, -0.009282, 0.006943, -0.000403, 0.017836, - 0.029198, 0.024275, -0.010067, 0.007797, 0.004541, -0.039684, 0.017931, 0.030236, - 0.041862, 0.048502, -0.011397, 0.011295, -0.008180, -0.009749, -0.008394, 0.014029, - -0.046969, -0.002199, 0.035712, 0.064126, -0.010815, 0.037003, -0.040448, -0.008995, - -0.019049, 0.003839, -0.015436, 0.051136, -0.004173, 0.009944, 0.018870, -0.022611, - -0.019414, 0.010611, -0.012690, -0.008562, -0.042688, 0.000321, 0.004736, -0.077901, - 0.005787, 0.019135, 0.016931, -0.016754, -0.028616, -0.039824, -0.038887, -0.018582, - -0.019638, -0.025944, 0.009061, 0.033364, -0.033603, -0.022525, -0.013329, 0.028016, - 0.010401, 0.042795, 0.042202, 0.050109, 0.020472, 0.020666, 0.036416, -0.026853, - -0.040620, -0.013646, 0.023129, 0.123788, 0.042910, 0.003621, 0.028863, 0.022601, - -0.028973, -0.086358, -0.046563, 0.013867, -0.007661, -0.034250, -0.045022, -0.030953, - 0.011024, 0.028413, -0.008518, -0.011281, -0.084453, -0.056053, 0.002971, -0.027038, - -0.002960, -0.017340, -0.016838, 0.046073, 0.017217, -0.000418, 0.005160, -0.010036, - -0.006259, -0.021603, -0.029518, -0.002680, -0.003285, 0.027453, 0.002178, -0.020382, - 0.017452, 0.032695, 0.010839, 0.023578, 0.035910, -0.016657, 0.055684, -0.007119, - -0.054540, 0.001595, 0.009346, -0.037227, 0.017819, 0.009852, 0.001002, 0.002328, - 0.036241, 0.019548, 0.030082, 0.015736, 0.006458, 0.010838, 0.031588, -0.004601, - 0.027539, -0.026953, -0.025399, -0.027337, -0.005816, -0.051678, -0.043778, -0.011829, - 0.011267, -0.027027, -0.011590, -0.024730, -0.039623, -0.055412, -0.023161, -0.051253, - 0.021915, -0.003337, -0.004606, -0.008113, 0.003681, -0.005639, 0.044284, 0.005096, - -0.000020, -0.005769, -0.016163, -0.022771, -0.024217, 0.036693, 0.040318, 0.003984, - 0.006594, 0.031821, 0.016023, -0.025574, -0.047576, -0.022733, 0.025769, 0.043148, - 0.023321, 0.038951, 0.005673, -0.009946, -0.063271, -0.057465, -0.070240, -0.030470, - -0.015217, 0.045819, 0.014761, 0.027477, -0.029587, -0.042253, -0.049013, -0.062088, - -0.016712, 0.039699, 0.024814, 0.041131, 0.065082, 0.007382, 0.020212, -0.000788, - -0.023143, -0.011549, -0.000151, 0.003037, 0.033417, 0.020320, 0.030163, 0.005935, - 0.019499, -0.003529, 0.002604, -0.009582, -0.007884, -0.034920, -0.034749, -0.044092, - -0.002473, -0.020964, 0.001235, 0.041716, 0.075311, 0.038155, 0.026727, -0.007938, - -0.012156, -0.035379, -0.018535, 0.009536, 0.061355, 0.036485, 0.038581, 0.025651, - 0.020305, -0.040284, -0.009184, -0.038105, -0.008333, -0.005413, 0.036044, 0.016110, - 0.035395, 0.006386, -0.018021, -0.012289, -0.022202, -0.007952, 0.001500, -0.038212, - -0.018719, -0.030195, -0.012336, -0.026181, -0.057853, -0.047671, 0.007279, 0.004027, - -0.041461, -0.032990, -0.028484, 0.005225, 0.002954, 0.031360, 0.037795, 0.059971, - -0.016019, -0.005140, -0.001924, 0.000768, -0.012613, 0.047163, 0.035761, 0.026428, - 0.015402, 0.041987, -0.004910, 0.003245, -0.002914, 0.004206, 0.003457, -0.004062, - 0.006907, 0.042389, 0.014024, 0.016496, 0.020165, 0.007562, -0.007489, -0.052993, - 5.000000, - 5.000000, 6.000000, 31.000000, - 0.080884, 0.037878, 0.033322, 0.012892, -0.017077, - 0.040204, 0.012276, 0.086089, 0.045258, -0.017224, - 0.019019, -0.033890, -0.003277, -0.010281, -0.065845, - 0.015896, -0.059444, -0.012959, 0.004842, 0.013298, - -0.004725, 0.102136, 0.091167, 0.029007, -0.077806, - 0.099592, 0.076154, 0.030933, 0.016490, 0.002916, - -0.014919, 0.002415, -0.009389, -0.064857, -0.052966, - -0.023936, 0.058525, 0.036616, -0.047694, -0.028541, - 0.000735, 0.026124, -0.011413, -0.019476, -0.031614, - -0.027337, -0.038352, 0.024975, 0.033125, -0.028453, - -0.065731, -0.044205, 0.053681, 0.008100, -0.027216, - -0.015338, 0.018038, -0.039117, -0.078005, -0.002798, - -0.034908, 0.026391, -0.043534, -0.026727, 0.015053, - -0.003470, 0.036020, -0.048085, 0.011942, -0.061184, - -0.057367, 0.053232, 0.073864, -0.013133, -0.055980, - -0.045637, -0.044424, 0.068229, 0.023310, 0.111071, - -0.017116, -0.038404, 0.057005, 0.051472, 0.034941, - -0.004217, -0.015044, -0.028838, 0.038268, -0.054926, - -0.030486, -0.013325, -0.076063, 0.021825, 0.049655, - -0.007294, 0.027748, -0.038918, 0.050608, -0.032955, - 0.047003, 0.036431, 0.092570, 0.025417, 0.039391, - -0.038705, -0.056840, 0.062170, -0.027693, 0.063781, - -0.006714, -0.050675, 0.011168, 0.009382, -0.040681, - 0.013085, 0.014806, -0.061915, -0.001633, -0.026769, - 0.035459, 0.015213, -0.006203, -0.014431, 0.023448, - 0.009293, -0.008589, 0.005098, -0.011381, -0.041281, - 0.095717, 0.011042, 0.046234, -0.020820, -0.019476, - -0.018103, -0.004995, 0.078060, 0.002514, -0.020604, - 0.018003, -0.006499, 0.006473, 0.027971, -0.009798, - 0.041682, 0.040123, -0.030098, 0.041116, -0.013895, - 0.041682, 0.040123, -0.030098, 0.041116, -0.013895, - 0.018003, -0.006499, 0.006473, 0.027971, -0.009798, - -0.018103, -0.004995, 0.078060, 0.002514, -0.020604, - 0.095717, 0.011042, 0.046234, -0.020820, -0.019476, - 0.009293, -0.008589, 0.005098, -0.011381, -0.041281, - 0.035459, 0.015213, -0.006203, -0.014431, 0.023448, - 0.013085, 0.014806, -0.061915, -0.001633, -0.026769, - -0.006714, -0.050675, 0.011168, 0.009382, -0.040681, - -0.038705, -0.056840, 0.062170, -0.027693, 0.063781, - 0.047003, 0.036431, 0.092570, 0.025417, 0.039391, - -0.007294, 0.027748, -0.038918, 0.050608, -0.032955, - -0.030486, -0.013325, -0.076063, 0.021825, 0.049655, - -0.004217, -0.015044, -0.028838, 0.038268, -0.054926, - -0.017116, -0.038404, 0.057005, 0.051472, 0.034941, - -0.045637, -0.044424, 0.068229, 0.023310, 0.111071, - -0.057367, 0.053232, 0.073864, -0.013133, -0.055980, - -0.003470, 0.036020, -0.048085, 0.011942, -0.061184, - -0.034908, 0.026391, -0.043534, -0.026727, 0.015053, - -0.015338, 0.018038, -0.039117, -0.078005, -0.002798, - -0.065731, -0.044205, 0.053681, 0.008100, -0.027216, - -0.027337, -0.038352, 0.024975, 0.033125, -0.028453, - 0.000735, 0.026124, -0.011413, -0.019476, -0.031614, - -0.023936, 0.058525, 0.036616, -0.047694, -0.028541, - -0.014919, 0.002415, -0.009389, -0.064857, -0.052966, - 0.099592, 0.076154, 0.030933, 0.016490, 0.002916, - -0.004725, 0.102136, 0.091167, 0.029007, -0.077806, - 0.015896, -0.059444, -0.012959, 0.004842, 0.013298, - 0.019019, -0.033890, -0.003277, -0.010281, -0.065845, - 0.040204, 0.012276, 0.086089, 0.045258, -0.017224, - 0.080884, 0.037878, 0.033322, 0.012892, -0.017077, - -0.028129, -0.044169, -0.053681, -0.080068, -0.000011, - -0.043310, 0.048749, -0.002105, 0.036481, 0.011063, - -0.081217, 0.041239, -0.041250, -0.013109, 0.009451, - -0.020025, -0.031678, 0.040063, 0.052351, -0.019331, - -0.024867, -0.043890, 0.052679, 0.044214, -0.044812, - 0.005892, -0.030736, -0.003230, -0.026167, -0.058686, - -0.008188, -0.032209, -0.063041, -0.041608, 0.074195, - 0.042592, 0.067528, 0.004764, 0.041991, 0.019115, - 0.027419, 0.001071, -0.025373, 0.043167, 0.027185, - -0.097465, -0.038482, -0.071506, 0.036628, 0.117993, - -0.023853, -0.018283, 0.016976, 0.024559, 0.021962, - -0.009949, -0.053475, 0.027617, -0.003803, -0.002549, - -0.047182, -0.030231, -0.024953, 0.024118, 0.071663, - -0.019111, -0.049782, -0.011395, 0.027214, 0.048259, - 0.140306, 0.070906, -0.050526, 0.013215, -0.010279, - -0.022243, -0.032798, -0.043872, 0.018602, 0.017537, - -0.034752, -0.015272, -0.021885, -0.016261, -0.016077, - -0.052604, 0.024562, 0.011688, -0.020700, 0.022588, - -0.026172, 0.018538, 0.038378, -0.015753, -0.001130, - -0.046231, -0.037858, -0.005501, 0.029271, 0.015631, - 0.104464, 0.024119, -0.028040, -0.052956, -0.015750, - 0.017862, 0.055269, 0.013654, -0.048636, -0.019805, - -0.018154, -0.011478, -0.027047, -0.043059, -0.003785, - 0.047084, 0.066795, 0.021454, -0.036487, 0.018210, - 0.047084, 0.066795, 0.021454, -0.036487, 0.018210, - -0.018154, -0.011478, -0.027047, -0.043059, -0.003785, - 0.017862, 0.055269, 0.013654, -0.048636, -0.019805, - 0.104464, 0.024119, -0.028040, -0.052956, -0.015750, - -0.046231, -0.037858, -0.005501, 0.029271, 0.015631, - -0.026172, 0.018538, 0.038378, -0.015753, -0.001130, - -0.052604, 0.024562, 0.011688, -0.020700, 0.022588, - -0.034752, -0.015272, -0.021885, -0.016261, -0.016077, - -0.022243, -0.032798, -0.043872, 0.018602, 0.017537, - 0.140306, 0.070906, -0.050526, 0.013215, -0.010279, - -0.019111, -0.049782, -0.011395, 0.027214, 0.048259, - -0.047182, -0.030231, -0.024953, 0.024118, 0.071663, - -0.009949, -0.053475, 0.027617, -0.003803, -0.002549, - -0.023853, -0.018283, 0.016976, 0.024559, 0.021962, - -0.097465, -0.038482, -0.071506, 0.036628, 0.117993, - 0.027419, 0.001071, -0.025373, 0.043167, 0.027185, - 0.042592, 0.067528, 0.004764, 0.041991, 0.019115, - -0.008188, -0.032209, -0.063041, -0.041608, 0.074195, - 0.005892, -0.030736, -0.003230, -0.026167, -0.058686, - -0.024867, -0.043890, 0.052679, 0.044214, -0.044812, - -0.020025, -0.031678, 0.040063, 0.052351, -0.019331, - -0.081217, 0.041239, -0.041250, -0.013109, 0.009451, - -0.043310, 0.048749, -0.002105, 0.036481, 0.011063, - -0.028129, -0.044169, -0.053681, -0.080068, -0.000011, - 0.098624, -0.009360, -0.021967, -0.048468, 0.009535, - -0.007977, 0.141625, 0.149399, 0.053292, -0.059662, - -0.004383, -0.038744, 0.048962, -0.005189, -0.033578, - -0.004383, -0.038744, 0.048962, -0.005189, -0.033578, - -0.007977, 0.141625, 0.149399, 0.053292, -0.059662, - 0.098624, -0.009360, -0.021967, -0.048468, 0.009535, - -0.006730, -0.021987, -0.025472, -0.087024, 0.024070, - -0.010087, 0.118400, 0.095733, 0.028685, 0.014821, - -0.049468, 0.054109, -0.007012, -0.028281, -0.023773, - -0.031748, -0.076598, 0.036074, 0.094816, -0.012716, - -0.056508, -0.034942, 0.114309, 0.071747, -0.038850, - -0.005120, 0.010170, 0.014553, -0.080981, -0.054515, - -0.023920, -0.005394, -0.084130, -0.018750, 0.150703, - 0.090479, 0.132717, 0.002524, 0.095633, 0.035552, - 0.020428, 0.076955, 0.030958, 0.058034, -0.014190, - -0.131762, -0.087715, -0.009947, 0.078513, 0.106427, - -0.050733, -0.057075, 0.069031, 0.093027, 0.006860, - -0.022375, -0.047834, -0.010630, 0.013764, -0.080459, - -0.037673, -0.003612, -0.067757, 0.070503, 0.084114, - 0.019487, -0.019974, 0.007372, 0.132021, 0.055375, - 0.159777, 0.091247, 0.065575, 0.044793, 0.000185, - -0.043213, -0.056137, 0.036840, 0.011254, 0.024317, - -0.041733, -0.055192, 0.009598, 0.015053, -0.061090, - -0.003941, 0.041190, -0.036332, -0.025683, -0.016063, - 0.024024, 0.025225, 0.013948, 0.026512, 0.017011, - -0.031305, -0.025760, 0.042481, 0.062727, -0.019917, - 0.143409, -0.010770, 0.054589, -0.018871, -0.003741, - 0.022143, 0.006388, 0.092925, 0.012610, 0.023232, - -0.057580, -0.050213, 0.027932, 0.009355, -0.039829, - 0.049391, 0.057353, 0.063220, 0.033246, -0.020246, - 0.049391, 0.057353, 0.063220, 0.033246, -0.020246, - -0.057580, -0.050213, 0.027932, 0.009355, -0.039829, - 0.022143, 0.006388, 0.092925, 0.012610, 0.023232, - 0.143409, -0.010770, 0.054589, -0.018871, -0.003741, - -0.031305, -0.025760, 0.042481, 0.062727, -0.019917, - 0.024024, 0.025225, 0.013948, 0.026512, 0.017011, - -0.003941, 0.041190, -0.036332, -0.025683, -0.016063, - -0.041733, -0.055192, 0.009598, 0.015053, -0.061090, - -0.043213, -0.056137, 0.036840, 0.011254, 0.024317, - 0.159777, 0.091247, 0.065575, 0.044793, 0.000185, - 0.019487, -0.019974, 0.007372, 0.132021, 0.055375, - -0.037673, -0.003612, -0.067757, 0.070503, 0.084114, - -0.022375, -0.047834, -0.010630, 0.013764, -0.080459, - -0.050733, -0.057075, 0.069031, 0.093027, 0.006860, - -0.131762, -0.087715, -0.009947, 0.078513, 0.106427, - 0.020428, 0.076955, 0.030958, 0.058034, -0.014190, - 0.090479, 0.132717, 0.002524, 0.095633, 0.035552, - -0.023920, -0.005394, -0.084130, -0.018750, 0.150703, - -0.005120, 0.010170, 0.014553, -0.080981, -0.054515, - -0.056508, -0.034942, 0.114309, 0.071747, -0.038850, - -0.031748, -0.076598, 0.036074, 0.094816, -0.012716, - -0.049468, 0.054109, -0.007012, -0.028281, -0.023773, - -0.010087, 0.118400, 0.095733, 0.028685, 0.014821, - -0.006730, -0.021987, -0.025472, -0.087024, 0.024070, - -0.040949, -0.017663, -0.076979, -0.065986, 0.031372, - -0.073099, -0.002882, 0.028029, 0.043344, 0.039721, - -0.006916, 0.005708, 0.054644, 0.003362, 0.019681, - -0.021002, -0.006709, 0.009095, -0.019443, 0.036933, - -0.023240, 0.023269, 0.037106, 0.021985, -0.039069, - 0.044367, 0.058379, 0.012713, -0.045342, -0.009442, - -0.001984, -0.028287, -0.079441, -0.048652, -0.026717, - -0.028658, -0.028739, 0.013976, 0.048421, -0.054510, - 0.015733, 0.003676, 0.038316, 0.044971, 0.006355, - 0.040620, -0.012796, -0.002304, -0.006703, -0.009904, - 0.016964, 0.021573, 0.046649, 0.036662, -0.064175, - 0.022885, 0.044952, 0.013284, 0.039523, 0.026906, - 0.044367, 0.058379, 0.012713, -0.045342, -0.009442, - -0.023240, 0.023269, 0.037106, 0.021985, -0.039069, - -0.021002, -0.006709, 0.009095, -0.019443, 0.036933, - -0.006916, 0.005708, 0.054644, 0.003362, 0.019681, - -0.073099, -0.002882, 0.028029, 0.043344, 0.039721, - -0.040949, -0.017663, -0.076979, -0.065986, 0.031372, - 0.022885, 0.044952, 0.013284, 0.039523, 0.026906, - 0.016964, 0.021573, 0.046649, 0.036662, -0.064175, - 0.040620, -0.012796, -0.002304, -0.006703, -0.009904, - 0.015733, 0.003676, 0.038316, 0.044971, 0.006355, - -0.028658, -0.028739, 0.013976, 0.048421, -0.054510, - -0.001984, -0.028287, -0.079441, -0.048652, -0.026717, - 0.000000, - 5.000000, 6.000000, 31.000000, - -0.056995, -0.053734, -0.005650, 0.010924, -0.028735, - -0.020039, -0.010019, -0.037020, 0.011462, -0.031259, - -0.009524, 0.004141, -0.026814, 0.059949, 0.015360, - -0.029441, 0.066522, 0.059977, 0.039246, -0.023590, - -0.042448, 0.012256, 0.067164, 0.011034, -0.048775, - 0.018555, -0.028037, -0.040237, -0.019550, 0.016942, - -0.089189, -0.072370, -0.088681, -0.046311, -0.069614, - 0.057738, 0.017416, 0.041058, 0.021678, -0.040711, - -0.055065, 0.016373, -0.031754, -0.024092, -0.048660, - -0.035697, -0.019234, 0.035145, 0.052327, -0.026185, - 0.046951, 0.055031, 0.058642, 0.009896, 0.003397, - 0.006081, -0.009580, -0.045472, -0.001904, -0.061816, - -0.057369, -0.024286, 0.003357, -0.046316, -0.086517, - -0.046447, -0.002158, 0.031327, 0.047333, -0.042734, - 0.001057, 0.039482, 0.012893, 0.031180, -0.022322, - 0.006297, -0.053485, 0.000077, 0.042010, 0.012794, - 0.064063, 0.004710, 0.010524, -0.000563, 0.028567, - 0.041798, -0.024969, 0.009722, 0.003849, 0.001616, - 0.033999, 0.015412, -0.005743, -0.032341, -0.065754, - 0.010522, 0.043499, 0.013860, -0.028551, -0.031026, - -0.008637, -0.036344, -0.009193, 0.011340, -0.033058, - -0.059731, -0.043931, 0.039749, -0.009468, 0.001185, - 0.024237, 0.009207, -0.014400, 0.022585, 0.089861, - 0.001343, 0.000520, 0.020645, 0.023058, 0.038938, - 0.046945, -0.002291, 0.051688, 0.046372, -0.001774, - 0.028082, 0.004262, -0.009907, 0.039678, 0.082928, - -0.038869, -0.048832, -0.003269, 0.025120, 0.090437, - 0.016927, -0.039694, 0.055900, 0.044534, 0.138300, - 0.034194, 0.028615, 0.029665, 0.036190, 0.150991, - -0.003825, 0.010255, 0.043171, 0.014698, 0.077028, - -0.003825, 0.010255, 0.043171, 0.014698, 0.077028, - 0.034194, 0.028615, 0.029665, 0.036190, 0.150991, - 0.016927, -0.039694, 0.055900, 0.044534, 0.138300, - -0.038869, -0.048832, -0.003269, 0.025120, 0.090437, - 0.028082, 0.004262, -0.009907, 0.039678, 0.082928, - 0.046945, -0.002291, 0.051688, 0.046372, -0.001774, - 0.001343, 0.000520, 0.020645, 0.023058, 0.038938, - 0.024237, 0.009207, -0.014400, 0.022585, 0.089861, - -0.059731, -0.043931, 0.039749, -0.009468, 0.001185, - -0.008637, -0.036344, -0.009193, 0.011340, -0.033058, - 0.010522, 0.043499, 0.013860, -0.028551, -0.031026, - 0.033999, 0.015412, -0.005743, -0.032341, -0.065754, - 0.041798, -0.024969, 0.009722, 0.003849, 0.001616, - 0.064063, 0.004710, 0.010524, -0.000563, 0.028567, - 0.006297, -0.053485, 0.000077, 0.042010, 0.012794, - 0.001057, 0.039482, 0.012893, 0.031180, -0.022322, - -0.046447, -0.002158, 0.031327, 0.047333, -0.042734, - -0.057369, -0.024286, 0.003357, -0.046316, -0.086517, - 0.006081, -0.009580, -0.045472, -0.001904, -0.061816, - 0.046951, 0.055031, 0.058642, 0.009896, 0.003397, - -0.035697, -0.019234, 0.035145, 0.052327, -0.026185, - -0.055065, 0.016373, -0.031754, -0.024092, -0.048660, - 0.057738, 0.017416, 0.041058, 0.021678, -0.040711, - -0.089189, -0.072370, -0.088681, -0.046311, -0.069614, - 0.018555, -0.028037, -0.040237, -0.019550, 0.016942, - -0.042448, 0.012256, 0.067164, 0.011034, -0.048775, - -0.029441, 0.066522, 0.059977, 0.039246, -0.023590, - -0.009524, 0.004141, -0.026814, 0.059949, 0.015360, - -0.020039, -0.010019, -0.037020, 0.011462, -0.031259, - -0.056995, -0.053734, -0.005650, 0.010924, -0.028735, - -0.065309, -0.024762, -0.065084, -0.005815, -0.008833, - -0.030634, -0.046448, 0.011119, 0.066184, -0.006031, - 0.049781, 0.025659, 0.054137, 0.013020, -0.007842, - 0.056692, -0.005177, -0.010128, 0.036193, -0.039270, - -0.029393, -0.012491, -0.009518, 0.030652, -0.041787, - -0.029290, -0.031210, -0.002967, -0.037809, -0.019240, - 0.019728, -0.001514, 0.026728, 0.038303, -0.044830, - 0.000247, 0.058019, 0.085419, 0.079706, -0.032052, - 0.025704, -0.007184, -0.012050, 0.029579, -0.004820, - 0.007645, -0.005672, -0.066028, 0.016607, 0.013169, - -0.022319, -0.023180, -0.019621, 0.023092, -0.030731, - -0.038577, 0.000027, -0.024082, 0.007155, -0.075163, - -0.039218, 0.044860, 0.035410, 0.061526, 0.058571, - -0.039822, -0.017445, 0.027649, 0.078714, -0.000596, - -0.022815, -0.020924, -0.031299, 0.036525, 0.044262, - -0.006947, -0.009575, 0.043010, 0.060431, 0.037114, - -0.000916, -0.012839, -0.002925, 0.011087, -0.018391, - 0.004232, -0.023509, 0.017602, 0.005156, -0.008111, - 0.026106, 0.001610, 0.003772, 0.012904, 0.000509, - 0.020129, 0.011115, 0.008688, 0.041743, 0.009362, - -0.006748, -0.041507, -0.009612, 0.061076, 0.020972, - 0.004366, -0.072242, -0.005221, 0.002309, 0.019372, - -0.008098, -0.041328, -0.033077, 0.001388, -0.034341, - 0.037904, -0.012032, 0.007037, -0.025828, -0.055697, - 0.037904, -0.012032, 0.007037, -0.025828, -0.055697, - -0.008098, -0.041328, -0.033077, 0.001388, -0.034341, - 0.004366, -0.072242, -0.005221, 0.002309, 0.019372, - -0.006748, -0.041507, -0.009612, 0.061076, 0.020972, - 0.020129, 0.011115, 0.008688, 0.041743, 0.009362, - 0.026106, 0.001610, 0.003772, 0.012904, 0.000509, - 0.004232, -0.023509, 0.017602, 0.005156, -0.008111, - -0.000916, -0.012839, -0.002925, 0.011087, -0.018391, - -0.006947, -0.009575, 0.043010, 0.060431, 0.037114, - -0.022815, -0.020924, -0.031299, 0.036525, 0.044262, - -0.039822, -0.017445, 0.027649, 0.078714, -0.000596, - -0.039218, 0.044860, 0.035410, 0.061526, 0.058571, - -0.038577, 0.000027, -0.024082, 0.007155, -0.075163, - -0.022319, -0.023180, -0.019621, 0.023092, -0.030731, - 0.007645, -0.005672, -0.066028, 0.016607, 0.013169, - 0.025704, -0.007184, -0.012050, 0.029579, -0.004820, - 0.000247, 0.058019, 0.085419, 0.079706, -0.032052, - 0.019728, -0.001514, 0.026728, 0.038303, -0.044830, - -0.029290, -0.031210, -0.002967, -0.037809, -0.019240, - -0.029393, -0.012491, -0.009518, 0.030652, -0.041787, - 0.056692, -0.005177, -0.010128, 0.036193, -0.039270, - 0.049781, 0.025659, 0.054137, 0.013020, -0.007842, - -0.030634, -0.046448, 0.011119, 0.066184, -0.006031, - -0.065309, -0.024762, -0.065084, -0.005815, -0.008833, - 0.024901, -0.035845, -0.056965, -0.015028, -0.048689, - -0.016441, 0.061524, 0.069982, 0.029360, -0.094367, - 0.043900, 0.120650, 0.108189, 0.041318, -0.071054, - 0.043900, 0.120650, 0.108189, 0.041318, -0.071054, - -0.016441, 0.061524, 0.069982, 0.029360, -0.094367, - 0.024901, -0.035845, -0.056965, -0.015028, -0.048689, - -0.122462, -0.059568, -0.119365, -0.031776, -0.069565, - -0.003023, -0.031942, 0.053340, 0.094311, -0.054878, - 0.000885, 0.011193, 0.034844, -0.011867, -0.058327, - 0.014602, 0.001915, 0.002063, 0.056814, -0.040895, - -0.008163, 0.034622, 0.009701, 0.040990, 0.001593, - -0.032361, -0.010094, -0.048468, -0.042266, -0.059892, - -0.041576, -0.067725, -0.008655, 0.001215, -0.098394, - -0.067596, 0.004175, 0.099155, 0.062216, -0.059849, - -0.002943, 0.017295, 0.004592, 0.031337, -0.032669, - -0.003212, -0.064043, -0.046837, 0.004602, 0.017443, - -0.006375, -0.024586, -0.006296, 0.006706, -0.000163, - -0.038685, -0.025452, -0.032262, 0.000507, -0.048646, - -0.027787, 0.045274, -0.005781, 0.000057, -0.012352, - -0.034474, 0.007974, 0.042431, 0.023192, -0.022988, - -0.050335, -0.053746, -0.033595, 0.025694, -0.017176, - -0.070321, -0.065606, 0.046213, 0.005391, 0.005485, - 0.002912, -0.011315, -0.014178, -0.035966, 0.068350, - -0.044520, -0.041551, 0.019491, 0.006430, 0.010558, - 0.038383, 0.010514, 0.031121, 0.019148, -0.041675, - -0.001286, 0.010961, 0.044315, 0.007000, 0.003952, - -0.049700, -0.058965, 0.020070, 0.016952, 0.023003, - 0.029891, -0.095857, 0.077794, 0.012187, 0.081088, - 0.002960, -0.005716, -0.017828, 0.003755, 0.078959, - -0.007157, -0.016534, 0.006739, -0.010589, 0.024416, - -0.007157, -0.016534, 0.006739, -0.010589, 0.024416, - 0.002960, -0.005716, -0.017828, 0.003755, 0.078959, - 0.029891, -0.095857, 0.077794, 0.012187, 0.081088, - -0.049700, -0.058965, 0.020070, 0.016952, 0.023003, - -0.001286, 0.010961, 0.044315, 0.007000, 0.003952, - 0.038383, 0.010514, 0.031121, 0.019148, -0.041675, - -0.044520, -0.041551, 0.019491, 0.006430, 0.010558, - 0.002912, -0.011315, -0.014178, -0.035966, 0.068350, - -0.070321, -0.065606, 0.046213, 0.005391, 0.005485, - -0.050335, -0.053746, -0.033595, 0.025694, -0.017176, - -0.034474, 0.007974, 0.042431, 0.023192, -0.022988, - -0.027787, 0.045274, -0.005781, 0.000057, -0.012352, - -0.038685, -0.025452, -0.032262, 0.000507, -0.048646, - -0.006375, -0.024586, -0.006296, 0.006706, -0.000163, - -0.003212, -0.064043, -0.046837, 0.004602, 0.017443, - -0.002943, 0.017295, 0.004592, 0.031337, -0.032669, - -0.067596, 0.004175, 0.099155, 0.062216, -0.059849, - -0.041576, -0.067725, -0.008655, 0.001215, -0.098394, - -0.032361, -0.010094, -0.048468, -0.042266, -0.059892, - -0.008163, 0.034622, 0.009701, 0.040990, 0.001593, - 0.014602, 0.001915, 0.002063, 0.056814, -0.040895, - 0.000885, 0.011193, 0.034844, -0.011867, -0.058327, - -0.003023, -0.031942, 0.053340, 0.094311, -0.054878, - -0.122462, -0.059568, -0.119365, -0.031776, -0.069565, - -0.023419, -0.046908, -0.051266, -0.025207, -0.031254, - 0.058255, 0.041602, -0.001727, 0.012460, -0.005945, - 0.014914, -0.029640, -0.034171, 0.027939, 0.047721, - -0.031611, -0.034862, -0.054435, 0.050838, 0.069634, - -0.020598, -0.013856, 0.003934, 0.122266, 0.069489, - 0.051397, 0.016728, 0.036732, 0.100595, 0.022130, - -0.039480, -0.072541, -0.029791, -0.087338, -0.113157, - 0.040750, 0.052105, 0.093000, 0.035779, -0.067971, - 0.000024, -0.012047, 0.071351, 0.085947, -0.031048, - -0.032827, -0.042068, 0.062284, 0.084122, 0.001948, - -0.056700, -0.042978, 0.026718, 0.066754, 0.007572, - -0.055946, -0.008346, 0.016615, 0.015756, -0.034449, - 0.051397, 0.016728, 0.036732, 0.100595, 0.022130, - -0.020598, -0.013856, 0.003934, 0.122266, 0.069489, - -0.031611, -0.034862, -0.054435, 0.050838, 0.069634, - 0.014914, -0.029640, -0.034171, 0.027939, 0.047721, - 0.058255, 0.041602, -0.001727, 0.012460, -0.005945, - -0.023419, -0.046908, -0.051266, -0.025207, -0.031254, - -0.055946, -0.008346, 0.016615, 0.015756, -0.034449, - -0.056700, -0.042978, 0.026718, 0.066754, 0.007572, - -0.032827, -0.042068, 0.062284, 0.084122, 0.001948, - 0.000024, -0.012047, 0.071351, 0.085947, -0.031048, - 0.040750, 0.052105, 0.093000, 0.035779, -0.067971, - -0.039480, -0.072541, -0.029791, -0.087338, -0.113157, - 0.000000, - 8.000000, 4.000000, 31.000000, - 0.036554, 0.003777, 0.029225, 0.014653, -0.007961, 0.006549, 0.066627, -0.005774, - -0.000281, -0.027000, -0.014857, -0.027593, -0.001196, 0.011852, 0.027820, -0.018892, - -0.080537, -0.032436, 0.033387, -0.018797, -0.009110, -0.004047, -0.032062, -0.035725, - -0.040917, -0.031719, -0.023281, -0.039315, -0.020676, -0.040274, -0.022670, 0.007064, - 0.022625, 0.064583, 0.052829, 0.028693, -0.021323, -0.010077, -0.034641, -0.040991, - 0.004120, 0.070149, 0.003763, -0.013729, -0.019346, -0.014485, 0.037650, 0.035659, - -0.109869, -0.053789, -0.020580, 0.032229, -0.015063, -0.001319, -0.016979, -0.065840, - -0.023080, -0.049995, 0.029079, 0.007719, -0.017353, -0.061659, -0.024865, 0.050636, - 0.021009, -0.028223, -0.024013, -0.028860, 0.008151, 0.095266, 0.059017, 0.038552, - 0.095437, 0.019330, -0.025666, -0.005958, 0.046595, 0.025087, 0.003923, 0.002408, - 0.048759, -0.052548, 0.002040, 0.075153, 0.023785, 0.033977, -0.032295, -0.008205, - -0.036552, -0.031644, 0.034468, 0.097613, 0.000644, 0.006833, 0.024094, -0.031473, - -0.020493, -0.100214, -0.005994, -0.016823, 0.018060, 0.009466, 0.055723, 0.002230, - 0.008728, -0.093546, -0.057696, -0.009955, 0.049190, 0.008401, 0.038773, 0.031910, - 0.029266, -0.088868, -0.012989, 0.009352, 0.039247, -0.010879, 0.009273, 0.015362, - 0.013145, -0.098581, -0.021289, -0.035818, 0.059227, 0.066632, 0.014278, 0.000976, - 0.004396, 0.063601, 0.068744, 0.052836, 0.031237, -0.030265, 0.032440, 0.036073, - 0.021434, -0.012371, -0.046572, -0.052199, 0.043635, -0.033496, -0.015281, -0.020737, - 0.024166, -0.101275, -0.042214, -0.015772, -0.001126, -0.065703, -0.050145, -0.057756, - -0.014631, -0.081717, 0.023365, -0.078880, -0.037433, 0.004340, 0.025686, -0.043663, - 0.107834, 0.086092, 0.099453, 0.047555, 0.049324, 0.022699, -0.030282, 0.039579, - 0.013800, 0.025117, 0.012036, -0.035222, -0.029191, 0.063018, 0.011592, 0.029426, - -0.040088, -0.109946, -0.082067, -0.042024, -0.037944, 0.035785, 0.046817, -0.047793, - -0.040030, -0.079334, 0.056095, 0.004803, 0.015795, 0.022575, 0.046387, -0.066473, - -0.023528, -0.017530, -0.025355, -0.002221, -0.047500, 0.025397, -0.017366, 0.023639, - -0.016178, 0.014537, 0.020538, -0.014889, -0.014371, 0.018914, 0.035698, 0.074462, - -0.046391, -0.056056, -0.022316, 0.019811, -0.001237, 0.070276, 0.042058, 0.026878, - 0.041260, -0.027039, -0.050831, 0.041011, 0.040243, 0.028524, -0.030184, 0.010395, - -0.013561, -0.041815, 0.009552, 0.037153, 0.007481, 0.036189, 0.028625, 0.033634, - -0.026921, -0.029052, 0.002419, 0.041366, -0.007418, 0.089831, 0.042929, 0.048628, - -0.005188, -0.013454, -0.019008, 0.036447, 0.041809, 0.019439, 0.001342, 0.007794, - 0.052279, 0.030538, 0.007823, 0.051337, 0.036402, -0.013564, 0.017056, -0.024268, - -0.012937, -0.048885, -0.002427, 0.056783, -0.022967, 0.047752, -0.023847, -0.051180, - -0.043766, 0.023362, 0.014172, 0.029029, 0.015989, -0.032087, -0.014514, 0.002123, - 0.048053, 0.000462, -0.017763, -0.057549, -0.050864, -0.011916, -0.042450, -0.020171, - 0.003288, -0.026352, -0.014247, 0.006923, 0.018687, -0.002891, -0.032403, -0.023111, - 0.021049, -0.010170, 0.011367, 0.017202, 0.000886, 0.077433, 0.009003, -0.040177, - -0.028906, -0.026090, -0.068224, 0.017642, -0.035733, 0.019104, 0.041570, 0.069400, - 0.021704, 0.014455, 0.002292, -0.030540, -0.046054, -0.003200, -0.041835, -0.007277, - 0.029490, 0.020317, 0.036180, -0.012929, -0.059798, -0.032039, -0.025376, -0.010041, - -0.023307, -0.012761, -0.065358, -0.038631, -0.001946, -0.008232, -0.070097, -0.061869, - -0.004409, 0.058513, -0.015309, 0.047592, 0.051637, 0.010620, 0.066353, 0.052263, - 0.019097, 0.005044, 0.016260, 0.006171, 0.040149, -0.001911, -0.008767, -0.028808, - -0.028872, -0.022006, 0.036110, -0.027943, -0.042660, -0.042974, -0.061683, 0.011215, - -0.032984, -0.077166, -0.016428, -0.013850, 0.013722, 0.020432, -0.002864, -0.030276, - 0.080364, 0.000878, -0.043886, 0.063451, 0.037177, 0.054943, 0.083112, 0.070387, - 0.024813, -0.081043, -0.048140, 0.032556, 0.030770, -0.033379, -0.022762, -0.036499, - 0.023775, -0.005483, -0.017821, 0.001225, -0.000390, -0.047293, -0.041399, 0.034734, - -0.039038, -0.048436, -0.026761, -0.048363, -0.025118, 0.069535, 0.053703, -0.018099, - 0.053173, -0.056895, 0.028198, 0.014525, 0.011387, 0.029675, -0.009683, 0.022087, - 0.085567, 0.004030, -0.022693, -0.034049, 0.021955, 0.001784, -0.011416, 0.002571, - -0.001252, -0.008682, -0.022525, 0.034360, 0.017444, -0.005534, -0.013147, 0.052814, - 0.027922, 0.030485, 0.006814, 0.021547, -0.013108, -0.001922, 0.028493, -0.012675, - 0.013981, 0.007639, 0.005786, -0.032386, -0.006711, 0.014546, -0.063518, 0.014951, - 0.062343, 0.014629, 0.025329, 0.013083, 0.047492, 0.051388, -0.034813, -0.024415, - 0.003070, 0.031099, 0.037847, 0.057118, 0.001414, 0.003153, 0.012152, 0.011587, - 0.024812, 0.055345, 0.003374, 0.043941, -0.023583, 0.007614, 0.077141, 0.037474, - -0.053339, -0.015497, -0.027874, -0.001882, 0.011169, 0.000533, -0.049169, -0.029641, - -0.015377, 0.006546, -0.023563, -0.023981, -0.044666, 0.098085, -0.040962, -0.039744, - 0.029099, 0.015653, 0.021784, 0.004392, 0.008394, 0.076247, -0.028782, -0.028052, - -0.061900, -0.034729, 0.017740, 0.003882, -0.033385, -0.012586, 0.001621, 0.072994, - -0.036178, 0.001756, -0.001121, 0.003359, 0.044937, 0.060939, -0.021130, -0.027371, - 0.012853, -0.014144, -0.037971, -0.005492, -0.018774, 0.025140, -0.011241, -0.014723, - 0.003446, 0.035259, 0.022761, 0.000999, -0.018260, 0.039841, 0.041637, 0.005579, - -0.031579, -0.022090, 0.019095, -0.007635, -0.055028, -0.007820, -0.015825, -0.002595, - 0.040158, -0.000508, 0.019395, -0.027736, 0.049182, 0.037165, -0.008521, 0.045808, - -0.001409, 0.028911, 0.068132, 0.043134, 0.032879, -0.043523, 0.001766, 0.038010, - 0.094940, 0.026485, 0.026452, 0.019676, -0.007325, -0.031308, -0.026825, 0.012276, - -0.050254, -0.042090, -0.027000, -0.032491, -0.014061, 0.004080, 0.031436, -0.044791, - 0.016283, -0.004745, -0.055104, 0.029570, -0.006872, 0.021070, 0.032847, 0.018006, - -0.031659, 0.013099, 0.044081, 0.065342, -0.002704, -0.024705, -0.008149, 0.005983, - 0.001402, 0.056962, 0.044559, -0.018724, -0.050803, -0.037765, -0.023185, -0.023785, - 0.041798, 0.015536, 0.047680, 0.059137, 0.033242, 0.061415, 0.057907, -0.049782, - 0.056690, 0.098927, 0.035594, 0.090224, 0.114198, 0.079953, 0.098613, 0.113518, - -0.011335, 0.010137, 0.041884, -0.007248, -0.045202, -0.010389, -0.043769, -0.023755, - -0.006456, -0.010559, 0.006016, -0.072799, -0.090938, -0.095879, -0.032718, -0.014853, - 0.001738, 0.084818, 0.082948, 0.068886, 0.034950, 0.035929, -0.039835, -0.073616, - 0.083579, 0.240227, 0.095545, 0.072283, 0.086943, 0.047371, 0.072862, 0.049386, - -0.012229, -0.010027, -0.029424, -0.019863, -0.001099, -0.016727, -0.044370, -0.104987, - -0.021758, -0.088421, 0.017151, -0.049235, -0.050079, -0.088882, -0.082071, 0.021402, - -0.013855, -0.063725, -0.009892, -0.026696, -0.016112, 0.026860, 0.059251, -0.003481, - 0.180852, 0.065605, 0.006670, 0.055646, 0.073930, 0.033318, 0.067255, 0.041349, - 0.119678, -0.070648, -0.019398, 0.098929, 0.038699, -0.026321, -0.088710, -0.056537, - -0.003246, -0.043722, -0.043130, -0.002350, -0.045910, -0.054252, -0.013825, -0.002491, - -0.065919, -0.122879, -0.061393, -0.082483, -0.011993, 0.030089, 0.084220, -0.067146, - 0.045728, -0.121469, -0.031086, -0.013402, 0.037565, 0.010345, -0.002914, 0.002691, - 0.123781, -0.077964, -0.055074, -0.026699, 0.006711, -0.056555, -0.026694, 0.009020, - 0.018387, -0.078788, -0.039627, -0.025771, 0.032645, 0.047040, 0.006255, 0.013222, - 0.035022, 0.079090, 0.079650, 0.049394, -0.009882, 0.010384, 0.079796, 0.022378, - 0.031910, -0.019669, -0.037005, -0.062709, 0.028931, 0.010582, -0.063760, -0.008988, - 0.078487, -0.082596, -0.019059, -0.002288, 0.009339, 0.009448, -0.063724, -0.045102, - -0.027270, -0.070592, 0.022568, -0.004412, -0.052484, -0.013738, 0.102283, -0.016865, - 0.103960, 0.094563, 0.046861, 0.050814, 0.021576, 0.050363, 0.051483, 0.020626, - -0.013473, -0.010938, -0.033305, -0.021200, 0.023565, 0.087394, 0.015972, -0.004613, - -0.021293, -0.095498, -0.111906, -0.056179, -0.021076, 0.093314, 0.023161, -0.037356, - 0.005841, -0.046958, 0.031820, 0.001110, -0.001804, 0.077609, 0.053106, -0.061559, - -0.061693, -0.048003, -0.026282, 0.005595, -0.081761, -0.005728, -0.019482, 0.043831, - -0.045662, 0.003519, -0.009390, -0.032505, 0.003727, 0.034058, 0.018740, 0.006788, - -0.022831, -0.056404, -0.041809, 0.007511, -0.004960, 0.032234, -0.002879, -0.006334, - 0.028527, 0.013498, -0.024352, -0.008792, -0.020932, 0.027336, 0.007435, -0.034101, - -0.048174, -0.044342, 0.003465, -0.002648, -0.065476, -0.004470, -0.023008, -0.037148, - -0.003812, -0.042595, -0.006097, 0.001593, 0.028053, 0.100385, -0.003399, 0.048565, - -0.008727, -0.004277, -0.005775, 0.020278, 0.042252, -0.017345, -0.035931, 0.001196, - 0.054535, -0.007490, 0.010059, -0.017211, -0.037070, -0.056338, -0.012463, -0.027512, - -0.048526, -0.053108, -0.027171, -0.000620, -0.027876, -0.013333, 0.008008, -0.084753, - -0.010047, 0.013508, -0.032658, 0.042550, 0.041943, 0.010221, 0.046194, 0.026261, - 0.005096, -0.016828, -0.020704, 0.013061, -0.034935, -0.033411, -0.052798, 0.011478, - 0.008875, 0.016810, 0.026855, -0.019706, -0.019060, -0.023427, -0.048142, -0.013366, - -0.078309, -0.063328, -0.010359, 0.023949, -0.018065, 0.000055, -0.006923, -0.047894, - 0.034123, 0.047009, 0.025593, 0.066234, 0.063401, 0.059755, 0.051457, 0.070262, - 0.077550, 0.007559, 0.019854, 0.063556, 0.031673, 0.068075, 0.051269, 0.017486, - 0.065568, -0.004298, 0.018795, 0.025729, 0.005398, 0.036892, 0.042594, -0.005537, - -0.043569, -0.051591, 0.001129, 0.003319, -0.045530, 0.018322, -0.033283, -0.054719, - 0.002188, -0.000776, 0.011989, 0.047543, 0.085245, 0.109187, 0.044968, 0.069626, - -0.019169, -0.056859, 0.031995, 0.050979, 0.069461, 0.066663, 0.004946, 0.034565, - -0.026738, -0.050844, 0.021810, 0.015014, 0.024321, 0.004038, -0.022594, 0.059167, - 0.016226, 0.000039, 0.000849, 0.030181, 0.026724, 0.088602, 0.114290, 0.053264, - -0.008996, -0.038984, -0.091328, -0.043653, 0.001649, 0.009334, 0.022134, 0.041656, - -0.010983, -0.084786, -0.057426, -0.034726, -0.039950, -0.052714, -0.085157, -0.079162, - 0.050547, 0.003309, 0.039797, 0.005171, -0.056042, -0.036123, -0.010933, -0.042168, - 0.085203, 0.029922, 0.067239, 0.006365, -0.027768, 0.058723, 0.043251, 0.037917, - 0.037502, -0.028190, -0.064105, -0.058346, -0.037130, 0.003510, -0.005209, 0.016856, - -0.025665, -0.109337, -0.068801, -0.030277, -0.037357, -0.018248, -0.090141, -0.109764, - -0.037589, -0.064244, 0.026384, 0.007622, -0.000288, -0.036465, -0.079414, -0.036724, - 10.000000, - 8.000000, 4.000000, 31.000000, - 0.029490, 0.020317, 0.036180, -0.012929, -0.059798, -0.032039, -0.025376, -0.010041, - 0.021704, 0.014455, 0.002292, -0.030540, -0.046054, -0.003200, -0.041835, -0.007277, - -0.028906, -0.026090, -0.068224, 0.017642, -0.035733, 0.019104, 0.041570, 0.069400, - 0.021049, -0.010170, 0.011367, 0.017202, 0.000886, 0.077433, 0.009003, -0.040177, - 0.003288, -0.026352, -0.014247, 0.006923, 0.018687, -0.002891, -0.032403, -0.023111, - 0.048053, 0.000462, -0.017763, -0.057549, -0.050864, -0.011916, -0.042450, -0.020171, - -0.043766, 0.023362, 0.014172, 0.029029, 0.015989, -0.032087, -0.014514, 0.002123, - -0.012937, -0.048885, -0.002427, 0.056783, -0.022967, 0.047752, -0.023847, -0.051180, - 0.052279, 0.030538, 0.007823, 0.051337, 0.036402, -0.013564, 0.017056, -0.024268, - -0.005188, -0.013454, -0.019008, 0.036447, 0.041809, 0.019439, 0.001342, 0.007794, - -0.026921, -0.029052, 0.002419, 0.041366, -0.007418, 0.089831, 0.042929, 0.048628, - -0.013561, -0.041815, 0.009552, 0.037153, 0.007481, 0.036189, 0.028625, 0.033634, - 0.041260, -0.027039, -0.050831, 0.041011, 0.040243, 0.028524, -0.030184, 0.010395, - -0.046391, -0.056056, -0.022316, 0.019811, -0.001237, 0.070276, 0.042058, 0.026878, - -0.016178, 0.014537, 0.020538, -0.014889, -0.014371, 0.018914, 0.035698, 0.074462, - -0.023528, -0.017530, -0.025355, -0.002221, -0.047500, 0.025397, -0.017366, 0.023639, - -0.040030, -0.079334, 0.056095, 0.004803, 0.015795, 0.022575, 0.046387, -0.066473, - -0.040088, -0.109946, -0.082067, -0.042024, -0.037944, 0.035785, 0.046817, -0.047793, - 0.013800, 0.025117, 0.012036, -0.035222, -0.029191, 0.063018, 0.011592, 0.029426, - 0.107834, 0.086092, 0.099453, 0.047555, 0.049324, 0.022699, -0.030282, 0.039579, - -0.014631, -0.081717, 0.023365, -0.078880, -0.037433, 0.004340, 0.025686, -0.043663, - 0.024166, -0.101275, -0.042214, -0.015772, -0.001126, -0.065703, -0.050145, -0.057756, - 0.021434, -0.012371, -0.046572, -0.052199, 0.043635, -0.033496, -0.015281, -0.020737, - 0.004396, 0.063601, 0.068744, 0.052836, 0.031237, -0.030265, 0.032440, 0.036073, - 0.013145, -0.098581, -0.021289, -0.035818, 0.059227, 0.066632, 0.014278, 0.000976, - 0.029266, -0.088868, -0.012989, 0.009352, 0.039247, -0.010879, 0.009273, 0.015362, - 0.008728, -0.093546, -0.057696, -0.009955, 0.049190, 0.008401, 0.038773, 0.031910, - -0.020493, -0.100214, -0.005994, -0.016823, 0.018060, 0.009466, 0.055723, 0.002230, - -0.036552, -0.031644, 0.034468, 0.097613, 0.000644, 0.006833, 0.024094, -0.031473, - 0.048759, -0.052548, 0.002040, 0.075153, 0.023785, 0.033977, -0.032295, -0.008205, - 0.095437, 0.019330, -0.025666, -0.005958, 0.046595, 0.025087, 0.003923, 0.002408, - 0.021009, -0.028223, -0.024013, -0.028860, 0.008151, 0.095266, 0.059017, 0.038552, - -0.023080, -0.049995, 0.029079, 0.007719, -0.017353, -0.061659, -0.024865, 0.050636, - -0.109869, -0.053789, -0.020580, 0.032229, -0.015063, -0.001319, -0.016979, -0.065840, - 0.004120, 0.070149, 0.003763, -0.013729, -0.019346, -0.014485, 0.037650, 0.035659, - 0.022625, 0.064583, 0.052829, 0.028693, -0.021323, -0.010077, -0.034641, -0.040991, - -0.040917, -0.031719, -0.023281, -0.039315, -0.020676, -0.040274, -0.022670, 0.007064, - -0.080537, -0.032436, 0.033387, -0.018797, -0.009110, -0.004047, -0.032062, -0.035725, - -0.000281, -0.027000, -0.014857, -0.027593, -0.001196, 0.011852, 0.027820, -0.018892, - 0.036554, 0.003777, 0.029225, 0.014653, -0.007961, 0.006549, 0.066627, -0.005774, - 0.001402, 0.056962, 0.044559, -0.018724, -0.050803, -0.037765, -0.023185, -0.023785, - -0.031659, 0.013099, 0.044081, 0.065342, -0.002704, -0.024705, -0.008149, 0.005983, - 0.016283, -0.004745, -0.055104, 0.029570, -0.006872, 0.021070, 0.032847, 0.018006, - -0.050254, -0.042090, -0.027000, -0.032491, -0.014061, 0.004080, 0.031436, -0.044791, - 0.094940, 0.026485, 0.026452, 0.019676, -0.007325, -0.031308, -0.026825, 0.012276, - -0.001409, 0.028911, 0.068132, 0.043134, 0.032879, -0.043523, 0.001766, 0.038010, - 0.040158, -0.000508, 0.019395, -0.027736, 0.049182, 0.037165, -0.008521, 0.045808, - -0.031579, -0.022090, 0.019095, -0.007635, -0.055028, -0.007820, -0.015825, -0.002595, - 0.003446, 0.035259, 0.022761, 0.000999, -0.018260, 0.039841, 0.041637, 0.005579, - 0.012853, -0.014144, -0.037971, -0.005492, -0.018774, 0.025140, -0.011241, -0.014723, - -0.036178, 0.001756, -0.001121, 0.003359, 0.044937, 0.060939, -0.021130, -0.027371, - -0.061900, -0.034729, 0.017740, 0.003882, -0.033385, -0.012586, 0.001621, 0.072994, - 0.029099, 0.015653, 0.021784, 0.004392, 0.008394, 0.076247, -0.028782, -0.028052, - -0.015377, 0.006546, -0.023563, -0.023981, -0.044666, 0.098085, -0.040962, -0.039744, - -0.053339, -0.015497, -0.027874, -0.001882, 0.011169, 0.000533, -0.049169, -0.029641, - 0.024812, 0.055345, 0.003374, 0.043941, -0.023583, 0.007614, 0.077141, 0.037474, - 0.003070, 0.031099, 0.037847, 0.057118, 0.001414, 0.003153, 0.012152, 0.011587, - 0.062343, 0.014629, 0.025329, 0.013083, 0.047492, 0.051388, -0.034813, -0.024415, - 0.013981, 0.007639, 0.005786, -0.032386, -0.006711, 0.014546, -0.063518, 0.014951, - 0.027922, 0.030485, 0.006814, 0.021547, -0.013108, -0.001922, 0.028493, -0.012675, - -0.001252, -0.008682, -0.022525, 0.034360, 0.017444, -0.005534, -0.013147, 0.052814, - 0.085567, 0.004030, -0.022693, -0.034049, 0.021955, 0.001784, -0.011416, 0.002571, - 0.053173, -0.056895, 0.028198, 0.014525, 0.011387, 0.029675, -0.009683, 0.022087, - -0.039038, -0.048436, -0.026761, -0.048363, -0.025118, 0.069535, 0.053703, -0.018099, - 0.023775, -0.005483, -0.017821, 0.001225, -0.000390, -0.047293, -0.041399, 0.034734, - 0.024813, -0.081043, -0.048140, 0.032556, 0.030770, -0.033379, -0.022762, -0.036499, - 0.080364, 0.000878, -0.043886, 0.063451, 0.037177, 0.054943, 0.083112, 0.070387, - -0.032984, -0.077166, -0.016428, -0.013850, 0.013722, 0.020432, -0.002864, -0.030276, - -0.028872, -0.022006, 0.036110, -0.027943, -0.042660, -0.042974, -0.061683, 0.011215, - 0.019097, 0.005044, 0.016260, 0.006171, 0.040149, -0.001911, -0.008767, -0.028808, - -0.004409, 0.058513, -0.015309, 0.047592, 0.051637, 0.010620, 0.066353, 0.052263, - -0.023307, -0.012761, -0.065358, -0.038631, -0.001946, -0.008232, -0.070097, -0.061869, - -0.006456, -0.010559, 0.006016, -0.072799, -0.090938, -0.095879, -0.032718, -0.014853, - -0.011335, 0.010137, 0.041884, -0.007248, -0.045202, -0.010389, -0.043769, -0.023755, - 0.056690, 0.098927, 0.035594, 0.090224, 0.114198, 0.079953, 0.098613, 0.113518, - 0.041798, 0.015536, 0.047680, 0.059137, 0.033242, 0.061415, 0.057907, -0.049782, - 0.008875, 0.016810, 0.026855, -0.019706, -0.019060, -0.023427, -0.048142, -0.013366, - 0.005096, -0.016828, -0.020704, 0.013061, -0.034935, -0.033411, -0.052798, 0.011478, - -0.010047, 0.013508, -0.032658, 0.042550, 0.041943, 0.010221, 0.046194, 0.026261, - -0.048526, -0.053108, -0.027171, -0.000620, -0.027876, -0.013333, 0.008008, -0.084753, - 0.054535, -0.007490, 0.010059, -0.017211, -0.037070, -0.056338, -0.012463, -0.027512, - -0.008727, -0.004277, -0.005775, 0.020278, 0.042252, -0.017345, -0.035931, 0.001196, - -0.003812, -0.042595, -0.006097, 0.001593, 0.028053, 0.100385, -0.003399, 0.048565, - -0.048174, -0.044342, 0.003465, -0.002648, -0.065476, -0.004470, -0.023008, -0.037148, - 0.028527, 0.013498, -0.024352, -0.008792, -0.020932, 0.027336, 0.007435, -0.034101, - -0.022831, -0.056404, -0.041809, 0.007511, -0.004960, 0.032234, -0.002879, -0.006334, - -0.045662, 0.003519, -0.009390, -0.032505, 0.003727, 0.034058, 0.018740, 0.006788, - -0.061693, -0.048003, -0.026282, 0.005595, -0.081761, -0.005728, -0.019482, 0.043831, - 0.005841, -0.046958, 0.031820, 0.001110, -0.001804, 0.077609, 0.053106, -0.061559, - -0.021293, -0.095498, -0.111906, -0.056179, -0.021076, 0.093314, 0.023161, -0.037356, - -0.013473, -0.010938, -0.033305, -0.021200, 0.023565, 0.087394, 0.015972, -0.004613, - 0.103960, 0.094563, 0.046861, 0.050814, 0.021576, 0.050363, 0.051483, 0.020626, - -0.027270, -0.070592, 0.022568, -0.004412, -0.052484, -0.013738, 0.102283, -0.016865, - 0.078487, -0.082596, -0.019059, -0.002288, 0.009339, 0.009448, -0.063724, -0.045102, - 0.031910, -0.019669, -0.037005, -0.062709, 0.028931, 0.010582, -0.063760, -0.008988, - 0.035022, 0.079090, 0.079650, 0.049394, -0.009882, 0.010384, 0.079796, 0.022378, - 0.018387, -0.078788, -0.039627, -0.025771, 0.032645, 0.047040, 0.006255, 0.013222, - 0.123781, -0.077964, -0.055074, -0.026699, 0.006711, -0.056555, -0.026694, 0.009020, - 0.045728, -0.121469, -0.031086, -0.013402, 0.037565, 0.010345, -0.002914, 0.002691, - -0.065919, -0.122879, -0.061393, -0.082483, -0.011993, 0.030089, 0.084220, -0.067146, - -0.003246, -0.043722, -0.043130, -0.002350, -0.045910, -0.054252, -0.013825, -0.002491, - 0.119678, -0.070648, -0.019398, 0.098929, 0.038699, -0.026321, -0.088710, -0.056537, - 0.180852, 0.065605, 0.006670, 0.055646, 0.073930, 0.033318, 0.067255, 0.041349, - -0.013855, -0.063725, -0.009892, -0.026696, -0.016112, 0.026860, 0.059251, -0.003481, - -0.021758, -0.088421, 0.017151, -0.049235, -0.050079, -0.088882, -0.082071, 0.021402, - -0.012229, -0.010027, -0.029424, -0.019863, -0.001099, -0.016727, -0.044370, -0.104987, - 0.083579, 0.240227, 0.095545, 0.072283, 0.086943, 0.047371, 0.072862, 0.049386, - 0.001738, 0.084818, 0.082948, 0.068886, 0.034950, 0.035929, -0.039835, -0.073616, - 0.050547, 0.003309, 0.039797, 0.005171, -0.056042, -0.036123, -0.010933, -0.042168, - -0.010983, -0.084786, -0.057426, -0.034726, -0.039950, -0.052714, -0.085157, -0.079162, - -0.008996, -0.038984, -0.091328, -0.043653, 0.001649, 0.009334, 0.022134, 0.041656, - 0.016226, 0.000039, 0.000849, 0.030181, 0.026724, 0.088602, 0.114290, 0.053264, - -0.037589, -0.064244, 0.026384, 0.007622, -0.000288, -0.036465, -0.079414, -0.036724, - -0.025665, -0.109337, -0.068801, -0.030277, -0.037357, -0.018248, -0.090141, -0.109764, - 0.037502, -0.028190, -0.064105, -0.058346, -0.037130, 0.003510, -0.005209, 0.016856, - 0.085203, 0.029922, 0.067239, 0.006365, -0.027768, 0.058723, 0.043251, 0.037917, - 0.065568, -0.004298, 0.018795, 0.025729, 0.005398, 0.036892, 0.042594, -0.005537, - 0.077550, 0.007559, 0.019854, 0.063556, 0.031673, 0.068075, 0.051269, 0.017486, - 0.034123, 0.047009, 0.025593, 0.066234, 0.063401, 0.059755, 0.051457, 0.070262, - -0.078309, -0.063328, -0.010359, 0.023949, -0.018065, 0.000055, -0.006923, -0.047894, - -0.026738, -0.050844, 0.021810, 0.015014, 0.024321, 0.004038, -0.022594, 0.059167, - -0.019169, -0.056859, 0.031995, 0.050979, 0.069461, 0.066663, 0.004946, 0.034565, - 0.002188, -0.000776, 0.011989, 0.047543, 0.085245, 0.109187, 0.044968, 0.069626, - -0.043569, -0.051591, 0.001129, 0.003319, -0.045530, 0.018322, -0.033283, -0.054719, - 9.000000, - 5.000000, 6.000000, 31.000000, - 0.062537, 0.038999, 0.035230, -0.032101, -0.104194, - -0.034794, -0.046582, -0.023927, 0.008743, 0.053311, - 0.016517, -0.041484, 0.006855, 0.075010, 0.054018, - 0.013835, -0.022154, 0.028897, 0.006599, 0.007550, - -0.001427, 0.063481, -0.045302, -0.054073, -0.018532, - 0.070373, 0.009615, -0.074676, -0.053046, 0.009151, - 0.035902, -0.047856, 0.002438, 0.014990, -0.018820, - 0.000193, -0.009108, -0.012904, 0.017014, 0.006038, - -0.024984, 0.005353, 0.065812, 0.069171, 0.042987, - -0.016040, 0.005379, -0.014606, 0.005142, -0.031337, - 0.004773, 0.105202, 0.033220, -0.026354, -0.059668, - 0.028037, -0.013651, -0.011260, -0.005208, -0.058132, - 0.010484, -0.064736, -0.014894, -0.014077, -0.016266, - 0.005153, -0.019870, -0.028646, -0.012281, -0.031025, - -0.003574, -0.004423, 0.016724, -0.008891, -0.023451, - -0.075802, 0.010929, -0.037386, 0.014245, -0.013609, - 0.086101, 0.046489, 0.010360, -0.005361, 0.009386, - 0.087553, -0.023457, 0.005435, -0.002806, -0.046665, - -0.002624, 0.013837, 0.029933, -0.036486, 0.027620, - 0.030148, -0.010836, -0.035144, -0.017005, 0.016661, - 0.043158, -0.006158, -0.026773, -0.045391, 0.023896, - -0.011944, 0.034268, 0.014912, 0.039696, 0.038504, - 0.008991, -0.008381, 0.000620, -0.018679, 0.011066, - 0.069685, -0.032691, -0.010538, 0.004424, 0.010800, - -0.034592, -0.048200, 0.007360, -0.007061, 0.062695, - -0.020198, -0.067860, -0.029307, -0.021513, -0.001640, - 0.008172, 0.028067, 0.004852, -0.014148, -0.022873, - 0.020347, 0.040730, -0.008614, -0.015391, 0.033261, - -0.001937, -0.028729, -0.039864, -0.021677, 0.030027, - 0.067210, -0.031252, 0.019490, 0.024823, 0.030042, - 0.067210, -0.031252, 0.019490, 0.024823, 0.030042, - -0.001937, -0.028729, -0.039864, -0.021677, 0.030027, - 0.020347, 0.040730, -0.008614, -0.015391, 0.033261, - 0.008172, 0.028067, 0.004852, -0.014148, -0.022873, - -0.020198, -0.067860, -0.029307, -0.021513, -0.001640, - -0.034592, -0.048200, 0.007360, -0.007061, 0.062695, - 0.069685, -0.032691, -0.010538, 0.004424, 0.010800, - 0.008991, -0.008381, 0.000620, -0.018679, 0.011066, - -0.011944, 0.034268, 0.014912, 0.039696, 0.038504, - 0.043158, -0.006158, -0.026773, -0.045391, 0.023896, - 0.030148, -0.010836, -0.035144, -0.017005, 0.016661, - -0.002624, 0.013837, 0.029933, -0.036486, 0.027620, - 0.087553, -0.023457, 0.005435, -0.002806, -0.046665, - 0.086101, 0.046489, 0.010360, -0.005361, 0.009386, - -0.075802, 0.010929, -0.037386, 0.014245, -0.013609, - -0.003574, -0.004423, 0.016724, -0.008891, -0.023451, - 0.005153, -0.019870, -0.028646, -0.012281, -0.031025, - 0.010484, -0.064736, -0.014894, -0.014077, -0.016266, - 0.028037, -0.013651, -0.011260, -0.005208, -0.058132, - 0.004773, 0.105202, 0.033220, -0.026354, -0.059668, - -0.016040, 0.005379, -0.014606, 0.005142, -0.031337, - -0.024984, 0.005353, 0.065812, 0.069171, 0.042987, - 0.000193, -0.009108, -0.012904, 0.017014, 0.006038, - 0.035902, -0.047856, 0.002438, 0.014990, -0.018820, - 0.070373, 0.009615, -0.074676, -0.053046, 0.009151, - -0.001427, 0.063481, -0.045302, -0.054073, -0.018532, - 0.013835, -0.022154, 0.028897, 0.006599, 0.007550, - 0.016517, -0.041484, 0.006855, 0.075010, 0.054018, - -0.034794, -0.046582, -0.023927, 0.008743, 0.053311, - 0.062537, 0.038999, 0.035230, -0.032101, -0.104194, - -0.014125, -0.003623, 0.021573, 0.034546, 0.037519, - -0.033968, 0.006878, 0.095458, 0.033388, 0.058644, - 0.018447, -0.074805, 0.016934, 0.005180, 0.060354, - -0.042390, -0.020910, 0.007526, 0.005345, 0.026102, - -0.058368, -0.023850, -0.026504, -0.011296, -0.015375, - -0.024771, 0.030470, -0.027236, 0.010051, -0.065452, - -0.034529, 0.039461, 0.026208, 0.015739, 0.000905, - -0.023130, 0.013602, 0.058382, -0.027201, 0.025966, - -0.010043, -0.024883, 0.029337, 0.085838, 0.045191, - -0.057332, 0.009334, -0.007537, -0.003823, 0.030003, - -0.005034, -0.001242, 0.006038, 0.014076, 0.010624, - 0.014401, 0.004240, 0.036046, 0.015527, -0.015252, - 0.005335, 0.033302, -0.004245, 0.008863, -0.026212, - -0.055587, -0.023314, 0.016369, -0.008367, -0.014090, - -0.063833, -0.042577, -0.023421, -0.008680, -0.014797, - -0.009618, -0.022070, -0.073158, -0.045651, -0.035298, - 0.101370, 0.048983, -0.039563, -0.017349, -0.021206, - 0.058901, 0.053642, -0.035985, 0.008546, 0.029734, - -0.046079, 0.011523, 0.054940, 0.019195, 0.007458, - -0.003291, 0.041611, -0.009615, 0.000332, -0.014789, - 0.022468, 0.040730, -0.055566, -0.038484, -0.037176, - 0.082804, 0.087046, -0.060633, -0.041170, -0.040967, - 0.065782, 0.007986, -0.061449, -0.018276, -0.034189, - -0.048158, 0.035451, 0.036412, 0.007416, 0.070274, - -0.048158, 0.035451, 0.036412, 0.007416, 0.070274, - 0.065782, 0.007986, -0.061449, -0.018276, -0.034189, - 0.082804, 0.087046, -0.060633, -0.041170, -0.040967, - 0.022468, 0.040730, -0.055566, -0.038484, -0.037176, - -0.003291, 0.041611, -0.009615, 0.000332, -0.014789, - -0.046079, 0.011523, 0.054940, 0.019195, 0.007458, - 0.058901, 0.053642, -0.035985, 0.008546, 0.029734, - 0.101370, 0.048983, -0.039563, -0.017349, -0.021206, - -0.009618, -0.022070, -0.073158, -0.045651, -0.035298, - -0.063833, -0.042577, -0.023421, -0.008680, -0.014797, - -0.055587, -0.023314, 0.016369, -0.008367, -0.014090, - 0.005335, 0.033302, -0.004245, 0.008863, -0.026212, - 0.014401, 0.004240, 0.036046, 0.015527, -0.015252, - -0.005034, -0.001242, 0.006038, 0.014076, 0.010624, - -0.057332, 0.009334, -0.007537, -0.003823, 0.030003, - -0.010043, -0.024883, 0.029337, 0.085838, 0.045191, - -0.023130, 0.013602, 0.058382, -0.027201, 0.025966, - -0.034529, 0.039461, 0.026208, 0.015739, 0.000905, - -0.024771, 0.030470, -0.027236, 0.010051, -0.065452, - -0.058368, -0.023850, -0.026504, -0.011296, -0.015375, - -0.042390, -0.020910, 0.007526, 0.005345, 0.026102, - 0.018447, -0.074805, 0.016934, 0.005180, 0.060354, - -0.033968, 0.006878, 0.095458, 0.033388, 0.058644, - -0.014125, -0.003623, 0.021573, 0.034546, 0.037519, - 0.134595, 0.058031, 0.012038, 0.026498, 0.012474, - -0.016045, 0.053095, 0.063617, 0.056239, 0.086517, - -0.002082, -0.055735, 0.017809, 0.037594, 0.026606, - -0.002082, -0.055735, 0.017809, 0.037594, 0.026606, - -0.016045, 0.053095, 0.063617, 0.056239, 0.086517, - 0.134595, 0.058031, 0.012038, 0.026498, 0.012474, - 0.045546, -0.040302, 0.002263, 0.027828, 0.047795, - -0.029034, -0.010784, 0.027754, -0.000241, 0.026084, - 0.002329, -0.044644, 0.025135, 0.055216, 0.064353, - -0.036750, -0.006736, 0.022987, 0.040228, -0.011848, - -0.014662, 0.080443, 0.042724, -0.037599, -0.052775, - 0.024039, 0.018175, -0.042564, -0.026691, -0.088940, - -0.019242, -0.031793, -0.021973, -0.033636, -0.045789, - -0.014791, -0.013969, 0.008438, -0.043647, 0.031168, - -0.042500, -0.039998, 0.012730, 0.035088, -0.017589, - -0.108983, 0.016102, -0.039642, -0.009120, -0.015753, - 0.002114, 0.010469, -0.026386, -0.042882, -0.021953, - 0.051041, -0.050423, 0.005834, -0.030116, -0.098438, - -0.013808, -0.019477, -0.006617, -0.039269, -0.014862, - -0.029792, -0.042501, -0.016639, -0.053797, -0.012609, - -0.038529, -0.046267, -0.043715, -0.058532, -0.037990, - -0.016210, -0.005246, -0.056921, -0.018250, -0.019824, - 0.062134, 0.005296, -0.053177, -0.058814, -0.037854, - 0.055192, 0.016010, -0.046990, -0.018033, 0.007233, - -0.060241, -0.020027, 0.032343, -0.013595, 0.035574, - 0.015847, -0.041712, -0.046138, -0.044077, -0.014541, - 0.087554, 0.038132, -0.059460, -0.057400, -0.062674, - 0.147746, 0.120204, -0.065071, -0.068452, -0.029194, - 0.117651, 0.018763, -0.075123, -0.044990, 0.007477, - 0.042484, -0.008471, 0.043613, -0.022733, 0.070403, - 0.042484, -0.008471, 0.043613, -0.022733, 0.070403, - 0.117651, 0.018763, -0.075123, -0.044990, 0.007477, - 0.147746, 0.120204, -0.065071, -0.068452, -0.029194, - 0.087554, 0.038132, -0.059460, -0.057400, -0.062674, - 0.015847, -0.041712, -0.046138, -0.044077, -0.014541, - -0.060241, -0.020027, 0.032343, -0.013595, 0.035574, - 0.055192, 0.016010, -0.046990, -0.018033, 0.007233, - 0.062134, 0.005296, -0.053177, -0.058814, -0.037854, - -0.016210, -0.005246, -0.056921, -0.018250, -0.019824, - -0.038529, -0.046267, -0.043715, -0.058532, -0.037990, - -0.029792, -0.042501, -0.016639, -0.053797, -0.012609, - -0.013808, -0.019477, -0.006617, -0.039269, -0.014862, - 0.051041, -0.050423, 0.005834, -0.030116, -0.098438, - 0.002114, 0.010469, -0.026386, -0.042882, -0.021953, - -0.108983, 0.016102, -0.039642, -0.009120, -0.015753, - -0.042500, -0.039998, 0.012730, 0.035088, -0.017589, - -0.014791, -0.013969, 0.008438, -0.043647, 0.031168, - -0.019242, -0.031793, -0.021973, -0.033636, -0.045789, - 0.024039, 0.018175, -0.042564, -0.026691, -0.088940, - -0.014662, 0.080443, 0.042724, -0.037599, -0.052775, - -0.036750, -0.006736, 0.022987, 0.040228, -0.011848, - 0.002329, -0.044644, 0.025135, 0.055216, 0.064353, - -0.029034, -0.010784, 0.027754, -0.000241, 0.026084, - 0.045546, -0.040302, 0.002263, 0.027828, 0.047795, - 0.068848, 0.010698, -0.002983, 0.017436, 0.022711, - 0.051660, 0.045900, -0.006366, 0.007348, 0.059817, - 0.033762, 0.024280, -0.000146, 0.028016, 0.041448, - -0.032773, -0.024202, -0.065621, -0.024440, 0.024113, - -0.012424, -0.011812, -0.052033, -0.036228, -0.007787, - 0.073025, -0.010144, -0.011287, 0.003260, 0.005212, - 0.027382, -0.002249, 0.042843, 0.007837, -0.016244, - 0.055662, 0.043610, 0.030717, 0.005999, 0.011441, - -0.005289, 0.045966, 0.032333, 0.062725, 0.033877, - -0.038038, -0.044925, -0.021173, -0.026423, -0.032330, - -0.064364, -0.033170, -0.034438, -0.064742, -0.058187, - -0.025224, 0.004088, 0.016791, -0.022246, -0.042223, - 0.073025, -0.010144, -0.011287, 0.003260, 0.005212, - -0.012424, -0.011812, -0.052033, -0.036228, -0.007787, - -0.032773, -0.024202, -0.065621, -0.024440, 0.024113, - 0.033762, 0.024280, -0.000146, 0.028016, 0.041448, - 0.051660, 0.045900, -0.006366, 0.007348, 0.059817, - 0.068848, 0.010698, -0.002983, 0.017436, 0.022711, - -0.025224, 0.004088, 0.016791, -0.022246, -0.042223, - -0.064364, -0.033170, -0.034438, -0.064742, -0.058187, - -0.038038, -0.044925, -0.021173, -0.026423, -0.032330, - -0.005289, 0.045966, 0.032333, 0.062725, 0.033877, - 0.055662, 0.043610, 0.030717, 0.005999, 0.011441, - 0.027382, -0.002249, 0.042843, 0.007837, -0.016244, - 0.000000, - 5.000000, 6.000000, 31.000000, - 0.080884, 0.037878, 0.033322, 0.012892, -0.017077, - 0.040204, 0.012276, 0.086089, 0.045258, -0.017224, - 0.019019, -0.033890, -0.003277, -0.010281, -0.065845, - 0.015896, -0.059444, -0.012959, 0.004842, 0.013298, - -0.004725, 0.102136, 0.091167, 0.029007, -0.077806, - 0.099592, 0.076154, 0.030933, 0.016490, 0.002916, - -0.014919, 0.002415, -0.009389, -0.064857, -0.052966, - -0.023936, 0.058525, 0.036616, -0.047694, -0.028541, - 0.000735, 0.026124, -0.011413, -0.019476, -0.031614, - -0.027337, -0.038352, 0.024975, 0.033125, -0.028453, - -0.065731, -0.044205, 0.053681, 0.008100, -0.027216, - -0.015338, 0.018038, -0.039117, -0.078005, -0.002798, - -0.034908, 0.026391, -0.043534, -0.026727, 0.015053, - -0.003470, 0.036020, -0.048085, 0.011942, -0.061184, - -0.057367, 0.053232, 0.073864, -0.013133, -0.055980, - -0.045637, -0.044424, 0.068229, 0.023310, 0.111071, - -0.017116, -0.038404, 0.057005, 0.051472, 0.034941, - -0.004217, -0.015044, -0.028838, 0.038268, -0.054926, - -0.030486, -0.013325, -0.076063, 0.021825, 0.049655, - -0.007294, 0.027748, -0.038918, 0.050608, -0.032955, - 0.047003, 0.036431, 0.092570, 0.025417, 0.039391, - -0.038705, -0.056840, 0.062170, -0.027693, 0.063781, - -0.006714, -0.050675, 0.011168, 0.009382, -0.040681, - 0.013085, 0.014806, -0.061915, -0.001633, -0.026769, - 0.035459, 0.015213, -0.006203, -0.014431, 0.023448, - 0.009293, -0.008589, 0.005098, -0.011381, -0.041281, - 0.095717, 0.011042, 0.046234, -0.020820, -0.019476, - -0.018103, -0.004995, 0.078060, 0.002514, -0.020604, - 0.018003, -0.006499, 0.006473, 0.027971, -0.009798, - 0.041682, 0.040123, -0.030098, 0.041116, -0.013895, - 0.041682, 0.040123, -0.030098, 0.041116, -0.013895, - 0.018003, -0.006499, 0.006473, 0.027971, -0.009798, - -0.018103, -0.004995, 0.078060, 0.002514, -0.020604, - 0.095717, 0.011042, 0.046234, -0.020820, -0.019476, - 0.009293, -0.008589, 0.005098, -0.011381, -0.041281, - 0.035459, 0.015213, -0.006203, -0.014431, 0.023448, - 0.013085, 0.014806, -0.061915, -0.001633, -0.026769, - -0.006714, -0.050675, 0.011168, 0.009382, -0.040681, - -0.038705, -0.056840, 0.062170, -0.027693, 0.063781, - 0.047003, 0.036431, 0.092570, 0.025417, 0.039391, - -0.007294, 0.027748, -0.038918, 0.050608, -0.032955, - -0.030486, -0.013325, -0.076063, 0.021825, 0.049655, - -0.004217, -0.015044, -0.028838, 0.038268, -0.054926, - -0.017116, -0.038404, 0.057005, 0.051472, 0.034941, - -0.045637, -0.044424, 0.068229, 0.023310, 0.111071, - -0.057367, 0.053232, 0.073864, -0.013133, -0.055980, - -0.003470, 0.036020, -0.048085, 0.011942, -0.061184, - -0.034908, 0.026391, -0.043534, -0.026727, 0.015053, - -0.015338, 0.018038, -0.039117, -0.078005, -0.002798, - -0.065731, -0.044205, 0.053681, 0.008100, -0.027216, - -0.027337, -0.038352, 0.024975, 0.033125, -0.028453, - 0.000735, 0.026124, -0.011413, -0.019476, -0.031614, - -0.023936, 0.058525, 0.036616, -0.047694, -0.028541, - -0.014919, 0.002415, -0.009389, -0.064857, -0.052966, - 0.099592, 0.076154, 0.030933, 0.016490, 0.002916, - -0.004725, 0.102136, 0.091167, 0.029007, -0.077806, - 0.015896, -0.059444, -0.012959, 0.004842, 0.013298, - 0.019019, -0.033890, -0.003277, -0.010281, -0.065845, - 0.040204, 0.012276, 0.086089, 0.045258, -0.017224, - 0.080884, 0.037878, 0.033322, 0.012892, -0.017077, - -0.028129, -0.044169, -0.053681, -0.080068, -0.000011, - -0.043310, 0.048749, -0.002105, 0.036481, 0.011063, - -0.081217, 0.041239, -0.041250, -0.013109, 0.009451, - -0.020025, -0.031678, 0.040063, 0.052351, -0.019331, - -0.024867, -0.043890, 0.052679, 0.044214, -0.044812, - 0.005892, -0.030736, -0.003230, -0.026167, -0.058686, - -0.008188, -0.032209, -0.063041, -0.041608, 0.074195, - 0.042592, 0.067528, 0.004764, 0.041991, 0.019115, - 0.027419, 0.001071, -0.025373, 0.043167, 0.027185, - -0.097465, -0.038482, -0.071506, 0.036628, 0.117993, - -0.023853, -0.018283, 0.016976, 0.024559, 0.021962, - -0.009949, -0.053475, 0.027617, -0.003803, -0.002549, - -0.047182, -0.030231, -0.024953, 0.024118, 0.071663, - -0.019111, -0.049782, -0.011395, 0.027214, 0.048259, - 0.140306, 0.070906, -0.050526, 0.013215, -0.010279, - -0.022243, -0.032798, -0.043872, 0.018602, 0.017537, - -0.034752, -0.015272, -0.021885, -0.016261, -0.016077, - -0.052604, 0.024562, 0.011688, -0.020700, 0.022588, - -0.026172, 0.018538, 0.038378, -0.015753, -0.001130, - -0.046231, -0.037858, -0.005501, 0.029271, 0.015631, - 0.104464, 0.024119, -0.028040, -0.052956, -0.015750, - 0.017862, 0.055269, 0.013654, -0.048636, -0.019805, - -0.018154, -0.011478, -0.027047, -0.043059, -0.003785, - 0.047084, 0.066795, 0.021454, -0.036487, 0.018210, - 0.047084, 0.066795, 0.021454, -0.036487, 0.018210, - -0.018154, -0.011478, -0.027047, -0.043059, -0.003785, - 0.017862, 0.055269, 0.013654, -0.048636, -0.019805, - 0.104464, 0.024119, -0.028040, -0.052956, -0.015750, - -0.046231, -0.037858, -0.005501, 0.029271, 0.015631, - -0.026172, 0.018538, 0.038378, -0.015753, -0.001130, - -0.052604, 0.024562, 0.011688, -0.020700, 0.022588, - -0.034752, -0.015272, -0.021885, -0.016261, -0.016077, - -0.022243, -0.032798, -0.043872, 0.018602, 0.017537, - 0.140306, 0.070906, -0.050526, 0.013215, -0.010279, - -0.019111, -0.049782, -0.011395, 0.027214, 0.048259, - -0.047182, -0.030231, -0.024953, 0.024118, 0.071663, - -0.009949, -0.053475, 0.027617, -0.003803, -0.002549, - -0.023853, -0.018283, 0.016976, 0.024559, 0.021962, - -0.097465, -0.038482, -0.071506, 0.036628, 0.117993, - 0.027419, 0.001071, -0.025373, 0.043167, 0.027185, - 0.042592, 0.067528, 0.004764, 0.041991, 0.019115, - -0.008188, -0.032209, -0.063041, -0.041608, 0.074195, - 0.005892, -0.030736, -0.003230, -0.026167, -0.058686, - -0.024867, -0.043890, 0.052679, 0.044214, -0.044812, - -0.020025, -0.031678, 0.040063, 0.052351, -0.019331, - -0.081217, 0.041239, -0.041250, -0.013109, 0.009451, - -0.043310, 0.048749, -0.002105, 0.036481, 0.011063, - -0.028129, -0.044169, -0.053681, -0.080068, -0.000011, - 0.098624, -0.009360, -0.021967, -0.048468, 0.009535, - -0.007977, 0.141625, 0.149399, 0.053292, -0.059662, - -0.004383, -0.038744, 0.048962, -0.005189, -0.033578, - -0.004383, -0.038744, 0.048962, -0.005189, -0.033578, - -0.007977, 0.141625, 0.149399, 0.053292, -0.059662, - 0.098624, -0.009360, -0.021967, -0.048468, 0.009535, - -0.006730, -0.021987, -0.025472, -0.087024, 0.024070, - -0.010087, 0.118400, 0.095733, 0.028685, 0.014821, - -0.049468, 0.054109, -0.007012, -0.028281, -0.023773, - -0.031748, -0.076598, 0.036074, 0.094816, -0.012716, - -0.056508, -0.034942, 0.114309, 0.071747, -0.038850, - -0.005120, 0.010170, 0.014553, -0.080981, -0.054515, - -0.023920, -0.005394, -0.084130, -0.018750, 0.150703, - 0.090479, 0.132717, 0.002524, 0.095633, 0.035552, - 0.020428, 0.076955, 0.030958, 0.058034, -0.014190, - -0.131762, -0.087715, -0.009947, 0.078513, 0.106427, - -0.050733, -0.057075, 0.069031, 0.093027, 0.006860, - -0.022375, -0.047834, -0.010630, 0.013764, -0.080459, - -0.037673, -0.003612, -0.067757, 0.070503, 0.084114, - 0.019487, -0.019974, 0.007372, 0.132021, 0.055375, - 0.159777, 0.091247, 0.065575, 0.044793, 0.000185, - -0.043213, -0.056137, 0.036840, 0.011254, 0.024317, - -0.041733, -0.055192, 0.009598, 0.015053, -0.061090, - -0.003941, 0.041190, -0.036332, -0.025683, -0.016063, - 0.024024, 0.025225, 0.013948, 0.026512, 0.017011, - -0.031305, -0.025760, 0.042481, 0.062727, -0.019917, - 0.143409, -0.010770, 0.054589, -0.018871, -0.003741, - 0.022143, 0.006388, 0.092925, 0.012610, 0.023232, - -0.057580, -0.050213, 0.027932, 0.009355, -0.039829, - 0.049391, 0.057353, 0.063220, 0.033246, -0.020246, - 0.049391, 0.057353, 0.063220, 0.033246, -0.020246, - -0.057580, -0.050213, 0.027932, 0.009355, -0.039829, - 0.022143, 0.006388, 0.092925, 0.012610, 0.023232, - 0.143409, -0.010770, 0.054589, -0.018871, -0.003741, - -0.031305, -0.025760, 0.042481, 0.062727, -0.019917, - 0.024024, 0.025225, 0.013948, 0.026512, 0.017011, - -0.003941, 0.041190, -0.036332, -0.025683, -0.016063, - -0.041733, -0.055192, 0.009598, 0.015053, -0.061090, - -0.043213, -0.056137, 0.036840, 0.011254, 0.024317, - 0.159777, 0.091247, 0.065575, 0.044793, 0.000185, - 0.019487, -0.019974, 0.007372, 0.132021, 0.055375, - -0.037673, -0.003612, -0.067757, 0.070503, 0.084114, - -0.022375, -0.047834, -0.010630, 0.013764, -0.080459, - -0.050733, -0.057075, 0.069031, 0.093027, 0.006860, - -0.131762, -0.087715, -0.009947, 0.078513, 0.106427, - 0.020428, 0.076955, 0.030958, 0.058034, -0.014190, - 0.090479, 0.132717, 0.002524, 0.095633, 0.035552, - -0.023920, -0.005394, -0.084130, -0.018750, 0.150703, - -0.005120, 0.010170, 0.014553, -0.080981, -0.054515, - -0.056508, -0.034942, 0.114309, 0.071747, -0.038850, - -0.031748, -0.076598, 0.036074, 0.094816, -0.012716, - -0.049468, 0.054109, -0.007012, -0.028281, -0.023773, - -0.010087, 0.118400, 0.095733, 0.028685, 0.014821, - -0.006730, -0.021987, -0.025472, -0.087024, 0.024070, - -0.040949, -0.017663, -0.076979, -0.065986, 0.031372, - -0.073099, -0.002882, 0.028029, 0.043344, 0.039721, - -0.006916, 0.005708, 0.054644, 0.003362, 0.019681, - -0.021002, -0.006709, 0.009095, -0.019443, 0.036933, - -0.023240, 0.023269, 0.037106, 0.021985, -0.039069, - 0.044367, 0.058379, 0.012713, -0.045342, -0.009442, - -0.001984, -0.028287, -0.079441, -0.048652, -0.026717, - -0.028658, -0.028739, 0.013976, 0.048421, -0.054510, - 0.015733, 0.003676, 0.038316, 0.044971, 0.006355, - 0.040620, -0.012796, -0.002304, -0.006703, -0.009904, - 0.016964, 0.021573, 0.046649, 0.036662, -0.064175, - 0.022885, 0.044952, 0.013284, 0.039523, 0.026906, - 0.044367, 0.058379, 0.012713, -0.045342, -0.009442, - -0.023240, 0.023269, 0.037106, 0.021985, -0.039069, - -0.021002, -0.006709, 0.009095, -0.019443, 0.036933, - -0.006916, 0.005708, 0.054644, 0.003362, 0.019681, - -0.073099, -0.002882, 0.028029, 0.043344, 0.039721, - -0.040949, -0.017663, -0.076979, -0.065986, 0.031372, - 0.022885, 0.044952, 0.013284, 0.039523, 0.026906, - 0.016964, 0.021573, 0.046649, 0.036662, -0.064175, - 0.040620, -0.012796, -0.002304, -0.006703, -0.009904, - 0.015733, 0.003676, 0.038316, 0.044971, 0.006355, - -0.028658, -0.028739, 0.013976, 0.048421, -0.054510, - -0.001984, -0.028287, -0.079441, -0.048652, -0.026717, - 0.000000, diff --git a/ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/data/person_root.csv b/ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/data/person_root.csv deleted file mode 100755 index d7e11aa3387..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/data/person_root.csv +++ /dev/null @@ -1,313 +0,0 @@ - 2.000000, - 9.000000, 6.000000, 31.000000, - 0.029411, 0.030561, -0.012455, -0.006882, 0.003505, -0.043002, 0.034831, 0.018885, -0.055765, - 0.011397, -0.003854, -0.042681, -0.017881, 0.003145, -0.041660, 0.002799, -0.006488, -0.038910, - -0.049670, -0.030285, -0.088014, -0.001021, 0.018735, -0.028842, 0.005757, 0.028441, -0.007146, - 0.037652, 0.001012, -0.019110, 0.016400, 0.058373, 0.040603, -0.033449, 0.073291, 0.002168, - -0.008589, 0.022222, -0.028357, 0.004165, -0.006088, 0.018106, -0.045113, 0.038343, 0.036944, - 0.017422, -0.010571, 0.023654, 0.054123, 0.043279, -0.052457, -0.020049, 0.106020, 0.069516, - -0.014020, -0.013200, -0.006798, 0.035908, 0.020190, 0.008317, 0.028826, -0.057550, -0.009918, - -0.082371, -0.002962, -0.037985, -0.005545, -0.020485, 0.032788, -0.008951, -0.007647, -0.028057, - -0.012741, -0.007571, 0.002583, -0.003545, 0.020854, -0.006761, 0.031923, 0.060538, 0.011665, - -0.041751, 0.039072, 0.000030, -0.014615, -0.016494, 0.000118, -0.043390, -0.037450, 0.018806, - -0.056307, 0.012492, -0.008906, -0.051623, -0.036596, 0.016481, -0.009188, -0.047026, 0.033754, - 0.039235, 0.000562, -0.004708, 0.016652, -0.000108, -0.018771, -0.009825, 0.020808, 0.056355, - 0.009093, 0.014647, -0.044695, -0.039303, -0.035595, -0.010688, 0.056607, -0.004864, 0.024856, - -0.005134, 0.047677, 0.028975, 0.065371, -0.000497, -0.015682, 0.012130, 0.014967, 0.031265, - -0.003521, 0.015455, -0.034193, 0.018893, 0.035486, -0.027761, 0.036352, 0.044269, -0.032070, - -0.025106, -0.020001, 0.008646, 0.040443, -0.011984, -0.039250, -0.005227, -0.002069, -0.069362, - -0.061023, -0.042115, 0.024315, 0.004899, -0.034274, -0.020386, -0.026124, -0.015610, -0.031641, - 0.004142, -0.033376, 0.000780, -0.018394, -0.017602, 0.026567, 0.027194, -0.030842, 0.045359, - 0.018713, -0.107563, -0.040647, -0.014826, 0.028405, 0.031157, -0.003612, -0.014763, 0.005257, - 0.011687, 0.001445, -0.011330, 0.008441, 0.012242, 0.013614, -0.046273, -0.007324, 0.022740, - 0.018145, 0.081776, 0.009384, 0.018880, -0.016934, -0.000850, 0.013316, 0.005331, 0.032696, - -0.014937, -0.016448, -0.011297, -0.008102, 0.022642, 0.002473, 0.024769, -0.005568, -0.034909, - -0.039834, -0.031552, -0.039483, -0.001156, 0.040923, 0.048883, 0.047953, 0.041274, 0.026418, - -0.030719, -0.045355, -0.043782, -0.036155, -0.000522, 0.050511, -0.014801, -0.034013, 0.047545, - -0.022443, -0.032665, 0.033998, -0.004487, 0.013734, 0.022464, -0.016037, 0.005055, -0.011234, - -0.023345, -0.005009, 0.022467, 0.019351, 0.003101, 0.026629, -0.040365, -0.010260, 0.024059, - 0.050853, -0.008729, -0.028735, 0.012364, 0.006002, 0.010820, -0.001520, -0.050286, 0.037938, - 0.001244, 0.038712, 0.000289, 0.002881, -0.030723, -0.026189, -0.043461, -0.059273, 0.008150, - -0.030108, -0.021391, -0.000122, 0.014545, -0.005575, 0.004612, -0.013525, -0.002738, -0.001972, - 0.011640, -0.013166, 0.006420, -0.017107, 0.011112, 0.005932, 0.021537, 0.004632, -0.001804, - 0.011640, -0.013166, 0.006420, -0.017107, 0.011112, 0.005932, 0.021537, 0.004632, -0.001804, - -0.030108, -0.021391, -0.000122, 0.014545, -0.005575, 0.004612, -0.013525, -0.002738, -0.001972, - 0.001244, 0.038712, 0.000289, 0.002881, -0.030723, -0.026189, -0.043461, -0.059273, 0.008150, - 0.050853, -0.008729, -0.028735, 0.012364, 0.006002, 0.010820, -0.001520, -0.050286, 0.037938, - -0.023345, -0.005009, 0.022467, 0.019351, 0.003101, 0.026629, -0.040365, -0.010260, 0.024059, - -0.022443, -0.032665, 0.033998, -0.004487, 0.013734, 0.022464, -0.016037, 0.005055, -0.011234, - -0.030719, -0.045355, -0.043782, -0.036155, -0.000522, 0.050511, -0.014801, -0.034013, 0.047545, - -0.039834, -0.031552, -0.039483, -0.001156, 0.040923, 0.048883, 0.047953, 0.041274, 0.026418, - -0.014937, -0.016448, -0.011297, -0.008102, 0.022642, 0.002473, 0.024769, -0.005568, -0.034909, - 0.018145, 0.081776, 0.009384, 0.018880, -0.016934, -0.000850, 0.013316, 0.005331, 0.032696, - 0.011687, 0.001445, -0.011330, 0.008441, 0.012242, 0.013614, -0.046273, -0.007324, 0.022740, - 0.018713, -0.107563, -0.040647, -0.014826, 0.028405, 0.031157, -0.003612, -0.014763, 0.005257, - 0.004142, -0.033376, 0.000780, -0.018394, -0.017602, 0.026567, 0.027194, -0.030842, 0.045359, - -0.061023, -0.042115, 0.024315, 0.004899, -0.034274, -0.020386, -0.026124, -0.015610, -0.031641, - -0.025106, -0.020001, 0.008646, 0.040443, -0.011984, -0.039250, -0.005227, -0.002069, -0.069362, - -0.003521, 0.015455, -0.034193, 0.018893, 0.035486, -0.027761, 0.036352, 0.044269, -0.032070, - -0.005134, 0.047677, 0.028975, 0.065371, -0.000497, -0.015682, 0.012130, 0.014967, 0.031265, - 0.009093, 0.014647, -0.044695, -0.039303, -0.035595, -0.010688, 0.056607, -0.004864, 0.024856, - 0.039235, 0.000562, -0.004708, 0.016652, -0.000108, -0.018771, -0.009825, 0.020808, 0.056355, - -0.056307, 0.012492, -0.008906, -0.051623, -0.036596, 0.016481, -0.009188, -0.047026, 0.033754, - -0.041751, 0.039072, 0.000030, -0.014615, -0.016494, 0.000118, -0.043390, -0.037450, 0.018806, - -0.012741, -0.007571, 0.002583, -0.003545, 0.020854, -0.006761, 0.031923, 0.060538, 0.011665, - -0.082371, -0.002962, -0.037985, -0.005545, -0.020485, 0.032788, -0.008951, -0.007647, -0.028057, - -0.014020, -0.013200, -0.006798, 0.035908, 0.020190, 0.008317, 0.028826, -0.057550, -0.009918, - 0.017422, -0.010571, 0.023654, 0.054123, 0.043279, -0.052457, -0.020049, 0.106020, 0.069516, - -0.008589, 0.022222, -0.028357, 0.004165, -0.006088, 0.018106, -0.045113, 0.038343, 0.036944, - 0.037652, 0.001012, -0.019110, 0.016400, 0.058373, 0.040603, -0.033449, 0.073291, 0.002168, - -0.049670, -0.030285, -0.088014, -0.001021, 0.018735, -0.028842, 0.005757, 0.028441, -0.007146, - 0.011397, -0.003854, -0.042681, -0.017881, 0.003145, -0.041660, 0.002799, -0.006488, -0.038910, - 0.029411, 0.030561, -0.012455, -0.006882, 0.003505, -0.043002, 0.034831, 0.018885, -0.055765, - -0.035091, -0.000709, 0.043765, 0.023630, 0.006269, -0.027255, 0.072991, 0.051622, 0.012179, - -0.001538, 0.000406, 0.039649, 0.038602, 0.003310, 0.021582, 0.063968, 0.114059, 0.015234, - 0.006331, 0.009032, 0.012262, 0.032649, 0.017904, -0.011681, -0.002759, 0.035244, 0.004240, - 0.009317, 0.032706, -0.029169, -0.003747, 0.022917, 0.017974, 0.008288, 0.009720, -0.012071, - -0.040787, -0.033856, 0.003229, 0.004118, -0.025984, 0.021046, 0.009886, 0.021755, -0.047029, - -0.020172, 0.004346, -0.036837, -0.048269, -0.074293, -0.054807, 0.012016, 0.051272, -0.047286, - -0.031288, -0.000371, -0.036889, 0.035578, 0.044102, 0.053953, 0.073415, 0.077115, -0.009419, - 0.010990, 0.047847, 0.065051, -0.001493, -0.000367, 0.035297, 0.020654, 0.006278, -0.004437, - -0.016100, -0.045764, 0.017650, 0.029359, 0.019836, 0.002314, 0.061929, 0.007614, -0.011720, - -0.018336, -0.008028, 0.035350, 0.036340, 0.044934, -0.010311, 0.001635, 0.052306, -0.063263, - -0.030994, -0.008699, 0.005747, 0.018357, 0.038414, -0.017041, 0.000345, -0.001020, -0.043392, - -0.011526, -0.027429, 0.013289, 0.007938, -0.017970, -0.014353, -0.007465, 0.018412, -0.008129, - -0.049283, 0.050455, -0.002047, -0.030536, 0.033398, -0.058213, -0.032964, -0.009743, 0.010089, - 0.020756, 0.024549, 0.027784, 0.014061, 0.013837, 0.014444, -0.001081, -0.017543, 0.013006, - 0.020163, -0.040708, -0.008911, 0.025023, 0.008029, 0.021729, -0.003674, -0.056798, -0.015613, - -0.005057, -0.035396, -0.015175, 0.002832, -0.011091, 0.059811, 0.012751, -0.042836, -0.001383, - -0.033431, -0.025062, 0.020272, -0.021236, 0.003460, -0.016385, -0.020740, 0.003452, -0.023393, - -0.010463, 0.047508, 0.017689, -0.017721, -0.000391, 0.030811, 0.015372, 0.012006, -0.053560, - -0.018301, -0.028388, -0.043190, 0.039768, -0.051062, -0.022330, -0.032082, -0.002316, 0.008917, - -0.043309, -0.021377, 0.014485, 0.009985, 0.015043, 0.032971, -0.003271, -0.019392, -0.005175, - 0.021870, 0.010607, -0.047498, -0.037136, -0.034098, 0.023517, -0.003529, -0.000654, -0.036581, - -0.017761, -0.002983, -0.048003, -0.030322, 0.008845, 0.029434, 0.027981, 0.014373, -0.038403, - -0.011303, 0.004846, -0.042339, 0.014150, -0.000270, -0.000616, -0.011527, -0.023141, 0.024754, - 0.042988, -0.010246, -0.006225, -0.023934, -0.020740, 0.000985, 0.021497, -0.053689, -0.042110, - 0.042988, -0.010246, -0.006225, -0.023934, -0.020740, 0.000985, 0.021497, -0.053689, -0.042110, - -0.011303, 0.004846, -0.042339, 0.014150, -0.000270, -0.000616, -0.011527, -0.023141, 0.024754, - -0.017761, -0.002983, -0.048003, -0.030322, 0.008845, 0.029434, 0.027981, 0.014373, -0.038403, - 0.021870, 0.010607, -0.047498, -0.037136, -0.034098, 0.023517, -0.003529, -0.000654, -0.036581, - -0.043309, -0.021377, 0.014485, 0.009985, 0.015043, 0.032971, -0.003271, -0.019392, -0.005175, - -0.018301, -0.028388, -0.043190, 0.039768, -0.051062, -0.022330, -0.032082, -0.002316, 0.008917, - -0.010463, 0.047508, 0.017689, -0.017721, -0.000391, 0.030811, 0.015372, 0.012006, -0.053560, - -0.033431, -0.025062, 0.020272, -0.021236, 0.003460, -0.016385, -0.020740, 0.003452, -0.023393, - -0.005057, -0.035396, -0.015175, 0.002832, -0.011091, 0.059811, 0.012751, -0.042836, -0.001383, - 0.020163, -0.040708, -0.008911, 0.025023, 0.008029, 0.021729, -0.003674, -0.056798, -0.015613, - 0.020756, 0.024549, 0.027784, 0.014061, 0.013837, 0.014444, -0.001081, -0.017543, 0.013006, - -0.049283, 0.050455, -0.002047, -0.030536, 0.033398, -0.058213, -0.032964, -0.009743, 0.010089, - -0.011526, -0.027429, 0.013289, 0.007938, -0.017970, -0.014353, -0.007465, 0.018412, -0.008129, - -0.030994, -0.008699, 0.005747, 0.018357, 0.038414, -0.017041, 0.000345, -0.001020, -0.043392, - -0.018336, -0.008028, 0.035350, 0.036340, 0.044934, -0.010311, 0.001635, 0.052306, -0.063263, - -0.016100, -0.045764, 0.017650, 0.029359, 0.019836, 0.002314, 0.061929, 0.007614, -0.011720, - 0.010990, 0.047847, 0.065051, -0.001493, -0.000367, 0.035297, 0.020654, 0.006278, -0.004437, - -0.031288, -0.000371, -0.036889, 0.035578, 0.044102, 0.053953, 0.073415, 0.077115, -0.009419, - -0.020172, 0.004346, -0.036837, -0.048269, -0.074293, -0.054807, 0.012016, 0.051272, -0.047286, - -0.040787, -0.033856, 0.003229, 0.004118, -0.025984, 0.021046, 0.009886, 0.021755, -0.047029, - 0.009317, 0.032706, -0.029169, -0.003747, 0.022917, 0.017974, 0.008288, 0.009720, -0.012071, - 0.006331, 0.009032, 0.012262, 0.032649, 0.017904, -0.011681, -0.002759, 0.035244, 0.004240, - -0.001538, 0.000406, 0.039649, 0.038602, 0.003310, 0.021582, 0.063968, 0.114059, 0.015234, - -0.035091, -0.000709, 0.043765, 0.023630, 0.006269, -0.027255, 0.072991, 0.051622, 0.012179, - 0.019617, -0.007352, 0.035296, 0.034574, 0.045835, 0.005054, 0.063660, 0.115045, 0.004352, - 0.038522, 0.049628, 0.057931, 0.074331, 0.065218, 0.032193, 0.067449, 0.071489, -0.068250, - 0.010232, -0.020790, -0.038254, 0.052419, 0.038359, -0.006179, -0.004594, 0.002149, -0.040917, - 0.010232, -0.020790, -0.038254, 0.052419, 0.038359, -0.006179, -0.004594, 0.002149, -0.040917, - 0.038522, 0.049628, 0.057931, 0.074331, 0.065218, 0.032193, 0.067449, 0.071489, -0.068250, - 0.019617, -0.007352, 0.035296, 0.034574, 0.045835, 0.005054, 0.063660, 0.115045, 0.004352, - -0.025645, -0.002318, 0.041499, 0.031071, 0.060203, 0.031473, 0.070811, -0.027596, -0.047924, - -0.022900, 0.057128, 0.036851, 0.073445, 0.017736, 0.017628, -0.022192, -0.015158, -0.046229, - 0.009654, 0.016214, 0.010496, 0.007397, -0.019941, -0.033647, -0.002490, 0.025962, 0.008321, - -0.008584, 0.037746, -0.031857, 0.013219, 0.008350, 0.015735, -0.031724, -0.048059, 0.011123, - -0.066191, -0.037985, -0.042766, -0.025162, -0.044404, 0.051964, 0.034720, 0.003909, -0.036374, - 0.047505, 0.014790, -0.055717, -0.006547, -0.063399, -0.043496, 0.011870, 0.042906, 0.006878, - -0.001494, 0.003395, -0.015666, -0.001281, -0.015388, 0.069651, 0.034933, 0.029121, 0.000683, - 0.016077, 0.078963, 0.147008, 0.034940, 0.030392, 0.002531, -0.061841, 0.004428, 0.010624, - 0.013686, 0.014057, -0.020287, 0.058919, 0.059929, -0.032073, 0.022497, 0.009902, -0.034975, - -0.024568, 0.002588, 0.014212, 0.063051, 0.094210, -0.024004, -0.032456, 0.010886, -0.065248, - -0.068690, -0.040330, -0.012012, -0.023585, 0.006608, 0.017777, -0.017138, 0.014081, -0.032258, - -0.008736, -0.054195, -0.007913, -0.013583, -0.015723, 0.013518, -0.035460, -0.006379, 0.046137, - -0.021229, -0.045131, -0.036103, -0.057760, -0.000910, -0.046857, -0.025479, -0.035232, -0.005124, - 0.013734, 0.061755, 0.056687, -0.045301, -0.018332, -0.005401, -0.037045, -0.036061, -0.014314, - -0.011713, 0.100783, 0.039060, 0.010369, -0.038468, 0.000508, 0.035371, -0.060206, -0.017911, - 0.003256, -0.016990, -0.035732, 0.007383, -0.008571, 0.035845, 0.001342, -0.044676, -0.026119, - -0.063609, -0.049853, -0.017399, -0.026273, 0.067159, 0.038073, -0.001139, 0.035208, -0.004469, - -0.028561, -0.031210, -0.030260, -0.039383, -0.022353, 0.060415, -0.002795, -0.011899, 0.000172, - -0.009968, 0.012858, 0.029821, 0.000353, -0.019928, 0.018428, -0.050469, -0.008651, -0.032363, - -0.035672, 0.028967, 0.057316, -0.016601, 0.033698, 0.033013, -0.026349, -0.018108, -0.028910, - 0.021324, 0.039180, -0.024497, 0.021139, -0.015583, 0.004407, 0.021490, -0.031200, -0.033676, - -0.004119, 0.050177, -0.056313, 0.012272, 0.032483, 0.026684, -0.004574, -0.046003, -0.025993, - -0.034958, -0.028057, 0.010098, 0.047914, 0.031973, 0.049161, -0.021915, -0.048267, -0.001148, - 0.018661, -0.004771, 0.044514, -0.018874, -0.049797, 0.002872, 0.002320, -0.037754, -0.023538, - 0.018661, -0.004771, 0.044514, -0.018874, -0.049797, 0.002872, 0.002320, -0.037754, -0.023538, - -0.034958, -0.028057, 0.010098, 0.047914, 0.031973, 0.049161, -0.021915, -0.048267, -0.001148, - -0.004119, 0.050177, -0.056313, 0.012272, 0.032483, 0.026684, -0.004574, -0.046003, -0.025993, - 0.021324, 0.039180, -0.024497, 0.021139, -0.015583, 0.004407, 0.021490, -0.031200, -0.033676, - -0.035672, 0.028967, 0.057316, -0.016601, 0.033698, 0.033013, -0.026349, -0.018108, -0.028910, - -0.009968, 0.012858, 0.029821, 0.000353, -0.019928, 0.018428, -0.050469, -0.008651, -0.032363, - -0.028561, -0.031210, -0.030260, -0.039383, -0.022353, 0.060415, -0.002795, -0.011899, 0.000172, - -0.063609, -0.049853, -0.017399, -0.026273, 0.067159, 0.038073, -0.001139, 0.035208, -0.004469, - 0.003256, -0.016990, -0.035732, 0.007383, -0.008571, 0.035845, 0.001342, -0.044676, -0.026119, - -0.011713, 0.100783, 0.039060, 0.010369, -0.038468, 0.000508, 0.035371, -0.060206, -0.017911, - 0.013734, 0.061755, 0.056687, -0.045301, -0.018332, -0.005401, -0.037045, -0.036061, -0.014314, - -0.021229, -0.045131, -0.036103, -0.057760, -0.000910, -0.046857, -0.025479, -0.035232, -0.005124, - -0.008736, -0.054195, -0.007913, -0.013583, -0.015723, 0.013518, -0.035460, -0.006379, 0.046137, - -0.068690, -0.040330, -0.012012, -0.023585, 0.006608, 0.017777, -0.017138, 0.014081, -0.032258, - -0.024568, 0.002588, 0.014212, 0.063051, 0.094210, -0.024004, -0.032456, 0.010886, -0.065248, - 0.013686, 0.014057, -0.020287, 0.058919, 0.059929, -0.032073, 0.022497, 0.009902, -0.034975, - 0.016077, 0.078963, 0.147008, 0.034940, 0.030392, 0.002531, -0.061841, 0.004428, 0.010624, - -0.001494, 0.003395, -0.015666, -0.001281, -0.015388, 0.069651, 0.034933, 0.029121, 0.000683, - 0.047505, 0.014790, -0.055717, -0.006547, -0.063399, -0.043496, 0.011870, 0.042906, 0.006878, - -0.066191, -0.037985, -0.042766, -0.025162, -0.044404, 0.051964, 0.034720, 0.003909, -0.036374, - -0.008584, 0.037746, -0.031857, 0.013219, 0.008350, 0.015735, -0.031724, -0.048059, 0.011123, - 0.009654, 0.016214, 0.010496, 0.007397, -0.019941, -0.033647, -0.002490, 0.025962, 0.008321, - -0.022900, 0.057128, 0.036851, 0.073445, 0.017736, 0.017628, -0.022192, -0.015158, -0.046229, - -0.025645, -0.002318, 0.041499, 0.031071, 0.060203, 0.031473, 0.070811, -0.027596, -0.047924, - -0.026691, -0.073695, -0.071690, -0.068308, -0.043535, -0.025213, 0.026725, -0.000752, -0.020260, - -0.108919, -0.038652, 0.005704, 0.054819, 0.032720, 0.033638, 0.008457, 0.019632, -0.005139, - -0.071545, -0.009296, -0.023459, 0.045192, 0.020396, -0.006741, 0.021728, 0.031651, -0.014083, - -0.035698, 0.000985, -0.025795, 0.036473, 0.017171, 0.024230, 0.032632, 0.016997, 0.018326, - -0.037940, 0.012326, -0.003490, -0.017554, -0.020910, 0.026235, -0.010174, 0.004190, 0.066891, - 0.003469, -0.011130, -0.004150, 0.040006, 0.015873, 0.016114, 0.073338, 0.062341, 0.080658, - -0.003670, -0.023088, -0.035622, -0.045461, -0.046672, -0.049238, -0.011801, -0.020488, -0.055712, - -0.037817, -0.052436, -0.023193, 0.005549, 0.034550, 0.029897, -0.002000, 0.005016, -0.058663, - 0.016216, -0.011718, -0.040894, -0.005904, 0.033699, 0.008259, -0.023033, -0.021301, -0.064410, - 0.072452, 0.025901, -0.024832, -0.010907, 0.005683, 0.001193, 0.010009, 0.008570, -0.037345, - -0.010127, 0.062549, 0.040198, 0.012392, -0.044787, -0.007424, -0.028538, 0.009788, -0.001124, - -0.006418, 0.025437, 0.046089, 0.053013, 0.067599, 0.024783, 0.018958, 0.033403, 0.014570, - 0.003469, -0.011130, -0.004150, 0.040006, 0.015873, 0.016114, 0.073338, 0.062341, 0.080658, - -0.037940, 0.012326, -0.003490, -0.017554, -0.020910, 0.026235, -0.010174, 0.004190, 0.066891, - -0.035698, 0.000985, -0.025795, 0.036473, 0.017171, 0.024230, 0.032632, 0.016997, 0.018326, - -0.071545, -0.009296, -0.023459, 0.045192, 0.020396, -0.006741, 0.021728, 0.031651, -0.014083, - -0.108919, -0.038652, 0.005704, 0.054819, 0.032720, 0.033638, 0.008457, 0.019632, -0.005139, - -0.026691, -0.073695, -0.071690, -0.068308, -0.043535, -0.025213, 0.026725, -0.000752, -0.020260, - -0.006418, 0.025437, 0.046089, 0.053013, 0.067599, 0.024783, 0.018958, 0.033403, 0.014570, - -0.010127, 0.062549, 0.040198, 0.012392, -0.044787, -0.007424, -0.028538, 0.009788, -0.001124, - 0.072452, 0.025901, -0.024832, -0.010907, 0.005683, 0.001193, 0.010009, 0.008570, -0.037345, - 0.016216, -0.011718, -0.040894, -0.005904, 0.033699, 0.008259, -0.023033, -0.021301, -0.064410, - -0.037817, -0.052436, -0.023193, 0.005549, 0.034550, 0.029897, -0.002000, 0.005016, -0.058663, - -0.003670, -0.023088, -0.035622, -0.045461, -0.046672, -0.049238, -0.011801, -0.020488, -0.055712, - 11.000000, 4.000000, 31.000000, - 0.026959, 0.018789, 0.042944, 0.017043, 0.015888, 0.048672, 0.024571, -0.040523, -0.012724, 0.024320, -0.037690, - 0.006851, -0.001008, -0.082585, 0.006095, 0.042653, 0.000095, -0.072375, -0.039108, -0.010522, 0.088234, 0.032501, - 0.015557, 0.000628, -0.028918, -0.040139, -0.025942, -0.000420, 0.002144, 0.008478, -0.010360, 0.114391, 0.059169, - 0.031612, -0.000632, -0.032783, -0.005592, -0.020886, 0.034695, 0.031287, -0.023320, -0.024480, 0.059706, 0.025361, - -0.041027, -0.074064, -0.028377, 0.042180, 0.035618, -0.001354, -0.030550, -0.017221, 0.039263, -0.022900, -0.081364, - -0.045668, -0.043493, -0.055829, -0.015243, 0.041388, 0.019410, 0.012530, 0.062092, 0.098568, 0.056741, 0.013171, - -0.075837, -0.002488, 0.012937, -0.066006, -0.004504, -0.037036, -0.007607, 0.027855, 0.014973, 0.038700, -0.029747, - -0.052172, -0.043358, -0.072468, -0.033660, 0.040678, 0.040686, -0.024958, 0.055793, 0.033217, 0.031532, 0.028715, - -0.062712, -0.001191, 0.055282, -0.008137, 0.051614, 0.055700, 0.004928, -0.016025, 0.005973, 0.014967, -0.028208, - 0.026883, 0.025917, 0.024114, -0.081222, 0.053809, 0.051994, 0.003041, 0.050551, 0.023345, 0.002800, 0.032614, - -0.056491, 0.051745, 0.049455, -0.035378, 0.016229, 0.004374, -0.007766, -0.047357, -0.012777, 0.020136, 0.021379, - -0.009360, 0.026255, -0.027818, -0.020193, 0.040158, 0.022575, -0.044697, -0.077420, 0.002135, -0.007576, 0.088198, - -0.042358, -0.035816, -0.007672, -0.100801, -0.009487, -0.028157, -0.019524, -0.020399, 0.015715, 0.002007, -0.036633, - 0.065819, 0.004179, 0.081253, -0.045338, 0.011303, -0.004206, 0.037433, 0.016127, -0.027942, -0.009665, -0.009202, - -0.048637, 0.010262, 0.090198, -0.058766, -0.000880, 0.014346, -0.016366, -0.022276, -0.004665, 0.004818, -0.007782, - -0.022508, -0.009890, -0.040296, -0.018851, -0.019146, 0.019450, -0.006134, 0.004554, 0.016312, 0.013049, 0.075997, - -0.055455, 0.015208, 0.025569, 0.022289, 0.046640, -0.077974, -0.014235, -0.020535, -0.048962, -0.036250, -0.007843, - 0.039788, 0.019203, 0.064874, 0.034438, 0.016820, -0.048326, -0.029147, -0.029366, -0.021249, -0.051077, 0.057799, - 0.003148, 0.005813, 0.035566, -0.001593, -0.026311, -0.051256, 0.000637, -0.011114, -0.006711, 0.000111, 0.021488, - -0.091648, 0.007046, 0.019374, 0.018817, 0.028374, 0.010705, 0.024408, 0.044816, -0.032952, 0.051952, 0.018429, - -0.091648, 0.007046, 0.019374, 0.018817, 0.028374, 0.010705, 0.024408, 0.044816, -0.032952, 0.051952, 0.018429, - 0.003148, 0.005813, 0.035566, -0.001593, -0.026311, -0.051256, 0.000637, -0.011114, -0.006711, 0.000111, 0.021488, - 0.039788, 0.019203, 0.064874, 0.034438, 0.016820, -0.048326, -0.029147, -0.029366, -0.021249, -0.051077, 0.057799, - -0.055455, 0.015208, 0.025569, 0.022289, 0.046640, -0.077974, -0.014235, -0.020535, -0.048962, -0.036250, -0.007843, - -0.022508, -0.009890, -0.040296, -0.018851, -0.019146, 0.019450, -0.006134, 0.004554, 0.016312, 0.013049, 0.075997, - -0.048637, 0.010262, 0.090198, -0.058766, -0.000880, 0.014346, -0.016366, -0.022276, -0.004665, 0.004818, -0.007782, - 0.065819, 0.004179, 0.081253, -0.045338, 0.011303, -0.004206, 0.037433, 0.016127, -0.027942, -0.009665, -0.009202, - -0.042358, -0.035816, -0.007672, -0.100801, -0.009487, -0.028157, -0.019524, -0.020399, 0.015715, 0.002007, -0.036633, - -0.009360, 0.026255, -0.027818, -0.020193, 0.040158, 0.022575, -0.044697, -0.077420, 0.002135, -0.007576, 0.088198, - -0.056491, 0.051745, 0.049455, -0.035378, 0.016229, 0.004374, -0.007766, -0.047357, -0.012777, 0.020136, 0.021379, - 0.026883, 0.025917, 0.024114, -0.081222, 0.053809, 0.051994, 0.003041, 0.050551, 0.023345, 0.002800, 0.032614, - -0.062712, -0.001191, 0.055282, -0.008137, 0.051614, 0.055700, 0.004928, -0.016025, 0.005973, 0.014967, -0.028208, - -0.052172, -0.043358, -0.072468, -0.033660, 0.040678, 0.040686, -0.024958, 0.055793, 0.033217, 0.031532, 0.028715, - -0.075837, -0.002488, 0.012937, -0.066006, -0.004504, -0.037036, -0.007607, 0.027855, 0.014973, 0.038700, -0.029747, - -0.045668, -0.043493, -0.055829, -0.015243, 0.041388, 0.019410, 0.012530, 0.062092, 0.098568, 0.056741, 0.013171, - -0.041027, -0.074064, -0.028377, 0.042180, 0.035618, -0.001354, -0.030550, -0.017221, 0.039263, -0.022900, -0.081364, - 0.031612, -0.000632, -0.032783, -0.005592, -0.020886, 0.034695, 0.031287, -0.023320, -0.024480, 0.059706, 0.025361, - 0.015557, 0.000628, -0.028918, -0.040139, -0.025942, -0.000420, 0.002144, 0.008478, -0.010360, 0.114391, 0.059169, - 0.006851, -0.001008, -0.082585, 0.006095, 0.042653, 0.000095, -0.072375, -0.039108, -0.010522, 0.088234, 0.032501, - 0.026959, 0.018789, 0.042944, 0.017043, 0.015888, 0.048672, 0.024571, -0.040523, -0.012724, 0.024320, -0.037690, - -0.038770, -0.055549, 0.029717, 0.042509, 0.023738, 0.068026, -0.014497, 0.076238, 0.052360, 0.064428, -0.062460, - 0.017867, 0.051409, 0.054966, -0.006948, -0.071462, 0.022829, 0.053757, 0.078843, 0.067884, 0.065782, -0.010679, - -0.007606, 0.070740, 0.031241, 0.058857, 0.002497, -0.031599, 0.008374, -0.037821, -0.036056, 0.000223, -0.040464, - 0.017140, 0.014779, 0.001225, -0.036413, -0.026116, 0.005511, 0.025999, 0.024990, 0.016881, 0.034545, -0.048919, - 0.025248, -0.035700, 0.007251, -0.005068, -0.037805, -0.039695, -0.051582, -0.021450, 0.065046, -0.030803, -0.021332, - -0.010767, 0.027885, 0.002326, -0.028243, -0.024647, 0.019672, 0.056917, 0.028798, 0.048030, -0.007077, -0.028339, - -0.082356, 0.013499, 0.043053, 0.007693, -0.032709, -0.004130, -0.003274, 0.012212, 0.012791, -0.060787, -0.043610, - -0.007447, 0.019570, 0.044826, 0.031751, -0.010427, -0.003395, 0.033549, 0.061155, 0.015204, -0.022470, -0.027566, - -0.033817, -0.060643, -0.049747, -0.029915, -0.005910, -0.000511, 0.013246, 0.007726, -0.013652, 0.009568, 0.006497, - 0.079853, 0.092510, -0.006548, -0.009086, 0.024383, 0.054310, -0.003151, -0.014733, -0.013054, -0.000311, 0.041359, - 0.020383, 0.024037, 0.009286, 0.081503, 0.036364, 0.026866, -0.004318, -0.027239, 0.031326, 0.015756, 0.010290, - -0.036790, 0.012262, -0.002440, 0.011112, -0.024680, 0.019655, 0.071398, 0.031153, -0.025788, 0.032089, -0.005348, - -0.037781, -0.031168, -0.022212, 0.002014, -0.020758, -0.004165, -0.017036, 0.014659, -0.035609, -0.061098, 0.021330, - 0.046144, -0.002111, -0.059654, 0.001699, -0.063455, -0.010160, 0.006319, -0.035854, -0.044130, -0.016756, -0.017006, - 0.006068, -0.039913, -0.063411, 0.003948, -0.045613, 0.030166, -0.000487, -0.006489, 0.016100, 0.016336, -0.030315, - -0.005161, 0.026315, -0.086859, -0.003925, -0.010548, 0.022836, 0.006078, 0.021449, 0.001491, -0.028692, -0.013197, - -0.005161, 0.026315, -0.086859, -0.003925, -0.010548, 0.022836, 0.006078, 0.021449, 0.001491, -0.028692, -0.013197, - 0.006068, -0.039913, -0.063411, 0.003948, -0.045613, 0.030166, -0.000487, -0.006489, 0.016100, 0.016336, -0.030315, - 0.046144, -0.002111, -0.059654, 0.001699, -0.063455, -0.010160, 0.006319, -0.035854, -0.044130, -0.016756, -0.017006, - -0.037781, -0.031168, -0.022212, 0.002014, -0.020758, -0.004165, -0.017036, 0.014659, -0.035609, -0.061098, 0.021330, - -0.036790, 0.012262, -0.002440, 0.011112, -0.024680, 0.019655, 0.071398, 0.031153, -0.025788, 0.032089, -0.005348, - 0.020383, 0.024037, 0.009286, 0.081503, 0.036364, 0.026866, -0.004318, -0.027239, 0.031326, 0.015756, 0.010290, - 0.079853, 0.092510, -0.006548, -0.009086, 0.024383, 0.054310, -0.003151, -0.014733, -0.013054, -0.000311, 0.041359, - -0.033817, -0.060643, -0.049747, -0.029915, -0.005910, -0.000511, 0.013246, 0.007726, -0.013652, 0.009568, 0.006497, - -0.007447, 0.019570, 0.044826, 0.031751, -0.010427, -0.003395, 0.033549, 0.061155, 0.015204, -0.022470, -0.027566, - -0.082356, 0.013499, 0.043053, 0.007693, -0.032709, -0.004130, -0.003274, 0.012212, 0.012791, -0.060787, -0.043610, - -0.010767, 0.027885, 0.002326, -0.028243, -0.024647, 0.019672, 0.056917, 0.028798, 0.048030, -0.007077, -0.028339, - 0.025248, -0.035700, 0.007251, -0.005068, -0.037805, -0.039695, -0.051582, -0.021450, 0.065046, -0.030803, -0.021332, - 0.017140, 0.014779, 0.001225, -0.036413, -0.026116, 0.005511, 0.025999, 0.024990, 0.016881, 0.034545, -0.048919, - -0.007606, 0.070740, 0.031241, 0.058857, 0.002497, -0.031599, 0.008374, -0.037821, -0.036056, 0.000223, -0.040464, - 0.017867, 0.051409, 0.054966, -0.006948, -0.071462, 0.022829, 0.053757, 0.078843, 0.067884, 0.065782, -0.010679, - -0.038770, -0.055549, 0.029717, 0.042509, 0.023738, 0.068026, -0.014497, 0.076238, 0.052360, 0.064428, -0.062460, - 0.009136, 0.027281, 0.049760, 0.122861, 0.056537, 0.098337, 0.076522, 0.031147, 0.077289, 0.073231, -0.048546, - 0.011388, 0.049844, -0.017363, 0.070164, 0.051477, 0.058404, 0.042970, 0.042372, -0.013257, 0.098432, -0.022327, - 0.011388, 0.049844, -0.017363, 0.070164, 0.051477, 0.058404, 0.042970, 0.042372, -0.013257, 0.098432, -0.022327, - 0.009136, 0.027281, 0.049760, 0.122861, 0.056537, 0.098337, 0.076522, 0.031147, 0.077289, 0.073231, -0.048546, - -0.064946, -0.071474, 0.047868, 0.141123, 0.087700, 0.081676, -0.039895, 0.055398, 0.049258, 0.007032, -0.130573, - 0.025445, 0.054779, 0.014237, 0.009336, -0.041560, 0.048092, 0.007532, 0.034617, 0.066234, 0.089714, -0.003258, - -0.048476, 0.060481, 0.006214, 0.021465, -0.009781, -0.023464, 0.065495, 0.034086, 0.042981, 0.044939, -0.065205, - -0.035276, -0.022890, -0.039738, -0.033349, 0.002783, 0.011881, 0.019853, 0.077732, 0.035712, 0.058194, -0.051716, - -0.021011, -0.000965, 0.134989, 0.037499, -0.030783, -0.036686, -0.052658, -0.032412, 0.022550, 0.001769, -0.045035, - 0.053074, 0.109147, 0.073701, -0.067595, -0.004059, 0.006991, 0.021336, 0.053793, 0.057480, 0.010838, 0.031367, - -0.115460, 0.078894, 0.033722, -0.038896, -0.026315, -0.014508, -0.015290, -0.043473, 0.010703, -0.009410, 0.001914, - -0.015106, 0.018901, -0.002242, 0.001056, 0.002942, -0.049548, -0.023609, -0.040090, -0.008756, -0.036891, 0.040510, - -0.050268, -0.048287, -0.006372, -0.124684, -0.040822, -0.050565, -0.051562, -0.051689, -0.028916, -0.003366, -0.042004, - 0.120285, 0.095001, 0.077086, -0.054929, -0.005894, 0.022576, 0.011661, -0.004611, -0.050116, -0.029677, -0.017092, - -0.032935, 0.018413, 0.051477, 0.023157, 0.018111, 0.035155, -0.003049, -0.056355, 0.007395, -0.017478, -0.026208, - -0.038422, 0.017385, -0.052263, -0.019699, -0.064965, 0.001865, 0.023191, 0.003918, -0.018386, -0.031928, 0.017386, - -0.053974, 0.017144, 0.012935, -0.001089, -0.014762, -0.051617, -0.003208, -0.050147, -0.039075, -0.065035, -0.038360, - 0.084970, 0.062897, 0.018053, 0.000909, -0.037235, -0.017189, 0.018261, -0.091209, -0.055122, -0.074069, -0.070717, - 0.044408, -0.027451, -0.008272, -0.023838, -0.043009, 0.036954, 0.064543, -0.052581, 0.009735, -0.033696, -0.051641, - -0.067015, -0.001121, -0.053008, -0.010822, 0.010371, 0.059171, 0.044217, 0.005563, 0.023205, 0.003411, -0.030635, - -0.067015, -0.001121, -0.053008, -0.010822, 0.010371, 0.059171, 0.044217, 0.005563, 0.023205, 0.003411, -0.030635, - 0.044408, -0.027451, -0.008272, -0.023838, -0.043009, 0.036954, 0.064543, -0.052581, 0.009735, -0.033696, -0.051641, - 0.084970, 0.062897, 0.018053, 0.000909, -0.037235, -0.017189, 0.018261, -0.091209, -0.055122, -0.074069, -0.070717, - -0.053974, 0.017144, 0.012935, -0.001089, -0.014762, -0.051617, -0.003208, -0.050147, -0.039075, -0.065035, -0.038360, - -0.038422, 0.017385, -0.052263, -0.019699, -0.064965, 0.001865, 0.023191, 0.003918, -0.018386, -0.031928, 0.017386, - -0.032935, 0.018413, 0.051477, 0.023157, 0.018111, 0.035155, -0.003049, -0.056355, 0.007395, -0.017478, -0.026208, - 0.120285, 0.095001, 0.077086, -0.054929, -0.005894, 0.022576, 0.011661, -0.004611, -0.050116, -0.029677, -0.017092, - -0.050268, -0.048287, -0.006372, -0.124684, -0.040822, -0.050565, -0.051562, -0.051689, -0.028916, -0.003366, -0.042004, - -0.015106, 0.018901, -0.002242, 0.001056, 0.002942, -0.049548, -0.023609, -0.040090, -0.008756, -0.036891, 0.040510, - -0.115460, 0.078894, 0.033722, -0.038896, -0.026315, -0.014508, -0.015290, -0.043473, 0.010703, -0.009410, 0.001914, - 0.053074, 0.109147, 0.073701, -0.067595, -0.004059, 0.006991, 0.021336, 0.053793, 0.057480, 0.010838, 0.031367, - -0.021011, -0.000965, 0.134989, 0.037499, -0.030783, -0.036686, -0.052658, -0.032412, 0.022550, 0.001769, -0.045035, - -0.035276, -0.022890, -0.039738, -0.033349, 0.002783, 0.011881, 0.019853, 0.077732, 0.035712, 0.058194, -0.051716, - -0.048476, 0.060481, 0.006214, 0.021465, -0.009781, -0.023464, 0.065495, 0.034086, 0.042981, 0.044939, -0.065205, - 0.025445, 0.054779, 0.014237, 0.009336, -0.041560, 0.048092, 0.007532, 0.034617, 0.066234, 0.089714, -0.003258, - -0.064946, -0.071474, 0.047868, 0.141123, 0.087700, 0.081676, -0.039895, 0.055398, 0.049258, 0.007032, -0.130573, - -0.113930, -0.091797, -0.033616, -0.037951, -0.006268, 0.017121, -0.013633, 0.000864, -0.039789, -0.051632, -0.025088, - -0.063760, 0.012461, 0.083876, 0.037483, 0.084656, 0.070686, 0.048165, 0.039070, 0.018610, 0.026091, 0.044440, - -0.017497, 0.020408, 0.017448, -0.056339, -0.037200, -0.000360, 0.002198, -0.005104, 0.001198, 0.049665, 0.093718, - -0.028371, 0.011735, -0.002689, 0.020721, 0.072718, 0.093836, 0.054295, 0.058903, 0.056000, 0.104780, 0.111881, - -0.041345, -0.059559, -0.070004, -0.040649, -0.049118, -0.042441, -0.052027, -0.029867, -0.014400, -0.049724, -0.128442, - 0.027095, 0.025962, -0.021637, -0.021791, 0.002591, 0.050679, 0.023601, 0.014533, 0.043938, 0.036681, -0.057847, - 0.054634, 0.086744, 0.015688, -0.050679, -0.073653, -0.094170, -0.056683, -0.042088, -0.004560, 0.018779, -0.046074, - -0.021906, 0.041671, 0.038199, 0.022599, 0.028368, 0.022587, 0.017139, 0.019899, 0.030918, 0.057093, -0.008334, - -0.028371, 0.011735, -0.002689, 0.020721, 0.072718, 0.093836, 0.054295, 0.058903, 0.056000, 0.104780, 0.111881, - -0.017497, 0.020408, 0.017448, -0.056339, -0.037200, -0.000360, 0.002198, -0.005104, 0.001198, 0.049665, 0.093718, - -0.063760, 0.012461, 0.083876, 0.037483, 0.084656, 0.070686, 0.048165, 0.039070, 0.018610, 0.026091, 0.044440, - -0.113930, -0.091797, -0.033616, -0.037951, -0.006268, 0.017121, -0.013633, 0.000864, -0.039789, -0.051632, -0.025088, - -0.021906, 0.041671, 0.038199, 0.022599, 0.028368, 0.022587, 0.017139, 0.019899, 0.030918, 0.057093, -0.008334, - 0.054634, 0.086744, 0.015688, -0.050679, -0.073653, -0.094170, -0.056683, -0.042088, -0.004560, 0.018779, -0.046074, - 0.027095, 0.025962, -0.021637, -0.021791, 0.002591, 0.050679, 0.023601, 0.014533, 0.043938, 0.036681, -0.057847, - -0.041345, -0.059559, -0.070004, -0.040649, -0.049118, -0.042441, -0.052027, -0.029867, -0.014400, -0.049724, -0.128442, diff --git a/ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/interface.yaml b/ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/interface.yaml deleted file mode 100644 index 7b0ad987636..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/interface.yaml +++ /dev/null @@ -1,3 +0,0 @@ -- name: dpm_ttic - publish: [/obj_X/image_obj] - subscribe: [/config/obj_X/dpm, /image_raw] diff --git a/ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/launch/vision_dpm_ttic_detect.launch b/ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/launch/vision_dpm_ttic_detect.launch deleted file mode 100644 index 1137357e54d..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/launch/vision_dpm_ttic_detect.launch +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/nodes/vision_dpm_ttic_detect/vision_dpm_ttic_detect.cpp b/ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/nodes/vision_dpm_ttic_detect/vision_dpm_ttic_detect.cpp deleted file mode 100644 index 55526befa27..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/nodes/vision_dpm_ttic_detect/vision_dpm_ttic_detect.cpp +++ /dev/null @@ -1,198 +0,0 @@ -/* - * Copyright 2015-2019 Autoware Foundation. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include - -#include -#include -#include - -#include "autoware_msgs/ImageObj.h" -#include "autoware_config_msgs/ConfigPedestrianDPM.h" - -#include - -#define XSTR(x) #x -#define STR(x) XSTR(x) - -static ros::Publisher image_obj_pub; - -#if defined(HAS_GPU) -static DPMTTICGPU *gpu_model; -static bool use_gpu = true; -#endif -static DPMTTIC *ttic_model; - -static DPMTTICParam ttic_param; - -static std::string object_class;static long int counter; - -static std::string image_topic_name; - -static void set_default_param(DPMTTICParam& param) -{ - param.overlap = 0.4; - param.threshold = -0.5; - param.lambda = 10; - param.num_cells = 8;counter =0; -} - -static void result_to_image_obj_message(autoware_msgs::ImageObj& msg, const DPMTTICResult result) -{ - for (int i = 0; i < result.num; ++i) { - autoware_msgs::ImageRect rect; - - int base = i * 4; - rect.x = result.corner_points[base]; - rect.y = result.corner_points[base+1]; - rect.width = result.corner_points[base+2]; - rect.height = result.corner_points[base+3]; - rect.score = result.score[i]; - - msg.obj.push_back(rect); - } -} - -static void image_raw_cb(const sensor_msgs::Image& image_source) -{ - - cv_bridge::CvImagePtr cv_image = cv_bridge::toCvCopy(image_source, sensor_msgs::image_encodings::BGR8); - IplImage img = cv_image->image; - IplImage *img_ptr = &img; - - autoware_msgs::ImageObj msg; - msg.header = image_source.header; - msg.type = object_class; - -#if defined(HAS_GPU) - if (use_gpu) { - DPMTTICResult result = gpu_model->detect_objects(img_ptr, ttic_param); - result_to_image_obj_message(msg, result); - } else { -#endif - DPMTTICResult result = ttic_model->detect_objects(img_ptr, ttic_param); - result_to_image_obj_message(msg, result); -#if defined(HAS_GPU) - } -#endif - - image_obj_pub.publish(msg); - counter++; -} - -static void config_cb(const autoware_config_msgs::ConfigPedestrianDPM::ConstPtr& param) -{ - ttic_param.threshold = param->score_threshold; - ttic_param.overlap = param->group_threshold; - ttic_param.lambda = param->Lambda; - ttic_param.num_cells = param->num_cells; -} - -#if defined(HAS_GPU) -static std::string get_cubin_path(const ros::NodeHandle& n, const char *default_path) -{ - std::string path; - if (n.hasParam("/car_detector/cubin")) { - n.getParam("/car_detector/cubin", path); - } else { - path = std::string(default_path); - } - - return path; -} -#endif - -int main(int argc, char* argv[]) -{ - ros::init(argc, argv, "dpm_ttic"); - - ros::NodeHandle n; - ros::NodeHandle private_nh("~"); - - if (!private_nh.getParam("image_raw_topic", image_topic_name)) { - image_topic_name = "/image_raw"; - } - - if (!private_nh.getParam("detection_class_name", object_class)) { - object_class = "car"; - } - - std::string comp_csv_path; - if (!private_nh.getParam("comp_model_path", comp_csv_path)) { - comp_csv_path = STR(MODEL_DIR) "car_comp.csv"; - } - - std::string root_csv_path; - if (!private_nh.getParam("root_model_path", root_csv_path)) { - root_csv_path = STR(MODEL_DIR) "car_root.csv"; - } - - std::string part_csv_path; - if (!private_nh.getParam("part_model_path", part_csv_path)) { - part_csv_path = STR(MODEL_DIR) "car_part.csv"; - } - -#if defined(HAS_GPU) - if (!private_nh.getParam("use_gpu", use_gpu)) { - use_gpu = false; - } - - std::string cubin = get_cubin_path(n, STR(DEFAULT_CUBIN)); - if (use_gpu) { - dpm_ttic_gpu_init_cuda(cubin); - } -#endif - - set_default_param(ttic_param); - - const char *com_csv = comp_csv_path.c_str(); - const char *root_csv = root_csv_path.c_str(); - const char *part_csv = part_csv_path.c_str(); - -#if defined(HAS_GPU) - if (use_gpu) { - gpu_model = new DPMTTICGPU(com_csv, root_csv, part_csv); - } else { -#endif - ttic_model = new DPMTTIC(com_csv, root_csv, part_csv); -#if defined(HAS_GPU) - } -#endif - - ros::Subscriber sub = n.subscribe(image_topic_name, 1, image_raw_cb); - image_obj_pub = n.advertise("image_obj", 1); - - ros::Subscriber config_sub; - std::string config_topic("/config"); - config_topic += ros::this_node::getNamespace() + "/dpm"; - config_sub = n.subscribe(config_topic, 1, config_cb); - - ros::spin(); -#if defined(HAS_GPU) - if (use_gpu) { - dpm_ttic_gpu_cleanup_cuda(); - delete gpu_model; - } else { -#endif - delete ttic_model; -#if defined(HAS_GPU) - } -#endif - - return 0; -} diff --git a/ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/package.xml b/ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/package.xml deleted file mode 100644 index bb8316e30f6..00000000000 --- a/ros/src/computing/perception/detection/vision_detector/packages/vision_dpm_ttic_detect/package.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - vision_dpm_ttic_detect - 1.11.0 - The vision_dpm_ttic_detect package - amc - Apache 2 - - catkin - autoware_build_flags - - cv_bridge - roscpp - sensor_msgs - std_msgs - autoware_config_msgs - autoware_msgs - libdpm_ttic - libopencv-dev - - cv_bridge - roscpp - sensor_msgs - std_msgs - autoware_config_msgs - autoware_msgs - libdpm_ttic - libopencv-dev - - diff --git a/ros/src/computing/perception/detection/vision_detector/packages/vision_segment_enet_detect/CMakeLists.txt b/ros/src/computing/perception/detection/vision_detector/packages/vision_segment_enet_detect/CMakeLists.txt index 76aa0feb22f..7ead5c8c5ef 100644 --- a/ros/src/computing/perception/detection/vision_detector/packages/vision_segment_enet_detect/CMakeLists.txt +++ b/ros/src/computing/perception/detection/vision_detector/packages/vision_segment_enet_detect/CMakeLists.txt @@ -31,6 +31,15 @@ INCLUDE_DIRECTORIES( ##############################ENet's CAFFE FORK NEEDS TO BE PREVIOUSLY COMPILED#################### set(ENET_CAFFE_PATH "$ENV{HOME}/ENet/caffe-enet/distribute") #################################################################################################### +####### Melodic Checks +SET (CPU_ONLY FALSE) +if (NOT CPU_ONLY AND CUDA_FOUND AND "$ENV{ROS_DISTRO}" STREQUAL "melodic" ) + if(${CMAKE_VERSION} VERSION_LESS "3.12.3") + message("GPU support on Melodic requires CMake version>= 3.12.3") + SET (CPU_ONLY TRUE) + endif() +endif() +####### End Melodic Checks if (EXISTS "${ENET_CAFFE_PATH}" AND ${CUDA_FOUND}) ADD_EXECUTABLE(vision_segment_enet_detect diff --git a/ros/src/computing/perception/detection/vision_detector/packages/vision_ssd_detect/CMakeLists.txt b/ros/src/computing/perception/detection/vision_detector/packages/vision_ssd_detect/CMakeLists.txt index 88097122ee7..b861e0a24d4 100644 --- a/ros/src/computing/perception/detection/vision_detector/packages/vision_ssd_detect/CMakeLists.txt +++ b/ros/src/computing/perception/detection/vision_detector/packages/vision_ssd_detect/CMakeLists.txt @@ -42,21 +42,28 @@ include_directories( ${catkin_INCLUDE_DIRS} ) -IF (CUDA_FOUND) - include_directories(${CUDA_INCLUDE_DIRS}) - - IF ("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "^arm") - link_directories(/usr/lib/arm-linux-gnueabihf/tegra) - endif () -ENDIF () - #####SSD######## ##############################SSD'sFORK of CAFFE NEEDS TO BE PREVIOUSLY COMPILED#################### set(SSD_CAFFE_PATH "$ENV{HOME}/ssdcaffe/distribute") #################################################################################################### -if (EXISTS "${SSD_CAFFE_PATH}") +####### Melodic Checks +SET (CPU_ONLY FALSE) +if (CUDA_FOUND AND "$ENV{ROS_DISTRO}" STREQUAL "melodic" ) + if(${CMAKE_VERSION} VERSION_LESS "3.12.3") + message("GPU support on Melodic requires CMake version>= 3.12.3") + SET (CPU_ONLY TRUE) + endif() +endif() +####### End Melodic Checks + +if (NOT CPU_ONLY AND ${CUDA_FOUND} AND EXISTS "${SSD_CAFFE_PATH}") + include_directories(${CUDA_INCLUDE_DIRS}) + + IF ("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "^arm") + link_directories(/usr/lib/arm-linux-gnueabihf/tegra) + endif () add_executable(vision_ssd_detect src/vision_ssd_detect.cpp src/vision_ssd_detect_node.cpp diff --git a/ros/src/computing/perception/detection/vision_detector/packages/vision_ssd_detect/package.xml b/ros/src/computing/perception/detection/vision_detector/packages/vision_ssd_detect/package.xml index 47f97d101a6..3eaf26ad413 100644 --- a/ros/src/computing/perception/detection/vision_detector/packages/vision_ssd_detect/package.xml +++ b/ros/src/computing/perception/detection/vision_detector/packages/vision_ssd_detect/package.xml @@ -17,7 +17,6 @@ std_msgs autoware_msgs autoware_config_msgs - libdpm_ttic tf gnss libopencv-dev @@ -30,7 +29,6 @@ std_msgs autoware_msgs autoware_config_msgs - libdpm_ttic tf gnss libopencv-dev diff --git a/ros/src/computing/perception/localization/lib/ndt_gpu/CMakeLists.txt b/ros/src/computing/perception/localization/lib/ndt_gpu/CMakeLists.txt index 41cfba3c6ef..94be2362b22 100644 --- a/ros/src/computing/perception/localization/lib/ndt_gpu/CMakeLists.txt +++ b/ros/src/computing/perception/localization/lib/ndt_gpu/CMakeLists.txt @@ -7,6 +7,21 @@ find_package(CUDA) find_package(Eigen3 QUIET) +####### Melodic Checks +SET (CPU_ONLY FALSE) +if (CUDA_FOUND AND "$ENV{ROS_DISTRO}" STREQUAL "melodic" ) + if(${CMAKE_VERSION} VERSION_LESS "3.12.3") + message("GPU support on Melodic requires CMake version>= 3.12.3") + SET (CPU_ONLY TRUE) + else() + if (${EIGEN3_VERSION_STRING} VERSION_LESS "3.3.5") + message("GPU support on Melodic requires Eigen version>= 3.3.5") + SET (CPU_ONLY TRUE) + endif() + endif() +endif() +####### End Melodic Checks + if (NOT EIGEN3_FOUND) # Fallback to cmake_modules find_package(cmake_modules REQUIRED) @@ -18,7 +33,7 @@ else () set(EIGEN3_INCLUDE_DIRS ${EIGEN3_INCLUDE_DIR}) endif () -if (CUDA_FOUND) +if (NOT CPU_ONLY AND CUDA_FOUND) set_directory_properties(PROPERTIES COMPILE_DEFINITIONS "") if(CMAKE_CROSSCOMPILING) diff --git a/ros/src/computing/perception/localization/packages/lidar_localizer/CMakeLists.txt b/ros/src/computing/perception/localization/packages/lidar_localizer/CMakeLists.txt index 493777efbb3..83564575352 100644 --- a/ros/src/computing/perception/localization/packages/lidar_localizer/CMakeLists.txt +++ b/ros/src/computing/perception/localization/packages/lidar_localizer/CMakeLists.txt @@ -14,14 +14,28 @@ if (OPENMP_FOUND) endif () find_package(CUDA) +find_package(Eigen3 QUIET) -if (CUDA_FOUND) +####### Melodic Checks +SET (CPU_ONLY FALSE) +if (CUDA_FOUND AND "$ENV{ROS_DISTRO}" STREQUAL "melodic" ) + if(${CMAKE_VERSION} VERSION_LESS "3.12.3") + message("GPU support on Melodic requires CMake version>= 3.12.3") + SET (CPU_ONLY TRUE) + else() + if (${EIGEN3_VERSION_STRING} VERSION_LESS "3.3.5") + message("GPU support on Melodic requires Eigen version>= 3.3.5") + SET (CPU_ONLY TRUE) + endif() + endif() +endif() +####### End Melodic Checks + +if (NOT CPU_ONLY AND CUDA_FOUND) add_definitions(-DCUDA_FOUND) list(APPEND PCL_OPENMP_PACKAGES ndt_gpu) endif () -find_package(Eigen3 QUIET) - if (NOT EIGEN3_FOUND) # Fallback to cmake_modules find_package(cmake_modules REQUIRED) @@ -91,7 +105,7 @@ add_executable(ndt_mapping nodes/ndt_mapping/ndt_mapping.cpp) target_link_libraries(ndt_mapping ${catkin_LIBRARIES}) add_dependencies(ndt_mapping ${catkin_EXPORTED_TARGETS}) -if (CUDA_FOUND) +if (NOT CPU_ONLY AND CUDA_FOUND) target_include_directories(ndt_matching PRIVATE ${CUDA_INCLUDE_DIRS}) target_include_directories(ndt_mapping PRIVATE ${CUDA_INCLUDE_DIRS}) endif () diff --git a/ros/src/computing/planning/motion/packages/dp_planner/nodes/dp_planner_core.cpp b/ros/src/computing/planning/motion/packages/dp_planner/nodes/dp_planner_core.cpp index 541c8f66577..5fc59ead85b 100644 --- a/ros/src/computing/planning/motion/packages/dp_planner/nodes/dp_planner_core.cpp +++ b/ros/src/computing/planning/motion/packages/dp_planner/nodes/dp_planner_core.cpp @@ -765,30 +765,6 @@ void PlannerX::PlannerMainLoop() ROSHelpers::ConvertFromPlannerHToAutowareVisualizePathFormat(m_LocalPlanner.m_Path, m_LocalPlanner.m_RollOuts, m_LocalPlanner, all_rollOuts); pub_LocalTrajectoriesRviz.publish(all_rollOuts); - //Publish markers that visualize only when avoiding objects - if(enablePlannerDynamicSwitch){ - visualization_msgs::MarkerArray all_rollOuts_dynamic; - std_msgs::Int32 enableLattice; - if(iDirection != 0) { // if obstacle avoidance state, - all_rollOuts_dynamic = all_rollOuts; - - for(auto &ro : all_rollOuts_dynamic.markers){ - ro.ns = "global_lane_array_marker_dynamic"; - } - pub_LocalTrajectoriesRviz_dynamic.publish(all_rollOuts_dynamic); - enableLattice.data = 1; - }else{ - visualization_msgs::Marker delMarker; - delMarker.action = visualization_msgs::Marker::DELETEALL; - delMarker.ns = "global_lane_array_marker_dynamic"; - all_rollOuts_dynamic.markers.push_back(delMarker); - pub_LocalTrajectoriesRviz_dynamic.publish(all_rollOuts_dynamic); - enableLattice.data = 0; - } - pub_EnableLattice.publish(enableLattice); //Publish flag of object avoidance - } - - if(m_CurrentBehavior.bNewPlan) { std::ostringstream str_out; diff --git a/ros/src/driveworks/packages/autoware_driveworks_gmsl_interface/CMakeLists.txt b/ros/src/driveworks/packages/autoware_driveworks_gmsl_interface/CMakeLists.txt index cd50c3bac20..7ce1a627c15 100644 --- a/ros/src/driveworks/packages/autoware_driveworks_gmsl_interface/CMakeLists.txt +++ b/ros/src/driveworks/packages/autoware_driveworks_gmsl_interface/CMakeLists.txt @@ -2,8 +2,13 @@ cmake_minimum_required(VERSION 2.8.3) project(autoware_driveworks_gmsl_interface) find_package(CUDA) - -if ("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64" AND CUDA_FOUND) +find_library(DRIVEWORKS_FOUND NAMES driveworks) +find_library(NVMEDIA_FOUND NAMES nvmedia) +if ("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64" + AND CUDA_FOUND + AND DRIVEWORKS_FOUND + AND NVMEDIA_FOUND +) if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") set(DRIVEWORKS_LINKER_FLAGS "-Wl,--unresolved-symbols=ignore-in-object-files -Wl,--allow-shlib-undefined") elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang") diff --git a/ros/src/driveworks/packages/autoware_driveworks_interface/CMakeLists.txt b/ros/src/driveworks/packages/autoware_driveworks_interface/CMakeLists.txt index 031059681e8..c3306f2e0f7 100755 --- a/ros/src/driveworks/packages/autoware_driveworks_interface/CMakeLists.txt +++ b/ros/src/driveworks/packages/autoware_driveworks_interface/CMakeLists.txt @@ -18,8 +18,11 @@ find_package(CUDA) catkin_package( CATKIN_DEPENDS std_msgs sensor_msgs autoware_msgs ) - -if ("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64" AND CUDA_FOUND) +find_library(DRIVEWORKS_FOUND NAMES driveworks) +if ("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64" + AND CUDA_FOUND + AND DRIVEWORKS_FOUND +) if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") set(DRIVEWORKS_LINKER_FLAGS "-Wl,--unresolved-symbols=ignore-in-object-files -Wl,--allow-shlib-undefined") elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang") diff --git a/ros/src/sensing/drivers/camera/packages/pointgrey/package.xml b/ros/src/sensing/drivers/camera/packages/pointgrey/package.xml index 02e733f849e..b62c3bbfc47 100644 --- a/ros/src/sensing/drivers/camera/packages/pointgrey/package.xml +++ b/ros/src/sensing/drivers/camera/packages/pointgrey/package.xml @@ -26,7 +26,6 @@ image_transport v4l-utils - gstreamer1.0-plugins-good gscam diff --git a/ros/src/util/packages/runtime_manager/scripts/computing.yaml b/ros/src/util/packages/runtime_manager/scripts/computing.yaml index b9dab0bc822..aecf83c6658 100755 --- a/ros/src/util/packages/runtime_manager/scripts/computing.yaml +++ b/ros/src/util/packages/runtime_manager/scripts/computing.yaml @@ -126,31 +126,6 @@ subs : desc : vision_detector desc sample subs : - - name : vision_dpm_ttic_detect - desc : vision_dpm_ttic_detect desc sample - cmd : roslaunch vision_dpm_ttic_detect vision_dpm_ttic_detect.launch - param: dpm_ttic - gui : - flags : [ open_dialog, need_camera_info ] - config_dialog : MyDialogCarPedestrian - car_pedestrian_obj_key : { car : car_dpm, pedestrian : pedestrian_dpm } - open_dialog : MyDialogDPM - use_gpu : - flags : [ nl ] - car : - user_category : Detection Target - pedestrian : - border : 16 - flags : [ left ] - part_model_car : - flags : [ hline ] - sel_cam_dialog_only : [ camera_id ] - sel_cam_dialog_allow: [ camera_id ] - camera_id : - border : 16 - flags : [ all ] - sync : - func : self.button_synchronization.GetValue() - name : vision_ssd_detect desc : vision_ssd_detect desc sample cmd : roslaunch vision_ssd_detect vision_ssd_detect.launch