91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

MTCNN人臉檢測(cè)的詳細(xì)介紹及完整C++代碼你能學(xué)會(huì)嗎?

C語(yǔ)言專(zhuān)家集中營(yíng) ? 來(lái)源:未知 ? 作者:易水寒 ? 2018-07-09 11:02 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

人臉檢測(cè)識(shí)別一直是圖像算法領(lǐng)域一個(gè)主流話(huà)題。

前年SeetaFace開(kāi)源了人臉識(shí)別引擎,一度成為熱門(mén)話(huà)題。

雖然后來(lái)SeetaFace又放出來(lái) 2.0版本,但是,我說(shuō)但是。。。

沒(méi)有訓(xùn)練代碼,想要自己訓(xùn)練一下模型那可就犯難了。

雖然可以閱讀源碼,從前向傳播的角度,反過(guò)來(lái)實(shí)現(xiàn)訓(xùn)練代碼,

但是誰(shuí)有那個(gè)閑功夫和時(shí)間,去折騰這個(gè)呢?

有的時(shí)候還是要站在巨人的肩膀上,你才能看得更遠(yuǎn)。

而SeetaFace不算巨人,只是當(dāng)年風(fēng)口上的豬罷了。

前年,為了做一個(gè)人臉項(xiàng)目,也是看遍了網(wǎng)上各種項(xiàng)目。

林林總總,各有優(yōu)劣。

不多做評(píng)價(jià),很多東西還是要具體實(shí)操,實(shí)戰(zhàn)才能見(jiàn)真知。

有一段時(shí)間,用SeetaFace的人臉檢測(cè)來(lái)做一些小的演示demo,

也花了一點(diǎn)小時(shí)間去優(yōu)化它的算法。

不過(guò)很明顯我只是把他當(dāng)成玩具看待。

畢竟不能自己訓(xùn)練模型,這是很大的詬病。

直到后來(lái)深度學(xué)習(xí)大放異彩,印象最深刻莫過(guò)于MTCNN。

Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Neural Networks

大合照下,人臉圈出來(lái)很準(zhǔn)確,壯觀(guān)了去,這是第一印象。

上圖,大家感受一下。

CNN的有三個(gè)網(wǎng)絡(luò)結(jié)構(gòu)。

Stage1: Proposal Net

MTCNN人臉檢測(cè)的詳細(xì)介紹及完整C++代碼你能學(xué)會(huì)嗎?

Stage2: Refine Net

MTCNN人臉檢測(cè)的詳細(xì)介紹及完整C++代碼你能學(xué)會(huì)嗎?

Stage3: Output Net

MTCNN人臉檢測(cè)的詳細(xì)介紹及完整C++代碼你能學(xué)會(huì)嗎?

具體算法思路就不展開(kāi)了。

我對(duì)MTCNN感興趣的點(diǎn)在于,

MTCNN的思路可以拓展到各種物體檢測(cè)和識(shí)別方向。

也許唯一缺少的就是打標(biāo)好的數(shù)據(jù),

而標(biāo)注五個(gè)點(diǎn),足夠用于適配大多數(shù)物體了。

符合小而美的理念,這個(gè)是我比較推崇的。

所以MTCNN是一個(gè)很值得品味的算法。

github上也有不少M(fèi)TCNN的實(shí)現(xiàn)和資源。

基于mxnet基于caffe基于ncnn等等。。。

很明顯,mxnet和 caffe不符合小而美的理念。

果斷拋棄了。

ncnn有點(diǎn)肥大,不合我心。

所以,我動(dòng)了殺氣。。

移除NCNN與mtcnn無(wú)關(guān)的層,

梳理ncnn的一些邏輯代碼。

簡(jiǎn)單做了一些適配和優(yōu)化。

砍掉一些邊邊角角。

不依賴(lài)opencv等第三方庫(kù)。

編寫(xiě)示例代碼完成后,還有不少工作要做,

不過(guò)第一步感覺(jué)已經(jīng)符合我的小小預(yù)期。

完整示例代碼:

#include "mtcnn.h"#include "browse.h"#define USE_SHELL_OPEN#ifndef nullptr#define nullptr 0#endif#if defined(_MSC_VER)#define _CRT_SECURE_NO_WARNINGS#include #else#include#endif#define STB_IMAGE_STATIC#define STB_IMAGE_IMPLEMENTATION#include"stb_image.h"http://ref:https://github.com/nothings/stb/blob/master/stb_image.h#define TJE_IMPLEMENTATION#include "tiny_jpeg.h"http://ref:https://github.com/serge-rgb/TinyJPEG/blob/master/tiny_jpeg.h#include #include "timing.h"char saveFile[1024];unsignedchar *loadImage(const char *filename, int *Width, int *Height, int *Channels) { return stbi_load(filename, Width, Height, Channels, 0); }void saveImage(const char *filename, int Width, int Height, int Channels, unsigned char *Output) { memcpy(saveFile + strlen(saveFile), filename, strlen(filename)); *(saveFile + strlen(saveFile) + 1) = 0; //保存為jpg if (!tje_encode_to_file(saveFile, Width, Height, Channels, true, Output)) { fprintf(stderr, "save JPEG fail. "); return; }#ifdef USE_SHELL_OPEN browse(saveFile);#endif}void splitpath(const char *path, char *drv, char *dir, char *name, char *ext) { const char *end; const char *p; const char *s; if (path[0] && path[1] == ':') { if (drv) { *drv++ = *path++; *drv++ = *path++; *drv = '