Showing preview only (2,003K chars total). Download the full file or copy to clipboard to get everything.
Repository: objcio/issue-21-OpenCV-FaceRec
Branch: master
Commit: 270a5e7fe25e
Files: 25
Total size: 1.9 MB
Directory structure:
gitextract_b0ei26sj/
├── .gitignore
├── FaceRec/
│ ├── AppDelegate.h
│ ├── AppDelegate.m
│ ├── Base.lproj/
│ │ ├── LaunchScreen.xib
│ │ └── Main.storyboard
│ ├── FJFaceDetector.h
│ ├── FJFaceDetector.mm
│ ├── FJFaceRecognitionViewController.h
│ ├── FJFaceRecognitionViewController.m
│ ├── FJFaceRecognizer.h
│ ├── FJFaceRecognizer.mm
│ ├── FJLiveCameraViewController.h
│ ├── FJLiveCameraViewController.m
│ ├── Images.xcassets/
│ │ └── AppIcon.appiconset/
│ │ └── Contents.json
│ ├── Info.plist
│ ├── UIImage+OpenCV.h
│ ├── UIImage+OpenCV.mm
│ ├── haarcascade_eye_tree_eyeglasses.xml
│ ├── haarcascade_frontalface_alt2.xml
│ └── main.m
├── Podfile
├── README.md
├── iOS-OpenCV-FaceRec.xcodeproj/
│ ├── project.pbxproj
│ └── project.xcworkspace/
│ └── contents.xcworkspacedata
└── iOS-OpenCV-FaceRec.xcworkspace/
└── contents.xcworkspacedata
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
# Created by https://www.gitignore.io
### Xcode ###
build/
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
*.xccheckout
*.moved-aside
DerivedData
*.xcuserstate
### AppCode ###
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm
*.iml
## Directory-based project format:
.idea/
# if you remove the above rule, at least ignore the following:
# User-specific stuff:
# .idea/workspace.xml
# .idea/tasks.xml
# .idea/dictionaries
# Sensitive or high-churn files:
# .idea/dataSources.ids
# .idea/dataSources.xml
# .idea/sqlDataSources.xml
# .idea/dynamic.xml
# .idea/uiDesigner.xml
# Gradle:
# .idea/gradle.xml
# .idea/libraries
# Mongo Explorer plugin:
# .idea/mongoSettings.xml
## File-based project format:
*.ipr
*.iws
## Plugin-specific files:
# IntelliJ
out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
### OSX ###
.DS_Store
.AppleDouble
.LSOverride
# Icon must end with two \r
Icon
# Thumbnails
._*
# Files that might appear on external disk
.Spotlight-V100
.Trashes
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
Pods
================================================
FILE: FaceRec/AppDelegate.h
================================================
//
// AppDelegate.h
// opencvtest
//
// Created by Engin Kurutepe on 16/01/15.
// Copyright (c) 2015 Fifteen Jugglers Software. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@end
================================================
FILE: FaceRec/AppDelegate.m
================================================
//
// AppDelegate.m
// opencvtest
//
// Created by Engin Kurutepe on 16/01/15.
// Copyright (c) 2015 Fifteen Jugglers Software. All rights reserved.
//
#import "AppDelegate.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
return YES;
}
- (void)applicationWillResignActive:(UIApplication *)application {
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
// Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}
- (void)applicationWillTerminate:(UIApplication *)application {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}
@end
================================================
FILE: FaceRec/Base.lproj/LaunchScreen.xib
================================================
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="6254" systemVersion="14C109" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6247"/>
<capability name="Constraints with non-1.0 multipliers" minToolsVersion="5.1"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<view contentMode="scaleToFill" id="iN0-l3-epB">
<rect key="frame" x="0.0" y="0.0" width="480" height="480"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text=" Copyright (c) 2015 Fifteen Jugglers Software. All rights reserved." textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="9" translatesAutoresizingMaskIntoConstraints="NO" id="8ie-xW-0ye">
<rect key="frame" x="20" y="439" width="441" height="21"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="FaceRec" textAlignment="center" lineBreakMode="middleTruncation" baselineAdjustment="alignBaselines" minimumFontSize="18" translatesAutoresizingMaskIntoConstraints="NO" id="kId-c2-rCX">
<rect key="frame" x="20" y="140" width="441" height="43"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="36"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="kId-c2-rCX" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="bottom" multiplier="1/3" constant="1" id="5cJ-9S-tgC"/>
<constraint firstAttribute="centerX" secondItem="kId-c2-rCX" secondAttribute="centerX" id="Koa-jz-hwk"/>
<constraint firstAttribute="bottom" secondItem="8ie-xW-0ye" secondAttribute="bottom" constant="20" id="Kzo-t9-V3l"/>
<constraint firstItem="8ie-xW-0ye" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="20" symbolic="YES" id="MfP-vx-nX0"/>
<constraint firstAttribute="centerX" secondItem="8ie-xW-0ye" secondAttribute="centerX" id="ZEH-qu-HZ9"/>
<constraint firstItem="kId-c2-rCX" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="20" symbolic="YES" id="fvb-Df-36g"/>
</constraints>
<nil key="simulatedStatusBarMetrics"/>
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
<point key="canvasLocation" x="548" y="455"/>
</view>
</objects>
</document>
================================================
FILE: FaceRec/Base.lproj/Main.storyboard
================================================
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="6254" systemVersion="14C109" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6247"/>
<capability name="Constraints to layout margins" minToolsVersion="6.0"/>
</dependencies>
<scenes>
<!--Live Camera View Controller-->
<scene sceneID="tne-QT-ifu">
<objects>
<viewController id="BYZ-38-t0r" customClass="FJLiveCameraViewController" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
<viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="hAz-vW-YPY">
<rect key="frame" x="0.0" y="20" width="600" height="580"/>
</imageView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="trailing" secondItem="hAz-vW-YPY" secondAttribute="trailing" id="F3q-L4-vUE"/>
<constraint firstItem="hAz-vW-YPY" firstAttribute="top" secondItem="y3c-jy-aDJ" secondAttribute="bottom" id="Nf0-Bd-knO"/>
<constraint firstItem="wfy-db-euE" firstAttribute="top" secondItem="hAz-vW-YPY" secondAttribute="bottom" id="Uf5-ii-KXy"/>
<constraint firstItem="hAz-vW-YPY" firstAttribute="leading" secondItem="8bC-Xf-vdC" secondAttribute="leading" id="fdR-ZZ-F3b"/>
</constraints>
</view>
<connections>
<outlet property="cameraView" destination="hAz-vW-YPY" id="MyG-6W-Cjy"/>
<segue destination="r25-XH-VYp" kind="presentation" identifier="RecognizeFace" id="RAf-uc-bkz"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects>
</scene>
<!--Face Recognition View Controller-->
<scene sceneID="v8W-9c-Cdj">
<objects>
<viewController id="r25-XH-VYp" customClass="FJFaceRecognitionViewController" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="JOa-aR-MjQ"/>
<viewControllerLayoutGuide type="bottom" id="LYU-Ff-HhP"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="Be0-SW-316">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="JWJ-B2-Wsd">
<rect key="frame" x="16" y="48" width="120" height="120"/>
<constraints>
<constraint firstAttribute="width" constant="120" id="4bn-0f-KIc"/>
<constraint firstAttribute="height" constant="120" id="ywS-0h-Gbo"/>
</constraints>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Input:" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ET1-Od-m54">
<rect key="frame" x="16" y="20" width="43" height="20"/>
<fontDescription key="fontDescription" style="UICTFontTextStyleHeadline"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Recognized Person:" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="v20-cH-b6g">
<rect key="frame" x="16" y="195" width="150" height="20"/>
<fontDescription key="fontDescription" style="UICTFontTextStyleHeadline"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="asd" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="jJa-b9-cPF">
<rect key="frame" x="174" y="194" width="28" height="21"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" misplaced="YES" text="Confidence:" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="oRi-QR-iVo">
<rect key="frame" x="16" y="222" width="90" height="20"/>
<fontDescription key="fontDescription" style="UICTFontTextStyleHeadline"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" misplaced="YES" text="asd" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="mkI-MO-FvD">
<rect key="frame" x="114" y="221" width="28" height="21"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<button opaque="NO" contentMode="scaleToFill" misplaced="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="TNd-nM-ThK">
<rect key="frame" x="16" y="251" width="56" height="30"/>
<color key="tintColor" red="0.0" green="1" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<state key="normal" title="Correct!">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<connections>
<action selector="didTapCorrect:" destination="r25-XH-VYp" eventType="touchUpInside" id="iQS-cB-LKg"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" misplaced="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="4Um-Zf-mgr">
<rect key="frame" x="378" y="251" width="206" height="30"/>
<color key="tintColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<state key="normal" title="Wrong. This is another person">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<connections>
<action selector="didTapWrong:" destination="r25-XH-VYp" eventType="touchUpInside" id="lA4-gQ-3Aq"/>
</connections>
</button>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="v20-cH-b6g" firstAttribute="leading" secondItem="Be0-SW-316" secondAttribute="leadingMargin" id="49V-Qw-Oxt"/>
<constraint firstItem="ET1-Od-m54" firstAttribute="leading" secondItem="Be0-SW-316" secondAttribute="leadingMargin" id="4Tu-0L-dBd"/>
<constraint firstItem="v20-cH-b6g" firstAttribute="baseline" secondItem="jJa-b9-cPF" secondAttribute="baseline" id="Ciw-NI-eDC"/>
<constraint firstItem="JWJ-B2-Wsd" firstAttribute="top" secondItem="ET1-Od-m54" secondAttribute="bottom" constant="8" id="Gva-Bi-mpd"/>
<constraint firstItem="oRi-QR-iVo" firstAttribute="top" secondItem="v20-cH-b6g" secondAttribute="bottom" constant="8" symbolic="YES" id="HKj-r6-Qce"/>
<constraint firstItem="v20-cH-b6g" firstAttribute="top" secondItem="JWJ-B2-Wsd" secondAttribute="bottom" constant="27" id="HOZ-DL-YIf"/>
<constraint firstItem="4Um-Zf-mgr" firstAttribute="trailing" secondItem="Be0-SW-316" secondAttribute="trailingMargin" id="HdV-Pf-dF9"/>
<constraint firstItem="TNd-nM-ThK" firstAttribute="top" secondItem="oRi-QR-iVo" secondAttribute="bottom" constant="9" id="Jbg-PD-j6f"/>
<constraint firstItem="JWJ-B2-Wsd" firstAttribute="leading" secondItem="Be0-SW-316" secondAttribute="leadingMargin" id="WZi-O5-xuh"/>
<constraint firstItem="mkI-MO-FvD" firstAttribute="leading" secondItem="oRi-QR-iVo" secondAttribute="trailing" constant="8" id="aBb-De-vOq"/>
<constraint firstItem="mkI-MO-FvD" firstAttribute="baseline" secondItem="oRi-QR-iVo" secondAttribute="baseline" id="an7-X9-Xhd"/>
<constraint firstItem="TNd-nM-ThK" firstAttribute="baseline" secondItem="4Um-Zf-mgr" secondAttribute="baseline" id="nTo-D1-NQy"/>
<constraint firstItem="jJa-b9-cPF" firstAttribute="leading" secondItem="v20-cH-b6g" secondAttribute="trailing" constant="8" id="pRP-6Z-6FY"/>
<constraint firstItem="v20-cH-b6g" firstAttribute="leading" secondItem="oRi-QR-iVo" secondAttribute="leading" id="tFT-fc-p0r"/>
<constraint firstItem="TNd-nM-ThK" firstAttribute="leading" secondItem="Be0-SW-316" secondAttribute="leadingMargin" id="xqa-kC-EGt"/>
<constraint firstItem="ET1-Od-m54" firstAttribute="top" secondItem="JOa-aR-MjQ" secondAttribute="bottom" id="yfe-Cg-9DA"/>
</constraints>
</view>
<connections>
<outlet property="confidenceLabel" destination="mkI-MO-FvD" id="GkJ-DF-mr5"/>
<outlet property="inputImageView" destination="JWJ-B2-Wsd" id="nMY-ZK-deF"/>
<outlet property="nameLabel" destination="jJa-b9-cPF" id="czn-rJ-d06"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="ydy-KQ-hnf" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1157" y="659"/>
</scene>
</scenes>
</document>
================================================
FILE: FaceRec/FJFaceDetector.h
================================================
//
// CVCameraProvider.h
// opencvtest
//
// Created by Engin Kurutepe on 16/01/15.
// Copyright (c) 2015 Fifteen Jugglers Software. All rights reserved.
//
#import <opencv2/highgui/cap_ios.h>
#import <Foundation/Foundation.h>
@interface FJFaceDetector : NSObject <CvVideoCameraDelegate>
@property (nonatomic, strong) CvVideoCamera* videoCamera;
- (instancetype)initWithCameraView:(UIImageView *)view scale:(CGFloat)scale;
- (void)startCapture;
- (void)stopCapture;
- (NSArray *)detectedFaces;
- (UIImage *)faceWithIndex:(NSInteger)idx;
@end
================================================
FILE: FaceRec/FJFaceDetector.mm
================================================
//
// CVCameraProvider.mm
// opencvtest
//
// Created by Engin Kurutepe on 16/01/15.
// Copyright (c) 2015 Fifteen Jugglers Software. All rights reserved.
//
#ifdef __cplusplus
#import <opencv2/opencv.hpp>
#endif
#import "FJFaceDetector.h"
#import "UIImage+OpenCV.h"
using namespace cv;
@interface FJFaceDetector () {
CascadeClassifier _faceDetector;
vector<cv::Rect> _faceRects;
vector<cv::Mat> _faceImgs;
}
@property (nonatomic, assign) CGFloat scale;
@end
@implementation FJFaceDetector
- (instancetype)initWithCameraView:(UIImageView *)view scale:(CGFloat)scale {
self = [super init];
if (self) {
self.videoCamera = [[CvVideoCamera alloc] initWithParentView:view];
self.videoCamera.defaultAVCaptureDevicePosition = AVCaptureDevicePositionBack;
self.videoCamera.defaultAVCaptureSessionPreset = AVCaptureSessionPreset640x480;
self.videoCamera.defaultAVCaptureVideoOrientation = AVCaptureVideoOrientationPortrait;
self.videoCamera.defaultFPS = 30;
self.videoCamera.grayscaleMode = NO;
self.videoCamera.delegate = self;
self.scale = scale;
NSString *faceCascadePath = [[NSBundle mainBundle] pathForResource:@"haarcascade_frontalface_alt2"
ofType:@"xml"];
const CFIndex CASCADE_NAME_LEN = 2048;
char *CASCADE_NAME = (char *) malloc(CASCADE_NAME_LEN);
CFStringGetFileSystemRepresentation( (CFStringRef)faceCascadePath, CASCADE_NAME, CASCADE_NAME_LEN);
_faceDetector.load(CASCADE_NAME);
free(CASCADE_NAME);
// NSString *eyesCascadePath = [[NSBundle mainBundle] pathForResource:@"haarcascade_eye_tree_eyeglasses"
// ofType:@"xml"];
//
// CFStringGetFileSystemRepresentation( (CFStringRef)eyesCascadePath, CASCADE_NAME, CASCADE_NAME_LEN);
//
// eyesDetector.load(CASCADE_NAME);
}
return self;
}
- (void)startCapture {
[self.videoCamera start];
}
- (void)stopCapture; {
[self.videoCamera stop];
}
- (NSArray *)detectedFaces {
NSMutableArray *facesArray = [NSMutableArray array];
for( vector<cv::Rect>::const_iterator r = _faceRects.begin(); r != _faceRects.end(); r++ )
{
CGRect faceRect = CGRectMake(_scale*r->x/480., _scale*r->y/640., _scale*r->width/480., _scale*r->height/640.);
[facesArray addObject:[NSValue valueWithCGRect:faceRect]];
}
return facesArray;
}
- (UIImage *)faceWithIndex:(NSInteger)idx {
cv::Mat img = self->_faceImgs[idx];
UIImage *ret = [UIImage imageFromCVMat:img];
return ret;
}
- (void)processImage:(cv::Mat&)image {
// Do some OpenCV stuff with the image
[self detectAndDrawFacesOn:image scale:_scale];
}
- (void)detectAndDrawFacesOn:(Mat&) img scale:(double) scale
{
int i = 0;
double t = 0;
const static Scalar colors[] = { CV_RGB(0,0,255),
CV_RGB(0,128,255),
CV_RGB(0,255,255),
CV_RGB(0,255,0),
CV_RGB(255,128,0),
CV_RGB(255,255,0),
CV_RGB(255,0,0),
CV_RGB(255,0,255)} ;
Mat gray, smallImg( cvRound (img.rows/scale), cvRound(img.cols/scale), CV_8UC1 );
cvtColor( img, gray, COLOR_BGR2GRAY );
resize( gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR );
equalizeHist( smallImg, smallImg );
t = (double)cvGetTickCount();
double scalingFactor = 1.1;
int minRects = 2;
cv::Size minSize(30,30);
self->_faceDetector.detectMultiScale( smallImg, self->_faceRects,
scalingFactor, minRects, 0,
minSize );
t = (double)cvGetTickCount() - t;
// printf( "detection time = %g ms\n", t/((double)cvGetTickFrequency()*1000.) );
vector<cv::Mat> faceImages;
for( vector<cv::Rect>::const_iterator r = _faceRects.begin(); r != _faceRects.end(); r++, i++ )
{
cv::Mat smallImgROI;
cv::Point center;
Scalar color = colors[i%8];
vector<cv::Rect> nestedObjects;
rectangle(img,
cvPoint(cvRound(r->x*scale), cvRound(r->y*scale)),
cvPoint(cvRound((r->x + r->width-1)*scale), cvRound((r->y + r->height-1)*scale)),
color, 1, 8, 0);
//eye detection is pretty low accuracy
// if( self->eyesDetector.empty() )
// continue;
//
smallImgROI = smallImg(*r);
faceImages.push_back(smallImgROI.clone());
//
//
//
// self->eyesDetector.detectMultiScale( smallImgROI, nestedObjects,
// 1.1, 2, 0,
// cv::Size(5, 5) );
// for( vector<cv::Rect>::const_iterator nr = nestedObjects.begin(); nr != nestedObjects.end(); nr++ )
// {
// center.x = cvRound((r->x + nr->x + nr->width*0.5)*scale);
// center.y = cvRound((r->y + nr->y + nr->height*0.5)*scale);
// int radius = cvRound((nr->width + nr->height)*0.25*scale);
// circle( img, center, radius, color, 3, 8, 0 );
// }
}
@synchronized(self) {
self->_faceImgs = faceImages;
}
}
@end
================================================
FILE: FaceRec/FJFaceRecognitionViewController.h
================================================
//
// FJFaceRecognitionViewController.h
// opencvtest
//
// Created by Engin Kurutepe on 28/01/15.
// Copyright (c) 2015 Fifteen Jugglers Software. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface FJFaceRecognitionViewController : UIViewController
@property (nonatomic, strong) UIImage *inputImage;
@end
================================================
FILE: FaceRec/FJFaceRecognitionViewController.m
================================================
//
// FJFaceRecognitionViewController.m
// opencvtest
//
// Created by Engin Kurutepe on 28/01/15.
// Copyright (c) 2015 Fifteen Jugglers Software. All rights reserved.
//
#import "FJFaceRecognitionViewController.h"
#import "FJFaceRecognizer.h"
@interface FJFaceRecognitionViewController ()
@property (weak, nonatomic) IBOutlet UILabel *nameLabel;
@property (weak, nonatomic) IBOutlet UILabel *confidenceLabel;
@property (weak, nonatomic) IBOutlet UIImageView *inputImageView;
@property (nonatomic, strong) FJFaceRecognizer *faceModel;
@end
@implementation FJFaceRecognitionViewController
- (void)viewDidLoad {
[super viewDidLoad];
_inputImageView.image = _inputImage;
NSURL *modelURL = [self faceModelFileURL];
self.faceModel = [FJFaceRecognizer faceRecognizerWithFile:[modelURL path]];
double confidence;
if (_faceModel.labels.count == 0) {
[_faceModel updateWithFace:_inputImage name:@"Person 1"];
}
NSString *name = [_faceModel predict:_inputImage confidence:&confidence];
_nameLabel.text = name;
_confidenceLabel.text = [@(confidence) stringValue];
}
- (NSURL *)faceModelFileURL {
NSArray *paths = [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask];
NSURL *documentsURL = [paths lastObject];
NSURL *modelURL = [documentsURL URLByAppendingPathComponent:@"face-model.xml"];
return modelURL;
}
- (IBAction)didTapCorrect:(id)sender {
//Positive feedback for the correct prediction
[_faceModel updateWithFace:_inputImage name:_nameLabel.text];
[_faceModel serializeFaceRecognizerParamatersToFile:[[self faceModelFileURL] path]];
[self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
}
- (IBAction)didTapWrong:(id)sender {
//Update our face model with the new person
NSString *name = [@"Person " stringByAppendingFormat:@"%lu", (unsigned long)_faceModel.labels.count];
[_faceModel updateWithFace:_inputImage name:name];
[_faceModel serializeFaceRecognizerParamatersToFile:[[self faceModelFileURL] path]];
[self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
}
@end
================================================
FILE: FaceRec/FJFaceRecognizer.h
================================================
//
// FaceRecognizer.h
// opencvtest
//
// Created by Engin Kurutepe on 21/01/15.
// Copyright (c) 2015 Fifteen Jugglers Software. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface FJFaceRecognizer : NSObject
+ (FJFaceRecognizer *)faceRecognizerWithFile:(NSString *)path;
- (BOOL)serializeFaceRecognizerParamatersToFile:(NSString *)path;
- (NSString *)predict:(UIImage*)img confidence:(double *)confidence;
- (void)updateWithFace:(UIImage *)img name:(NSString *)name;
- (NSArray *)labels;
@end
================================================
FILE: FaceRec/FJFaceRecognizer.mm
================================================
//
// FaceRecognizer.mm
// opencvtest
//
// Created by Engin Kurutepe on 21/01/15.
// Copyright (c) 2015 Fifteen Jugglers Software. All rights reserved.
//
#ifdef __cplusplus
#import <opencv2/opencv.hpp>
#endif
#import "FJFaceRecognizer.h"
#import "UIImage+OpenCV.h"
using namespace cv;
@interface FJFaceRecognizer () {
Ptr<FaceRecognizer> _faceClassifier;
}
@property (nonatomic, strong) NSMutableDictionary *labelsDictionary;
@end
@implementation FJFaceRecognizer
+ (FJFaceRecognizer *)faceRecognizerWithFile:(NSString *)path {
FJFaceRecognizer *fr = [FJFaceRecognizer new];
fr->_faceClassifier = createLBPHFaceRecognizer();
NSFileManager *fm = [NSFileManager defaultManager];
if (path && [fm fileExistsAtPath:path isDirectory:nil]) {
fr->_faceClassifier->load(path.UTF8String);
NSDictionary *unarchivedNames = [NSKeyedUnarchiver
unarchiveObjectWithFile:[path stringByAppendingString:@".names"]];
fr.labelsDictionary = [NSMutableDictionary dictionaryWithDictionary:unarchivedNames];
}
else {
fr.labelsDictionary = [NSMutableDictionary dictionary];
NSLog(@"could not load paramaters file: %@", path);
}
return fr;
}
- (BOOL)serializeFaceRecognizerParamatersToFile:(NSString *)path {
self->_faceClassifier->save(path.UTF8String);
[NSKeyedArchiver archiveRootObject:_labelsDictionary toFile:[path stringByAppendingString:@".names"]];
return YES;
}
- (NSString *)predict:(UIImage*)img confidence:(double *)confidence {
cv::Mat src = [img cvMatRepresentationGray];
int label;
self->_faceClassifier->predict(src, label, *confidence);
return _labelsDictionary[@(label)];
}
- (void)updateWithFace:(UIImage *)img name:(NSString *)name {
cv::Mat src = [img cvMatRepresentationGray];
NSSet *keys = [_labelsDictionary keysOfEntriesPassingTest:^BOOL(id key, id obj, BOOL *stop) {
return ([name isEqual:obj]);
}];
NSInteger label;
if (keys.count) {
label = [[keys anyObject] integerValue];
}
else {
label = _labelsDictionary.allKeys.count;
_labelsDictionary[@(label)] = name;
}
vector<cv::Mat> images = vector<cv::Mat>();
images.push_back(src);
vector<int> labels = vector<int>();
labels.push_back((int)label);
self->_faceClassifier->update(images, labels);
[self labels];
}
- (NSArray *)labels {
cv::Mat labels = _faceClassifier->getMat("labels");
if (labels.total() == 0) {
return @[];
}
else {
NSMutableArray *mutableArray = [NSMutableArray array];
for (MatConstIterator_<int> itr = labels.begin<int>(); itr != labels.end<int>(); ++itr ) {
int lbl = *itr;
[mutableArray addObject:@(lbl)];
}
return [NSArray arrayWithArray:mutableArray];
}
}
@end
================================================
FILE: FaceRec/FJLiveCameraViewController.h
================================================
//
// ViewController.h
// opencvtest
//
// Created by Engin Kurutepe on 16/01/15.
// Copyright (c) 2015 Fifteen Jugglers Software. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface FJLiveCameraViewController : UIViewController
@end
================================================
FILE: FaceRec/FJLiveCameraViewController.m
================================================
//
// ViewController.m
// opencvtest
//
// Created by Engin Kurutepe on 16/01/15.
// Copyright (c) 2015 Fifteen Jugglers Software. All rights reserved.
//
#import "FJLiveCameraViewController.h"
#import "FJFaceDetector.h"
#import "FJFaceRecognitionViewController.h"
@interface FJLiveCameraViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *cameraView;
@property (nonatomic, strong) FJFaceDetector *faceDetector;
@property (nonatomic, strong) UITapGestureRecognizer *tapGestureRecognizer;
@end
@implementation FJLiveCameraViewController
- (BOOL)prefersStatusBarHidden {
return YES;
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.faceDetector = [[FJFaceDetector alloc] initWithCameraView:_cameraView scale:2.0];
self.tapGestureRecognizer = [[UITapGestureRecognizer alloc]
initWithTarget:self
action:@selector(handleTap:)];
[self.view addGestureRecognizer:_tapGestureRecognizer];
self.view.userInteractionEnabled = YES;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[self.faceDetector startCapture];
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[self.faceDetector stopCapture];
}
- (void)handleTap:(UITapGestureRecognizer *)tapGesture {
NSArray *detectedFaces = [self.faceDetector.detectedFaces copy];
CGSize windowSize = self.view.bounds.size;
for (NSValue *val in detectedFaces) {
CGRect faceRect = [val CGRectValue];
CGPoint tapPoint = [tapGesture locationInView:nil];
//scale tap point to 0.0 to 1.0
CGPoint scaledPoint = CGPointMake(tapPoint.x/windowSize.width, tapPoint.y/windowSize.height);
if(CGRectContainsPoint(faceRect, scaledPoint)){
NSLog(@"tapped on face: %@", NSStringFromCGRect(faceRect));
UIImage *img = [self.faceDetector faceWithIndex:[detectedFaces indexOfObject:val]];
[self performSegueWithIdentifier:@"RecognizeFace" sender:img];
}
else {
NSLog(@"tapped on no face");
}
}
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqual:@"RecognizeFace"]) {
NSAssert([sender isKindOfClass:[UIImage class]],@"RecognizeFace segue MUST be sent with an image");
FJFaceRecognitionViewController *frvc = segue.destinationViewController;
frvc.inputImage = sender;
}
}
@end
================================================
FILE: FaceRec/Images.xcassets/AppIcon.appiconset/Contents.json
================================================
{
"images" : [
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "60x60",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "60x60",
"scale" : "3x"
},
{
"idiom" : "ipad",
"size" : "29x29",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "29x29",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "40x40",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "40x40",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "76x76",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "76x76",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: FaceRec/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>com.fifteenjugglers.$(PRODUCT_NAME:rfc1034identifier)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
</dict>
</plist>
================================================
FILE: FaceRec/UIImage+OpenCV.h
================================================
//
// UIImage+OpenCV.h
// opencvtest
//
// Created by Engin Kurutepe on 26/01/15.
// Copyright (c) 2015 Fifteen Jugglers Software. All rights reserved.
//
#import <UIKit/UIKit.h>
#ifdef __cplusplus
#import <opencv2/opencv.hpp>
#endif
@interface UIImage (OpenCV)
+ (UIImage *)imageFromCVMat:(cv::Mat)mat;
- (cv::Mat)cvMatRepresentationColor;
- (cv::Mat)cvMatRepresentationGray;
@end
================================================
FILE: FaceRec/UIImage+OpenCV.mm
================================================
//
// UIImage+OpenCV.m
// opencvtest
//
// Created by Engin Kurutepe on 26/01/15.
// Copyright (c) 2015 Fifteen Jugglers Software. All rights reserved.
//
#import "UIImage+OpenCV.h"
using namespace cv;
@implementation UIImage (OpenCV)
+ (UIImage *)imageFromCVMat:(cv::Mat)cvMat {
NSData *data = [NSData dataWithBytes:cvMat.data length:cvMat.elemSize()*cvMat.total()];
CGColorSpaceRef colorSpace;
if (cvMat.elemSize() == 1) {
colorSpace = CGColorSpaceCreateDeviceGray();
} else {
colorSpace = CGColorSpaceCreateDeviceRGB();
}
CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data);
// Creating CGImage from cv::Mat
CGImageRef imageRef = CGImageCreate(cvMat.cols, //width
cvMat.rows, //height
8, //bits per component
8 * cvMat.elemSize(), //bits per pixel
cvMat.step[0], //bytesPerRow
colorSpace, //colorspace
kCGImageAlphaNone|kCGBitmapByteOrderDefault,// bitmap info
provider, //CGDataProviderRef
NULL, //decode
false, //should interpolate
kCGRenderingIntentDefault //intent
);
// Getting UIImage from CGImage
UIImage *finalImage = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
CGDataProviderRelease(provider);
CGColorSpaceRelease(colorSpace);
return finalImage;
}
- (cv::Mat)cvMatRepresentationColor
{
CGColorSpaceRef colorSpace = CGImageGetColorSpace(self.CGImage);
CGFloat cols = self.size.width;
CGFloat rows = self.size.height;
cv::Mat color(rows, cols, CV_8UC4); // 8 bits per component, 4 channels (color channels + alpha)
CGContextRef contextRef = CGBitmapContextCreate(color.data, // Pointer to data
cols, // Width of bitmap
rows, // Height of bitmap
8, // Bits per component
color.step[0], // Bytes per row
colorSpace, // Colorspace
kCGImageAlphaNoneSkipLast |
kCGBitmapByteOrderDefault); // Bitmap info flags
CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), self.CGImage);
CGContextRelease(contextRef);
return color;
}
- (cv::Mat)cvMatRepresentationGray
{
CGColorSpaceRef colorSpace = CGImageGetColorSpace(self.CGImage);
int cols = self.size.width;
int rows = self.size.height;
Mat gray(rows, cols, CV_8UC1);
NSLog(@"cols %d rows %d step %zu", cols, rows, gray.step[0]);
CGContextRef contextRef = CGBitmapContextCreate(gray.data, // Pointer to data
cols, // Width of bitmap
rows, // Height of bitmap
8, // Bits per component
gray.step[0], // Bytes per row
colorSpace, // Colorspace
kCGBitmapByteOrderDefault); // Bitmap info flags
CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), self.CGImage);
CGContextRelease(contextRef);
return gray;
}
@end
================================================
FILE: FaceRec/haarcascade_eye_tree_eyeglasses.xml
================================================
<?xml version="1.0"?>
<!--
Tree-based 20x20 frontal eye detector with better handling of eyeglasses.
Created by Shameem Hameed (http://umich.edu/~shameem)
////////////////////////////////////////////////////////////////////////////////////////
IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
By downloading, copying, installing or using the software you agree to this license.
If you do not agree to this license, do not download, install,
copy or use the software.
Intel License Agreement
For Open Source Computer Vision Library
Copyright (C) 2000, Intel Corporation, all rights reserved.
Third party copyrights are property of their respective owners.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
* Redistribution's of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistribution's in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* The name of Intel Corporation may not be used to endorse or promote products
derived from this software without specific prior written permission.
This software is provided by the copyright holders and contributors "as is" and
any express or implied warranties, including, but not limited to, the implied
warranties of merchantability and fitness for a particular purpose are disclaimed.
In no event shall the Intel Corporation or contributors be liable for any direct,
indirect, incidental, special, exemplary, or consequential damages
(including, but not limited to, procurement of substitute goods or services;
loss of use, data, or profits; or business interruption) however caused
and on any theory of liability, whether in contract, strict liability,
or tort (including negligence or otherwise) arising in any way out of
the use of this software, even if advised of the possibility of such damage.
-->
<opencv_storage>
<haarcascade_eye_tree type_id="opencv-haar-classifier">
<size>
20 20</size>
<stages>
<_>
<!-- stage 0 -->
<trees>
<_>
<!-- tree 0 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
8 7 12 1 -1.</_>
<_>
8 7 6 1 2.</_></rects>
<tilted>1</tilted></feature>
<threshold>-0.0269871093332767</threshold>
<left_node>2</left_node>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
4 7 8 6 -1.</_>
<_>
6 7 4 6 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>0.0506705306470394</threshold>
<left_val>-0.8039547204971314</left_val>
<right_val>0.6049140095710754</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
5 3 12 12 -1.</_>
<_>
9 7 4 4 9.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.1291539072990418</threshold>
<left_val>0.9054458141326904</left_val>
<right_val>0.0440708100795746</right_val></_></_>
<_>
<!-- tree 1 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
1 8 12 12 -1.</_>
<_>
1 14 12 6 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>0.0888277366757393</threshold>
<left_node>2</left_node>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
5 9 9 5 -1.</_>
<_>
8 9 3 5 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0203982405364513</threshold>
<left_val>0.7921888232231140</left_val>
<right_val>0.0406922996044159</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
5 7 9 6 -1.</_>
<_>
8 7 3 6 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0612617582082748</threshold>
<left_val>0.4258536100387573</left_val>
<right_val>-0.7032520771026611</right_val></_></_>
<_>
<!-- tree 2 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
2 0 18 15 -1.</_>
<_>
2 5 18 5 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.2049081027507782</threshold>
<left_node>2</left_node>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
7 1 9 9 -1.</_>
<_>
7 4 9 3 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>0.0949330478906631</threshold>
<left_val>-0.4401764869689941</left_val>
<right_val>0.5364052057266235</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
8 19 3 1 -1.</_>
<_>
9 19 1 1 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>1.2091030366718769e-003</threshold>
<left_val>0.6877645850181580</left_val>
<right_val>-0.5587934851646423</right_val></_></_>
<_>
<!-- tree 3 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
5 17 2 2 -1.</_>
<_>
5 17 1 1 2.</_>
<_>
6 18 1 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>9.2227972345426679e-004</threshold>
<left_node>1</left_node>
<right_val>-0.7268440127372742</right_val></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
5 17 2 2 -1.</_>
<_>
5 17 1 1 2.</_>
<_>
6 18 1 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-7.2678289143368602e-004</threshold>
<left_val>-0.5802800059318543</left_val>
<right_node>2</right_node></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
10 18 3 1 -1.</_>
<_>
11 18 1 1 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>6.8421510513871908e-004</threshold>
<left_val>0.5617753267288208</left_val>
<right_val>-0.2983418107032776</right_val></_></_>
<_>
<!-- tree 4 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
7 7 9 7 -1.</_>
<_>
10 7 3 7 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0511505901813507</threshold>
<left_val>0.5984076261520386</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
6 8 12 5 -1.</_>
<_>
9 8 6 5 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>0.0616220608353615</threshold>
<left_node>2</left_node>
<right_val>0.7474393248558044</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
13 1 6 7 -1.</_>
<_>
13 1 3 7 2.</_></rects>
<tilted>1</tilted></feature>
<threshold>0.0728734731674194</threshold>
<left_val>-0.4970377981662750</left_val>
<right_val>0.2812925875186920</right_val></_></_></trees>
<stage_threshold>-1.6473180055618286</stage_threshold>
<parent>-1</parent>
<next>-1</next></_>
<_>
<!-- stage 1 -->
<trees>
<_>
<!-- tree 0 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
5 2 12 15 -1.</_>
<_>
9 7 4 5 9.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.4199487864971161</threshold>
<left_node>2</left_node>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
6 5 14 1 -1.</_>
<_>
6 5 7 1 2.</_></rects>
<tilted>1</tilted></feature>
<threshold>-0.0561862885951996</threshold>
<left_val>0.2758620083332062</left_val>
<right_val>-0.6462321877479553</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
9 9 10 1 -1.</_>
<_>
9 9 5 1 2.</_></rects>
<tilted>1</tilted></feature>
<threshold>-0.0237111095339060</threshold>
<left_val>0.8524125218391419</left_val>
<right_val>8.3703370764851570e-003</right_val></_></_>
<_>
<!-- tree 1 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
2 9 9 3 -1.</_>
<_>
5 9 3 3 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>0.0405234396457672</threshold>
<left_node>1</left_node>
<right_val>0.7427021861076355</right_val></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
0 8 20 12 -1.</_>
<_>
0 14 20 6 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>0.2738890051841736</threshold>
<left_val>-0.4928669035434723</left_val>
<right_node>2</right_node></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
0 5 4 13 -1.</_>
<_>
2 5 2 13 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0142938001081347</threshold>
<left_val>0.7178478837013245</left_val>
<right_val>-0.0422239787876606</right_val></_></_>
<_>
<!-- tree 2 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
11 18 3 2 -1.</_>
<_>
12 18 1 2 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-2.1144729107618332e-003</threshold>
<left_val>-0.8019660115242004</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
11 18 3 1 -1.</_>
<_>
12 18 1 1 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>1.0659949621185660e-003</threshold>
<left_node>2</left_node>
<right_val>-0.6602591276168823</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
11 19 3 1 -1.</_>
<_>
12 19 1 1 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>1.0812469990924001e-003</threshold>
<left_val>0.4791637063026428</left_val>
<right_val>-0.5164529085159302</right_val></_></_>
<_>
<!-- tree 3 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
10 9 9 3 -1.</_>
<_>
13 9 3 3 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>0.0301982890814543</threshold>
<left_node>1</left_node>
<right_val>0.5132756233215332</right_val></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
5 8 8 7 -1.</_>
<_>
7 8 4 7 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>0.0405695512890816</threshold>
<left_node>2</left_node>
<right_val>0.6664149761199951</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
8 6 9 8 -1.</_>
<_>
11 6 3 8 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>0.0706797391176224</threshold>
<left_val>-0.4529865980148315</left_val>
<right_val>0.5548071861267090</right_val></_></_>
<_>
<!-- tree 4 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
4 18 2 2 -1.</_>
<_>
4 18 1 1 2.</_>
<_>
5 19 1 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-7.8928138827905059e-004</threshold>
<left_val>-0.7252629995346069</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
4 18 2 2 -1.</_>
<_>
4 18 1 1 2.</_>
<_>
5 19 1 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>8.0574717139825225e-004</threshold>
<left_node>2</left_node>
<right_val>-0.5647987127304077</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
7 6 8 14 -1.</_>
<_>
9 6 4 14 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0209765601903200</threshold>
<left_val>0.6999353766441345</left_val>
<right_val>0.0685004666447639</right_val></_></_>
<_>
<!-- tree 5 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
16 13 4 3 -1.</_>
<_>
15 14 4 1 3.</_></rects>
<tilted>1</tilted></feature>
<threshold>0.0127949602901936</threshold>
<left_node>1</left_node>
<right_val>-0.8640956878662109</right_val></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
16 13 4 2 -1.</_>
<_>
16 13 2 2 2.</_></rects>
<tilted>1</tilted></feature>
<threshold>-8.1120636314153671e-003</threshold>
<left_val>0.4444836080074310</left_val>
<right_node>2</right_node></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
5 6 6 14 -1.</_>
<_>
7 6 2 14 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0155065301805735</threshold>
<left_val>0.3667531013488770</left_val>
<right_val>-0.2918907105922699</right_val></_></_>
<_>
<!-- tree 6 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
0 7 8 11 -1.</_>
<_>
2 7 4 11 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0129156503826380</threshold>
<left_node>2</left_node>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
0 7 8 7 -1.</_>
<_>
2 7 4 7 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>6.6297221928834915e-003</threshold>
<left_val>-0.4756678044795990</left_val>
<right_val>0.1035035029053688</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
2 16 3 1 -1.</_>
<_>
3 17 1 1 3.</_></rects>
<tilted>1</tilted></feature>
<threshold>-3.6532930098474026e-003</threshold>
<left_val>-0.6172305941581726</left_val>
<right_val>0.5438253283500671</right_val></_></_></trees>
<stage_threshold>-1.4257860183715820</stage_threshold>
<parent>0</parent>
<next>-1</next></_>
<_>
<!-- stage 2 -->
<trees>
<_>
<!-- tree 0 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
3 0 15 18 -1.</_>
<_>
8 6 5 6 9.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.7873197197914124</threshold>
<left_val>0.7126883864402771</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
0 6 20 14 -1.</_>
<_>
0 13 20 7 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>0.1690800935029984</threshold>
<left_val>-0.7190899848937988</left_val>
<right_node>2</right_node></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
6 7 9 7 -1.</_>
<_>
9 7 3 7 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0403696894645691</threshold>
<left_val>0.4414893090724945</left_val>
<right_val>-0.4225192964076996</right_val></_></_>
<_>
<!-- tree 1 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
3 9 6 2 -1.</_>
<_>
5 9 2 2 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>0.0191323608160019</threshold>
<left_node>1</left_node>
<right_val>0.6918622851371765</right_val></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
17 16 2 2 -1.</_>
<_>
17 16 1 1 2.</_>
<_>
18 17 1 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>6.4184539951384068e-004</threshold>
<left_node>2</left_node>
<right_val>-0.7611696720123291</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
17 16 2 2 -1.</_>
<_>
17 16 1 1 2.</_>
<_>
18 17 1 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-7.8941037645563483e-004</threshold>
<left_val>-0.6814042925834656</left_val>
<right_val>0.1600991934537888</right_val></_></_>
<_>
<!-- tree 2 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
14 8 6 5 -1.</_>
<_>
16 8 2 5 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-7.1503049694001675e-003</threshold>
<left_node>1</left_node>
<right_node>2</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
16 18 4 2 -1.</_>
<_>
16 19 4 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-2.3156129755079746e-003</threshold>
<left_val>-0.5591660737991333</left_val>
<right_val>0.5128449797630310</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
8 8 9 12 -1.</_>
<_>
11 8 3 12 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0415212698280811</threshold>
<left_val>0.2442256957292557</left_val>
<right_val>-0.4688340127468109</right_val></_></_>
<_>
<!-- tree 3 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
8 18 3 1 -1.</_>
<_>
9 18 1 1 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>9.1200548922643065e-004</threshold>
<left_node>1</left_node>
<right_val>-0.6952788829803467</right_val></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
8 18 3 2 -1.</_>
<_>
9 18 1 2 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-1.5798299573361874e-003</threshold>
<left_val>-0.6350964903831482</left_val>
<right_node>2</right_node></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
0 8 4 11 -1.</_>
<_>
2 8 2 11 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0115736499428749</threshold>
<left_val>0.6468638181686401</left_val>
<right_val>6.9198559504002333e-004</right_val></_></_>
<_>
<!-- tree 4 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
10 0 10 1 -1.</_>
<_>
15 0 5 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>2.1843519061803818e-003</threshold>
<left_node>2</left_node>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
13 1 3 3 -1.</_>
<_>
14 1 1 3 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>2.9345690272748470e-003</threshold>
<left_val>0.4563289880752564</left_val>
<right_val>-0.5884143710136414</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
2 8 12 12 -1.</_>
<_>
6 8 4 12 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0587881505489349</threshold>
<left_val>0.2670420110225678</left_val>
<right_val>-0.3834899067878723</right_val></_></_>
<_>
<!-- tree 5 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
18 17 1 3 -1.</_>
<_>
18 18 1 1 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-5.5392808280885220e-004</threshold>
<left_val>-0.4891336858272553</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
18 18 1 2 -1.</_>
<_>
18 19 1 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-5.3035060409456491e-004</threshold>
<left_val>-0.3842155039310455</left_val>
<right_node>2</right_node></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
8 10 6 5 -1.</_>
<_>
10 10 2 5 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-6.8775108084082603e-003</threshold>
<left_val>0.6684569716453552</left_val>
<right_val>0.0931582599878311</right_val></_></_>
<_>
<!-- tree 6 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
13 17 3 2 -1.</_>
<_>
14 17 1 2 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>1.6710379859432578e-003</threshold>
<left_node>1</left_node>
<right_val>-0.6036937236785889</right_val></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
0 4 6 12 -1.</_>
<_>
0 8 6 4 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>1.4162790030241013e-003</threshold>
<left_node>2</left_node>
<right_val>-0.3041876852512360</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
0 8 5 4 -1.</_>
<_>
0 9 5 2 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>7.7876187860965729e-003</threshold>
<left_val>0.3969906866550446</left_val>
<right_val>-0.6668758988380432</right_val></_></_>
<_>
<!-- tree 7 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
13 6 4 6 -1.</_>
<_>
14 7 2 6 2.</_></rects>
<tilted>1</tilted></feature>
<threshold>-0.0129167800769210</threshold>
<left_node>1</left_node>
<right_node>2</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
4 2 3 2 -1.</_>
<_>
5 2 1 2 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-3.0156269203871489e-003</threshold>
<left_val>-0.7123972773551941</left_val>
<right_val>0.4625298976898193</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
11 2 8 17 -1.</_>
<_>
13 2 4 17 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0197859406471252</threshold>
<left_val>0.2833831906318665</left_val>
<right_val>-0.3531793057918549</right_val></_></_>
<_>
<!-- tree 8 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
15 0 3 3 -1.</_>
<_>
16 0 1 3 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>3.3207770902663469e-003</threshold>
<left_node>1</left_node>
<right_val>-0.7329139709472656</right_val></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
10 5 9 13 -1.</_>
<_>
13 5 3 13 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>0.0296062398701906</threshold>
<left_node>2</left_node>
<right_val>0.4953075945377350</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
5 8 8 6 -1.</_>
<_>
7 8 4 6 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>0.0446147881448269</threshold>
<left_val>-0.1950280964374542</left_val>
<right_val>0.7981641888618469</right_val></_></_></trees>
<stage_threshold>-1.4711019992828369</stage_threshold>
<parent>1</parent>
<next>-1</next></_>
<_>
<!-- stage 3 -->
<trees>
<_>
<!-- tree 0 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
3 1 15 18 -1.</_>
<_>
8 7 5 6 9.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.9236614108085632</threshold>
<left_val>0.7691580057144165</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
6 7 9 8 -1.</_>
<_>
9 7 3 8 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0481939390301704</threshold>
<left_node>2</left_node>
<right_val>-0.5136122703552246</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
0 6 20 14 -1.</_>
<_>
0 13 20 7 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>0.2866987884044647</threshold>
<left_val>-0.2967190146446228</left_val>
<right_val>0.6202818751335144</right_val></_></_>
<_>
<!-- tree 1 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
1 7 6 7 -1.</_>
<_>
3 7 2 7 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0130381602793932</threshold>
<left_node>1</left_node>
<right_node>2</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
9 19 3 1 -1.</_>
<_>
10 19 1 1 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-1.4749659458175302e-003</threshold>
<left_val>-0.7129424810409546</left_val>
<right_val>0.5911517739295960</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
4 6 9 7 -1.</_>
<_>
7 6 3 7 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0469217486679554</threshold>
<left_val>0.3130356073379517</left_val>
<right_val>-0.3674969077110291</right_val></_></_>
<_>
<!-- tree 2 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
18 10 1 10 -1.</_>
<_>
18 15 1 5 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>2.4459899868816137e-003</threshold>
<left_val>-0.4693000018596649</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
12 16 2 4 -1.</_>
<_>
12 16 1 2 2.</_>
<_>
13 18 1 2 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-2.5321498978883028e-003</threshold>
<left_val>-0.7745016217231751</left_val>
<right_node>2</right_node></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
12 19 4 1 -1.</_>
<_>
13 19 2 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>1.4651260571554303e-003</threshold>
<left_val>0.3641478121280670</left_val>
<right_val>-0.5744588971138001</right_val></_></_>
<_>
<!-- tree 3 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
9 5 6 15 -1.</_>
<_>
11 5 2 15 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0113074202090502</threshold>
<left_node>1</left_node>
<right_node>2</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
10 18 4 1 -1.</_>
<_>
11 18 2 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-1.2048849603161216e-003</threshold>
<left_val>-0.5572764873504639</left_val>
<right_val>0.4787167012691498</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
1 0 12 16 -1.</_>
<_>
5 0 4 16 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0627528727054596</threshold>
<left_val>0.2278853058815002</left_val>
<right_val>-0.4366796910762787</right_val></_></_>
<_>
<!-- tree 4 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
0 13 3 3 -1.</_>
<_>
0 14 3 1 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-4.0173111483454704e-003</threshold>
<left_val>-0.7356877923011780</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
1 13 1 3 -1.</_>
<_>
1 14 1 1 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>1.5160309849306941e-003</threshold>
<left_node>2</left_node>
<right_val>-0.5848069787025452</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
14 0 6 1 -1.</_>
<_>
17 0 3 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>1.9954680465161800e-003</threshold>
<left_val>0.0215440206229687</left_val>
<right_val>0.5587568879127502</right_val></_></_>
<_>
<!-- tree 5 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
12 0 3 3 -1.</_>
<_>
13 0 1 3 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>3.4435209818184376e-003</threshold>
<left_node>1</left_node>
<right_val>-0.7656589746475220</right_val></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
12 1 3 2 -1.</_>
<_>
13 1 1 2 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-2.6550020556896925e-003</threshold>
<left_val>-0.6544749736785889</left_val>
<right_node>2</right_node></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
14 2 6 13 -1.</_>
<_>
16 2 2 13 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0114076901227236</threshold>
<left_val>0.5363308191299439</left_val>
<right_val>-0.0388491712510586</right_val></_></_>
<_>
<!-- tree 6 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
12 4 6 1 -1.</_>
<_>
14 6 2 1 3.</_></rects>
<tilted>1</tilted></feature>
<threshold>-2.3805440869182348e-003</threshold>
<left_node>1</left_node>
<right_node>2</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
15 6 5 2 -1.</_>
<_>
15 7 5 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>6.6475258208811283e-003</threshold>
<left_val>0.3398441076278687</left_val>
<right_val>-0.6502509117126465</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
9 0 5 12 -1.</_>
<_>
9 4 5 4 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>0.1401824057102203</threshold>
<left_val>-0.3249109089374542</left_val>
<right_val>0.7506706714630127</right_val></_></_>
<_>
<!-- tree 7 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
6 1 13 9 -1.</_>
<_>
6 4 13 3 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0623583607375622</threshold>
<left_val>0.4577716886997223</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
16 0 3 2 -1.</_>
<_>
17 0 1 2 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>1.3628599699586630e-003</threshold>
<left_node>2</left_node>
<right_val>-0.6320266127586365</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
6 0 4 2 -1.</_>
<_>
6 0 2 2 2.</_></rects>
<tilted>1</tilted></feature>
<threshold>-4.4609848409891129e-003</threshold>
<left_val>0.4059796035289764</left_val>
<right_val>-0.2085406929254532</right_val></_></_>
<_>
<!-- tree 8 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
4 2 3 3 -1.</_>
<_>
3 3 3 1 3.</_></rects>
<tilted>1</tilted></feature>
<threshold>-0.0100468397140503</threshold>
<left_val>-0.7478982806205750</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
7 1 13 6 -1.</_>
<_>
5 3 13 2 3.</_></rects>
<tilted>1</tilted></feature>
<threshold>-0.0292748194187880</threshold>
<left_node>2</left_node>
<right_val>-0.1799547970294952</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
3 2 2 3 -1.</_>
<_>
2 3 2 1 3.</_></rects>
<tilted>1</tilted></feature>
<threshold>7.7389390207827091e-003</threshold>
<left_val>0.4778284132480621</left_val>
<right_val>-0.6511334180831909</right_val></_></_>
<_>
<!-- tree 9 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
17 0 3 1 -1.</_>
<_>
18 0 1 1 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>1.4774020528420806e-003</threshold>
<left_node>1</left_node>
<right_val>-0.6626989841461182</right_val></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
1 12 5 6 -1.</_>
<_>
1 15 5 3 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>0.0149898203089833</threshold>
<left_val>-0.1669555008411408</left_val>
<right_node>2</right_node></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
5 14 3 1 -1.</_>
<_>
6 15 1 1 3.</_></rects>
<tilted>1</tilted></feature>
<threshold>4.5073241926729679e-003</threshold>
<left_val>0.3870205879211426</left_val>
<right_val>-0.7340937256813049</right_val></_></_>
<_>
<!-- tree 10 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
0 7 7 3 -1.</_>
<_>
0 8 7 1 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>1.4901049435138702e-003</threshold>
<left_node>1</left_node>
<right_val>-0.3428083956241608</right_val></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
0 8 2 4 -1.</_>
<_>
0 9 2 2 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>8.9141662465408444e-004</threshold>
<left_node>2</left_node>
<right_val>-0.2803674042224884</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
7 2 4 3 -1.</_>
<_>
6 3 4 1 3.</_></rects>
<tilted>1</tilted></feature>
<threshold>-0.0115582197904587</threshold>
<left_val>-0.4252395927906036</left_val>
<right_val>0.4525966942310333</right_val></_></_>
<_>
<!-- tree 11 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
6 7 6 10 -1.</_>
<_>
8 7 2 10 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0200119502842426</threshold>
<left_val>0.4013311862945557</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
2 5 8 12 -1.</_>
<_>
4 5 4 12 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0170923005789518</threshold>
<left_val>0.3697001039981842</left_val>
<right_node>2</right_node></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
4 0 12 4 -1.</_>
<_>
4 2 12 2 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0676851719617844</threshold>
<left_val>0.7443867921829224</left_val>
<right_val>-0.3825584053993225</right_val></_></_></trees>
<stage_threshold>-1.3850779533386230</stage_threshold>
<parent>2</parent>
<next>-1</next></_>
<_>
<!-- stage 4 -->
<trees>
<_>
<!-- tree 0 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
7 8 8 12 -1.</_>
<_>
9 8 4 12 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0209111496806145</threshold>
<left_node>1</left_node>
<right_node>2</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
8 6 11 14 -1.</_>
<_>
8 13 11 7 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>0.1430570930242539</threshold>
<left_val>-0.3496556878089905</left_val>
<right_val>0.7013456225395203</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
16 9 4 9 -1.</_>
<_>
18 9 2 9 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>0.0119250295683742</threshold>
<left_val>-0.6040462851524353</left_val>
<right_val>0.0856159031391144</right_val></_></_>
<_>
<!-- tree 1 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
12 9 6 2 -1.</_>
<_>
14 9 2 2 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>0.0247420091181993</threshold>
<left_node>1</left_node>
<right_val>0.8536558747291565</right_val></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
6 1 10 6 -1.</_>
<_>
6 3 10 2 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>0.0457321181893349</threshold>
<left_node>2</left_node>
<right_val>0.4187641143798828</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
5 0 4 5 -1.</_>
<_>
5 0 2 5 2.</_></rects>
<tilted>1</tilted></feature>
<threshold>0.0432044304907322</threshold>
<left_val>-0.3909491896629334</left_val>
<right_val>0.2738798856735230</right_val></_></_>
<_>
<!-- tree 2 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
2 17 1 3 -1.</_>
<_>
2 18 1 1 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-7.2548422031104565e-004</threshold>
<left_val>-0.6201112270355225</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
2 17 1 3 -1.</_>
<_>
2 18 1 1 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>1.4243220211938024e-003</threshold>
<left_node>2</left_node>
<right_val>-0.6158943772315979</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
8 0 12 2 -1.</_>
<_>
12 0 4 2 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-5.3335479460656643e-003</threshold>
<left_val>0.6059644818305969</left_val>
<right_val>0.0158404801040888</right_val></_></_>
<_>
<!-- tree 3 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
0 8 6 5 -1.</_>
<_>
2 8 2 5 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-7.1891010738909245e-003</threshold>
<left_node>1</left_node>
<right_val>-0.2085282951593399</right_val></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
8 18 4 1 -1.</_>
<_>
9 18 2 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>1.8233320442959666e-003</threshold>
<left_node>2</left_node>
<right_val>-0.8133838176727295</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
10 18 2 1 -1.</_>
<_>
11 18 1 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>1.6109029529616237e-003</threshold>
<left_val>0.5678064823150635</left_val>
<right_val>-0.8704625964164734</right_val></_></_>
<_>
<!-- tree 4 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
7 2 9 3 -1.</_>
<_>
10 5 3 3 3.</_></rects>
<tilted>1</tilted></feature>
<threshold>-0.0483502782881260</threshold>
<left_node>2</left_node>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
8 3 5 6 -1.</_>
<_>
8 5 5 2 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>0.0317461714148521</threshold>
<left_val>-0.3533582091331482</left_val>
<right_val>0.4407657086849213</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
0 14 1 3 -1.</_>
<_>
0 15 1 1 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>1.9233829807490110e-003</threshold>
<left_val>0.4073063135147095</left_val>
<right_val>-0.5959256887435913</right_val></_></_>
<_>
<!-- tree 5 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
12 17 3 2 -1.</_>
<_>
13 17 1 2 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>1.3614529743790627e-003</threshold>
<left_node>1</left_node>
<right_val>-0.5530725121498108</right_val></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
12 17 3 3 -1.</_>
<_>
13 17 1 3 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-3.6934199742972851e-003</threshold>
<left_val>-0.7316309809684753</left_val>
<right_node>2</right_node></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
7 9 1 4 -1.</_>
<_>
6 10 1 2 2.</_></rects>
<tilted>1</tilted></feature>
<threshold>-8.5378461517393589e-004</threshold>
<left_val>0.4389067888259888</left_val>
<right_val>-0.0630091726779938</right_val></_></_>
<_>
<!-- tree 6 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
12 7 8 8 -1.</_>
<_>
14 7 4 8 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0109507702291012</threshold>
<left_val>0.3926307857036591</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
7 10 4 6 -1.</_>
<_>
5 12 4 2 3.</_></rects>
<tilted>1</tilted></feature>
<threshold>-7.2186449542641640e-003</threshold>
<left_val>0.2722525000572205</left_val>
<right_node>2</right_node></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
0 6 4 10 -1.</_>
<_>
2 6 2 10 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>0.0185482893139124</threshold>
<left_val>-0.4120861887931824</left_val>
<right_val>0.6379063725471497</right_val></_></_>
<_>
<!-- tree 7 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
19 9 1 3 -1.</_>
<_>
19 10 1 1 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>1.0859060566872358e-003</threshold>
<left_node>1</left_node>
<right_val>-0.5085721015930176</right_val></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
16 1 4 15 -1.</_>
<_>
17 2 2 15 2.</_></rects>
<tilted>1</tilted></feature>
<threshold>-6.5618362277746201e-003</threshold>
<left_val>0.3538672924041748</left_val>
<right_node>2</right_node></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
14 5 6 7 -1.</_>
<_>
16 7 2 7 3.</_></rects>
<tilted>1</tilted></feature>
<threshold>-0.0617774203419685</threshold>
<left_val>0.5756828188896179</left_val>
<right_val>-0.2847724854946137</right_val></_></_>
<_>
<!-- tree 8 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
18 18 2 2 -1.</_>
<_>
18 18 1 1 2.</_>
<_>
19 19 1 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>4.9480778397992253e-004</threshold>
<left_node>1</left_node>
<right_val>-0.4958389103412628</right_val></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
0 7 4 6 -1.</_>
<_>
0 9 4 2 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>0.0116068804636598</threshold>
<left_node>2</left_node>
<right_val>-0.5132020115852356</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
16 9 4 4 -1.</_>
<_>
17 9 2 4 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-1.6142609529197216e-003</threshold>
<left_val>0.5266572833061218</left_val>
<right_val>0.0309171602129936</right_val></_></_>
<_>
<!-- tree 9 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
0 15 1 3 -1.</_>
<_>
0 16 1 1 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>2.0437680650502443e-003</threshold>
<left_node>1</left_node>
<right_val>-0.7094858884811401</right_val></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
7 5 10 3 -1.</_>
<_>
6 6 10 1 3.</_></rects>
<tilted>1</tilted></feature>
<threshold>-8.2394909113645554e-003</threshold>
<left_val>0.3418981134891510</left_val>
<right_node>2</right_node></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
9 7 9 7 -1.</_>
<_>
12 7 3 7 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0396992117166519</threshold>
<left_val>0.4738334119319916</left_val>
<right_val>-0.2506085038185120</right_val></_></_>
<_>
<!-- tree 10 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
14 4 6 8 -1.</_>
<_>
14 6 6 4 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-8.0377282574772835e-004</threshold>
<left_node>1</left_node>
<right_node>2</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
17 6 3 1 -1.</_>
<_>
18 7 1 1 3.</_></rects>
<tilted>1</tilted></feature>
<threshold>-5.4273242130875587e-003</threshold>
<left_val>-0.5138400793075562</left_val>
<right_val>0.2975271046161652</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
17 1 3 8 -1.</_>
<_>
17 3 3 4 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-5.2662738598883152e-003</threshold>
<left_val>0.1457702964544296</left_val>
<right_val>-0.4600752890110016</right_val></_></_>
<_>
<!-- tree 11 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
0 10 1 3 -1.</_>
<_>
0 11 1 1 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>6.3841522205621004e-004</threshold>
<left_node>1</left_node>
<right_val>-0.3641282916069031</right_val></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
5 2 3 1 -1.</_>
<_>
6 2 1 1 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-1.5458120033144951e-003</threshold>
<left_val>-0.5808160901069641</left_val>
<right_node>2</right_node></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
5 2 3 1 -1.</_>
<_>
6 2 1 1 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>1.1863360414281487e-003</threshold>
<left_val>0.2929860949516296</left_val>
<right_val>-0.5142071843147278</right_val></_></_></trees>
<stage_threshold>-1.4432040452957153</stage_threshold>
<parent>3</parent>
<next>-1</next></_>
<_>
<!-- stage 5 -->
<trees>
<_>
<!-- tree 0 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
6 2 9 15 -1.</_>
<_>
9 7 3 5 9.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.2774501144886017</threshold>
<left_node>1</left_node>
<right_node>2</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
0 9 6 3 -1.</_>
<_>
2 9 2 3 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-3.1200000084936619e-003</threshold>
<left_val>0.8326563835144043</left_val>
<right_val>0.1023318991065025</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
9 6 6 9 -1.</_>
<_>
11 9 2 3 9.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0802809223532677</threshold>
<left_val>0.2377357929944992</left_val>
<right_val>-0.6454666256904602</right_val></_></_>
<_>
<!-- tree 1 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
4 3 12 9 -1.</_>
<_>
4 6 12 3 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0693915486335754</threshold>
<left_val>0.4600824117660523</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
8 5 6 4 -1.</_>
<_>
8 6 6 2 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>5.3355181589722633e-003</threshold>
<left_node>2</left_node>
<right_val>0.2913798987865448</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
0 1 17 8 -1.</_>
<_>
0 3 17 4 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0541896186769009</threshold>
<left_val>0.4702672958374023</left_val>
<right_val>-0.5772340297698975</right_val></_></_>
<_>
<!-- tree 2 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
2 10 9 1 -1.</_>
<_>
5 10 3 1 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>0.0185629595071077</threshold>
<left_node>1</left_node>
<right_val>0.7055550217628479</right_val></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
2 11 9 8 -1.</_>
<_>
2 15 9 4 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>0.0463057309389114</threshold>
<left_val>-0.5283988118171692</left_val>
<right_node>2</right_node></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
14 0 6 15 -1.</_>
<_>
16 0 2 15 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-8.8262781500816345e-003</threshold>
<left_val>0.4395360946655273</left_val>
<right_val>-0.1388749033212662</right_val></_></_>
<_>
<!-- tree 3 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
17 6 2 9 -1.</_>
<_>
17 9 2 3 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-2.8772179502993822e-003</threshold>
<left_node>1</left_node>
<right_val>-0.2747583091259003</right_val></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
16 16 1 3 -1.</_>
<_>
15 17 1 1 3.</_></rects>
<tilted>1</tilted></feature>
<threshold>-2.6457069907337427e-003</threshold>
<left_val>-0.5774679780006409</left_val>
<right_node>2</right_node></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
7 0 4 2 -1.</_>
<_>
8 0 2 2 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>3.3441530540585518e-003</threshold>
<left_val>0.3661524057388306</left_val>
<right_val>-0.6358674168586731</right_val></_></_>
<_>
<!-- tree 4 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
6 0 12 15 -1.</_>
<_>
10 0 4 15 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0837423726916313</threshold>
<left_node>2</left_node>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
7 8 12 6 -1.</_>
<_>
11 8 4 6 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>0.1016476973891258</threshold>
<left_val>-0.2966451942920685</left_val>
<right_val>0.5614004731178284</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
11 18 4 1 -1.</_>
<_>
12 18 2 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-2.1541758906096220e-003</threshold>
<left_val>-0.7544627189636231</left_val>
<right_val>0.3960126042366028</right_val></_></_>
<_>
<!-- tree 5 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
8 18 4 1 -1.</_>
<_>
9 18 2 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-1.7133549554273486e-003</threshold>
<left_val>-0.7374163269996643</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
7 0 8 4 -1.</_>
<_>
7 2 8 2 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>0.0138994101434946</threshold>
<left_node>2</left_node>
<right_val>0.4824739098548889</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
8 0 12 8 -1.</_>
<_>
8 2 12 4 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0284981206059456</threshold>
<left_val>0.4197104871273041</left_val>
<right_val>-0.2002128958702087</right_val></_></_>
<_>
<!-- tree 6 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
4 9 6 3 -1.</_>
<_>
6 9 2 3 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-4.9728769809007645e-003</threshold>
<left_val>0.3763135075569153</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
0 4 9 12 -1.</_>
<_>
3 8 3 4 9.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0347518809139729</threshold>
<left_node>2</left_node>
<right_val>-0.4479779005050659</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
6 18 1 2 -1.</_>
<_>
6 19 1 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-8.7171117775142193e-004</threshold>
<left_val>-0.6999509930610657</left_val>
<right_val>0.1564090996980667</right_val></_></_>
<_>
<!-- tree 7 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
9 2 4 2 -1.</_>
<_>
10 2 2 2 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-3.3666230738162994e-003</threshold>
<left_val>-0.6772192120552063</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
6 1 8 17 -1.</_>
<_>
8 1 4 17 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0213788300752640</threshold>
<left_val>0.3395152986049652</left_val>
<right_node>2</right_node></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
13 9 4 4 -1.</_>
<_>
14 10 2 4 2.</_></rects>
<tilted>1</tilted></feature>
<threshold>-0.0118692498654127</threshold>
<left_val>0.5405067205429077</left_val>
<right_val>-0.2407158017158508</right_val></_></_>
<_>
<!-- tree 8 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
7 1 4 3 -1.</_>
<_>
8 1 2 3 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-4.4268160127103329e-003</threshold>
<left_val>-0.7396550774574280</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
12 8 6 4 -1.</_>
<_>
14 8 2 4 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>0.0414053983986378</threshold>
<left_node>2</left_node>
<right_val>0.8290563821792603</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
13 1 7 15 -1.</_>
<_>
13 6 7 5 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0378844104707241</threshold>
<left_val>0.1703073978424072</left_val>
<right_val>-0.2449869960546494</right_val></_></_>
<_>
<!-- tree 9 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
17 18 2 2 -1.</_>
<_>
17 18 1 1 2.</_>
<_>
18 19 1 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>3.7567419349215925e-004</threshold>
<left_node>1</left_node>
<right_val>-0.4510369896888733</right_val></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
3 6 4 10 -1.</_>
<_>
4 6 2 10 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-3.7140299100428820e-003</threshold>
<left_val>0.3834812939167023</left_val>
<right_node>2</right_node></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
6 4 4 11 -1.</_>
<_>
7 4 2 11 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-6.1806719750165939e-003</threshold>
<left_val>0.3609752058982849</left_val>
<right_val>-0.2064443975687027</right_val></_></_>
<_>
<!-- tree 10 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
7 18 4 1 -1.</_>
<_>
8 18 2 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-1.2373559875413775e-003</threshold>
<left_val>-0.5816687941551209</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
15 0 4 2 -1.</_>
<_>
15 0 4 1 2.</_></rects>
<tilted>1</tilted></feature>
<threshold>-2.1339580416679382e-003</threshold>
<left_val>0.4166969060897827</left_val>
<right_node>2</right_node></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
8 0 10 3 -1.</_>
<_>
8 1 10 1 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>2.8985869139432907e-003</threshold>
<left_val>-0.2472126036882401</left_val>
<right_val>0.3505684137344360</right_val></_></_>
<_>
<!-- tree 11 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
8 0 12 3 -1.</_>
<_>
12 1 4 1 9.</_></rects>
<tilted>0</tilted></feature>
<threshold>-4.4636861421167850e-003</threshold>
<left_node>1</left_node>
<right_node>2</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
16 0 3 2 -1.</_>
<_>
17 0 1 2 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>1.6411510296165943e-003</threshold>
<left_val>0.3562541007995606</left_val>
<right_val>-0.4104009866714478</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
16 10 4 6 -1.</_>
<_>
17 11 2 6 2.</_></rects>
<tilted>1</tilted></feature>
<threshold>-7.3051019571721554e-003</threshold>
<left_val>0.2021612972021103</left_val>
<right_val>-0.3423452079296112</right_val></_></_></trees>
<stage_threshold>-1.5415630340576172</stage_threshold>
<parent>4</parent>
<next>-1</next></_>
<_>
<!-- stage 6 -->
<trees>
<_>
<!-- tree 0 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
11 4 5 6 -1.</_>
<_>
9 6 5 2 3.</_></rects>
<tilted>1</tilted></feature>
<threshold>-0.0519426092505455</threshold>
<left_node>1</left_node>
<right_node>2</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
12 3 6 10 -1.</_>
<_>
14 5 2 10 3.</_></rects>
<tilted>1</tilted></feature>
<threshold>-0.0472685284912586</threshold>
<left_val>0.8819893002510071</left_val>
<right_val>0.0648292377591133</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
9 7 5 3 -1.</_>
<_>
8 8 5 1 3.</_></rects>
<tilted>1</tilted></feature>
<threshold>-7.8969672322273254e-003</threshold>
<left_val>0.0886627584695816</left_val>
<right_val>-0.5900781154632568</right_val></_></_>
<_>
<!-- tree 1 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
4 10 2 1 -1.</_>
<_>
5 10 1 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>9.0199249098077416e-004</threshold>
<left_node>1</left_node>
<right_val>0.5904089808464050</right_val></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
4 2 16 16 -1.</_>
<_>
4 6 16 8 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.1728982031345367</threshold>
<left_node>2</left_node>
<right_val>-0.5202903151512146</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
15 8 4 6 -1.</_>
<_>
16 8 2 6 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-2.3374119773507118e-003</threshold>
<left_val>0.5298172831535339</left_val>
<right_val>-0.1498585045337677</right_val></_></_>
<_>
<!-- tree 2 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
15 7 2 6 -1.</_>
<_>
15 7 1 6 2.</_></rects>
<tilted>1</tilted></feature>
<threshold>-0.0175349507480860</threshold>
<left_val>0.5326902866363525</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
6 17 1 2 -1.</_>
<_>
6 18 1 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>5.8875310060102493e-005</threshold>
<left_val>-0.4570972025394440</left_val>
<right_node>2</right_node></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
7 4 12 12 -1.</_>
<_>
11 8 4 4 9.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.3224102854728699</threshold>
<left_val>0.5738016963005066</left_val>
<right_val>-0.1286648064851761</right_val></_></_>
<_>
<!-- tree 3 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
18 16 1 2 -1.</_>
<_>
18 17 1 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>8.3220787928439677e-005</threshold>
<left_node>1</left_node>
<right_node>2</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
17 17 2 1 -1.</_>
<_>
18 17 1 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-1.1180160072399303e-004</threshold>
<left_val>0.0900062099099159</left_val>
<right_val>-0.5635238885879517</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
6 4 3 6 -1.</_>
<_>
7 5 1 6 3.</_></rects>
<tilted>1</tilted></feature>
<threshold>-0.0103449802845716</threshold>
<left_val>0.6327341794967651</left_val>
<right_val>0.0500642694532871</right_val></_></_>
<_>
<!-- tree 4 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
4 10 4 1 -1.</_>
<_>
5 10 2 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-9.4440882094204426e-004</threshold>
<left_val>0.4438664019107819</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
6 10 6 9 -1.</_>
<_>
8 10 2 9 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-3.7474210839718580e-003</threshold>
<left_node>2</left_node>
<right_val>-0.3499991893768311</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
1 8 2 12 -1.</_>
<_>
1 14 2 6 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>4.0574651211500168e-003</threshold>
<left_val>-0.4529821872711182</left_val>
<right_val>0.3092019855976105</right_val></_></_>
<_>
<!-- tree 5 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
16 0 2 1 -1.</_>
<_>
17 0 1 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>5.5205920943990350e-005</threshold>
<left_node>1</left_node>
<right_node>2</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
8 2 7 9 -1.</_>
<_>
8 5 7 3 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0756782889366150</threshold>
<left_val>0.3554409146308899</left_val>
<right_val>-0.3604736030101776</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
0 0 20 20 -1.</_>
<_>
0 0 10 10 2.</_>
<_>
10 10 10 10 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.3097536861896515</threshold>
<left_val>-0.6495401859283447</left_val>
<right_val>0.3067927956581116</right_val></_></_>
<_>
<!-- tree 6 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
18 6 1 2 -1.</_>
<_>
18 7 1 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-7.9595847637392581e-005</threshold>
<left_node>1</left_node>
<right_node>2</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
18 5 2 1 -1.</_>
<_>
18 5 1 1 2.</_></rects>
<tilted>1</tilted></feature>
<threshold>4.0613119490444660e-003</threshold>
<left_val>0.3385047018527985</left_val>
<right_val>-0.5327190160751343</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
7 4 10 6 -1.</_>
<_>
7 6 10 2 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>0.0432408712804317</threshold>
<left_val>-0.3259232938289642</left_val>
<right_val>0.5507627129554749</right_val></_></_>
<_>
<!-- tree 7 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
15 9 3 3 -1.</_>
<_>
16 10 1 3 3.</_></rects>
<tilted>1</tilted></feature>
<threshold>-6.7015928216278553e-003</threshold>
<left_val>0.5010917186737061</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
17 18 3 2 -1.</_>
<_>
17 19 3 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-1.0451120324432850e-003</threshold>
<left_val>-0.5888198018074036</left_val>
<right_node>2</right_node></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
15 9 3 2 -1.</_>
<_>
16 10 1 2 3.</_></rects>
<tilted>1</tilted></feature>
<threshold>8.3967261016368866e-003</threshold>
<left_val>-0.0952375978231430</left_val>
<right_val>0.5651699900627136</right_val></_></_>
<_>
<!-- tree 8 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
0 0 2 1 -1.</_>
<_>
1 0 1 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-6.5531006839592010e-005</threshold>
<left_node>2</left_node>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
1 14 1 2 -1.</_>
<_>
1 15 1 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>7.8218057751655579e-005</threshold>
<left_val>-0.4655671119689941</left_val>
<right_val>0.0545097813010216</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
0 18 20 1 -1.</_>
<_>
10 18 10 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>0.0329881682991982</threshold>
<left_val>0.3524878919124603</left_val>
<right_val>-0.5272294878959656</right_val></_></_>
<_>
<!-- tree 9 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
9 7 6 2 -1.</_>
<_>
9 7 6 1 2.</_></rects>
<tilted>1</tilted></feature>
<threshold>-0.0141614498570561</threshold>
<left_val>0.3681178092956543</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
10 9 6 5 -1.</_>
<_>
12 9 2 5 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>0.0315004400908947</threshold>
<left_node>2</left_node>
<right_val>0.5204042196273804</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
11 8 4 5 -1.</_>
<_>
12 8 2 5 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-2.1956730633974075e-003</threshold>
<left_val>0.1160352975130081</left_val>
<right_val>-0.3098528087139130</right_val></_></_>
<_>
<!-- tree 10 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
18 0 2 18 -1.</_>
<_>
18 9 2 9 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0400998890399933</threshold>
<left_val>-0.4514637887477875</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
3 15 9 3 -1.</_>
<_>
6 16 3 1 9.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0325696393847466</threshold>
<left_val>-0.6439204812049866</left_val>
<right_node>2</right_node></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
16 16 1 3 -1.</_>
<_>
15 17 1 1 3.</_></rects>
<tilted>1</tilted></feature>
<threshold>-4.2014168575406075e-003</threshold>
<left_val>-0.8259450197219849</left_val>
<right_val>0.1925954073667526</right_val></_></_>
<_>
<!-- tree 11 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
2 16 9 4 -1.</_>
<_>
2 17 9 2 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>2.0385689567774534e-003</threshold>
<left_node>2</left_node>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
0 18 5 2 -1.</_>
<_>
0 19 5 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-1.6212540213018656e-003</threshold>
<left_val>-0.3772337138652802</left_val>
<right_val>0.3391883075237274</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
17 7 2 3 -1.</_>
<_>
16 8 2 1 3.</_></rects>
<tilted>1</tilted></feature>
<threshold>-8.6220083758234978e-003</threshold>
<left_val>0.4898692071437836</left_val>
<right_val>-0.2753207087516785</right_val></_></_>
<_>
<!-- tree 12 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
17 17 2 1 -1.</_>
<_>
18 17 1 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>9.2185800895094872e-005</threshold>
<left_node>1</left_node>
<right_val>0.2422374933958054</right_val></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
16 18 2 1 -1.</_>
<_>
17 18 1 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-7.1932889113668352e-005</threshold>
<left_node>2</left_node>
<right_val>-0.4218919873237610</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
17 18 1 2 -1.</_>
<_>
17 19 1 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>4.4952900498174131e-004</threshold>
<left_val>0.2940784096717835</left_val>
<right_val>-0.4402804970741272</right_val></_></_></trees>
<stage_threshold>-1.4762729406356812</stage_threshold>
<parent>5</parent>
<next>-1</next></_>
<_>
<!-- stage 7 -->
<trees>
<_>
<!-- tree 0 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
6 10 9 2 -1.</_>
<_>
9 10 3 2 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0196384508162737</threshold>
<left_node>1</left_node>
<right_node>2</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
2 8 18 12 -1.</_>
<_>
2 14 18 6 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>0.1136429980397224</threshold>
<left_val>-0.3244445025920868</left_val>
<right_val>0.7460201978683472</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
12 6 3 3 -1.</_>
<_>
11 7 3 1 3.</_></rects>
<tilted>1</tilted></feature>
<threshold>-0.0101121496409178</threshold>
<left_val>0.3333333134651184</left_val>
<right_val>-0.5643565058708191</right_val></_></_>
<_>
<!-- tree 1 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
15 8 3 3 -1.</_>
<_>
16 9 1 3 3.</_></rects>
<tilted>1</tilted></feature>
<threshold>0.0121308797970414</threshold>
<left_node>1</left_node>
<right_val>0.7221491932868958</right_val></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
2 3 17 12 -1.</_>
<_>
2 6 17 6 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.1595885008573532</threshold>
<left_node>2</left_node>
<right_val>-0.3927459120750427</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
2 7 4 9 -1.</_>
<_>
3 7 2 9 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-2.3524949792772532e-003</threshold>
<left_val>0.5615249276161194</left_val>
<right_val>-0.1376848071813583</right_val></_></_>
<_>
<!-- tree 2 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
4 9 2 6 -1.</_>
<_>
4 9 1 3 2.</_>
<_>
5 12 1 3 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-4.1118920780718327e-003</threshold>
<left_val>0.6355608105659485</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
1 6 12 9 -1.</_>
<_>
5 9 4 3 9.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.1783290058374405</threshold>
<left_val>0.3337314128875732</left_val>
<right_node>2</right_node></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
8 2 1 8 -1.</_>
<_>
8 4 1 4 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-7.8500732779502869e-003</threshold>
<left_val>0.3953677117824554</left_val>
<right_val>-0.3338043093681335</right_val></_></_>
<_>
<!-- tree 3 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
3 16 2 1 -1.</_>
<_>
4 16 1 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-4.6880490117473528e-005</threshold>
<left_node>2</left_node>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
3 16 2 1 -1.</_>
<_>
4 16 1 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>5.2934719860786572e-005</threshold>
<left_val>-0.6611827015876770</left_val>
<right_val>-0.0482321903109550</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
4 17 1 3 -1.</_>
<_>
4 18 1 1 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>2.0851430235779844e-005</threshold>
<left_val>-0.0988383591175079</left_val>
<right_val>0.4452841877937317</right_val></_></_>
<_>
<!-- tree 4 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
6 17 9 3 -1.</_>
<_>
9 17 3 3 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0184252895414829</threshold>
<left_val>-0.6569089889526367</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
14 8 3 4 -1.</_>
<_>
15 9 1 4 3.</_></rects>
<tilted>1</tilted></feature>
<threshold>-7.6133902184665203e-003</threshold>
<left_val>0.5341367721557617</left_val>
<right_node>2</right_node></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
17 8 3 6 -1.</_>
<_>
18 9 1 6 3.</_></rects>
<tilted>1</tilted></feature>
<threshold>-6.0353721491992474e-003</threshold>
<left_val>0.3617104887962341</left_val>
<right_val>-0.2047843039035797</right_val></_></_>
<_>
<!-- tree 5 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
16 17 1 3 -1.</_>
<_>
16 18 1 1 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>4.3712720071198419e-005</threshold>
<left_node>2</left_node>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
14 18 3 2 -1.</_>
<_>
14 19 3 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-7.8823999501764774e-004</threshold>
<left_val>-0.4532682895660400</left_val>
<right_val>0.3551769852638245</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
6 8 3 3 -1.</_>
<_>
7 8 1 3 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-4.5693209394812584e-003</threshold>
<left_val>0.6172103285789490</left_val>
<right_val>-0.2970770001411438</right_val></_></_>
<_>
<!-- tree 6 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
3 0 16 11 -1.</_>
<_>
7 0 8 11 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0380585715174675</threshold>
<left_node>1</left_node>
<right_node>2</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
1 0 18 20 -1.</_>
<_>
1 5 18 10 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.1179768964648247</threshold>
<left_val>0.3500399887561798</left_val>
<right_val>-0.2725766897201538</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
15 5 4 4 -1.</_>
<_>
15 5 2 2 2.</_>
<_>
17 7 2 2 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>4.6841651201248169e-003</threshold>
<left_val>-0.3255917131900787</left_val>
<right_val>0.3773747086524963</right_val></_></_>
<_>
<!-- tree 7 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
15 10 2 1 -1.</_>
<_>
16 10 1 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-2.6372840511612594e-004</threshold>
<left_node>1</left_node>
<right_node>2</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
7 18 6 2 -1.</_>
<_>
9 18 2 2 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>6.2580420635640621e-003</threshold>
<left_val>0.3742173910140991</left_val>
<right_val>-0.5892670154571533</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
15 10 2 1 -1.</_>
<_>
16 10 1 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>5.6767999922158197e-005</threshold>
<left_val>-0.4885902106761932</left_val>
<right_val>-0.0186237301677465</right_val></_></_>
<_>
<!-- tree 8 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
2 0 18 4 -1.</_>
<_>
2 1 18 2 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>9.2742107808589935e-003</threshold>
<left_node>1</left_node>
<right_val>0.3093354105949402</right_val></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
5 0 9 4 -1.</_>
<_>
5 1 9 2 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-3.8514519110321999e-003</threshold>
<left_node>2</left_node>
<right_val>-0.3451372981071472</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
0 0 2 1 -1.</_>
<_>
1 0 1 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-5.3287498303689063e-005</threshold>
<left_val>0.5234032869338989</left_val>
<right_val>-0.0911594033241272</right_val></_></_>
<_>
<!-- tree 9 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
0 18 1 2 -1.</_>
<_>
0 19 1 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>9.8315975628793240e-004</threshold>
<left_node>1</left_node>
<right_val>-0.5018535256385803</right_val></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
18 0 2 2 -1.</_>
<_>
18 1 2 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>8.2858657697215676e-004</threshold>
<left_node>2</left_node>
<right_val>-0.3052954971790314</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
17 0 2 4 -1.</_>
<_>
17 0 1 4 2.</_></rects>
<tilted>1</tilted></feature>
<threshold>0.0112297898158431</threshold>
<left_val>0.2621921002864838</left_val>
<right_val>-0.4796982109546661</right_val></_></_>
<_>
<!-- tree 10 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
4 2 3 4 -1.</_>
<_>
3 3 3 2 2.</_></rects>
<tilted>1</tilted></feature>
<threshold>-0.0103276399895549</threshold>
<left_val>-0.5631508231163025</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
0 4 6 11 -1.</_>
<_>
2 4 2 11 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-6.9197742268443108e-003</threshold>
<left_val>0.3122507035732269</left_val>
<right_node>2</right_node></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
0 4 8 4 -1.</_>
<_>
0 4 4 2 2.</_>
<_>
4 6 4 2 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-5.0027170218527317e-003</threshold>
<left_val>0.1782077997922897</left_val>
<right_val>-0.3009114861488342</right_val></_></_>
<_>
<!-- tree 11 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
4 3 1 2 -1.</_>
<_>
4 4 1 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-1.1156810069223866e-004</threshold>
<left_val>0.1888367980718613</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
0 1 6 4 -1.</_>
<_>
0 1 3 2 2.</_>
<_>
3 3 3 2 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>4.2464961297810078e-003</threshold>
<left_val>-0.4010157883167267</left_val>
<right_node>2</right_node></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
3 5 4 2 -1.</_>
<_>
3 5 2 1 2.</_>
<_>
5 6 2 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-4.7280951548600569e-005</threshold>
<left_val>0.4650590121746063</left_val>
<right_val>-0.2986364066600800</right_val></_></_>
<_>
<!-- tree 12 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
4 9 4 1 -1.</_>
<_>
5 9 2 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-1.8891280051320791e-003</threshold>
<left_val>0.5696374773979187</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
8 15 2 2 -1.</_>
<_>
8 15 1 1 2.</_>
<_>
9 16 1 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-5.8536308642942458e-005</threshold>
<left_val>0.1800824999809265</left_val>
<right_node>2</right_node></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
8 15 2 2 -1.</_>
<_>
8 15 1 1 2.</_>
<_>
9 16 1 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>2.0671950551331975e-005</threshold>
<left_val>-0.5865960121154785</left_val>
<right_val>-5.4875258356332779e-003</right_val></_></_>
<_>
<!-- tree 13 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
2 18 5 2 -1.</_>
<_>
2 19 5 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-1.1267509544268250e-003</threshold>
<left_val>-0.4026159942150116</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
4 12 10 8 -1.</_>
<_>
4 14 10 4 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>0.0213784407824278</threshold>
<left_node>2</left_node>
<right_val>0.3923035860061646</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
9 7 5 3 -1.</_>
<_>
8 8 5 1 3.</_></rects>
<tilted>1</tilted></feature>
<threshold>-0.0125460401177406</threshold>
<left_val>0.4947456121444702</left_val>
<right_val>-0.1732252985239029</right_val></_></_>
<_>
<!-- tree 14 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
2 18 6 2 -1.</_>
<_>
2 18 3 1 2.</_>
<_>
5 19 3 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-7.2257901774719357e-004</threshold>
<left_val>-0.3038032948970795</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
6 16 12 4 -1.</_>
<_>
6 17 12 2 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>6.4563672058284283e-003</threshold>
<left_node>2</left_node>
<right_val>0.4717349112033844</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
10 9 1 4 -1.</_>
<_>
10 11 1 2 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>4.9086650833487511e-003</threshold>
<left_val>-0.1638054996728897</left_val>
<right_val>0.3770849108695984</right_val></_></_></trees>
<stage_threshold>-1.4963719844818115</stage_threshold>
<parent>6</parent>
<next>-1</next></_>
<_>
<!-- stage 8 -->
<trees>
<_>
<!-- tree 0 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
5 9 12 3 -1.</_>
<_>
9 10 4 1 9.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0726175606250763</threshold>
<left_node>2</left_node>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
9 7 3 3 -1.</_>
<_>
10 8 1 1 9.</_></rects>
<tilted>0</tilted></feature>
<threshold>-6.9059380330145359e-003</threshold>
<left_val>0.2660279870033264</left_val>
<right_val>-0.4932517111301422</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
1 6 19 14 -1.</_>
<_>
1 13 19 7 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>0.2172794938087463</threshold>
<left_val>-0.1076923012733460</left_val>
<right_val>0.8266112208366394</right_val></_></_>
<_>
<!-- tree 1 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
15 9 4 2 -1.</_>
<_>
16 9 2 2 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-2.0319509785622358e-003</threshold>
<left_node>1</left_node>
<right_node>2</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
8 9 3 8 -1.</_>
<_>
8 13 3 4 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>0.0289315897971392</threshold>
<left_val>-0.0379631407558918</left_val>
<right_val>0.8023043870925903</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
6 8 4 3 -1.</_>
<_>
7 8 2 3 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-4.6076569706201553e-003</threshold>
<left_val>0.4246839880943298</left_val>
<right_val>-0.2937937974929810</right_val></_></_>
<_>
<!-- tree 2 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
5 1 8 4 -1.</_>
<_>
5 2 8 2 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>6.9408868439495564e-003</threshold>
<left_node>1</left_node>
<right_node>2</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
8 1 3 4 -1.</_>
<_>
8 2 3 2 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-5.9231962077319622e-003</threshold>
<left_val>0.4173704981803894</left_val>
<right_val>-0.2555258870124817</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
2 10 18 10 -1.</_>
<_>
2 15 18 5 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>0.0511281602084637</threshold>
<left_val>-0.3861986100673676</left_val>
<right_val>0.4707686007022858</right_val></_></_>
<_>
<!-- tree 3 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
8 8 5 3 -1.</_>
<_>
7 9 5 1 3.</_></rects>
<tilted>1</tilted></feature>
<threshold>0.0152013301849365</threshold>
<left_node>1</left_node>
<right_val>0.5435479879379273</right_val></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
7 9 7 2 -1.</_>
<_>
7 9 7 1 2.</_></rects>
<tilted>1</tilted></feature>
<threshold>-0.0180963408201933</threshold>
<left_val>0.2665114104747772</left_val>
<right_node>2</right_node></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
5 17 1 3 -1.</_>
<_>
5 18 1 1 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>7.9378951340913773e-005</threshold>
<left_val>-0.4392774999141693</left_val>
<right_val>2.5831260718405247e-003</right_val></_></_>
<_>
<!-- tree 4 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
7 18 13 2 -1.</_>
<_>
7 19 13 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-5.3462558425962925e-003</threshold>
<left_val>-0.6630896925926209</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
16 16 2 2 -1.</_>
<_>
16 16 2 1 2.</_></rects>
<tilted>1</tilted></feature>
<threshold>-6.9701080210506916e-003</threshold>
<left_val>-0.7031068205833435</left_val>
<right_node>2</right_node></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
3 14 1 2 -1.</_>
<_>
3 15 1 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>8.4738981968257576e-005</threshold>
<left_val>-0.1788080930709839</left_val>
<right_val>0.2599329948425293</right_val></_></_>
<_>
<!-- tree 5 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
12 9 3 4 -1.</_>
<_>
13 9 1 4 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-2.8513800352811813e-003</threshold>
<left_val>0.4505367875099182</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
12 9 3 2 -1.</_>
<_>
13 9 1 2 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>2.2954840678721666e-003</threshold>
<left_node>2</left_node>
<right_val>0.3056051135063171</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
7 9 2 3 -1.</_>
<_>
6 10 2 1 3.</_></rects>
<tilted>1</tilted></feature>
<threshold>-3.5036220215260983e-003</threshold>
<left_val>0.1504087001085281</left_val>
<right_val>-0.3328307867050171</right_val></_></_>
<_>
<!-- tree 6 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
10 3 9 12 -1.</_>
<_>
10 7 9 4 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0695702284574509</threshold>
<left_node>1</left_node>
<right_node>2</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
15 5 2 1 -1.</_>
<_>
16 5 1 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>5.9261121350573376e-005</threshold>
<left_val>-0.0368997193872929</left_val>
<right_val>0.4092730879783630</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
1 0 15 9 -1.</_>
<_>
1 3 15 3 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0590583495795727</threshold>
<left_val>0.1382637023925781</left_val>
<right_val>-0.3821440935134888</right_val></_></_>
<_>
<!-- tree 7 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
3 15 2 3 -1.</_>
<_>
3 15 1 3 2.</_></rects>
<tilted>1</tilted></feature>
<threshold>-8.9645627886056900e-003</threshold>
<left_val>-0.5813472867012024</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
2 16 1 2 -1.</_>
<_>
2 17 1 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>4.9211819714400917e-005</threshold>
<left_val>-0.1848174035549164</left_val>
<right_node>2</right_node></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
12 1 8 4 -1.</_>
<_>
11 2 8 2 2.</_></rects>
<tilted>1</tilted></feature>
<threshold>9.9640293046832085e-003</threshold>
<left_val>0.0876854732632637</left_val>
<right_val>0.5850980281829834</right_val></_></_>
<_>
<!-- tree 8 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
6 5 3 6 -1.</_>
<_>
7 6 1 6 3.</_></rects>
<tilted>1</tilted></feature>
<threshold>-0.0193026997148991</threshold>
<left_val>0.5326346158981323</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
5 7 2 2 -1.</_>
<_>
5 7 1 1 2.</_>
<_>
6 8 1 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-4.3869198998436332e-004</threshold>
<left_val>0.2889113128185272</left_val>
<right_node>2</right_node></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
17 7 3 1 -1.</_>
<_>
18 7 1 1 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>6.5669846662785858e-005</threshold>
<left_val>-0.3349359929561615</left_val>
<right_val>0.0595667511224747</right_val></_></_>
<_>
<!-- tree 9 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
12 0 6 5 -1.</_>
<_>
14 0 2 5 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0202245190739632</threshold>
<left_val>-0.6553608179092407</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
17 0 2 1 -1.</_>
<_>
18 0 1 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>8.7082196841947734e-005</threshold>
<left_val>-0.1221178993582726</left_val>
<right_node>2</right_node></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
10 1 6 5 -1.</_>
<_>
12 1 2 5 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0162027198821306</threshold>
<left_val>-0.4707683920860291</left_val>
<right_val>0.3099077045917511</right_val></_></_>
<_>
<!-- tree 10 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
17 14 3 2 -1.</_>
<_>
17 14 3 1 2.</_></rects>
<tilted>1</tilted></feature>
<threshold>4.4353529810905457e-003</threshold>
<left_node>1</left_node>
<right_val>-0.5403993129730225</right_val></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
5 10 4 1 -1.</_>
<_>
6 10 2 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-9.0544822160154581e-004</threshold>
<left_val>0.4287880063056946</left_val>
<right_node>2</right_node></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
3 8 3 6 -1.</_>
<_>
4 8 1 6 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-1.4297979651018977e-003</threshold>
<left_val>0.2232273966073990</left_val>
<right_val>-0.1819442063570023</right_val></_></_>
<_>
<!-- tree 11 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
8 16 5 4 -1.</_>
<_>
8 17 5 2 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>3.2359519973397255e-003</threshold>
<left_node>1</left_node>
<right_node>2</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
14 15 2 2 -1.</_>
<_>
14 15 1 1 2.</_>
<_>
15 16 1 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>1.0716189717641100e-004</threshold>
<left_val>-0.2921822071075440</left_val>
<right_val>0.1391046047210693</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
4 18 1 2 -1.</_>
<_>
4 19 1 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-5.8802281273528934e-004</threshold>
<left_val>-0.4692608118057251</left_val>
<right_val>0.3808549940586090</right_val></_></_>
<_>
<!-- tree 12 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
8 15 2 3 -1.</_>
<_>
8 15 1 3 2.</_></rects>
<tilted>1</tilted></feature>
<threshold>-9.0546347200870514e-003</threshold>
<left_val>-0.5042654275894165</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
19 0 1 20 -1.</_>
<_>
19 10 1 10 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-8.6048766970634460e-003</threshold>
<left_val>-0.2755903005599976</left_val>
<right_node>2</right_node></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
7 9 8 1 -1.</_>
<_>
9 9 4 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-1.2719300575554371e-003</threshold>
<left_val>0.3602210879325867</left_val>
<right_val>-0.0264849700033665</right_val></_></_>
<_>
<!-- tree 13 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
14 10 3 1 -1.</_>
<_>
15 10 1 1 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-3.9098240085877478e-004</threshold>
<left_val>0.2665173113346100</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
15 11 2 1 -1.</_>
<_>
16 11 1 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-3.6405251012183726e-004</threshold>
<left_val>0.1472164988517761</left_val>
<right_node>2</right_node></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
18 11 2 8 -1.</_>
<_>
18 11 1 4 2.</_>
<_>
19 15 1 4 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-6.6685711499303579e-004</threshold>
<left_val>-0.4971973896026611</left_val>
<right_val>-0.0615798495709896</right_val></_></_>
<_>
<!-- tree 14 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
6 1 8 4 -1.</_>
<_>
8 1 4 4 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0248455703258514</threshold>
<left_val>-0.7082098126411438</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
6 0 5 4 -1.</_>
<_>
5 1 5 2 2.</_></rects>
<tilted>1</tilted></feature>
<threshold>-0.0154363997280598</threshold>
<left_val>-0.4720689058303833</left_val>
<right_node>2</right_node></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
6 5 12 15 -1.</_>
<_>
10 10 4 5 9.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.5657231211662293</threshold>
<left_val>0.6396523118019104</left_val>
<right_val>0.0520693287253380</right_val></_></_>
<_>
<!-- tree 15 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
7 2 8 9 -1.</_>
<_>
7 5 8 3 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0574801415205002</threshold>
<left_val>0.2929739058017731</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
2 1 10 3 -1.</_>
<_>
2 2 10 1 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0146138202399015</threshold>
<left_val>0.6012967228889465</left_val>
<right_node>2</right_node></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
2 5 15 12 -1.</_>
<_>
7 9 5 4 9.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.3399373888969421</threshold>
<left_val>0.0190412998199463</left_val>
<right_val>-0.3325459957122803</right_val></_></_>
<_>
<!-- tree 16 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
7 8 3 6 -1.</_>
<_>
8 8 1 6 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-3.1427140347659588e-003</threshold>
<left_node>2</left_node>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
7 6 3 7 -1.</_>
<_>
8 6 1 7 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>2.1966299973428249e-003</threshold>
<left_val>-0.2297272980213165</left_val>
<right_val>0.2236734032630920</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
4 16 9 4 -1.</_>
<_>
7 16 3 4 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0248585902154446</threshold>
<left_val>-0.5621296763420105</left_val>
<right_val>0.3954285979270935</right_val></_></_>
<_>
<!-- tree 17 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
15 18 5 2 -1.</_>
<_>
15 19 5 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-1.6135630430653691e-003</threshold>
<left_val>-0.4825679063796997</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
15 16 1 4 -1.</_>
<_>
15 17 1 2 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>1.1416019697207958e-004</threshold>
<left_node>2</left_node>
<right_val>0.2687731981277466</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
15 16 2 2 -1.</_>
<_>
15 16 1 1 2.</_>
<_>
16 17 1 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>1.3170539750717580e-004</threshold>
<left_val>-0.3907892107963562</left_val>
<right_val>0.1715344041585922</right_val></_></_>
<_>
<!-- tree 18 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
6 15 2 2 -1.</_>
<_>
6 15 1 1 2.</_>
<_>
7 16 1 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-8.5256207967177033e-005</threshold>
<left_val>0.2175457030534744</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
6 15 2 2 -1.</_>
<_>
6 15 1 1 2.</_>
<_>
7 16 1 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>6.4925159676931798e-005</threshold>
<left_val>-0.4746862053871155</left_val>
<right_node>2</right_node></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
8 16 8 3 -1.</_>
<_>
10 16 4 3 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0126896398141980</threshold>
<left_val>-0.6653857827186585</left_val>
<right_val>0.1234709024429321</right_val></_></_></trees>
<stage_threshold>-1.5243699550628662</stage_threshold>
<parent>7</parent>
<next>-1</next></_>
<_>
<!-- stage 9 -->
<trees>
<_>
<!-- tree 0 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
5 10 12 1 -1.</_>
<_>
9 10 4 1 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0298446398228407</threshold>
<left_node>2</left_node>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
6 2 9 15 -1.</_>
<_>
9 7 3 5 9.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.4548766016960144</threshold>
<left_val>0.3922204077243805</left_val>
<right_val>-0.3931488096714020</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
17 6 1 14 -1.</_>
<_>
17 13 1 7 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>2.7445149607956409e-003</threshold>
<left_val>-0.1592357009649277</left_val>
<right_val>0.8269670009613037</right_val></_></_>
<_>
<!-- tree 1 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
9 7 3 3 -1.</_>
<_>
8 8 3 1 3.</_></rects>
<tilted>1</tilted></feature>
<threshold>-0.0105846701189876</threshold>
<left_node>2</left_node>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
16 5 4 3 -1.</_>
<_>
15 6 4 1 3.</_></rects>
<tilted>1</tilted></feature>
<threshold>-0.0163083802908659</threshold>
<left_val>0.4595468938350678</left_val>
<right_val>-0.2162012010812759</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
13 7 4 9 -1.</_>
<_>
13 7 2 9 2.</_></rects>
<tilted>1</tilted></feature>
<threshold>-0.0487874411046505</threshold>
<left_val>0.7510365247726440</left_val>
<right_val>0.0745579674839973</right_val></_></_>
<_>
<!-- tree 2 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
3 10 2 2 -1.</_>
<_>
3 10 2 1 2.</_></rects>
<tilted>1</tilted></feature>
<threshold>-2.9621229041367769e-003</threshold>
<left_node>1</left_node>
<right_val>-0.2445227056741715</right_val></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
0 4 3 15 -1.</_>
<_>
0 9 3 5 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>0.0173005294054747</threshold>
<left_node>2</left_node>
<right_val>-0.3309040963649750</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
7 8 9 6 -1.</_>
<_>
10 8 3 6 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-0.0167311690747738</threshold>
<left_val>0.5375185012817383</left_val>
<right_val>0.0291538201272488</right_val></_></_>
<_>
<!-- tree 3 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
5 17 9 2 -1.</_>
<_>
8 17 3 2 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>0.0123261800035834</threshold>
<left_node>1</left_node>
<right_val>-0.5482481122016907</right_val></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
7 2 6 18 -1.</_>
<_>
7 11 6 9 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>0.0549282990396023</threshold>
<left_val>-0.2195277065038681</left_val>
<right_node>2</right_node></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
15 9 2 10 -1.</_>
<_>
15 9 1 5 2.</_>
<_>
16 14 1 5 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>2.7763319667428732e-003</threshold>
<left_val>0.0364636890590191</left_val>
<right_val>0.5063378214836121</right_val></_></_>
<_>
<!-- tree 4 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
12 7 6 4 -1.</_>
<_>
14 9 2 4 3.</_></rects>
<tilted>1</tilted></feature>
<threshold>-0.0451169982552528</threshold>
<left_val>0.4233931005001068</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
13 8 3 2 -1.</_>
<_>
14 9 1 2 3.</_></rects>
<tilted>1</tilted></feature>
<threshold>0.0112079400569201</threshold>
<left_node>2</left_node>
<right_val>0.3998400866985321</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
17 4 3 2 -1.</_>
<_>
18 5 1 2 3.</_></rects>
<tilted>1</tilted></feature>
<threshold>-5.7006389833986759e-003</threshold>
<left_val>-0.5972918272018433</left_val>
<right_val>-0.0985576510429382</right_val></_></_>
<_>
<!-- tree 5 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
10 5 8 2 -1.</_>
<_>
10 6 8 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-5.3951311856508255e-003</threshold>
<left_node>1</left_node>
<right_node>2</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
18 4 2 2 -1.</_>
<_>
18 4 1 2 2.</_></rects>
<tilted>1</tilted></feature>
<threshold>7.8587066382169724e-003</threshold>
<left_val>0.3473469018936157</left_val>
<right_val>-0.4728192090988159</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
7 4 7 4 -1.</_>
<_>
7 5 7 2 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>0.0106666395440698</threshold>
<left_val>-0.2331566959619522</left_val>
<right_val>0.2436001002788544</right_val></_></_>
<_>
<!-- tree 6 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
1 15 6 4 -1.</_>
<_>
1 17 6 2 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>2.8001810424029827e-003</threshold>
<left_node>2</left_node>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
0 13 2 6 -1.</_>
<_>
0 15 2 2 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-7.9198479652404785e-003</threshold>
<left_val>-0.4835455119609833</left_val>
<right_val>0.1832112073898315</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
10 13 4 2 -1.</_>
<_>
10 13 4 1 2.</_></rects>
<tilted>1</tilted></feature>
<threshold>-2.3832279257476330e-003</threshold>
<left_val>0.0321684814989567</left_val>
<right_val>-0.5047625899314880</right_val></_></_>
<_>
<!-- tree 7 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
16 14 2 4 -1.</_>
<_>
15 15 2 2 2.</_></rects>
<tilted>1</tilted></feature>
<threshold>-9.7674019634723663e-003</threshold>
<left_val>-0.7441521286964417</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
7 4 3 4 -1.</_>
<_>
8 5 1 4 3.</_></rects>
<tilted>1</tilted></feature>
<threshold>-0.0138972597196698</threshold>
<left_val>0.4542512893676758</left_val>
<right_node>2</right_node></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
5 9 4 3 -1.</_>
<_>
6 9 2 3 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-6.4803068526089191e-003</threshold>
<left_val>0.4829286932945252</left_val>
<right_val>-0.1025857031345367</right_val></_></_>
<_>
<!-- tree 8 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
4 1 2 4 -1.</_>
<_>
3 2 2 2 2.</_></rects>
<tilted>1</tilted></feature>
<threshold>9.4482619315385818e-003</threshold>
<left_node>1</left_node>
<right_val>-0.5332602262496948</right_val></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
2 1 2 3 -1.</_>
<_>
3 1 1 3 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-7.0351187605410814e-004</threshold>
<left_val>0.2943583130836487</left_val>
<right_node>2</right_node></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
1 2 8 4 -1.</_>
<_>
1 2 4 2 2.</_>
<_>
5 4 4 2 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-4.2770579457283020e-003</threshold>
<left_val>0.1550199985504150</left_val>
<right_val>-0.3086796998977661</right_val></_></_>
<_>
<!-- tree 9 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
6 0 4 4 -1.</_>
<_>
7 0 2 4 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>5.8752358891069889e-003</threshold>
<left_node>1</left_node>
<right_val>-0.6049131751060486</right_val></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
6 4 3 5 -1.</_>
<_>
7 5 1 5 3.</_></rects>
<tilted>1</tilted></feature>
<threshold>9.5629561692476273e-003</threshold>
<left_node>2</left_node>
<right_val>0.4403988122940064</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
3 5 1 2 -1.</_>
<_>
3 6 1 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-6.8425266363192350e-005</threshold>
<left_val>0.1020627021789551</left_val>
<right_val>-0.2562403082847595</right_val></_></_>
<_>
<!-- tree 10 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
6 8 3 3 -1.</_>
<_>
7 8 1 3 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>5.4002371616661549e-003</threshold>
<left_node>1</left_node>
<right_val>0.4537158012390137</right_val></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
5 16 3 1 -1.</_>
<_>
6 17 1 1 3.</_></rects>
<tilted>1</tilted></feature>
<threshold>2.9745819047093391e-003</threshold>
<left_node>2</left_node>
<right_val>-0.6096798777580261</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
6 9 4 4 -1.</_>
<_>
7 9 2 4 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-2.5536341127008200e-003</threshold>
<left_val>0.2211160957813263</left_val>
<right_val>-0.1280117034912109</right_val></_></_>
<_>
<!-- tree 11 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
9 11 9 2 -1.</_>
<_>
9 12 9 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>4.0425839833915234e-003</threshold>
<left_val>-0.1926402002573013</left_val>
<right_node>1</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
5 2 7 2 -1.</_>
<_>
5 3 7 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>7.6407291926443577e-003</threshold>
<left_node>2</left_node>
<right_val>0.6117882132530212</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
12 18 8 2 -1.</_>
<_>
12 19 8 1 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-1.0939979692921042e-003</threshold>
<left_val>-0.3797368109226227</left_val>
<right_val>0.1643894016742706</right_val></_></_>
<_>
<!-- tree 12 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
19 0 1 4 -1.</_>
<_>
19 2 1 2 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>-1.1377089685993269e-004</threshold>
<left_node>1</left_node>
<right_node>2</right_node></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
14 1 6 2 -1.</_>
<_>
17 1 3 2 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>5.2979402244091034e-003</threshold>
<left_val>-0.0277704801410437</left_val>
<right_val>0.4301962852478027</right_val></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
14 2 6 4 -1.</_>
<_>
14 2 3 2 2.</_>
<_>
17 4 3 2 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>2.9510098975151777e-003</threshold>
<left_val>-0.3791233897209168</left_val>
<right_val>0.1013085022568703</right_val></_></_>
<_>
<!-- tree 13 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
7 7 3 6 -1.</_>
<_>
8 7 1 6 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>6.3235480338335037e-003</threshold>
<left_node>1</left_node>
<right_val>0.4041346013545990</right_val></_>
<_>
<!-- node 1 -->
<feature>
<rects>
<_>
11 6 5 4 -1.</_>
<_>
11 7 5 2 2.</_></rects>
<tilted>0</tilted></feature>
<threshold>3.9955950342118740e-003</threshold>
<left_val>-0.1509774029254913</left_val>
<right_node>2</right_node></_>
<_>
<!-- node 2 -->
<feature>
<rects>
<_>
17 7 3 3 -1.</_>
<_>
18 7 1 3 3.</_></rects>
<tilted>0</tilted></feature>
<threshold>-5.3595582721754909e-004</threshold>
<left_val>0.5952280163764954</left_val>
<right_val>-0.0343801714479923</right_val></_></_>
<_>
<!-- tree 14 -->
<_>
<!-- root node -->
<feature>
<rects>
<_>
15 16 1 2 -1.</_>
<_>
15 16 1 1 2.</_></rects>
<tilted>1</tilted></feature>
<threshold>3.6193430423736572e-003</threshold>
<left_node>1</left_node>
<right_val>-0.7445452213287354</right_val></_>
<
gitextract_b0ei26sj/
├── .gitignore
├── FaceRec/
│ ├── AppDelegate.h
│ ├── AppDelegate.m
│ ├── Base.lproj/
│ │ ├── LaunchScreen.xib
│ │ └── Main.storyboard
│ ├── FJFaceDetector.h
│ ├── FJFaceDetector.mm
│ ├── FJFaceRecognitionViewController.h
│ ├── FJFaceRecognitionViewController.m
│ ├── FJFaceRecognizer.h
│ ├── FJFaceRecognizer.mm
│ ├── FJLiveCameraViewController.h
│ ├── FJLiveCameraViewController.m
│ ├── Images.xcassets/
│ │ └── AppIcon.appiconset/
│ │ └── Contents.json
│ ├── Info.plist
│ ├── UIImage+OpenCV.h
│ ├── UIImage+OpenCV.mm
│ ├── haarcascade_eye_tree_eyeglasses.xml
│ ├── haarcascade_frontalface_alt2.xml
│ └── main.m
├── Podfile
├── README.md
├── iOS-OpenCV-FaceRec.xcodeproj/
│ ├── project.pbxproj
│ └── project.xcworkspace/
│ └── contents.xcworkspacedata
└── iOS-OpenCV-FaceRec.xcworkspace/
└── contents.xcworkspacedata
Condensed preview — 25 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,061K chars).
[
{
"path": ".gitignore",
"chars": 1398,
"preview": "# Created by https://www.gitignore.io\n\n### Xcode ###\nbuild/\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode"
},
{
"path": "FaceRec/AppDelegate.h",
"chars": 300,
"preview": "//\n// AppDelegate.h\n// opencvtest\n//\n// Created by Engin Kurutepe on 16/01/15.\n// Copyright (c) 2015 Fifteen Juggler"
},
{
"path": "FaceRec/AppDelegate.m",
"chars": 2054,
"preview": "//\n// AppDelegate.m\n// opencvtest\n//\n// Created by Engin Kurutepe on 16/01/15.\n// Copyright (c) 2015 Fifteen Juggler"
},
{
"path": "FaceRec/Base.lproj/LaunchScreen.xib",
"chars": 3716,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" versi"
},
{
"path": "FaceRec/Base.lproj/Main.storyboard",
"chars": 13599,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard"
},
{
"path": "FaceRec/FJFaceDetector.h",
"chars": 552,
"preview": "//\n// CVCameraProvider.h\n// opencvtest\n//\n// Created by Engin Kurutepe on 16/01/15.\n// Copyright (c) 2015 Fifteen Ju"
},
{
"path": "FaceRec/FJFaceDetector.mm",
"chars": 5338,
"preview": "//\n// CVCameraProvider.mm\n// opencvtest\n//\n// Created by Engin Kurutepe on 16/01/15.\n// Copyright (c) 2015 Fifteen J"
},
{
"path": "FaceRec/FJFaceRecognitionViewController.h",
"chars": 322,
"preview": "//\n// FJFaceRecognitionViewController.h\n// opencvtest\n//\n// Created by Engin Kurutepe on 28/01/15.\n// Copyright (c) "
},
{
"path": "FaceRec/FJFaceRecognitionViewController.m",
"chars": 2218,
"preview": "//\n// FJFaceRecognitionViewController.m\n// opencvtest\n//\n// Created by Engin Kurutepe on 28/01/15.\n// Copyright (c) "
},
{
"path": "FaceRec/FJFaceRecognizer.h",
"chars": 517,
"preview": "//\n// FaceRecognizer.h\n// opencvtest\n//\n// Created by Engin Kurutepe on 21/01/15.\n// Copyright (c) 2015 Fifteen Jugg"
},
{
"path": "FaceRec/FJFaceRecognizer.mm",
"chars": 2960,
"preview": "//\n// FaceRecognizer.mm\n// opencvtest\n//\n// Created by Engin Kurutepe on 21/01/15.\n// Copyright (c) 2015 Fifteen Jug"
},
{
"path": "FaceRec/FJLiveCameraViewController.h",
"chars": 250,
"preview": "//\n// ViewController.h\n// opencvtest\n//\n// Created by Engin Kurutepe on 16/01/15.\n// Copyright (c) 2015 Fifteen Jugg"
},
{
"path": "FaceRec/FJLiveCameraViewController.m",
"chars": 2710,
"preview": "//\n// ViewController.m\n// opencvtest\n//\n// Created by Engin Kurutepe on 16/01/15.\n// Copyright (c) 2015 Fifteen Jugg"
},
{
"path": "FaceRec/Images.xcassets/AppIcon.appiconset/Contents.json",
"chars": 1077,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"iphone\",\n \"size\" : \"29x29\",\n \"scale\" : \"2x\"\n },\n {\n \"idiom\""
},
{
"path": "FaceRec/Info.plist",
"chars": 1520,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "FaceRec/UIImage+OpenCV.h",
"chars": 393,
"preview": "//\n// UIImage+OpenCV.h\n// opencvtest\n//\n// Created by Engin Kurutepe on 26/01/15.\n// Copyright (c) 2015 Fifteen Jugg"
},
{
"path": "FaceRec/UIImage+OpenCV.mm",
"chars": 4412,
"preview": "//\n// UIImage+OpenCV.m\n// opencvtest\n//\n// Created by Engin Kurutepe on 26/01/15.\n// Copyright (c) 2015 Fifteen Jugg"
},
{
"path": "FaceRec/haarcascade_eye_tree_eyeglasses.xml",
"chars": 1095035,
"preview": "<?xml version=\"1.0\"?>\n<!--\n Tree-based 20x20 frontal eye detector with better handling of eyeglasses.\n Created by "
},
{
"path": "FaceRec/haarcascade_frontalface_alt2.xml",
"chars": 837462,
"preview": "<?xml version=\"1.0\"?>\n<!--\n Tree-based 20x20 gentle adaboost frontal face detector.\n Created by Rainer Lienhart.\n\n"
},
{
"path": "FaceRec/main.m",
"chars": 357,
"preview": "//\n// main.m\n// opencvtest\n//\n// Created by Engin Kurutepe on 16/01/15.\n// Copyright (c) 2015 Fifteen Jugglers Softw"
},
{
"path": "Podfile",
"chars": 149,
"preview": "source 'https://github.com/CocoaPods/Specs.git'\n\nplatform :ios, '8.0'\ninhibit_all_warnings!\n\ntarget 'opencv-facerec' do\n"
},
{
"path": "README.md",
"chars": 606,
"preview": "# iOS-OpenCV-FaceRec\n\nA small app demonstrating how OpenCV can be used on iOS to perform face recognition.\n\nPlease read "
},
{
"path": "iOS-OpenCV-FaceRec.xcodeproj/project.pbxproj",
"chars": 20997,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "iOS-OpenCV-FaceRec.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
"chars": 155,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"self:opencvtest.xcod"
},
{
"path": "iOS-OpenCV-FaceRec.xcworkspace/contents.xcworkspacedata",
"chars": 236,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"group:iOS-OpenCV-Fac"
}
]
About this extraction
This page contains the full source code of the objcio/issue-21-OpenCV-FaceRec GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 25 files (1.9 MB), approximately 598.2k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.