赞
踩
最近项目需要用到人脸识别,经同事推荐,决定基于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的占有率在短时间内,会有很大的提升。因此怀疑在短时间内,反复的创建和析构,极有可能会导致内存的非法访问。因为后面,我只在初始化的时候,加载模型,创建对象,就没有任何问题了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。