FDDB评估代码

时间:2018-05-26 12:30:10

标签: opencv face-detection evaluation dlib evaluate

我正在学习opencv和dlib,用于在大学项目中使用的面部检测器,而且我在整个机器学习和计算机视觉方面都很陌生。如何使用FDDB中的评估代码来评估我的面部检测代码?我使用dlib的CNN方法检测图像中的面部。

<manifest package="com.loser.facebooktest"
          xmlns:android="http://schemas.android.com/apk/res/android">

    <uses-permission android:name="android.permission.INTERNET">
    </uses-permission>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">
    </uses-permission>

    <application
        android:name=".MyApplication"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">

        <meta-data
            android:name="com.facebook.sdk.ApplicationId"
            android:value="@string/facebook_app_id"/>

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

</manifest>

正如您所看到的,代码非常简单,但我必须计算精度,召回率和F1分数来绘制ROC曲线,而我还不知道如何去做,关于该项目的自述github并没有帮助。

2 个答案:

答案 0 :(得分:1)

至于我在ubuntu16中,我必须通过以下步骤完成:

  1. 下载检测到面部并获取检测结果的fddb原始图像数据集。您可以下载它here。这是我的目录: enter image description here

  2. 将所有图像文件路径连接到txt文件,并将所有fddb注释连接到txt文件。 您可以下载所有文件here

  3. enter image description here

    关于我,我将所有FDDB-FOLD-%d.txt移至目录all_file_path,然后通过cat * > filePath.txt将其加入一个文件

    enter image description here

    FDDB-fold-%d-ellipseList.txt

    加入所有cat *ellipse*.txt > annotFile.txt到一个txt

    请注意,您可能无需创建它,因为runEvaluate.pl已在运行过程中为您执行此操作。

    3.创建FDDB evalute exe,在此处下载源代码here 然后编译它,你可以更改makefile,查看原因here,添加

    INCS = -I/usr/local/include/opencv
    
    LIBS = -L/usr/local/lib -lopencv_core -lopencv_imgproc -lopencv_highgui
           -lopencv_ml -lopencv_video -lopencv_features2d -lopencv_calib3d 
           -lopencv_objdetect -lopencv_contrib -lopencv_legacy
    

    到make文件。

    1. 评估,您可以使用runEvaluate.pl来评估它,但对于我(ubuntu16),我无法直接运行它。

      4.1更改GUNPLOT路径(您应首先使用它来安装gnuplot来创建ROC图像)

    2. enter image description here

      4.2我使用矩形检测模型,因此我将$detFormat更改为0。

      my $detFormat = 0; # 0: rectangle, 1: ellipse 2: pixels

      4.3所有图像相对路径:

      my $listFile ="/home/xy/face_sample/evaluation/compareROC/FDDB-folds/filePath.txt";
      

      4.4所有图像注释

      my $annotFile = "/home/xy/face_sample/evaluation/compareROC/FDDB-folds/annotFile.txt";
      

      4.5要生成的roc文件(由evaluate exe创建):

      my $gpFile ="/home/xy/face_sample/evaluation/compareROC/createROC.p";
      

      4.6你检测文件(我将在后面给出如何创建它)

      my $detFile ="/home/xy/face_sample/evaluation/compareROC/detDir/fddb_rect_ret1.txt";
      
      It’s content like that:
      

      enter image description here

      'runEvaluate.pl'有一些错误,请将执行评估更改为以下内容:

      system($evaluateBin, "-a", $annotFile, "-d", $detFile, "-f", $detFormat, "-i", $imDir, "-l", $listFile, "-r", $detDir, "-z", ".jpg");
      

      您还可以使用命令进行检查:

      enter image description here

      xy@xy:~/face_sample/evaluation/compareROC$ ./evaluate \
      > -a /home/xy/face_sample/evaluation/compareROC/FDDB-folds/annotFile.txt \
      > -d /home/xy/face_sample/evaluation/compareROC/detDir/fddb_rect_ret1.txt \
      > -f 0 \
      > -i /home/xy/face_sample/evaluation/compareROC/originalPics/ \
      > -l /home/xy/face_sample/evaluation/compareROC/FDDB-folds/filePath.txt \
      > -r /home/xy/face_sample/evaluation/compareROC/detDir/ \
      > -z .jpg
      

      使用python创建fddb评估txt文件:

      def get_img_relative_path():
          """
          :return: ['2002/08/11/big/img_344', '2002/08/02/big/img_473', ......]
          """
          f_name = 'E:/face_rec/face__det_rec_code/face_det/FDDB-folds/all_img_files.txt'
          lst_name = open(f_name).read().split('\n')
      
          return lst_name
      
      def write_lines_to_txt(lst):
          # lst = ['line1', 'line2', 'line3']
          f_path = 'fddb_rect_ret.txt'
          with open(f_path, 'w') as fp:
      
              for line in lst:
                  fp.write("%s\n" % line)
      
      # For example use opencv to face detection
      def detect_face_lst(img):
          """
          :param img: opencv image 
          :return: face rectangles [[x, y, w, h], ..........]
          """
          m_path = 'D:/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml'
          face_cascade = cv2.CascadeClassifier(m_path)
      
          gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
      
          faces = face_cascade.detectMultiScale(gray, 1.3, 5)
      
          return faces
      
      
      def generate_fddb_ret():
          # The directory from which we get the test images from FDDB
          img_base_dir = 'E:/face_rec/face__det_rec_code/face_det/originalPics/'
      
          # All the images relative path, like '['2002/08/11/big/img_344', '2002/08/02/big/img_473', ......]'
          lst_img_name = get_img_relative_path()
      
          # Store detect result, like:
          # ['2002/08/11/big/img_344', '1', '10 10 50 50 1', .............]
          lst_write2_fddb_ret = []
      
          try:
              for img_name in lst_img_name:
                  img_full_name = img_base_dir + img_name + '.jpg'
                  img = cv2.imread(img_full_name)
      
                  if img == None:
                      print 'error %s not exists, can not generate complete fddb evaluate file' % img_full_name
                      return -1
      
                  lst_face_rect = detect_face_lst(img)
      
                  # append img name like '2002/08/11/big/img_344'
                  lst_write2_fddb_ret.append(img_name)
      
                  face_num = len(lst_face_rect)
                  # append face num, note if no face 0 should be append
                  lst_write2_fddb_ret.append(str(face_num))
      
                  if face_num > 0:
                      # append each face rectangle x y w h score
                      for face_rect in lst_face_rect:
                          # append face rectangle x, y, w, h score
                          # note: opencv hava no confidence so use 1 here
                          s_rect = " ".join(str(item) for item in face_rect) + " 1"
                          lst_write2_fddb_ret.append(s_rect)
      
          except Exception as e:
              print 'error %s , can not generate complete fddb evaluate file' % e
              return -1
      
          # Write all the result to txt for FDDB evaluation
          write_lines_to_txt(lst_write2_fddb_ret)
      

      运行上面的代码后,您可以创建FDDB结果: enter image description here

      注意:在windows中创建上面的txt时,如果你在ubuntu中测试它,你可能会收到以下错误Incompatible annotation and detection files. See output specifications

      enter image description here

      只需将内容复制到新的txt文件(在ubuntu中创建)然后解决。

      结果如下:

      enter image description here

      一些提示:

      1. 您可以看到runEvaluate.pl并不难,可能不需要进行上述更改。您还可以更改runEvaluate.pl中的某个变量,例如$GNUPLOT,{{1 }} 等等。 将$imDir添加到 system($ evaluateBin,“ - a”,$ annotFile,“ - d”,$ detFile,“ - f”,$ detFormat,“ - i”,$ imDir,“ - l”,$ listFile,“ - r”, $ detDir);

        system($ evaluateBin,“ - a”,$ annotFile,“ - d”,$ detFile,“ - f”,$ detFormat,“ - i”,$ imDir,“ - l”,$ listFile,“ - r“,$ detDir,” - z“,”.jpg“);

      2. 您还可以阅读"-z", ".jpg"代码(主要是易于理解的evaluate代码),这样您就可以深入了解如何评估它。

        < / LI>

答案 1 :(得分:0)

你能解释一下你所处的步骤吗?

您需要从以下位置下载标记数据: http://vis-www.cs.umass.edu/fddb/表示:下载数据库

之后你需要下载结果源代码: http://vis-www.cs.umass.edu/fddb/results.html

然后你需要修改程序,使输出如下所示:

2002/08/11/big/img_591
1
191 88 164 163 0
2002/08/26/big/img_265
3
52 39 95 95 0
282 59 114 114 0

首先是图像的名称, 那么那张图片中的面孔数量, 然后对每张脸进行协调并重复...

我建议你在linux上构建评估,因为它更容易(至少对我而言)。

希望它有所帮助。