资源简介

基于mtcnn方法实现人脸对齐,人脸检测,c++代码实现。

资源截图

代码片段和文件信息

#include “MTCNN.h“

// compare score
bool CompareBBox(const FaceInfo & a const FaceInfo & b) {
return a.bbox.score > b.bbox.score;
}
// methodType : u is IoU(Intersection Over Union)
// methodType : m is IoM(Intersection Over Maximum)
std::vector MTCNN::NonMaximumSuppression(std::vector& bboxes
float thresh char methodType){
std::vector bboxes_nms;
std::sort(bboxes.begin() bboxes.end() CompareBBox);

int32_t select_idx = 0;
int32_t num_bbox = static_cast(bboxes.size());
std::vector mask_merged(num_bbox 0);
bool all_merged = false;

while (!all_merged) {
while (select_idx < num_bbox && mask_merged[select_idx] == 1)
select_idx++;
if (select_idx == num_bbox) {
all_merged = true;
continue;
}

bboxes_nms.push_back(bboxes[select_idx]);
mask_merged[select_idx] = 1;

FaceRect select_bbox = bboxes[select_idx].bbox;
float area1 = static_cast((select_bbox.x2 - select_bbox.x1 + 1) * (select_bbox.y2 - select_bbox.y1 + 1));
float x1 = static_cast(select_bbox.x1);
float y1 = static_cast(select_bbox.y1);
float x2 = static_cast(select_bbox.x2);
float y2 = static_cast(select_bbox.y2);

select_idx++;
for (int32_t i = select_idx; i < num_bbox; i++) {
if (mask_merged[i] == 1)
continue;

FaceRect& bbox_i = bboxes[i].bbox;
float x = std::max(x1 static_cast(bbox_i.x1));
float y = std::max(y1 static_cast(bbox_i.y1));
float w = std::min(x2 static_cast(bbox_i.x2)) - x + 1;
float h = std::min(y2 static_cast(bbox_i.y2)) - y + 1;
if (w <= 0 || h <= 0)
continue;

float area2 = static_cast((bbox_i.x2 - bbox_i.x1 + 1) * (bbox_i.y2 - bbox_i.y1 + 1));
float area_intersect = w * h;

switch (methodType) {
case ‘u‘:
if (static_cast(area_intersect) / (area1 + area2 - area_intersect) > thresh)
mask_merged[i] = 1;
break;
case ‘m‘:
if (static_cast(area_intersect) / std::min(area1 area2) > thresh)
mask_merged[i] = 1;
break;
default:
break;
}
}
}
return bboxes_nms;
}

void MTCNN::Bbox2Square(std::vector& bboxes){
for (int i = 0; i float h = bboxes[i].bbox.x2 - bboxes[i].bbox.x1;
float w = bboxes[i].bbox.y2 - bboxes[i].bbox.y1;
float side = h>w ? h : w;
bboxes[i].bbox.x1 += (h - side)*0.5;
bboxes[i].bbox.y1 += (w - side)*0.5;

bboxes[i].bbox.x2 = (int)(bboxes[i].bbox.x1 + side);
bboxes[i].bbox.y2 = (int)(bboxes[i].bbox.y1 + side);
bboxes[i].bbox.x1 = (int)(bboxes[i].bbox.x1);
bboxes[i].bbox.y1 = (int)(bboxes[i].bbox.y1);

}
}

std::vector MTCNN::BoxRegress(std::vector& faceInfo int stage){
std::vector bboxes;
for (int bboxId = 0; bboxId FaceRect faceRect;
FaceInfo tempFaceInfo;
float regw = faceInfo[bboxId].bbox.y2 - faceInfo[bboxId].bbox.y1;
regw += (stage == 1) ? 0 : 1;
float

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件       20814  2018-08-27 21:33  MTCNN\MTCNN.cpp
     文件        2667  2018-08-27 21:32  MTCNN\MTCNN.h
     目录           0  2018-08-27 21:33  MTCNN\

评论

共有 条评论