ShiqiYu / libfacedetection

An open source library for face detection in images. The face detection speed can reach 1000FPS.
Other
12.27k stars 3.05k forks source link

where is yunet-n facedetectcnn-model.cpp #365

Closed zheshipinyinMc closed 1 year ago

zheshipinyinMc commented 1 year ago

你好,使用tools/yunet2cpp.py得到facedetectcnn-data.cpp,但是发现yunet-s和yunet-n得到的cpp是不一样,而libfacedetection/src中的model.cpp和data.cpp应该是yunet-s的,yunet-n的model.cpp在哪儿呢?

Wwupup commented 1 year ago

你好 @zheshipinyinMc ,目前没有提供yunet-n的cpp实现,你可以自己尝试修改facedetectcnn-model.cpp,参考facedetect-data.cpp添加yunet-s缺少的几个网络层。前后处理都不用修改。

zheshipinyinMc commented 1 year ago

ok,我也是这样打算的。另外,请问一下,看到于老师的公众号在去年10月份推了一篇“【速度↑20%模型尺寸↓36%】极简开源人脸检测算法升级”,这个就是yunet-s吧?

Wwupup commented 1 year ago

ok,我也是这样打算的。另外,请问一下,看到于老师的公众号在去年10月份推了一篇“【速度↑20%模型尺寸↓36%】极简开源人脸检测算法升级”,这个就是yunet-s吧?

YuNet-n是75K参数的版本,YuNet-s也就是目前CPP的实现版本,是54K参数

zheshipinyinMc commented 1 year ago

好的,以当前版本为准

zheshipinyinMc commented 1 year ago

***YuNet-n** facedetectcnn-model.cpp

define NUM_CONV_LAYER 59

std::vector objectdetect_cnn(unsigned char * rgbImageData, int width, int height, int step) {

TIME_START;
if (!param_initialized)
{
    init_parameters();
    param_initialized = true;
}
TIME_END("init");

TIME_START;
auto fx = setDataFrom3x3S2P1to1x1S1P0FromImage(rgbImageData, width, height, 3, step);
TIME_END("convert data");

/***************CONV0*********************/
TIME_START;
fx = convolution(fx, g_pFilters[0]);
TIME_END("conv_head");

TIME_START;
fx = convolutionDP(fx, g_pFilters[1], g_pFilters[2]);
TIME_END("conv0");

TIME_START;
fx = maxpooling2x2S2(fx);
TIME_END("pool0");

/***************CONV1*********************/
TIME_START;
fx = convolution4layerUnit(fx, g_pFilters[3], g_pFilters[4], g_pFilters[5], g_pFilters[6]);
TIME_END("conv1");

/***************CONV2*********************/
TIME_START;
fx = convolution4layerUnit(fx, g_pFilters[7], g_pFilters[8], g_pFilters[9], g_pFilters[10]);
TIME_END("conv2");

/***************CONV3*********************/
TIME_START;
fx = maxpooling2x2S2(fx);
TIME_END("pool3");

TIME_START;
auto fb1 = convolution4layerUnit(fx, g_pFilters[11], g_pFilters[12], g_pFilters[13], g_pFilters[14]);
TIME_END("conv3");

/***************CONV4*********************/
TIME_START;
fx = maxpooling2x2S2(fb1);
TIME_END("pool4");

TIME_START;
auto fb2 = convolution4layerUnit(fx, g_pFilters[15], g_pFilters[16], g_pFilters[17], g_pFilters[18]);
TIME_END("conv4");

/***************CONV5*********************/
TIME_START;
fx = maxpooling2x2S2(fb2);
TIME_END("pool5");

TIME_START;
auto fb3 = convolution4layerUnit(fx, g_pFilters[19], g_pFilters[20], g_pFilters[21], g_pFilters[22]);
TIME_END("conv5");

/*****************add5*********************/    
TIME_START;
fb3 = convolutionDP(fb3, g_pFilters[27], g_pFilters[28]);
fb2 = elementAdd(upsampleX2(fb3), fb2);
TIME_END("add5");

CDataBlob<float> pred_reg[3], pred_cls[3], pred_kps[3], pred_obj[3];
/***************branch5*********************/
TIME_START;
fb3 = convolutionDP(fb3, g_pFilters[33], g_pFilters[34]);
pred_cls[2] = convolutionDP(fb3, g_pFilters[39], g_pFilters[40], false);
pred_reg[2] = convolutionDP(fb3, g_pFilters[45], g_pFilters[46], false);
pred_kps[2] = convolutionDP(fb3, g_pFilters[57], g_pFilters[58], false);
pred_obj[2] = convolutionDP(fb3, g_pFilters[51], g_pFilters[52], false);
TIME_END("branch5");

/*****************add4*********************/
TIME_START;
fb2 = convolutionDP(fb2, g_pFilters[25], g_pFilters[26]);
fb1 = elementAdd(upsampleX2(fb2), fb1);
TIME_END("add4");

/*****************add6*********************/    
TIME_START;
fb2 = convolutionDP(fb2, g_pFilters[31], g_pFilters[32]);
pred_cls[1] = convolutionDP(fb2, g_pFilters[37], g_pFilters[38], false);
pred_reg[1] = convolutionDP(fb2, g_pFilters[43], g_pFilters[44], false);
pred_kps[1] = convolutionDP(fb2, g_pFilters[55], g_pFilters[56], false);
pred_obj[1] = convolutionDP(fb2, g_pFilters[49], g_pFilters[50], false);
TIME_END("branch4");

/***************branch3*********************/
TIME_START;
fb1 = convolutionDP(fb1, g_pFilters[23], g_pFilters[24]);
fb1 = convolutionDP(fb1, g_pFilters[29], g_pFilters[30]);
pred_cls[0] = convolutionDP(fb1, g_pFilters[35], g_pFilters[36], false);
pred_reg[0] = convolutionDP(fb1, g_pFilters[41], g_pFilters[42], false);
pred_kps[0] = convolutionDP(fb1, g_pFilters[53], g_pFilters[54], false);
pred_obj[0] = convolutionDP(fb1, g_pFilters[47], g_pFilters[48], false);
TIME_END("branch3");

/***************PRIORBOX*********************/
TIME_START;
auto prior3 = meshgrid(fb1.cols, fb1.rows, 8);
auto prior4 = meshgrid(fb2.cols, fb2.rows, 16);
auto prior5 = meshgrid(fb3.cols, fb3.rows, 32);
TIME_END("prior");
/***************PRIORBOX*********************/

TIME_START;
bbox_decode(pred_reg[0], prior3, 8);
bbox_decode(pred_reg[1], prior4, 16);
bbox_decode(pred_reg[2], prior5, 32);

kps_decode(pred_kps[0], prior3, 8);
kps_decode(pred_kps[1], prior4, 16);
kps_decode(pred_kps[2], prior5, 32);

auto cls = concat3(blob2vector(pred_cls[0]), blob2vector(pred_cls[1]), blob2vector(pred_cls[2]));
auto reg = concat3(blob2vector(pred_reg[0]), blob2vector(pred_reg[1]), blob2vector(pred_reg[2]));
auto kps = concat3(blob2vector(pred_kps[0]), blob2vector(pred_kps[1]), blob2vector(pred_kps[2]));
auto obj = concat3(blob2vector(pred_obj[0]), blob2vector(pred_obj[1]), blob2vector(pred_obj[2]));

sigmoid(cls);
sigmoid(obj);
TIME_END("decode")

TIME_START;
// std::vector<FaceRect> facesInfo = detection_output(cls, reg, kps, obj, 0.3f, 0.5f, 1000, 100);
std::vector<FaceRect> facesInfo = detection_output(cls, reg, kps, obj, 0.45f, 0.2f, 1000, 512);
TIME_END("detection output")
return facesInfo;

}