Updated Python to Matrix

This commit is contained in:
Gines Hidalgo
2019-10-13 11:14:15 -04:00
parent 8924b17642
commit 3d11f48e6d
18 changed files with 784 additions and 745 deletions
+329 -329
View File
@@ -4,7 +4,6 @@
#include <openpose/flags.hpp>
#include <openpose/headers.hpp>
#include <openpose/wrapper/headers.hpp>
#include <pybind11/pybind11.h>
#include <pybind11/stl.h>
@@ -18,160 +17,21 @@
#define OP_EXPORT
#endif
namespace op{
namespace py = pybind11;
void parse_gflags(const std::vector<std::string>& argv)
namespace op
{
try
{
std::vector<char*> argv_vec;
for (auto& arg : argv)
argv_vec.emplace_back((char*)arg.c_str());
char** cast = &argv_vec[0];
int size = (int)argv_vec.size();
gflags::ParseCommandLineFlags(&size, &cast, true);
}
catch (const std::exception& e)
{
error(e.what(), __LINE__, __FUNCTION__, __FILE__);
}
}
void init_int(py::dict d)
{
try
{
std::vector<std::string> argv;
argv.emplace_back("openpose.py");
for (auto item : d){
// Sanity check
std::size_t found = std::string(py::str(item.first)).find("=");
if (found != std::string::npos)
error("PyOpenPose does not support equal sign flags (e.g., "
+ std::string(py::str(item.first)) + ").", __LINE__, __FUNCTION__, __FILE__);
// Add argument
argv.emplace_back("--" + std::string(py::str(item.first)) + "=" + std::string(py::str(item.second)));
}
parse_gflags(argv);
}
catch (const std::exception& e)
{
error(e.what(), __LINE__, __FUNCTION__, __FILE__);
}
}
namespace py = pybind11;
void init_argv(std::vector<std::string> argv)
{
try
{
argv.insert(argv.begin(), "openpose.py");
parse_gflags(argv);
}
catch (const std::exception& e)
{
error(e.what(), __LINE__, __FUNCTION__, __FILE__);
}
}
class WrapperPython{
public:
std::unique_ptr<Wrapper> opWrapper;
WrapperPython(int mode = 0)
{
opLog("Starting OpenPose Python Wrapper...", Priority::High);
// Construct opWrapper
opWrapper = std::unique_ptr<Wrapper>(new Wrapper(static_cast<ThreadManagerMode>(mode)));
}
void configure(py::dict params = py::dict())
void parse_gflags(const std::vector<std::string>& argv)
{
try
{
if (params.size())
init_int(params);
// logging_level
checkBool(
0 <= FLAGS_logging_level && FLAGS_logging_level <= 255, "Wrong logging_level value.",
__LINE__, __FUNCTION__, __FILE__);
ConfigureLog::setPriorityThreshold((Priority)FLAGS_logging_level);
Profiler::setDefaultX(FLAGS_profile_speed);
// Applying user defined configuration - GFlags to program variables
// outputSize
const auto outputSize = flagsToPoint(op::String(FLAGS_output_resolution), "-1x-1");
// netInputSize
const auto netInputSize = flagsToPoint(op::String(FLAGS_net_resolution), "-1x368");
// faceNetInputSize
const auto faceNetInputSize = flagsToPoint(op::String(FLAGS_face_net_resolution), "368x368 (multiples of 16)");
// handNetInputSize
const auto handNetInputSize = flagsToPoint(op::String(FLAGS_hand_net_resolution), "368x368 (multiples of 16)");
// poseMode
const auto poseMode = flagsToPoseMode(FLAGS_body);
// poseModel
const auto poseModel = flagsToPoseModel(op::String(FLAGS_model_pose));
// JSON saving
if (!FLAGS_write_keypoint.empty())
opLog("Flag `write_keypoint` is deprecated and will eventually be removed."
" Please, use `write_json` instead.", Priority::Max);
// keypointScaleMode
const auto keypointScaleMode = flagsToScaleMode(FLAGS_keypoint_scale);
// heatmaps to add
const auto heatMapTypes = flagsToHeatMaps(FLAGS_heatmaps_add_parts, FLAGS_heatmaps_add_bkg,
FLAGS_heatmaps_add_PAFs);
const auto heatMapScaleMode = flagsToHeatMapScaleMode(FLAGS_heatmaps_scale);
// >1 camera view?
const auto multipleView = (FLAGS_3d || FLAGS_3d_views > 1);
// Face and hand detectors
const auto faceDetector = flagsToDetector(FLAGS_face_detector);
const auto handDetector = flagsToDetector(FLAGS_hand_detector);
// Enabling Google Logging
const bool enableGoogleLogging = true;
// Pose configuration (use WrapperStructPose{} for default and recommended configuration)
const op::WrapperStructPose wrapperStructPose{
poseMode, netInputSize, outputSize, keypointScaleMode, FLAGS_num_gpu, FLAGS_num_gpu_start,
FLAGS_scale_number, (float)FLAGS_scale_gap, op::flagsToRenderMode(FLAGS_render_pose, multipleView),
poseModel, !FLAGS_disable_blending, (float)FLAGS_alpha_pose, (float)FLAGS_alpha_heatmap,
FLAGS_part_to_show, op::String(FLAGS_model_folder), heatMapTypes, heatMapScaleMode, FLAGS_part_candidates,
(float)FLAGS_render_threshold, FLAGS_number_people_max, FLAGS_maximize_positives, FLAGS_fps_max,
op::String(FLAGS_prototxt_path), op::String(FLAGS_caffemodel_path),
(float)FLAGS_upsampling_ratio, enableGoogleLogging};
opWrapper->configure(wrapperStructPose);
// Face configuration (use WrapperStructFace{} to disable it)
const WrapperStructFace wrapperStructFace{
FLAGS_face, faceDetector, faceNetInputSize,
flagsToRenderMode(FLAGS_face_render, multipleView, FLAGS_render_pose),
(float)FLAGS_face_alpha_pose, (float)FLAGS_face_alpha_heatmap, (float)FLAGS_face_render_threshold};
opWrapper->configure(wrapperStructFace);
// Hand configuration (use WrapperStructHand{} to disable it)
const WrapperStructHand wrapperStructHand{
FLAGS_hand, handDetector, handNetInputSize, FLAGS_hand_scale_number, (float)FLAGS_hand_scale_range,
flagsToRenderMode(FLAGS_hand_render, multipleView, FLAGS_render_pose), (float)FLAGS_hand_alpha_pose,
(float)FLAGS_hand_alpha_heatmap, (float)FLAGS_hand_render_threshold};
opWrapper->configure(wrapperStructHand);
// Extra functionality configuration (use WrapperStructExtra{} to disable it)
const WrapperStructExtra wrapperStructExtra{
FLAGS_3d, FLAGS_3d_min_views, FLAGS_identification, FLAGS_tracking, FLAGS_ik_threads};
opWrapper->configure(wrapperStructExtra);
// Output (comment or use default argument to disable any output)
const WrapperStructOutput wrapperStructOutput{
FLAGS_cli_verbose, op::String(FLAGS_write_keypoint), op::stringToDataFormat(FLAGS_write_keypoint_format),
op::String(FLAGS_write_json), op::String(FLAGS_write_coco_json), FLAGS_write_coco_json_variants,
FLAGS_write_coco_json_variant, op::String(FLAGS_write_images), op::String(FLAGS_write_images_format),
op::String(FLAGS_write_video), FLAGS_write_video_fps, FLAGS_write_video_with_audio,
op::String(FLAGS_write_heatmaps), op::String(FLAGS_write_heatmaps_format), op::String(FLAGS_write_video_3d),
op::String(FLAGS_write_video_adam), op::String(FLAGS_write_bvh), op::String(FLAGS_udp_host),
op::String(FLAGS_udp_port)};
opWrapper->configure(wrapperStructOutput);
// No GUI. Equivalent to: opWrapper.configure(WrapperStructGui{});
// Set to single-thread (for sequential processing and/or debugging and/or reducing latency)
if (FLAGS_disable_multi_thread)
opWrapper->disableMultiThreading();
std::vector<char*> argv_vec;
for (auto& arg : argv)
argv_vec.emplace_back((char*)arg.c_str());
char** cast = &argv_vec[0];
int size = (int)argv_vec.size();
gflags::ParseCommandLineFlags(&size, &cast, true);
}
catch (const std::exception& e)
{
@@ -179,11 +39,22 @@ public:
}
}
void start()
void init_int(py::dict d)
{
try
{
opWrapper->start();
std::vector<std::string> argv;
argv.emplace_back("openpose.py");
for (auto item : d){
// Sanity check
std::size_t found = std::string(py::str(item.first)).find("=");
if (found != std::string::npos)
error("PyOpenPose does not support equal sign flags (e.g., "
+ std::string(py::str(item.first)) + ").", __LINE__, __FUNCTION__, __FILE__);
// Add argument
argv.emplace_back("--" + std::string(py::str(item.first)) + "=" + std::string(py::str(item.second)));
}
parse_gflags(argv);
}
catch (const std::exception& e)
{
@@ -191,11 +62,12 @@ public:
}
}
void stop()
void init_argv(std::vector<std::string> argv)
{
try
{
opWrapper->stop();
argv.insert(argv.begin(), "openpose.py");
parse_gflags(argv);
}
catch (const std::exception& e)
{
@@ -203,175 +75,302 @@ public:
}
}
void exec()
class WrapperPython{
public:
std::unique_ptr<Wrapper> opWrapper;
WrapperPython(int mode = 0)
{
opLog("Starting OpenPose Python Wrapper...", Priority::High);
// Construct opWrapper
opWrapper = std::unique_ptr<Wrapper>(new Wrapper(static_cast<ThreadManagerMode>(mode)));
}
void configure(py::dict params = py::dict())
{
try
{
if (params.size())
init_int(params);
// logging_level
checkBool(
0 <= FLAGS_logging_level && FLAGS_logging_level <= 255, "Wrong logging_level value.",
__LINE__, __FUNCTION__, __FILE__);
ConfigureLog::setPriorityThreshold((Priority)FLAGS_logging_level);
Profiler::setDefaultX(FLAGS_profile_speed);
// Applying user defined configuration - GFlags to program variables
// outputSize
const auto outputSize = flagsToPoint(op::String(FLAGS_output_resolution), "-1x-1");
// netInputSize
const auto netInputSize = flagsToPoint(op::String(FLAGS_net_resolution), "-1x368");
// faceNetInputSize
const auto faceNetInputSize = flagsToPoint(op::String(FLAGS_face_net_resolution), "368x368 (multiples of 16)");
// handNetInputSize
const auto handNetInputSize = flagsToPoint(op::String(FLAGS_hand_net_resolution), "368x368 (multiples of 16)");
// poseMode
const auto poseMode = flagsToPoseMode(FLAGS_body);
// poseModel
const auto poseModel = flagsToPoseModel(op::String(FLAGS_model_pose));
// JSON saving
if (!FLAGS_write_keypoint.empty())
opLog("Flag `write_keypoint` is deprecated and will eventually be removed."
" Please, use `write_json` instead.", Priority::Max);
// keypointScaleMode
const auto keypointScaleMode = flagsToScaleMode(FLAGS_keypoint_scale);
// heatmaps to add
const auto heatMapTypes = flagsToHeatMaps(FLAGS_heatmaps_add_parts, FLAGS_heatmaps_add_bkg,
FLAGS_heatmaps_add_PAFs);
const auto heatMapScaleMode = flagsToHeatMapScaleMode(FLAGS_heatmaps_scale);
// >1 camera view?
const auto multipleView = (FLAGS_3d || FLAGS_3d_views > 1);
// Face and hand detectors
const auto faceDetector = flagsToDetector(FLAGS_face_detector);
const auto handDetector = flagsToDetector(FLAGS_hand_detector);
// Enabling Google Logging
const bool enableGoogleLogging = true;
// Pose configuration (use WrapperStructPose{} for default and recommended configuration)
const op::WrapperStructPose wrapperStructPose{
poseMode, netInputSize, outputSize, keypointScaleMode, FLAGS_num_gpu, FLAGS_num_gpu_start,
FLAGS_scale_number, (float)FLAGS_scale_gap, op::flagsToRenderMode(FLAGS_render_pose, multipleView),
poseModel, !FLAGS_disable_blending, (float)FLAGS_alpha_pose, (float)FLAGS_alpha_heatmap,
FLAGS_part_to_show, op::String(FLAGS_model_folder), heatMapTypes, heatMapScaleMode, FLAGS_part_candidates,
(float)FLAGS_render_threshold, FLAGS_number_people_max, FLAGS_maximize_positives, FLAGS_fps_max,
op::String(FLAGS_prototxt_path), op::String(FLAGS_caffemodel_path),
(float)FLAGS_upsampling_ratio, enableGoogleLogging};
opWrapper->configure(wrapperStructPose);
// Face configuration (use WrapperStructFace{} to disable it)
const WrapperStructFace wrapperStructFace{
FLAGS_face, faceDetector, faceNetInputSize,
flagsToRenderMode(FLAGS_face_render, multipleView, FLAGS_render_pose),
(float)FLAGS_face_alpha_pose, (float)FLAGS_face_alpha_heatmap, (float)FLAGS_face_render_threshold};
opWrapper->configure(wrapperStructFace);
// Hand configuration (use WrapperStructHand{} to disable it)
const WrapperStructHand wrapperStructHand{
FLAGS_hand, handDetector, handNetInputSize, FLAGS_hand_scale_number, (float)FLAGS_hand_scale_range,
flagsToRenderMode(FLAGS_hand_render, multipleView, FLAGS_render_pose), (float)FLAGS_hand_alpha_pose,
(float)FLAGS_hand_alpha_heatmap, (float)FLAGS_hand_render_threshold};
opWrapper->configure(wrapperStructHand);
// Extra functionality configuration (use WrapperStructExtra{} to disable it)
const WrapperStructExtra wrapperStructExtra{
FLAGS_3d, FLAGS_3d_min_views, FLAGS_identification, FLAGS_tracking, FLAGS_ik_threads};
opWrapper->configure(wrapperStructExtra);
// Output (comment or use default argument to disable any output)
const WrapperStructOutput wrapperStructOutput{
FLAGS_cli_verbose, op::String(FLAGS_write_keypoint), op::stringToDataFormat(FLAGS_write_keypoint_format),
op::String(FLAGS_write_json), op::String(FLAGS_write_coco_json), FLAGS_write_coco_json_variants,
FLAGS_write_coco_json_variant, op::String(FLAGS_write_images), op::String(FLAGS_write_images_format),
op::String(FLAGS_write_video), FLAGS_write_video_fps, FLAGS_write_video_with_audio,
op::String(FLAGS_write_heatmaps), op::String(FLAGS_write_heatmaps_format), op::String(FLAGS_write_video_3d),
op::String(FLAGS_write_video_adam), op::String(FLAGS_write_bvh), op::String(FLAGS_udp_host),
op::String(FLAGS_udp_port)};
opWrapper->configure(wrapperStructOutput);
// No GUI. Equivalent to: opWrapper.configure(WrapperStructGui{});
// Set to single-thread (for sequential processing and/or debugging and/or reducing latency)
if (FLAGS_disable_multi_thread)
opWrapper->disableMultiThreading();
}
catch (const std::exception& e)
{
error(e.what(), __LINE__, __FUNCTION__, __FILE__);
}
}
void start()
{
try
{
opWrapper->start();
}
catch (const std::exception& e)
{
error(e.what(), __LINE__, __FUNCTION__, __FILE__);
}
}
void stop()
{
try
{
opWrapper->stop();
}
catch (const std::exception& e)
{
error(e.what(), __LINE__, __FUNCTION__, __FILE__);
}
}
void exec()
{
try
{
const auto cameraSize = flagsToPoint(op::String(FLAGS_camera_resolution), "-1x-1");
ProducerType producerType;
op::String producerString;
std::tie(producerType, producerString) = flagsToProducer(
op::String(FLAGS_image_dir), op::String(FLAGS_video), op::String(FLAGS_ip_camera), FLAGS_camera,
FLAGS_flir_camera, FLAGS_flir_camera_index);
// Producer (use default to disable any input)
const WrapperStructInput wrapperStructInput{
producerType, producerString, FLAGS_frame_first, FLAGS_frame_step, FLAGS_frame_last,
FLAGS_process_real_time, FLAGS_frame_flip, FLAGS_frame_rotate, FLAGS_frames_repeat,
cameraSize, op::String(FLAGS_camera_parameter_path), FLAGS_frame_undistort, FLAGS_3d_views};
opWrapper->configure(wrapperStructInput);
// GUI (comment or use default argument to disable any visual output)
const WrapperStructGui wrapperStructGui{
flagsToDisplayMode(FLAGS_display, FLAGS_3d), !FLAGS_no_gui_verbose, FLAGS_fullscreen};
opWrapper->configure(wrapperStructGui);
opWrapper->exec();
}
catch (const std::exception& e)
{
error(e.what(), __LINE__, __FUNCTION__, __FILE__);
}
}
void emplaceAndPop(std::vector<std::shared_ptr<Datum>>& l)
{
try
{
auto datumsPtr = std::make_shared<std::vector<std::shared_ptr<Datum>>>(l);
opWrapper->emplaceAndPop(datumsPtr);
}
catch (const std::exception& e)
{
error(e.what(), __LINE__, __FUNCTION__, __FILE__);
}
}
void waitAndEmplace(std::vector<std::shared_ptr<Datum>>& l)
{
try
{
auto datumsPtr = std::make_shared<std::vector<std::shared_ptr<Datum>>>(l);
opWrapper->waitAndEmplace(datumsPtr);
}
catch (const std::exception& e)
{
error(e.what(), __LINE__, __FUNCTION__, __FILE__);
}
}
bool waitAndPop(std::vector<std::shared_ptr<Datum>>& l)
{
try
{
auto datumsPtr = std::make_shared<std::vector<std::shared_ptr<Datum>>>(l);
return opWrapper->waitAndPop(datumsPtr);
}
catch (const std::exception& e)
{
error(e.what(), __LINE__, __FUNCTION__, __FILE__);
return false;
}
}
};
std::vector<std::string> getImagesFromDirectory(const std::string& directoryPath)
{
try
{
const auto cameraSize = flagsToPoint(op::String(FLAGS_camera_resolution), "-1x-1");
ProducerType producerType;
op::String producerString;
std::tie(producerType, producerString) = flagsToProducer(
op::String(FLAGS_image_dir), op::String(FLAGS_video), op::String(FLAGS_ip_camera), FLAGS_camera,
FLAGS_flir_camera, FLAGS_flir_camera_index);
// Producer (use default to disable any input)
const WrapperStructInput wrapperStructInput{
producerType, producerString, FLAGS_frame_first, FLAGS_frame_step, FLAGS_frame_last,
FLAGS_process_real_time, FLAGS_frame_flip, FLAGS_frame_rotate, FLAGS_frames_repeat,
cameraSize, op::String(FLAGS_camera_parameter_path), FLAGS_frame_undistort, FLAGS_3d_views};
opWrapper->configure(wrapperStructInput);
// GUI (comment or use default argument to disable any visual output)
const WrapperStructGui wrapperStructGui{
flagsToDisplayMode(FLAGS_display, FLAGS_3d), !FLAGS_no_gui_verbose, FLAGS_fullscreen};
opWrapper->configure(wrapperStructGui);
opWrapper->exec();
return getFilesOnDirectory(directoryPath, Extensions::Images);
}
catch (const std::exception& e)
{
error(e.what(), __LINE__, __FUNCTION__, __FILE__);
return {};
}
}
void emplaceAndPop(std::vector<std::shared_ptr<Datum>>& l)
{
try
{
auto datumsPtr = std::make_shared<std::vector<std::shared_ptr<Datum>>>(l);
opWrapper->emplaceAndPop(datumsPtr);
}
catch (const std::exception& e)
{
error(e.what(), __LINE__, __FUNCTION__, __FILE__);
}
PYBIND11_MODULE(pyopenpose, m) {
// Functions for Init Params
m.def("init_int", &init_int, "Init Function");
m.def("init_argv", &init_argv, "Init Function");
m.def("get_gpu_number", &getGpuNumber, "Get Total GPU");
m.def("get_images_on_directory", &getImagesFromDirectory, "Get Images On Directory");
// OpenposePython
py::class_<WrapperPython>(m, "WrapperPython")
.def(py::init<>())
.def(py::init<int>())
.def("configure", &WrapperPython::configure)
.def("start", &WrapperPython::start)
.def("stop", &WrapperPython::stop)
.def("execute", &WrapperPython::exec)
.def("emplaceAndPop", &WrapperPython::emplaceAndPop)
.def("waitAndEmplace", &WrapperPython::waitAndEmplace)
.def("waitAndPop", &WrapperPython::waitAndPop)
;
// Datum Object
py::class_<Datum, std::shared_ptr<Datum>>(m, "Datum")
.def(py::init<>())
.def_readwrite("id", &Datum::id)
.def_readwrite("subId", &Datum::subId)
.def_readwrite("subIdMax", &Datum::subIdMax)
.def_readwrite("name", &Datum::name)
.def_readwrite("frameNumber", &Datum::frameNumber)
.def_readwrite("cvInputData", &Datum::cvInputData)
.def_readwrite("inputNetData", &Datum::inputNetData)
.def_readwrite("outputData", &Datum::outputData)
.def_readwrite("cvOutputData", &Datum::cvOutputData)
.def_readwrite("cvOutputData3D", &Datum::cvOutputData3D)
.def_readwrite("poseKeypoints", &Datum::poseKeypoints)
.def_readwrite("poseIds", &Datum::poseIds)
.def_readwrite("poseScores", &Datum::poseScores)
.def_readwrite("poseHeatMaps", &Datum::poseHeatMaps)
.def_readwrite("poseCandidates", &Datum::poseCandidates)
.def_readwrite("faceRectangles", &Datum::faceRectangles)
.def_readwrite("faceKeypoints", &Datum::faceKeypoints)
.def_readwrite("faceHeatMaps", &Datum::faceHeatMaps)
.def_readwrite("handRectangles", &Datum::handRectangles)
.def_readwrite("handKeypoints", &Datum::handKeypoints)
.def_readwrite("handHeatMaps", &Datum::handHeatMaps)
.def_readwrite("poseKeypoints3D", &Datum::poseKeypoints3D)
.def_readwrite("faceKeypoints3D", &Datum::faceKeypoints3D)
.def_readwrite("handKeypoints3D", &Datum::handKeypoints3D)
.def_readwrite("cameraMatrix", &Datum::cameraMatrix)
.def_readwrite("cameraExtrinsics", &Datum::cameraExtrinsics)
.def_readwrite("cameraIntrinsics", &Datum::cameraIntrinsics)
.def_readwrite("poseNetOutput", &Datum::poseNetOutput)
.def_readwrite("scaleInputToNetInputs", &Datum::scaleInputToNetInputs)
.def_readwrite("netInputSizes", &Datum::netInputSizes)
.def_readwrite("scaleInputToOutput", &Datum::scaleInputToOutput)
.def_readwrite("netOutputSize", &Datum::netOutputSize)
.def_readwrite("scaleNetToOutput", &Datum::scaleNetToOutput)
.def_readwrite("elementRendered", &Datum::elementRendered)
;
// Rectangle
py::class_<Rectangle<float>>(m, "Rectangle")
.def("__repr__", [](Rectangle<float> &a) { return a.toString(); })
.def(py::init<>())
.def(py::init<float, float, float, float>())
.def_readwrite("x", &Rectangle<float>::x)
.def_readwrite("y", &Rectangle<float>::y)
.def_readwrite("width", &Rectangle<float>::width)
.def_readwrite("height", &Rectangle<float>::height)
;
// Point
py::class_<Point<int>>(m, "Point")
.def("__repr__", [](Point<int> &a) { return a.toString(); })
.def(py::init<>())
.def(py::init<int, int>())
.def_readwrite("x", &Point<int>::x)
.def_readwrite("y", &Point<int>::y)
;
#ifdef VERSION_INFO
m.attr("__version__") = VERSION_INFO;
#else
m.attr("__version__") = "dev";
#endif
}
void waitAndEmplace(std::vector<std::shared_ptr<Datum>>& l)
{
try
{
auto datumsPtr = std::make_shared<std::vector<std::shared_ptr<Datum>>>(l);
opWrapper->waitAndEmplace(datumsPtr);
}
catch (const std::exception& e)
{
error(e.what(), __LINE__, __FUNCTION__, __FILE__);
}
}
bool waitAndPop(std::vector<std::shared_ptr<Datum>>& l)
{
try
{
auto datumsPtr = std::make_shared<std::vector<std::shared_ptr<Datum>>>(l);
return opWrapper->waitAndPop(datumsPtr);
}
catch (const std::exception& e)
{
error(e.what(), __LINE__, __FUNCTION__, __FILE__);
return false;
}
}
};
std::vector<std::string> getImagesFromDirectory(const std::string& directoryPath)
{
try
{
return getFilesOnDirectory(directoryPath, Extensions::Images);
}
catch (const std::exception& e)
{
error(e.what(), __LINE__, __FUNCTION__, __FILE__);
return {};
}
}
PYBIND11_MODULE(pyopenpose, m) {
// Functions for Init Params
m.def("init_int", &init_int, "Init Function");
m.def("init_argv", &init_argv, "Init Function");
m.def("get_gpu_number", &getGpuNumber, "Get Total GPU");
m.def("get_images_on_directory", &getImagesFromDirectory, "Get Images On Directory");
// OpenposePython
py::class_<WrapperPython>(m, "WrapperPython")
.def(py::init<>())
.def(py::init<int>())
.def("configure", &WrapperPython::configure)
.def("start", &WrapperPython::start)
.def("stop", &WrapperPython::stop)
.def("execute", &WrapperPython::exec)
.def("emplaceAndPop", &WrapperPython::emplaceAndPop)
.def("waitAndEmplace", &WrapperPython::waitAndEmplace)
.def("waitAndPop", &WrapperPython::waitAndPop)
;
// Datum Object
py::class_<Datum, std::shared_ptr<Datum>>(m, "Datum")
.def(py::init<>())
.def_readwrite("id", &Datum::id)
.def_readwrite("subId", &Datum::subId)
.def_readwrite("subIdMax", &Datum::subIdMax)
.def_readwrite("name", &Datum::name)
.def_readwrite("frameNumber", &Datum::frameNumber)
.def_readwrite("cvInputData", &Datum::cvInputData)
.def_readwrite("inputNetData", &Datum::inputNetData)
.def_readwrite("outputData", &Datum::outputData)
.def_readwrite("cvOutputData", &Datum::cvOutputData)
.def_readwrite("cvOutputData3D", &Datum::cvOutputData3D)
.def_readwrite("poseKeypoints", &Datum::poseKeypoints)
.def_readwrite("poseIds", &Datum::poseIds)
.def_readwrite("poseScores", &Datum::poseScores)
.def_readwrite("poseHeatMaps", &Datum::poseHeatMaps)
.def_readwrite("poseCandidates", &Datum::poseCandidates)
.def_readwrite("faceRectangles", &Datum::faceRectangles)
.def_readwrite("faceKeypoints", &Datum::faceKeypoints)
.def_readwrite("faceHeatMaps", &Datum::faceHeatMaps)
.def_readwrite("handRectangles", &Datum::handRectangles)
.def_readwrite("handKeypoints", &Datum::handKeypoints)
.def_readwrite("handHeatMaps", &Datum::handHeatMaps)
.def_readwrite("poseKeypoints3D", &Datum::poseKeypoints3D)
.def_readwrite("faceKeypoints3D", &Datum::faceKeypoints3D)
.def_readwrite("handKeypoints3D", &Datum::handKeypoints3D)
.def_readwrite("cameraMatrix", &Datum::cameraMatrix)
.def_readwrite("cameraExtrinsics", &Datum::cameraExtrinsics)
.def_readwrite("cameraIntrinsics", &Datum::cameraIntrinsics)
.def_readwrite("poseNetOutput", &Datum::poseNetOutput)
.def_readwrite("scaleInputToNetInputs", &Datum::scaleInputToNetInputs)
.def_readwrite("netInputSizes", &Datum::netInputSizes)
.def_readwrite("scaleInputToOutput", &Datum::scaleInputToOutput)
.def_readwrite("netOutputSize", &Datum::netOutputSize)
.def_readwrite("scaleNetToOutput", &Datum::scaleNetToOutput)
.def_readwrite("elementRendered", &Datum::elementRendered)
;
// Rectangle
py::class_<Rectangle<float>>(m, "Rectangle")
.def("__repr__", [](Rectangle<float> &a) { return a.toString(); })
.def(py::init<>())
.def(py::init<float, float, float, float>())
.def_readwrite("x", &Rectangle<float>::x)
.def_readwrite("y", &Rectangle<float>::y)
.def_readwrite("width", &Rectangle<float>::width)
.def_readwrite("height", &Rectangle<float>::height)
;
// Point
py::class_<Point<int>>(m, "Point")
.def("__repr__", [](Point<int> &a) { return a.toString(); })
.def(py::init<>())
.def(py::init<int, int>())
.def_readwrite("x", &Point<int>::x)
.def_readwrite("y", &Point<int>::y)
;
#ifdef VERSION_INFO
m.attr("__version__") = VERSION_INFO;
#else
m.attr("__version__") = "dev";
#endif
}
}
// Numpy - op::Array<float> interop
@@ -431,15 +430,15 @@ template <> struct type_caster<op::Array<float>> {
};
}} // namespace pybind11::detail
// Numpy - cv::Mat interop
// Numpy - op::Matrix interop
namespace pybind11 { namespace detail {
template <> struct type_caster<cv::Mat> {
template <> struct type_caster<op::Matrix> {
public:
PYBIND11_TYPE_CASTER(cv::Mat, _("numpy.ndarray"));
PYBIND11_TYPE_CASTER(op::Matrix, _("numpy.ndarray"));
// Cast numpy to cv::Mat
// Cast numpy to op::Matrix
bool load(handle src, bool)
{
/* Try a default converting into a Python */
@@ -483,18 +482,19 @@ template <> struct type_caster<cv::Mat> {
std::vector<int> shape = {(int)info.shape[0], (int)info.shape[1]};
value = cv::Mat(cv::Size(shape[1], shape[0]), dtype, info.ptr, cv::Mat::AUTO_STEP);
value = op::Matrix(shape[0], shape[1], dtype, info.ptr);
// value = cv::Mat(cv::Size(shape[1], shape[0]), dtype, info.ptr, cv::Mat::AUTO_STEP);
return true;
}
// Cast cv::Mat to numpy
static handle cast(const cv::Mat &m, return_value_policy, handle defval)
// Cast op::Matrix to numpy
static handle cast(const op::Matrix &matrix, return_value_policy, handle defval)
{
UNUSED(defval);
std::string format = format_descriptor<unsigned char>::format();
size_t elemsize = sizeof(unsigned char);
int dim;
switch(m.type()) {
switch(matrix.type()) {
case CV_8U:
format = format_descriptor<unsigned char>::format();
elemsize = sizeof(unsigned char);
@@ -522,19 +522,19 @@ template <> struct type_caster<cv::Mat> {
std::vector<size_t> bufferdim;
std::vector<size_t> strides;
if (dim == 2) {
bufferdim = {(size_t) m.rows, (size_t) m.cols};
strides = {elemsize * (size_t) m.cols, elemsize};
bufferdim = {(size_t) matrix.rows(), (size_t) matrix.cols()};
strides = {elemsize * (size_t) matrix.cols(), elemsize};
} else if (dim == 3) {
bufferdim = {(size_t) m.rows, (size_t) m.cols, (size_t) 3};
strides = {(size_t) elemsize * m.cols * 3, (size_t) elemsize * 3, (size_t) elemsize};
bufferdim = {(size_t) matrix.rows(), (size_t) matrix.cols(), (size_t) 3};
strides = {(size_t) elemsize * matrix.cols() * 3, (size_t) elemsize * 3, (size_t) elemsize};
}
return array(buffer_info(
m.data, /* Pointer to buffer */
elemsize, /* Size of one scalar */
format, /* Python struct-style format descriptor */
dim, /* Number of dimensions */
bufferdim, /* Buffer dimensions */
strides /* Strides (in bytes) for each index */
matrix.dataPseudoConst(), /* Pointer to buffer */
elemsize, /* Size of one scalar */
format, /* Python struct-style format descriptor */
dim, /* Number of dimensions */
bufferdim, /* Buffer dimensions */
strides /* Strides (in bytes) for each index */
)).release();
}