提交 dce09707 编写于 作者: G Gines Hidalgo

Reduced number of warnings in VS

上级 a8c23f03
......@@ -281,6 +281,7 @@ OpenPose Library - Release Notes
3. Array::pData as binding of spData.
4. Array::Array that takes as input a pointer, so it does not re-allocate memory.
12. Producer defined inside Wrapper rather than being defined on each example.
13. Reduced many Visual Studio warnings (e.g., uncontrolled conversions between types).
2. Functions or parameters renamed:
1. By default, python example `tutorial_developer/python_2_pose_from_heatmaps.py` was using 2 scales starting at -1x736, changed to 1 scale at -1x368.
2. WrapperStructPose default parameters changed to match those of the OpenPose demo binary.
......@@ -288,6 +289,7 @@ OpenPose Library - Release Notes
3. Main bugs fixed:
1. CMake-GUI was forcing to Release mode, allowed Debug modes too.
2. NMS returns in index 0 the number of found peaks. However, while the number of peaks was truncated to a maximum of 127, this index 0 was saving the real number instead of the truncated one.
3. Template functions could not be imported in Windows for projects using the OpenPose library DLL.
......
......@@ -17,7 +17,7 @@ clear && clear
# Parameters
IMAGE_FOLDER_CF=/home/gines/devel/images/car-fusion_val/
IMAGE_FOLDER_P3=/home/gines/devel/images/pascal3d+_val/
IMAGE_FOLDER_A7=/home/gines/devel/images/veri-776_val/
IMAGE_FOLDER_V7=/home/gines/devel/images/veri-776_val/
JSON_FOLDER=../evaluation/coco_val_jsons/
OP_BIN=./build/examples/openpose/openpose.bin
GPUS=-1
......@@ -26,9 +26,9 @@ GPUS=-1
# 1 scale
$OP_BIN --image_dir $IMAGE_FOLDER_CF --write_coco_json_variant 0 --write_coco_json ${JSON_FOLDER}processed_carfusion_val_1.json --model_pose CAR_22 --display 0 --render_pose 0 --num_gpu ${GPUS}
$OP_BIN --image_dir $IMAGE_FOLDER_P3 --write_coco_json_variant 1 --write_coco_json ${JSON_FOLDER}processed_pascal3dplus_val_1.json --model_pose CAR_22 --display 0 --render_pose 0 --num_gpu ${GPUS}
$OP_BIN --image_dir $IMAGE_FOLDER_A7 --write_coco_json_variant 2 --write_coco_json ${JSON_FOLDER}processed_veri776_val_1.json --model_pose CAR_22 --display 0 --render_pose 0 --num_gpu ${GPUS}
$OP_BIN --image_dir $IMAGE_FOLDER_V7 --write_coco_json_variant 2 --write_coco_json ${JSON_FOLDER}processed_veri776_val_1.json --model_pose CAR_22 --display 0 --render_pose 0 --num_gpu ${GPUS}
# # 4 scales
# $OP_BIN --image_dir $IMAGE_FOLDER_CF --write_coco_json_variant 0 --write_coco_json ${JSON_FOLDER}processed_carfusion_val_4.json --model_pose CAR_22 --display 0 --render_pose 0 --scale_number 4 --scale_gap 0.25 --net_resolution "1312x736" --num_gpu ${GPUS}
# $OP_BIN --image_dir $IMAGE_FOLDER_P3 --write_coco_json_variant 1 --write_coco_json ${JSON_FOLDER}processed_pascal3dplus_val_4.json --model_pose CAR_22 --display 0 --render_pose 0 --scale_number 4 --scale_gap 0.25 --net_resolution "1312x736" --num_gpu ${GPUS}
# $OP_BIN --image_dir $IMAGE_FOLDER_A7 --write_coco_json_variant 2 --write_coco_json ${JSON_FOLDER}processed_veri776_val_4.json --model_pose CAR_22 --display 0 --render_pose 0 --scale_number 4 --scale_gap 0.25 --net_resolution "1312x736" --num_gpu ${GPUS}
# $OP_BIN --image_dir $IMAGE_FOLDER_V7 --write_coco_json_variant 2 --write_coco_json ${JSON_FOLDER}processed_veri776_val_4.json --model_pose CAR_22 --display 0 --render_pose 0 --scale_number 4 --scale_gap 0.25 --net_resolution "1312x736" --num_gpu ${GPUS}
......@@ -387,7 +387,7 @@ namespace op
#define DATUM_BASE_NO_PTR std::vector<Datum>
#define DATUM_BASE std::shared_ptr<DATUM_BASE_NO_PTR>
#define DEFINE_TEMPLATE_DATUM(templateName) template class OP_API templateName<DATUM_BASE>
#define COMPILE_TEMPLATE_DATUM(templateName) extern DEFINE_TEMPLATE_DATUM(templateName)
#define COMPILE_TEMPLATE_DATUM(templateName) extern template class templateName<DATUM_BASE>
}
#endif // OPENPOSE_CORE_DATUM_HPP
......@@ -8,8 +8,8 @@ namespace op
{
OP_API void renderFaceKeypointsCpu(Array<float>& frameArray, const Array<float>& faceKeypoints, const float renderThreshold);
OP_API void renderFaceKeypointsGpu(float* framePtr, const Point<int>& frameSize, const float* const facePtr, const int numberPeople,
const float renderThreshold, const float alphaColorToAdd = FACE_DEFAULT_ALPHA_KEYPOINT);
void renderFaceKeypointsGpu(float* framePtr, const Point<int>& frameSize, const float* const facePtr, const int numberPeople,
const float renderThreshold, const float alphaColorToAdd = FACE_DEFAULT_ALPHA_KEYPOINT);
}
#endif // OPENPOSE_FACE_RENDER_FACE_HPP
......@@ -9,9 +9,9 @@ namespace op
OP_API void renderHandKeypointsCpu(Array<float>& frameArray, const std::array<Array<float>, 2>& handKeypoints,
const float renderThreshold);
OP_API void renderHandKeypointsGpu(float* framePtr, const Point<int>& frameSize, const float* const handsPtr,
const int numberHands, const float renderThreshold,
const float alphaColorToAdd = HAND_DEFAULT_ALPHA_KEYPOINT);
void renderHandKeypointsGpu(float* framePtr, const Point<int>& frameSize, const float* const handsPtr,
const int numberHands, const float renderThreshold,
const float alphaColorToAdd = HAND_DEFAULT_ALPHA_KEYPOINT);
}
#endif // OPENPOSE_HAND_GPU_HAND_RENDER_HPP
......@@ -7,49 +7,49 @@
namespace op
{
template <typename T>
OP_API void connectBodyPartsCpu(Array<T>& poseKeypoints, Array<T>& poseScores, const T* const heatMapPtr,
const T* const peaksPtr, const PoseModel poseModel, const Point<int>& heatMapSize,
const int maxPeaks, const T interMinAboveThreshold, const T interThreshold,
const int minSubsetCnt, const T minSubsetScore, const T scaleFactor = 1.f);
void connectBodyPartsCpu(
Array<T>& poseKeypoints, Array<T>& poseScores, const T* const heatMapPtr, const T* const peaksPtr,
const PoseModel poseModel, const Point<int>& heatMapSize, const int maxPeaks, const T interMinAboveThreshold,
const T interThreshold, const int minSubsetCnt, const T minSubsetScore, const T scaleFactor = 1.f);
// Windows: Cuda functions do not include OP_API
template <typename T>
OP_API void connectBodyPartsGpu(Array<T>& poseKeypoints, Array<T>& poseScores, const T* const heatMapGpuPtr,
const T* const peaksPtr, const PoseModel poseModel, const Point<int>& heatMapSize,
const int maxPeaks, const T interMinAboveThreshold, const T interThreshold,
const int minSubsetCnt, const T minSubsetScore, const T scaleFactor = 1.f,
Array<T> pairScoresCpu = Array<T>{}, T* pairScoresGpuPtr = nullptr,
const unsigned int* const bodyPartPairsGpuPtr = nullptr,
const unsigned int* const mapIdxGpuPtr = nullptr,
const T* const peaksGpuPtr = nullptr);
void connectBodyPartsGpu(
Array<T>& poseKeypoints, Array<T>& poseScores, const T* const heatMapGpuPtr, const T* const peaksPtr,
const PoseModel poseModel, const Point<int>& heatMapSize, const int maxPeaks, const T interMinAboveThreshold,
const T interThreshold, const int minSubsetCnt, const T minSubsetScore, const T scaleFactor = 1.f,
Array<T> pairScoresCpu = Array<T>{}, T* pairScoresGpuPtr = nullptr,
const unsigned int* const bodyPartPairsGpuPtr = nullptr, const unsigned int* const mapIdxGpuPtr = nullptr,
const T* const peaksGpuPtr = nullptr);
// Private functions used by the 2 above functions
template <typename T>
OP_API std::vector<std::pair<std::vector<int>, T>> createPeopleVector(
std::vector<std::pair<std::vector<int>, T>> createPeopleVector(
const T* const heatMapPtr, const T* const peaksPtr, const PoseModel poseModel, const Point<int>& heatMapSize,
const int maxPeaks, const T interThreshold, const T interMinAboveThreshold,
const std::vector<unsigned int>& bodyPartPairs, const unsigned int numberBodyParts,
const unsigned int numberBodyPartPairs, const Array<T>& precomputedPAFs = Array<T>());
template <typename T>
OP_API void removePeopleBelowThresholds(std::vector<int>& validSubsetIndexes, int& numberPeople,
void removePeopleBelowThresholds(std::vector<int>& validSubsetIndexes, int& numberPeople,
const std::vector<std::pair<std::vector<int>, T>>& subsets,
const unsigned int numberBodyParts, const int minSubsetCnt,
const T minSubsetScore, const int maxPeaks);
template <typename T>
OP_API void peopleVectorToPeopleArray(Array<T>& poseKeypoints, Array<T>& poseScores, const T scaleFactor,
void peopleVectorToPeopleArray(Array<T>& poseKeypoints, Array<T>& poseScores, const T scaleFactor,
const std::vector<std::pair<std::vector<int>, T>>& subsets,
const std::vector<int>& validSubsetIndexes, const T* const peaksPtr,
const int numberPeople, const unsigned int numberBodyParts,
const unsigned int numberBodyPartPairs);
template <typename T>
OP_API std::vector<std::tuple<T, T, int, int, int>> pafPtrIntoVector(
std::vector<std::tuple<T, T, int, int, int>> pafPtrIntoVector(
const Array<T>& pairScores, const T* const peaksPtr, const int maxPeaks,
const std::vector<unsigned int>& bodyPartPairs, const unsigned int numberBodyPartPairs);
template <typename T>
OP_API std::vector<std::pair<std::vector<int>, T>> pafVectorIntoPeopleVector(
std::vector<std::pair<std::vector<int>, T>> pafVectorIntoPeopleVector(
const std::vector<std::tuple<T, T, int, int, int>>& pairScores, const T* const peaksPtr, const int maxPeaks,
const std::vector<unsigned int>& bodyPartPairs, const unsigned int numberBodyParts);
}
......
......@@ -4,20 +4,13 @@
#include <openpose/core/common.hpp>
#include <openpose/pose/enumClasses.hpp>
// PIMPL does not work here. Alternative:
// stackoverflow.com/questions/13978775/how-to-avoid-include-dependency-to-external-library?answertab=active#tab-top
namespace caffe
{
template <typename T> class Blob;
}
namespace op
{
// It mostly follows the Caffe::layer implementation, so Caffe users can easily use it. However, in order to keep
// the compatibility with any generic Caffe version, we keep this 'layer' inside our library rather than in the
// Caffe code.
template <typename T>
class OP_API BodyPartConnectorCaffe
class BodyPartConnectorCaffe
{
public:
explicit BodyPartConnectorCaffe();
......
......@@ -6,12 +6,13 @@
namespace op
{
template <typename T>
OP_API void maximumCpu(T* targetPtr, const T* const sourcePtr, const std::array<int, 4>& targetSize,
const std::array<int, 4>& sourceSize);
void maximumCpu(T* targetPtr, const T* const sourcePtr, const std::array<int, 4>& targetSize,
const std::array<int, 4>& sourceSize);
// Windows: Cuda functions do not include OP_API
template <typename T>
OP_API void maximumGpu(T* targetPtr, const T* const sourcePtr, const std::array<int, 4>& targetSize,
const std::array<int, 4>& sourceSize);
void maximumGpu(T* targetPtr, const T* const sourcePtr, const std::array<int, 4>& targetSize,
const std::array<int, 4>& sourceSize);
}
#endif // OPENPOSE_NET_MAXIMUM_BASE_HPP
......@@ -9,7 +9,7 @@ namespace op
// the compatibility with any generic Caffe version, we keep this 'layer' inside our library rather than in the
// Caffe code.
template <typename T>
class OP_API MaximumCaffe
class MaximumCaffe
{
public:
explicit MaximumCaffe();
......
......@@ -6,19 +6,21 @@
namespace op
{
template <typename T>
OP_API void nmsCpu(T* targetPtr, int* kernelPtr, const T* const sourcePtr, const T threshold,
const std::array<int, 4>& targetSize, const std::array<int, 4>& sourceSize,
const Point<T>& offset);
void nmsCpu(
T* targetPtr, int* kernelPtr, const T* const sourcePtr, const T threshold, const std::array<int, 4>& targetSize,
const std::array<int, 4>& sourceSize, const Point<T>& offset);
// Windows: Cuda functions do not include OP_API
template <typename T>
OP_API void nmsGpu(T* targetPtr, int* kernelPtr, const T* const sourcePtr, const T threshold,
const std::array<int, 4>& targetSize, const std::array<int, 4>& sourceSize,
const Point<T>& offset);
void nmsGpu(
T* targetPtr, int* kernelPtr, const T* const sourcePtr, const T threshold, const std::array<int, 4>& targetSize,
const std::array<int, 4>& sourceSize, const Point<T>& offset);
// Windows: OpenCL functions do not include OP_API
template <typename T>
OP_API void nmsOcl(T* targetPtr, int* kernelPtr, const T* const sourcePtr, const T threshold,
const std::array<int, 4>& targetSize, const std::array<int, 4>& sourceSize,
const Point<T>& offset, const int gpuID = 0);
void nmsOcl(
T* targetPtr, int* kernelPtr, const T* const sourcePtr, const T threshold, const std::array<int, 4>& targetSize,
const std::array<int, 4>& sourceSize, const Point<T>& offset, const int gpuID = 0);
}
#endif // OPENPOSE_NET_NMS_BASE_HPP
......@@ -9,7 +9,7 @@ namespace op
// the compatibility with any generic Caffe version, we keep this 'layer' inside our library rather than in the
// Caffe code.
template <typename T>
class OP_API NmsCaffe
class NmsCaffe
{
public:
explicit NmsCaffe();
......
......@@ -6,24 +6,22 @@
namespace op
{
template <typename T>
OP_API void resizeAndMergeCpu(T* targetPtr, const std::vector<const T*>& sourcePtrs,
const std::array<int, 4>& targetSize,
const std::vector<std::array<int, 4>>& sourceSizes,
const std::vector<T>& scaleInputToNetInputs = {1.f});
void resizeAndMergeCpu(
T* targetPtr, const std::vector<const T*>& sourcePtrs, const std::array<int, 4>& targetSize,
const std::vector<std::array<int, 4>>& sourceSizes, const std::vector<T>& scaleInputToNetInputs = {1.f});
// Windows: Cuda functions do not include OP_API
template <typename T>
OP_API void resizeAndMergeGpu(T* targetPtr, const std::vector<const T*>& sourcePtrs,
const std::array<int, 4>& targetSize,
const std::vector<std::array<int, 4>>& sourceSizes,
const std::vector<T>& scaleInputToNetInputs = {1.f});
void resizeAndMergeGpu(
T* targetPtr, const std::vector<const T*>& sourcePtrs, const std::array<int, 4>& targetSize,
const std::vector<std::array<int, 4>>& sourceSizes, const std::vector<T>& scaleInputToNetInputs = {1.f});
// Windows: OpenCL functions do not include OP_API
template <typename T>
OP_API void resizeAndMergeOcl(T* targetPtr, const std::vector<const T*>& sourcePtrs,
std::vector<T*>& sourceTempPtrs,
const std::array<int, 4>& targetSize,
const std::vector<std::array<int, 4>>& sourceSizes,
const std::vector<T>& scaleInputToNetInputs = {1.f},
const int gpuID = 0);
void resizeAndMergeOcl(
T* targetPtr, const std::vector<const T*>& sourcePtrs, std::vector<T*>& sourceTempPtrs,
const std::array<int, 4>& targetSize, const std::vector<std::array<int, 4>>& sourceSizes,
const std::vector<T>& scaleInputToNetInputs = {1.f}, const int gpuID = 0);
}
#endif // OPENPOSE_NET_RESIZE_AND_MERGE_BASE_HPP
......@@ -3,20 +3,13 @@
#include <openpose/core/common.hpp>
// PIMPL does not work here. Alternative:
// stackoverflow.com/questions/13978775/how-to-avoid-include-dependency-to-external-library?answertab=active#tab-top
namespace caffe
{
template <typename T> class Blob;
}
namespace op
{
// It mostly follows the Caffe::layer implementation, so Caffe users can easily use it. However, in order to keep
// the compatibility with any generic Caffe version, we keep this 'layer' inside our library rather than in the
// Caffe code.
template <typename T>
class OP_API ResizeAndMergeCaffe
class ResizeAndMergeCaffe
{
public:
explicit ResizeAndMergeCaffe();
......
......@@ -12,36 +12,35 @@ namespace op
const PoseModel poseModel, const float renderThreshold,
const bool blendOriginalFrame = true);
OP_API void renderPoseKeypointsGpu(float* framePtr, const PoseModel poseModel, const int numberPeople,
const Point<int>& frameSize, const float* const posePtr,
const float renderThreshold, const bool googlyEyes = false,
const bool blendOriginalFrame = true,
const float alphaBlending = POSE_DEFAULT_ALPHA_KEYPOINT);
OP_API void renderPoseHeatMapGpu(float* frame, const PoseModel poseModel, const Point<int>& frameSize,
const float* const heatMapPtr, const Point<int>& heatMapSize,
const float scaleToKeepRatio, const int part,
const float alphaBlending = POSE_DEFAULT_ALPHA_HEAT_MAP);
OP_API void renderPoseHeatMapsGpu(float* frame, const PoseModel poseModel, const Point<int>& frameSize,
const float* const heatMapPtr, const Point<int>& heatMapSize,
const float scaleToKeepRatio,
const float alphaBlending = POSE_DEFAULT_ALPHA_HEAT_MAP);
OP_API void renderPosePAFGpu(float* framePtr, const PoseModel poseModel, const Point<int>& frameSize,
const float* const heatMapPtr, const Point<int>& heatMapSize,
const float scaleToKeepRatio, const int part,
const float alphaBlending = POSE_DEFAULT_ALPHA_HEAT_MAP);
OP_API void renderPosePAFsGpu(float* framePtr, const PoseModel poseModel, const Point<int>& frameSize,
const float* const heatMapPtr, const Point<int>& heatMapSize,
const float scaleToKeepRatio,
const float alphaBlending = POSE_DEFAULT_ALPHA_HEAT_MAP);
OP_API void renderPoseDistance(float* framePtr, const PoseModel poseModel, const Point<int>& frameSize,
const float* const heatMapPtr, const Point<int>& heatMapSize,
const float scaleToKeepRatio, const int part,
const float alphaBlending = POSE_DEFAULT_ALPHA_HEAT_MAP);
void renderPoseKeypointsGpu(float* framePtr, const PoseModel poseModel, const int numberPeople,
const Point<int>& frameSize, const float* const posePtr,
const float renderThreshold, const bool googlyEyes = false,
const bool blendOriginalFrame = true,
const float alphaBlending = POSE_DEFAULT_ALPHA_KEYPOINT);
void renderPoseHeatMapGpu(float* frame, const Point<int>& frameSize, const float* const heatMapPtr,
const Point<int>& heatMapSize, const float scaleToKeepRatio,
const unsigned int part,
const float alphaBlending = POSE_DEFAULT_ALPHA_HEAT_MAP);
void renderPoseHeatMapsGpu(float* frame, const PoseModel poseModel, const Point<int>& frameSize,
const float* const heatMapPtr, const Point<int>& heatMapSize,
const float scaleToKeepRatio,
const float alphaBlending = POSE_DEFAULT_ALPHA_HEAT_MAP);
void renderPosePAFGpu(float* framePtr, const PoseModel poseModel, const Point<int>& frameSize,
const float* const heatMapPtr, const Point<int>& heatMapSize,
const float scaleToKeepRatio, const int part,
const float alphaBlending = POSE_DEFAULT_ALPHA_HEAT_MAP);
void renderPosePAFsGpu(float* framePtr, const PoseModel poseModel, const Point<int>& frameSize,
const float* const heatMapPtr, const Point<int>& heatMapSize,
const float scaleToKeepRatio,
const float alphaBlending = POSE_DEFAULT_ALPHA_HEAT_MAP);
void renderPoseDistanceGpu(float* framePtr, const Point<int>& frameSize, const float* const heatMapPtr,
const Point<int>& heatMapSize, const float scaleToKeepRatio,
const unsigned int part, const float alphaBlending = POSE_DEFAULT_ALPHA_HEAT_MAP);
}
#endif // OPENPOSE_POSE_RENDER_POSE_HPP
......@@ -10,9 +10,11 @@ namespace op
std::vector<cv::Mat>& pyramidImagesCurrent,
std::vector<char>& status, const cv::Mat& imagePrevious,
const cv::Mat& imageCurrent, const int levels = 3, const int patchSize = 21);
OP_API int pyramidalLKGpu(std::vector<cv::Point2f>& ptsI, std::vector<cv::Point2f>& ptsJ,
std::vector<char>& status, const cv::Mat& imagePrevious,
const cv::Mat& imageCurrent, const int levels = 3, const int patchSize = 21);
int pyramidalLKGpu(std::vector<cv::Point2f>& ptsI, std::vector<cv::Point2f>& ptsJ,
std::vector<char>& status, const cv::Mat& imagePrevious,
const cv::Mat& imageCurrent, const int levels = 3, const int patchSize = 21);
OP_API void pyramidalLKOcv(std::vector<cv::Point2f>& coordI, std::vector<cv::Point2f>& coordJ,
std::vector<cv::Mat>& pyramidImagesPrevious,
std::vector<cv::Mat>& pyramidImagesCurrent,
......
......@@ -6,39 +6,37 @@
namespace op
{
template <typename T>
OP_API T getDistance(const Array<T>& keypoints, const int person, const int elementA, const int elementB);
T getDistance(const Array<T>& keypoints, const int person, const int elementA, const int elementB);
template <typename T>
OP_API void averageKeypoints(Array<T>& keypointsA, const Array<T>& keypointsB, const int personA);
void averageKeypoints(Array<T>& keypointsA, const Array<T>& keypointsB, const int personA);
template <typename T>
OP_API void scaleKeypoints(Array<T>& keypoints, const T scale);
void scaleKeypoints(Array<T>& keypoints, const T scale);
template <typename T>
OP_API void scaleKeypoints2d(Array<T>& keypoints, const T scaleX, const T scaleY);
void scaleKeypoints2d(Array<T>& keypoints, const T scaleX, const T scaleY);
template <typename T>
OP_API void scaleKeypoints2d(Array<T>& keypoints, const T scaleX, const T scaleY, const T offsetX,
void scaleKeypoints2d(Array<T>& keypoints, const T scaleX, const T scaleY, const T offsetX,
const T offsetY);
template <typename T>
OP_API void renderKeypointsCpu(Array<T>& frameArray, const Array<T>& keypoints,
const std::vector<unsigned int>& pairs, const std::vector<T> colors,
const T thicknessCircleRatio, const T thicknessLineRatioWRTCircle,
const std::vector<T>& poseScales, const T threshold);
void renderKeypointsCpu(Array<T>& frameArray, const Array<T>& keypoints, const std::vector<unsigned int>& pairs,
const std::vector<T> colors, const T thicknessCircleRatio,
const T thicknessLineRatioWRTCircle, const std::vector<T>& poseScales, const T threshold);
template <typename T>
OP_API Rectangle<T> getKeypointsRectangle(const Array<T>& keypoints, const int person,
const T threshold);
Rectangle<T> getKeypointsRectangle(const Array<T>& keypoints, const int person, const T threshold);
template <typename T>
OP_API T getAverageScore(const Array<T>& keypoints, const int person);
T getAverageScore(const Array<T>& keypoints, const int person);
template <typename T>
OP_API T getKeypointsArea(const Array<T>& keypoints, const int person, const T threshold);
T getKeypointsArea(const Array<T>& keypoints, const int person, const T threshold);
template <typename T>
OP_API int getBiggestPerson(const Array<T>& keypoints, const T threshold);
int getBiggestPerson(const Array<T>& keypoints, const T threshold);
}
#endif // OPENPOSE_UTILITIES_KEYPOINT_HPP
......@@ -15,7 +15,7 @@ namespace op
* @return std::string with the formatted value.
*/
template<typename T>
OP_API std::string toFixedLengthString(const T number, const unsigned long long stringLength = 0);
std::string toFixedLengthString(const T number, const unsigned long long stringLength = 0);
OP_API std::vector<std::string> splitString(const std::string& stringToSplit, const std::string& delimiter);
......
......@@ -51,7 +51,7 @@ namespace op
template<typename TDatums,
typename TDatumsSP = std::shared_ptr<TDatums>,
typename TWorker = std::shared_ptr<Worker<TDatumsSP>>>
OP_API void configureThreadManager(
void configureThreadManager(
ThreadManager<TDatumsSP>& threadManager, const bool multiThreadEnabled,
const ThreadManagerMode threadManagerMode, const WrapperStructPose& wrapperStructPose,
const WrapperStructFace& wrapperStructFace, const WrapperStructHand& wrapperStructHand,
......
......@@ -351,7 +351,7 @@ namespace op
if (!detectionMissed)
{
const auto numberBodyParts = keypointsVector.at(0).getSize(1);
const auto lastChannelLength = keypointsVector.at(0).getSize(2);
const auto channel0Length = keypointsVector.at(0).getSize(2);
// Create x-y vector from high score results
std::vector<int> indexesUsed;
std::vector<std::vector<cv::Point2d>> xyPoints;
......@@ -362,7 +362,7 @@ namespace op
// auto missedPoint = false;
std::vector<cv::Point2d> xyPointsElement;
std::vector<cv::Mat> cameraMatricesElement;
const auto baseIndex = part * lastChannelLength;
const auto baseIndex = part * channel0Length;
// for (auto& keypoints : keypointsVector)
for (auto i = 0u ; i < keypointsVector.size() ; i++)
{
......
......@@ -410,7 +410,8 @@ namespace op
if (indexA < indexB)
{
if (0 <= indexA && (unsigned int)indexB < mSize.size()) // 0 <= indexA < indexB < mSize.size()
return std::accumulate(mSize.begin()+indexA, mSize.begin()+indexB+1, 1ul, std::multiplies<size_t>());
return std::accumulate(
mSize.begin()+indexA, mSize.begin()+indexB+1, 1ull, std::multiplies<size_t>());
else
{
error("Indexes out of dimension.", __LINE__, __FUNCTION__, __FILE__);
......@@ -599,7 +600,7 @@ namespace op
{
// New size & volume
mSize = sizes;
mVolume = {std::accumulate(sizes.begin(), sizes.end(), 1ul, std::multiplies<size_t>())};
mVolume = {std::accumulate(sizes.begin(), sizes.end(), 1ull, std::multiplies<size_t>())};
// Prepare shared_ptr
if (dataPtr == nullptr)
{
......
......@@ -90,7 +90,7 @@ namespace op
// Re-shape video writer if required
if (mNumberImages != cvMats.size())
{
mNumberImages = cvMats.size();
mNumberImages = (unsigned int)cvMats.size();
mVideoWriter = openVideo(mVideoSaverPath, mCvFourcc, mFps, mCvSize, mNumberImages);
}
// Concat images
......
......@@ -149,8 +149,8 @@ namespace op
{
// Skeleton / Background / Add keypoints / Add PAFs
const std::string key2part = "1234";
const auto newElementToRender = key2part.find(castedKey);
if (newElementToRender != std::string::npos)
const auto keyPressed = key2part.find(castedKey);
if (keyPressed != std::string::npos)
{
ElementToRender elementToRender;
if (castedKey=='1')
......@@ -179,7 +179,7 @@ namespace op
const auto newElementToRender = key2partHeatmaps.find(castedKey);
if (newElementToRender != std::string::npos)
for (auto& renderer : renderers)
renderer->setElementToRender((int)newElementToRender+key2part.size());
renderer->setElementToRender(int(newElementToRender+key2part.size()));
}
}
}
......
......@@ -335,7 +335,7 @@ namespace op
{
const auto indexA = std::get<0>(abConnection);
const auto indexB = std::get<1>(abConnection);
const auto score = std::get<2>(abConnection);
const auto score = T(std::get<2>(abConnection));
bool found = false;
for (auto& personVector : peopleVector)
{
......@@ -508,7 +508,7 @@ namespace op
// Score
const auto personScore = peaksPtr[indexScoreA] + peaksPtr[indexScoreB] + pafScore;
// Set associated personAssigned as assigned
aAssigned = peopleVector.size();
aAssigned = (int)peopleVector.size();
bAssigned = aAssigned;
// Create new personVector
peopleVector.emplace_back(std::make_pair(rowVector, personScore));
......@@ -568,6 +568,8 @@ namespace op
auto& person1 = peopleVector[assigned1].first;
const auto& person2 = peopleVector[assigned2].first;
// Check if complementary
// Defining found keypoint indexes in personA as kA, and analogously kB
// Complementary if and only if kA intersection kB = empty. I.e., no common keypoints
bool complementary = true;
for (auto part = 0u ; part < numberBodyParts ; part++)
{
......@@ -1102,7 +1104,7 @@ namespace op
// Parts Connection
const auto& bodyPartPairs = getPosePartPairs(poseModel);
const auto numberBodyParts = getPoseNumberBodyParts(poseModel);
const auto numberBodyPartPairs = bodyPartPairs.size() / 2;
const auto numberBodyPartPairs = (unsigned int)(bodyPartPairs.size() / 2);
if (numberBodyParts == 0)
error("Invalid value of numberBodyParts, it must be positive, not " + std::to_string(numberBodyParts),
__LINE__, __FUNCTION__, __FILE__);
......@@ -1142,68 +1144,66 @@ namespace op
}
}
template void connectBodyPartsCpu(Array<float>& poseKeypoints, Array<float>& poseScores,
const float* const heatMapPtr, const float* const peaksPtr,
const PoseModel poseModel, const Point<int>& heatMapSize,
const int maxPeaks, const float interMinAboveThreshold,
const float interThreshold, const int minSubsetCnt,
const float minSubsetScore, const float scaleFactor);
template void connectBodyPartsCpu(Array<double>& poseKeypoints, Array<double>& poseScores,
const double* const heatMapPtr, const double* const peaksPtr,
const PoseModel poseModel, const Point<int>& heatMapSize,
const int maxPeaks, const double interMinAboveThreshold,
const double interThreshold, const int minSubsetCnt,
const double minSubsetScore, const double scaleFactor);
template OP_API void connectBodyPartsCpu(
Array<float>& poseKeypoints, Array<float>& poseScores, const float* const heatMapPtr,
const float* const peaksPtr, const PoseModel poseModel, const Point<int>& heatMapSize, const int maxPeaks,
const float interMinAboveThreshold, const float interThreshold, const int minSubsetCnt,
const float minSubsetScore, const float scaleFactor);
template OP_API void connectBodyPartsCpu(
Array<double>& poseKeypoints, Array<double>& poseScores, const double* const heatMapPtr,
const double* const peaksPtr, const PoseModel poseModel, const Point<int>& heatMapSize, const int maxPeaks,
const double interMinAboveThreshold, const double interThreshold, const int minSubsetCnt,
const double minSubsetScore, const double scaleFactor);
template std::vector<std::pair<std::vector<int>, float>> createPeopleVector(
template OP_API std::vector<std::pair<std::vector<int>, float>> createPeopleVector(
const float* const heatMapPtr, const float* const peaksPtr, const PoseModel poseModel,
const Point<int>& heatMapSize, const int maxPeaks, const float interThreshold,
const float interMinAboveThreshold, const std::vector<unsigned int>& bodyPartPairs,
const unsigned int numberBodyParts, const unsigned int numberBodyPartPairs,
const Array<float>& precomputedPAFs);
template std::vector<std::pair<std::vector<int>, double>> createPeopleVector(
template OP_API std::vector<std::pair<std::vector<int>, double>> createPeopleVector(
const double* const heatMapPtr, const double* const peaksPtr, const PoseModel poseModel,
const Point<int>& heatMapSize, const int maxPeaks, const double interThreshold,
const double interMinAboveThreshold, const std::vector<unsigned int>& bodyPartPairs,
const unsigned int numberBodyParts, const unsigned int numberBodyPartPairs,
const Array<double>& precomputedPAFs);
template void removePeopleBelowThresholds(
template OP_API void removePeopleBelowThresholds(
std::vector<int>& validSubsetIndexes, int& numberPeople,
const std::vector<std::pair<std::vector<int>, float>>& peopleVector,
const unsigned int numberBodyParts,
const int minSubsetCnt, const float minSubsetScore, const int maxPeaks);
template void removePeopleBelowThresholds(
template OP_API void removePeopleBelowThresholds(
std::vector<int>& validSubsetIndexes, int& numberPeople,
const std::vector<std::pair<std::vector<int>, double>>& peopleVector,
const unsigned int numberBodyParts,
const int minSubsetCnt, const double minSubsetScore, const int maxPeaks);
template void peopleVectorToPeopleArray(
template OP_API void peopleVectorToPeopleArray(
Array<float>& poseKeypoints, Array<float>& poseScores, const float scaleFactor,
const std::vector<std::pair<std::vector<int>, float>>& peopleVector,
const std::vector<int>& validSubsetIndexes, const float* const peaksPtr,
const int numberPeople, const unsigned int numberBodyParts,
const unsigned int numberBodyPartPairs);
template void peopleVectorToPeopleArray(
template OP_API void peopleVectorToPeopleArray(
Array<double>& poseKeypoints, Array<double>& poseScores, const double scaleFactor,
const std::vector<std::pair<std::vector<int>, double>>& peopleVector,
const std::vector<int>& validSubsetIndexes, const double* const peaksPtr,
const int numberPeople, const unsigned int numberBodyParts,
const unsigned int numberBodyPartPairs);
template std::vector<std::tuple<float, float, int, int, int>> pafPtrIntoVector(
template OP_API std::vector<std::tuple<float, float, int, int, int>> pafPtrIntoVector(
const Array<float>& pairScores, const float* const peaksPtr, const int maxPeaks,
const std::vector<unsigned int>& bodyPartPairs, const unsigned int numberBodyPartPairs);
template std::vector<std::tuple<double, double, int, int, int>> pafPtrIntoVector(
template OP_API std::vector<std::tuple<double, double, int, int, int>> pafPtrIntoVector(
const Array<double>& pairScores, const double* const peaksPtr, const int maxPeaks,
const std::vector<unsigned int>& bodyPartPairs, const unsigned int numberBodyPartPairs);
template std::vector<std::pair<std::vector<int>, float>> pafVectorIntoPeopleVector(
template OP_API std::vector<std::pair<std::vector<int>, float>> pafVectorIntoPeopleVector(
const std::vector<std::tuple<float, float, int, int, int>>& pairConnections,
const float* const peaksPtr, const int maxPeaks, const std::vector<unsigned int>& bodyPartPairs,
const unsigned int numberBodyParts);
template std::vector<std::pair<std::vector<int>, double>> pafVectorIntoPeopleVector(
template OP_API std::vector<std::pair<std::vector<int>, double>> pafVectorIntoPeopleVector(
const std::vector<std::tuple<double, double, int, int, int>>& pairConnections,
const double* const peaksPtr, const int maxPeaks, const std::vector<unsigned int>& bodyPartPairs,
const unsigned int numberBodyParts);
......
......@@ -120,7 +120,7 @@ namespace op
// Parts Connection
const auto& bodyPartPairs = getPosePartPairs(poseModel);
const auto numberBodyParts = getPoseNumberBodyParts(poseModel);
const auto numberBodyPartPairs = bodyPartPairs.size() / 2;
const auto numberBodyPartPairs = (unsigned int)(bodyPartPairs.size() / 2);
const auto totalComputations = pairScoresCpu.getVolume();
if (numberBodyParts == 0)
......@@ -138,7 +138,7 @@ namespace op
getNumberCudaBlocks(maxPeaks, THREADS_PER_BLOCK.z)};
pafScoreKernel<<<numBlocks, THREADS_PER_BLOCK>>>(
pairScoresGpuPtr, heatMapGpuPtr, peaksGpuPtr, bodyPartPairsGpuPtr, mapIdxGpuPtr,
maxPeaks, numberBodyPartPairs, heatMapSize.x, heatMapSize.y, interThreshold,
maxPeaks, (int)numberBodyPartPairs, heatMapSize.x, heatMapSize.y, interThreshold,
interMinAboveThreshold);
// pairScoresCpu <-- pairScoresGpu
cudaMemcpy(pairScoresCpu.getPtr(), pairScoresGpuPtr, totalComputations * sizeof(T),
......@@ -184,22 +184,18 @@ namespace op
}
}
template void connectBodyPartsGpu(Array<float>& poseKeypoints, Array<float>& poseScores,
const float* const heatMapGpuPtr, const float* const peaksPtr,
const PoseModel poseModel, const Point<int>& heatMapSize, const int maxPeaks,
const float interMinAboveThreshold, const float interThreshold,
const int minSubsetCnt, const float minSubsetScore, const float scaleFactor,
Array<float> pairScoresCpu, float* pairScoresGpuPtr,
const unsigned int* const bodyPartPairsGpuPtr,
const unsigned int* const mapIdxGpuPtr,
const float* const peaksGpuPtr);
template void connectBodyPartsGpu(Array<double>& poseKeypoints, Array<double>& poseScores,
const double* const heatMapGpuPtr, const double* const peaksPtr,
const PoseModel poseModel, const Point<int>& heatMapSize, const int maxPeaks,
const double interMinAboveThreshold, const double interThreshold,
const int minSubsetCnt, const double minSubsetScore, const double scaleFactor,
Array<double> pairScoresCpu, double* pairScoresGpuPtr,
const unsigned int* const bodyPartPairsGpuPtr,
const unsigned int* const mapIdxGpuPtr,
const double* const peaksGpuPtr);
template void connectBodyPartsGpu(
Array<float>& poseKeypoints, Array<float>& poseScores, const float* const heatMapGpuPtr,
const float* const peaksPtr, const PoseModel poseModel, const Point<int>& heatMapSize, const int maxPeaks,
const float interMinAboveThreshold, const float interThreshold, const int minSubsetCnt,
const float minSubsetScore, const float scaleFactor, Array<float> pairScoresCpu, float* pairScoresGpuPtr,
const unsigned int* const bodyPartPairsGpuPtr, const unsigned int* const mapIdxGpuPtr,
const float* const peaksGpuPtr);
template void connectBodyPartsGpu(
Array<double>& poseKeypoints, Array<double>& poseScores, const double* const heatMapGpuPtr,
const double* const peaksPtr, const PoseModel poseModel, const Point<int>& heatMapSize, const int maxPeaks,
const double interMinAboveThreshold, const double interThreshold, const int minSubsetCnt,
const double minSubsetScore, const double scaleFactor, Array<double> pairScoresCpu, double* pairScoresGpuPtr,
const unsigned int* const bodyPartPairsGpuPtr, const unsigned int* const mapIdxGpuPtr,
const double* const peaksGpuPtr);
}
......@@ -42,9 +42,9 @@ namespace op
double minVal, maxVal;
cv::Point minLoc, maxLoc;
cv::minMaxLoc(source, &minVal, &maxVal, &minLoc, &maxLoc);
targetPtrOffsetted[0] = maxLoc.x;
targetPtrOffsetted[1] = maxLoc.y;
targetPtrOffsetted[2] = maxVal;
targetPtrOffsetted[0] = T(maxLoc.x);
targetPtrOffsetted[1] = T(maxLoc.y);
targetPtrOffsetted[2] = T(maxVal);
}
}
}
......@@ -55,8 +55,10 @@ namespace op
}
}
template void maximumCpu(float* targetPtr, const float* const sourcePtr, const std::array<int, 4>& targetSize,
const std::array<int, 4>& sourceSize);
template void maximumCpu(double* targetPtr, const double* const sourcePtr, const std::array<int, 4>& targetSize,
const std::array<int, 4>& sourceSize);
template OP_API void maximumCpu(
float* targetPtr, const float* const sourcePtr, const std::array<int, 4>& targetSize,
const std::array<int, 4>& sourceSize);
template OP_API void maximumCpu(
double* targetPtr, const double* const sourcePtr, const std::array<int, 4>& targetSize,
const std::array<int, 4>& sourceSize);
}
......@@ -7,7 +7,8 @@
namespace op
{
template <typename T>
__global__ void fillTargetPtrPart(T* targetPtrOffsetted, const T* sourcePtrOffsetted, const int sourceIndex, const int x, const int y)
__global__ void fillTargetPtrPart(T* targetPtrOffsetted, const T* sourcePtrOffsetted, const int sourceIndex,
const int x, const int y)
{
targetPtrOffsetted[0] = x;
targetPtrOffsetted[1] = y;
......@@ -15,11 +16,13 @@ namespace op
}
// template <typename T>
// __global__ void fillTargetPtrChannel(T* targetPtrOffsetted, const T* sourcePtrOffsetted, const int width, const int imageOffset)
// __global__ void fillTargetPtrChannel(T* targetPtrOffsetted, const T* sourcePtrOffsetted, const int width,
// const int imageOffset)
// {
// const auto sourceThrustPtr = thrust::device_pointer_cast(sourcePtrOffsetted);
// // Ideal option (not working for CUDA < 8)
// // const auto sourceIndexIterator = thrust::max_element(thrust::device, sourceThrustPtr, sourceThrustPtr + imageOffset);
// // const auto sourceIndexIterator = thrust::max_element(
// // thrust::device, sourceThrustPtr, sourceThrustPtr + imageOffset);
// // Workaround to make it work for CUDA 7.5
// const auto sourceIndexIterator = thrust::max_element(sourceThrustPtr, sourceThrustPtr + imageOffset);
// const auto sourceIndex = (int)(sourceIndexIterator - sourceThrustPtr);
......@@ -29,7 +32,8 @@ namespace op
// }
// template <typename T>
// __global__ void fillTargetPtr(T* targetPtr, const T* sourcePtr, const int width, const int imageOffset, const int numberSubparts, const int offsetChannel)
// __global__ void fillTargetPtr(T* targetPtr, const T* sourcePtr, const int width, const int imageOffset,
// const int numberSubparts, const int offsetChannel)
// {
// // get pixel location (x,y)
// const auto x = (blockIdx.x * blockDim.x) + threadIdx.x;
......@@ -41,9 +45,11 @@ namespace op
// auto* targetPtrOffsetted = targetPtr + (offsetChannel + part) * numberSubparts;
// const auto* const sourcePtrOffsetted = sourcePtr + (offsetChannel + part) * imageOffset;
// auto sourceThrustPtr = thrust::device_pointer_cast(sourcePtrOffsetted);
// const auto sourceIndexIterator = thrust::max_element(thrust::device, sourceThrustPtr, sourceThrustPtr + imageOffset);
// const auto sourceIndexIterator = thrust::max_element(thrust::device, sourceThrustPtr,
// sourceThrustPtr + imageOffset);
// // Ideal option (not working for CUDA < 8)
// // const auto sourceIndexIterator = thrust::max_element(thrust::device, sourceThrustPtr, sourceThrustPtr + imageOffset);
// // const auto sourceIndexIterator = thrust::max_element(
// // thrust::device, sourceThrustPtr, sourceThrustPtr + imageOffset);
// // Workaround to make it work for CUDA 7.5
// const auto sourceIndexIterator = thrust::max_element(sourceThrustPtr, sourceThrustPtr + imageOffset);
// const auto sourceIndex = (int)(sourceIndexIterator - sourceThrustPtr);
......@@ -54,7 +60,8 @@ namespace op
// }
template <typename T>
void maximumGpu(T* targetPtr, const T* const sourcePtr, const std::array<int, 4>& targetSize, const std::array<int, 4>& sourceSize)
void maximumGpu(T* targetPtr, const T* const sourcePtr, const std::array<int, 4>& targetSize,
const std::array<int, 4>& sourceSize)
{
try
{
......@@ -67,7 +74,7 @@ namespace op
const auto numberSubparts = targetSize[3];
// log("sourceSize[0]: " + std::to_string(sourceSize[0])); // = 1
// log("sourceSize[1]: " + std::to_string(sourceSize[1])); // = #body parts + bck = 22 (hands) or 71 (face)
// log("sourceSize[1]: " + std::to_string(sourceSize[1])); // = #BodyParts + bkg = 22 (hands) or 71 (face)
// log("sourceSize[2]: " + std::to_string(sourceSize[2])); // = 368 = height
// log("sourceSize[3]: " + std::to_string(sourceSize[3])); // = 368 = width
// log("targetSize[0]: " + std::to_string(targetSize[0])); // = 1
......@@ -88,16 +95,20 @@ namespace op
// Option a - 6.3 fps
const auto sourceThrustPtr = thrust::device_pointer_cast(sourcePtrOffsetted);
// Ideal option (not working for CUDA < 8)
// const auto sourceIndexIterator = thrust::max_element(thrust::device, sourceThrustPtr, sourceThrustPtr + imageOffset);
// const auto sourceIndexIterator = thrust::max_element(
// thrust::device, sourceThrustPtr, sourceThrustPtr + imageOffset);
// Workaround to make it work for CUDA 7.5
const auto sourceIndexIterator = thrust::max_element(sourceThrustPtr, sourceThrustPtr + imageOffset);
const auto sourceIndexIterator = thrust::max_element(
sourceThrustPtr, sourceThrustPtr + imageOffset);
const auto sourceIndex = (int)(sourceIndexIterator - sourceThrustPtr);
fillTargetPtrPart<<<1, 1>>>(targetPtrOffsetted, sourcePtrOffsetted, sourceIndex, sourceIndex % width, sourceIndex / width);
fillTargetPtrPart<<<1, 1>>>(targetPtrOffsetted, sourcePtrOffsetted, sourceIndex,
sourceIndex % width, sourceIndex / width);
// // Option b - <1 fps
// fillTargetPtrChannel<<<1, 1>>>(targetPtrOffsetted, sourcePtrOffsetted, width, imageOffset);
}
// Option c - 4.9 fps
// fillTargetPtr<<<1, numberParts>>>(targetPtr, sourcePtr, width, imageOffset, numberSubparts, offsetChannel);
// fillTargetPtr<<<1, numberParts>>>(targetPtr, sourcePtr, width, imageOffset, numberSubparts,
// offsetChannel);
}
}
cudaCheck(__LINE__, __FUNCTION__, __FILE__);
......@@ -108,6 +119,10 @@ namespace op
}
}
template void maximumGpu(float* targetPtr, const float* const sourcePtr, const std::array<int, 4>& targetSize, const std::array<int, 4>& sourceSize);
template void maximumGpu(double* targetPtr, const double* const sourcePtr, const std::array<int, 4>& targetSize, const std::array<int, 4>& sourceSize);
template void maximumGpu(
float* targetPtr, const float* const sourcePtr, const std::array<int, 4>& targetSize,
const std::array<int, 4>& sourceSize);
template void maximumGpu(
double* targetPtr, const double* const sourcePtr, const std::array<int, 4>& targetSize,
const std::array<int, 4>& sourceSize);
}
......@@ -158,10 +158,9 @@ namespace op
currentPeakCount++;
}
}
}
}
currTargetPtr[0] = currentPeakCount-1;
currTargetPtr[0] = T(currentPeakCount-1);
}
}
catch (const std::exception& e)
......@@ -170,10 +169,10 @@ namespace op
}
}
template void nmsCpu(float* targetPtr, int* kernelPtr, const float* const sourcePtr, const float threshold,
const std::array<int, 4>& targetSize, const std::array<int, 4>& sourceSize,
const Point<float>& offset);
template void nmsCpu(double* targetPtr, int* kernelPtr, const double* const sourcePtr, const double threshold,
const std::array<int, 4>& targetSize, const std::array<int, 4>& sourceSize,
const Point<double>& offset);
template OP_API void nmsCpu(
float* targetPtr, int* kernelPtr, const float* const sourcePtr, const float threshold,
const std::array<int, 4>& targetSize, const std::array<int, 4>& sourceSize, const Point<float>& offset);
template OP_API void nmsCpu(
double* targetPtr, int* kernelPtr, const double* const sourcePtr, const double threshold,
const std::array<int, 4>& targetSize, const std::array<int, 4>& sourceSize, const Point<double>& offset);
}
......@@ -244,10 +244,10 @@ namespace op
}
}
template void nmsGpu(float* targetPtr, int* kernelPtr, const float* const sourcePtr, const float threshold,
const std::array<int, 4>& targetSize, const std::array<int, 4>& sourceSize,
const Point<float>& offset);
template void nmsGpu(double* targetPtr, int* kernelPtr, const double* const sourcePtr, const double threshold,
const std::array<int, 4>& targetSize, const std::array<int, 4>& sourceSize,
const Point<double>& offset);
template void nmsGpu(
float* targetPtr, int* kernelPtr, const float* const sourcePtr, const float threshold,
const std::array<int, 4>& targetSize, const std::array<int, 4>& sourceSize, const Point<float>& offset);
template void nmsGpu(
double* targetPtr, int* kernelPtr, const double* const sourcePtr, const double threshold,
const std::array<int, 4>& targetSize, const std::array<int, 4>& sourceSize, const Point<double>& offset);
}
......@@ -262,10 +262,12 @@ namespace op
}
}
template void nmsOcl(float* targetPtr, int* kernelPtr, const float* const sourcePtr, const float threshold,
const std::array<int, 4>& targetSize, const std::array<int, 4>& sourceSize,
const Point<float>& offset, const int gpuID);
template void nmsOcl(double* targetPtr, int* kernelPtr, const double* const sourcePtr, const double threshold,
const std::array<int, 4>& targetSize, const std::array<int, 4>& sourceSize,
const Point<double>& offset, const int gpuID);
template void nmsOcl(
float* targetPtr, int* kernelPtr, const float* const sourcePtr, const float threshold,
const std::array<int, 4>& targetSize, const std::array<int, 4>& sourceSize, const Point<float>& offset,
const int gpuID);
template void nmsOcl(
double* targetPtr, int* kernelPtr, const double* const sourcePtr, const double threshold,
const std::array<int, 4>& targetSize, const std::array<int, 4>& sourceSize, const Point<double>& offset,
const int gpuID);
}
......@@ -113,12 +113,10 @@ namespace op
}
}
template void resizeAndMergeCpu(float* targetPtr, const std::vector<const float*>& sourcePtrs,
const std::array<int, 4>& targetSize,
const std::vector<std::array<int, 4>>& sourceSizes,
const std::vector<float>& scaleInputToNetInputs);
template void resizeAndMergeCpu(double* targetPtr, const std::vector<const double*>& sourcePtrs,
const std::array<int, 4>& targetSize,
const std::vector<std::array<int, 4>>& sourceSizes,
const std::vector<double>& scaleInputToNetInputs);
template OP_API void resizeAndMergeCpu(
float* targetPtr, const std::vector<const float*>& sourcePtrs, const std::array<int, 4>& targetSize,
const std::vector<std::array<int, 4>>& sourceSizes, const std::vector<float>& scaleInputToNetInputs);
template OP_API void resizeAndMergeCpu(
double* targetPtr, const std::vector<const double*>& sourcePtrs, const std::array<int, 4>& targetSize,
const std::vector<std::array<int, 4>>& sourceSizes, const std::vector<double>& scaleInputToNetInputs);
}
......@@ -113,7 +113,7 @@ namespace op
else
{
const auto targetChannelOffset = targetWidth * targetHeight;
cudaMemset(targetPtr, 0.f, channels*targetChannelOffset * sizeof(T));
cudaMemset(targetPtr, 0, channels*targetChannelOffset * sizeof(T));
const auto scaleToMainScaleWidth = targetWidth / T(sourceWidth);
const auto scaleToMainScaleHeight = targetHeight / T(sourceHeight);
......@@ -146,7 +146,7 @@ namespace op
resizeKernelAndAverage<<<numBlocks, threadsPerBlock>>>(
targetPtr + c * targetChannelOffset, sourcePtrs[i] + c * sourceChannelOffset,
scaleWidth, scaleHeight, currentWidth, currentHeight, targetWidth,
targetHeight, sourceSizes.size()
targetHeight, (int)sourceSizes.size()
);
}
}
......@@ -161,12 +161,10 @@ namespace op
}
}
template void resizeAndMergeGpu(float* targetPtr, const std::vector<const float*>& sourcePtrs,
const std::array<int, 4>& targetSize,
const std::vector<std::array<int, 4>>& sourceSizes,
const std::vector<float>& scaleInputToNetInputs);
template void resizeAndMergeGpu(double* targetPtr, const std::vector<const double*>& sourcePtrs,
const std::array<int, 4>& targetSize,
const std::vector<std::array<int, 4>>& sourceSizes,
const std::vector<double>& scaleInputToNetInputs);
template void resizeAndMergeGpu(
float* targetPtr, const std::vector<const float*>& sourcePtrs, const std::array<int, 4>& targetSize,
const std::vector<std::array<int, 4>>& sourceSizes, const std::vector<float>& scaleInputToNetInputs);
template void resizeAndMergeGpu(
double* targetPtr, const std::vector<const double*>& sourcePtrs, const std::array<int, 4>& targetSize,
const std::vector<std::array<int, 4>>& sourceSizes, const std::vector<double>& scaleInputToNetInputs);
}
......@@ -56,8 +56,8 @@ namespace op
// return v1 + 0.5f * dx * (v2 - v0 + dx * (2.f * v0 - 5.f * v1 + 4.f * v2 - v3 + dx * (3.f * (v1 - v2) + v3 - v0)));
}
Type bicubicInterpolate(__global const Type* sourcePtr, const Type xSource, const Type ySource, const int widthSource,
const int heightSource, const int widthSourcePtr)
Type bicubicInterpolate(__global const Type* sourcePtr, const Type xSource, const Type ySource,
const int widthSource, const int heightSource, const int widthSourcePtr)
{
int xIntArray[4];
int yIntArray[4];
......@@ -232,7 +232,8 @@ namespace op
cl::Buffer targetPtrBuffer = cl::Buffer((cl_mem)(targetPtr), true);
auto resizeAndMergeFullKernel = op::OpenCL::getInstance(gpuID)->getKernelFunctorFromManager
<op::ResizeAndMergeFullFunctor, T>(
"resizeAndMergeFullKernel",op::resizeAndMergeOclCommonFunctions+op::resizeAndMergeFullKernel);
"resizeAndMergeFullKernel",
op::resizeAndMergeOclCommonFunctions+op::resizeAndMergeFullKernel);
auto resizeAndMergeKernel = op::OpenCL::getInstance(gpuID)->getKernelFunctorFromManager
<op::ResizeAndMergeFunctor, T>(
"resizeAndMergeKernel",op::resizeAndMergeOclCommonFunctions+op::resizeAndMergeKernel);
......@@ -274,8 +275,9 @@ namespace op
{
// Allocate memory on GPU once
if(sourceTempPtrs[0] == nullptr){
cl::Buffer* sourcePtrBufferIdealX = new cl::Buffer(op::OpenCL::getInstance(gpuID)->getContext(), CL_MEM_READ_WRITE,
sizeof(float) * channels * sourceWidthIdeal * sourceHeightIdeal);
cl::Buffer* sourcePtrBufferIdealX = new cl::Buffer(
op::OpenCL::getInstance(gpuID)->getContext(), CL_MEM_READ_WRITE,
sizeof(float) * channels * sourceWidthIdeal * sourceHeightIdeal);
sourceTempPtrs[0] = (T*)sourcePtrBufferIdealX->get();
}
cl::Buffer sourcePtrBufferIdeal = cl::Buffer((cl_mem)(sourceTempPtrs[0]), true);
......@@ -291,14 +293,14 @@ namespace op
{
const auto offset = offsetBase + c;
cl_buffer_region targerRegion, sourceRegion;
OpenCL::getBufferRegion<T>(targerRegion, offset * targetChannelOffset, targetChannelOffset);
cl::Buffer targetBuffer = targetPtrBuffer.createSubBuffer(CL_MEM_READ_WRITE,
CL_BUFFER_CREATE_TYPE_REGION,
&targerRegion);
op::OpenCL::getBufferRegion<T>(sourceRegion, offset * sourceChannelOffsetIdeal, sourceChannelOffsetIdeal);
cl::Buffer sourceBuffer = sourcePtrBufferIdeal.createSubBuffer(CL_MEM_READ_ONLY,
CL_BUFFER_CREATE_TYPE_REGION,
&sourceRegion);
OpenCL::getBufferRegion<T>(
targerRegion, offset * targetChannelOffset, targetChannelOffset);
cl::Buffer targetBuffer = targetPtrBuffer.createSubBuffer(
CL_MEM_READ_WRITE, CL_BUFFER_CREATE_TYPE_REGION, &targerRegion);
op::OpenCL::getBufferRegion<T>(
sourceRegion, offset * sourceChannelOffsetIdeal, sourceChannelOffsetIdeal);
cl::Buffer sourceBuffer = sourcePtrBufferIdeal.createSubBuffer(
CL_MEM_READ_ONLY, CL_BUFFER_CREATE_TYPE_REGION, &sourceRegion);
resizeAndMergeKernel(cl::EnqueueArgs(op::OpenCL::getInstance(gpuID)->getQueue(),
cl::NDRange(targetWidth, targetHeight)),
targetBuffer, sourceBuffer,
......@@ -309,7 +311,8 @@ namespace op
}
// Old inefficient multi-scale merging
else
error("It should never reache this point. Notify us otherwise.", __LINE__, __FUNCTION__, __FILE__);
error("It should never reache this point. Notify us otherwise.",
__LINE__, __FUNCTION__, __FILE__);
}
// Multi-scaling merging
else
......@@ -339,8 +342,9 @@ namespace op
// Allocate memory on GPU once
if(sourceTempPtrs[i] == nullptr){
cl::Buffer* sourcePtrBufferIdealX = new cl::Buffer(op::OpenCL::getInstance(gpuID)->getContext(), CL_MEM_READ_WRITE,
sizeof(float) * channels * currentWidthIdeal * currentHeightIdeal);
cl::Buffer* sourcePtrBufferIdealX = new cl::Buffer(
op::OpenCL::getInstance(gpuID)->getContext(), CL_MEM_READ_WRITE,
sizeof(float) * channels * currentWidthIdeal * currentHeightIdeal);
sourceTempPtrs[i] = (T*)sourcePtrBufferIdealX->get();
}
cl::Buffer sourcePtrBufferIdeal = cl::Buffer((cl_mem)(sourceTempPtrs[i]), true);
......@@ -357,21 +361,19 @@ namespace op
for (auto c = 0 ; c < channels ; c++)
{
cl_buffer_region targerRegion, sourceRegion;
op::OpenCL::getBufferRegion<T>(targerRegion, c * targetChannelOffset, targetChannelOffset);
op::OpenCL::getBufferRegion<T>(sourceRegion, c * sourceChannelOffsetIdeal, sourceChannelOffsetIdeal);
cl::Buffer targetBuffer = targetPtrBuffer.createSubBuffer(CL_MEM_READ_WRITE,
CL_BUFFER_CREATE_TYPE_REGION,
&targerRegion);
cl::Buffer sourceBuffer = sourcePtrBufferIdeal.createSubBuffer(CL_MEM_READ_WRITE,
CL_BUFFER_CREATE_TYPE_REGION,
&sourceRegion);
resizeAndAddKernel(cl::EnqueueArgs(OpenCL::getInstance(gpuID)->getQueue(),
cl::NDRange(targetWidth, targetHeight)),
targetBuffer, sourceBuffer,
scaleWidth, scaleHeight,
currentWidthIdeal, currentHeightIdeal,
targetWidth, targetHeight,
(currentWidthIdeal-currentWidth), (currentHeightIdeal-currentHeight));
op::OpenCL::getBufferRegion<T>(
targerRegion, c * targetChannelOffset, targetChannelOffset);
op::OpenCL::getBufferRegion<T>(
sourceRegion, c * sourceChannelOffsetIdeal, sourceChannelOffsetIdeal);
cl::Buffer targetBuffer = targetPtrBuffer.createSubBuffer(
CL_MEM_READ_WRITE, CL_BUFFER_CREATE_TYPE_REGION, &targerRegion);
cl::Buffer sourceBuffer = sourcePtrBufferIdeal.createSubBuffer(
CL_MEM_READ_WRITE, CL_BUFFER_CREATE_TYPE_REGION, &sourceRegion);
resizeAndAddKernel(cl::EnqueueArgs(
OpenCL::getInstance(gpuID)->getQueue(), cl::NDRange(targetWidth, targetHeight)),
targetBuffer, sourceBuffer, scaleWidth, scaleHeight, currentWidthIdeal,
currentHeightIdeal, targetWidth, targetHeight, (currentWidthIdeal-currentWidth),
(currentHeightIdeal-currentHeight));
}
}
// Last image --> average all
......@@ -380,22 +382,19 @@ namespace op
for (auto c = 0 ; c < channels ; c++)
{
cl_buffer_region targerRegion, sourceRegion;
op::OpenCL::getBufferRegion<T>(targerRegion, c * targetChannelOffset, targetChannelOffset);
op::OpenCL::getBufferRegion<T>(sourceRegion, c * sourceChannelOffsetIdeal, sourceChannelOffsetIdeal);
cl::Buffer targetBuffer = targetPtrBuffer.createSubBuffer(CL_MEM_READ_WRITE,
CL_BUFFER_CREATE_TYPE_REGION,
&targerRegion);
cl::Buffer sourceBuffer = sourcePtrBufferIdeal.createSubBuffer(CL_MEM_READ_WRITE,
CL_BUFFER_CREATE_TYPE_REGION,
&sourceRegion);
resizeAndAverageKernel(cl::EnqueueArgs(OpenCL::getInstance(gpuID)->getQueue(),
cl::NDRange(targetWidth, targetHeight)),
targetBuffer, sourceBuffer,
scaleWidth, scaleHeight,
currentWidthIdeal, currentHeightIdeal,
targetWidth, targetHeight,
(currentWidthIdeal-currentWidth), (currentHeightIdeal-currentHeight),
(int)sourceSizes.size());
op::OpenCL::getBufferRegion<T>(
targerRegion, c * targetChannelOffset, targetChannelOffset);
op::OpenCL::getBufferRegion<T>(
sourceRegion, c * sourceChannelOffsetIdeal, sourceChannelOffsetIdeal);
cl::Buffer targetBuffer = targetPtrBuffer.createSubBuffer(
CL_MEM_READ_WRITE, CL_BUFFER_CREATE_TYPE_REGION, &targerRegion);
cl::Buffer sourceBuffer = sourcePtrBufferIdeal.createSubBuffer(
CL_MEM_READ_WRITE, CL_BUFFER_CREATE_TYPE_REGION, &sourceRegion);
resizeAndAverageKernel(cl::EnqueueArgs(
OpenCL::getInstance(gpuID)->getQueue(), cl::NDRange(targetWidth, targetHeight)),
targetBuffer, sourceBuffer, scaleWidth, scaleHeight, currentWidthIdeal,
currentHeightIdeal, targetWidth, targetHeight, (currentWidthIdeal-currentWidth),
(currentHeightIdeal-currentHeight), (int)sourceSizes.size());
}
}
}
......@@ -425,17 +424,13 @@ namespace op
}
}
template void resizeAndMergeOcl(float* targetPtr, const std::vector<const float*>& sourcePtrs,
std::vector<float*>& sourceTempPtrs,
const std::array<int, 4>& targetSize,
const std::vector<std::array<int, 4>>& sourceSizes,
const std::vector<float>& scaleInputToNetInputs,
int gpuID);
template void resizeAndMergeOcl(double* targetPtr, const std::vector<const double*>& sourcePtrs,
std::vector<double*>& sourceTempPtrs,
const std::array<int, 4>& targetSize,
const std::vector<std::array<int, 4>>& sourceSizes,
const std::vector<double>& scaleInputToNetInputs,
int gpuID);
template void resizeAndMergeOcl(
float* targetPtr, const std::vector<const float*>& sourcePtrs, std::vector<float*>& sourceTempPtrs,
const std::array<int, 4>& targetSize, const std::vector<std::array<int, 4>>& sourceSizes,
const std::vector<float>& scaleInputToNetInputs, const int gpuID);
template void resizeAndMergeOcl(
double* targetPtr, const std::vector<const double*>& sourcePtrs, std::vector<double*>& sourceTempPtrs,
const std::array<int, 4>& targetSize, const std::vector<std::array<int, 4>>& sourceSizes,
const std::vector<double>& scaleInputToNetInputs, const int gpuID);
}
......@@ -241,7 +241,7 @@ namespace op
const auto* candidatesCpuPtr = getCandidatesCpuConstPtr();
for (auto part = 0u ; part < numberBodyParts ; part++)
{
const auto numberPartCandidates = candidatesCpuPtr[part*peaksArea];
const auto numberPartCandidates = intRound(candidatesCpuPtr[part*peaksArea]);
candidates[part].resize(numberPartCandidates);
const auto* partCandidatesPtr = &candidatesCpuPtr[part*peaksArea+3];
for (auto candidate = 0 ; candidate < numberPartCandidates ; candidate++)
......
......@@ -137,10 +137,10 @@ namespace op
? numberBodyParts
: elementRendered - 4);
elementRenderedName = mPartIndexToName.at(realElementRendered);
renderPoseHeatMapGpu(*spGpuMemory, mPoseModel, frameSize,
spPoseExtractorNet->getHeatMapGpuConstPtr(),
heatMapSize, scaleNetToOutput * scaleInputToOutput, realElementRendered,
(mBlendOriginalFrame ? getAlphaHeatMap() : 1.f));
renderPoseHeatMapGpu(
*spGpuMemory, frameSize, spPoseExtractorNet->getHeatMapGpuConstPtr(), heatMapSize,
scaleNetToOutput * scaleInputToOutput, realElementRendered,
(mBlendOriginalFrame ? getAlphaHeatMap() : 1.f));
}
// Draw affinity between 2 body parts
else if (elementRendered <= lastPAFChannel)
......@@ -162,13 +162,13 @@ namespace op
error("Neck-part distance channel only for BODY_25D.",
__LINE__, __FUNCTION__, __FILE__);
const auto distancePart = (elementRendered - lastPAFChannel - 1);
const auto distancePartMapped = numberBodyPartsPlusBkg + numberBodyPAFChannels
+ distancePart;
const auto distancePartMapped = (unsigned int)(
numberBodyPartsPlusBkg + numberBodyPAFChannels + distancePart);
elementRenderedName = mPartIndexToName.at(distancePartMapped);
renderPoseDistance(*spGpuMemory, mPoseModel, frameSize,
spPoseExtractorNet->getHeatMapGpuConstPtr(),
heatMapSize, scaleNetToOutput * scaleInputToOutput, distancePartMapped,
(mBlendOriginalFrame ? getAlphaHeatMap() : 1.f));
renderPoseDistanceGpu(
*spGpuMemory, frameSize, spPoseExtractorNet->getHeatMapGpuConstPtr(), heatMapSize,
scaleNetToOutput * scaleInputToOutput, distancePartMapped,
(mBlendOriginalFrame ? getAlphaHeatMap() : 1.f));
}
}
}
......
......@@ -34,11 +34,11 @@ namespace op
{
if (bodyPart != 1u)
{
const auto mapIdx = numberBodyPartsPlusBkg + bodyPartPairs.size() + 2*bodyPart
- (bodyPart > 0 ? 2 : 0);
const auto mapIdxD = (unsigned int)
(numberBodyPartsPlusBkg + bodyPartPairs.size() + 2*bodyPart - (bodyPart > 0 ? 2 : 0));
const auto baseLine = partToName.at(1) + "->" + partToName.at(bodyPart);
partToName[mapIdx] = baseLine + "(X)";
partToName[mapIdx+1] = baseLine + "(Y)";
partToName[mapIdxD] = baseLine + "(X)";
partToName[mapIdxD+1] = baseLine + "(Y)";
}
}
}
......
......@@ -397,7 +397,7 @@ namespace op
__global__ void renderBodyPartHeatMap(float* targetPtr, const int targetWidth, const int targetHeight,
const float* const heatMapPtr, const int widthHeatMap,
const int heightHeatMap, const float scaleToKeepRatio, const int part,
const int heightHeatMap, const float scaleToKeepRatio, const unsigned int part,
const float alphaColorToAdd, const bool absValue = false)
{
const auto x = (blockIdx.x * blockDim.x) + threadIdx.x;
......@@ -632,9 +632,9 @@ namespace op
}
}
void renderPoseHeatMapGpu(float* framePtr, const PoseModel poseModel, const Point<int>& frameSize,
const float* const heatMapPtr, const Point<int>& heatMapSize,
const float scaleToKeepRatio, const int part, const float alphaBlending)
void renderPoseHeatMapGpu(float* framePtr, const Point<int>& frameSize, const float* const heatMapPtr,
const Point<int>& heatMapSize, const float scaleToKeepRatio, const unsigned int part,
const float alphaBlending)
{
try
{
......@@ -715,9 +715,9 @@ namespace op
}
}
void renderPoseDistance(float* framePtr, const PoseModel poseModel, const Point<int>& frameSize,
const float* const heatMapPtr, const Point<int>& heatMapSize, const float scaleToKeepRatio,
const int part, const float alphaBlending)
void renderPoseDistanceGpu(float* framePtr, const Point<int>& frameSize, const float* const heatMapPtr,
const Point<int>& heatMapSize, const float scaleToKeepRatio, const unsigned int part,
const float alphaBlending)
{
try
{
......
......@@ -243,7 +243,7 @@ namespace op
{
cvMat = cv::Mat(mResolution.y, mResolution.x, CV_8UC3, cv::Scalar{0,0,0});
putTextOnCvMat(cvMat, "Camera disconnected, reconnecting...", {cvMat.cols/16, cvMat.rows/2},
cv::Scalar{255, 255, 255}, false, 2.3*cvMat.cols);
cv::Scalar{255, 255, 255}, false, intRound(2.3*cvMat.cols));
}
// Move to buffer
if (!cvMat.empty())
......
......@@ -115,7 +115,7 @@ namespace op
{
for (auto p = 0; p < poseKeypoints.getSize(0); p++)
{
const int currentPerson = mNextPersonId++;
const auto currentPerson = int(mNextPersonId++);
// Create person entry in the tracking map
auto& personEntry = personEntries[currentPerson];
......@@ -258,7 +258,7 @@ namespace op
if (poseIds[i] == -1)
poseIds[i] = nextPersonId++;
const auto& openposePersonEntry = openposePersonEntries.at(i);
personEntries[poseIds[i]] = openposePersonEntry;
personEntries[(int)poseIds[i]] = openposePersonEntry;
}
return poseIds;
......
......@@ -18,7 +18,7 @@ namespace op
return numToRound + multiple - remainder;
}
float computePersonScale(const PersonTrackerEntry& personEntry, const cv::Mat& imageCurrent)
int computePersonScale(const PersonTrackerEntry& personEntry, const cv::Mat& imageCurrent)
{
int layerCount = 0;
if (personEntry.status[0] || personEntry.status[14] ||
......@@ -33,10 +33,10 @@ namespace op
personEntry.status[12] || personEntry.status[13])
layerCount++;
float minX = imageCurrent.size().width;
float maxX = 0;
float minY = imageCurrent.size().height;
float maxY = 0;
float minX = (float)imageCurrent.size().width;
float maxX = 0.f;
float minY = (float)imageCurrent.size().height;
float maxY = 0.f;
int totalKp = 0;
for (size_t i=0; i<personEntry.keypoints.size(); i++)
{
......@@ -61,9 +61,7 @@ namespace op
maxDist = (xDist)*(4/layerCount);
else
maxDist = (yDist)*(4/layerCount);
const float lkSize = roundUp(int(maxDist / 10.), 3);
// std::cout << lkSize << std::endl;
return lkSize;
return roundUp(int(maxDist / 10.), 3);
}
void updateLK(std::unordered_map<int,PersonTrackerEntry>& personEntries,
......@@ -150,7 +148,7 @@ namespace op
personEntries.clear();
for (int i=0; i<poseKeypoints.getSize(0); i++)
{
const auto id = poseIds[i];
const auto id = int(poseIds[i]);
personEntries[id] = PersonTrackerEntry();
personEntries[id].keypoints.resize(poseKeypoints.getSize(1));
personEntries[id].status.resize(poseKeypoints.getSize(1));
......@@ -205,7 +203,7 @@ namespace op
// Update or Add
for (int i=0; i<poseIds.getSize(0); i++)
{
const auto id = poseIds[i];
const auto id = int(poseIds[i]);
// Update
if (personEntries.count(id) && mergeResults)
......@@ -223,14 +221,14 @@ namespace op
i*poseKeypoints.getSize(1)*poseKeypoints.getSize(2) +
j*poseKeypoints.getSize(2) + 2];
const cv::Point lkPoint = personEntry.keypoints[j];
const cv::Point opPoint = cv::Point(x,y);
const cv::Point opPoint{intRound(x), intRound(y)};
if (prob < confidenceThreshold)
personEntries[id].status[j] = 0;
else
{
personEntries[id].status[j] = 1;
float distance = sqrt(pow(lkPoint.x-opPoint.x,2)+pow(lkPoint.y-opPoint.y,2));
const auto distance = sqrt(pow(lkPoint.x-opPoint.x,2)+pow(lkPoint.y-opPoint.y,2));
if (distance < 5)
personEntries[id].keypoints[j] = lkPoint;
else if (distance < 10)
......@@ -302,7 +300,7 @@ namespace op
{(int)personEntries.size(), (int)personEntries.begin()->second.keypoints.size(), 3});
for (auto i=0; i<poseIds.getSize(0); i++)
{
const int id = poseIds[i];
const auto id = int(poseIds[i]);
const PersonTrackerEntry& pe = personEntries.at(id);
const int baseIndexY = i*poseKeypoints.getSize(1)*poseKeypoints.getSize(2);
for (int j=0 ; j<poseKeypoints.getSize(1) ; j++)
......@@ -310,7 +308,7 @@ namespace op
const auto baseIndex = baseIndexY + j*poseKeypoints.getSize(2);
poseKeypoints[baseIndex] = pe.keypoints[j].x;
poseKeypoints[baseIndex+1] = pe.keypoints[j].y;
poseKeypoints[baseIndex+2] = (int)pe.status[j];
poseKeypoints[baseIndex+2] = float(int(pe.status[j]));
if (pe.keypoints[j].x == 0 && pe.keypoints[j].y == 0)
poseKeypoints[baseIndex+2] = 0;
}
......@@ -421,7 +419,8 @@ namespace op
// Rescale
if (mRescale)
{
cv::Size rescaleSize(mRescale,mImagePrevious.size().height/(mImagePrevious.size().width/mRescale));
cv::Size rescaleSize{
intRound(mRescale), intRound(mImagePrevious.size().height/(mImagePrevious.size().width/mRescale))};
cv::resize(mImagePrevious, mImagePrevious, rescaleSize, 0, 0, cv::INTER_CUBIC);
}
// Save Last Ids
......@@ -440,12 +439,13 @@ namespace op
float xScale = 1., yScale = 1.;
if (mRescale)
{
cv::Size rescaleSize(mRescale,imageCurrent.size().height/(imageCurrent.size().width/mRescale));
xScale = (float)imageCurrent.size().width / (float)rescaleSize.width;
yScale = (float)imageCurrent.size().height / (float)rescaleSize.height;
cv::Size rescaleSize{
intRound(mRescale), intRound(imageCurrent.size().height/(imageCurrent.size().width/mRescale))};
xScale = imageCurrent.size().width / (float)rescaleSize.width;
yScale = imageCurrent.size().height / (float)rescaleSize.height;
cv::resize(imageCurrent, imageCurrent, rescaleSize, 0, 0, cv::INTER_CUBIC);
}
scaleKeypoints(mPersonEntries, 1./xScale, 1./yScale);
scaleKeypoints(mPersonEntries, 1.f/xScale, 1.f/yScale);
updateLK(mPersonEntries, mPyramidImagesPrevious, pyramidImagesCurrent, mImagePrevious,
imageCurrent, mLevels, mPatchSize, mTrackVelocity, mScaleVarying);
scaleKeypoints(mPersonEntries, xScale, yScale);
......
......@@ -174,8 +174,8 @@ namespace op
const auto baseIndex = (i-1)*patchSize;
for (auto j = 1; j <= patchSize; j++)
{
ix[baseIndex+j-1] = (patch[i][j+1] - patch[i][j-1])/2.0;
iy[baseIndex+j-1] = (patch[i+1][j] - patch[i-1][j])/2.0;
ix[baseIndex+j-1] = (patch[i][j+1] - patch[i][j-1])/2.f;
iy[baseIndex+j-1] = (patch[i+1][j] - patch[i-1][j])/2.f;
}
}
// Get `it`
......@@ -285,13 +285,13 @@ namespace op
std::vector<std::vector<float>> patchIt(patchSize, std::vector<float>(patchSize));
status = extractPatch(patch, (int)pointI.x,(int)pointI.y, patchSize + 2, I);
// if (status)
// return result;
// if (status)
// return result;
status = extractPatchIt(patchIt, pointI.x, pointI.y, pointJ.x, pointJ.y, I, J, patchSize);
status = extractPatchIt(patchIt, int(pointI.x), int(pointI.y), int(pointJ.x), int(pointJ.y), I, J, patchSize);
// if (status)
// return result;
// if (status)
// return result;
// Get the Ix, Iy and It vectors
std::vector<float> ix, iy, it;
......@@ -301,8 +301,8 @@ namespace op
cv::Point2f delta;
status = computeLK(delta, ix, iy, it);
// if (status)
// return result;
// if (status)
// return result;
result = pointJ + delta;
......
......@@ -24,10 +24,10 @@ namespace op
return T(-1);
}
}
template float getDistance(const Array<float>& keypoints, const int person, const int elementA,
const int elementB);
template double getDistance(const Array<double>& keypoints, const int person, const int elementA,
const int elementB);
template OP_API float getDistance(
const Array<float>& keypoints, const int person, const int elementA, const int elementB);
template OP_API double getDistance(
const Array<double>& keypoints, const int person, const int elementA, const int elementB);
template <typename T>
void averageKeypoints(Array<T>& keypointsA, const Array<T>& keypointsB, const int personA)
......@@ -60,8 +60,10 @@ namespace op
error(e.what(), __LINE__, __FUNCTION__, __FILE__);
}
}
template void averageKeypoints(Array<float>& keypointsA, const Array<float>& keypointsB, const int personA);
template void averageKeypoints(Array<double>& keypointsA, const Array<double>& keypointsB, const int personA);
template OP_API void averageKeypoints(
Array<float>& keypointsA, const Array<float>& keypointsB, const int personA);
template OP_API void averageKeypoints(
Array<double>& keypointsA, const Array<double>& keypointsB, const int personA);
template <typename T>
void scaleKeypoints(Array<T>& keypoints, const T scale)
......@@ -97,8 +99,8 @@ namespace op
error(e.what(), __LINE__, __FUNCTION__, __FILE__);
}
}
template void scaleKeypoints(Array<float>& keypoints, const float scale);
template void scaleKeypoints(Array<double>& keypoints, const double scale);
template OP_API void scaleKeypoints(Array<float>& keypoints, const float scale);
template OP_API void scaleKeypoints(Array<double>& keypoints, const double scale);
template <typename T>
void scaleKeypoints2d(Array<T>& keypoints, const T scaleX, const T scaleY)
......@@ -131,8 +133,8 @@ namespace op
error(e.what(), __LINE__, __FUNCTION__, __FILE__);
}
}
template void scaleKeypoints2d(Array<float>& keypoints, const float scaleX, const float scaleY);
template void scaleKeypoints2d(Array<double>& keypoints, const double scaleX, const double scaleY);
template OP_API void scaleKeypoints2d(Array<float>& keypoints, const float scaleX, const float scaleY);
template OP_API void scaleKeypoints2d(Array<double>& keypoints, const double scaleX, const double scaleY);
template <typename T>
void scaleKeypoints2d(Array<T>& keypoints, const T scaleX, const T scaleY, const T offsetX, const T offsetY)
......@@ -165,10 +167,11 @@ namespace op
error(e.what(), __LINE__, __FUNCTION__, __FILE__);
}
}
template void scaleKeypoints2d(Array<float>& keypoints, const float scaleX, const float scaleY,
const float offsetX, const float offsetY);
template void scaleKeypoints2d(Array<double>& keypoints, const double scaleX, const double scaleY,
const double offsetX, const double offsetY);
template OP_API void scaleKeypoints2d(
Array<float>& keypoints, const float scaleX, const float scaleY, const float offsetX, const float offsetY);
template OP_API void scaleKeypoints2d(
Array<double>& keypoints, const double scaleX, const double scaleY, const double offsetX,
const double offsetY);
template <typename T>
void renderKeypointsCpu(Array<T>& frameArray, const Array<T>& keypoints, const std::vector<unsigned int>& pairs,
......@@ -223,8 +226,8 @@ namespace op
const auto index2 = (person * numberKeypoints + pairs[pair+1]) * keypoints.getSize(2);
if (keypoints[index1+2] > threshold && keypoints[index2+2] > threshold)
{
const auto thicknessLineScaled = thicknessLine
* poseScales[pairs[pair+1] % numberScales];
const auto thicknessLineScaled = intRound(
thicknessLine * poseScales[pairs[pair+1] % numberScales]);
const auto colorIndex = pairs[pair+1]*3; // Before: colorIndex = pair/2*3;
const cv::Scalar color{
colors[(colorIndex+2) % numberColors],
......@@ -243,8 +246,8 @@ namespace op
const auto faceIndex = (person * numberKeypoints + part) * keypoints.getSize(2);
if (keypoints[faceIndex+2] > threshold)
{
const auto radiusScaled = radius * poseScales[part % numberScales];
const auto thicknessCircleScaled = thicknessCircle * poseScales[part % numberScales];
const auto radiusScaled = intRound(radius * poseScales[part % numberScales]);
const auto thicknessCircleScaled = intRound(thicknessCircle * poseScales[part % numberScales]);
const auto colorIndex = part*3;
const cv::Scalar color{
colors[(colorIndex+2) % numberColors],
......@@ -266,14 +269,14 @@ namespace op
error(e.what(), __LINE__, __FUNCTION__, __FILE__);
}
}
template void renderKeypointsCpu(Array<float>& frameArray, const Array<float>& keypoints,
const std::vector<unsigned int>& pairs, const std::vector<float> colors,
const float thicknessCircleRatio, const float thicknessLineRatioWRTCircle,
const std::vector<float>& poseScales, const float threshold);
template void renderKeypointsCpu(Array<double>& frameArray, const Array<double>& keypoints,
const std::vector<unsigned int>& pairs, const std::vector<double> colors,
const double thicknessCircleRatio, const double thicknessLineRatioWRTCircle,
const std::vector<double>& poseScales, const double threshold);
template OP_API void renderKeypointsCpu(
Array<float>& frameArray, const Array<float>& keypoints, const std::vector<unsigned int>& pairs,
const std::vector<float> colors, const float thicknessCircleRatio, const float thicknessLineRatioWRTCircle,
const std::vector<float>& poseScales, const float threshold);
template OP_API void renderKeypointsCpu(
Array<double>& frameArray, const Array<double>& keypoints, const std::vector<unsigned int>& pairs,
const std::vector<double> colors, const double thicknessCircleRatio, const double thicknessLineRatioWRTCircle,
const std::vector<double>& poseScales, const double threshold);
template <typename T>
Rectangle<T> getKeypointsRectangle(const Array<T>& keypoints, const int person, const T threshold)
......@@ -320,10 +323,10 @@ namespace op
return Rectangle<T>{};
}
}
template Rectangle<float> getKeypointsRectangle(const Array<float>& keypoints, const int person,
const float threshold);
template Rectangle<double> getKeypointsRectangle(const Array<double>& keypoints, const int person,
const double threshold);
template OP_API Rectangle<float> getKeypointsRectangle(
const Array<float>& keypoints, const int person, const float threshold);
template OP_API Rectangle<double> getKeypointsRectangle(
const Array<double>& keypoints, const int person, const double threshold);
template <typename T>
T getAverageScore(const Array<T>& keypoints, const int person)
......@@ -348,8 +351,8 @@ namespace op
return T(0);
}
}
template float getAverageScore(const Array<float>& keypoints, const int person);
template double getAverageScore(const Array<double>& keypoints, const int person);
template OP_API float getAverageScore(const Array<float>& keypoints, const int person);
template OP_API double getAverageScore(const Array<double>& keypoints, const int person);
template <typename T>
T getKeypointsArea(const Array<T>& keypoints, const int person, const T threshold)
......@@ -364,8 +367,8 @@ namespace op
return T(0);
}
}
template float getKeypointsArea(const Array<float>& keypoints, const int person, const float threshold);
template double getKeypointsArea(const Array<double>& keypoints, const int person, const double threshold);
template OP_API float getKeypointsArea(const Array<float>& keypoints, const int person, const float threshold);
template OP_API double getKeypointsArea(const Array<double>& keypoints, const int person, const double threshold);
template <typename T>
int getBiggestPerson(const Array<T>& keypoints, const T threshold)
......@@ -397,6 +400,6 @@ namespace op
return -1;
}
}
template int getBiggestPerson(const Array<float>& keypoints, const float threshold);
template int getBiggestPerson(const Array<double>& keypoints, const double threshold);
template OP_API int getBiggestPerson(const Array<float>& keypoints, const float threshold);
template OP_API int getBiggestPerson(const Array<double>& keypoints, const double threshold);
}
......@@ -125,7 +125,7 @@ namespace op
{
const auto scaleDenseNet = 0.017;
const int imageArea = width * height;
const std::array<float,3> means{103.94,116.78,123.68};
const std::array<float,3> means{103.94f, 116.78f, 123.68f};
for (auto i = 0 ; i < 3 ; i++)
{
cv::Mat floatPtrImageCvWrapper(height, width, CV_32FC1, floatPtrImage + i*imageArea);
......
......@@ -118,14 +118,14 @@ namespace op
std::unique_lock<std::mutex> lock{sMutexProfiler};
if (sProfilerTuple.count(key) > 0)
{
const auto tuple = sProfilerTuple[key];
const auto tupleElement = sProfilerTuple[key];
lock.unlock();
if (std::get<1>(tuple) == x)
if (std::get<1>(tupleElement) == x)
{
printAveragedTimeMsCommon(std::get<0>(tuple), std::get<1>(tuple), line, function, file);
printAveragedTimeMsCommon(std::get<0>(tupleElement), std::get<1>(tupleElement), line, function, file);
// Reset
const std::lock_guard<std::mutex> lock{sMutexProfiler};
const std::lock_guard<std::mutex> lockGuard{sMutexProfiler};
auto& tuple = sProfilerTuple[key];
std::get<0>(tuple) = 0.;
std::get<1>(tuple) = 0;
......@@ -150,9 +150,9 @@ namespace op
log("GPU usage.", Priority::Max, line, function, file);
// GPU info
const auto answer = std::system("nvidia-smi | grep \"Processes:\"")
| std::system("nvidia-smi | grep \"Process name\"");
if (answer != 0)
const auto nvidiaCommand = std::system("nvidia-smi | grep \"Processes:\"")
| std::system("nvidia-smi | grep \"Process name\"");
if (nvidiaCommand != 0)
log("Error on the nvidia-smi header. Please, inform us of this error.", Priority::Max);
else
{
......
......@@ -48,6 +48,20 @@ namespace op
}
}
// Signed
template OP_API std::string toFixedLengthString<char>(const char number, const unsigned long long stringLength);
template OP_API std::string toFixedLengthString<signed char>(const signed char number, const unsigned long long stringLength);
template OP_API std::string toFixedLengthString<short>(const short number, const unsigned long long stringLength);
template OP_API std::string toFixedLengthString<int>(const int number, const unsigned long long stringLength);
template OP_API std::string toFixedLengthString<long>(const long number, const unsigned long long stringLength);
template OP_API std::string toFixedLengthString<long long>(const long long number, const unsigned long long stringLength);
// Unsigned
template OP_API std::string toFixedLengthString<unsigned char>(const unsigned char number, const unsigned long long stringLength);
template OP_API std::string toFixedLengthString<unsigned short>(const unsigned short number, const unsigned long long stringLength);
template OP_API std::string toFixedLengthString<unsigned int>(const unsigned int number, const unsigned long long stringLength);
template OP_API std::string toFixedLengthString<unsigned long>(const unsigned long number, const unsigned long long stringLength);
template OP_API std::string toFixedLengthString<unsigned long long>(const unsigned long long number, const unsigned long long stringLength);
std::vector<std::string> splitString(const std::string& stringToSplit, const std::string& delimiter)
{
try
......@@ -99,19 +113,4 @@ namespace op
return "";
}
}
// Signed
template std::string toFixedLengthString<char>(const char number, const unsigned long long stringLength);
template std::string toFixedLengthString<signed char>(const signed char number, const unsigned long long stringLength);
template std::string toFixedLengthString<short>(const short number, const unsigned long long stringLength);
template std::string toFixedLengthString<int>(const int number, const unsigned long long stringLength);
template std::string toFixedLengthString<long>(const long number, const unsigned long long stringLength);
template std::string toFixedLengthString<long long>(const long long number, const unsigned long long stringLength);
// Unsigned
template std::string toFixedLengthString<unsigned char>(const unsigned char number, const unsigned long long stringLength);
template std::string toFixedLengthString<unsigned short>(const unsigned short number, const unsigned long long stringLength);
template std::string toFixedLengthString<unsigned int>(const unsigned int number, const unsigned long long stringLength);
template std::string toFixedLengthString<unsigned long>(const unsigned long number, const unsigned long long stringLength);
template std::string toFixedLengthString<unsigned long long>(const unsigned long long number, const unsigned long long stringLength);
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册