精华内容
下载资源
问答
  • 最近因为需要实现了一下人脸识别,实现了这个功能之后,就想着把踩过的坑总结出来。参考过许多博客,发现主要有两种形式,一种是基于 ...我这里实现的功能主要是启动Camera之后,当照相机中有人脸出现时,Camera界面动

           最近因为需要实现了一下人脸识别,实现了这个功能之后,就想着把踩过的坑总结出来。参考过许多博客,发现主要有两种形式,一种是基于 android SDK 实现人脸检测,而另一种是利用openCvManager来实现。这两种方式都实现了动态的人脸检测,当然网上也有许多关于检测静态图片中的人脸的文章。这里我就不详细介绍了。我这里实现的功能主要是启动Camera之后,当照相机中有人脸出现时,Camera界面动态的绘制出人脸矩形框,获取到人脸框之后,Camera拍照,获取到图片,将图片传送到后台来验证人脸。这里需要区分一下人脸检测和人脸识别。人脸检测是检测camera中是否有人脸存在,如果存在的话会绘制出矩形框将人脸标志出来,而人脸识别则是根据两张人脸验证是否是一个人的概念。
            先大概讲一下第一种实现动态人脸检测的方式.这是Camera基于Google自带的FaceDetectionListener进行人脸检测,当Camera拍摄到人脸后,会将人脸矩形绘制出来。这个具体大家可以参考这位大神的博客,http://blog.csdn.net/yanzi1225627/article/details/38098729/
    他已经讲的很细致了。但感觉google自带检测算法在测试的时候检测人脸比较慢,而且有些机型不支持这种人脸检测接口,不过他的文章还是很具有参考价值的。那么我就在这里就具体介绍一下使用openCv实现动态人脸检测的具体方法。

           先提供下opencv下载地址http://opencv.org/ 我下载的是最新的3.2版本,本来用的是2.4,但会发现比较卡顿。公司一直使用的eclipse,而且demo中的工程也是eclipse项目,所以直接使用eclipse来进行调试。当然网上也有许多在As中使用的教程,大家可以去多找找。
    在我们下载sdk后解压后,进入到samples目录下会见到如下结构:

    SouthEast
           我们直接运行example-face-detection.apk后,会发现提示要安装opencv-manager,在sdk/apk目录下,我们会发现不同种类的opencvmanager,我们根据不同的机型选择对应的manager安装,我选择的是OpenCV_3.2.0_Manager_3.20_armeabi-v7a.apk这个包,安装之后,我们打开应用后就可以发现摄像头进行动态的人脸检测了。 运行完官方的apk后,我们开始自己进行调试。我们导入OpenCV-android-sdk/samples的face-detection工程,然后新建个工程作为Library,在我们的library中导入OpenCV-android-sdk/java中相关类和资源文件,
    SouthEast
           然后对face-detection进行关联,这时候我的工程仍然报错,发现下面的错误:
    SouthEast
           没有找到ndk-build.cmd.原来是没有配置ndk-build路径,配置完NDKROOT即可。这里就是右键properties-C/C++build,如下图:
    SouthEast
           这里的ndk我下载的是android-ndk-r9d,在下载完毕之后我们直接解压就行,这里的NDKROOT就是我们解压后的ndk的路径。附带上Ndk的下载路径: http://dl.google.com/android/ndk/android-ndk-r9d-windows-x86.zip        之后又碰见如下错误:
    SouthEast
           这是因为在jni/Android.mk中没配置opencv的Opencv.mk的根路径,同理和ndk配置方式一样,我们配置完我们自己的${OPENCV_ANDROID_SDK}就行了
    SouthEast
    SouthEast
           至此,我们运行官方的demo,可直接就运行出来,但我们发现总需要安装opencvmanager,很明显,有时候这是不合适的。所以接下来我介绍下不需要安装opencvmanager的方法,很简单,分下面4步: 1.修改Android.mk前几行 为下列形式, ``` include $(CLEAR_VARS) OPENCV_CAMERA_MODULES:=on OPENCV_INSTALL_MODULES:=on OPENCV_LIB_TYPE:=SHARED ``` 2.打开FdActivity.java文件,在其中添加一个静态初始化块代码, ``` static { Log.i(TAG, "OpenCV library load!"); if (!OpenCVLoader.initDebug()) { Log.i(TAG, "OpenCV load not successfully"); } else { System.loadLibrary("detection_based_tracker");// load other libraries } } ``` 它是用来加载OpenCV_java库的,如果没有加回报类似于native method not found的错误 3.注释掉onResume中的initAsync那句,让程序不去访问OpenCV Manager。 ``` @Override public void onResume() { super.onResume(); if (!OpenCVLoader.initDebug()) { Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization"); // OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback); } else { Log.d(TAG, "OpenCV library found inside package. Using it!"); mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS); } } ``` 4.修改FdActivity.java的OnCreate()方法,从上面的private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this)代码块中拷贝try-catch块放到OnCreate的setContentView()之后。
          try {
                // load cascade file from application resources
                InputStream is = getResources().openRawResource(R.raw.lbpcascade_frontalface);
                File cascadeDir = getDir("cascade", Context.MODE_PRIVATE);
                mCascadeFile = new File(cascadeDir, "lbpcascade_frontalface.xml");
                FileOutputStream os = new FileOutputStream(mCascadeFile);
    
                byte[] buffer = new byte[4096];
                int bytesRead;
                while ((bytesRead = is.read(buffer)) != -1) {
                    os.write(buffer, 0, bytesRead);
                }
                is.close();
                os.close();
    
                mJavaDetector = new CascadeClassifier(mCascadeFile.getAbsolutePath());
                if (mJavaDetector.empty()) {
                    Log.e(TAG, "Failed to load cascade classifier");
                    mJavaDetector = null;
                } else
                    Log.i(TAG, "Loaded cascade classifier from " + mCascadeFile.getAbsolutePath());
    
                mNativeDetector = new DetectionBasedTracker(mCascadeFile.getAbsolutePath(), 0);
    
                cascadeDir.delete();
    
            } catch (IOException e) {
                e.printStackTrace();
                Log.e(TAG, "Failed to load cascade. Exception thrown: " + e);
            }
    

    之后运行,即可发现不用在依赖OpenCvManager,程序也可以直接运行了。
    这里上述进行的主要是camera动态监测出人脸,其实这基本上已经算完成了。现在我们集成到我们自己的工程中,通过利用百度的人脸识别,来判断人脸是否一致,从而实现人脸识别。

    首先,我们可以在百度AI开放平台上 http://ai.baidu.com/ 创建我们自己的人脸识别应用
    ![这里写图片描述](https://img-blog.csdn.net/20170712160653919? /2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMjg5MzE2MjM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

    创建完后 我们的应用会有一个APPiD和ApI key我们利用这两个属性值可生成access_token具体的调用方式我们可参考
    https://cloud.baidu.com/doc/FACE/Face-API.html生成access_token后,当发送post请求时,附带上这个token即可,我们可以进行人脸识别了。我这里调用的是人脸注册和人脸认证接口,通过认证返回的分数值,我们可判断是否是同一个人。具体请求参数和返回参数,大家可以参考百度人脸识别的API。
    好了,现在开始创建我们的应用。在创建完工程后,我们把face-detection中的FdActivity和DetectionBasedTracker导入到我们自己的工程中,这之中的FdActivity相当于相机界面,这里注意不要改动包名,否则可能会出现找不到本地方法的错误。同时,我们要将jni和Lib armead目录复制到我们的目录里,之后我们要利用Eclipse自动编译NDK/JNI。下面简单介绍一下自动编译的方法:

    1.将Android项目转换为C/C++项目,如下图,New -> Other -> C/C++ -> Convert to a C/C++ Project.

    SouthEast
    2. 配置NDK编译路径,Project->Properties,如下图,其中Build-Command中ANDROID_NDK为环境变量中配置的Android-NDK路径;Build-Directory为当前工程目录
    SouthEast
    SouthEast
    3.Project->Properties,CNU C和GNU C++中配置OpenCV的链接库
    SouthEast
    配置完指后,我们需要稍微修改一下我们自己创建的opencvLibrary的内容。因为camera中出现人脸框后需要拍照功能,我们需要简单的修改OpenCvLibrary中的JavaCameraView,在这个类里面我们可以调用camera的takepicture方法。同时通过PictureCallback将我们拍的照片保存到我们指定的路径。 ``` mCamera.takePicture(mShutterCallback, null, mJpegPictureCallback); ShutterCallback mShutterCallback = new ShutterCallback() { public void onShutter() { } };
    PictureCallback mJpegPictureCallback = new PictureCallback() 
    {
    	public void onPictureTaken(byte[] data, Camera camera) {
    		Log.d("hr", "拍照回调");
    		Bitmap b = null;
    		if (null != data) {
    			b = BitmapFactory.decodeByteArray(data, 0, data.length);
    			mCamera.stopPreview();
    		}
    		if (null != b) {
    			Bitmap rotaBitmap = ImageUtil.getRotateBitmap(b, 00.0f);
    			boolean bitmap = FileUtil.saveBitmap(rotaBitmap,idTag);
    			if (bitmap) {
    				if (handler!=null) {
    					handler.sendEmptyMessage(2000);
    				}		
    			}
    		}
    		mCamera.startPreview();
    	}};
    
      <font size=2>在FdActivity的 onCameraFramed中 facesArray 得长度 即是人脸显示的数目</font>
    

    Rect[] facesArray = faces.toArray();
    for (int i = 0; i < facesArray.length; i++)
    Imgproc.rectangle(mRgba, facesArray[i].tl(), facesArray[i].br(), FACE_RECT_COLOR, 3);

     <font size=2>当相机捕捉到人脸后,我们可以通过handle自动拍照也可以手动拍照,这就看具体的需求了。保存图片之后,我们调用百度的接口,根据返回值来判断人体的相似度。</font>
    
            url = new URL(urlPath);
    		Bitmap bmp = FileUtil.getValidateBitmap();
    		ByteArrayOutputStream baos = new ByteArrayOutputStream();
    		bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);
    		try {
    			baos.close();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		byte[] buffer = baos.toByteArray();
    		// 将图片的字节流数据加密成base64字符输出
    		String photo = Base64.encodeToString(buffer, 0, buffer.length,Base64.DEFAULT);
    		HashMap<String, String> map=new HashMap<String, String>();
    		map.put("uid", uid);
    		map.put("group_id", groupid);
    		map.put("image", photo);
    		map.put("ext_fields", "faceliveness");
    		String str=HttpClientUtil.doPost(urlPath, map);
    

    ``
    获取验证和注册的方式代码基本上一样,就是发送普通的网络请求,我们根据返回值可以判断出人脸是否一致。至此整个人脸验证流程就算结束了。我这里就光展示一下动态检测人脸的效果
    这里写图片描述
    当然还有认证的流程,因为感觉难点主要在动态识别人脸这块,所以调用百度的接口,实现人脸识别的过程就不再详细介绍了。当然 ,还有一些小问题,当竖屏时,检测不准确或者Camera界面没有全屏, 或者是前置摄像头的开启。大家有兴趣的话可以去研究一下。
    最后附带上我的demo地址,http://download.csdn.net/download/qq_28931623/10167057
    Github地址: https://github.com/huangruiLearn/FaceCheck

    展开全文
  • 人脸检测

    2020-06-11 23:16:17
    人脸检测是人脸识别算法的第一步,人脸识别...人脸检测常用的数据集有FDDB和WIDER FACE, FDDB是一个面部区域数据集,主要研究约束人脸检测问题,一共包含了2845张图片,包含彩色以及灰度图,其中的人脸总数达到51

    人脸检测是人脸识别算法的第一步,人脸识别过程主要分为人脸图像获取、人脸检测、人脸配准、人脸表征以及人脸图像匹配与识别。人脸检测的目标是找出图像中所有的人脸对应的位置,算法的输出是人脸外接矩形(椭圆)在图像中的坐标,可能还包括姿态如倾斜角度等信息。人脸检测在安防监控,人证比对,人机交互,社交和娱乐等方面有很强的应用价值。

    数据集

    人脸检测常用的数据集有FDDB和WIDER FACE, FDDB是一个面部区域数据集,主要研究无约束人脸检测问题,一共包含了2845张图片,包含彩色以及灰度图,其中的人脸总数达到5171个。这些人脸所呈现的状态多样,包括遮挡、罕见姿态、低分辨率以及失焦的情况,并且每个人脸都有其规定的坐标位置。WIDER FACE数据集是人脸检测的一个基准数据集,包含32203图像,以及393,703个人脸,分别在尺度、姿势、标准、表达、装扮和光照等方面有不同的体现。制作者来自于香港中文大学(2016年发布),他们选择了61个事件类别,对于每个类别,随机选择40%,10%,50%作为训练、验证、测试工作。

    AdaBoost框架的人脸检测算法

    在深度学习的人脸检测方法出现之前,AdaBoost框架的人脸检测方法在工业界被广泛使用。AdaBoost框架的基本思想是通过几个简单的弱分类器构建出强分类器,具有代表性的方法为VJ算法(VJ算法使用了5种基本的Haar特征以及基本的级联结构),后人在一段时间中就VJ框架进行改进,有扩展的Haar特征,LBP特征,SIFT特征,HOG特征等代替5种基本的Haar特征,或者是金字塔式级联结构,树形的级联结构代替原来的级联结构,或是链式Boosting方法,嵌套式Boosting方法来改进分类器,提高人脸检测的效率和精度。

    VJ人脸检测器是在2001年提出的,相比于之前的一些早期人脸检测算法,VJ人脸检测器在获得相同或者更好的准确度的同时,速度提升了几十甚至上百倍,在当时的硬件条件下达到了每秒处理15张图像的速度,接近实时速度的25fps。VJ人脸检测器是人脸检测历史上最具有里程碑意义的一个成果之一,奠定了基于AdaBoost的目标检测框架的基础。VJ人脸检测相比于早期的一些算法,在检测速度上提高了很多,归功于三个关键要素:分别是特征的快速计算方法-积分图,分类学习方法-AdaBoost以及级联结构。

    下图是分类器级联进行判断的示意图。通过若干个强分类器级联,如果一个检测窗口通过了第一级分类器的筛选就判断为人脸,然后送到下一级分类器进行判定,从前往后,分类器的复杂程度和计算代价逐渐增大。如果检测窗口通过所有的强分类器,就判断为人脸,否则就是非人脸。VJ人脸检测器通过将AdaBoost构建的强分类器级联进行人脸检测,可以提高检测性能也大幅加快检测速度。
    在这里插入图片描述

    VJ算法有3点缺点,首先是5种基本的Haar-like特征是一种相对简单的特征,其稳定性较低。第二点是VJ算法对于解决正面的人脸效果好,对于人脸的遮挡,姿态,表情等特殊且复杂的情况,处理效果不理想。所以后来又有改进Haar特征的方法,在原来5个Haar特征模板的基础上增加了旋转等方式,对姿态等问题有所改进。第三点是VJ分类器评价一个样本不会基于前几个分类器的表现,鲁棒性差。

    在这里插入图片描述

    深度学习的人脸检测方法

    1. Cascade CNN

    Cascade CNN是传统技术和深度网络相结合的一个代表,他也用到了VJ算法中的级联结构。其包含了多个分类器,这些分类器采用级联结构进行组织,不同的地方在于Cascade CNN采用卷积网络作为每一级的分类器。(VGA图片,14fps on single CPU,100fps on GPU,FDDB上达到85.1%的召回率和87%的准确率)

    Cascade CNN的方法是一个3阶级联,是由3对net和calibration-net的组合构成。他的过程是首先构建多尺度的人脸图像金字塔,12-net使用1212的检测窗口,步长为4密集扫描整幅图像,剔除掉非人脸的检测窗口,将分类得到的人脸检测窗口送入12-calibration-net中调整检测窗口的尺寸和位置。然后通过非极大值抑制的方法合并高度重叠的检测窗口,然后保留下来的候选检测窗口被归一化到24x24的检测窗口作为24-net的输入,24-net进一步剔除非人脸的检测窗口,24-calibration-net矫正检测窗口,在利用非极大值抑制进行窗口合并4848的检测窗口作为48-net的输入,然后48-net过滤检测窗口,然后这一步再利用了非极大值抑制NMS进行窗口合并,送入到48-calibration-net作为最后的输出。示意图如下图所示:
    Haoxiang Li, Zhe Lin, Xiaohui Shen, Jonathan Brandt, Gang Hua. A convolutional neural network cascade for face detection. 2015, computer vision and pattern recognition
    下图的12-net,24-net和48-net三个卷积网络是用于人脸和非人脸的二分类,都是由卷积层,最大池化层和全连接层构成,24-net在12-net的基础上,将24×24的图片缩放到12×12,输入到12-net全连接层,与12-net并联,最后一起输出到24-net全连接层。48-net网格稍微加深,过程和24-net类似。右边的表是这个级联结构在FDDB上的性能统计,平均检测窗口数量以及整体召回率。比如进入12-net输出的平均检测窗口数量为426.9,召回率是93.9%。,最后通过输出的平均检测窗口数量为3.6,召回率是85.1%。
    Haoxiang Li, Zhe Lin, Xiaohui Shen, Jonathan Brandt, Gang Hua. A convolutional neural network cascade for face detection. 2015, computer vision and pattern recognition
    在这里插入图片描述
    下图的12-calibration-net,24-calibration-net和48-calibration-net这三个卷积网络是用于人脸区域的边框矫正的。也都是由卷积层,最大池化层和全连接层构成的,48-calibration-net网络结构稍微深一点,还加了两个归一化层。
    在这里插入图片描述
    下面两部分是窗口的控制坐标调整的公式以及论文中给出的三个偏移变量的几个固定参数,其中Sn是宽高比缩放,Xn是水平平移量,Yn是垂直平移量。(x,y)表示左上点坐标,(w,h)表示宽和高。论文中给了5个宽高比缩放的固定参数,3个水平平移量3个垂直平移量参数所以一共有533=45种模式。
    在这里插入图片描述
    在这里插入图片描述

    2. MTCNN

    MTCNN和Cascade CNN一样也是基于cascade(级联)框架的,MTCNN总体来说分为三个部分:PNet、RNet和ONet。MTCNN将人脸检测和人脸对齐集成到了一个框架中实现,而且整体的复杂度得到了很好的控制,可以在中端手机上跑20~30FPS。这个方法目前在很多工业级场景中得到了应用。MTCNN 提出时在FDDB、WIDER FACE和AFLW数据集上取得了当时(2016年4月)最好的结果。(FDDB:0.9504,在WIDER FACE中Easy评测集中召回率达到0.851 Medium评测集中召回率达到0.820 Hard评测集中召回率达到0.607)。

    下图是MTCNN方法的流程,MTCNN的方法可以概括为图像金字塔+3阶段级联CNN。首先对于给定的图像,将其调整到不同的尺度,以构建一个图像金字塔,通过级联CNN完成对人脸由粗到细的检测,前面的卷积神经网络先使用少量信息做大致的判断,快速将不是人脸的区域剔除,剩下可能包含人脸的区域交给后面更复杂的网络,利用更多信息进一步筛选,最后提炼处结果和输出面部地标位置。这种由粗到细的方式和Cascade CNN是类似的,在保证高召回率的同时可以增加筛选效率。
    Kaipeng Zhan, Zhanpeng Zhang, Zhifeng L, Yu Qiao. Joint Face Detection and Alignment Using Multitask Cascaded Convolutional Networks. 2016, IEEE Signal Processing Letters.
    下图是三个卷积网络P-Net,R-Net和O-Net的网络结构。P-Net是个全卷积神经网络(FCN),由卷积层和最大池化层构成,通过前向传播得到的特征图在每个位置都是个32维的特征向量,用来判断每个位置处约12×12大小的区域内是否包含人脸,如果包含人脸,就回归出人脸的边界框。进一步获得边界框对应到原图中的区域,通过NMS(非极大值抑制)保留Face Classification分数最高的边界框并移除重叠区域过大的边界框。R-Net是单纯的卷积神经网络,先将P-Net认为可能包含人脸的边界框双线性插值到24×24,然后输入给R-Net,R-Net判断是否包含人脸,如果包含人脸,也回归出边界框,在经过NMS(非极大值抑制)过滤。O-Net也是卷积神经网络,由卷积层,池化层和全连接层构成,但是它的网络相比于R-Net会更深一点。这一步的过程是将R-Net认为可能包含人脸的边界框双线性插值到48×48,然后输入给O-Net,进行人脸检测和关键点提取并输出。
    Kaipeng Zhan, Zhanpeng Zhang, Zhifeng L, Yu Qiao. Joint Face Detection and Alignment Using Multitask Cascaded Convolutional Networks. 2016, IEEE Signal Processing Letters.
    下图是MTCNN和Cascade CNN在速度和检测精度方面的比较,MTCNN要略优于Cascade CNN,无论是在P-Net,R-Net还是O-Net的表现上。MTCNN之所以要略优于Cascade CNN,第一点是MTCNN第一阶段的P-Net是全卷积网络(FCN),全卷积网络的优点是可以输入任意尺寸的图像,同时使用卷积运算代替了滑动窗口运算,可以大幅提高效率。第二点是将5×5的卷积核替换为3×3并且增加了网络深度,使得网络的表达能力更强,同时运行时间更少。
    在这里插入图片描述

    3. HR

    HR(hybrid-resolution)人脸检测方法提出的背景是物体识别方面已经取得了巨大的进步,但仍然存在的挑战之一是检测小物体,小面孔。论文中作者提出检测器通过利用尺度,分辨率和上下文多种信息融合来检测小目标。该算法在FDDB和WIDER Face取得了当时最好的效果。(WIDER FACE:Easy-0.919 Medium-0.908 Hard-0.823)。特别是Wider Face Hard数据集中,82.3%的正确率在当时取得了一个突破性的进展。下图据说是世界上最多人脸的合照,图像中总共有1000张人脸,HR算法成功检测到了其中大约800个人脸。
    在这里插入图片描述
    论文中提出的检测器是通过尺度不变,分辨率和上下文推理三个方面来检测小目标。因此作者的方法主要思想是基于三方面的,分别是multiscale modeling多尺度建模,foveal descriptors以及context。foveal descriptors就是浅层特征加上深层特征作为最后特征的一种描述子,而context就是上下文信息,也可以说是人脸的周围背景信息,论文中提出在检测小尺寸人脸时,上下文信息十分重要。下图是文中介绍的几种解决多尺度的方式,图a)是单一尺度模板和图像金字塔,图b)是不同尺度模板和单一图像,图c)是粗略尺度模板和粗略图像金字塔,是a)和b)的结合,图d)是含有上下文信息的固定大小多尺度模板和粗略图像金字塔,作者采用的方法就是图d)的方法,含有上下文信息的固定大小的多尺度模板+粗略图像金字塔的方法。而图e)就是foveal描述子,这种类型的描述子能够在大的感受野下捕获高分辨率细节和低分辨率粗线索。从这张图上面也可以看出脸部的信息很清晰,而周围的背景信息也被也有粗略的轮廓。
    HR - P. Hu, D. Ramanan. Finding Tiny Faces. IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2017.
    再看下面这个图,RES2,RES3,RES4,RES5是ResNet网络中每个res块最后一层提取出来的特征,虚线方框表示与来自不同图层的特征相关联的感受野(青色框代表的是res2,浅蓝色是 res3,深蓝是res4,而黑色是res5),对于小尺寸人脸2520,在没有上下文的情况下精度是49.6%,在添加了人脸的周围信息后达到了68.5%,提高了将近18%的性能,而对于大尺寸人脸250200,在没有上下文的情况下精度是88.6%,在添加了人脸的周围信息后达到了90.1%,提高了将近1%的性能,所以说foveal描述子对于小尺寸人脸检测效果显著,而上下文信息对于小尺寸人脸检测十分重要。
    HR - P. Hu, D. Ramanan. Finding Tiny Faces. IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2017.
    下图是HR人脸检测方法的流程,首先对输入图像进行2倍的上采样和2倍的下采样,然后与原图像一起输入到CNN网络中训练,这里的CNN网络并不固定,论文中用到了ResNet-50,ResNet-101以及VGG16三个网络进行训练以及测试,最后ResNet-101相比于另外两个会更好一些,但是总体来说,论文中提出的这个人脸检测框架对于小尺寸人脸的检测相比于当时的方法来说是比较成功的。然后经过卷积神经网络后输出人脸预测响应图,后续用来检测和回归,最后将在不同尺度上得到的候选区域映射回原始分辨率图像上,应用非极大值抑制(NMS)来获得最终检测结果。
    HR - P. Hu, D. Ramanan. Finding Tiny Faces. IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2017.
    下表是论文中给出的HR方法与当时一些人脸检测方法在Wider Face数据集上的对比,尤其是在WIDER FACE HARD数据评测集中,HR方法有了显著的提升。总而言之,HR方法通过粗略的图像金字塔和含有上下文信息的固定大小的多尺度模板相结合的方法,显著提高了小尺寸人脸的检测精度。
    HR - P. Hu, D. Ramanan. Finding Tiny Faces. IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2017.

    4. PyramidBox

    PyramidBox来自百度,是2018 年 WIDER FACE 「Easy」、「Medium」和「Hard」三项评测子集的冠军人脸检测算法。算法聚焦检测难度大的人脸,尤其针对小尺度的人脸(WIDER FACE:Easy set-0.956 Medium set-0.946 Hard set-0.887)。PyramidBox方法可以检测出上图中的880个人脸,相比于HR的800个人脸,性能更优。

    PyramidBox的主要贡献是提出了一种新的上下文辅助以及单次拍摄的人脸检测器PyramidBox,这是作者在人脸检测领域还没有充分利用上下文信息的背景下所提出的一种新的上下文辅助的网络架构,可以充分利用上下文信息。从四个方面实现,首先提出了一种anchor-based的上下文辅助方法PyramidAnchors,可以用于监督学习小、模糊和部分遮挡人脸的上下文特征。然后设计了低层特征金字塔网络(LFPN)来更好地融合文本特征和面部特征。该方法可以在一次拍摄中很好地处理不同尺度的人脸。最后设计一个上下文敏感的预测模块,由混合网络结构和max-in-out层组成,从合并的特征中了解精确的位置和分类,可以提高输出的最终精度。除此之外还提出了基于尺度感知的 Data-anchor-sampling,通过改变训练样本的分布,将重点放在较小的人脸上。

    PyramidBox的网络结构如图所示,分为四个部分,分别是Scale-equitable Backbone Layers,LPFN低层特征金字塔层、上下文敏感的预测层以及PyramidBox Loss Layer层构成。其中Scale-equitable Backbone Layers是参考VGG16网络结构构成的PyramidBox的骨干层。低层特征金字塔层(LFPN)是作者在参考特征金字塔网络(FPN)后,在中间层开始构建自上向下的结构得到的,而摒弃了FPN的部分顶层结构,因为作者认为并不是所有高层特征都对小尺寸人脸有帮助。因为最后两层conv6_2和conv7_2(图中看不清)的感受野分别是724和468,训练图像的输入尺寸是640,因此这两层缺少所需要的环境信息,对检测中等和小尺寸的人脸没有什么帮助。其中检测层是conv3_3的输出层lfpn_2,conv4_3的输出层lfpn1,conv5_3的输出层lfpn_0,conv_fc7,conv6_2和conv7_2。lfpn_2,lfpn_1 和 lfpn_0 是 LFPN 的输出层,然后每个检测层后面都有一个CPM模块,就是论文中提出的上下文敏感的预测模块。经过下文敏感的预测层输出到最后一层PyramidBox损失层。其中CPM模块通过广而深的网络来吸收人脸周围的环境信息比如头发,肩膀等。通过这一层可以得到更好的特征用于分类和更准确地定位。这一部分作者也是基于前人的基础上进行的一个改进,他是通过对DSSD残差预测模块和SSH环境预测模块进行的一个组合。最后通过PyramidBox Loss Layer层计算分类损失和回归损失。
    在这里插入图片描述
    Pyramid Anchor和Anchor是有区别的,Anchor的本质是将相同尺寸的输出,往前倒推得到不同尺寸的输入,然后在三种尺寸的每种尺寸下,取三个不同的长宽比,得到9个面积尺寸各不相同的anchor。而Pyramid Anchor不同的是固定中心点的每层anchor的大小固定的尺寸能产生一个anchor而不是9个,但对每个anchor都打上了三个标签,面部,头部和身体。
    在这里插入图片描述
    下图是Pyramid Anchor可视化的图,在PyramidBox网络中的6个检测层的anchor尺寸分别为从低到高依次是16,32,64,128,256,512。图中尺寸为128的最大的紫色人脸在P3,P4,P5有Pyramid Anchor,P3是由Conv-fc7生成的通过人脸本身标注的,P4是conv6_2生成的通过人脸的头部标注的,因为这一层anchor尺寸为256,P5是conv7_2生成的通过人脸的身体标注的,这一层anchor尺寸为512。再举例来说,如果要检测尺寸为16的最小的蓝绿色人脸,在P0,P1和P2上有Pyramid Anchor,P0是通过原始人脸标注的,这一检测层的anchor尺寸为16。P1是通过对应尺寸为32的头部标注的。而P2是通过对应尺寸为64的身体标注的。总而言之,PyramidBox主要是对已有技术的组合应用,并稍加改进,最后在人脸检测数据集上也达到了很好的性能效果。
    在这里插入图片描述

    5. DSFD

    DSFD 由南京理工大学与腾讯优图联合提出的并在2018年10月发表的。在当时刷新了两个权威数据集FDDB和WIDER FACE上的纪录(FDDB:99.1% WIDER FACE:Test-Easy 96%, Test-Medium 95.3% ,Test-Hard 90%)。DSFD是在SSD的基础上提出的,DSFD的主要技术创新点为Feature Enhance Module特征增强模块,Progressive Anchor Loss渐进锚损失函数以及Improved Anchor Matching改进的锚点匹配。

    下图是DSFD的网络结构,和PyramidBox一样,DSFD也是通过扩展VGG16作为DSFD的基底骨干网络。这里选择conv3_3,conv4_3,conv5_3,conv_fc7,conv6_2,conv7_2作为first shot检测器层,生成了6个初始特征图,命名为of1,of2,of3,of4,of5,of6,然后通过作者提出的FEM将初始特征图转换成6个增强的特征图,对应为ef1,ef2,ef3,ef4,ef5,ef6,并以此创建Second Shot检测层。
    在这里插入图片描述
    下图是FEM特征增强模块,首先通过1*1的卷积调整上层特征图的通道数,使上层和当前层通道数统一,然后对上层特征图进行上采样,统一特征图的尺寸,然后与当前层做element-wise乘积进行特征融合,再之后将特征图分为三部分,分别接入三个不同层次的空洞卷积,最后将空洞卷积得到的结果进行合并。这个特征增强模块是作者结合LFPN和RFB方法后得到的。这个模块的作用是通过增强个金字塔生成的特征的语义信息以及更好的探究相连两层的相关信息,增强特征的判别性和鲁棒性。
    在这里插入图片描述
    PAL损失函数设计分为First Shot Loss和Second Shot Loss两部分,First Shot Loss中,Original feature map对于分类来说语义信息更少,但对于检测来说,具有更高分辨率的本地信息,所以Original feature map更利于检测小尺寸人脸。而Second Shot中,损失函数包含两部分,分类损失函数及坐标回归损失函数。最终PAL总损失函数可以用First Shot Loss和Second Shot Loss两部分之和来表示。PAL的目的是将First Shot Loss中更小的Anchor结合到Second Shot Loss中来得到更多关于分类的语义信息和更多关于检测的高分辨率定位信息。下面这张表格是采用基于ResNet50的FSSD 作为基础,在加入FEM和PAL模块后在WIDER FACE测试集上测试后进行的比较,不管是Easy,Medium还是Hard测试集,在加入FEM和PAL后,检测性能都得到了提升。
    在这里插入图片描述
    论文中第三个创新点改进的锚点匹配是通过提供更好的回归器初始化,使Anchor和正确的人脸尽可能匹配。虽然DSFD这个方法的精度很高,但是由于网络体量太大所以速度很慢。

    各方法在人脸检测数据集上的表现(截至2020年5月)

    在FDDB数据集上,现在最高的准确率是DSFD的99.1%。R-FCN网络下的人脸检测算法也可以做到99%的准确率,SRN达到了98.8%,SRN网络的主要创新点是作者设计的STC和STR两部分,SRN方法的效果还是蛮好的,不管是在FDDB还是在WIDER FACE中。PyramidBox可以达到98.7%。
    在这里插入图片描述
    在WIDER FACE Easy评测集中,最高精度的是AlnnoFace的96.5%,AlnnoFace是2019年的一篇文章,尚未开源,AlnnoFace 并没有提出很创新的点,作者将很多现有的方法融到了一起(比如SRN算法中的STC和STR以及PyramidBox中的Max-in-out层等),从而达到了最好的性能。DSFD的96%,SRN的95.9%和PyramidBox的95.6%也达到了不错的检测效果。
    在这里插入图片描述
    在WIDER FACE Medium中,最高的是AlnnoFace的95.7%,DSFD,SRN和PyramidBox也都达到了94%以上。
    在这里插入图片描述
    在WIDER FACE Hard中,最高的是RetinaFace的91.4%,RetinaFace也是2019年发表的论文,然后AlnnoFace,PyramidBox和DSFD也都达到了90%以上。
    在这里插入图片描述

    展开全文
  • 前言:这个项目自己足足研究了有大半年,里面涉及的知识实在是太有趣太广了,所以实在是不能...第二,可以了解到这个项目衍生使用到的深度学习的人脸检测、人脸提取、GAN网络、视频提取图片图片合成视频、图片相似...

    前言:这个项目自己足足研究了有大半年,里面涉及的知识实在是太有趣太广了,所以实在是不能在研究完毕之后再记录下来,这份博客会不断更新,初心也只是给自己做过的事情做个记录,不过本人会力求完整详细。希望客官您阅读完之后可以了解到一些知识,第一,懂得从零一无所知的状态到掌握视频的人脸转换技术;第二,可以了解到这个项目衍生使用到的深度学习的人脸检测、人脸提取、GAN网络、视频提取图片、图片合成视频、图片相似性分类、视频的音频处理等技术。如果觉得实用就给我点个赞吧,比心。

    内容目录:

    安装faceswap项目代码运行环境

    克隆faceswap项目代码

    人脸转换详细流程步骤

    前期准备
    处理目标视频
    处理素材视频
    训练模型(重难点)
    转换人脸
    合成视频
    总结

    成果展示

    安装faceswap项目代码运行环境

    这部分的内容因为篇幅较长,我另外详细地写在了另外一篇博客上面了,链接如下:https://blog.csdn.net/my_name_is_learn/article/details/103913630

    克隆faceswap项目代码

    faceswap项目的GitHub地址如下:https://github.com/deepfakes/faceswap

    克隆完毕之后,安装项目运行所需工具包,工具包名称和版本号在文件requestment.txt里面,自行用命令安装即可。语句
    pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy==1.18.1

    将后面工具包名称numpy和版本号1.18.1逐个修改然后回车进行安装即可

    人脸转换详细流程步骤

    到这一步才是真正轮到我们大展身手的时候啦。
    内容很多,我整理成了一个xmind文档并上传到百度网盘了,部分截图如下
    在这里插入图片描述
    链接:https://pan.baidu.com/s/1EdErojdPda0xexrLkCObIQ
    提取码:hdqb

    成果展示

    换脸视频已上传到B站(仅供娱乐参考哟,侵删),链接如下:https://www.bilibili.com/video/av57223850?from=search&seid=779192522814012782

    展开全文
  • 2019 年 2 月,Uber 软件工程师 Philip Wang 使用英伟达发表的 StyleGAN 创建了穷尽的假肖像图集,并通过“ThisPersonDoesNotExist”网站用最简单直观的形式展示给更多的,其背后的算法基于大规模的真实数据集...
  • 基于从一张给定年龄的人脸输入图片准确预测出该老龄化后的人脸图片,并且保持身份的目的,采用了基于条件对抗神经网络的监督跨领域框架,然后将此框架应用到人脸身份保持的老龄化的任务中的方法。所采用的对抗...
  • 在5G+AI引爆的万物互联未来,回归智能万物的中心,成为“无缝”连接所有生活场景的重要途径。 无端、感、无缝,这三大优势让回归万物本源,并成为引爆刷脸支付市场的三个关键。3D传感技术所具备的便捷和安全...

    3D人脸识别技术已实现检测人脸是否为活体,杜绝图片或视频破解,其高精度、高效率、高安全性催生刷脸支付、刷脸门禁、刷脸乘车、刷脸登机等应用落地。在5G+AI引爆的万物互联未来,人回归智能万物的中心,脸成为“无缝”连接所有生活场景的重要途径。

    无端、无感、无缝,这三大优势让人回归万物本源,并成为引爆刷脸支付市场的三个关键。3D传感技术所具备的便捷和安全两大特性,令刷脸成为引领支付行业变革的核心。刷脸支付,智慧医疗,智慧校园,餐饮超市酒店,无感停车场,各场景解决方案,软件定制开发,支付硬件批发,详细请百度“掌优电子 魏”

    相对于已经熟悉的二维码支付,一些民众对于刷脸支付是否安全表示担忧。蚂蚁金服资深算法专家李亮表示,通过软硬件的结合,智能算法与风控体系综合保证准确性和安全性,目前识别的准确率为99.99%。而扫码极易植入木马和钓鱼软件,反而存在更大的安全隐患。

    正因为面部识别技术更加高效和安全,因此成为全球众多科技巨头们近年来的主攻研发方向,并衍生了不同的技术流派。加速实现刷脸普及的关键在于3D传感技术,即通过机器识别和AI算法对人脸或物体的3D立体深度信息采集,以及相关软硬件配套解决方案。

    3D结构光和TOF飞行时间法是目前两大主流3D传感技术,它们均基于主动光线投射原理实现采集物体3D深度信息。不同的是,3D结构光在相对较近的距离可获得更高的检测精度,并且功耗要比TOF低,其人脸识别算法难易适中,因此非常适合刷脸支付应用场景。

    目前支付宝蜻蜓、微信青蛙、银联云闪付三大刷脸支付平台皆采用3D结构光技术,通过各类支付终端进行下沉布局,抢占刷脸支付万亿级蓝海市场。基于3D结构光技术已形成规模化、产业化、定制化,帮助中小企业和各类业主轻松搭建便捷安全的移动支付应用场景。

    展开全文
  • 后台功能:菜系管理:添加修改菜系菜品管理:设置菜品价格图片,增删改查订单管理:处理菜单用户管理:管理员、用户管理人脸注册(对接百度ai接口)前台功能:菜单:点菜购物车:添加到购物车的菜品,提交订单到...
  • 上次上传的版本没有附带DLL所以有些无法运行,这次把DLL也附带上来了,可以运行了,这只是一个演示程序,供大家玩乐。图片要求:正面,光照均匀,遮挡。
  • 发现,在「健康宝」小程序中,只要输入姓名和身份证号,无需再次人脸识别,即可查询到指定的健康宝照片。 明星人脸照片被打包售卖. 图片来自:红星新闻 根据官方介绍,「健康宝」小程序,是北京市大数据...
  • 问题描述 visio直接另存为pdf后,通过visio添加的模块、文字等不会失真,但拷贝来的文件则会失真,如下图: 明明是1024*1024的高清人脸,...经过尝试,发现另存为的pdf中图片的分辨率和图片在visio上的尺寸是正相.
  • 4月4日消息,贾跃亭发微博称...当图片内的车灯亮起时,可以隐隐看到车轮的形状,并且可以看出,车前与车尾不太寻常的设计。 法拉第未来与第九城市成立合资公司,根据九城提交给美国证监会的文件,...
  • poco美人相机v1.1.2

    2012-08-20 16:52:20
    7、云相册网络备份:内置网络备份功能,可将图片直接导入POCO图片社区提供的免费网络云相册,空间大小不受限制,让更多的他或者她发现你、欣赏你,完美图片摄影创作,探讨后期秘籍; 8、亲手做明信片:内置精美...
  • 在5G+AI引爆的万物互联未来,回归智能万物的中心,成为无缝连接所有生活场景的重要途径。 近期大兴机场刷脸登机和照片破解丰巢快递柜登上热搜,虽然都是刷脸典型应用场景,且均能给用户带来便利体验,但结果却...
  • 6、云相册网络备份:内置网络备份功能,可将图片直接导入POCO图片社区提供的免费网络云相册,空间大小不受限制,让更多的他或者她发现你、欣赏你,完美摄影创作,探讨后期秘籍; 7、亲手做明信片:内置精美明信片...
  • 6、云相册网络备份:内置网络备份功能,可将图片直接导入POCO图片社区提供的免费网络云相册,空间大小不受限制,让更多的他或者她发现你、欣赏你,完美摄影创作,探讨后期秘籍; 7、亲手做明信片:内置精美明信片...
  • 6、云相册网络备份:内置网络备份功能,可将图片直接导入POCO图片社区提供的免费网络云相册,空间大小不受限制,让更多的他或者她发现你、欣赏你,完美摄影创作,探讨后期秘籍; 7、亲手做明信片:内置精美明信片...
  • 6、云相册网络备份:内置网络备份功能,可将图片直接导入POCO图片社区提供的免费网络云相册,空间大小不受限制,让更多的他或者她发现你、欣赏你,完美摄影创作,探讨后期秘籍; 7、亲手做明信片:内置精美明信片...
  • 6、云相册网络备份:内置网络备份功能,可将图片直接导入POCO图片社区提供的免费网络云相册,空间大小不受限制,让更多的他或者她发现你、欣赏你,完美摄影创作,探讨后期秘籍; 7、亲手做明信片:内置精美明信片...
  • 图片图片满足以下要求:人脸清晰,脸部任何遮挡物,光线充足,人脸的分辨率需≥200 x 200;提取人脸特征,构建人脸特征库C 人脸识别应用阶段 获取摄像头等设备的图片进行检测人脸,提取人脸特征s。将...
  • 监督学习存在很多问题,比如最直接的一点,当样本打标成本很高的时候,比如要标记一个人脸,可能需要在图片上打上百个点,用监督学习很消耗资源。 主动学习(Active Learning)很好地解决了这个问题,主动学习的...
  • 约束自然场景人脸识别数据集,该数据集由13000多张全世界知名人士互联网自然场景不同朝向、表情和光照环境人脸图片组成, 共有5000多人,其中有1680有2张或2张以上人脸图片。每张人脸图片都有其唯一的姓名...
  • 2.1 多人比对:请求多个人脸图片做比对,使用前无需人脸注册过程。即同时上传多张图片,返回结果为每对图片的比对分数 2.2人脸识别:返回指定group中所有username的注册人脸和query人脸的相似度,返...
  • 为了满足此类场景下的图片清洗需求,EasyData上线了高级清洗功能,将无人人体出现的数据进行过滤。虽然EasyData平台本身并没有人脸识别、人体识别的能力,但用户仅需在百度云上开通相应的服务(人脸检测和人体...
  • 我们的目标是:将带有landmark( A)的帧图片转换成新的图片(只换landmark区域,A变B) 3.4.1 首先,生成每一帧图片中A区域对应的B区域图片 过程:Decoder_B (Encoder(A)) #输入A ,输出B 3.4.2 将...
  • BugkuCTF-Misc:猜

    2020-10-26 23:06:44
    step1、打开图片保存到本地,...step2、其实是我想复杂了,题目标题是猜…推测应该不是考察的隐写术,要猜图片人的名字,但图片只给了半张,想到百度识图。 我们都是认识,是刘亦菲 Flag 到手 key{liuyifei} ...
  • 此属性编辑器适用于此项目的所有生成器(即黄种、网红、明星、超模、萌娃、混血和亚洲美人)以及官方生成器。 调整样例 下述样例均采用黄种人脸生成器。 1.调整笑容 2.调整年龄 3.调整水平角度 ...
  • 关于 应用的 问题。

    2021-01-10 19:03:07
    先估算出一个准确的3d表情模型,以此模型为基础,去估算后面的,得到表情变化参数。 然后把这些参数作用到其他3d脸上。 希望以后可以和你交流</p><p>该提问来源于开源项目:YadiraF/...
  • Labeled Faces in the Wild是一个面部照片数据库,专为研究约束人脸识别问题而设计。该数据集包含从网络收集的13,000多张面部图像。每张都标有图中人物的名字。图中的1680在数据集中有两张或更多不同的照片。...
  • 照,姿态,配饰,遮挡;拍色角度,图片模糊,室内外环境和光线变化,服装搭配,穿衣风格 2.数据集: Market1501(清华),DukeMTMC-reID(Duke),CUHK03(香港中文) 3.评价指标: Rank1:首位命中率 mAP:平均精度...
  • 行人重识别综述

    千次阅读 2020-03-02 17:02:51
    照,姿态,配饰,遮挡;拍色角度,图片模糊,室内外环境和光线变化,服装搭配,穿衣风格 二、数据集: Market1501(清华),DukeMTMC-reID(Duke),CUHK03(香港中文) 三、.评价指标: Rank1:首位命中率 mAP:...

空空如也

空空如也

1 2 3 4
收藏数 74
精华内容 29
关键字:

无脸人图片