Draw human pose with a video file
authorTae-Young Chung <ty83.chung@samsung.com>
Fri, 17 Jul 2020 02:24:12 +0000 (11:24 +0900)
committerTae-Young Chung <ty83.chung@samsung.com>
Fri, 17 Jul 2020 02:24:12 +0000 (11:24 +0900)
Signed-off-by: Tae-Young Chung <ty83.chung@samsung.com>
mv_inference/inference/src/mv_inference_open.cpp
test/testsuites/stream_infer/stream_infer.c

index 5d1f2eee9cccbab95c69e1bfe1b6743d82165132..a99b3ec5c2473048e8a0e84bac6952d78b7a5f0d 100755 (executable)
@@ -862,6 +862,7 @@ int mv_inference_pose_landmark_detect_open(
                if (poseLandMarkDetectionResults.score[n] < 0.0f) {
                        pose->landmarks[n].point.x = -1;
                        pose->landmarks[n].point.y = -1;
+                       pose->landmarks[n].score = -1.0f;
                        pose->landmarks[n].label = NULL;
                } else {
                        pose->landmarks[n].point.x = static_cast<int>(static_cast<float>(width) *
index d6e5ca25acc32f41e120fa19a58fa7161d2ddce1..3d3041ea3caa647965ea9f087d37f95c2b2db689 100644 (file)
@@ -396,24 +396,34 @@ void _human_pose_cb (
        float score = 0.0f;
        int cnt = 0;
        for (int n = 0; n < number_of_pose_estimation; ++n) {
-               humanSkeleton.pose[n].x = locations->landmarks[n].point.x;
-               humanSkeleton.pose[n].y = locations->landmarks[n].point.y;
+
+               //humanSkeleton.pose[n].x = (int)(640.f*(float)(locations->landmarks[n].point.x + poseRoi.point.x)/192.f);
+               //humanSkeleton.pose[n].y =  (int)(480.f*(float)(locations->landmarks[n].point.y + poseRoi.point.y)/192.f);
+
+
+               humanSkeleton.pose[n].x = (int)(640.f*(float)(locations->landmarks[n].point.x)/192.f);
+               humanSkeleton.pose[n].y = (int)(480.f*(float)(locations->landmarks[n].point.y)/192.f);
                humanSkeleton.scores[n] = locations->landmarks[n].score;
+               /*
                if (score >= 0.0 ) {
                        score += humanSkeleton.scores[n];
                        cnt++;
                }
+               */
 
                //printf("(%d,%d): %f\n", humanSkeleton.pose[n].x, humanSkeleton.pose[n].y, confidences[n]);
                //printf("(%d,%d)\n", humanSkeleton.pose[n].x, humanSkeleton.pose[n].y);
        }
-       score /= (float)cnt;
+       humanSkeleton.IsDetected = true;
+       //score /= (float)cnt;
+       /*
        if (score >= 0.5) {
                humanSkeleton.IsDetected = true;
        } else {
                humanSkeleton.IsDetected = false;
                humanSkeleton.label = -1;
        }
+       */
 }
 
 static gboolean
@@ -438,7 +448,7 @@ run_pose (void *user_data)
 
        clock_gettime(CLOCK_MONOTONIC, &s_tspec);
 
-       mv_inference_pose_landmark_detect(mv_src_p, hp_mv_infer, NULL, _human_pose_cb, NULL);
+       mv_inference_pose_landmark_detect(mv_src_p, hp_mv_infer, &poseRoi, _human_pose_cb, NULL);
 
        clock_gettime(CLOCK_MONOTONIC, &e_tspec);
        struct timespec diffspec = diff(s_tspec, e_tspec);
@@ -552,9 +562,12 @@ draw_overlay_pose (GstElement * overlay, cairo_t * cr, guint64 timestamp,
        cairo_set_line_width(cr, 2.0);
 
 
+       float poseWeight = 0.7f;
+       float prevPoseWeight = 0.3f;
        if (!humanSkeleton.IsDetected)
                return;
 
+       /*
        //
        if (humanSkeleton.isPrevPose == false) {
                humanSkeleton.prevPose[1] = humanSkeleton.pose[1];
@@ -728,7 +741,26 @@ draw_overlay_pose (GstElement * overlay, cairo_t * cr, guint64 timestamp,
                        }
                }
        }
+*/
+       for (int k = 0; k < 16; ++k) {
+               if (humanSkeleton.isPrevPose == false) {
+                       humanSkeleton.prevPose[k] = humanSkeleton.pose[k];
+               } else {
 
+                       humanSkeleton.prevPose[k].x = (poseWeight * humanSkeleton.pose[k].x +
+                                                                               prevPoseWeight * humanSkeleton.prevPose[k].x);
+                       humanSkeleton.prevPose[k].y = (poseWeight * humanSkeleton.pose[k].y +
+                                                                               prevPoseWeight * humanSkeleton.prevPose[k].y);
+               }
+       }
+
+       for (int k = 0; k < 16; ++k) {
+               if (humanSkeleton.scores[k] > 0.0f) {
+                       cairo_arc(cr, humanSkeleton.prevPose[k].x, humanSkeleton.prevPose[k].y, 3,0, 2*M_PI);
+                       cairo_stroke(cr);
+               }
+       }
+/*
        //
        //draw..
        // head - neck
@@ -801,6 +833,7 @@ draw_overlay_pose (GstElement * overlay, cairo_t * cr, guint64 timestamp,
                }
        }
        cairo_stroke(cr);
+       */
 }
 
 static void
@@ -914,6 +947,11 @@ int perform_armnn_human_pose_cpm_configure(mv_engine_config_h mv_engine_cfg)
                         MV_INFERENCE_MODEL_WEIGHT_FILE_PATH,
                         PE_TFLITE_CPM_WEIGHT_PATH);
 
+       mv_engine_config_set_string_attribute(
+                                               mv_engine_cfg,
+                                               MV_INFERENCE_MODEL_USER_FILE_PATH,
+                                               PE_POSE_LABEL_PATH);
+
     mv_engine_config_set_int_attribute(mv_engine_cfg,
                         MV_INFERENCE_INPUT_DATA_TYPE,
                         MV_INFERENCE_DATA_FLOAT32);
@@ -1596,8 +1634,8 @@ static int app_create(void *data)
 
 
        if (ad->modelType == MODEL_TYPE_POSE_CPM) {
-               //err = perform_armnn_human_pose_cpm_configure(hp_mv_engine_cfg);
-               err = perform_tflite_human_pose_cpm_configure(hp_mv_engine_cfg);
+               err = perform_armnn_human_pose_cpm_configure(hp_mv_engine_cfg);
+               //err = perform_tflite_human_pose_cpm_configure(hp_mv_engine_cfg);
        } else if (ad->modelType == MODEL_TYPE_POSE_HAND_AICLite) {
                outputTensorData = (void*)calloc(56*56*21, sizeof(float));
                err = perform_tflite_hand_detection_AIC(hp_mv_engine_cfg);
@@ -1800,7 +1838,7 @@ static int app_create(void *data)
        g_object_set(G_OBJECT(vrsink), "signal-handoffs", TRUE, NULL);
 
        if (ad->modelType == MODEL_TYPE_POSE_CPM) {
-               handler_p = g_signal_connect (vrsink, "handoff", G_CALLBACK(_pose_est_handoff), outputTensorData);
+               handler_p = g_signal_connect (vrsink, "handoff", G_CALLBACK(_pose_est_handoff), NULL);
        } else {
                handler_p = g_signal_connect (vrsink, "handoff", G_CALLBACK(_hand_est_handoff), outputTensorData);
        }
@@ -1982,10 +2020,10 @@ int main (int argc, char *argv[])
                thValArm = (float)atoi(argv[3])/100.f;
                thValLeg = (float)atoi(argv[4])/100.f;
 
-               poseRoi.point.x = 0;
+               poseRoi.point.x = 50;
                poseRoi.point.y = 0;
-               poseRoi.width = 0;
-               poseRoi.height = 0;
+               poseRoi.width = 100;
+               poseRoi.height = 192;
        } else {
                if (argc > 2) {
                        ad.filename2 = g_strdup(argv[2]);