1484543d1Sopenharmony_ci/*
2484543d1Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
3484543d1Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4484543d1Sopenharmony_ci * you may not use this file except in compliance with the License.
5484543d1Sopenharmony_ci * You may obtain a copy of the License at
6484543d1Sopenharmony_ci *
7484543d1Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8484543d1Sopenharmony_ci *
9484543d1Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10484543d1Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11484543d1Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12484543d1Sopenharmony_ci * See the License for the specific language governing permissions and
13484543d1Sopenharmony_ci * limitations under the License.
14484543d1Sopenharmony_ci */
15484543d1Sopenharmony_ci
16484543d1Sopenharmony_ci#include <vector>
17484543d1Sopenharmony_ci
18484543d1Sopenharmony_ci#include "ffrt_inner.h"
19484543d1Sopenharmony_ci#include "common.h"
20484543d1Sopenharmony_ci
21484543d1Sopenharmony_civoid FaceStory()
22484543d1Sopenharmony_ci{
23484543d1Sopenharmony_ci    PreHotFFRT();
24484543d1Sopenharmony_ci
25484543d1Sopenharmony_ci    const int FACE_NUM = 3; // 假设图像上存在多少张人脸,可修改,实际业务可以支持1-10个人脸
26484543d1Sopenharmony_ci
27484543d1Sopenharmony_ci    uint32_t inputImageInfo_ = 0; // 模拟输入图像
28484543d1Sopenharmony_ci    std::vector<uint32_t> faceBboxes_; // 模拟人脸检测框
29484543d1Sopenharmony_ci    std::vector<uint32_t> faceDegrees_; // 模拟人脸朝向
30484543d1Sopenharmony_ci    std::vector<uint32_t> faceLandmarks_; // 模拟人脸特征点
31484543d1Sopenharmony_ci    std::vector<uint32_t> faceAttrs_; // 模拟人脸属性
32484543d1Sopenharmony_ci    std::vector<uint32_t> faceMasks_; // 模拟人脸分割
33484543d1Sopenharmony_ci    std::vector<uint32_t> faceAngles_; // 模拟人脸角度
34484543d1Sopenharmony_ci
35484543d1Sopenharmony_ci    TIME_BEGIN(t);
36484543d1Sopenharmony_ci    for (uint32_t r = 0; r < REPEAT; r++) {
37484543d1Sopenharmony_ci        for (uint64_t count = 0; count < 10; ++count) {
38484543d1Sopenharmony_ci            // 原图的预处理,输入原始图像,输出预处理图像
39484543d1Sopenharmony_ci            ffrt::submit(
40484543d1Sopenharmony_ci                [&]() {
41484543d1Sopenharmony_ci                    // 下采样Y通道
42484543d1Sopenharmony_ci                    ffrt::submit([&]() { simulate_task_compute_time(COMPUTE_TIME_US); }, {}, {});
43484543d1Sopenharmony_ci
44484543d1Sopenharmony_ci                    // 下采样UV通道
45484543d1Sopenharmony_ci                    ffrt::submit([&]() { simulate_task_compute_time(COMPUTE_TIME_US); }, {}, {});
46484543d1Sopenharmony_ci
47484543d1Sopenharmony_ci                    ffrt::wait(); // 同步下采样结果
48484543d1Sopenharmony_ci
49484543d1Sopenharmony_ci                    // FlushCache
50484543d1Sopenharmony_ci                    simulate_task_compute_time(COMPUTE_TIME_US);
51484543d1Sopenharmony_ci                },
52484543d1Sopenharmony_ci                {}, {&inputImageInfo_});
53484543d1Sopenharmony_ci
54484543d1Sopenharmony_ci            // 人脸检测,输入预处理图像,输出人脸检测结果
55484543d1Sopenharmony_ci            ffrt::submit(
56484543d1Sopenharmony_ci                [&]() {
57484543d1Sopenharmony_ci                    faceBboxes_.clear();
58484543d1Sopenharmony_ci                    simulate_task_compute_time(COMPUTE_TIME_US);
59484543d1Sopenharmony_ci                    for (auto i = 0; i < FACE_NUM; i++) {
60484543d1Sopenharmony_ci                        faceBboxes_.push_back(1);
61484543d1Sopenharmony_ci                    }
62484543d1Sopenharmony_ci                },
63484543d1Sopenharmony_ci                {&inputImageInfo_}, {&faceBboxes_});
64484543d1Sopenharmony_ci
65484543d1Sopenharmony_ci            // Tracking的Init,对processImageInfo_和faceBboxes_是只读,不存在Rotation的情况下,直接丢出去并发就行,也不需要同步
66484543d1Sopenharmony_ci            ffrt::submit([&]() { simulate_task_compute_time(COMPUTE_TIME_US); }, {&faceBboxes_}, {});
67484543d1Sopenharmony_ci
68484543d1Sopenharmony_ci            // 人脸朝向检测,输出人脸朝向结果(省略了根据朝向做旋转)
69484543d1Sopenharmony_ci            faceDegrees_ = std::vector<uint32_t>(FACE_NUM, 0);
70484543d1Sopenharmony_ci            for (auto j = 0; j < FACE_NUM; j++) { // 图像可能存在多个人脸,loop
71484543d1Sopenharmony_ci                ffrt::submit(
72484543d1Sopenharmony_ci                    [&, j]() { // FaceDirectionProcess对于processImageInfo_是只读访问,多个人脸可以并发
73484543d1Sopenharmony_ci                        simulate_task_compute_time(COMPUTE_TIME_US);
74484543d1Sopenharmony_ci                        faceDegrees_[j] = 1;
75484543d1Sopenharmony_ci                    },
76484543d1Sopenharmony_ci                    {&faceBboxes_}, {&faceDegrees_[j]});
77484543d1Sopenharmony_ci            }
78484543d1Sopenharmony_ci
79484543d1Sopenharmony_ci            // 人脸特征点检测,输入人脸旋转结果,输出人脸特征点结果
80484543d1Sopenharmony_ci            faceLandmarks_ = std::vector<uint32_t>(FACE_NUM, 0);
81484543d1Sopenharmony_ci            for (auto k = 0; k < FACE_NUM; k++) {
82484543d1Sopenharmony_ci                ffrt::submit(
83484543d1Sopenharmony_ci                    [&, k]() {
84484543d1Sopenharmony_ci                        simulate_task_compute_time(COMPUTE_TIME_US);
85484543d1Sopenharmony_ci                        faceLandmarks_[k] = 1;
86484543d1Sopenharmony_ci                    },
87484543d1Sopenharmony_ci                    {&faceDegrees_[k]}, {&faceLandmarks_[k]});
88484543d1Sopenharmony_ci            }
89484543d1Sopenharmony_ci
90484543d1Sopenharmony_ci            // 人脸属性检测,输入人脸旋转结果,输出人脸属性结果
91484543d1Sopenharmony_ci            faceAttrs_ = std::vector<uint32_t>(FACE_NUM, 0);
92484543d1Sopenharmony_ci            for (auto m = 0; m < FACE_NUM; m++) {
93484543d1Sopenharmony_ci                ffrt::submit(
94484543d1Sopenharmony_ci                    [&, m]() {
95484543d1Sopenharmony_ci                        simulate_task_compute_time(COMPUTE_TIME_US);
96484543d1Sopenharmony_ci                        faceAttrs_[m] = 1;
97484543d1Sopenharmony_ci                    },
98484543d1Sopenharmony_ci                    {&faceDegrees_[m]}, {&faceAttrs_[m]});
99484543d1Sopenharmony_ci            }
100484543d1Sopenharmony_ci
101484543d1Sopenharmony_ci            // 人脸分割,输入人脸旋转结果,输出人脸特征点结果
102484543d1Sopenharmony_ci            faceMasks_ = std::vector<uint32_t>(FACE_NUM, 0);
103484543d1Sopenharmony_ci            for (auto n = 0; n < 1; n++) { // 实际业务中分割当前只做一次
104484543d1Sopenharmony_ci                ffrt::submit(
105484543d1Sopenharmony_ci                    [&, n]() {
106484543d1Sopenharmony_ci                        simulate_task_compute_time(COMPUTE_TIME_US);
107484543d1Sopenharmony_ci                        faceMasks_[n] = 1;
108484543d1Sopenharmony_ci                    },
109484543d1Sopenharmony_ci                    {&faceDegrees_[n]}, {&faceMasks_[n]});
110484543d1Sopenharmony_ci            }
111484543d1Sopenharmony_ci
112484543d1Sopenharmony_ci            // 人脸角度检测,输入人脸特征点结果,输出人脸角度结果
113484543d1Sopenharmony_ci            faceAngles_ = std::vector<uint32_t>(FACE_NUM, 0);
114484543d1Sopenharmony_ci            for (auto q = 0; q < FACE_NUM; q++) { // 实际业务中分割当前只做一次
115484543d1Sopenharmony_ci                ffrt::submit(
116484543d1Sopenharmony_ci                    [&, q]() {
117484543d1Sopenharmony_ci                        simulate_task_compute_time(COMPUTE_TIME_US);
118484543d1Sopenharmony_ci                        faceAngles_[q] = 1;
119484543d1Sopenharmony_ci                    },
120484543d1Sopenharmony_ci                    {&faceLandmarks_[q]}, {&faceAngles_[q]});
121484543d1Sopenharmony_ci            }
122484543d1Sopenharmony_ci
123484543d1Sopenharmony_ci            ffrt::wait(); // 同步子任务完成
124484543d1Sopenharmony_ci        }
125484543d1Sopenharmony_ci    }
126484543d1Sopenharmony_ci    TIME_END_INFO(t, "face_story");
127484543d1Sopenharmony_ci}
128484543d1Sopenharmony_ci
129484543d1Sopenharmony_ciint main()
130484543d1Sopenharmony_ci{
131484543d1Sopenharmony_ci    GetEnvs();
132484543d1Sopenharmony_ci    FaceStory();
133484543d1Sopenharmony_ci}