美文网首页
基于python、arcface实现人脸检测和人脸识别

基于python、arcface实现人脸检测和人脸识别

作者: workhard_ | 来源:发表于2019-04-04 16:10 被阅读0次

    虹软的人脸识别技术也是很强的,重要的是他免费提供了离线的sdk,还提供了实例,这个是目前几家研究人脸识别的大公司里面少有的。识别能力正常用还是可以的。我这个代码是调用的离线sdk实现的

    from arcsoft import CLibrary, ASVL_COLOR_FORMAT, ASVLOFFSCREEN,c_ubyte_p,FaceInfo
    from arcsoft.utils import BufferInfo, ImageLoader
    from arcsoft.AFD_FSDKLibrary import *
    from ctypes import *
    import traceback
    import cv2
    import time
     
     
    APPID = c_char_p(b'your id')
    FD_SDKKEY = c_char_p(b'your key')
    FD_WORKBUF_SIZE = 20 * 1024 * 1024
    MAX_FACE_NUM = 50
    bUseYUVFile = False
    bUseBGRToEngine = True
     
    def doFaceDetection(hFDEngine, inputImg):   #对图像中的人脸进行定位
        faceInfo = []
     
        pFaceRes = POINTER(AFD_FSDK_FACERES)()
        ret = AFD_FSDK_StillImageFaceDetection(hFDEngine, byref(inputImg), byref(pFaceRes))
    #ret 为0
     
        if ret != 0:
            print(u'AFD_FSDK_StillImageFaceDetection 0x{0:x}'.format(ret))
            return faceInfo
        faceRes = pFaceRes.contents
        print('******')
     
        facecont=faceRes.nFace  #faceRes 是一个对象所以 输出会是一个地址值 而他的一个属性nface是表示的是人脸的个数
        print('%d 个人脸' %facecont)
     
     
        if faceRes.nFace > 0:
            for i in range(0, faceRes.nFace):
                rect = faceRes.rcFace[i]
                orient = faceRes.lfaceOrient[i]
                faceInfo.append(FaceInfo(rect.left,rect.top,rect.right,rect.bottom,orient))
     
     
        return faceInfo
     
    def loadImage(filePath):
     
        inputImg = ASVLOFFSCREEN()
     
        if bUseBGRToEngine:  #true
            bufferInfo = ImageLoader.getBGRFromFile(filePath)
            inputImg.u32PixelArrayFormat = ASVL_COLOR_FORMAT.ASVL_PAF_RGB24_B8G8R8
            inputImg.i32Width = bufferInfo.width
            inputImg.i32Height = bufferInfo.height
            inputImg.pi32Pitch[0] = bufferInfo.width*3
            inputImg.ppu8Plane[0] = cast(bufferInfo.buffer, c_ubyte_p)
            inputImg.ppu8Plane[1] = cast(0, c_ubyte_p)
            inputImg.ppu8Plane[2] = cast(0, c_ubyte_p)
            inputImg.ppu8Plane[3] = cast(0, c_ubyte_p)
        else:
            bufferInfo = ImageLoader.getI420FromFile(filePath)
            inputImg.u32PixelArrayFormat = ASVL_COLOR_FORMAT.ASVL_PAF_I420
            inputImg.i32Width = bufferInfo.width
            inputImg.i32Height = bufferInfo.height
            inputImg.pi32Pitch[0] = inputImg.i32Width
            inputImg.pi32Pitch[1] = inputImg.i32Width // 2
            inputImg.pi32Pitch[2] = inputImg.i32Width // 2
            inputImg.ppu8Plane[0] = cast(bufferInfo.buffer, c_ubyte_p)
            inputImg.ppu8Plane[1] = cast(addressof(inputImg.ppu8Plane[0].contents) + (inputImg.pi32Pitch[0] * inputImg.i32Height), c_ubyte_p)
            inputImg.ppu8Plane[2] = cast(addressof(inputImg.ppu8Plane[1].contents) + (inputImg.pi32Pitch[1] * inputImg.i32Height // 2), c_ubyte_p)
            inputImg.ppu8Plane[3] = cast(0, c_ubyte_p)
        inputImg.gc_ppu8Plane0 = bufferInfo.buffer
     
        return inputImg
     
     
    if __name__ == u'__main__':
        t=time.time()
        print(u'#####################################################')
     
        # init Engine
        pFDWorkMem = CLibrary.malloc(c_size_t(FD_WORKBUF_SIZE))
        hFDEngine = c_void_p()
        ret = AFD_FSDK_InitialFaceEngine(APPID, FD_SDKKEY, pFDWorkMem, c_int32(FD_WORKBUF_SIZE), byref(hFDEngine), AFD_FSDK_OPF_0_HIGHER_EXT, 32, MAX_FACE_NUM)
        #ret 为0
        if ret != 0:
            CLibrary.free(pFDWorkMem)
            print(u'AFD_FSDK_InitialFaceEngine ret 0x{:x}'.format(ret))
            exit(0)
    #--------------------------------以上部分两个函数以及主函数的几条语句不变-----------------------------------------------------------
     
        filePath = '001.jpg'
        inputImg = loadImage(filePath)  #调用loadImage函数  返回一种格式(目前还不知道这种格式是什么)
     
        frame=cv2.imread(filePath)
        # do Face Detect
     
        faceInfos = doFaceDetection(hFDEngine, inputImg)  #调用dofaceDetection函数 进行图像处理检测人脸
        #print('faceInfos %s'% faceInfos[0])
     
        for i in range(0, len(faceInfos)):
            rect = faceInfos[i]
            print(u'{} ({} {} {} {}) orient {}'.format(i, rect.left, rect.top, rect.right, rect.bottom, rect.orient))
            cv2.rectangle(frame, (rect.left, rect.top), (rect.right, rect.bottom), (0, 0, 255), 2)
            cropimg=frame[rect.top:rect.bottom,rect.left:rect.right]# 使用opencv裁剪照片  把人脸的照片裁剪下来
            cv2.imwrite('crop-photo/'+str(i)+'.jpg',cropimg)  # 把人脸照片保存下来
     
     
     
     
     
        AFD_FSDK_UninitialFaceEngine(hFDEngine)     # release Engine
        cv2.imshow('tuxiang',frame)
        cv2.waitKey(1)
        print('所用时间为{} '.format(time.time()-t)) #不进行保存图片 0.12s  保存图片0.16s
        time.sleep(1)
     
        CLibrary.free(pFDWorkMem)
        print(u'#####################################################')
    
    

    运行结果


    image

    运行时间0.14800000190734863

    底层是c写的所以运行起来还是比较快的 使用的是离线的sdk配置需要动态链接库fd (官网有)

    对于虹软的这个 我只会用 里面的代码很大一部分都是不懂的,因为那些函数都被封装起来了,定义看不到也看不懂。

    opencv就是用来显示照片以及标框 time用来测时间和暂停

    对于虹软的人脸识别,是使用了另一种动态链接库fr,跟这个类似,代码有些差别,等做出来基于虹软的实时的人脸识别再分享出来。

    相关文章

      网友评论

          本文标题:基于python、arcface实现人脸检测和人脸识别

          本文链接:https://www.haomeiwen.com/subject/zekqiqtx.html