From 0541661d3e4a063d4e68b33e4d6dbb71d3b58638 Mon Sep 17 00:00:00 2001 From: chenshijun <chenshijun@aiotlink.com> Date: 星期三, 09 九月 2020 09:48:15 +0800 Subject: [PATCH] 添加人脸质量的so --- csdk.h | 13 ++ csdk.cpp | 35 +++++++ go2c.go | 13 ++ csrc/buz/face/quality.h | 20 ++++ gosdk.go | 100 +++++++++++++++++++ csrc/buz/face/quality.cpp | 75 +++++++++++++++ csdk_struct.h | 14 ++ csrc/all.hpp | 1 8 files changed, 269 insertions(+), 2 deletions(-) diff --git a/csdk.cpp b/csdk.cpp index 9ecfcdb..4a111f1 100644 --- a/csdk.cpp +++ b/csdk.cpp @@ -73,6 +73,41 @@ return face_compare(feat1, feat2); } +// quality +int c_api_face_quality_init(const int tm){ + return init_face_quality(tm, dtors_); +} + +void c_api_set_quality_params(const int min, const int max){ + return set_quality_params(min, max); +} + +cThfqResult* c_api_face_check_quality(const cFacePos *pos, uchar*data, const int w, const int h, const int channel){ + const cIMAGE img{data, w, h, 3}; + return face_check_quality(channel, &img, *pos); +} + +int c_api_face_check_quality_brightness(const cFacePos *pos, uchar*data, const int w, const int h, const int channel, int *nBrightness){ + const cIMAGE img{data, w, h, 3}; + return face_check_quality_brightness(channel, &img, *pos, nBrightness); +} + +int c_api_face_check_quality_occlusion(const cFacePos *pos, uchar*data, const int w, const int h, const int channel, int *nOcclusion){ + const cIMAGE img{data, w, h, 3}; + return face_check_quality_occlusion(channel, &img, *pos, nOcclusion); +} + +int c_api_face_check_quality_hat(const cFacePos *pos, uchar*data, const int w, const int h, const int channel, int *nHat){ + const cIMAGE img{data, w, h, 3}; + return face_check_quality_hat(channel, &img, *pos, nHat); +} + +int c_api_face_check_quality_blur_glass(const cFacePos *pos, uchar*data, const int w, const int h, + const int channel, int* nBlur,int* nGlasses){ + const cIMAGE img{data, w, h, 3}; + return face_check_quality_blur_glass(channel, &img, *pos, nBlur, nGlasses); +} + 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}; diff --git a/csdk.h b/csdk.h index c1f36a9..d91ecd2 100644 --- a/csdk.h +++ b/csdk.h @@ -36,6 +36,19 @@ 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); +// quality +int c_api_face_quality_init(const int tm); +void c_api_set_quality_params(const int min, const int max); +cThfqResult* c_api_face_check_quality(const cFacePos *pos, uchar*data, const int w, const int h, const int channel); +int c_api_face_check_quality_brightness(const cFacePos *pos, uchar*data, const int w, const int h, + const int channel, int *nBrightness); +int c_api_face_check_quality_occlusion(const cFacePos *pos, uchar*data, const int w, const int h, + const int channel, int *nOcclusion); +int c_api_face_check_quality_hat(const cFacePos *pos, uchar*data, const int w, const int h, + const int channel, int *nHat); +int c_api_face_check_quality_blur_glass(const cFacePos *pos, uchar*data, const int w, const int h, + const int channel, int* nBlur,int* nGlasses); + /// yolo api cObjInfo* c_api_yolo_detect(YoloHandle handle, int *objCount, uchar*data, const int w, const int h, const float thrsh, const int use_means); const char* c_api_yolo_obj_name(const int typ); diff --git a/csdk_struct.h b/csdk_struct.h index 87d2702..ba8e272 100644 --- a/csdk_struct.h +++ b/csdk_struct.h @@ -62,6 +62,20 @@ long nFaceID;//face tracking id } cFaceInfo; +typedef struct _cThfqParam{ + int brightness_min;//0-100锛屽お鏆楅槇鍊�,寤鸿25.瓒婂皬瓒婂彲鑳芥妸杩囨殫鐨勪汉鑴稿綋浣滄甯镐汉鑴革紝姝ゅ弬鏁颁細褰卞搷THFQ_Result::brightness + int brightness_max;//0-100锛屽お浜槇鍊�,寤鸿75.瓒婂ぇ瓒婂彲鑳芥妸鐨勮繃浜汉鑴稿綋浣滄甯镐汉鑴革紝姝ゅ弬鏁颁細褰卞搷THFQ_Result::brightness +}cThfqParam; + +typedef struct _cThfqResult{ + int brightness;//浜鸿劯浜害锛屽彧鏈�3绉嶅彲鑳界殑鍊�:[-1->澶殫锛�0->姝e父锛�1->澶寒]锛屼寒搴︾粨鏋滀細鍙椾寒搴﹂槇鍊煎弬鏁癰rightness_min鍜宐rightness_max褰卞搷 + int occlusion;//浜鸿劯閬尅搴︼紝鑼冨洿鍊间负0-100,瓒婂ぇ琛ㄧず浜鸿劯閬尅绋嬪害瓒婇珮 + int hat;//甯﹀附瀛�,鑼冨洿涓�0-100锛岃秺澶ц〃绀鸿秺鍙兘鏈変僵鎴村附瀛愶紝寤鸿鍒ゅ埆闃堝�间负50 + int blur;//浜鸿劯妯$硦搴�,鑼冨洿鍊间负0-100,瓒婂ぇ琛ㄧず鍥惧儚瓒婃ā绯婏紝寤鸿浜鸿劯妯$硦搴﹀垽鍒槇鍊间负70 + int glasses;//甯︾溂闀�,鑼冨洿涓�0-100锛岃秺澶ц〃绀鸿秺鍙兘鏈夋埓鐪奸暅锛屽缓璁垽鍒槇鍊间负70 +}cThfqResult; + + typedef struct _cObjInfo { cRECT rcObj; diff --git a/csrc/all.hpp b/csrc/all.hpp index 1e58aa8..dcac3d6 100644 --- a/csrc/all.hpp +++ b/csrc/all.hpp @@ -5,6 +5,7 @@ #include "buz/face/extractor.cpp" #include "buz/face/property.cpp" #include "buz/face/tracker.cpp" +#include "buz/face/quality.cpp" #include "buz/yolo/detector.cpp" diff --git a/csrc/buz/face/quality.cpp b/csrc/buz/face/quality.cpp new file mode 100644 index 0000000..417fc60 --- /dev/null +++ b/csrc/buz/face/quality.cpp @@ -0,0 +1,75 @@ +#include "quality.h" + +#include "THFaceQuality_i.h" +#include "csdk_struct.h" + +namespace csdk_wrap{ + int init_face_quality(const int tm, VecFunc &vec){ + auto ret = THFQ_Create(tm); + if(ret != tm){ + printf("create face quality error\n"); + }else{ + vec.emplace_back([]{THFQ_Release();}); + } + return ret; + } + + void set_quality_params(const int min, const int max){ + int _min = (min<=10)?10:((min>=40)?40:min); + int _max = (max>=90)?90:((max<=60)?60:max); + const cThfqParam params{_min, _max}; + printf("set_quality_params : %d, %d\n", _min, _max); + + THFQ_SetParam((THFQ_Param*)¶ms); + } + + cThfqResult* face_check_quality(const int chan, const cIMAGE *img, const cFacePos &pos){ + if(chan < 0 || !img){ + printf("face check quality error, image or pos null\n"); + return NULL; + } + + cThfqResult *pResult = (cThfqResult*)malloc(sizeof(cThfqResult)); + auto ret = THFQ_Check(chan, (BYTE*)(img->data), 3, img->width, img->height, (THFI_FacePos*)(&pos), (THFQ_Result*)pResult); + return pResult; + } + + int face_check_quality_brightness(const int chan, const cIMAGE *img, const cFacePos &pos, int *nBrightness){ + if(!img){ + printf("face check quality error, image or pos null\n"); + return -1; + } + + auto ret = THFQ_Check_Brightness(chan, (BYTE*)(img->data), 3, img->width, img->height, (THFI_FacePos*)(&pos), (int*)nBrightness); + return ret; + } + + int face_check_quality_occlusion(const int chan, const cIMAGE *img, const cFacePos &pos, int *nOcclusion){ + if(!img){ + printf("face check quality error, image or pos null\n"); + return -1; + } + + auto ret = THFQ_Check_Occlusion(chan, (BYTE*)(img->data), 3, img->width, img->height, (THFI_FacePos*)(&pos), (int*)nOcclusion); + return ret; + } + int face_check_quality_hat(const int chan, const cIMAGE *img, const cFacePos &pos, int *nHat){ + if(!img){ + printf("face check quality error, image or pos null\n"); + return -1; + } + + auto ret = THFQ_Check_Hat(chan, (BYTE*)(img->data), 3, img->width, img->height, (THFI_FacePos*)(&pos), (int*)nHat); + return ret; + } + + int face_check_quality_blur_glass(const int chan, const cIMAGE *img, const cFacePos &pos, int* nBlur,int* nGlasses){ + if(!img){ + printf("face check quality error, image or pos null\n"); + return -1; + } + + auto ret = THFQ_Check_BlurGlasses(chan, (BYTE*)(img->data), 3, img->width, img->height, (THFI_FacePos*)(&pos), (int*)nBlur, (int*)nGlasses); + return ret; + } +} \ No newline at end of file diff --git a/csrc/buz/face/quality.h b/csrc/buz/face/quality.h new file mode 100644 index 0000000..af64a1e --- /dev/null +++ b/csrc/buz/face/quality.h @@ -0,0 +1,20 @@ +#ifndef _c_wrapper_face_quality_h_ +#define _c_wrapper_face_quality_h_ + +#include "../base.hpp" + +struct _cFacePos; +struct _cIMAGE; +struct _cThfqParam; +struct _cThfqResult; + +namespace csdk_wrap{ + int init_face_quality(const int tm); + void set_quality_params(const _cThfqParam* params); + int face_check_quality(const int chan, const cIMAGE *img, const cFacePos &pos, _cThfqResult *pResult); + int face_check_quality_brightness(const int chan, const cIMAGE *img, const cFacePos &pos, int *nBrightness); + int face_check_quality_occlusion(const int chan, const cIMAGE *img, const cFacePos &pos, int *nOcclusion); + int face_check_quality_hat(const int chan, const cIMAGE *img, const cFacePos &pos, int *nHat); + int face_check_quality_blur_glass(const int chan, const cIMAGE *img, const cFacePos &pos, int* nBlur,int* nGlasses); +} +#endif \ No newline at end of file diff --git a/go2c.go b/go2c.go index bef98e0..bddd7ea 100644 --- a/go2c.go +++ b/go2c.go @@ -54,12 +54,23 @@ PFacialData [8192]uint8 NFaceID int64 } +type CThfqParam struct { + Brightness_min int32 //0-100锛屽お鏆楅槇鍊�,寤鸿25.瓒婂皬瓒婂彲鑳芥妸杩囨殫鐨勪汉鑴稿綋浣滄甯镐汉鑴革紝姝ゅ弬鏁颁細褰卞搷THFQ_Result::brightness + Brightness_max int32 //0-100锛屽お浜槇鍊�,寤鸿75.瓒婂ぇ瓒婂彲鑳芥妸鐨勮繃浜汉鑴稿綋浣滄甯镐汉鑴革紝姝ゅ弬鏁颁細褰卞搷THFQ_Result::brightness +} +type CThfqResult struct { + Brightness int32 //浜鸿劯浜害锛屽彧鏈�3绉嶅彲鑳界殑鍊�:[-1->澶殫锛�0->姝e父锛�1->澶寒]锛屼寒搴︾粨鏋滀細鍙椾寒搴﹂槇鍊煎弬鏁癰rightness_min鍜宐rightness_max褰卞搷 + Occlusion int32 //浜鸿劯閬尅搴︼紝鑼冨洿鍊间负0-100,瓒婂ぇ琛ㄧず浜鸿劯閬尅绋嬪害瓒婇珮 + Hat int32 //甯﹀附瀛�,鑼冨洿涓�0-100锛岃秺澶ц〃绀鸿秺鍙兘鏈変僵鎴村附瀛愶紝寤鸿鍒ゅ埆闃堝�间负50 + Blur int32 //浜鸿劯妯$硦搴�,鑼冨洿鍊间负0-100,瓒婂ぇ琛ㄧず鍥惧儚瓒婃ā绯婏紝寤鸿浜鸿劯妯$硦搴﹀垽鍒槇鍊间负70 + Glasses int32 //甯︾溂闀�,鑼冨洿涓�0-100锛岃秺澶ц〃绀鸿秺鍙兘鏈夋埓鐪奸暅锛屽缓璁垽鍒槇鍊间负70 +} + type CObjInfo struct { RcObj CRECT Typ int32 Prob float32 } - //track yolo objs info type CObjTrackInfo struct { ObjInfo CObjInfo diff --git a/gosdk.go b/gosdk.go index f0e6bb4..ae73eb2 100644 --- a/gosdk.go +++ b/gosdk.go @@ -8,7 +8,7 @@ #cgo LDFLAGS: -L/usr/local/cuda/lib64 -L${SRCDIR}/sdk/face/lib/gpu -L${SRCDIR}/sdk/darknet/lib #cgo LDFLAGS: -L${SRCDIR}/sdk/plate/eparking/lib -L${SRCDIR}/sdk/plate/cloud/lib -L${SRCDIR}/sdk/plate/vehicle/lib #cgo LDFLAGS: -Wl,-rpath,${SRCDIR}/sdk/face/lib/gpu:${SRCDIR}/sdk/darknet/lib:${SRCDIR}/sdk/plate/cloud/lib:${SRCDIR}/sdk/plate/vehicle/lib -#cgo LDFLAGS: -ldarknet -lTHFaceImage -lTHFeature -lTHFaceProperty -lTHFaceTracking -lcudart -lcublas -lcurand -lrt -ldl -lpthread -lthplateid -lLPRecognition +#cgo LDFLAGS: -ldarknet -lTHFaceImage -lTHFaceQuality -lTHFeature -lTHFaceProperty -lTHFaceTracking -lcudart -lcublas -lcurand -lrt -ldl -lpthread -lthplateid -lLPRecognition #cgo LDFLAGS: -lVehicleTypeRecognition -lFeatureExtraction #include <stdlib.h> #include "csdk.h" @@ -73,6 +73,18 @@ C.c_api_face_tracker_init(C.int(tm), C.int(gi), C.int(w), C.int(h), C.int(maxFaces), C.int(interval), C.int(sample)) } +// InitFaceQuality init face quality +func InitFaceQuality(tm int) { + + C.c_api_face_quality_init(C.int(tm)) +} + +// SetFaceQualityParams set face quality params +func SetFaceQualityParams(min, max int) { + + C.c_api_set_quality_params(C.int(min), C.int(max)) +} + // ResizeFaceTracker init face tracker func ResizeFaceTracker(ch, w, h int) int { @@ -128,6 +140,92 @@ return b } + +// FaceQuality face check quality +func FaceQuality(fpos CFacePos, img SDKImage, ch int) CThfqResult { + + data := img.Data + w := img.Width + h := img.Height + + pos := (*C.cFacePos)(unsafe.Pointer(&fpos)) + result := C.c_api_face_check_quality(pos, (*C.uchar)(unsafe.Pointer(&data[0])), C.int(w), C.int(h), C.int(ch)) + + return *((*CThfqResult)(unsafe.Pointer(&result))) +} + +// FaceQuality face check quality +func FaceQualityBrightness(fpos CFacePos, img SDKImage, ch int) int { + + data := img.Data + w := img.Width + h := img.Height + + var brightness, ret C.int + pos := (*C.cFacePos)(unsafe.Pointer(&fpos)) + + ret = C.c_api_face_check_quality_brightness(pos, (*C.uchar)(unsafe.Pointer(&data[0])), C.int(w), C.int(h), C.int(ch), &brightness) + if ret == -1 { + return -1 + } + + return int(brightness) +} + +// FaceQuality face check quality +func FaceQualityOcclusion(fpos CFacePos, img SDKImage, ch int) int { + + data := img.Data + w := img.Width + h := img.Height + + var occlusion, ret C.int + pos := (*C.cFacePos)(unsafe.Pointer(&fpos)) + + ret = C.c_api_face_check_quality_occlusion(pos, (*C.uchar)(unsafe.Pointer(&data[0])), C.int(w), C.int(h), C.int(ch), &occlusion) + if ret == -1 { + return -1 + } + + return int(occlusion) +} + +// FaceQuality face check quality +func FaceQualityHat(fpos CFacePos, img SDKImage, ch int) int { + + data := img.Data + w := img.Width + h := img.Height + + var hat, ret C.int + pos := (*C.cFacePos)(unsafe.Pointer(&fpos)) + + ret = C.c_api_face_check_quality_hat(pos, (*C.uchar)(unsafe.Pointer(&data[0])), C.int(w), C.int(h), C.int(ch), &hat) + if ret == -1 { + return -1 + } + + return int(hat) +} + +// FaceQuality face check quality +func FaceQualityBlurGlass(fpos CFacePos, img SDKImage, ch int) (int, int) { + + data := img.Data + w := img.Width + h := img.Height + + var blur, glass, ret C.int + pos := (*C.cFacePos)(unsafe.Pointer(&fpos)) + + ret = C.c_api_face_check_quality_blur_glass(pos, (*C.uchar)(unsafe.Pointer(&data[0])), C.int(w), C.int(h), C.int(ch), &blur, &glass) + if ret == -1 { + return -1, -1 + } + + return int(blur), int(glass) +} + // FaceCompare face compare func FaceCompare(feat1 []byte, feat2 []byte) float32 { res := C.c_api_face_compare((*C.uchar)(unsafe.Pointer(&feat1[0])), (*C.uchar)(unsafe.Pointer(&feat2[0]))) -- Gitblit v1.8.0