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}