faceengine

package module
v4.0.4 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 16, 2021 License: MIT Imports: 2 Imported by: 2

README

虹软人脸检测SDK Go语言版

LICENSE Supported platform Build Status GoDoc

一、项目简介

由于公司是虹软的重度用户,出于工作需要和个人兴趣,寻思着用golang封装一下C++的SDK,利用golang的跨平台特性达到跨平台的效果(当然前提是SDK支持的平台)

目前支持的SDK版本有:v2.x v3.x v4.0.0

二、编译环境与运行环境的准备

1. 安装go版本SDK

推荐使用go module的方式进行安装(需要哪个版本修改版本号即可):

go get -u -d github.com/windosx/face-engine/v4

2. 安装gcc环境

Linux下可以通过对应的包管理器进行安装,Windows下根据32/64位系统进行选择安装MinGW或者MinGW-w64

3. 运行环境

  • Linux:将libarcsoft_face.solibarcsoft_face_engine.so放入/usr/lib64目录下
  • Windows:将libarcsoft_face.dlllibarcsoft_face_engine.dll放入MinGW安装目录下的lib目录中,同时需要将这两个文件放入%WINDIR%或者%WINDIR/System32%目录下

三、代码结构说明

├─examples
│  └─example1.go
├─include
│  ├─amcomdef.h
│  └─arcsoft_face_sdk.h
│  └─asvloffscreen.h
│  └─merror.h
├─util
│  └─image_util.go
├─go.mod
├─engine.go
├─mask.jpg
├─test.jpg
examples目录中是示例代码
include是SDK的头文件
util下的image_util.go是使用golang原生API处理图片的工具
engine.go是封装的SDK
两张JPEG格式的图片是给示例代码用的

四、代码调用示例

package main

import (
	"fmt"

	. "github.com/windosx/face-engine/v4"
	"github.com/windosx/face-engine/v4/util"
)

// 获取处理好的图片信息
var imageInfo = util.GetResizedImageInfo("./mask.jpg")

func main() {
	// 激活SDK
	if err := OnlineActivation("YourAppID", "YourSDKKey", "YourActiveCode"); err != nil {
		fmt.Printf("%#v\n", err)
		return
	}
	// 初始化引擎
	engine, err := NewFaceEngine(DetectModeImage,
		OrientPriority0,
		10, // 4.0最大支持10个人脸
		EnableFaceDetect|EnableFaceRecognition|EnableFace3DAngle|EnableLiveness|EnableIRLiveness|EnableAge|EnableGender|EnableMaskDetect|EnableFaceLandMark)
	if err != nil {
		fmt.Printf("%#v\n", err)
		return
	}
	deviceInfo, err := GetActiveDeviceInfo()
	if err != nil {
		fmt.Printf("%#v\n", err)
	}
	fmt.Printf("设备信息:%s\n", deviceInfo)
	// 检测人脸
	info, err := engine.DetectFaces(imageInfo.Width, imageInfo.Height, ColorFormatBGR24, imageInfo.DataUInt8)
	if err != nil {
		fmt.Printf("%#v\n", err)
		return
	}
	// 处理人脸数据
	if err = engine.Process(imageInfo.Width, imageInfo.Height, ColorFormatBGR24, imageInfo.DataUInt8, info, EnableAge|EnableGender|EnableFace3DAngle|EnableLiveness|EnableMaskDetect|EnableFaceLandMark); err != nil {
		fmt.Printf("%#v\n", err)
		return
	}
	// 获取年龄
	ageInfo, err := engine.GetAge()
	if err != nil {
		fmt.Printf("%#v\n", err)
		return
	}
	fmt.Printf("ageInfo: %v\n", ageInfo)
	// 获取口罩信息
	maskInfo, err := engine.GetMask()
	if err != nil {
		fmt.Printf("%#v\n", err)
		return
	}
	fmt.Printf("口罩信息:%#v\n", maskInfo)
	// 获取额头点位
	landMark, err := engine.GetFaceLandMarkInfo()
	if err != nil {
		fmt.Printf("%#v\n", err)
		return
	}
	fmt.Printf("额头点位:%#v\n", landMark)
	// 销毁引擎
	if err = engine.Destroy(); err != nil {
		fmt.Printf("%#v\n", err)
		return
	}
}

五、注意事项

  1. 通过FaceFeatureExtractFaceFeatureExtractEx方法提取到人脸特征信息,使用完毕后应调用其Release()方法释放内存,避免导致内存溢出,这是由于cgo的一些局限性导致的。

六、更多示例代码

(如果您想分享自己的示例,欢迎PR)

七、开源说明

本项目使用MIT协议,如果对您有帮助,请点亮star支持一下 :)

Documentation

Index

Constants

View Source
const (
	// DetectModeVideo 视频模式
	DetectModeVideo = C.ASF_DETECT_MODE_VIDEO
	// DetectModeImage 图片模式
	DetectModeImage = C.ASF_DETECT_MODE_IMAGE
	// OrientPriority0 不旋转
	OrientPriority0 = C.ASF_OP_0_ONLY
	// OrientPriority90 旋转90度
	OrientPriority90 = C.ASF_OP_90_ONLY
	// OrientPriority270 旋转270度
	OrientPriority270 = C.ASF_OP_270_ONLY
	// OrientPriority180 旋转180度
	OrientPriority180 = C.ASF_OP_180_ONLY
	// OrientPriorityAllOut 角度不限
	OrientPriorityAllOut = C.ASF_OP_ALL_OUT
	// EnableNone 不开启任何功能
	EnableNone = C.ASF_NONE
	// EnableFaceDetect 开启人脸检测
	EnableFaceDetect = C.ASF_FACE_DETECT
	// EnableFaceRecognition 开启人脸识别
	EnableFaceRecognition = C.ASF_FACERECOGNITION
	// EnableAge 开启年龄检测
	EnableAge = C.ASF_AGE
	// EnableGender 开启性别检测
	EnableGender = C.ASF_GENDER
	// EnableFace3DAngle 开启人脸3D角度检测
	EnableFace3DAngle = C.ASF_FACE3DANGLE
	// EnableLiveness 开启活体检测
	EnableLiveness = C.ASF_LIVENESS
	// EnableIRLiveness 开启IR活体检测
	EnableIRLiveness = C.ASF_IR_LIVENESS
	// EnableFaceLandMark 开启人脸特征点检测
	EnableFaceLandMark = C.ASF_FACELANDMARK
	// EnableImageQuality 开启单人脸图片质量检测
	EnableImageQuality = C.ASF_IMAGEQUALITY
	// EnableFaceShelter 开启遮挡检测
	EnableFaceShelter = C.ASF_FACESHELTER
	// EnableMaskDetect 开启口罩检测
	EnableMaskDetect = C.ASF_MASKDETECT
	// EnableUpdateFaceData 开启人脸数据更新
	EnableUpdateFaceData = C.ASF_UPDATE_FACEDATA
	// ColorFormatBGR24 BGR24格式
	ColorFormatBGR24 = C.ASVL_PAF_RGB24_B8G8R8
	// ColorFormatNV12 NV12格式
	ColorFormatNV12 = C.ASVL_PAF_NV12
	// ColorFormatNV21 NV21格式
	ColorFormatNV21 = C.ASVL_PAF_NV21
	// ColorFormatI420 I420格式
	ColorFormatI420 = C.ASVL_PAF_I420
	// ColorFormatYUYV YUYV格式
	ColorFormatYUYV = C.ASVL_PAF_YUYV
	// RecognitionPhoto 识别照片
	RecognitionPhoto = C.ASF_RECOGNITION
	// RegisterPhoto 注册照片
	RegisterPhoto = C.ASF_REGISTER
)

Variables

This section is empty.

Functions

func GetActiveDeviceInfo

func GetActiveDeviceInfo() ([]byte, error)

GetActiveDeviceInfo 采集当前设备信息(可离线)

func OfflineActivation

func OfflineActivation(filePath string) (err error)

OfflineActivation 离线激活接口

func OnlineActivation

func OnlineActivation(appID, sdkKey, activeKey string) (err error)

OnlineActivation 在线激活接口

Types

type ActiveFileInfo

type ActiveFileInfo struct {
	StartTime   string //开始时间
	EndTime     string //截止时间
	ActiveKey   string //激活码
	Platform    string //平台
	SdkType     string //sdk类型
	AppID       string //APPID
	SdkKey      string //SDKKEY
	SdkVersion  string //SDK版本号
	FileVersion string //激活文件版本号
}

ActiveFileInfo 激活文件信息结构体

func GetActiveFileInfo

func GetActiveFileInfo() (ActiveFileInfo, error)

GetActiveFileInfo 获取激活文件信息接口

type AgeInfo

type AgeInfo struct {
	AgeArray []int32 // "0" 代表不确定,大于0的数值代表检测出来的年龄结果
	Num      int32   // 检测的人脸个数
}

AgeInfo 年龄信息结构体

type EngineError

type EngineError struct {
	Code int
	Text string
}

EngineError SDK错误码

func (EngineError) Error

func (err EngineError) Error() string

实现Error接口

type Face3DAngle

type Face3DAngle struct {
	Roll   []float32
	Yaw    []float32
	Pitch  []float32
	Status []int32 // 0: 正常,其他数值:出错
	Num    int32
}

Face3DAngle 人脸3D角度信息结构体

type FaceEngine

type FaceEngine struct {
	// contains filtered or unexported fields
}

FaceEngine 引擎结构体

func NewFaceEngine

func NewFaceEngine(
	detectMode C.ASF_DetectMode,
	orientPriority C.ASF_OrientPriority,
	maxFaceNum C.MInt32,
	combinedMask C.MInt32,
) (*FaceEngine, error)

NewFaceEngine 创建一个新的引擎实例

如果调用初始化函数失败则返回一个错误

func (*FaceEngine) Destroy

func (engine *FaceEngine) Destroy() (err error)

Destroy 销毁引擎

func (*FaceEngine) DetectFaces

func (engine *FaceEngine) DetectFaces(
	width int,
	height int,
	format C.MInt32,
	imgData []byte,
) (faceInfo MultiFaceInfo, err error)

DetectFaces 人脸检测,目前不支持IR图像数据检测

func (*FaceEngine) DetectFacesEx

func (engine *FaceEngine) DetectFacesEx(imageData ImageData) (faceInfo MultiFaceInfo, err error)

DetectFacesEx 检测人脸信息

该接口与 DetectFaces 功能一致,但采用结构体的形式传入图像数据,对更高精度的图像兼容性更好。

func (*FaceEngine) FaceFeatureCompare

func (engine *FaceEngine) FaceFeatureCompare(feature1, feature2 FaceFeature) (confidenceLevel float32, err error)

FaceFeatureCompare 人脸特征比对

func (*FaceEngine) FaceFeatureExtract

func (engine *FaceEngine) FaceFeatureExtract(
	width int,
	height int,
	format C.MInt32,
	imgData []byte,
	faceInfo SingleFaceInfo,
	registerOrNot int,
	mask int,
) (faceFeature FaceFeature, err error)

FaceFeatureExtract 单人脸特征提取

func (*FaceEngine) FaceFeatureExtractEx

func (engine *FaceEngine) FaceFeatureExtractEx(
	imageData ImageData,
	faceInfo SingleFaceInfo,
	registerOrNot int,
	mask int,
) (feature FaceFeature, err error)

FaceFeatureExtractEx 单人脸特征提取

该接口与 ASFFaceFeatureExtract 功能一致,但采用结构体的形式传入图像数据,对更高精度的图像兼容性更好

func (*FaceEngine) GetAge

func (engine *FaceEngine) GetAge() (AgeInfo, error)

GetAge 获取年龄信息

func (*FaceEngine) GetFace3DAngle

func (engine *FaceEngine) GetFace3DAngle() (Face3DAngle, error)

GetFace3DAngle 获取3D角度信息

func (*FaceEngine) GetFaceLandMarkInfo

func (engine *FaceEngine) GetFaceLandMarkInfo() (landMarkInfo LandMarkInfo, err error)

GetFaceLandMarkInfo 获取额头区域位置

func (*FaceEngine) GetGender

func (engine *FaceEngine) GetGender() (GenderInfo, error)

GetGender 获取性别信息

func (*FaceEngine) GetLivenessScore

func (engine *FaceEngine) GetLivenessScore() (LivenessInfo, error)

GetLivenessScore 获取RGB活体结果

func (*FaceEngine) GetLivenessScoreIR

func (engine *FaceEngine) GetLivenessScoreIR() (LivenessInfo, error)

GetLivenessScoreIR 获取IR活体结果

func (*FaceEngine) GetMask

func (engine *FaceEngine) GetMask() (maskInfo MaskInfo, err error)

GetMask 获取口罩信息

func (*FaceEngine) GetVersion

func (engine *FaceEngine) GetVersion() Version

GetVersion 获取版本信息

func (*FaceEngine) ImageQualityDetect

func (engine *FaceEngine) ImageQualityDetect(
	width int,
	height int,
	format C.MInt32,
	imgData []byte,
	faceInfo SingleFaceInfo,
	isMask int,
) (confidenceLevel float32, err error)

ImageQualityDetect 单人脸图片质量检测

func (*FaceEngine) Process

func (engine *FaceEngine) Process(
	width int,
	height int,
	format C.MInt32,
	imgData []byte,
	detectedFaces MultiFaceInfo,
	combinedMask C.MInt32,
) error

Process 年龄/性别/人脸3D角度(该接口仅支持RGB图像),最多支持4张人脸信息检测,超过部分返回未知 RGB活体仅支持单人脸检测,该接口不支持检测IR活体

func (*FaceEngine) ProcessEx

func (engine *FaceEngine) ProcessEx(imageData ImageData, faceInfo MultiFaceInfo, combinedMask C.MInt32) error

ProcessEx 人脸信息检测(年龄/性别/人脸3D角度),最多支持4张人脸信息检测,超过部分返回未知(活体仅支持单张人脸检测,超出返回未知),接口仅支持可见光图像检测

该接口与 Process 功能一致,但采用结构体的形式传入图像数据,对更高精度的图像兼容性更好

func (*FaceEngine) ProcessExIR

func (engine *FaceEngine) ProcessExIR(
	imageData ImageData,
	faceInfo MultiFaceInfo,
	combinedMask C.MInt32,
) (err error)

ProcessExIR 该接口目前仅支持单人脸IR活体检测(不支持年龄、性别、3D角度的检测),默认取第一张人脸

该接口与 ProcessIR 功能一致,但采用结构体的形式传入图像数据,对更高精度的图像兼容性更好

func (*FaceEngine) ProcessIR

func (engine *FaceEngine) ProcessIR(
	width int,
	height int,
	format C.MInt32,
	imgData []byte,
	detectedFaces MultiFaceInfo,
	combinedMask C.MInt32,
) (err error)

ProcessIR 该接口目前仅支持单人脸IR活体检测(不支持年龄、性别、3D角度的检测),默认取第一张人脸

func (*FaceEngine) SetFaceShelterParam

func (engine *FaceEngine) SetFaceShelterParam(shelterThreshhold float32) (err error)

SetFaceShelterParam 设置遮挡算法检测的阈值

func (*FaceEngine) SetLivenessParam

func (engine *FaceEngine) SetLivenessParam(threshold LivenessThreshold) error

SetLivenessParam 设置活体置信度

取值范围[0-1]内部默认数值RGB-0.75,IR-0.7, 用户可以根据实际需求,设置不同的阈值

func (*FaceEngine) UpdateFaceData

func (engine *FaceEngine) UpdateFaceData(
	width int,
	height int,
	format C.MInt32,
	imgData []byte,
	faceInfo MultiFaceInfo,
) (err error)

UpdateFaceData 更新人脸数据

type FaceFeature

type FaceFeature struct {
	Feature     []byte // 人脸特征信息
	FeatureSize int32  // 人脸特征信息长度
	// contains filtered or unexported fields
}

FaceFeature 人脸特征结构体

func ReadFaceFeatureFromBytes

func ReadFaceFeatureFromBytes(bytes []byte) (feature FaceFeature)

ReadFaceFeatureFromBytes 将字节数据转为人脸特征数据

func (*FaceFeature) Release

func (feature *FaceFeature) Release()

Release 释放内存

type FaceLandMark

type FaceLandMark struct {
	PosX float32
	PosY float32
}

FaceLandMark 特征点信息结构体

type GenderInfo

type GenderInfo struct {
	GenderArray []int32 // "0" 表示 男性, "1" 表示 女性, "-1" 表示不确定
	Num         int32   // 检测的人脸个数
}

GenderInfo 性别信息结构体

type ImageData

type ImageData struct {
	PixelArrayFormat C.MUInt32
	Width            int
	Height           int
	ImageData        [4][]uint8
	WidthStep        [4]int
}

ImageData 对应ASVLOFFSCREEN结构体

type LandMarkInfo

type LandMarkInfo struct {
	Point []FaceLandMark
	Num   int32
}

LandMarkInfo 额头区域点位

type LivenessInfo

type LivenessInfo struct {
	IsLive []int32 // 0:非真人 1:真人 -1:不确定 -2:传入人脸数>1
	Num    int32
}

LivenessInfo 活体信息

type LivenessThreshold

type LivenessThreshold struct {
	ThresholdModelBGR float32
	ThresholdModelIR  float32
}

LivenessThreshold 活体置信度结构体

type MaskInfo

type MaskInfo struct {
	MaskArray []int32 // 0代表没有带口罩 1代表带口罩 -1表示不确定
	Num       int32   // 检测的人脸个数
}

MaskInfo 口罩信息结构体

type MultiFaceInfo

type MultiFaceInfo struct {
	FaceRect         []Rect               // 人脸框信息
	FaceOrient       []int32              // 输入图像的角度
	FaceNum          int32                // 检测到的人脸个数
	FaceID           []int32              // face ID,IMAGE模式下不返回FaceID
	WearGlasses      float32              // 带眼镜置信度[0-1],推荐阈值0.5
	LeftEyeClosed    int32                // 左眼状态 0 未闭眼 1 闭眼
	RightEyeClosed   int32                // 右眼状态 0 未闭眼 1 闭眼
	FaceDataInfoList []C.ASF_FaceDataInfo // 多张人脸信息
	// contains filtered or unexported fields
}

MultiFaceInfo 多人脸信息结构体

type Rect

type Rect struct {
	Left   int32
	Top    int32
	Right  int32
	Bottom int32
}

Rect 人脸坐标结构体

type SingleFaceInfo

type SingleFaceInfo struct {
	FaceRect   Rect  // 人脸框信息
	FaceOrient int32 // 输入图像的角度,可以参考 ArcFaceCompare_OrientCode
	DataInfo   C.ASF_FaceDataInfo
}

SingleFaceInfo 单人脸信息结构体

func GetSingleFaceInfo

func GetSingleFaceInfo(multiFaceInfo MultiFaceInfo) (faceInfo []SingleFaceInfo)

GetSingleFaceInfo 从多人脸结构体中提取单人脸信息

type Version

type Version struct {
	Version   string // 版本号
	BuildDate string // 构建日期
	CopyRight string // Copyright
}

Version 版本信息结构体

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL