CascadeFileParser.yy
上传用户:lijia5631
上传日期:2008-11-10
资源大小:1214k
文件大小:14k
源码类别:

视频捕捉/采集

开发平台:

MultiPlatform

  1. /**
  2.   * cubicles
  3.   *
  4.   * This is an implementation of the Viola-Jones object detection 
  5.   * method and some extensions.  The code is mostly platform-
  6.   * independent and uses only standard C and C++ libraries.  It
  7.   * can make use of MPI for parallel training and a few Windows
  8.   * MFC functions for classifier display.
  9.   *
  10.   * Mathias Kolsch, matz@cs.ucsb.edu
  11.   *
  12.   * $Id: CascadeFileParser.yy,v 1.5 2004/10/09 17:04:53 matz Exp $
  13. **/
  14. // CascadeFileParser takes care of parsing integral features,
  15. // weak classifiers, strong classifiers, and classifier cascades
  16. // from file input.  Compile with bison.
  17. //
  18. ////////////////////////////////////////////////////////////////////
  19. //
  20. // By downloading, copying, installing or using the software you 
  21. // agree to this license.  If you do not agree to this license, 
  22. // do not download, install, copy or use the software.
  23. //
  24. // Copyright (C) 2004, Mathias Kolsch, all rights reserved.
  25. // Third party copyrights are property of their respective owners.
  26. //
  27. // Redistribution and use in binary form, with or without 
  28. // modification, is permitted for non-commercial purposes only.
  29. // Redistribution in source, with or without modification, is 
  30. // prohibited without prior written permission.
  31. // If granted in writing in another document, personal use and 
  32. // modification are permitted provided that the following two
  33. // conditions are met:
  34. //
  35. // 1.Any modification of source code must retain the above 
  36. //   copyright notice, this list of conditions and the following 
  37. //   disclaimer.
  38. //
  39. // 2.Redistribution's in binary form must reproduce the above 
  40. //   copyright notice, this list of conditions and the following 
  41. //   disclaimer in the documentation and/or other materials provided
  42. //   with the distribution.
  43. //
  44. // This software is provided by the copyright holders and 
  45. // contributors "as is" and any express or implied warranties, 
  46. // including, but not limited to, the implied warranties of 
  47. // merchantability and fitness for a particular purpose are 
  48. // disclaimed.  In no event shall the copyright holder or 
  49. // contributors be liable for any direct, indirect, incidental, 
  50. // special, exemplary, or consequential damages (including, but not 
  51. // limited to, procurement of substitute goods or services; loss of 
  52. // use, data, or profits; or business interruption) however caused
  53. // and on any theory of liability, whether in contract, strict 
  54. // liability, or tort (including negligence or otherwise) arising 
  55. // in any way out of the use of this software, even if advised of 
  56. // the possibility of such damage.
  57. //
  58. ////////////////////////////////////////////////////////////////////
  59. %{
  60. #include "Cascade.h"
  61. #include "Classifiers.h"
  62. #include "IntegralFeatures.h"
  63. #include "Exceptions.h"
  64. //#include <stdio.h>
  65. // internal variables:
  66. bool parse_entire_cascade;
  67. int image_width, image_height;
  68. CStrongClassifier* curr_strong;
  69. CClassifierCascade* pCascade;
  70. CWeakClassifier* parsed_weak;
  71. int curr_line;
  72. int curr_branch;
  73. string yyIDstring;
  74. void nextline(void)
  75. {
  76.   curr_line++;
  77. }
  78. void yyerror(const char *str)
  79. //void yyerror(YYLTYPE *llocp, const char *str)
  80. {
  81.   char* buf = new char[strlen(str)+1024];
  82.   sprintf(buf, "parsing error (line %d): %s",
  83.           curr_line, str);
  84.   string safe(buf);
  85.   delete buf;
  86.   throw ITException(safe);
  87. //  printf("error: %sn", str);
  88. }
  89. int yyparse(void);
  90. int yylex(void);  
  91. extern FILE* yyin;
  92. CClassifierCascade* parse_cascade(FILE* fp)
  93. {
  94.   // init variables
  95.   pCascade = NULL;
  96.   curr_strong = NULL;
  97.   parsed_weak = NULL;
  98.   image_width = image_height = -1;
  99.   parse_entire_cascade = true;
  100.   curr_line = 1;
  101.   yyin = fp;
  102.   //  yyout = fopen("C:\tmp\dump.txt", "a+");
  103.   // parse the file!
  104.   int result = yyparse();
  105.   // fflush(yyout);
  106.   // fclose(yyout);
  107.   if (result) {
  108.     delete pCascade;
  109.     throw ITException("error parsing");
  110.   }
  111.   return pCascade;
  112. }
  113. %}
  114. %union {
  115.   int ival;
  116.   double fval;
  117.   char* sval;
  118.   bool bval;
  119.   CIntegralFeature* pIF;
  120.   CRect* pRect;
  121.   CWeakClassifier* pWC;
  122.   CClassifierCascade* pCasc;
  123. }
  124. //%error-verbose
  125. %start ROOT
  126. %token CLASSIFIER_CASCADE
  127. %token TYPE_SEQUENTIAL
  128. %token TYPE_FAN
  129. %token TYPE_TREE
  130. %token RATIO
  131. %token FPR
  132. %token DR
  133. %token SUCCESSFUL
  134. %token EXHAUSTED
  135. %token STRONG
  136. %token CLASSIFIER
  137. %token CLASSIFIERS
  138. %token UPCASE_STRONG
  139. %token WEAK
  140. %token NULL_ID
  141. %token THRESHOLD
  142. %token LEFT_RIGHT
  143. %token UP_DOWN
  144. %token LEFT_CENTER_RIGHT
  145. %token SEVEN_COLUMNS
  146. %token DIAG
  147. %token LEFT_RIGHT_SAME
  148. %token UP_DOWN_SAME
  149. %token LEFT_CENTER_RIGHT_SAME
  150. %token SEVEN_COLUMNS_SAME
  151. %token SEVEN_COLUMNS_SIMILAR
  152. %token DIAG_SAME
  153. %token DIAG_SIMILAR
  154. %token FOUR_BOXES
  155. %token FOUR_BOXES_SAME
  156. %token DOUBLEQUOTE
  157. %token COMMA
  158. %token X_BY
  159. %token SLASH
  160. %token DOT
  161. %token COLON
  162. %token OPEN_PAREN
  163. %token CLOSE_PAREN
  164. %token OPEN_BRACKET
  165. %token CLOSE_BRACKET
  166. %token ASTERIX
  167. %token LT
  168. %token GTEQ
  169. %token MINUS
  170. %token BRANCH
  171. %token BRANCHES
  172. %token COMMON
  173. %token <ival> INT_NUMBER
  174. %token <fval> FP_NUMBER
  175. %token <sval> NAME
  176. %type <pIF> integral_feature
  177. %type <pWC> weak_classifier
  178. %type <pRect> quadruple
  179. %type <bval> comparison_lt trainset_exhausted
  180. %type <pCasc> cascade
  181. %type <fval> fp_number
  182. %type <ival> strong_classifier_package_header strong_classifier_header;
  183. %%
  184. ROOT:
  185.   cascade {}
  186. | weak_classifier {}
  187. ;
  188. cascade:
  189.   cascade_header_p1
  190.     cascade_header_p2_sequential
  191.     strong_classifier_package
  192.   {
  193.   }
  194. | cascade_header_p1
  195.     cascade_header_p2_fan
  196.     branch_seq
  197.   {
  198.   }
  199. | cascade_header_p1
  200.     cascade_header_p2_tree
  201.   {
  202.   }
  203. ;
  204. cascade_header_p1:
  205.   CLASSIFIER_CASCADE DOUBLEQUOTE NAME DOUBLEQUOTE COMMA
  206.   {
  207.     if (!parse_entire_cascade) {
  208.       throw ITException("wrong parsing mode set");
  209.     }
  210.     pCascade = new CClassifierCascade();
  211.     pCascade->m_name = yyIDstring;
  212. //    pCascade->m_name = $3;
  213.     curr_branch = -1;
  214.   }
  215. ;
  216. cascade_header_p2_sequential:
  217.   TYPE_SEQUENTIAL COMMA INT_NUMBER X_BY INT_NUMBER COMMA
  218.     RATIO fp_number OPEN_PAREN FPR COLON fp_number COMMA
  219.     DR COLON fp_number COMMA trainset_exhausted CLOSE_PAREN
  220.   {
  221.     image_width = $3;
  222.     image_height = $5;
  223.     pCascade->m_template_width = $3;
  224.     pCascade->m_template_height = $5;
  225.     pCascade->m_image_area_ratio = $8;
  226.     pCascade->m_structure_type = CClassifierCascade::CASCADE_TYPE_SEQUENTIAL;
  227.     pCascade->m_total_false_positive_rate = $12;
  228.     pCascade->m_last_detection_rate = $16;
  229.     pCascade->m_trainset_exhausted = $18;
  230.   }
  231. ;
  232. cascade_header_p2_fan:
  233.   TYPE_FAN COMMA INT_NUMBER X_BY INT_NUMBER COMMA
  234.     RATIO fp_number OPEN_PAREN FPR COLON fp_number COMMA
  235.     DR COLON fp_number COMMA trainset_exhausted CLOSE_PAREN
  236.     INT_NUMBER BRANCHES DOT
  237.   {
  238.     image_width = $3;
  239.     image_height = $5;
  240.     pCascade->m_template_width = $3;
  241.     pCascade->m_template_height = $5;
  242.     pCascade->m_image_area_ratio = $8;
  243.     pCascade->m_structure_type = CClassifierCascade::CASCADE_TYPE_FAN;
  244.     pCascade->m_total_false_positive_rate = $12;
  245.     pCascade->m_last_detection_rate = $16;
  246.     pCascade->m_trainset_exhausted = $18;
  247.     int num_branches = $20;
  248.     pCascade->m_branch_classifiers.resize(num_branches);
  249.     pCascade->m_branch_names.resize(num_branches);
  250.     pCascade->m_branch_false_positive_rates.resize(num_branches);
  251.     pCascade->m_branch_detection_rates.resize(num_branches);
  252.     pCascade->m_branch_lyr_false_positive_rates.resize(num_branches);
  253.     pCascade->m_branch_lyr_detection_rates.resize(num_branches);
  254.   }
  255. ;
  256. cascade_header_p2_tree:
  257.   TYPE_TREE
  258.   {
  259.     pCascade->m_structure_type = CClassifierCascade::CASCADE_TYPE_TREE;
  260.     throw ITException("cascade type tree not supported yet");
  261.   }
  262. ;
  263. trainset_exhausted:
  264.   SUCCESSFUL { $$ = false; }
  265. | EXHAUSTED  { $$ = true; }
  266. ;
  267. branch_seq:
  268.   branch_header strong_classifier_package
  269. | branch_seq branch_header strong_classifier_package
  270. ;
  271. branch_header:
  272.   COMMON BRANCH
  273.   {
  274.   }
  275. | BRANCH INT_NUMBER DOUBLEQUOTE NAME DOUBLEQUOTE
  276.     OPEN_PAREN FPR COLON fp_number COMMA DR COLON fp_number CLOSE_PAREN
  277.   {
  278.     curr_branch = $2;
  279.     if (curr_branch<0 || curr_branch>=(int)pCascade->m_branch_classifiers.size()) {
  280.       throw ITException("branch number out of range");
  281.     }
  282.     pCascade->m_branch_names[$2] = yyIDstring; // $4;
  283.     pCascade->m_branch_false_positive_rates[$2] = $9;
  284.     pCascade->m_branch_detection_rates[$2] = $13;
  285.   }
  286. ;
  287. strong_classifier_package:
  288.   strong_classifier_package_header
  289.     strong_classifier_seq
  290.   {
  291.     int declared_num_strong_clsf = $1;
  292.     if (declared_num_strong_clsf
  293.           !=pCascade->GetNumStrongClassifiers(curr_branch))
  294.     {
  295.       char buf[1024];
  296.       sprintf(buf, "instead of %d strong classifiers as declared, "
  297.                    "%d were found (branch %d)",
  298.               declared_num_strong_clsf,
  299.               pCascade->GetNumStrongClassifiers(curr_branch),
  300.               curr_branch);
  301.       throw ITException(buf);
  302.     }
  303.   }
  304. ;
  305. strong_classifier_package_header:
  306.   INT_NUMBER STRONG CLASSIFIERS DOT
  307.   {
  308.     $$ = $1;
  309.   }
  310. ;
  311. strong_classifier_seq:
  312.   strong_classifier_seq strong_classifier
  313. | strong_classifier
  314. ;
  315. strong_classifier:
  316.   strong_classifier_header
  317.     weighted_weak_classifier_seq
  318.   {
  319.     int delared_num_weak = $1;
  320.     if (delared_num_weak!=curr_strong->GetNumWeakClassifiers()) {
  321.       char buf[1024];
  322.       sprintf(buf, "declared %d weak classifiers, found %d",
  323.               delared_num_weak, curr_strong->GetNumWeakClassifiers());
  324.       throw ITException(buf);
  325.     }
  326.   }
  327. ;
  328. strong_classifier_header:
  329.   UPCASE_STRONG CLASSIFIER INT_NUMBER OPEN_PAREN
  330.     FPR COLON fp_number COMMA DR COLON fp_number CLOSE_PAREN COLON
  331.     INT_NUMBER WEAK CLASSIFIERS COMMA THRESHOLD fp_number COLON
  332.   {
  333.     int declared_id = $3;
  334.     int branch_offset = 0;
  335.     if (curr_branch!=-1) {
  336.        branch_offset = pCascade->GetNumStrongClassifiers();
  337.     }
  338.     if (declared_id-branch_offset
  339.           !=pCascade->GetNumStrongClassifiers(curr_branch))
  340.     {
  341.       char buf[1024];
  342.       sprintf(buf, "expected strong classifier number %d, found number %d (branch %d)",
  343.               pCascade->GetNumStrongClassifiers(), $3, curr_branch);
  344.       throw ITException(buf);
  345.     }
  346.     curr_strong = &pCascade->AddStrongClassifier(curr_branch, $7, $11);
  347.     curr_strong->SetAlphasThreshold($19);
  348.     $$ = $14;
  349.   }
  350. ;
  351. weighted_weak_classifier_seq:
  352.   weighted_weak_classifier_seq weighted_weak_classifier
  353. | weighted_weak_classifier
  354. ;
  355. weighted_weak_classifier:
  356.   fp_number ASTERIX weak_classifier
  357.   {
  358.     curr_strong->AddWeakClassifier($3, $1);
  359.     delete $3;
  360.   }
  361. ;
  362. weak_classifier:
  363.   OPEN_BRACKET integral_feature CLOSE_BRACKET
  364.     comparison_lt fp_number OPEN_PAREN fp_number CLOSE_PAREN
  365.   {
  366.     if (parse_entire_cascade) {
  367.       $$ = new CWeakClassifier($2, $4, $5, $7);
  368.     } else {
  369.       parsed_weak = new CWeakClassifier($2, $4, $5, $7);
  370.     }
  371.   }
  372. ;
  373. comparison_lt:
  374.   LT { $$ = true; }
  375. | GTEQ { $$ = false; }
  376. ;
  377. integral_feature:
  378.   NULL_ID { $$ = NULL; }
  379. |
  380.   LEFT_RIGHT INT_NUMBER COMMA INT_NUMBER X_BY
  381.     INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER
  382.   { $$ = new CLeftRightIF(image_width, image_height,
  383.                           $2, $4, $6, $8, $10);
  384.   }
  385. |
  386.   UP_DOWN INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER X_BY
  387.     INT_NUMBER COMMA INT_NUMBER
  388.   { $$ = new CUpDownIF(image_width, image_height,
  389.                        $2, $4, $6, $8, $10);
  390.   }
  391. |
  392.   LEFT_CENTER_RIGHT INT_NUMBER COMMA INT_NUMBER X_BY
  393.     INT_NUMBER COMMA INT_NUMBER SLASH INT_NUMBER COMMA INT_NUMBER
  394.   { $$ = new CLeftCenterRightIF(image_width, image_height,
  395.                                 $2, $4, $6, $8, $10, $12);
  396.   }
  397. |
  398.   SEVEN_COLUMNS INT_NUMBER COMMA INT_NUMBER X_BY
  399.     INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER COMMA
  400.     INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER
  401.   { $$ = new CSevenColumnsIF(image_width, image_height,
  402.                              $2, $4, $6, $8, $10, $12, $14, $16, $18, $20);
  403.   }
  404. |
  405.   DIAG INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER X_BY
  406.     INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER
  407.   { $$ = new CDiagIF(image_width, image_height,
  408.                      $2, $4, $6, $8, $10, $12);
  409.   }
  410. |
  411.   LEFT_RIGHT_SAME INT_NUMBER COMMA INT_NUMBER X_BY
  412.     INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER
  413.   { $$ = new CLeftRightSameIF(image_width, image_height,
  414.                               $2, $4, $6, $8, $10);
  415.   }
  416. |
  417.   UP_DOWN_SAME INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER X_BY
  418.     INT_NUMBER COMMA INT_NUMBER
  419.   { $$ = new CUpDownSameIF(image_width, image_height,
  420.                            $2, $4, $6, $8, $10);
  421.   }
  422. |
  423.   LEFT_CENTER_RIGHT_SAME INT_NUMBER COMMA INT_NUMBER X_BY
  424.     INT_NUMBER COMMA INT_NUMBER SLASH INT_NUMBER COMMA INT_NUMBER
  425.   { $$ = new CLeftCenterRightSameIF(image_width, image_height,
  426.                                     $2, $4, $6, $8, $10, $12);
  427.   }
  428. |
  429.   SEVEN_COLUMNS_SAME INT_NUMBER COMMA INT_NUMBER X_BY
  430.     INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER COMMA
  431.     INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER
  432.   { $$ = new CSevenColumnsSameIF(image_width, image_height,
  433.                                  $2, $4,
  434.                                  $6, $8, $10, $12, $14, $16, $18, $20);
  435.   }
  436. |
  437.   SEVEN_COLUMNS_SIMILAR INT_NUMBER COMMA INT_NUMBER X_BY
  438.     INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER COMMA
  439.     INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER
  440.   { $$ = new CSevenColumnsSimilarIF(image_width, image_height,
  441.                                     $2, $4,
  442.                                     $6, $8, $10, $12, $14, $16, $18, $20);
  443.   }
  444. |
  445.   DIAG_SAME INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER X_BY
  446.     INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER
  447.   { $$ = new CDiagSameIF(image_width, image_height,
  448.                          $2, $4, $6, $8, $10, $12);
  449.   }
  450. |
  451.   DIAG_SIMILAR INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER X_BY
  452.     INT_NUMBER COMMA INT_NUMBER COMMA INT_NUMBER
  453.   { $$ = new CDiagSimilarIF(image_width, image_height,
  454.                             $2, $4, $6, $8, $10, $12);
  455.   }
  456. |
  457.   FOUR_BOXES quadruple COMMA quadruple COMMA
  458.     quadruple COMMA quadruple
  459.   {
  460.     $$ = new CFourBoxesIF(image_width, image_height,
  461.                           $2, $4, $6, $8);
  462.     delete $2;
  463.     delete $4;
  464.     delete $6;
  465.     delete $8;
  466.   }
  467. |
  468.   FOUR_BOXES_SAME quadruple COMMA quadruple COMMA
  469.     quadruple COMMA quadruple
  470.   {
  471.     $$ = new CFourBoxesSameIF(image_width, image_height,
  472.                               $2, $4, $6, $8);
  473.     delete $2;
  474.     delete $4;
  475.     delete $6;
  476.     delete $8;
  477.   }
  478. ;
  479. quadruple:
  480.   OPEN_PAREN INT_NUMBER COMMA INT_NUMBER COMMA
  481.     INT_NUMBER COMMA INT_NUMBER CLOSE_PAREN
  482.   { $$ = new CRect($2, $4, $6, $8); }
  483. ;
  484. fp_number:
  485.   FP_NUMBER { $$ = $1; }
  486. | INT_NUMBER { $$ = (double) $1; }
  487. ;