mirror of
https://github.com/gosticks/openpose.git
synced 2026-08-12 12:20:22 +00:00
Improved chessboard point ordering algorithm
This commit is contained in:
@@ -293,6 +293,8 @@ OpenPose Library - Release Notes
|
||||
23. Video (`--write_video`) can be generated from images (`--image_dir`), as long as they maintain the same resolution.
|
||||
24. Added `--fps_max` flag to limit the maximum processing frame rate of OpenPose (useful to display results at a maximum desired speed).
|
||||
25. Frame undistortion can be applied not only to FLIR cameras, but also to all other input sources (image, webcam, video, etc.).
|
||||
26. Calibration improvements:
|
||||
1. Improved chessboard orientation detection, more robust and less errors.
|
||||
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.
|
||||
|
||||
@@ -44,7 +44,7 @@ SUFFIX="_${SCALES}"
|
||||
HAND_RESULTS_FOLDER_BASE=${PEOPLE_JSON_FOLDER}"hand_keypoints_estimated"
|
||||
HAND_RESULTS_FOLDER_NO_BB=${HAND_RESULTS_FOLDER_BASE}"_old"${SUFFIX}
|
||||
HAND_RESULTS_FOLDER_BB=${HAND_RESULTS_FOLDER_BASE}"_BBox"${SUFFIX}
|
||||
HAND_RESULTS_FOLDER_BODY_59=${HAND_RESULTS_FOLDER_BASE}"_BODY_59"
|
||||
HAND_RESULTS_FOLDER_BODY_65=${HAND_RESULTS_FOLDER_BASE}"_BODY_65"
|
||||
|
||||
|
||||
|
||||
@@ -74,12 +74,12 @@ rm -rf $HAND_RESULTS_FOLDER_NO_BB
|
||||
|
||||
|
||||
|
||||
# No bounding box BODY_59
|
||||
echo "Output on ${HAND_RESULTS_FOLDER_BODY_59}"
|
||||
rm -rf $HAND_RESULTS_FOLDER_BODY_59
|
||||
# No bounding box BODY_65
|
||||
echo "Output on ${HAND_RESULTS_FOLDER_BODY_65}"
|
||||
rm -rf $HAND_RESULTS_FOLDER_BODY_65
|
||||
# 1 scale
|
||||
./build/examples/openpose/openpose.bin \
|
||||
--model_pose BODY_59 \
|
||||
--model_pose BODY_65 \
|
||||
--image_dir ${IMAGES_FOLDER} \
|
||||
--write_json $HAND_RESULTS_FOLDER_BODY_59 \
|
||||
--write_json $HAND_RESULTS_FOLDER_BODY_65 \
|
||||
--display 0
|
||||
|
||||
@@ -27,7 +27,7 @@ namespace op
|
||||
const std::vector<cv::Point2f>& points2DVector, const cv::Size& gridInnerCorners);
|
||||
|
||||
OP_API void reorderPoints(std::vector<cv::Point2f>& points2DVector, const cv::Size& gridInnerCorners,
|
||||
const Points2DOrigin points2DOriginDesired);
|
||||
const cv::Mat& image, const bool showWarning = true);
|
||||
|
||||
OP_API void plotGridCorners(
|
||||
const cv::Size& gridInnerCorners, const std::vector<cv::Point2f>& points2DVector,
|
||||
|
||||
@@ -17,16 +17,15 @@ namespace op
|
||||
MPI_15_4, /**< Variation of the MPI model, reduced number of CNN stages to 4: faster but less accurate.*/
|
||||
BODY_19, /**< Experimental. Do not use. */
|
||||
BODY_19_X2, /**< Experimental. Do not use. */
|
||||
BODY_59, /**< Experimental. Do not use. */
|
||||
BODY_19N, /**< Experimental. Do not use. */
|
||||
BODY_25E, /**< Experimental. Do not use. */
|
||||
BODY_25_19, /**< Experimental. Do not use. */
|
||||
BODY_65, /**< Experimental. Do not use. */
|
||||
CAR_12, /**< Experimental. Do not use. */
|
||||
BODY_25D, /**< Experimental. Do not use. */
|
||||
BODY_23, /**< Experimental. Do not use. */
|
||||
CAR_22, /**< Experimental. Do not use. */
|
||||
BODY_19E, /**< Experimental. Do not use. */
|
||||
BODY_25B, /**< Experimental. Do not use. */
|
||||
Size,
|
||||
};
|
||||
|
||||
|
||||
@@ -140,17 +140,13 @@ namespace op
|
||||
0.f, 255.f, 255.f, \
|
||||
0.f, 255.f, 255.f, \
|
||||
0.f, 255.f, 255.f
|
||||
// BODY_59
|
||||
// Body + left hand + right hand
|
||||
#define POSE_BODY_59_PAIRS_RENDER_GPU \
|
||||
1,8, 1,2, 1,5, 2,3, 3,4, 5,6, 6,7, 8,9, 9,10, 10,11, 8,12, 12,13, 13,14, 1,0, 0,15, 15,17, 0,16, 16,18, \
|
||||
7,19, 19,20, 20,21, 21,22, 7,23, 23,24, 24,25, 25,26, 7,27, 27,28, 28,29, 29,30, 7,31, 31,32, 32,33, 33,34, 7,35, 35,36, 36,37, 37,38, \
|
||||
4,39, 39,40, 40,41, 41,42, 4,43, 43,44, 44,45, 45,46, 4,47, 47,48, 48,49, 49,50, 4,51, 51,52, 52,53, 53,54, 4,55, 55,56, 56,57, 57,58
|
||||
#define POSE_BODY_59_SCALES_RENDER_GPU \
|
||||
1.f,1.f,1.f,1.f,1.f, 1.f,1.f,1.f,1.f,1.f, 1.f,1.f,1.f,1.f,1.f, 1.f,1.f,1.f,1.f, \
|
||||
0.75f,0.75f,0.75f,0.75f,0.75f, 0.75f,0.75f,0.75f,0.75f,0.75f, 0.75f,0.75f,0.75f,0.75f,0.75f, 0.75f,0.75f,0.75f,0.75f,0.75f, \
|
||||
0.75f,0.75f,0.75f,0.75f,0.75f, 0.75f,0.75f,0.75f,0.75f,0.75f, 0.75f,0.75f,0.75f,0.75f,0.75f, 0.75f,0.75f,0.75f,0.75f,0.75f
|
||||
#define POSE_BODY_59_COLORS_RENDER_GPU \
|
||||
// BODY_25B
|
||||
#define POSE_BODY_25B_PAIRS_RENDER_GPU \
|
||||
0,1, 0,2, 1,3, 2,4, 5,7, 6,8, 7,9, 8,10, 5,11, 6,12, 11,13, 12,14, 13,15, 14,16, \
|
||||
15,19, 19,20, 15,21, 16,22, 22,23, 16,24, 5,17, \
|
||||
6,17, 17,18, 11,12
|
||||
#define POSE_BODY_25B_SCALES_RENDER_GPU 1
|
||||
#define POSE_BODY_25B_COLORS_RENDER_GPU \
|
||||
255.f, 0.f, 85.f, \
|
||||
255.f, 0.f, 0.f, \
|
||||
255.f, 85.f, 0.f, \
|
||||
@@ -170,48 +166,12 @@ namespace op
|
||||
170.f, 0.f, 255.f, \
|
||||
255.f, 0.f, 255.f, \
|
||||
85.f, 0.f, 255.f, \
|
||||
\
|
||||
255.f, 0.f, 0.f, \
|
||||
191.f, 47.f, 47.f, \
|
||||
127.f, 63.f, 63.f, \
|
||||
63.f, 47.f, 47.f, \
|
||||
255.f, 76.f, 0.f, \
|
||||
191.f, 57.f, 0.f, \
|
||||
127.f, 38.f, 0.f, \
|
||||
63.f, 19.f, 0.f, \
|
||||
255.f, 152.f, 0.f, \
|
||||
191.f, 114.f, 0.f, \
|
||||
127.f, 76.f, 0.f, \
|
||||
63.f, 38.f, 0.f, \
|
||||
255.f, 255.f, 0.f, \
|
||||
191.f, 191.f, 0.f, \
|
||||
127.f, 127.f, 0.f, \
|
||||
63.f, 63.f, 0.f, \
|
||||
0.f, 255.f, 0.f, \
|
||||
0.f, 191.f, 0.f, \
|
||||
0.f, 127.f, 0.f, \
|
||||
0.f, 63.f, 0.f, \
|
||||
\
|
||||
255.f, 0.f, 153.f, \
|
||||
191.f, 0.f, 114.f, \
|
||||
127.f, 0.f, 76.f, \
|
||||
63.f, 0.f, 38.f, \
|
||||
203.f, 0.f, 255.f, \
|
||||
152.f, 0.f, 191.f, \
|
||||
101.f, 0.f, 127.f, \
|
||||
50.f, 0.f, 63.f, \
|
||||
50.f, 0.f, 255.f, \
|
||||
37.f, 0.f, 191.f, \
|
||||
25.f, 0.f, 127.f, \
|
||||
12.f, 0.f, 63.f, \
|
||||
0.f, 102.f, 255.f, \
|
||||
0.f, 76.f, 191.f, \
|
||||
0.f, 51.f, 127.f, \
|
||||
0.f, 25.f, 63.f, \
|
||||
0.f, 255.f, 255.f, \
|
||||
0.f, 191.f, 191.f, \
|
||||
0.f, 127.f, 127.f, \
|
||||
0.f, 63.f, 63.f
|
||||
0.f, 0.f, 255.f, \
|
||||
0.f, 0.f, 255.f, \
|
||||
0.f, 0.f, 255.f, \
|
||||
0.f, 255.f, 255.f, \
|
||||
0.f, 255.f, 255.f, \
|
||||
0.f, 255.f, 255.f
|
||||
// BODY_65
|
||||
// Body + left hand + right hand
|
||||
#define POSE_BODY_65_PAIRS_RENDER_GPU \
|
||||
|
||||
@@ -225,7 +225,7 @@ namespace op
|
||||
// Sanity check
|
||||
if (!poseKeypoints3D.empty() && poseKeypoints3D.getSize(1) != 19 && poseKeypoints3D.getSize(1) != 25
|
||||
&& poseKeypoints3D.getSize(1) != 65)
|
||||
error("Only working for BODY_19 or BODY_25/BODY_25_19 or BODY_65 (#parts = "
|
||||
error("Only working for BODY_19 or BODY_25 or BODY_65 (#parts = "
|
||||
+ std::to_string(poseKeypoints3D.getSize(2)) + ").",
|
||||
__LINE__, __FUNCTION__, __FILE__);
|
||||
// Shorter naming
|
||||
|
||||
@@ -497,7 +497,7 @@ namespace op
|
||||
|
||||
// Reordering points2DVector to have the first point at the top left position (top right in
|
||||
// case the chessboard is mirrored)
|
||||
reorderPoints(points2DVector, gridInnerCorners, Points2DOrigin::TopLeft);
|
||||
reorderPoints(points2DVector, gridInnerCorners, image);
|
||||
|
||||
// Generate objects3DVector from gridSquareSizeMm
|
||||
const auto objects3DVector = getObjects3DVector(gridInnerCorners, gridSquareSizeMm);
|
||||
@@ -779,7 +779,7 @@ namespace op
|
||||
// Reorder & save 2D pixels points
|
||||
if (found)
|
||||
{
|
||||
reorderPoints(points2DVector, gridInnerCornersCvSize, Points2DOrigin::TopLeft);
|
||||
reorderPoints(points2DVector, gridInnerCornersCvSize, image);
|
||||
for (auto i = 0 ; i < numberCorners ; i++)
|
||||
matchIndexesCamera.emplace_back(viewIndex * numberCorners + i);
|
||||
}
|
||||
@@ -884,7 +884,9 @@ namespace op
|
||||
// Reorder & save 2D pixels points
|
||||
if (found)
|
||||
{
|
||||
reorderPoints(points2DVector, gridInnerCornersCvSize, Points2DOrigin::TopLeft);
|
||||
// For intrinsics order is irrelevant, so I do not care if it fails
|
||||
const auto showWarning = false;
|
||||
reorderPoints(points2DVector, gridInnerCornersCvSize, image, showWarning);
|
||||
points2DVectors.emplace_back(points2DVector);
|
||||
}
|
||||
else
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
#include <openpose/utilities/fastMath.hpp>
|
||||
#include <openpose/utilities/fileSystem.hpp>
|
||||
#include <openpose/calibration/gridPatternFunctions.hpp>
|
||||
|
||||
@@ -118,7 +119,7 @@ namespace op
|
||||
if (chessboardFound && image.size().width != tempImage.size().width)
|
||||
{
|
||||
log("Chessboard found at lower resolution (" + std::to_string(tempImage.cols) + "x"
|
||||
+ std::to_string(tempImage.rows) + ".", Priority::High);
|
||||
+ std::to_string(tempImage.rows) + ").", Priority::High);
|
||||
for (auto& point : points2DVector)
|
||||
point *= (image.size().width / tempImage.size().width);
|
||||
}
|
||||
@@ -310,37 +311,234 @@ namespace op
|
||||
}
|
||||
|
||||
void reorderPoints(std::vector<cv::Point2f>& points2DVector, const cv::Size& gridInnerCorners,
|
||||
const Points2DOrigin points2DOriginDesired)
|
||||
const cv::Mat& image, const bool showWarning)
|
||||
{
|
||||
try
|
||||
{
|
||||
const auto points2DOriginCurrent = getPoints2DOrigin(gridInnerCorners, points2DVector);
|
||||
|
||||
// No mirrored image
|
||||
if (points2DOriginDesired == Points2DOrigin::TopLeft)
|
||||
const auto debugging = false;
|
||||
// gridInnerCorners is 2 even
|
||||
// In this case, there will be 2 black corners in diagonal, and 2 white ones in the opposite diagonal
|
||||
// No way to get absolute orientation.
|
||||
// OR
|
||||
// gridInnerCorners is 2 odd
|
||||
// In this case, there will be all black (or white) corners in diagonal, and 2 white ones in the opposite
|
||||
// diagonal
|
||||
// No way to get absolute orientation.
|
||||
if ((gridInnerCorners.width % 2 == 0 && gridInnerCorners.height % 2 == 0)
|
||||
|| (gridInnerCorners.width % 2 == 1 && gridInnerCorners.height % 2 == 1))
|
||||
{
|
||||
if (points2DOriginCurrent == Points2DOrigin::TopRight)
|
||||
invertXPositionsIndices(points2DVector, gridInnerCorners);
|
||||
else if (points2DOriginCurrent == Points2DOrigin::BottomLeft)
|
||||
{
|
||||
std::reverse(points2DVector.begin(), points2DVector.end());
|
||||
invertXPositionsIndices(points2DVector, gridInnerCorners);
|
||||
}
|
||||
else if (points2DOriginCurrent == Points2DOrigin::BottomRight)
|
||||
std::reverse(points2DVector.begin(), points2DVector.end());
|
||||
// Warning
|
||||
if (showWarning)
|
||||
log("For maximum multi-view accuracy: The number of corners of the chessboard should be even in"
|
||||
" 1 dimension and odd in the other (e.g., 1x2, 2x1, 1x4, 3x8, 6x9, 9x6, etc.). Otherwise,"
|
||||
" extrinsics calibration results might be affected.", Priority::High);
|
||||
// Old method
|
||||
const auto points2DOriginCurrent = getPoints2DOrigin(gridInnerCorners, points2DVector);
|
||||
// // No mirrored image
|
||||
// if (points2DOriginDesired == Points2DOrigin::TopLeft)
|
||||
// {
|
||||
if (points2DOriginCurrent == Points2DOrigin::TopRight)
|
||||
invertXPositionsIndices(points2DVector, gridInnerCorners);
|
||||
else if (points2DOriginCurrent == Points2DOrigin::BottomLeft)
|
||||
{
|
||||
std::reverse(points2DVector.begin(), points2DVector.end());
|
||||
invertXPositionsIndices(points2DVector, gridInnerCorners);
|
||||
}
|
||||
else if (points2DOriginCurrent == Points2DOrigin::BottomRight)
|
||||
std::reverse(points2DVector.begin(), points2DVector.end());
|
||||
// }
|
||||
// // Mirrored image
|
||||
// else if (points2DOriginDesired == Points2DOrigin::TopRight)
|
||||
// {
|
||||
// if (points2DOriginCurrent == Points2DOrigin::TopLeft)
|
||||
// invertXPositionsIndices(points2DVector, gridInnerCorners);
|
||||
// else if (points2DOriginCurrent == Points2DOrigin::BottomLeft)
|
||||
// std::reverse(points2DVector.begin(), points2DVector.end());
|
||||
// else if (points2DOriginCurrent == Points2DOrigin::BottomRight)
|
||||
// {
|
||||
// std::reverse(points2DVector.begin(), points2DVector.end());
|
||||
// invertXPositionsIndices(points2DVector, gridInnerCorners);
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
// Mirrored image
|
||||
else if (points2DOriginDesired == Points2DOrigin::TopRight)
|
||||
// gridInnerCorners is 1 even, 1 odd
|
||||
// In this case, there will be 2 consecutive white and 2 consecutive black corners.
|
||||
// Easy to get absolute orientation: We detect the 2 black corners. Then, we pick as main one the black
|
||||
// one whose left is white and right is black (only 1 satisfies this) by cross product properties.
|
||||
else
|
||||
{
|
||||
if (points2DOriginCurrent == Points2DOrigin::TopLeft)
|
||||
invertXPositionsIndices(points2DVector, gridInnerCorners);
|
||||
else if (points2DOriginCurrent == Points2DOrigin::BottomLeft)
|
||||
std::reverse(points2DVector.begin(), points2DVector.end());
|
||||
else if (points2DOriginCurrent == Points2DOrigin::BottomRight)
|
||||
const auto outterCornerIndices = getOutterCornerIndices(points2DVector, gridInnerCorners);
|
||||
const std::vector<cv::Point2f> fourPointsVector{
|
||||
points2DVector.at(outterCornerIndices.at(0)),
|
||||
points2DVector.at(outterCornerIndices.at(1)),
|
||||
points2DVector.at(outterCornerIndices.at(2)),
|
||||
points2DVector.at(outterCornerIndices.at(3))
|
||||
};
|
||||
const auto point01 = fourPointsVector.at(0)-fourPointsVector.at(1);
|
||||
const auto point01Norm = cv::norm(point01);
|
||||
const auto point02 = fourPointsVector.at(0)-fourPointsVector.at(2);
|
||||
const auto point02Norm = cv::norm(point02);
|
||||
const auto point13 = fourPointsVector.at(1)-fourPointsVector.at(3);
|
||||
const auto point13Norm = cv::norm(point13);
|
||||
const auto averageSquareSizePx =
|
||||
(point01Norm/gridInnerCorners.width
|
||||
+ point02Norm/gridInnerCorners.height
|
||||
+ point13Norm/gridInnerCorners.height
|
||||
+ cv::norm(fourPointsVector.at(3)-fourPointsVector.at(2))/gridInnerCorners.width)
|
||||
/ 4.;
|
||||
// Debugging
|
||||
if (debugging)
|
||||
log("\naverageSquareSizePx: " + std::to_string(averageSquareSizePx));
|
||||
// How many pixels does the outter square has?
|
||||
// 0.67 is a threshold to be safe
|
||||
const auto diagonalLength = 0.67 * std::sqrt(2) * averageSquareSizePx;
|
||||
// Debugging
|
||||
if (debugging)
|
||||
log("diagonalLength: " + std::to_string(diagonalLength));
|
||||
|
||||
// In which direction do I have to look?
|
||||
// Normal vector between corners 0-1, 0-2, 1-3?
|
||||
const auto point01Direction = 1. / point01Norm * point01;
|
||||
const auto point02Direction = 1. / point02Norm * point02;
|
||||
const auto point13Direction = 1. / point13Norm * point13;
|
||||
// Debugging
|
||||
if (debugging)
|
||||
{
|
||||
log("\npoint01Direction:");
|
||||
log(point01Direction);
|
||||
log("point02Direction:");
|
||||
log(point02Direction);
|
||||
log("point13Direction:");
|
||||
log(point13Direction);
|
||||
log(" ");
|
||||
}
|
||||
|
||||
auto pointDirection = fourPointsVector; // Initialization
|
||||
pointDirection[0] = 1. / cv::norm(point01Direction + point02Direction)
|
||||
* (point01Direction + point02Direction);
|
||||
pointDirection[1] = pointDirection[0];
|
||||
pointDirection[1].y *= -1;
|
||||
pointDirection[2] = pointDirection[0];
|
||||
pointDirection[2].x *= -1;
|
||||
pointDirection[3] = -pointDirection[0];
|
||||
// Debugging
|
||||
if (debugging)
|
||||
{
|
||||
for (auto i = 0u ; i < fourPointsVector.size() ; i++)
|
||||
{
|
||||
log("pointDirection[" + std::to_string(i) + "]:");
|
||||
log(pointDirection[i]);
|
||||
}
|
||||
log(" ");
|
||||
}
|
||||
|
||||
// Get line to check whether outter grid color is black
|
||||
auto pointLimit = fourPointsVector; // Initialization
|
||||
for (auto i = 0u ; i < fourPointsVector.size() ; i++)
|
||||
pointLimit[i] = fourPointsVector[i] + diagonalLength * pointDirection[i];
|
||||
|
||||
// Line search to see if white or black
|
||||
std::vector<double> meanPxValues(fourPointsVector.size());
|
||||
const auto numberPointsInLine = 25;
|
||||
const auto imageSize = image.size();
|
||||
for (auto i = 0u ; i < fourPointsVector.size() ; i++)
|
||||
{
|
||||
auto sum = 0.;
|
||||
auto count = 0u;
|
||||
for (auto lm = 0; lm < numberPointsInLine; lm++)
|
||||
{
|
||||
const auto mX = fastMax(
|
||||
0, fastMin(imageSize.width-1, intRound(fourPointsVector[i].x + lm*pointDirection[i].x)));
|
||||
const auto mY = fastMax(
|
||||
0, fastMin(imageSize.height-1, intRound(fourPointsVector[i].y + lm*pointDirection[i].y)));
|
||||
const cv::Vec3b bgrValue = image.at<cv::Vec3b>(mY, mX);
|
||||
sum += (bgrValue.val[0] + bgrValue.val[1] + bgrValue.val[2])/3;
|
||||
count++;
|
||||
}
|
||||
meanPxValues[i] = sum/count;
|
||||
// Debugging
|
||||
if (debugging)
|
||||
log("meanPxValues[" + std::to_string(i) + "]: " + std::to_string(meanPxValues[i]));
|
||||
}
|
||||
|
||||
// Get black indexes
|
||||
const bool blackIs0 = meanPxValues[0] < meanPxValues[3];
|
||||
bool blackIs1 = meanPxValues[1] < meanPxValues[2];
|
||||
|
||||
// Debugging
|
||||
if (debugging)
|
||||
{
|
||||
// Plotting visually results
|
||||
auto imageToPlot = image.clone();
|
||||
for (auto i = 0u ; i < fourPointsVector.size() ; i++)
|
||||
cv::line(imageToPlot, fourPointsVector[i], pointLimit[i], cv::Scalar{0,0,255}, 10);
|
||||
// Black indexes
|
||||
log(" ");
|
||||
log("blackIs0: " + std::to_string(blackIs0));
|
||||
log("blackIs1: " + std::to_string(blackIs1));
|
||||
// Plotting results
|
||||
// Chessboard before
|
||||
drawGridCorners(imageToPlot, gridInnerCorners, points2DVector);
|
||||
cv::pyrDown(imageToPlot, imageToPlot);
|
||||
cv::imshow("image_before", imageToPlot);
|
||||
}
|
||||
|
||||
// Apply transformations
|
||||
// For simplicity, we assume 0 is black
|
||||
if (!blackIs0)
|
||||
{
|
||||
std::reverse(points2DVector.begin(), points2DVector.end());
|
||||
invertXPositionsIndices(points2DVector, gridInnerCorners);
|
||||
blackIs1 = !blackIs1;
|
||||
// Debugging
|
||||
if (debugging)
|
||||
log("Swapping 0 and 3 so 0 is black.");
|
||||
}
|
||||
// Lead is 0 or 1||2 (depending on blackIs1)?
|
||||
const auto outterCornerIndicesAfter = getOutterCornerIndices(points2DVector, gridInnerCorners);
|
||||
const auto middle = 0.25f*(
|
||||
fourPointsVector[0] + fourPointsVector[1] + fourPointsVector[2] + fourPointsVector[3]);
|
||||
const std::vector<cv::Point2f> fourPointsVectorAfter{
|
||||
points2DVector.at(outterCornerIndicesAfter.at(0)) - middle,
|
||||
points2DVector.at(outterCornerIndicesAfter.at(1)) - middle,
|
||||
points2DVector.at(outterCornerIndicesAfter.at(2)) - middle,
|
||||
points2DVector.at(outterCornerIndicesAfter.at(3)) - middle
|
||||
};
|
||||
const auto crossProduct = fourPointsVectorAfter[0].cross(fourPointsVectorAfter[(blackIs1 ? 1 : 2)]);
|
||||
// Debugging
|
||||
if (debugging)
|
||||
log("crossProduct: " + std::to_string(crossProduct));
|
||||
const auto leadIs0 = crossProduct < 0;
|
||||
// Second transformation
|
||||
if (!leadIs0)
|
||||
{
|
||||
// Debugging
|
||||
if (debugging)
|
||||
log("Lead is not 0.");
|
||||
// Second black is 1
|
||||
if (blackIs1)
|
||||
{
|
||||
// Debugging
|
||||
if (debugging)
|
||||
log("Lead was 1.");
|
||||
invertXPositionsIndices(points2DVector, gridInnerCorners); // 1->0
|
||||
}
|
||||
// Second black is 2
|
||||
else
|
||||
{
|
||||
// Debugging
|
||||
if (debugging)
|
||||
log("Lead was 2.");
|
||||
std::reverse(points2DVector.begin(), points2DVector.end()); // 2->3
|
||||
invertXPositionsIndices(points2DVector, gridInnerCorners); // 3->0
|
||||
}
|
||||
}
|
||||
|
||||
// Debugging
|
||||
if (debugging)
|
||||
{
|
||||
// Chessboard after
|
||||
plotGridCorners(gridInnerCorners, points2DVector, "image_after.jpg", image);
|
||||
cv::waitKey(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -357,10 +555,8 @@ namespace op
|
||||
try
|
||||
{
|
||||
cv::Mat imageToPlot = image.clone();
|
||||
|
||||
// Draw corners
|
||||
drawGridCorners(imageToPlot, gridInnerCorners, points2DVector);
|
||||
|
||||
// Plotting results
|
||||
const std::string windowName = getFileNameAndExtension(imagePath);
|
||||
cv::pyrDown(imageToPlot, imageToPlot);
|
||||
|
||||
@@ -74,7 +74,7 @@ namespace op
|
||||
// - double: person subset score
|
||||
std::vector<std::pair<std::vector<int>, T>> peopleVector;
|
||||
const auto& mapIdx = getPoseMapIndex(poseModel);
|
||||
const auto numberBodyPartsAndBkg = numberBodyParts + 1;
|
||||
const auto numberBodyPartsAndBkg = numberBodyParts + (poseModel != PoseModel::BODY_25B ? 1 : 0);
|
||||
const auto vectorSize = numberBodyParts+1;
|
||||
const auto peaksOffset = 3*(maxPeaks+1);
|
||||
const auto heatMapOffset = heatMapSize.area();
|
||||
|
||||
@@ -196,7 +196,7 @@ namespace op
|
||||
{
|
||||
#ifdef USE_CAFFE
|
||||
const auto heatMapsBlob = bottom.at(0);
|
||||
const auto* const heatMapsPtr = heatMapsBlob->cpu_data(); // ~8.5 ms COCO, 27ms BODY_59
|
||||
const auto* const heatMapsPtr = heatMapsBlob->cpu_data(); // ~8.5 ms COCO, ~27ms BODY_65
|
||||
const auto* const peaksPtr = bottom.at(1)->cpu_data(); // ~0.02ms
|
||||
const auto maxPeaks = mTopSize[1];
|
||||
connectBodyPartsCpu(poseKeypoints, poseScores, heatMapsPtr, peaksPtr, mPoseModel,
|
||||
@@ -239,9 +239,10 @@ namespace op
|
||||
const auto numberBodyParts = getPoseNumberBodyParts(mPoseModel);
|
||||
const auto& mapIdxOffset = getPoseMapIndex(mPoseModel);
|
||||
// Update mapIdx
|
||||
const auto offset = (mPoseModel != PoseModel::BODY_25B ? 1 : 0);
|
||||
auto mapIdx = mapIdxOffset;
|
||||
for (auto& i : mapIdx)
|
||||
i += (numberBodyParts+1);
|
||||
i += (numberBodyParts+offset);
|
||||
// Re-allocate memory
|
||||
cudaMalloc((void **)&pBodyPartPairsGpuPtr, bodyPartPairs.size() * sizeof(unsigned int));
|
||||
cudaMemcpy(pBodyPartPairsGpuPtr, &bodyPartPairs[0], bodyPartPairs.size() * sizeof(unsigned int),
|
||||
|
||||
@@ -80,7 +80,8 @@ namespace op
|
||||
cpuToGpuMemoryIfNotCopiedYet(outputData.getPtr(), outputData.getVolume());
|
||||
cudaCheck(__LINE__, __FUNCTION__, __FILE__);
|
||||
const auto numberBodyParts = getPoseNumberBodyParts(mPoseModel);
|
||||
const auto numberBodyPartsPlusBkg = numberBodyParts+1;
|
||||
const auto hasBkg = (mPoseModel != PoseModel::BODY_25B);
|
||||
const auto numberBodyPartsPlusBkg = numberBodyParts + (hasBkg ? 1 : 0);
|
||||
const auto numberBodyPAFChannels = getPosePartPairs(mPoseModel).size();
|
||||
const Point<int> frameSize{outputData.getSize(1), outputData.getSize(0)};
|
||||
// Draw poseKeypoints
|
||||
@@ -134,8 +135,8 @@ namespace op
|
||||
else if (elementRendered <= numberBodyPartsPlusBkg+2)
|
||||
{
|
||||
const auto realElementRendered = (elementRendered == 1
|
||||
? numberBodyParts
|
||||
: elementRendered - 4);
|
||||
? (hasBkg ? numberBodyParts : 0)
|
||||
: elementRendered - 3 - (hasBkg ? 1:0));
|
||||
elementRenderedName = mPartIndexToName.at(realElementRendered);
|
||||
renderPoseHeatMapGpu(
|
||||
*spGpuMemory, frameSize, spPoseExtractorNet->getHeatMapGpuConstPtr(), heatMapSize,
|
||||
|
||||
@@ -119,41 +119,32 @@ namespace op
|
||||
{22, "RHeel"},
|
||||
{23, "Background"}
|
||||
};
|
||||
const std::map<unsigned int, std::string> POSE_BODY_59_BODY_PARTS {
|
||||
// Body
|
||||
const std::map<unsigned int, std::string> POSE_BODY_25B_BODY_PARTS {
|
||||
{0, "Nose"},
|
||||
{1, "Neck"},
|
||||
{2, "RShoulder"},
|
||||
{3, "RElbow"},
|
||||
{4, "RWrist"},
|
||||
{1, "LEye"},
|
||||
{2, "REye"},
|
||||
{3, "LEar"},
|
||||
{4, "REar"},
|
||||
{5, "LShoulder"},
|
||||
{6, "LElbow"},
|
||||
{7, "LWrist"},
|
||||
{8, "MidHip"},
|
||||
{9, "RHip"},
|
||||
{10, "RKnee"},
|
||||
{11, "RAnkle"},
|
||||
{12, "LHip"},
|
||||
{6, "RShoulder"},
|
||||
{7, "LElbow"},
|
||||
{8, "RElbow"},
|
||||
{9, "LWrist"},
|
||||
{10, "RWrist"},
|
||||
{11, "LHip"},
|
||||
{12, "RHip"},
|
||||
{13, "LKnee"},
|
||||
{14, "LAnkle"},
|
||||
{15, "REye"},
|
||||
{16, "LEye"},
|
||||
{17, "REar"},
|
||||
{18, "LEar"},
|
||||
// Left hand
|
||||
{19, "LThumb1CMC"}, {20, "LThumb2Knuckles"},{21, "LThumb3IP"}, {22, "LThumb4FingerTip"},
|
||||
{23, "LIndex1Knuckles"}, {24, "LIndex2PIP"}, {25, "LIndex3DIP"}, {26, "LIndex4FingerTip"},
|
||||
{27, "LMiddle1Knuckles"}, {28, "LMiddle2PIP"}, {29, "LMiddle3DIP"},{30, "LMiddle4FingerTip"},
|
||||
{31, "LRing1Knuckles"}, {32, "LRing2PIP"}, {33, "LRing3DIP"}, {34, "LRing4FingerTip"},
|
||||
{35, "LPinky1Knuckles"}, {36, "LPinky2PIP"}, {37, "LPinky3DIP"}, {38, "LPinky4FingerTip"},
|
||||
// Right hand
|
||||
{39, "RThumb1CMC"}, {40, "RThumb2Knuckles"},{41, "RThumb3IP"}, {42, "RThumb4FingerTip"},
|
||||
{43, "RIndex1Knuckles"}, {44, "RIndex2PIP"}, {45, "RIndex3DIP"}, {46, "RIndex4FingerTip"},
|
||||
{47, "RMiddle1Knuckles"}, {48, "RMiddle2PIP"}, {49, "RMiddle3DIP"},{50, "RMiddle4FingerTip"},
|
||||
{51, "RRing1Knuckles"}, {52, "RRing2PIP"}, {53, "RRing3DIP"}, {54, "RRing4FingerTip"},
|
||||
{55, "RPinky1Knuckles"}, {56, "RPinky2PIP"}, {57, "RPinky3DIP"}, {58, "RPinky4FingerTip"},
|
||||
// Background
|
||||
{59, "Background"},
|
||||
{14, "RKnee"},
|
||||
{15, "LAnkle"},
|
||||
{16, "RAnkle"},
|
||||
{17, "UpperNeck"},
|
||||
{18, "HeadTop"},
|
||||
{19, "LBigToe"},
|
||||
{20, "LSmallToe"},
|
||||
{21, "LHeel"},
|
||||
{22, "RBigToe"},
|
||||
{23, "RSmallToe"},
|
||||
{24, "RHeel"},
|
||||
};
|
||||
const std::map<unsigned int, std::string> POSE_BODY_65_BODY_PARTS {
|
||||
// Body
|
||||
@@ -273,14 +264,6 @@ namespace op
|
||||
std::vector<unsigned int>{
|
||||
0,1, 14,15, 22,23, 16,17, 18,19, 24,25, 26,27, 6,7, 2,3, 4,5, 8,9, 10,11, 12,13, 30,31, 32,33, 36,37, 34,35, 38,39, 20,21, 28,29
|
||||
},
|
||||
// BODY_59
|
||||
std::vector<unsigned int>{
|
||||
0,1, 14,15, 22,23, 16,17, 18,19, 24,25, 26,27, 6,7, 2,3, 4,5, 8,9, 10,11, 12,13, 30,31, 32,33, 36,37, 34,35, 38,39, 20,21, 28,29, // Body
|
||||
40,41, 42,43, 44,45, 46,47, 48,49, 14,51, 52,53, 54,55, 56,57, 58,59,
|
||||
60,61, 62,63, 64,65, 66,67, 68,69, 70,71, 72,73, 74,75, 76,77, 78,79,// Left hand
|
||||
80,81, 82,83, 84,85, 86,87, 88,89, 90,91, 92,93, 94,95, 96,97, 98,99,
|
||||
100,101, 102,103, 104,105, 106,107, 108,109, 110,111, 112,113, 114,115, 116,117, 118,119 // Right hand
|
||||
},
|
||||
// BODY_19N
|
||||
std::vector<unsigned int>{
|
||||
0,1, 14,15, 22,23, 16,17, 18,19, 24,25, 26,27, 6,7, 2,3, 4,5, 8,9, 10,11, 12,13, 30,31, 32,33, 36,37, 34,35, 38,39, 20,21, 28,29
|
||||
@@ -292,10 +275,6 @@ namespace op
|
||||
// Redundant ones
|
||||
48,49, 50,51, 52,53, 54,55, 56,57, 58,59, 60,61, 62,63, 64,65, 66,67, 68,69, 70,71, 72,73, 74,75
|
||||
},
|
||||
// BODY_25_19
|
||||
std::vector<unsigned int>{
|
||||
0,1, 14,15, 22,23, 16,17, 18,19, 24,25, 26,27, 6,7, 2,3, 4,5, 8,9, 10,11, 12,13, 30,31, 32,33, 36,37, 34,35, 38,39, 20,21, 28,29, 40,41,42,43,44,45, 46,47,48,49,50,51
|
||||
},
|
||||
// BODY_65
|
||||
std::vector<unsigned int>{
|
||||
0,1, 14,15, 22,23, 16,17, 18,19, 24,25, 26,27, 6,7, 2,3, 4,5, 8,9, 10,11, 12,13, 30,31, 32,33, 36,37, 34,35, 38,39, 20,21, 28,29, 40,41,42,43,44,45, 46,47,48,49,50,51, // Body
|
||||
@@ -331,13 +310,25 @@ namespace op
|
||||
// Redundant ones
|
||||
38,39, 40,41, 42,43, 44,45, 46,47, 48,49, 50,51, 52,53, 54,55, 56,57, 58,59, 60,61
|
||||
},
|
||||
// BODY_25B
|
||||
std::vector<unsigned int>{
|
||||
// Minimum spanning tree
|
||||
// |------------------------------------------- COCO Body -------------------------------------------|
|
||||
0,1, 2,3, 4,5, 6,7, 8,9,10,11, 12,13,14,15,16,17,18,19, 20,21, 22,23, 24,25, 26,27, 28,29, 30,31,
|
||||
// Redundant ones
|
||||
// |------------------ Foot ------------------| |-- MPII --|
|
||||
32,33, 34,35, 36,37, 38,39, 40,41, 42,43, 44,45, 46,47,
|
||||
// Redundant ones
|
||||
// MPII redundant, ears, ears-shoulders, shoulders-wrists, wrists, wrists-hips, hips, ankles)
|
||||
48,49, 50,51, 52,53, 54,55, 56,57, 58,59, 60,61, 62,63, 64,65, 66,67, 68,69, 70,71
|
||||
},
|
||||
};
|
||||
// POSE_BODY_PART_MAPPING on HPP crashes on Windows at dynamic initialization if it's on hpp
|
||||
const std::array<std::map<unsigned int, std::string>, (int)PoseModel::Size> POSE_BODY_PART_MAPPING{
|
||||
POSE_BODY_25_BODY_PARTS,POSE_COCO_BODY_PARTS, POSE_MPI_BODY_PARTS, POSE_MPI_BODY_PARTS,
|
||||
POSE_BODY_19_BODY_PARTS,POSE_BODY_19_BODY_PARTS,POSE_BODY_59_BODY_PARTS,POSE_BODY_19_BODY_PARTS,
|
||||
POSE_BODY_25_BODY_PARTS,POSE_BODY_25_BODY_PARTS,POSE_BODY_65_BODY_PARTS,POSE_CAR_12_PARTS,
|
||||
POSE_BODY_25_BODY_PARTS,POSE_BODY_23_BODY_PARTS,POSE_CAR_22_PARTS, POSE_BODY_19_BODY_PARTS
|
||||
POSE_BODY_19_BODY_PARTS,POSE_BODY_19_BODY_PARTS,POSE_BODY_19_BODY_PARTS,POSE_BODY_25_BODY_PARTS,
|
||||
POSE_BODY_65_BODY_PARTS,POSE_CAR_12_PARTS, POSE_BODY_25_BODY_PARTS,POSE_BODY_23_BODY_PARTS,
|
||||
POSE_CAR_22_PARTS, POSE_BODY_19_BODY_PARTS,POSE_BODY_25B_BODY_PARTS
|
||||
};
|
||||
|
||||
const std::array<std::string, (int)PoseModel::Size> POSE_PROTOTXT{
|
||||
@@ -347,16 +338,15 @@ namespace op
|
||||
"pose/mpi/pose_deploy_linevec_faster_4_stages.prototxt",
|
||||
"pose/body_19/pose_deploy.prototxt",
|
||||
"pose/body_19_x2/pose_deploy.prototxt",
|
||||
"pose/body_59/pose_deploy.prototxt",
|
||||
"pose/body_19n/pose_deploy.prototxt",
|
||||
"pose/body_25e/pose_deploy.prototxt",
|
||||
"pose/body_19_25/pose_deploy_25.prototxt",
|
||||
"pose/body_65/pose_deploy.prototxt",
|
||||
"car/car_12/pose_deploy.prototxt",
|
||||
"pose/body_25d/pose_deploy.prototxt",
|
||||
"pose/body_23/pose_deploy.prototxt",
|
||||
"car/car_22/pose_deploy.prototxt",
|
||||
"pose/body_19e/pose_deploy.prototxt",
|
||||
"pose/body_25b/pose_deploy.prototxt",
|
||||
};
|
||||
const std::array<std::string, (int)PoseModel::Size> POSE_TRAINED_MODEL{
|
||||
"pose/body_25/pose_iter_584000.caffemodel",
|
||||
@@ -365,22 +355,21 @@ namespace op
|
||||
"pose/mpi/pose_iter_160000.caffemodel",
|
||||
"pose/body_19/pose_iter_XXXXXX.caffemodel",
|
||||
"pose/body_19_x2/pose_iter_XXXXXX.caffemodel",
|
||||
"pose/body_59/pose_iter_XXXXXX.caffemodel",
|
||||
"pose/body_19n/pose_iter_XXXXXX.caffemodel",
|
||||
"pose/body_25e/pose_iter_XXXXXX.caffemodel",
|
||||
"pose/body_19_25/pose_iter_XXXXXX.caffemodel",
|
||||
"pose/body_65/pose_iter_XXXXXX.caffemodel",
|
||||
"car/car_12/pose_iter_XXXXXX.caffemodel",
|
||||
"pose/body_25d/pose_iter_XXXXXX.caffemodel",
|
||||
"pose/body_23/pose_iter_XXXXXX.caffemodel",
|
||||
"car/car_22/pose_iter_XXXXXX.caffemodel",
|
||||
"pose/body_19e/pose_iter_XXXXXX.caffemodel",
|
||||
"pose/body_25b/pose_iter_XXXXXX.caffemodel",
|
||||
};
|
||||
|
||||
// Constant Array Parameters
|
||||
// POSE_NUMBER_BODY_PARTS equivalent to size of std::map POSE_BODY_XX_BODY_PARTS - 1 (removing background)
|
||||
const std::array<unsigned int, (int)PoseModel::Size> POSE_NUMBER_BODY_PARTS{
|
||||
25, 18, 15, 15, 19, 19, 59, 19, 25, 25, 65, 12, 25, 23, 22, 19
|
||||
25, 18, 15, 15, 19, 19, 19, 25, 65, 12, 25, 23, 22, 19, 25
|
||||
};
|
||||
const std::array<std::vector<unsigned int>, (int)PoseModel::Size> POSE_BODY_PART_PAIRS{
|
||||
// BODY_25
|
||||
@@ -403,12 +392,6 @@ namespace op
|
||||
std::vector<unsigned int>{
|
||||
1,8, 1,2, 1,5, 2,3, 3,4, 5,6, 6,7, 8,9, 9,10, 10,11, 8,12, 12,13, 13,14, 1,0, 0,15, 15,17, 0,16, 16,18, 2,17, 5,18
|
||||
},
|
||||
// BODY_59
|
||||
std::vector<unsigned int>{
|
||||
1,8, 1,2, 1,5, 2,3, 3,4, 5,6, 6,7, 8,9, 9,10, 10,11, 8,12, 12,13, 13,14, 1,0, 0,15, 15,17, 0,16, 16,18, 2,17, 5,18,// Body
|
||||
7,19, 19,20, 20,21, 21,22, 7,23, 23,24, 24,25, 25,26, 7,27, 27,28, 28,29, 29,30, 7,31, 31,32, 32,33, 33,34, 7,35, 35,36, 36,37, 37,38, // Left hand
|
||||
4,39, 39,40, 40,41, 41,42, 4,43, 43,44, 44,45, 45,46, 4,47, 47,48, 48,49, 49,50, 4,51, 51,52, 52,53, 53,54, 4,55, 55,56, 56,57, 57,58 // Right hand
|
||||
},
|
||||
// BODY_19N
|
||||
std::vector<unsigned int>{
|
||||
1,8, 1,2, 1,5, 2,3, 3,4, 5,6, 6,7, 8,9, 9,10, 10,11, 8,12, 12,13, 13,14, 1,0, 0,15, 15,17, 0,16, 16,18, 2,17, 5,18
|
||||
@@ -423,10 +406,6 @@ namespace op
|
||||
// Ears-shoulders, shoulders-hips, shoulders-wrists, hips-ankles, wrists, ankles, wrists-hips, small toes-ankles)
|
||||
2,17, 5,18, 2,9, 5,12, 2,4, 5,7, 9,11, 12,14, 4,7, 11,14, 4,9, 7,12, 11,23, 14,20
|
||||
},
|
||||
// BODY_25_19
|
||||
std::vector<unsigned int>{
|
||||
1,8, 1,2, 1,5, 2,3, 3,4, 5,6, 6,7, 8,9, 9,10, 10,11, 8,12, 12,13, 13,14, 1,0, 0,15, 15,17, 0,16, 16,18, 2,17, 5,18, 14,19,19,20,14,21, 11,22,22,23,11,24
|
||||
},
|
||||
// BODY_65
|
||||
std::vector<unsigned int>{
|
||||
1,8, 1,2, 1,5, 2,3, 3,4, 5,6, 6,7, 8,9, 9,10, 10,11, 8,12, 12,13, 13,14, 1,0, 0,15, 15,17, 0,16, 16,18, 2,17, 5,18, 14,19,19,20,14,21, 11,22,22,23,11,24,
|
||||
@@ -465,6 +444,17 @@ namespace op
|
||||
// Ears-shoulders, shoulders-hips, shoulders-wrists, hips-ankles, wrists, ankles, wrists-hips, small toes-ankles)
|
||||
2,17, 5,18, 2,9, 5,12, 2,4, 5,7, 9,11, 12,14, 4,7, 11,14, 4,9, 7,12//, 11,23, 14,20
|
||||
},
|
||||
// BODY_25B
|
||||
std::vector<unsigned int>{
|
||||
// Minimum spanning tree
|
||||
// |------------------------------------------- COCO Body -------------------------------------------|
|
||||
0,1, 0,2, 1,3, 2,4, 0,5, 0,6, 5,7, 6,8, 7,9, 8,10, 5,11, 6,12, 11,13, 12,14, 13,15, 14,16,
|
||||
// |------------------ Foot ------------------| |-- MPII --|
|
||||
15,19, 19,20, 15,21, 16,22, 22,23, 16,24, 5,17, 5,18,
|
||||
// Redundant ones
|
||||
// MPII redundant, ears, ears-shoulders, shoulders-wrists, wrists, wrists-hips, hips, ankles)
|
||||
6,17, 6,18, 3,4, 3,5, 4,6, 5,9, 6,10, 9,10, 9,11, 10,12, 11,12, 15,16
|
||||
}
|
||||
};
|
||||
const std::array<float, (int)PoseModel::Size> POSE_CCN_DECREASE_FACTOR{
|
||||
8.f, // BODY_25
|
||||
@@ -473,16 +463,15 @@ namespace op
|
||||
8.f, // MPI_15_4
|
||||
8.f, // BODY_19
|
||||
4.f, // BODY_19_X2
|
||||
8.f, // BODY_59
|
||||
8.f, // BODY_19N
|
||||
8.f, // BODY_25E
|
||||
8.f, // BODY_25_19
|
||||
8.f, // BODY_65
|
||||
8.f, // CAR_12
|
||||
8.f, // BODY_25D
|
||||
8.f, // BODY_23
|
||||
8.f, // CAR_22
|
||||
8.f, // BODY_19E
|
||||
8.f, // BODY_25B
|
||||
};
|
||||
|
||||
const std::map<unsigned int, std::string>& getPoseBodyPartMapping(const PoseModel poseModel)
|
||||
|
||||
@@ -10,16 +10,15 @@ namespace op
|
||||
std::vector<float>{POSE_MPI_SCALES_RENDER_GPU}, // MPI_15_4
|
||||
std::vector<float>{POSE_BODY_19_SCALES_RENDER_GPU}, // BODY_19
|
||||
std::vector<float>{POSE_BODY_19_SCALES_RENDER_GPU}, // BODY_19_X2
|
||||
std::vector<float>{POSE_BODY_59_SCALES_RENDER_GPU}, // BODY_59
|
||||
std::vector<float>{POSE_BODY_19_SCALES_RENDER_GPU}, // BODY_19N
|
||||
std::vector<float>{POSE_BODY_25_SCALES_RENDER_GPU}, // BODY_25E
|
||||
std::vector<float>{POSE_BODY_25_SCALES_RENDER_GPU}, // BODY_25_19
|
||||
std::vector<float>{POSE_BODY_65_SCALES_RENDER_GPU}, // BODY_65
|
||||
std::vector<float>{POSE_CAR_12_SCALES_RENDER_GPU}, // CAR_12
|
||||
std::vector<float>{POSE_BODY_25_SCALES_RENDER_GPU}, // BODY_25D
|
||||
std::vector<float>{POSE_BODY_23_SCALES_RENDER_GPU}, // BODY_23
|
||||
std::vector<float>{POSE_CAR_22_SCALES_RENDER_GPU}, // CAR_22
|
||||
std::vector<float>{POSE_BODY_19_SCALES_RENDER_GPU}, // BODY_19E
|
||||
std::vector<float>{POSE_BODY_25B_SCALES_RENDER_GPU}, // BODY_25B
|
||||
};
|
||||
const std::array<std::vector<float>, (int)PoseModel::Size> POSE_COLORS{
|
||||
std::vector<float>{POSE_BODY_25_COLORS_RENDER_GPU}, // BODY_25
|
||||
@@ -28,16 +27,15 @@ namespace op
|
||||
std::vector<float>{POSE_MPI_COLORS_RENDER_GPU}, // MPI_15_4
|
||||
std::vector<float>{POSE_BODY_19_COLORS_RENDER_GPU}, // BODY_19
|
||||
std::vector<float>{POSE_BODY_19_COLORS_RENDER_GPU}, // BODY_19_X2
|
||||
std::vector<float>{POSE_BODY_59_COLORS_RENDER_GPU}, // BODY_59
|
||||
std::vector<float>{POSE_BODY_19_COLORS_RENDER_GPU}, // BODY_19N
|
||||
std::vector<float>{POSE_BODY_25_COLORS_RENDER_GPU}, // BODY_25E
|
||||
std::vector<float>{POSE_BODY_25_COLORS_RENDER_GPU}, // BODY_25_19
|
||||
std::vector<float>{POSE_BODY_65_COLORS_RENDER_GPU}, // BODY_65
|
||||
std::vector<float>{POSE_CAR_12_COLORS_RENDER_GPU}, // CAR_12
|
||||
std::vector<float>{POSE_BODY_25_COLORS_RENDER_GPU}, // BODY_25D
|
||||
std::vector<float>{POSE_BODY_23_COLORS_RENDER_GPU}, // BODY_23
|
||||
std::vector<float>{POSE_CAR_22_COLORS_RENDER_GPU}, // CAR_22
|
||||
std::vector<float>{POSE_BODY_19_COLORS_RENDER_GPU}, // BODY_19E
|
||||
std::vector<float>{POSE_BODY_25B_COLORS_RENDER_GPU}, // BODY_25B
|
||||
};
|
||||
const std::array<std::vector<unsigned int>, (int)PoseModel::Size> POSE_BODY_PART_PAIRS_RENDER{
|
||||
std::vector<unsigned int>{POSE_BODY_25_PAIRS_RENDER_GPU}, // BODY_25
|
||||
@@ -46,16 +44,15 @@ namespace op
|
||||
std::vector<unsigned int>{POSE_MPI_PAIRS_RENDER_GPU}, // MPI_15_4
|
||||
std::vector<unsigned int>{POSE_BODY_19_PAIRS_RENDER_GPU}, // BODY_19
|
||||
std::vector<unsigned int>{POSE_BODY_19_PAIRS_RENDER_GPU}, // BODY_19_X2
|
||||
std::vector<unsigned int>{POSE_BODY_59_PAIRS_RENDER_GPU}, // BODY_59
|
||||
std::vector<unsigned int>{POSE_BODY_19_PAIRS_RENDER_GPU}, // BODY_19N
|
||||
std::vector<unsigned int>{POSE_BODY_25_PAIRS_RENDER_GPU}, // BODY_25E
|
||||
std::vector<unsigned int>{POSE_BODY_25_PAIRS_RENDER_GPU}, // BODY_25_19
|
||||
std::vector<unsigned int>{POSE_BODY_65_PAIRS_RENDER_GPU}, // BODY_65
|
||||
std::vector<unsigned int>{POSE_CAR_12_PAIRS_RENDER_GPU}, // CAR_12
|
||||
std::vector<unsigned int>{POSE_BODY_25_PAIRS_RENDER_GPU}, // BODY_25D
|
||||
std::vector<unsigned int>{POSE_BODY_23_PAIRS_RENDER_GPU}, // BODY_23
|
||||
std::vector<unsigned int>{POSE_CAR_22_PAIRS_RENDER_GPU}, // CAR_22
|
||||
std::vector<unsigned int>{POSE_BODY_19_PAIRS_RENDER_GPU}, // BODY_19E
|
||||
std::vector<unsigned int>{POSE_BODY_25B_PAIRS_RENDER_GPU}, // BODY_25B
|
||||
};
|
||||
|
||||
// Rendering functions
|
||||
|
||||
@@ -14,7 +14,7 @@ namespace op
|
||||
const auto& bodyPartPairs = getPosePartPairs(poseModel);
|
||||
const auto& mapIdx = getPoseMapIndex(poseModel);
|
||||
const auto numberBodyParts = getPoseNumberBodyParts(poseModel);
|
||||
const auto numberBodyPartsPlusBkg = numberBodyParts+1;
|
||||
const auto numberBodyPartsPlusBkg = numberBodyParts+(poseModel != PoseModel::BODY_25B ? 1 : 0);
|
||||
// Sanity check
|
||||
if (bodyPartPairs.size() != mapIdx.size())
|
||||
error("The variables bodyPartPairs and mapIdx should have the same size.",
|
||||
|
||||
@@ -13,7 +13,7 @@ namespace op
|
||||
__constant__ const unsigned int COCO_PAIRS_GPU[] = {POSE_COCO_PAIRS_RENDER_GPU};
|
||||
__constant__ const unsigned int BODY_19_PAIRS_GPU[] = {POSE_BODY_19_PAIRS_RENDER_GPU};
|
||||
__constant__ const unsigned int BODY_23_PAIRS_GPU[] = {POSE_BODY_23_PAIRS_RENDER_GPU};
|
||||
__constant__ const unsigned int BODY_59_PAIRS_GPU[] = {POSE_BODY_59_PAIRS_RENDER_GPU};
|
||||
__constant__ const unsigned int BODY_25B_PAIRS_GPU[] = {POSE_BODY_25B_PAIRS_RENDER_GPU};
|
||||
__constant__ const unsigned int BODY_65_PAIRS_GPU[] = {POSE_BODY_65_PAIRS_RENDER_GPU};
|
||||
__constant__ const unsigned int MPI_PAIRS_GPU[] = {POSE_MPI_PAIRS_RENDER_GPU};
|
||||
__constant__ const unsigned int CAR_12_PAIRS_GPU[] = {POSE_CAR_12_PAIRS_RENDER_GPU};
|
||||
@@ -23,7 +23,7 @@ namespace op
|
||||
__constant__ const float COCO_SCALES[] = {POSE_COCO_SCALES_RENDER_GPU};
|
||||
__constant__ const float BODY_19_SCALES[] = {POSE_BODY_19_SCALES_RENDER_GPU};
|
||||
__constant__ const float BODY_23_SCALES[] = {POSE_BODY_23_SCALES_RENDER_GPU};
|
||||
__constant__ const float BODY_59_SCALES[] = {POSE_BODY_59_SCALES_RENDER_GPU};
|
||||
__constant__ const float BODY_25B_SCALES[] = {POSE_BODY_25B_SCALES_RENDER_GPU};
|
||||
__constant__ const float BODY_65_SCALES[] = {POSE_BODY_65_SCALES_RENDER_GPU};
|
||||
__constant__ const float MPI_SCALES[] = {POSE_MPI_SCALES_RENDER_GPU};
|
||||
__constant__ const float CAR_12_SCALES[] = {POSE_CAR_12_SCALES_RENDER_GPU};
|
||||
@@ -33,7 +33,7 @@ namespace op
|
||||
__constant__ const float COCO_COLORS[] = {POSE_COCO_COLORS_RENDER_GPU};
|
||||
__constant__ const float BODY_19_COLORS[] = {POSE_BODY_19_COLORS_RENDER_GPU};
|
||||
__constant__ const float BODY_23_COLORS[] = {POSE_BODY_23_COLORS_RENDER_GPU};
|
||||
__constant__ const float BODY_59_COLORS[] = {POSE_BODY_59_COLORS_RENDER_GPU};
|
||||
__constant__ const float BODY_25B_COLORS[] = {POSE_BODY_25B_COLORS_RENDER_GPU};
|
||||
__constant__ const float BODY_65_COLORS[] = {POSE_BODY_65_COLORS_RENDER_GPU};
|
||||
__constant__ const float MPI_COLORS[] = {POSE_MPI_COLORS_RENDER_GPU};
|
||||
__constant__ const float CAR_12_COLORS[] = {POSE_CAR_12_COLORS_RENDER_GPU};
|
||||
@@ -226,9 +226,9 @@ namespace op
|
||||
blendOriginalFrame, (googlyEyes ? 15 : -1), (googlyEyes ? 16 : -1));
|
||||
}
|
||||
|
||||
__global__ void renderPoseBody59(float* targetPtr, const int targetWidth, const int targetHeight,
|
||||
const float* const posePtr, const int numberPeople, const float threshold,
|
||||
const bool googlyEyes, const bool blendOriginalFrame, const float alphaColorToAdd)
|
||||
__global__ void renderPoseBody25b(float* targetPtr, const int targetWidth, const int targetHeight,
|
||||
const float* const posePtr, const int numberPeople, const float threshold,
|
||||
const bool googlyEyes, const bool blendOriginalFrame, const float alphaColorToAdd)
|
||||
{
|
||||
const auto x = (blockIdx.x * blockDim.x) + threadIdx.x;
|
||||
const auto y = (blockIdx.y * blockDim.y) + threadIdx.y;
|
||||
@@ -240,17 +240,17 @@ namespace op
|
||||
__shared__ float sharedScaleF[POSE_MAX_PEOPLE];
|
||||
|
||||
// Other parameters
|
||||
const auto numberPartPairs = sizeof(BODY_59_PAIRS_GPU) / (2*sizeof(BODY_59_PAIRS_GPU[0]));
|
||||
const auto numberScales = sizeof(BODY_59_SCALES) / sizeof(BODY_59_SCALES[0]);
|
||||
const auto numberColors = sizeof(BODY_59_COLORS) / (3*sizeof(BODY_59_COLORS[0]));
|
||||
const auto numberPartPairs = sizeof(BODY_25B_PAIRS_GPU) / (2*sizeof(BODY_25B_PAIRS_GPU[0]));
|
||||
const auto numberScales = sizeof(BODY_25B_SCALES) / sizeof(BODY_25B_SCALES[0]);
|
||||
const auto numberColors = sizeof(BODY_25B_COLORS) / (3*sizeof(BODY_25B_COLORS[0]));
|
||||
const auto radius = fastMin(targetWidth, targetHeight) / 100.f;
|
||||
const auto lineWidth = fastMin(targetWidth, targetHeight) / 120.f;
|
||||
|
||||
// Render key points
|
||||
renderKeypoints(targetPtr, sharedMaxs, sharedMins, sharedScaleF, globalIdx, x, y, targetWidth, targetHeight,
|
||||
posePtr, BODY_59_PAIRS_GPU, numberPeople, 59, numberPartPairs, BODY_59_COLORS, numberColors,
|
||||
radius, lineWidth, BODY_59_SCALES, numberScales, threshold, alphaColorToAdd,
|
||||
blendOriginalFrame, (googlyEyes ? 15 : -1), (googlyEyes ? 16 : -1));
|
||||
posePtr, BODY_25B_PAIRS_GPU, numberPeople, 25, numberPartPairs, BODY_25B_COLORS, numberColors,
|
||||
radius, lineWidth, BODY_25B_SCALES, numberScales, threshold, alphaColorToAdd,
|
||||
blendOriginalFrame, (googlyEyes ? 1 : -1), (googlyEyes ? 2 : -1));
|
||||
}
|
||||
|
||||
__global__ void renderPoseBody65(float* targetPtr, const int targetWidth, const int targetHeight,
|
||||
@@ -572,8 +572,8 @@ namespace op
|
||||
getNumberCudaThreadsAndBlocks(threadsPerBlock, numBlocks, frameSize);
|
||||
|
||||
// Body pose
|
||||
if (poseModel == PoseModel::BODY_25 || poseModel == PoseModel::BODY_25_19
|
||||
|| poseModel == PoseModel::BODY_25D || poseModel == PoseModel::BODY_25E)
|
||||
if (poseModel == PoseModel::BODY_25 || poseModel == PoseModel::BODY_25D
|
||||
|| poseModel == PoseModel::BODY_25E)
|
||||
renderPoseBody25<<<threadsPerBlock, numBlocks>>>(
|
||||
framePtr, frameSize.x, frameSize.y, posePtr, numberPeople, renderThreshold, googlyEyes,
|
||||
blendOriginalFrame, alphaBlending
|
||||
@@ -594,8 +594,8 @@ namespace op
|
||||
framePtr, frameSize.x, frameSize.y, posePtr, numberPeople, renderThreshold, googlyEyes,
|
||||
blendOriginalFrame, alphaBlending
|
||||
);
|
||||
else if (poseModel == PoseModel::BODY_59)
|
||||
renderPoseBody59<<<threadsPerBlock, numBlocks>>>(
|
||||
else if (poseModel == PoseModel::BODY_25B)
|
||||
renderPoseBody25b<<<threadsPerBlock, numBlocks>>>(
|
||||
framePtr, frameSize.x, frameSize.y, posePtr, numberPeople, renderThreshold, googlyEyes,
|
||||
blendOriginalFrame, alphaBlending
|
||||
);
|
||||
@@ -706,8 +706,10 @@ namespace op
|
||||
try
|
||||
{
|
||||
const auto numberBodyPartPairs = (int)getPosePartPairs(poseModel).size()/2;
|
||||
renderPosePAFGpuAux(framePtr, poseModel, frameSize, heatMapPtr, heatMapSize, scaleToKeepRatio,
|
||||
getPoseNumberBodyParts(poseModel)+1, numberBodyPartPairs, alphaBlending);
|
||||
renderPosePAFGpuAux(
|
||||
framePtr, poseModel, frameSize, heatMapPtr, heatMapSize, scaleToKeepRatio,
|
||||
getPoseNumberBodyParts(poseModel) + (poseModel != PoseModel::BODY_25B ? 1 : 0),
|
||||
numberBodyPartPairs, alphaBlending);
|
||||
}
|
||||
catch (const std::exception& e)
|
||||
{
|
||||
|
||||
@@ -22,22 +22,20 @@ namespace op
|
||||
return PoseModel::BODY_19;
|
||||
else if (poseModeString == "BODY_19E")
|
||||
return PoseModel::BODY_19E;
|
||||
else if (poseModeString == "BODY_23")
|
||||
return PoseModel::BODY_23;
|
||||
else if (poseModeString == "BODY_25E")
|
||||
return PoseModel::BODY_25E;
|
||||
else if (poseModeString == "BODY_19N")
|
||||
return PoseModel::BODY_19N;
|
||||
else if (poseModeString == "BODY_19_X2")
|
||||
return PoseModel::BODY_19_X2;
|
||||
else if (poseModeString == "BODY_25_19")
|
||||
return PoseModel::BODY_25_19;
|
||||
else if (poseModeString == "BODY_59")
|
||||
return PoseModel::BODY_59;
|
||||
else if (poseModeString == "BODY_65")
|
||||
return PoseModel::BODY_65;
|
||||
else if (poseModeString == "BODY_23")
|
||||
return PoseModel::BODY_23;
|
||||
else if (poseModeString == "BODY_25B")
|
||||
return PoseModel::BODY_25B;
|
||||
else if (poseModeString == "BODY_25D")
|
||||
return PoseModel::BODY_25D;
|
||||
else if (poseModeString == "BODY_25E")
|
||||
return PoseModel::BODY_25E;
|
||||
else if (poseModeString == "BODY_65")
|
||||
return PoseModel::BODY_65;
|
||||
// Car pose
|
||||
else if (poseModeString == "CAR_12")
|
||||
return PoseModel::CAR_12;
|
||||
|
||||
Reference in New Issue
Block a user