# 前言
开发纯go插件的原因是因为目前 Go 生态系统中几乎所有现有的人脸检测解决方案都是纯粹绑定到一些 C/C++ 库,如 OpenCV 或 dlib,但通过 cgo 调用 C 程序会引入巨大的延迟,并在性能方面产生显著的权衡。此外,在许多情况下,在各种平台上安装 OpenCV 是很麻烦的。使用纯Go开发的插件不仅在开发时方便,在项目部署和项目维护也能省很多时间精力。
本插件为了解决上述挑战而设计开发的。首先,它完全基于纯Go语言实现,这意味着用户无需担心跨平台移植性问题,可以轻松地将项目部署到任何支持Go语言的环境中。其次,本插件内置了多种先进算法,能够在保证高精度的同时达到快速响应的效果,非常适合应用于实时性要求较高的场景中。再者,考虑到易用性,本插件提供了详尽的API文档以及GoFly后台在线体验的示例代码(如下图1和图2),即使是初学者也能快速掌握其使用方法。最后,本插件拥有活跃的社区支持,不断有新功能被加入进来,确保了其长期的生命力和发展潜力。总之,无论你是希望提高工作效率的专业开发者还是对新技术充满好奇的学生,本插件都将是您探索人脸识别世界的理想选择,可以作为学术研究和项目开发使用。
![wai_20241128174050.png](https://static.golangjob.cn/241129/3269dd645172b135170162a51059ac4b.png)
图1-GoFly后台在线体验人脸检测-外国人(黑人和白人)
![微信截图_20241128173017.png](https://static.golangjob.cn/241129/3e958c9c3f4c5777f8940cf6271612cf.png)
图2-国人面部检测
# 插件主要特性
- 不需要安装OpenCV或任何第三方模块
- 处理速度快
- 无需图像预处理就可以检测
- 无需计算积分图像,图像金字塔,HOG金字塔或任何其他类似的数据结构
- 人脸检测基于二进制文件树结构中编码的像素强度比较
- 快速检测平面内旋转面
- 甚至可以通过眼镜检测到人脸
- 瞳孔/眼睛定位
- 面部标志点检测
# 插件使用场景预设
- 识别用户上传的图片是不是头像
- 根据返回的瞳孔/眼睛定位判断是否睡觉(疲劳驾驶)
- 根据面部特征点可以判断脸上是否佩戴口罩
- 综合检测数据可以用于上机考试中考生是否离开摄像头、专注于考试(防止作弊)等动作
其他更多使用场景大家可根据插件返回的数据和返回标记好的图片做相应功能,如:把标记出的人脸截下来做相似性比较、对比识别出的面部特征的人脸进行补光美白的操作。
# 插件简介
插件基本功能有人脸检测、瞳孔定位及面部标志点识别方面功能。插件居于Pigo封装改造,让gofly框架使用者能快速使用人脸识别等功能。
Pigo库凭借其纯Go语言编写的优势,不仅解决了现有解决方案中跨平台移植性差的问题,还通过丰富的代码示例降低了学习门槛,使得开发者能够快速上手并集成到自己的项目中。无论是对于专业开发者还是初学者而言,Pigo都展现出了极高的实用价值与广阔的应用前景。随着技术的不断进步与社区的持续贡献,相信Pigo库将在未来为更多领域带来革命性的变革。
# 插件封装背景
在当今这个数字化时代,人脸识别技术正以前所未有的速度改变着我们的生活。从安全监控到智能解锁,从虚拟现实体验到医疗健康监测,其应用场景广泛且深入。然而,在众多编程语言中,Go语言以其简洁高效的特性受到了越来越多开发者的青睐。但遗憾的是,在Go语言领域内,高质量的人脸识别库却相对稀缺,大多数解决方案都需要依赖于底层的C或C++实现。这不仅增加了跨平台使用的复杂性,也限制了Go语言本身优势的发挥。正是基于这样的背景下,为大家封装这个插件。它完全由Go语言编写而成,无需外部依赖即可实现人脸检测、瞳孔定位及面部特征点识别等功能,极大地丰富了Go语言在图像处理领域的工具箱。
# 检测算法相关论文
- [基于基于像素强度比较的目标检测论文](https://arxiv.org/pdf/1305.4537)
- [使用随机树集成的眼睛瞳孔定位](https://www.sciencedirect.com/science/article/abs/pii/S0031320313003294)
- [面部特征点的快速定位](https://arxiv.org/pdf/1403.6888)
- [Pigo插件官方网站](https://snapcraft.io/pigo)
# 插件开发使用教程
使用插件直接到gofly快速开发框架后台:开发者工具->代码仓一键安装接口。
## 插件结构
插件核心功能在utils\plugin\pigoface包中,为了方便大家熟悉插件功能,我们在后端做了演示demo,演示前后端代码在app\business\pigoface和src\views\pigoface如果不需演示代码在实际使用中可手动删除(删除不影响使用)。
## 插件目录结构:
```
├─ pigoface # 在business模块下的类名
│ ├─ cascade # 模型数据
│ ├─ core # 插件功能核心代码
│ ├─ testdata # 存放测试图片(生成打包可删除)
│ └─ main.go # 封装对core功能函数调用-业务实践
│
└─ pigoface.go # 插件实例 提供给app下调用
```
# 插件调用
在app业务目录中我们直接通过plugin扩展插件对象对用。代码如下:
``` golang
params := gf.Map{"source": "/utils/plugin/pigoface/testdata/leijun.png", "outImg": true, "markEyes": true, "flploc": true}
data, img, err := plugin.NewPigoface().Main().EntryExe(params)
```
如果ide不会自己import导入plugin 则手动输入:
``` golang
import (
+++
"gofly/utils/plugin"
)
```
## 演示api接口调用示例代码
你开在gofly快速开发框架app下找个地方添加一个测试文件,如创建createcode目录新建pigoface.go,复制下面代码进去即可测试。
``` golang
package createcode
import (
"gofly/utils/gf"
"gofly/utils/plugin"
)
// 人脸检测
type Pigoface struct{}
func init() {
fpath := Pigoface{}
gf.Register(&fpath, fpath)
}
// 人脸识别接口测试
func (api *Pigoface) TestFace(c *gf.GinCtx) {
//参数
param, _ := gf.RequestParam(c)
if val, ok := param["source"]; !ok || gf.String(val) == "" {
gf.Failed().SetMsg("参数source不能为空").Regin(c)
return
}
params := gf.Map{"source": param["source"], "outImg": true, "markEyes": true, "flploc": true}
data, img, err := plugin.NewPigoface().Main().EntryExe(params)
if err != nil {
gf.Failed().SetMsg(err.Error()).Regin(c)
return
}
gf.Success().SetMsg("人脸识别接口测试,导出图片地址:" + img).SetData(data).Regin(c)
}
```
# 插件开发资料
插件代码详情:[插件代码下及介绍](https://goflys.cn/codedetail?id=66)
插件开发文档:[人脸检测、瞳孔/眼睛定位与面部标志点检测插件开发文档](https://doc.goflys.cn/docview?id=44)
# 总结
通过本插件使用,我们不仅了解了Go语言写的Pigo库在人脸检测、瞳孔定位及面部标志点识别方面的强大功能,还深入探讨了其背后的实现原理与应用场景。Pigo库凭借其纯Go语言编写的优势,不仅解决了现有解决方案中跨平台移植性差的问题,还通过丰富的代码示例降低了学习门槛,使得开发者能够快速上手并集成到自己的项目中。无论是对于专业开发者还是初学者而言,Pigo都展现出了极高的实用价值与广阔的应用前景。随着技术的不断进步与社区的持续贡献,相信Pigo库将在未来为更多领域带来革命性的变革。
有疑问加站长微信联系(非本文作者)