From 6962f568ea29152d0b8ca344a0c8e755afeaf17a Mon Sep 17 00:00:00 2001 From: zhangmeng <775834166@qq.com> Date: 星期一, 13 一月 2020 12:11:45 +0800 Subject: [PATCH] debug --- csdk.h | 40 +++ csrc/buz/face/property.h | 14 + csrc/buz/base.hpp | 9 csrc/buz/face/property.cpp | 34 +++ csrc/buz/face/detector.h | 18 + csrc/buz/face/detector.cpp | 60 +++++ csrc/buz/face/tracker.h | 20 + csrc/all.hpp | 9 /dev/null | 51 ---- csdk.cpp | 85 +++++++ csrc/buz/face/extractor.h | 14 + csrc/buz/face/extractor.cpp | 54 ++++ csrc/buz/face/tracker.cpp | 89 ++++++++ csdk_struct.h | 7 goface.go | 97 +++----- 15 files changed, 489 insertions(+), 112 deletions(-) diff --git a/cface.cpp b/cface.cpp deleted file mode 100644 index d212dc9..0000000 --- a/cface.cpp +++ /dev/null @@ -1,86 +0,0 @@ -#ifdef __cplusplus -extern "C"{ -#endif - -#include <stdio.h> -#include "cface.h" - -#ifdef __cplusplus -} -#endif - -#include "csrc/face.h" - -#include "csrc/struct.h" - -#include "csrc/face.cpp" - -using namespace cppface; - -void *create_sdkface(){ - return new sdkface(); -} - -void release(void *handle){ - if (handle){ - sdkface *s = (sdkface*)handle; - delete s; - } -} - -int init_detector(void *handle, const int min_faces, const int roll_angles, - const int threads_max, const int gpu){ - sdkface *s = (sdkface*)handle; - return s->detector(min_faces, roll_angles, threads_max, gpu); -} - -int init_extractor(void *handle, const int threads_max, const int gpu){ - sdkface *s = (sdkface*)handle; - return s->extractor(threads_max, gpu); -} - -int init_propertizer(void *handle, const int threads_max){ - sdkface *s = (sdkface*)handle; - return s->propertizer(threads_max); -} - -int init_tracker(void *handle, const int width, const int height, - const int max_faces, const int interval, const int sample_size, - const int threads_max, const int gpu){ - sdkface *s = (sdkface*)handle; - return s->tracker(width, height, max_faces, interval, sample_size, threads_max, gpu); -} - -int detect(void *handle, const void *data, const int w, const int h, const int c, const int chan, void **fpos, int *fcnt){ - sdkface *s = (sdkface*)handle; - cIMAGE img{(unsigned char*)data, w, h, c}; - return s->detect(&img, chan, fpos, fcnt); -} - -int extract(void *handle, const cFacePos *pos, const void*data, const int w, const int h, const int c, const int chan, void **feat, int *featLen){ - sdkface *s = (sdkface*)handle; - cIMAGE img{(unsigned char*)data, w, h, c}; - return s->extract(*pos, &img, chan, feat, featLen); -} - -float compare(void *handle, unsigned char *feat1, unsigned char *feat2){ - sdkface *s = (sdkface*)handle; - return s->compare(feat1, feat2); -} - -int propertize(void *handle, const cFacePos *pos, const void *data, const int w, const int h, const int c, const int chan, void **res){ - sdkface *s = (sdkface*)handle; - cIMAGE img{(unsigned char*)data, w, h, c}; - return s->propertize(*pos, &img, chan, res); -} - -int track(void *handle, const void *data, const int w, const int h, const int c, const int chan, void **fInfo, int *fcnt){ - sdkface *s = (sdkface*)handle; - cIMAGE img{(unsigned char*)data, w, h, c}; - return s->track(&img, chan, fInfo, fcnt); -} - -int track_resize(void *handle, const int w, const int h, const int chan){ - sdkface *s = (sdkface*)handle; - return s->track_resize(w, h, chan); -} \ No newline at end of file diff --git a/cface.h b/cface.h deleted file mode 100644 index 9eaeec5..0000000 --- a/cface.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef _c_face_h_ -#define _c_face_h_ - -#ifdef __cplusplus -extern "C"{ -#endif - -#include "csrc/struct.h" - -void *create_sdkface(); -void release(void *handle); - -int init_detector(void *handle, const int min_faces, const int roll_angles, - const int threads_max, const int gpu); - -int init_extractor(void *handle, const int threads_max, const int gpu); -int init_propertizer(void *handle, const int threads_max); - -int init_tracker(void *handle, const int width, const int height, - const int max_faces, const int interval, const int sample_size, - const int threads_max, const int gpu); - -int detect(void *handle, const void *data, const int w, const int h, const int c, const int chan, void **fpos, int *fcnt); -int extract(void *handle, const cFacePos *pos, const void*data, const int w, const int h, const int c, const int chan, void **feat, int *featLen); -float compare(void *handle, unsigned char *feat1, unsigned char *feat2); - -int propertize(void *handle, const cFacePos *pos, const void *data, const int w, const int h, const int c, const int chan, void **res); - -int track(void *handle, const void *data, const int w, const int h, const int c, const int chan, void **fInfo, int *fcnt); -int track_resize(void *handle, const int w, const int h, const int chan); - -#ifdef __cplusplus -} -#endif - -#endif \ No newline at end of file diff --git a/csdk.cpp b/csdk.cpp new file mode 100644 index 0000000..bd11087 --- /dev/null +++ b/csdk.cpp @@ -0,0 +1,85 @@ +#ifdef __cplusplus +extern "C"{ +#endif + +#include "csdk.h" + +#ifdef __cplusplus +} +#endif + +#include "csrc/all.hpp" + +using namespace csdk_wrap; + +static VecFunc dtors_; + +int c_api_face_detector_init(const int tm, const int gi, const int minFaces, const int rollAngle){ + return init_face_detector(tm, gi, minFaces, rollAngle, dtors_); +} + +int c_api_face_property_init(const int tm){ + return init_face_property(tm, dtors_); +} + +int c_api_face_extractor_init(const int tm, const int gi){ + return init_face_extractor(tm, gi, dtors_); +} + +int c_api_face_tracker_init(const int tm, const int gi, const int wid, const int hei, + const int maxFaces, const int detinterval, const int sampleSize){ + + return init_face_tracker(tm, gi, wid, hei, maxFaces, detinterval, sampleSize, dtors_); +} + +int c_api_face_track_resize(const int chan, const int wid, const int hei){ + return face_track_resize(chan, wid, hei); +} + +void c_api_release(){ + for(auto &i : dtors_){ + i(); + } + dtors_.clear(); +} + +//////////////////////////////////////////////// + +cFacePos* c_api_face_detect(int *faceCount, uchar*data, const int w, const int h, const int channel){ + const cIMAGE img{data, w, h, 3}; + return face_detect(faceCount, &img, channel); +} + +cThftResult c_api_face_property(const cFacePos* pos, uchar*data, const int w, const int h, const int channel){ + + const cIMAGE img{data, w, h, 3}; + return face_property(*pos, &img, channel); +} + +uchar* c_api_face_extract(int *featLen, const cFacePos* pos, uchar*data, const int w, const int h, const int channel){ + + const cIMAGE img{data, w, h, 3}; + return face_extract_feature(featLen, *pos, &img, channel); +} + +float c_api_face_compare(uchar *feat1, uchar *feat2){ + return face_compare(feat1, feat2); +} + +cRECT* c_api_face_track_only(int *fCount, uchar *data, const int wid, const int hei, const int channel){ + const cIMAGE img{data, wid, hei, 3}; + + return face_track_only(fCount, &img, channel); +} + +cFaceInfo* c_api_face_track_detect(int *fCount, uchar *data, const int wid, const int hei, const int channel){ + const cIMAGE img{data, wid, hei, 3}; + + return face_track_detect(fCount, &img, channel); +} + +cFaceInfo* c_api_face_track(int *fCount, uchar *data, const int wid, const int hei, const int channel){ + const cIMAGE img{data, wid, hei, 3}; + return face_track(fCount, &img, channel); +} + diff --git a/csdk.h b/csdk.h new file mode 100644 index 0000000..c1d0076 --- /dev/null +++ b/csdk.h @@ -0,0 +1,40 @@ +#ifndef _c_wrapper_sdk_h_ +#define _c_wrapper_sdk_h_ + +#ifdef __cplusplus +extern "C"{ +#endif + +#include "csdk_struct.h" + +#ifndef uchar +typedef unsigned char uchar; +#endif + +typedef void* YoloHandle; + +int c_api_face_detector_init(const int tm, const int gi, const int minFaces, const int rollAngle); +int c_api_face_property_init(const int tm); +int c_api_face_extractor_init(const int tm, const int gi); +int c_api_face_tracker_init(const int tm, const int gi, const int wid, const int hei, + const int maxFaces, const int detinterval, const int sampleSize); +int c_api_face_track_resize(const int chan, const int w, const int h); +void c_api_release(); +/////////////////////////////////////////// + +/// face api +cFacePos* c_api_face_detect(int *faceCount, uchar*data, const int w, const int h, const int channel); +cThftResult c_api_face_property(const cFacePos* pos, uchar*data, const int w, const int h, const int channel); + +uchar* c_api_face_extract(int *featLen, const cFacePos* pos, uchar*data, const int w, const int h, const int channel); +float c_api_face_compare(uchar *feat1, uchar *feat2); +cRECT* c_api_face_track_only(int *fCount, uchar *data, const int wid, const int hei, const int channel); +cFaceInfo* c_api_face_track_detect(int *fCount, uchar *data, const int wid, const int hei, const int channel); +cFaceInfo* c_api_face_track(int *fCount, uchar *data, const int wid, const int hei, const int channel); + +#ifdef __cplusplus +} +#endif + + +#endif \ No newline at end of file diff --git a/csrc/struct.h b/csdk_struct.h similarity index 91% rename from csrc/struct.h rename to csdk_struct.h index 9be7c4c..951ab42 100644 --- a/csrc/struct.h +++ b/csdk_struct.h @@ -1,5 +1,7 @@ -#ifndef _face_struct_h_ -#define _face_struct_h_ +#ifndef _c_wrapper_c_structure_h_ +#define _c_wrapper_c_structure_h_ + +#include <string.h> typedef struct _cPOINT { int x; @@ -60,4 +62,5 @@ long nFaceID;//face tracking id } cFaceInfo; + #endif \ No newline at end of file diff --git a/csrc/all.hpp b/csrc/all.hpp new file mode 100644 index 0000000..bbe31af --- /dev/null +++ b/csrc/all.hpp @@ -0,0 +1,9 @@ +#ifndef _c_wrapper_face_detector_all_hpp_ +#define _c_wrapper_face_detector_all_hpp_ + +#include "buz/face/detector.cpp" +#include "buz/face/extractor.cpp" +#include "buz/face/property.cpp" +#include "buz/face/tracker.cpp" + +#endif \ No newline at end of file diff --git a/csrc/buz/base.hpp b/csrc/buz/base.hpp new file mode 100644 index 0000000..c8e6763 --- /dev/null +++ b/csrc/buz/base.hpp @@ -0,0 +1,9 @@ +#ifndef _c_sdk_wrap_base_class_hpp_ +#define _c_sdk_wrap_base_class_hpp_ + +#include <vector> +#include <functional> + +using VecFunc = std::vector<std::function<void()> >; + +#endif \ No newline at end of file diff --git a/csrc/buz/face/detector.cpp b/csrc/buz/face/detector.cpp new file mode 100644 index 0000000..e191ea8 --- /dev/null +++ b/csrc/buz/face/detector.cpp @@ -0,0 +1,60 @@ +#include "detector.h" + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "THFaceImage_i.h" + +#include "csdk_struct.h" + +namespace csdk_wrap +{ + int init_face_detector(const int tm, const int gi, const int minFaces, const int rollAngle, + VecFunc &vec){ + int ret = 0; + if (gi < 0) { + THFI_Param *param = new THFI_Param[tm]; + ret = THFI_Create(tm, param); + delete[] param; + } else { + THFI_Param_Ex *param = new THFI_Param_Ex[tm]; + THFI_Param detParam; + detParam.nMinFaceSize = minFaces; + detParam.nRollAngle = rollAngle; + for (int i = 0; i < tm; i++) { + param[i].tp = detParam; + param[i].nDeviceID = gi; + } + ret = THFI_Create_Ex(tm, param); + delete[] param; + } + if(ret != tm){ + printf("create face detector failed!\n"); + }else{ + vec.emplace_back([]{THFI_Release();}); + } + + return ret; + } + + cFacePos* face_detect(int *faceCount, const cIMAGE *img, const int channel){ + if(channel < 0 || !img){ + return NULL; + } + cFacePos *fpos = NULL; + ::THFI_FacePos facesPos[30]; + int faceNum = THFI_DetectFace(channel, (BYTE*)(img->data), 24, img->width, img->height, facesPos, 30); + + if (faceNum > 0) { + fpos = (cFacePos*)malloc(faceNum * sizeof(cFacePos)); + *faceCount = faceNum; + memcpy(fpos, facesPos, sizeof(THFI_FacePos) * faceNum); + + }else{ + // printf ("no face detected\n"); + } + return fpos; + } + +} // csdk_wrap diff --git a/csrc/buz/face/detector.h b/csrc/buz/face/detector.h new file mode 100644 index 0000000..8a4497d --- /dev/null +++ b/csrc/buz/face/detector.h @@ -0,0 +1,18 @@ +#ifndef _c_wrapper_face_detector_hpp_ +#define _c_wrapper_face_detector_hpp_ + +#include "../base.hpp" + + +struct _cFacePos; +struct _cIMAGE; + +namespace csdk_wrap{ + + int init_face_detector(const int tm, const int gi, const int minFaces, const int rollAngle, + VecFunc &vec); + cFacePos* face_detect(int *faceCount, const cIMAGE *img, const int channel); + +} + +#endif \ No newline at end of file diff --git a/csrc/buz/face/extractor.cpp b/csrc/buz/face/extractor.cpp new file mode 100644 index 0000000..594eb1f --- /dev/null +++ b/csrc/buz/face/extractor.cpp @@ -0,0 +1,54 @@ +#include "extractor.h" + +#include "THFeature_i.h" +#include "csdk_struct.h" + +namespace csdk_wrap{ + + int init_face_extractor(const int tm, const int gi, VecFunc &vec){ + int ret = 0; + if (gi < 0) { + ret = EF_Init(tm); + } else { + EF_Param *param = new EF_Param[tm]; + for (int i = 0; i < tm; i++) { + param[i].nDeviceID = gi; + } + ret = EF_Init_Ex(tm, param); + delete[] param; + } + if(ret != tm){ + printf("create face extractor failed!\n");; + }else{ + vec.emplace_back([]{EF_Release();}); + } + return ret; + } + + unsigned char* face_extract_feature(int *featLen, const cFacePos &pos, const cIMAGE *img, const int chan){ + if(!img){ + printf("face extract error, image or pos null\n"); + return NULL; + } + *featLen = EF_Size(); + unsigned char *feat = (unsigned char*)malloc(*featLen); + auto ret = EF_Extract(chan, (BYTE*)(img->data), img->width, img->height, 3, (THFI_FacePos*)(&pos), feat); + + if(ret != 1){ + printf("face extract error %d\n", ret); + free(feat); + *featLen = 0; + return NULL; + } + return feat; + } + + float face_compare(unsigned char *feat1, unsigned char *feat2){ + if (!feat1 || !feat2){ + return 0.0f; + } + + return EF_Compare(feat1, feat2); + } + +} \ No newline at end of file diff --git a/csrc/buz/face/extractor.h b/csrc/buz/face/extractor.h new file mode 100644 index 0000000..31bb712 --- /dev/null +++ b/csrc/buz/face/extractor.h @@ -0,0 +1,14 @@ +#ifndef _c_wrapper_face_extractor_h_ +#define _c_wrapper_face_extractor_h_ + +#include "../base.hpp" + +struct _cFacePos; +struct _cIMAGE; + +namespace csdk_wrap{ + int init_face_extractor(const int tm, const int gi, VecFunc &vec); + unsigned char* face_extract_feature(int *featLen, const cFacePos &pos, const cIMAGE *img, const int chan); + float face_compare(unsigned char *feat1, unsigned char *feat2); +} +#endif \ No newline at end of file diff --git a/csrc/buz/face/property.cpp b/csrc/buz/face/property.cpp new file mode 100644 index 0000000..74d4774 --- /dev/null +++ b/csrc/buz/face/property.cpp @@ -0,0 +1,34 @@ +#include "property.h" + +#include "THFaceProperty_i.h" +#include "csdk_struct.h" + +namespace csdk_wrap{ + + int init_face_property(const int tm, VecFunc &vec){ + auto ret = THFP_Create(tm); + if(ret != tm){ + printf("create face property error\n"); + }else{ + vec.emplace_back([]{THFP_Release();}); + } + return ret; + } + + cThftResult face_property(const cFacePos &pos, const cIMAGE *img, const int chan){ + cThftResult result; + result.gender = result.age = result.race = -1; + + auto ret = THFP_Execute_V2(chan, (BYTE*)(img->data), img->width, img->height, + (THFI_FacePos*)(&pos), (THFP_Result_V2*)(&result)); + if(ret == 0){ + // printf("property face gender %s, age %d, race %s, beauty level %d, smile_level %d\n", + // result.gender ?"male":"female", + // result.age, + // result.race==2?"yello":"other", + // result.beauty_level, result.smile_level); + } + return result; + } + +} \ No newline at end of file diff --git a/csrc/buz/face/property.h b/csrc/buz/face/property.h new file mode 100644 index 0000000..39d3976 --- /dev/null +++ b/csrc/buz/face/property.h @@ -0,0 +1,14 @@ +#ifndef _c_wrapper_face_property_h_ +#define _c_wrapper_face_property_h_ + +#include "../base.hpp" + +struct _cThftResult; +struct _cFacePos; +struct _cIMAGE; + +namespace csdk_wrap{ + int init_face_property(const int tm, VecFunc &vec); + cThftResult face_property(const cFacePos &pos, const cIMAGE *img, const int chan); +} +#endif \ No newline at end of file diff --git a/csrc/buz/face/tracker.cpp b/csrc/buz/face/tracker.cpp new file mode 100644 index 0000000..cb2744a --- /dev/null +++ b/csrc/buz/face/tracker.cpp @@ -0,0 +1,89 @@ +#include "tracker.h" + +#include <stdio.h> +#include "THFaceTracking_i.h" + +namespace csdk_wrap{ + static THFT_Param param; + int init_face_tracker(const int tm, const int gi,const int w, const int h, + const int maxFaces, const int detinterval, const int sampleSize, + VecFunc &vec){ + param.nDeviceID = gi; + param.nImageWidth = w; + param.nImageHeight = h; + param.nMaxFaceNum = maxFaces; + param.nSampleSize = sampleSize > 0 ? sampleSize : w/2; + param.nDetectionIntervalFrame = detinterval; +printf("threads %d gi: %d size: %dx%d maxface: %d, sample: %d, interval: %d\n", + tm, gi, w, h, maxFaces, sampleSize, detinterval); + auto nNum = THFT_Create(tm, ¶m); + if(nNum != tm){ + printf("create face detector failed!\n"); + }else{ + vec.emplace_back([]{THFT_Release();}); + } + return nNum; + } + + cRECT* face_track_only(int *faceCount, const cIMAGE *img, const int chan){ + + *faceCount = 0; + + cRECT *pFaces = (cRECT*)malloc(param.nMaxFaceNum * sizeof(cRECT)); + auto nNum = THFT_FaceOnly(chan, img->data, img->width, img->height, (tagRECT*)pFaces, param.nMaxFaceNum, param.nSampleSize); + if (nNum > 0) + { + *faceCount = nNum; + }else{ + free(pFaces); + pFaces = NULL; + } + return pFaces; + } + + cFaceInfo* face_track_detect(int *faceCount, const cIMAGE *img, const int chan){ + *faceCount = 0; + + cFaceInfo* pFaceInfos = (cFaceInfo*)malloc(param.nMaxFaceNum * sizeof(cFaceInfo)); + auto nNum = THFT_FaceDetect(chan, img->data, img->width, img->height, (THFT_FaceInfo*)pFaceInfos, param.nMaxFaceNum, param.nSampleSize); + if (nNum > 0){ + *faceCount = nNum; + }else{ + free(pFaceInfos); + pFaceInfos = NULL; + } + return pFaceInfos; + } + + cFaceInfo* face_track(int *faceCount, const cIMAGE *img, const int chan){ + *faceCount = 0; + + cFaceInfo* pFaceInfos = (cFaceInfo*)malloc(param.nMaxFaceNum * sizeof(cFaceInfo)); + auto nNum = THFT_FaceTracking(chan, img->data, (THFT_FaceInfo*)pFaceInfos); + if (nNum > 0){ + *faceCount = nNum; + }else{ + free(pFaceInfos); + pFaceInfos = NULL; + } + return pFaceInfos; + } + + //THFACETRACKING_API int THFT_Reset(short nChannelID, THFT_Param* pParam); + int face_track_resize(const int chan, const int w, const int h){ + THFT_Param tmpParam; + tmpParam.nDeviceID = param.nDeviceID; + tmpParam.nImageWidth = w; + tmpParam.nImageHeight = h; + tmpParam.nMaxFaceNum = param.nMaxFaceNum; + tmpParam.nSampleSize = param.nSampleSize; + tmpParam.nDetectionIntervalFrame = param.nDetectionIntervalFrame; + + printf("chan %d size: %dx%d", chan, w, h); + + auto flag = THFT_Reset(chan, &tmpParam); + + return flag; + } + +} \ No newline at end of file diff --git a/csrc/buz/face/tracker.h b/csrc/buz/face/tracker.h new file mode 100644 index 0000000..6498bc9 --- /dev/null +++ b/csrc/buz/face/tracker.h @@ -0,0 +1,20 @@ +#ifndef _c_wrapper_face_tracker_h_ +#define _c_wrapper_face_tracker_h_ + +#include "../base.hpp" + +struct _cRECT; +struct _cFaceInfo; +struct _cIMAGE; + +namespace csdk_wrap{ + int init_face_tracker(const int tm, const int gi,const int w, const int h, + const int maxFaces, const int detinterval, const int sampleSize, + VecFunc &vec); + cRECT* face_track_only(int *faceCount, const cIMAGE *img, const int chan); + cFaceInfo* face_track_detect(int *faceCount, const cIMAGE *img, const int chan); + + cFaceInfo* face_track(int *faceCount, const cIMAGE *img, const int chan); + int face_track_resize(const int chan, const int w, const int h); +} +#endif \ No newline at end of file diff --git a/csrc/face.cpp b/csrc/face.cpp deleted file mode 100644 index 328111a..0000000 --- a/csrc/face.cpp +++ /dev/null @@ -1,225 +0,0 @@ -#include "face.h" - -#include <memory.h> - -#include "THFaceImage_i.h" -#include "THFeature_i.h" -#include "THFaceProperty_i.h" -#include "THFaceTracking_i.h" - -namespace cppface -{ - sdkface::sdkface() - :fpos_(NULL) - ,feature_size_(0) - ,feature_(NULL) - ,finfos_(NULL) - {} - - sdkface::~sdkface() - { - for (auto i : dtors_){ - i(); - } - if (fpos_) free(fpos_); - if (feature_) free(feature_); - if (finfos_) free(finfos_); - } - - int sdkface::detector(const int min_faces, const int roll_angles, - const int threads_max, const int gpu){ - int ret = 0; - if (gpu < 0) { - THFI_Param *param = new THFI_Param[threads_max]; - ret = THFI_Create(threads_max, param); - delete[] param; - } else { - THFI_Param_Ex *param = new THFI_Param_Ex[threads_max]; - THFI_Param detParam; - detParam.nMinFaceSize = min_faces; - detParam.nRollAngle = roll_angles; - for (int i = 0; i < threads_max; i++) { - param[i].tp = detParam; - param[i].nDeviceID = gpu; - } - ret = THFI_Create_Ex(threads_max, param); - delete[] param; - } - if(ret != threads_max){ - printf("create face detector failed!\n"); - }else{ - dtors_.emplace_back([]{THFI_Release();}); - } - - return ret; - } - - int sdkface::extractor(const int threads_max, const int gpu){ - int ret = 0; - if (gpu < 0) { - ret = EF_Init(threads_max); - } else { - EF_Param *param = new EF_Param[threads_max]; - for (int i = 0; i < threads_max; i++) { - param[i].nDeviceID = gpu; - } - ret = EF_Init_Ex(threads_max, param); - delete[] param; - } - if(ret != threads_max){ - printf("create face extractor failed!\n");; - }else{ - dtors_.emplace_back([]{EF_Release();}); - } - return ret; - - } - - int sdkface::propertizer(const int threads_max){ - auto ret = THFP_Create(threads_max); - if(ret != threads_max){ - printf("create face property error\n"); - }else{ - dtors_.emplace_back([]{THFP_Release();}); - } - return ret; - } - -static const int maxFacePos = 30; - int sdkface::detect(const cIMAGE *img, const int chan, void **fpos, int *fcnt){ - if(chan < 0 || !img || !img->data || img->width <= 0 || img->height <= 0){ - return -1; - } - - if (fpos_ == NULL){ - fpos_ = (cFacePos*)malloc(maxFacePos * sizeof(cFacePos)); - } - - // ::THFI_FacePos facesPos[maxFacePos]; - int faceNum = THFI_DetectFace(chan, (BYTE*)(img->data), 24, img->width, img->height, - (::THFI_FacePos*)fpos_, maxFacePos); - - if (faceNum > 0) { - // memcpy(fpos_, facesPos, sizeof(THFI_FacePos) * faceNum); - *fcnt = faceNum; - *fpos = fpos_; - } - return faceNum; - } - - int sdkface::extract(const cFacePos &pos, const cIMAGE *img, const int chan, void **feat, int *featLen){ - if(chan < 0 || !img || !img->data || img->width <= 0 || img->height <= 0){ - printf("face extract error, image or pos null\n"); - return -1; - } - - *featLen = EF_Size(); - if (feature_size_ < *featLen){ - free(feature_); - feature_ = (unsigned char*)malloc(*featLen); - feature_size_ = *featLen; - } - - auto ret = EF_Extract(chan, (BYTE*)(img->data), img->width, img->height, 3, - (THFI_FacePos*)(&pos), feature_); - - if(ret != 1){ - printf("face extract error %d\n", ret); - return ret; - } - - *feat = feature_; - - return *featLen; - } - - float sdkface::compare(unsigned char *feat1, unsigned char *feat2){ - if (!feat1 || !feat2){ - return 0.0f; - } - - return EF_Compare(feat1, feat2); - } - - int sdkface::propertize(const cFacePos &pos, const cIMAGE *img, const int chan, void **res){ - if(chan < 0 || !img || !img->data || img->width <= 0 || img->height <= 0){ - printf("face propertize error, image or pos null\n"); - return -1; - } - - cThftResult *thft = (cThftResult*)malloc(sizeof(cThftResult)); - - *res = NULL; - auto ret = THFP_Execute_V2(chan, (BYTE*)(img->data), img->width, img->height, - (THFI_FacePos*)(&pos), (THFP_Result_V2*)thft); - if(ret == 0){ - *res = thft; - // printf("property face gender %s, age %d, race %s, beauty level %d, smile_level %d\n", - // res.gender ?"male":"female", - // res.age, - // res.race==2?"yello":"other", - // res.beauty_level, res.smile_level); - } - return ret; - } - -static THFT_Param param; - int sdkface::tracker(const int width, const int height, - const int max_faces, const int interval, const int sample_size, - const int threads_max, const int gpu){ - - param.nDeviceID = gpu; - param.nImageWidth = width; - param.nImageHeight = height; - param.nMaxFaceNum = max_faces; - param.nSampleSize = sample_size > 0 ? sample_size : width/2; - param.nDetectionIntervalFrame = interval; - - printf("##########start threads: %d gi: %d size: %dx%d maxface: %d, sample: %d, interval: %d\n", - threads_max, gpu, width, height, max_faces, sample_size, interval); - - auto nNum = THFT_Create(threads_max, ¶m); - if(nNum != threads_max){ - printf("create face detector failed!\n"); - }else{ - dtors_.emplace_back([]{THFT_Release();}); - } - - printf("##########end threads: %d gi: %d size: %dx%d maxface: %d, sample: %d, interval: %d\n", - threads_max, gpu, width, height, max_faces, sample_size, interval); - - return nNum; - } - - int sdkface::track(const cIMAGE *img, const int chan, void **fInfo, int *fcnt){ - if (!finfos_){ - finfos_ = (cFaceInfo*)malloc(param.nMaxFaceNum * sizeof(cFaceInfo)); - } - - *fcnt = 0; - - auto nNum = THFT_FaceTracking(chan, img->data, (THFT_FaceInfo*)finfos_); - if (nNum > 0){ - *fcnt = nNum; - *fInfo = finfos_; - }else{ - *fInfo = NULL; - } - return nNum; - } - - int sdkface::track_resize(const int w, const int h, const int chan){ - THFT_Param tmpParam; - tmpParam.nDeviceID = param.nDeviceID; - tmpParam.nImageWidth = w; - tmpParam.nImageHeight = h; - tmpParam.nMaxFaceNum = param.nMaxFaceNum; - tmpParam.nSampleSize = param.nSampleSize; - tmpParam.nDetectionIntervalFrame = param.nDetectionIntervalFrame; - - printf("##########resize track\n"); - - return THFT_Reset(chan, &tmpParam); - } - -} // namespace cppface diff --git a/csrc/face.h b/csrc/face.h deleted file mode 100644 index d0b5233..0000000 --- a/csrc/face.h +++ /dev/null @@ -1,51 +0,0 @@ -#ifndef _cpp_face_hpp_ -#define _cpp_face_hpp_ - -#include <vector> -#include <functional> - -using VecFunc = std::vector<std::function<void()> >; - -#include "struct.h" - -namespace cppface -{ - class sdkface{ - public: - sdkface(); - ~sdkface(); - - public: - int detector(const int min_faces, const int roll_angles, - const int threads_max, const int gpu); - int extractor(const int threads_max, const int gpu); - int propertizer(const int threads_max); - - int tracker(const int width, const int height, - const int max_faces, const int interval, const int sample_size, - const int threads_max, const int gpu); - - public: - int detect(const cIMAGE *img, const int chan, void **fpos, int *fcnt); - int extract(const cFacePos &pos, const cIMAGE *img, const int chan, void **feat, int *featLen); - float compare(unsigned char *feat1, unsigned char *feat2); - - int propertize(const cFacePos &pos, const cIMAGE *img, const int chan, void **res); - - int track(const cIMAGE *img, const int chan, void **fInfo, int *fcnt); - int track_resize(const int w, const int h, const int chan); - private: - VecFunc dtors_; - - cFacePos *fpos_; - - int feature_size_; - unsigned char *feature_; - - cFaceInfo *finfos_; - - }; -} // namespace cppface - - -#endif \ No newline at end of file diff --git a/goface.go b/goface.go index 7ac9122..16b840a 100644 --- a/goface.go +++ b/goface.go @@ -8,7 +8,7 @@ #cgo LDFLAGS: -lTHFaceImage -lTHFeature -lTHFaceProperty -lTHFaceTracking #cgo LDFLAGS: -lcudart -lcublas -lcurand -lrt -ldl -lpthread #include <stdlib.h> -#include "cface.h" +#include "csdk.h" */ import "C" import ( @@ -22,7 +22,6 @@ // SDKFace sdk type SDKFace struct { - handle unsafe.Pointer detector bool extractor bool propertizer bool @@ -32,13 +31,8 @@ // NewSDK sdk func NewSDK(fn func(...interface{})) *SDKFace { - h := C.create_sdkface() - if h == nil { - return nil - } return &SDKFace{ - handle: h, detector: false, extractor: false, propertizer: false, @@ -49,9 +43,7 @@ // Free free func (s *SDKFace) Free() { - if s != nil && s.handle != nil { - C.release(s.handle) - } + C.c_api_release() } func (s *SDKFace) printLog(l ...interface{}) { @@ -61,12 +53,14 @@ } // Detector detector -func (s *SDKFace) Detector(minFaces, rollAngles, threadMax, gpu int) bool { +func (s *SDKFace) Detector(minFaces, rollAngle, threadMax, gpu int) bool { if s.detector { return true } - ret := C.init_detector(s.handle, C.int(minFaces), C.int(rollAngles), C.int(threadMax), C.int(gpu)) + + ret := C.c_api_face_detector_init(C.int(threadMax), C.int(gpu), C.int(minFaces), C.int(rollAngle)) + if ret <= 0 { s.printLog("->face--> CREATE Detector ERROR: ", ret) return false @@ -81,7 +75,7 @@ if s.extractor { return true } - ret := C.init_extractor(s.handle, C.int(threadMax), C.int(gpu)) + ret := C.c_api_face_extractor_init(C.int(threadMax), C.int(gpu)) if ret <= 0 { s.printLog("->face--> CREATE Extractor ERROR: ", ret) return false @@ -96,7 +90,7 @@ if s.propertizer { return true } - ret := C.init_propertizer(s.handle, C.int(threadMax)) + ret := C.c_api_face_property_init(C.int(threadMax)) if ret <= 0 { s.printLog("->face--> CREATE Propertizer ERROR: ", ret) return false @@ -111,8 +105,7 @@ if s.tracker { return s.tracker } - ret := C.init_tracker(s.handle, C.int(w), C.int(h), C.int(maxFaces), C.int(interval), C.int(sampleSize), C.int(threadMax), C.int(gpu)) - + ret := C.c_api_face_tracker_init(C.int(threadMax), C.int(gpu), C.int(w), C.int(h), C.int(maxFaces), C.int(interval), C.int(sampleSize)) if ret <= 0 { s.printLog("->face--> CREATE Tracker ERROR: ", ret) return false @@ -141,30 +134,31 @@ return nil } - var cfpos unsafe.Pointer var count C.int - ret := C.detect(s.handle, unsafe.Pointer(&data[0]), C.int(w), C.int(h), C.int(c), C.int(ch), &cfpos, &count) - if ret > 0 { - return CFacePosArrayToGoArray(cfpos, int(count)) + cfpos := C.c_api_face_detect(&count, (*C.uchar)(unsafe.Pointer(&data[0])), C.int(w), C.int(h), C.int(ch)) + if cfpos != nil { + defer C.free(unsafe.Pointer(cfpos)) + return CFacePosArrayToGoArray(unsafe.Pointer(cfpos), int(count)) } - s.printLog("->face--> Detect No One, Ret: ", ret) + + s.printLog("->face--> Detect No One") return nil } // Extract extract func (s *SDKFace) Extract(fpos sdkstruct.CFacePos, data []byte, w, h, c int, ch int) []byte { + if !s.extractor { + return nil + } + var featLen C.int pos := (*C.cFacePos)(unsafe.Pointer(&fpos)) - //(void *handle, const cFacePos *pos, const void*data, const int w, const int h, const int c, const int chan, void **feat, int *featLen); - var feat unsafe.Pointer - var featLen C.int - ret := C.extract(s.handle, pos, unsafe.Pointer(&data[0]), C.int(w), C.int(h), C.int(c), C.int(ch), &feat, &featLen) - if ret > 0 { - return C.GoBytes(feat, featLen) - } - s.printLog("->face--> Extract Nothing, Ret: ", ret) - return nil + p := C.c_api_face_extract(&featLen, pos, (*C.uchar)(unsafe.Pointer(&data[0])), C.int(w), C.int(h), C.int(ch)) + defer C.free(unsafe.Pointer(p)) + b := C.GoBytes(unsafe.Pointer(p), featLen) + s.printLog("->face--> Extract Nothing, Ret: ", len(b)) + return b } // Compare face compare @@ -174,7 +168,7 @@ return 0 } - res := C.compare(s.handle, (*C.uchar)(unsafe.Pointer(&feat1[0])), (*C.uchar)(unsafe.Pointer(&feat2[0]))) + res := C.c_api_face_compare((*C.uchar)(unsafe.Pointer(&feat1[0])), (*C.uchar)(unsafe.Pointer(&feat2[0]))) return float32(res) } @@ -185,16 +179,9 @@ } pos := (*C.cFacePos)(unsafe.Pointer(&fpos)) - - var thft unsafe.Pointer - ret := C.propertize(s.handle, pos, unsafe.Pointer(&data[0]), C.int(w), C.int(h), C.int(c), C.int(ch), &thft) - if ret == 0 { - gothft := *(*sdkstruct.CThftResult)(thft) - C.free(thft) - return &gothft - } - s.printLog("->face--> Propertize Nothing, Ret: ", ret) - return nil + result := C.c_api_face_property(pos, (*C.uchar)(unsafe.Pointer(&data[0])), C.int(w), C.int(h), C.int(ch)) + s.printLog("->face--> Propertize") + return (*sdkstruct.CThftResult)(unsafe.Pointer(&result)) } // CFaceInfoArrayToGoArray convert cFaceInfo array to go @@ -218,17 +205,14 @@ //img, const int chan, void **fInfo, int *fcnt); var fCount C.int - var finfos unsafe.Pointer - ret := C.track(s.handle, unsafe.Pointer(&data[0]), C.int(w), C.int(h), C.int(c), C.int(ch), &finfos, &fCount) - - if ret > 0 { - faces := CFaceInfoArrayToGoArray(finfos, int(fCount)) - //if len(faces) > 0{ - // fmt.Println("faces detected:", len(faces)) - //} - return faces + cFinfo := C.c_api_face_track(&fCount, (*C.uchar)(unsafe.Pointer(&data[0])), C.int(w), C.int(h), C.int(ch)) + // fmt.Println("cFinfo detected:", cFinfo) + if cFinfo == nil { + return nil } - return nil + defer C.free(unsafe.Pointer(cFinfo)) + faces := CFaceInfoArrayToGoArray(unsafe.Pointer(cFinfo), int(fCount)) + return faces } // FaceInfo2FacePos info -> pos @@ -249,18 +233,13 @@ } // TrackerResize init face tracker -func (s *SDKFace) TrackerResize(w, h, ch int) bool { +func (s *SDKFace) TrackerResize(w, h, ch int) int { if !s.tracker { s.printLog("->face--> TrackerResize Failed, No Tracker Init") - return false + return -1 } - ret := C.track_resize(s.handle, C.int(w), C.int(h), C.int(ch)) - if ret == 1 { - return true - } - s.printLog("->face--> TrackerResize Failed, Ret: ", ret, " SDK Channel: ", ch, " Size: ", w, "x", h) - return false + return int(C.c_api_face_track_resize(C.int(ch), C.int(w), C.int(h))) } // Run run -- Gitblit v1.8.0