基于seetaFace6.0的人脸识别

本文讲述了开发者在CentOS 7上使用Windows代码移植SeetaFace 6.0进行人脸识别时遇到的问题,重点在于Linux环境下FD构造器崩溃,通过静态变量解决并发问题,并推测是内存访问冲突。文章还讨论了模型加载对性能的影响和优化策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近项目需要用到人脸识别,经同事推荐,决定基于seetaFace6.0进行开发。开发过程还是比较顺利的,特别是在windows上,有编译好的现成的库,还有demo。照着demo做开发基本上就可以了。

问题出在了linux上。在linux上(centos7)上开发时,用了windows下的代码(经过测试验证是可以运行的),结果就是出错了。问题出在seeta::FaceDetector的构造函数的过程中。函数如下:

int getFeature(const char* _imgPath, float feature[])

{

***

seeta::FaceDetecr FD(fd_setting)

***

}

我第一次调用getFeature()是成功的,但是第二次再调用这个函数,在FD的构造的时候,就会crash。

因为项目时间比较紧,所以在没有找到root cause的情况下,暂时使用了静态变量,绕过去。修改函数如下:

int getFeature(const char* _imgPath, float feature[])

{

***

    static bool localInit = false;
    static seeta::FaceDetector *FD;

    if (!localInit)
    {

          FD = new seeta::FaceDetector(fd_setting);

    }

***

}

采用了这种折中的办法后,目前可以连续调用getFeature()。

追加:

经过后期的测试,发现之前第二次调用极有可能是机器的性能跟不上导致的。因为在创建一个FaceRecognizer或者FaceDetector,都会加载一次模型文件(face_dector.csta等),而析构时,则会释放相关资源。在测试的时候,发现,创建对象时,内存和CPU的占有率在短时间内,会有很大的提升。因此怀疑在短时间内,反复的创建和析构,极有可能会导致内存的非法访问。因为后面,我只在初始化的时候,加载模型,创建对象,就没有任何问题了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值