1 /*M/////////////////////////////////////////////////////////////////////////////////////// 2 // 3 // IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. 4 // 5 // By downloading, copying, installing or using the software you agree to this license. 6 // If you do not agree to this license, do not download, install, 7 // copy or use the software. 8 // 9 // 10 // License Agreement 11 // For Open Source Computer Vision Library 12 // 13 // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. 14 // Copyright (C) 2009, Willow Garage Inc., all rights reserved. 15 // Third party copyrights are property of their respective owners. 16 // 17 // Redistribution and use in source and binary forms, with or without modification, 18 // are permitted provided that the following conditions are met: 19 // 20 // * Redistribution's of source code must retain the above copyright notice, 21 // this list of conditions and the following disclaimer. 22 // 23 // * Redistribution's in binary form must reproduce the above copyright notice, 24 // this list of conditions and the following disclaimer in the documentation 25 // and/or other materials provided with the distribution. 26 // 27 // * The name of the copyright holders may not be used to endorse or promote products 28 // derived from this software without specific prior written permission. 29 // 30 // This software is provided by the copyright holders and contributors "as is" and 31 // any express or implied warranties, including, but not limited to, the implied 32 // warranties of merchantability and fitness for a particular purpose are disclaimed. 33 // In no event shall the Intel Corporation or contributors be liable for any direct, 34 // indirect, incidental, special, exemplary, or consequential damages 35 // (including, but not limited to, procurement of substitute goods or services; 36 // loss of use, data, or profits; or business interruption) however caused 37 // and on any theory of liability, whether in contract, strict liability, 38 // or tort (including negligence or otherwise) arising in any way out of 39 // the use of this software, even if advised of the possibility of such damage. 40 // 41 //M*/ 42 43 #include "precomp.hpp" 44 #include "cascadedetect.hpp" 45 #include "opencv2/core/core_c.h" 46 #include "opencl_kernels_objdetect.hpp" 47 48 #include <cstdio> 49 #include <iterator> 50 #include <limits> 51 52 /****************************************************************************************\ 53 The code below is implementation of HOG (Histogram-of-Oriented Gradients) 54 descriptor and object detection, introduced by Navneet Dalal and Bill Triggs. 55 56 The computed feature vectors are compatible with the 57 INRIA Object Detection and Localization Toolkit 58 (http://pascal.inrialpes.fr/soft/olt/) 59 \****************************************************************************************/ 60 61 namespace cv 62 { 63 64 #define NTHREADS 256 65 66 enum {DESCR_FORMAT_COL_BY_COL, DESCR_FORMAT_ROW_BY_ROW}; 67 68 static int numPartsWithin(int size, int part_size, int stride) 69 { 70 return (size - part_size + stride) / stride; 71 } 72 73 static Size numPartsWithin(cv::Size size, cv::Size part_size, 74 cv::Size stride) 75 { 76 return Size(numPartsWithin(size.width, part_size.width, stride.width), 77 numPartsWithin(size.height, part_size.height, stride.height)); 78 } 79 80 static size_t getBlockHistogramSize(Size block_size, Size cell_size, int nbins) 81 { 82 Size cells_per_block = Size(block_size.width / cell_size.width, 83 block_size.height / cell_size.height); 84 return (size_t)(nbins * cells_per_block.area()); 85 } 86 87 size_t HOGDescriptor::getDescriptorSize() const 88 { 89 CV_Assert(blockSize.width % cellSize.width == 0 && 90 blockSize.height % cellSize.height == 0); 91 CV_Assert((winSize.width - blockSize.width) % blockStride.width == 0 && 92 (winSize.height - blockSize.height) % blockStride.height == 0 ); 93 94 return (size_t)nbins* 95 (blockSize.width/cellSize.width)* 96 (blockSize.height/cellSize.height)* 97 ((winSize.width - blockSize.width)/blockStride.width + 1)* 98 ((winSize.height - blockSize.height)/blockStride.height + 1); 99 } 100 101 double HOGDescriptor::getWinSigma() const 102 { 103 return winSigma >= 0 ? winSigma : (blockSize.width + blockSize.height)/8.; 104 } 105 106 bool HOGDescriptor::checkDetectorSize() const 107 { 108 size_t detectorSize = svmDetector.size(), descriptorSize = getDescriptorSize(); 109 return detectorSize == 0 || 110 detectorSize == descriptorSize || 111 detectorSize == descriptorSize + 1; 112 } 113 114 void HOGDescriptor::setSVMDetector(InputArray _svmDetector) 115 { 116 _svmDetector.getMat().convertTo(svmDetector, CV_32F); 117 CV_Assert(checkDetectorSize()); 118 119 Mat detector_reordered(1, (int)svmDetector.size(), CV_32FC1); 120 121 size_t block_hist_size = getBlockHistogramSize(blockSize, cellSize, nbins); 122 cv::Size blocks_per_img = numPartsWithin(winSize, blockSize, blockStride); 123 124 for (int i = 0; i < blocks_per_img.height; ++i) 125 for (int j = 0; j < blocks_per_img.width; ++j) 126 { 127 const float *src = &svmDetector[0] + (j * blocks_per_img.height + i) * block_hist_size; 128 float *dst = detector_reordered.ptr<float>() + (i * blocks_per_img.width + j) * block_hist_size; 129 for (size_t k = 0; k < block_hist_size; ++k) 130 dst[k] = src[k]; 131 } 132 size_t descriptor_size = getDescriptorSize(); 133 free_coef = svmDetector.size() > descriptor_size ? svmDetector[descriptor_size] : 0; 134 detector_reordered.copyTo(oclSvmDetector); 135 } 136 137 #define CV_TYPE_NAME_HOG_DESCRIPTOR "opencv-object-detector-hog" 138 139 bool HOGDescriptor::read(FileNode& obj) 140 { 141 if( !obj.isMap() ) 142 return false; 143 FileNodeIterator it = obj["winSize"].begin(); 144 it >> winSize.width >> winSize.height; 145 it = obj["blockSize"].begin(); 146 it >> blockSize.width >> blockSize.height; 147 it = obj["blockStride"].begin(); 148 it >> blockStride.width >> blockStride.height; 149 it = obj["cellSize"].begin(); 150 it >> cellSize.width >> cellSize.height; 151 obj["nbins"] >> nbins; 152 obj["derivAperture"] >> derivAperture; 153 obj["winSigma"] >> winSigma; 154 obj["histogramNormType"] >> histogramNormType; 155 obj["L2HysThreshold"] >> L2HysThreshold; 156 obj["gammaCorrection"] >> gammaCorrection; 157 obj["nlevels"] >> nlevels; 158 if (obj["signedGradient"].empty()) 159 signedGradient = false; 160 else 161 obj["signedGradient"] >> signedGradient; 162 163 FileNode vecNode = obj["SVMDetector"]; 164 if( vecNode.isSeq() ) 165 { 166 vecNode >> svmDetector; 167 CV_Assert(checkDetectorSize()); 168 } 169 return true; 170 } 171 172 void HOGDescriptor::write(FileStorage& fs, const String& objName) const 173 { 174 if( !objName.empty() ) 175 fs << objName; 176 177 fs << "{" CV_TYPE_NAME_HOG_DESCRIPTOR 178 << "winSize" << winSize 179 << "blockSize" << blockSize 180 << "blockStride" << blockStride 181 << "cellSize" << cellSize 182 << "nbins" << nbins 183 << "derivAperture" << derivAperture 184 << "winSigma" << getWinSigma() 185 << "histogramNormType" << histogramNormType 186 << "L2HysThreshold" << L2HysThreshold 187 << "gammaCorrection" << gammaCorrection 188 << "nlevels" << nlevels 189 << "signedGradient" << signedGradient; 190 if( !svmDetector.empty() ) 191 fs << "SVMDetector" << svmDetector; 192 fs << "}"; 193 } 194 195 bool HOGDescriptor::load(const String& filename, const String& objname) 196 { 197 FileStorage fs(filename, FileStorage::READ); 198 FileNode obj = !objname.empty() ? fs[objname] : fs.getFirstTopLevelNode(); 199 return read(obj); 200 } 201 202 void HOGDescriptor::save(const String& filename, const String& objName) const 203 { 204 FileStorage fs(filename, FileStorage::WRITE); 205 write(fs, !objName.empty() ? objName : FileStorage::getDefaultObjectName(filename)); 206 } 207 208 void HOGDescriptor::copyTo(HOGDescriptor& c) const 209 { 210 c.winSize = winSize; 211 c.blockSize = blockSize; 212 c.blockStride = blockStride; 213 c.cellSize = cellSize; 214 c.nbins = nbins; 215 c.derivAperture = derivAperture; 216 c.winSigma = winSigma; 217 c.histogramNormType = histogramNormType; 218 c.L2HysThreshold = L2HysThreshold; 219 c.gammaCorrection = gammaCorrection; 220 c.svmDetector = svmDetector; 221 c.nlevels = nlevels; 222 c.signedGradient = signedGradient; 223 } 224 225 void HOGDescriptor::computeGradient(const Mat& img, Mat& grad, Mat& qangle, 226 Size paddingTL, Size paddingBR) const 227 { 228 CV_Assert( img.type() == CV_8U || img.type() == CV_8UC3 ); 229 230 Size gradsize(img.cols + paddingTL.width + paddingBR.width, 231 img.rows + paddingTL.height + paddingBR.height); 232 grad.create(gradsize, CV_32FC2); // <magnitude*(1-alpha), magnitude*alpha> 233 qangle.create(gradsize, CV_8UC2); // [0..nbins-1] - quantized gradient orientation 234 235 Size wholeSize; 236 Point roiofs; 237 img.locateROI(wholeSize, roiofs); 238 239 int i, x, y; 240 int cn = img.channels(); 241 242 Mat_<float> _lut(1, 256); 243 const float* const lut = &_lut(0,0); 244 #if CV_SSE2 245 const int indeces[] = { 0, 1, 2, 3 }; 246 __m128i idx = _mm_loadu_si128((const __m128i*)indeces); 247 __m128i ifour = _mm_set1_epi32(4); 248 249 float* const _data = &_lut(0, 0); 250 if( gammaCorrection ) 251 for( i = 0; i < 256; i += 4 ) 252 { 253 _mm_storeu_ps(_data + i, _mm_sqrt_ps(_mm_cvtepi32_ps(idx))); 254 idx = _mm_add_epi32(idx, ifour); 255 } 256 else 257 for( i = 0; i < 256; i += 4 ) 258 { 259 _mm_storeu_ps(_data + i, _mm_cvtepi32_ps(idx)); 260 idx = _mm_add_epi32(idx, ifour); 261 } 262 #else 263 if( gammaCorrection ) 264 for( i = 0; i < 256; i++ ) 265 _lut(0,i) = std::sqrt((float)i); 266 else 267 for( i = 0; i < 256; i++ ) 268 _lut(0,i) = (float)i; 269 #endif 270 271 AutoBuffer<int> mapbuf(gradsize.width + gradsize.height + 4); 272 int* xmap = (int*)mapbuf + 1; 273 int* ymap = xmap + gradsize.width + 2; 274 275 const int borderType = (int)BORDER_REFLECT_101; 276 277 for( x = -1; x < gradsize.width + 1; x++ ) 278 xmap[x] = borderInterpolate(x - paddingTL.width + roiofs.x, 279 wholeSize.width, borderType) - roiofs.x; 280 for( y = -1; y < gradsize.height + 1; y++ ) 281 ymap[y] = borderInterpolate(y - paddingTL.height + roiofs.y, 282 wholeSize.height, borderType) - roiofs.y; 283 284 // x- & y- derivatives for the whole row 285 int width = gradsize.width; 286 AutoBuffer<float> _dbuf(width*4); 287 float* const dbuf = _dbuf; 288 Mat Dx(1, width, CV_32F, dbuf); 289 Mat Dy(1, width, CV_32F, dbuf + width); 290 Mat Mag(1, width, CV_32F, dbuf + width*2); 291 Mat Angle(1, width, CV_32F, dbuf + width*3); 292 293 if (cn == 3) 294 { 295 int end = gradsize.width + 2; 296 xmap -= 1, x = 0; 297 #if CV_SSE2 298 __m128i ithree = _mm_set1_epi32(3); 299 for ( ; x <= end - 4; x += 4) 300 _mm_storeu_si128((__m128i*)(xmap + x), _mm_mullo_epi16(ithree, 301 _mm_loadu_si128((const __m128i*)(xmap + x)))); 302 #endif 303 for ( ; x < end; ++x) 304 xmap[x] *= 3; 305 xmap += 1; 306 } 307 308 float angleScale = signedGradient ? (float)(nbins/(2.0*CV_PI)) : (float)(nbins/CV_PI); 309 for( y = 0; y < gradsize.height; y++ ) 310 { 311 const uchar* imgPtr = img.ptr(ymap[y]); 312 //In case subimage is used ptr() generates an assert for next and prev rows 313 //(see http://code.opencv.org/issues/4149) 314 const uchar* prevPtr = img.data + img.step*ymap[y-1]; 315 const uchar* nextPtr = img.data + img.step*ymap[y+1]; 316 317 float* gradPtr = grad.ptr<float>(y); 318 uchar* qanglePtr = qangle.ptr(y); 319 320 if( cn == 1 ) 321 { 322 for( x = 0; x < width; x++ ) 323 { 324 int x1 = xmap[x]; 325 dbuf[x] = (float)(lut[imgPtr[xmap[x+1]]] - lut[imgPtr[xmap[x-1]]]); 326 dbuf[width + x] = (float)(lut[nextPtr[x1]] - lut[prevPtr[x1]]); 327 } 328 } 329 else 330 { 331 x = 0; 332 #if CV_SSE2 333 for( ; x <= width - 4; x += 4 ) 334 { 335 int x0 = xmap[x], x1 = xmap[x+1], x2 = xmap[x+2], x3 = xmap[x+3]; 336 typedef const uchar* const T; 337 T p02 = imgPtr + xmap[x+1], p00 = imgPtr + xmap[x-1]; 338 T p12 = imgPtr + xmap[x+2], p10 = imgPtr + xmap[x]; 339 T p22 = imgPtr + xmap[x+3], p20 = p02; 340 T p32 = imgPtr + xmap[x+4], p30 = p12; 341 342 __m128 _dx0 = _mm_sub_ps(_mm_set_ps(lut[p32[0]], lut[p22[0]], lut[p12[0]], lut[p02[0]]), 343 _mm_set_ps(lut[p30[0]], lut[p20[0]], lut[p10[0]], lut[p00[0]])); 344 __m128 _dx1 = _mm_sub_ps(_mm_set_ps(lut[p32[1]], lut[p22[1]], lut[p12[1]], lut[p02[1]]), 345 _mm_set_ps(lut[p30[1]], lut[p20[1]], lut[p10[1]], lut[p00[1]])); 346 __m128 _dx2 = _mm_sub_ps(_mm_set_ps(lut[p32[2]], lut[p22[2]], lut[p12[2]], lut[p02[2]]), 347 _mm_set_ps(lut[p30[2]], lut[p20[2]], lut[p10[2]], lut[p00[2]])); 348 349 __m128 _dy0 = _mm_sub_ps(_mm_set_ps(lut[nextPtr[x3]], lut[nextPtr[x2]], lut[nextPtr[x1]], lut[nextPtr[x0]]), 350 _mm_set_ps(lut[prevPtr[x3]], lut[prevPtr[x2]], lut[prevPtr[x1]], lut[prevPtr[x0]])); 351 __m128 _dy1 = _mm_sub_ps(_mm_set_ps(lut[nextPtr[x3+1]], lut[nextPtr[x2+1]], lut[nextPtr[x1+1]], lut[nextPtr[x0+1]]), 352 _mm_set_ps(lut[prevPtr[x3+1]], lut[prevPtr[x2+1]], lut[prevPtr[x1+1]], lut[prevPtr[x0+1]])); 353 __m128 _dy2 = _mm_sub_ps(_mm_set_ps(lut[nextPtr[x3+2]], lut[nextPtr[x2+2]], lut[nextPtr[x1+2]], lut[nextPtr[x0+2]]), 354 _mm_set_ps(lut[prevPtr[x3+2]], lut[prevPtr[x2+2]], lut[prevPtr[x1+2]], lut[prevPtr[x0+2]])); 355 356 __m128 _mag0 = _mm_add_ps(_mm_mul_ps(_dx0, _dx0), _mm_mul_ps(_dy0, _dy0)); 357 __m128 _mag1 = _mm_add_ps(_mm_mul_ps(_dx1, _dx1), _mm_mul_ps(_dy1, _dy1)); 358 __m128 _mag2 = _mm_add_ps(_mm_mul_ps(_dx2, _dx2), _mm_mul_ps(_dy2, _dy2)); 359 360 __m128 mask = _mm_cmpgt_ps(_mag2, _mag1); 361 _dx2 = _mm_or_ps(_mm_and_ps(_dx2, mask), _mm_andnot_ps(mask, _dx1)); 362 _dy2 = _mm_or_ps(_mm_and_ps(_dy2, mask), _mm_andnot_ps(mask, _dy1)); 363 364 mask = _mm_cmpgt_ps(_mm_max_ps(_mag2, _mag1), _mag0); 365 _dx2 = _mm_or_ps(_mm_and_ps(_dx2, mask), _mm_andnot_ps(mask, _dx0)); 366 _dy2 = _mm_or_ps(_mm_and_ps(_dy2, mask), _mm_andnot_ps(mask, _dy0)); 367 368 _mm_storeu_ps(dbuf + x, _dx2); 369 _mm_storeu_ps(dbuf + x + width, _dy2); 370 } 371 #endif 372 for( ; x < width; x++ ) 373 { 374 int x1 = xmap[x]; 375 float dx0, dy0, dx, dy, mag0, mag; 376 const uchar* p2 = imgPtr + xmap[x+1]; 377 const uchar* p0 = imgPtr + xmap[x-1]; 378 379 dx0 = lut[p2[2]] - lut[p0[2]]; 380 dy0 = lut[nextPtr[x1+2]] - lut[prevPtr[x1+2]]; 381 mag0 = dx0*dx0 + dy0*dy0; 382 383 dx = lut[p2[1]] - lut[p0[1]]; 384 dy = lut[nextPtr[x1+1]] - lut[prevPtr[x1+1]]; 385 mag = dx*dx + dy*dy; 386 if( mag0 < mag ) 387 { 388 dx0 = dx; 389 dy0 = dy; 390 mag0 = mag; 391 } 392 393 dx = lut[p2[0]] - lut[p0[0]]; 394 dy = lut[nextPtr[x1]] - lut[prevPtr[x1]]; 395 mag = dx*dx + dy*dy; 396 if( mag0 < mag ) 397 { 398 dx0 = dx; 399 dy0 = dy; 400 mag0 = mag; 401 } 402 403 dbuf[x] = dx0; 404 dbuf[x+width] = dy0; 405 } 406 } 407 408 // computing angles and magnidutes 409 cartToPolar( Dx, Dy, Mag, Angle, false ); 410 411 // filling the result matrix 412 x = 0; 413 #if CV_SSE2 414 __m128 fhalf = _mm_set1_ps(0.5f), fzero = _mm_setzero_ps(); 415 __m128 _angleScale = _mm_set1_ps(angleScale), fone = _mm_set1_ps(1.0f); 416 __m128i ione = _mm_set1_epi32(1), _nbins = _mm_set1_epi32(nbins), izero = _mm_setzero_si128(); 417 418 for ( ; x <= width - 4; x += 4) 419 { 420 int x2 = x << 1; 421 __m128 _mag = _mm_loadu_ps(dbuf + x + (width << 1)); 422 __m128 _angle = _mm_loadu_ps(dbuf + x + width * 3); 423 _angle = _mm_sub_ps(_mm_mul_ps(_angleScale, _angle), fhalf); 424 425 __m128 sign = _mm_and_ps(fone, _mm_cmplt_ps(_angle, fzero)); 426 __m128i _hidx = _mm_cvttps_epi32(_angle); 427 _hidx = _mm_sub_epi32(_hidx, _mm_cvtps_epi32(sign)); 428 _angle = _mm_sub_ps(_angle, _mm_cvtepi32_ps(_hidx)); 429 430 __m128 ft0 = _mm_mul_ps(_mag, _mm_sub_ps(fone, _angle)); 431 __m128 ft1 = _mm_mul_ps(_mag, _angle); 432 __m128 ft2 = _mm_unpacklo_ps(ft0, ft1); 433 __m128 ft3 = _mm_unpackhi_ps(ft0, ft1); 434 435 _mm_storeu_ps(gradPtr + x2, ft2); 436 _mm_storeu_ps(gradPtr + x2 + 4, ft3); 437 438 __m128i mask0 = _mm_sub_epi32(izero, _mm_srli_epi32(_hidx, 31)); 439 __m128i it0 = _mm_and_si128(mask0, _nbins); 440 mask0 = _mm_cmplt_epi32(_hidx, _nbins); 441 __m128i it1 = _mm_andnot_si128(mask0, _nbins); 442 _hidx = _mm_add_epi32(_hidx, _mm_sub_epi32(it0, it1)); 443 444 it0 = _mm_packus_epi16(_mm_packs_epi32(_hidx, izero), izero); 445 _hidx = _mm_add_epi32(ione, _hidx); 446 _hidx = _mm_and_si128(_hidx, _mm_cmplt_epi32(_hidx, _nbins)); 447 it1 = _mm_packus_epi16(_mm_packs_epi32(_hidx, izero), izero); 448 it0 = _mm_unpacklo_epi8(it0, it1); 449 450 _mm_storel_epi64((__m128i*)(qanglePtr + x2), it0); 451 } 452 #endif 453 for( ; x < width; x++ ) 454 { 455 float mag = dbuf[x+width*2], angle = dbuf[x+width*3]*angleScale - 0.5f; 456 int hidx = cvFloor(angle); 457 angle -= hidx; 458 gradPtr[x*2] = mag*(1.f - angle); 459 gradPtr[x*2+1] = mag*angle; 460 461 if( hidx < 0 ) 462 hidx += nbins; 463 else if( hidx >= nbins ) 464 hidx -= nbins; 465 466 CV_Assert( (unsigned)hidx < (unsigned)nbins ); 467 468 qanglePtr[x*2] = (uchar)hidx; 469 hidx++; 470 hidx &= hidx < nbins ? -1 : 0; 471 qanglePtr[x*2+1] = (uchar)hidx; 472 } 473 } 474 } 475 476 struct HOGCache 477 { 478 struct BlockData 479 { 480 BlockData() : 481 histOfs(0), imgOffset() 482 { } 483 484 int histOfs; 485 Point imgOffset; 486 }; 487 488 struct PixData 489 { 490 size_t gradOfs, qangleOfs; 491 int histOfs[4]; 492 float histWeights[4]; 493 float gradWeight; 494 }; 495 496 HOGCache(); 497 HOGCache(const HOGDescriptor* descriptor, 498 const Mat& img, const Size& paddingTL, const Size& paddingBR, 499 bool useCache, const Size& cacheStride); 500 virtual ~HOGCache() { } 501 virtual void init(const HOGDescriptor* descriptor, 502 const Mat& img, const Size& paddingTL, const Size& paddingBR, 503 bool useCache, const Size& cacheStride); 504 505 Size windowsInImage(const Size& imageSize, const Size& winStride) const; 506 Rect getWindow(const Size& imageSize, const Size& winStride, int idx) const; 507 508 const float* getBlock(Point pt, float* buf); 509 virtual void normalizeBlockHistogram(float* histogram) const; 510 511 std::vector<PixData> pixData; 512 std::vector<BlockData> blockData; 513 514 bool useCache; 515 std::vector<int> ymaxCached; 516 Size winSize; 517 Size cacheStride; 518 Size nblocks, ncells; 519 int blockHistogramSize; 520 int count1, count2, count4; 521 Point imgoffset; 522 Mat_<float> blockCache; 523 Mat_<uchar> blockCacheFlags; 524 525 Mat grad, qangle; 526 const HOGDescriptor* descriptor; 527 }; 528 529 HOGCache::HOGCache() : 530 blockHistogramSize(), count1(), count2(), count4() 531 { 532 useCache = false; 533 descriptor = 0; 534 } 535 536 HOGCache::HOGCache(const HOGDescriptor* _descriptor, 537 const Mat& _img, const Size& _paddingTL, const Size& _paddingBR, 538 bool _useCache, const Size& _cacheStride) 539 { 540 init(_descriptor, _img, _paddingTL, _paddingBR, _useCache, _cacheStride); 541 } 542 543 void HOGCache::init(const HOGDescriptor* _descriptor, 544 const Mat& _img, const Size& _paddingTL, const Size& _paddingBR, 545 bool _useCache, const Size& _cacheStride) 546 { 547 descriptor = _descriptor; 548 cacheStride = _cacheStride; 549 useCache = _useCache; 550 551 descriptor->computeGradient(_img, grad, qangle, _paddingTL, _paddingBR); 552 imgoffset = _paddingTL; 553 554 winSize = descriptor->winSize; 555 Size blockSize = descriptor->blockSize; 556 Size blockStride = descriptor->blockStride; 557 Size cellSize = descriptor->cellSize; 558 int i, j, nbins = descriptor->nbins; 559 int rawBlockSize = blockSize.width*blockSize.height; 560 561 nblocks = Size((winSize.width - blockSize.width)/blockStride.width + 1, 562 (winSize.height - blockSize.height)/blockStride.height + 1); 563 ncells = Size(blockSize.width/cellSize.width, blockSize.height/cellSize.height); 564 blockHistogramSize = ncells.width*ncells.height*nbins; 565 566 if( useCache ) 567 { 568 Size cacheSize((grad.cols - blockSize.width)/cacheStride.width+1, 569 (winSize.height/cacheStride.height)+1); 570 571 blockCache.create(cacheSize.height, cacheSize.width*blockHistogramSize); 572 blockCacheFlags.create(cacheSize); 573 574 size_t cacheRows = blockCache.rows; 575 ymaxCached.resize(cacheRows); 576 for(size_t ii = 0; ii < cacheRows; ii++ ) 577 ymaxCached[ii] = -1; 578 } 579 580 Mat_<float> weights(blockSize); 581 float sigma = (float)descriptor->getWinSigma(); 582 float scale = 1.f/(sigma*sigma*2); 583 584 { 585 AutoBuffer<float> di(blockSize.height), dj(blockSize.width); 586 float* _di = (float*)di, *_dj = (float*)dj; 587 float bh = blockSize.height * 0.5f, bw = blockSize.width * 0.5f; 588 589 i = 0; 590 #if CV_SSE2 591 const int a[] = { 0, 1, 2, 3 }; 592 __m128i idx = _mm_loadu_si128((__m128i*)a); 593 __m128 _bw = _mm_set1_ps(bw), _bh = _mm_set1_ps(bh); 594 __m128i ifour = _mm_set1_epi32(4); 595 596 for (; i <= blockSize.height - 4; i += 4) 597 { 598 __m128 t = _mm_sub_ps(_mm_cvtepi32_ps(idx), _bh); 599 t = _mm_mul_ps(t, t); 600 idx = _mm_add_epi32(idx, ifour); 601 _mm_storeu_ps(_di + i, t); 602 } 603 #endif 604 for ( ; i < blockSize.height; ++i) 605 { 606 _di[i] = i - bh; 607 _di[i] *= _di[i]; 608 } 609 610 j = 0; 611 #if CV_SSE2 612 idx = _mm_loadu_si128((__m128i*)a); 613 for (; j <= blockSize.width - 4; j += 4) 614 { 615 __m128 t = _mm_sub_ps(_mm_cvtepi32_ps(idx), _bw); 616 t = _mm_mul_ps(t, t); 617 idx = _mm_add_epi32(idx, ifour); 618 _mm_storeu_ps(_dj + j, t); 619 } 620 #endif 621 for ( ; j < blockSize.width; ++j) 622 { 623 _dj[j] = j - bw; 624 _dj[j] *= _dj[j]; 625 } 626 627 for(i = 0; i < blockSize.height; i++) 628 for(j = 0; j < blockSize.width; j++) 629 weights(i,j) = std::exp(-(_di[i] + _dj[j])*scale); 630 } 631 632 blockData.resize(nblocks.width*nblocks.height); 633 pixData.resize(rawBlockSize*3); 634 635 // Initialize 2 lookup tables, pixData & blockData. 636 // Here is why: 637 // 638 // The detection algorithm runs in 4 nested loops (at each pyramid layer): 639 // loop over the windows within the input image 640 // loop over the blocks within each window 641 // loop over the cells within each block 642 // loop over the pixels in each cell 643 // 644 // As each of the loops runs over a 2-dimensional array, 645 // we could get 8(!) nested loops in total, which is very-very slow. 646 // 647 // To speed the things up, we do the following: 648 // 1. loop over windows is unrolled in the HOGDescriptor::{compute|detect} methods; 649 // inside we compute the current search window using getWindow() method. 650 // Yes, it involves some overhead (function call + couple of divisions), 651 // but it's tiny in fact. 652 // 2. loop over the blocks is also unrolled. Inside we use pre-computed blockData[j] 653 // to set up gradient and histogram pointers. 654 // 3. loops over cells and pixels in each cell are merged 655 // (since there is no overlap between cells, each pixel in the block is processed once) 656 // and also unrolled. Inside we use PixData[k] to access the gradient values and 657 // update the histogram 658 // 659 660 count1 = count2 = count4 = 0; 661 for( j = 0; j < blockSize.width; j++ ) 662 for( i = 0; i < blockSize.height; i++ ) 663 { 664 PixData* data = 0; 665 float cellX = (j+0.5f)/cellSize.width - 0.5f; 666 float cellY = (i+0.5f)/cellSize.height - 0.5f; 667 int icellX0 = cvFloor(cellX); 668 int icellY0 = cvFloor(cellY); 669 int icellX1 = icellX0 + 1, icellY1 = icellY0 + 1; 670 cellX -= icellX0; 671 cellY -= icellY0; 672 673 if( (unsigned)icellX0 < (unsigned)ncells.width && 674 (unsigned)icellX1 < (unsigned)ncells.width ) 675 { 676 if( (unsigned)icellY0 < (unsigned)ncells.height && 677 (unsigned)icellY1 < (unsigned)ncells.height ) 678 { 679 data = &pixData[rawBlockSize*2 + (count4++)]; 680 data->histOfs[0] = (icellX0*ncells.height + icellY0)*nbins; 681 data->histWeights[0] = (1.f - cellX)*(1.f - cellY); 682 data->histOfs[1] = (icellX1*ncells.height + icellY0)*nbins; 683 data->histWeights[1] = cellX*(1.f - cellY); 684 data->histOfs[2] = (icellX0*ncells.height + icellY1)*nbins; 685 data->histWeights[2] = (1.f - cellX)*cellY; 686 data->histOfs[3] = (icellX1*ncells.height + icellY1)*nbins; 687 data->histWeights[3] = cellX*cellY; 688 } 689 else 690 { 691 data = &pixData[rawBlockSize + (count2++)]; 692 if( (unsigned)icellY0 < (unsigned)ncells.height ) 693 { 694 icellY1 = icellY0; 695 cellY = 1.f - cellY; 696 } 697 data->histOfs[0] = (icellX0*ncells.height + icellY1)*nbins; 698 data->histWeights[0] = (1.f - cellX)*cellY; 699 data->histOfs[1] = (icellX1*ncells.height + icellY1)*nbins; 700 data->histWeights[1] = cellX*cellY; 701 data->histOfs[2] = data->histOfs[3] = 0; 702 data->histWeights[2] = data->histWeights[3] = 0; 703 } 704 } 705 else 706 { 707 if( (unsigned)icellX0 < (unsigned)ncells.width ) 708 { 709 icellX1 = icellX0; 710 cellX = 1.f - cellX; 711 } 712 713 if( (unsigned)icellY0 < (unsigned)ncells.height && 714 (unsigned)icellY1 < (unsigned)ncells.height ) 715 { 716 data = &pixData[rawBlockSize + (count2++)]; 717 data->histOfs[0] = (icellX1*ncells.height + icellY0)*nbins; 718 data->histWeights[0] = cellX*(1.f - cellY); 719 data->histOfs[1] = (icellX1*ncells.height + icellY1)*nbins; 720 data->histWeights[1] = cellX*cellY; 721 data->histOfs[2] = data->histOfs[3] = 0; 722 data->histWeights[2] = data->histWeights[3] = 0; 723 } 724 else 725 { 726 data = &pixData[count1++]; 727 if( (unsigned)icellY0 < (unsigned)ncells.height ) 728 { 729 icellY1 = icellY0; 730 cellY = 1.f - cellY; 731 } 732 data->histOfs[0] = (icellX1*ncells.height + icellY1)*nbins; 733 data->histWeights[0] = cellX*cellY; 734 data->histOfs[1] = data->histOfs[2] = data->histOfs[3] = 0; 735 data->histWeights[1] = data->histWeights[2] = data->histWeights[3] = 0; 736 } 737 } 738 data->gradOfs = (grad.cols*i + j)*2; 739 data->qangleOfs = (qangle.cols*i + j)*2; 740 data->gradWeight = weights(i,j); 741 } 742 743 assert( count1 + count2 + count4 == rawBlockSize ); 744 // defragment pixData 745 for( j = 0; j < count2; j++ ) 746 pixData[j + count1] = pixData[j + rawBlockSize]; 747 for( j = 0; j < count4; j++ ) 748 pixData[j + count1 + count2] = pixData[j + rawBlockSize*2]; 749 count2 += count1; 750 count4 += count2; 751 752 // initialize blockData 753 for( j = 0; j < nblocks.width; j++ ) 754 for( i = 0; i < nblocks.height; i++ ) 755 { 756 BlockData& data = blockData[j*nblocks.height + i]; 757 data.histOfs = (j*nblocks.height + i)*blockHistogramSize; 758 data.imgOffset = Point(j*blockStride.width,i*blockStride.height); 759 } 760 } 761 762 const float* HOGCache::getBlock(Point pt, float* buf) 763 { 764 float* blockHist = buf; 765 assert(descriptor != 0); 766 767 // Size blockSize = descriptor->blockSize; 768 pt += imgoffset; 769 770 // CV_Assert( (unsigned)pt.x <= (unsigned)(grad.cols - blockSize.width) && 771 // (unsigned)pt.y <= (unsigned)(grad.rows - blockSize.height) ); 772 773 if( useCache ) 774 { 775 CV_Assert( pt.x % cacheStride.width == 0 && 776 pt.y % cacheStride.height == 0 ); 777 Point cacheIdx(pt.x/cacheStride.width, 778 (pt.y/cacheStride.height) % blockCache.rows); 779 if( pt.y != ymaxCached[cacheIdx.y] ) 780 { 781 Mat_<uchar> cacheRow = blockCacheFlags.row(cacheIdx.y); 782 cacheRow = (uchar)0; 783 ymaxCached[cacheIdx.y] = pt.y; 784 } 785 786 blockHist = &blockCache[cacheIdx.y][cacheIdx.x*blockHistogramSize]; 787 uchar& computedFlag = blockCacheFlags(cacheIdx.y, cacheIdx.x); 788 if( computedFlag != 0 ) 789 return blockHist; 790 computedFlag = (uchar)1; // set it at once, before actual computing 791 } 792 793 int k, C1 = count1, C2 = count2, C4 = count4; 794 const float* gradPtr = grad.ptr<float>(pt.y) + pt.x*2; 795 const uchar* qanglePtr = qangle.ptr(pt.y) + pt.x*2; 796 797 // CV_Assert( blockHist != 0 ); 798 memset(blockHist, 0, sizeof(float) * blockHistogramSize); 799 800 const PixData* _pixData = &pixData[0]; 801 802 for( k = 0; k < C1; k++ ) 803 { 804 const PixData& pk = _pixData[k]; 805 const float* const a = gradPtr + pk.gradOfs; 806 float w = pk.gradWeight*pk.histWeights[0]; 807 const uchar* h = qanglePtr + pk.qangleOfs; 808 int h0 = h[0], h1 = h[1]; 809 810 float* hist = blockHist + pk.histOfs[0]; 811 float t0 = hist[h0] + a[0]*w; 812 float t1 = hist[h1] + a[1]*w; 813 hist[h0] = t0; hist[h1] = t1; 814 } 815 816 #if CV_SSE2 817 float hist0[4], hist1[4]; 818 for( ; k < C2; k++ ) 819 { 820 const PixData& pk = _pixData[k]; 821 const float* const a = gradPtr + pk.gradOfs; 822 const uchar* const h = qanglePtr + pk.qangleOfs; 823 int h0 = h[0], h1 = h[1]; 824 825 __m128 _a0 = _mm_set1_ps(a[0]), _a1 = _mm_set1_ps(a[1]); 826 __m128 _w = _mm_mul_ps(_mm_set1_ps(pk.gradWeight), _mm_loadu_ps(pk.histWeights)); 827 __m128 _t0 = _mm_mul_ps(_a0, _w), _t1 = _mm_mul_ps(_a1, _w); 828 829 _mm_storeu_ps(hist0, _t0); 830 _mm_storeu_ps(hist1, _t1); 831 832 float* hist = blockHist + pk.histOfs[0]; 833 float t0 = hist[h0] + hist0[0]; 834 float t1 = hist[h1] + hist1[0]; 835 hist[h0] = t0; hist[h1] = t1; 836 837 hist = blockHist + pk.histOfs[1]; 838 t0 = hist[h0] + hist0[1]; 839 t1 = hist[h1] + hist1[1]; 840 hist[h0] = t0; hist[h1] = t1; 841 } 842 #else 843 for( ; k < C2; k++ ) 844 { 845 const PixData& pk = _pixData[k]; 846 const float* const a = gradPtr + pk.gradOfs; 847 float w, t0, t1, a0 = a[0], a1 = a[1]; 848 const uchar* const h = qanglePtr + pk.qangleOfs; 849 int h0 = h[0], h1 = h[1]; 850 851 float* hist = blockHist + pk.histOfs[0]; 852 w = pk.gradWeight*pk.histWeights[0]; 853 t0 = hist[h0] + a0*w; 854 t1 = hist[h1] + a1*w; 855 hist[h0] = t0; hist[h1] = t1; 856 857 hist = blockHist + pk.histOfs[1]; 858 w = pk.gradWeight*pk.histWeights[1]; 859 t0 = hist[h0] + a0*w; 860 t1 = hist[h1] + a1*w; 861 hist[h0] = t0; hist[h1] = t1; 862 } 863 #endif 864 865 #if CV_SSE2 866 for( ; k < C4; k++ ) 867 { 868 const PixData& pk = _pixData[k]; 869 const float* const a = gradPtr + pk.gradOfs; 870 const uchar* const h = qanglePtr + pk.qangleOfs; 871 int h0 = h[0], h1 = h[1]; 872 873 __m128 _a0 = _mm_set1_ps(a[0]), _a1 = _mm_set1_ps(a[1]); 874 __m128 _w = _mm_mul_ps(_mm_set1_ps(pk.gradWeight), _mm_loadu_ps(pk.histWeights)); 875 __m128 _t0 = _mm_mul_ps(_a0, _w), _t1 = _mm_mul_ps(_a1, _w); 876 877 _mm_storeu_ps(hist0, _t0); 878 _mm_storeu_ps(hist1, _t1); 879 880 float* hist = blockHist + pk.histOfs[0]; 881 float t0 = hist[h0] + hist0[0]; 882 float t1 = hist[h1] + hist1[0]; 883 hist[h0] = t0; hist[h1] = t1; 884 885 hist = blockHist + pk.histOfs[1]; 886 t0 = hist[h0] + hist0[1]; 887 t1 = hist[h1] + hist1[1]; 888 hist[h0] = t0; hist[h1] = t1; 889 890 hist = blockHist + pk.histOfs[2]; 891 t0 = hist[h0] + hist0[2]; 892 t1 = hist[h1] + hist1[2]; 893 hist[h0] = t0; hist[h1] = t1; 894 895 hist = blockHist + pk.histOfs[3]; 896 t0 = hist[h0] + hist0[3]; 897 t1 = hist[h1] + hist1[3]; 898 hist[h0] = t0; hist[h1] = t1; 899 900 // __m128 _hist0 = _mm_set_ps((blockHist + pk.histOfs[3])[h0], (blockHist + pk.histOfs[2])[h0], 901 // (blockHist + pk.histOfs[1])[h0], (blockHist + pk.histOfs[0])[h0]); 902 // __m128 _hist1 = _mm_set_ps((blockHist + pk.histOfs[3])[h1], (blockHist + pk.histOfs[2])[h1], 903 // (blockHist + pk.histOfs[1])[h1], (blockHist + pk.histOfs[0])[h1]); 904 // 905 // _hist0 = _mm_add_ps(_t0, _hist0); 906 // _hist1 = _mm_add_ps(_t1, _hist1); 907 // 908 // _mm_storeu_ps(hist0, _hist0); 909 // _mm_storeu_ps(hist1, _hist1); 910 // 911 // (pk.histOfs[0] + blockHist)[h0] = hist0[0]; 912 // (pk.histOfs[1] + blockHist)[h0] = hist0[1]; 913 // (pk.histOfs[2] + blockHist)[h0] = hist0[2]; 914 // (pk.histOfs[3] + blockHist)[h0] = hist0[3]; 915 // 916 // (pk.histOfs[0] + blockHist)[h1] = hist1[0]; 917 // (pk.histOfs[1] + blockHist)[h1] = hist1[1]; 918 // (pk.histOfs[2] + blockHist)[h1] = hist1[2]; 919 // (pk.histOfs[3] + blockHist)[h1] = hist1[3]; 920 } 921 #else 922 for( ; k < C4; k++ ) 923 { 924 const PixData& pk = _pixData[k]; 925 const float* a = gradPtr + pk.gradOfs; 926 float w, t0, t1, a0 = a[0], a1 = a[1]; 927 const uchar* h = qanglePtr + pk.qangleOfs; 928 int h0 = h[0], h1 = h[1]; 929 930 float* hist = blockHist + pk.histOfs[0]; 931 w = pk.gradWeight*pk.histWeights[0]; 932 t0 = hist[h0] + a0*w; 933 t1 = hist[h1] + a1*w; 934 hist[h0] = t0; hist[h1] = t1; 935 936 hist = blockHist + pk.histOfs[1]; 937 w = pk.gradWeight*pk.histWeights[1]; 938 t0 = hist[h0] + a0*w; 939 t1 = hist[h1] + a1*w; 940 hist[h0] = t0; hist[h1] = t1; 941 942 hist = blockHist + pk.histOfs[2]; 943 w = pk.gradWeight*pk.histWeights[2]; 944 t0 = hist[h0] + a0*w; 945 t1 = hist[h1] + a1*w; 946 hist[h0] = t0; hist[h1] = t1; 947 948 hist = blockHist + pk.histOfs[3]; 949 w = pk.gradWeight*pk.histWeights[3]; 950 t0 = hist[h0] + a0*w; 951 t1 = hist[h1] + a1*w; 952 hist[h0] = t0; hist[h1] = t1; 953 } 954 #endif 955 956 normalizeBlockHistogram(blockHist); 957 958 return blockHist; 959 } 960 961 void HOGCache::normalizeBlockHistogram(float* _hist) const 962 { 963 float* hist = &_hist[0], sum = 0.0f, partSum[4]; 964 size_t i = 0, sz = blockHistogramSize; 965 966 #if CV_SSE2 967 __m128 p0 = _mm_loadu_ps(hist); 968 __m128 s = _mm_mul_ps(p0, p0); 969 970 for (i = 4; i <= sz - 4; i += 4) 971 { 972 p0 = _mm_loadu_ps(hist + i); 973 s = _mm_add_ps(s, _mm_mul_ps(p0, p0)); 974 } 975 _mm_storeu_ps(partSum, s); 976 #else 977 partSum[0] = 0.0f; 978 partSum[1] = 0.0f; 979 partSum[2] = 0.0f; 980 partSum[3] = 0.0f; 981 for ( ; i <= sz - 4; i += 4) 982 { 983 partSum[0] += hist[i] * hist[i]; 984 partSum[1] += hist[i+1] * hist[i+1]; 985 partSum[2] += hist[i+2] * hist[i+2]; 986 partSum[3] += hist[i+3] * hist[i+3]; 987 } 988 #endif 989 float t0 = partSum[0] + partSum[1]; 990 float t1 = partSum[2] + partSum[3]; 991 sum = t0 + t1; 992 for ( ; i < sz; ++i) 993 sum += hist[i]*hist[i]; 994 995 float scale = 1.f/(std::sqrt(sum)+sz*0.1f), thresh = (float)descriptor->L2HysThreshold; 996 i = 0, sum = 0.0f; 997 998 #if CV_SSE2 999 __m128 _scale = _mm_set1_ps(scale); 1000 static __m128 _threshold = _mm_set1_ps(thresh); 1001 1002 __m128 p = _mm_mul_ps(_scale, _mm_loadu_ps(hist)); 1003 p = _mm_min_ps(p, _threshold); 1004 s = _mm_mul_ps(p, p); 1005 _mm_storeu_ps(hist, p); 1006 1007 for(i = 4 ; i <= sz - 4; i += 4) 1008 { 1009 p = _mm_loadu_ps(hist + i); 1010 p = _mm_mul_ps(p, _scale); 1011 p = _mm_min_ps(p, _threshold); 1012 s = _mm_add_ps(s, _mm_mul_ps(p, p)); 1013 _mm_storeu_ps(hist + i, p); 1014 } 1015 1016 _mm_storeu_ps(partSum, s); 1017 #else 1018 partSum[0] = 0.0f; 1019 partSum[1] = 0.0f; 1020 partSum[2] = 0.0f; 1021 partSum[3] = 0.0f; 1022 for( ; i <= sz - 4; i += 4) 1023 { 1024 hist[i] = std::min(hist[i]*scale, thresh); 1025 hist[i+1] = std::min(hist[i+1]*scale, thresh); 1026 hist[i+2] = std::min(hist[i+2]*scale, thresh); 1027 hist[i+3] = std::min(hist[i+3]*scale, thresh); 1028 partSum[0] += hist[i]*hist[i]; 1029 partSum[1] += hist[i+1]*hist[i+1]; 1030 partSum[2] += hist[i+2]*hist[i+2]; 1031 partSum[3] += hist[i+3]*hist[i+3]; 1032 } 1033 #endif 1034 t0 = partSum[0] + partSum[1]; 1035 t1 = partSum[2] + partSum[3]; 1036 sum = t0 + t1; 1037 for( ; i < sz; ++i) 1038 { 1039 hist[i] = std::min(hist[i]*scale, thresh); 1040 sum += hist[i]*hist[i]; 1041 } 1042 1043 scale = 1.f/(std::sqrt(sum)+1e-3f), i = 0; 1044 #if CV_SSE2 1045 __m128 _scale2 = _mm_set1_ps(scale); 1046 for ( ; i <= sz - 4; i += 4) 1047 { 1048 __m128 t = _mm_mul_ps(_scale2, _mm_loadu_ps(hist + i)); 1049 _mm_storeu_ps(hist + i, t); 1050 } 1051 #endif 1052 for ( ; i < sz; ++i) 1053 hist[i] *= scale; 1054 } 1055 1056 Size HOGCache::windowsInImage(const Size& imageSize, const Size& winStride) const 1057 { 1058 return Size((imageSize.width - winSize.width)/winStride.width + 1, 1059 (imageSize.height - winSize.height)/winStride.height + 1); 1060 } 1061 1062 Rect HOGCache::getWindow(const Size& imageSize, const Size& winStride, int idx) const 1063 { 1064 int nwindowsX = (imageSize.width - winSize.width)/winStride.width + 1; 1065 int y = idx / nwindowsX; 1066 int x = idx - nwindowsX*y; 1067 return Rect( x*winStride.width, y*winStride.height, winSize.width, winSize.height ); 1068 } 1069 1070 static inline int gcd(int a, int b) 1071 { 1072 if( a < b ) 1073 std::swap(a, b); 1074 while( b > 0 ) 1075 { 1076 int r = a % b; 1077 a = b; 1078 b = r; 1079 } 1080 return a; 1081 } 1082 1083 #ifdef HAVE_OPENCL 1084 1085 static bool ocl_compute_gradients_8UC1(int height, int width, InputArray _img, float angle_scale, 1086 UMat grad, UMat qangle, bool correct_gamma, int nbins) 1087 { 1088 ocl::Kernel k("compute_gradients_8UC1_kernel", ocl::objdetect::objdetect_hog_oclsrc); 1089 if(k.empty()) 1090 return false; 1091 1092 UMat img = _img.getUMat(); 1093 1094 size_t localThreads[3] = { NTHREADS, 1, 1 }; 1095 size_t globalThreads[3] = { width, height, 1 }; 1096 char correctGamma = (correct_gamma) ? 1 : 0; 1097 int grad_quadstep = (int)grad.step >> 3; 1098 int qangle_elem_size = CV_ELEM_SIZE1(qangle.type()); 1099 int qangle_step = (int)qangle.step / (2 * qangle_elem_size); 1100 1101 int idx = 0; 1102 idx = k.set(idx, height); 1103 idx = k.set(idx, width); 1104 idx = k.set(idx, (int)img.step1()); 1105 idx = k.set(idx, grad_quadstep); 1106 idx = k.set(idx, qangle_step); 1107 idx = k.set(idx, ocl::KernelArg::PtrReadOnly(img)); 1108 idx = k.set(idx, ocl::KernelArg::PtrWriteOnly(grad)); 1109 idx = k.set(idx, ocl::KernelArg::PtrWriteOnly(qangle)); 1110 idx = k.set(idx, angle_scale); 1111 idx = k.set(idx, correctGamma); 1112 idx = k.set(idx, nbins); 1113 1114 return k.run(2, globalThreads, localThreads, false); 1115 } 1116 1117 static bool ocl_computeGradient(InputArray img, UMat grad, UMat qangle, int nbins, Size effect_size, bool gamma_correction, bool signedGradient) 1118 { 1119 float angleScale = signedGradient ? (float)(nbins/(2.0*CV_PI)) : (float)(nbins/CV_PI); 1120 1121 return ocl_compute_gradients_8UC1(effect_size.height, effect_size.width, img, 1122 angleScale, grad, qangle, gamma_correction, nbins); 1123 } 1124 1125 #define CELL_WIDTH 8 1126 #define CELL_HEIGHT 8 1127 #define CELLS_PER_BLOCK_X 2 1128 #define CELLS_PER_BLOCK_Y 2 1129 1130 static bool ocl_compute_hists(int nbins, int block_stride_x, int block_stride_y, int height, int width, 1131 UMat grad, UMat qangle, UMat gauss_w_lut, UMat block_hists, size_t block_hist_size) 1132 { 1133 ocl::Kernel k("compute_hists_lut_kernel", ocl::objdetect::objdetect_hog_oclsrc); 1134 if(k.empty()) 1135 return false; 1136 bool is_cpu = cv::ocl::Device::getDefault().type() == cv::ocl::Device::TYPE_CPU; 1137 cv::String opts; 1138 if(is_cpu) 1139 opts = "-D CPU "; 1140 else 1141 opts = cv::format("-D WAVE_SIZE=%d", k.preferedWorkGroupSizeMultiple()); 1142 k.create("compute_hists_lut_kernel", ocl::objdetect::objdetect_hog_oclsrc, opts); 1143 if(k.empty()) 1144 return false; 1145 1146 int img_block_width = (width - CELLS_PER_BLOCK_X * CELL_WIDTH + block_stride_x)/block_stride_x; 1147 int img_block_height = (height - CELLS_PER_BLOCK_Y * CELL_HEIGHT + block_stride_y)/block_stride_y; 1148 int blocks_total = img_block_width * img_block_height; 1149 1150 int qangle_elem_size = CV_ELEM_SIZE1(qangle.type()); 1151 int grad_quadstep = (int)grad.step >> 2; 1152 int qangle_step = (int)qangle.step / qangle_elem_size; 1153 1154 int blocks_in_group = 4; 1155 size_t localThreads[3] = { blocks_in_group * 24, 2, 1 }; 1156 size_t globalThreads[3] = {((img_block_width * img_block_height + blocks_in_group - 1)/blocks_in_group) * localThreads[0], 2, 1 }; 1157 1158 int hists_size = (nbins * CELLS_PER_BLOCK_X * CELLS_PER_BLOCK_Y * 12) * sizeof(float); 1159 int final_hists_size = (nbins * CELLS_PER_BLOCK_X * CELLS_PER_BLOCK_Y) * sizeof(float); 1160 1161 int smem = (hists_size + final_hists_size) * blocks_in_group; 1162 1163 int idx = 0; 1164 idx = k.set(idx, block_stride_x); 1165 idx = k.set(idx, block_stride_y); 1166 idx = k.set(idx, nbins); 1167 idx = k.set(idx, (int)block_hist_size); 1168 idx = k.set(idx, img_block_width); 1169 idx = k.set(idx, blocks_in_group); 1170 idx = k.set(idx, blocks_total); 1171 idx = k.set(idx, grad_quadstep); 1172 idx = k.set(idx, qangle_step); 1173 idx = k.set(idx, ocl::KernelArg::PtrReadOnly(grad)); 1174 idx = k.set(idx, ocl::KernelArg::PtrReadOnly(qangle)); 1175 idx = k.set(idx, ocl::KernelArg::PtrReadOnly(gauss_w_lut)); 1176 idx = k.set(idx, ocl::KernelArg::PtrWriteOnly(block_hists)); 1177 idx = k.set(idx, (void*)NULL, (size_t)smem); 1178 1179 return k.run(2, globalThreads, localThreads, false); 1180 } 1181 1182 static int power_2up(unsigned int n) 1183 { 1184 for(unsigned int i = 1; i<=1024; i<<=1) 1185 if(n < i) 1186 return i; 1187 return -1; // Input is too big 1188 } 1189 1190 static bool ocl_normalize_hists(int nbins, int block_stride_x, int block_stride_y, 1191 int height, int width, UMat block_hists, float threshold) 1192 { 1193 int block_hist_size = nbins * CELLS_PER_BLOCK_X * CELLS_PER_BLOCK_Y; 1194 int img_block_width = (width - CELLS_PER_BLOCK_X * CELL_WIDTH + block_stride_x) 1195 / block_stride_x; 1196 int img_block_height = (height - CELLS_PER_BLOCK_Y * CELL_HEIGHT + block_stride_y) 1197 / block_stride_y; 1198 int nthreads; 1199 size_t globalThreads[3] = { 1, 1, 1 }; 1200 size_t localThreads[3] = { 1, 1, 1 }; 1201 1202 int idx = 0; 1203 bool is_cpu = cv::ocl::Device::getDefault().type() == cv::ocl::Device::TYPE_CPU; 1204 cv::String opts; 1205 ocl::Kernel k; 1206 if ( nbins == 9 ) 1207 { 1208 k.create("normalize_hists_36_kernel", ocl::objdetect::objdetect_hog_oclsrc, ""); 1209 if(k.empty()) 1210 return false; 1211 if(is_cpu) 1212 opts = "-D CPU "; 1213 else 1214 opts = cv::format("-D WAVE_SIZE=%d", k.preferedWorkGroupSizeMultiple()); 1215 k.create("normalize_hists_36_kernel", ocl::objdetect::objdetect_hog_oclsrc, opts); 1216 if(k.empty()) 1217 return false; 1218 1219 int blocks_in_group = NTHREADS / block_hist_size; 1220 nthreads = blocks_in_group * block_hist_size; 1221 int num_groups = (img_block_width * img_block_height + blocks_in_group - 1)/blocks_in_group; 1222 globalThreads[0] = nthreads * num_groups; 1223 localThreads[0] = nthreads; 1224 } 1225 else 1226 { 1227 k.create("normalize_hists_kernel", ocl::objdetect::objdetect_hog_oclsrc, ""); 1228 if(k.empty()) 1229 return false; 1230 if(is_cpu) 1231 opts = "-D CPU "; 1232 else 1233 opts = cv::format("-D WAVE_SIZE=%d", k.preferedWorkGroupSizeMultiple()); 1234 k.create("normalize_hists_kernel", ocl::objdetect::objdetect_hog_oclsrc, opts); 1235 if(k.empty()) 1236 return false; 1237 1238 nthreads = power_2up(block_hist_size); 1239 globalThreads[0] = img_block_width * nthreads; 1240 globalThreads[1] = img_block_height; 1241 localThreads[0] = nthreads; 1242 1243 if ((nthreads < 32) || (nthreads > 512) ) 1244 return false; 1245 1246 idx = k.set(idx, nthreads); 1247 idx = k.set(idx, block_hist_size); 1248 idx = k.set(idx, img_block_width); 1249 } 1250 idx = k.set(idx, ocl::KernelArg::PtrReadWrite(block_hists)); 1251 idx = k.set(idx, threshold); 1252 idx = k.set(idx, (void*)NULL, nthreads * sizeof(float)); 1253 1254 return k.run(2, globalThreads, localThreads, false); 1255 } 1256 1257 static bool ocl_extract_descrs_by_rows(int win_height, int win_width, int block_stride_y, int block_stride_x, int win_stride_y, int win_stride_x, 1258 int height, int width, UMat block_hists, UMat descriptors, 1259 int block_hist_size, int descr_size, int descr_width) 1260 { 1261 ocl::Kernel k("extract_descrs_by_rows_kernel", ocl::objdetect::objdetect_hog_oclsrc); 1262 if(k.empty()) 1263 return false; 1264 1265 int win_block_stride_x = win_stride_x / block_stride_x; 1266 int win_block_stride_y = win_stride_y / block_stride_y; 1267 int img_win_width = (width - win_width + win_stride_x) / win_stride_x; 1268 int img_win_height = (height - win_height + win_stride_y) / win_stride_y; 1269 int img_block_width = (width - CELLS_PER_BLOCK_X * CELL_WIDTH + block_stride_x) / 1270 block_stride_x; 1271 1272 int descriptors_quadstep = (int)descriptors.step >> 2; 1273 1274 size_t globalThreads[3] = { img_win_width * NTHREADS, img_win_height, 1 }; 1275 size_t localThreads[3] = { NTHREADS, 1, 1 }; 1276 1277 int idx = 0; 1278 idx = k.set(idx, block_hist_size); 1279 idx = k.set(idx, descriptors_quadstep); 1280 idx = k.set(idx, descr_size); 1281 idx = k.set(idx, descr_width); 1282 idx = k.set(idx, img_block_width); 1283 idx = k.set(idx, win_block_stride_x); 1284 idx = k.set(idx, win_block_stride_y); 1285 idx = k.set(idx, ocl::KernelArg::PtrReadOnly(block_hists)); 1286 idx = k.set(idx, ocl::KernelArg::PtrWriteOnly(descriptors)); 1287 1288 return k.run(2, globalThreads, localThreads, false); 1289 } 1290 1291 static bool ocl_extract_descrs_by_cols(int win_height, int win_width, int block_stride_y, int block_stride_x, int win_stride_y, int win_stride_x, 1292 int height, int width, UMat block_hists, UMat descriptors, 1293 int block_hist_size, int descr_size, int nblocks_win_x, int nblocks_win_y) 1294 { 1295 ocl::Kernel k("extract_descrs_by_cols_kernel", ocl::objdetect::objdetect_hog_oclsrc); 1296 if(k.empty()) 1297 return false; 1298 1299 int win_block_stride_x = win_stride_x / block_stride_x; 1300 int win_block_stride_y = win_stride_y / block_stride_y; 1301 int img_win_width = (width - win_width + win_stride_x) / win_stride_x; 1302 int img_win_height = (height - win_height + win_stride_y) / win_stride_y; 1303 int img_block_width = (width - CELLS_PER_BLOCK_X * CELL_WIDTH + block_stride_x) / 1304 block_stride_x; 1305 1306 int descriptors_quadstep = (int)descriptors.step >> 2; 1307 1308 size_t globalThreads[3] = { img_win_width * NTHREADS, img_win_height, 1 }; 1309 size_t localThreads[3] = { NTHREADS, 1, 1 }; 1310 1311 int idx = 0; 1312 idx = k.set(idx, block_hist_size); 1313 idx = k.set(idx, descriptors_quadstep); 1314 idx = k.set(idx, descr_size); 1315 idx = k.set(idx, nblocks_win_x); 1316 idx = k.set(idx, nblocks_win_y); 1317 idx = k.set(idx, img_block_width); 1318 idx = k.set(idx, win_block_stride_x); 1319 idx = k.set(idx, win_block_stride_y); 1320 idx = k.set(idx, ocl::KernelArg::PtrReadOnly(block_hists)); 1321 idx = k.set(idx, ocl::KernelArg::PtrWriteOnly(descriptors)); 1322 1323 return k.run(2, globalThreads, localThreads, false); 1324 } 1325 1326 static bool ocl_compute(InputArray _img, Size win_stride, std::vector<float>& _descriptors, int descr_format, Size blockSize, 1327 Size cellSize, int nbins, Size blockStride, Size winSize, float sigma, bool gammaCorrection, double L2HysThreshold, bool signedGradient) 1328 { 1329 Size imgSize = _img.size(); 1330 Size effect_size = imgSize; 1331 1332 UMat grad(imgSize, CV_32FC2); 1333 int qangle_type = ocl::Device::getDefault().isIntel() ? CV_32SC2 : CV_8UC2; 1334 UMat qangle(imgSize, qangle_type); 1335 1336 const size_t block_hist_size = getBlockHistogramSize(blockSize, cellSize, nbins); 1337 const Size blocks_per_img = numPartsWithin(imgSize, blockSize, blockStride); 1338 UMat block_hists(1, static_cast<int>(block_hist_size * blocks_per_img.area()) + 256, CV_32F); 1339 1340 Size wins_per_img = numPartsWithin(imgSize, winSize, win_stride); 1341 UMat labels(1, wins_per_img.area(), CV_8U); 1342 1343 float scale = 1.f / (2.f * sigma * sigma); 1344 Mat gaussian_lut(1, 512, CV_32FC1); 1345 int idx = 0; 1346 for(int i=-8; i<8; i++) 1347 for(int j=-8; j<8; j++) 1348 gaussian_lut.at<float>(idx++) = std::exp(-(j * j + i * i) * scale); 1349 for(int i=-8; i<8; i++) 1350 for(int j=-8; j<8; j++) 1351 gaussian_lut.at<float>(idx++) = (8.f - fabs(j + 0.5f)) * (8.f - fabs(i + 0.5f)) / 64.f; 1352 1353 if(!ocl_computeGradient(_img, grad, qangle, nbins, effect_size, gammaCorrection, signedGradient)) 1354 return false; 1355 1356 UMat gauss_w_lut; 1357 gaussian_lut.copyTo(gauss_w_lut); 1358 if(!ocl_compute_hists(nbins, blockStride.width, blockStride.height, effect_size.height, 1359 effect_size.width, grad, qangle, gauss_w_lut, block_hists, block_hist_size)) 1360 return false; 1361 1362 if(!ocl_normalize_hists(nbins, blockStride.width, blockStride.height, effect_size.height, 1363 effect_size.width, block_hists, (float)L2HysThreshold)) 1364 return false; 1365 1366 Size blocks_per_win = numPartsWithin(winSize, blockSize, blockStride); 1367 wins_per_img = numPartsWithin(effect_size, winSize, win_stride); 1368 1369 int descr_size = blocks_per_win.area()*(int)block_hist_size; 1370 int descr_width = (int)block_hist_size*blocks_per_win.width; 1371 1372 UMat descriptors(wins_per_img.area(), static_cast<int>(blocks_per_win.area() * block_hist_size), CV_32F); 1373 switch (descr_format) 1374 { 1375 case DESCR_FORMAT_ROW_BY_ROW: 1376 if(!ocl_extract_descrs_by_rows(winSize.height, winSize.width, 1377 blockStride.height, blockStride.width, win_stride.height, win_stride.width, effect_size.height, 1378 effect_size.width, block_hists, descriptors, (int)block_hist_size, descr_size, descr_width)) 1379 return false; 1380 break; 1381 case DESCR_FORMAT_COL_BY_COL: 1382 if(!ocl_extract_descrs_by_cols(winSize.height, winSize.width, 1383 blockStride.height, blockStride.width, win_stride.height, win_stride.width, effect_size.height, effect_size.width, 1384 block_hists, descriptors, (int)block_hist_size, descr_size, blocks_per_win.width, blocks_per_win.height)) 1385 return false; 1386 break; 1387 default: 1388 return false; 1389 } 1390 descriptors.reshape(1, (int)descriptors.total()).getMat(ACCESS_READ).copyTo(_descriptors); 1391 return true; 1392 } 1393 #endif //HAVE_OPENCL 1394 1395 void HOGDescriptor::compute(InputArray _img, std::vector<float>& descriptors, 1396 Size winStride, Size padding, const std::vector<Point>& locations) const 1397 { 1398 if( winStride == Size() ) 1399 winStride = cellSize; 1400 Size cacheStride(gcd(winStride.width, blockStride.width), 1401 gcd(winStride.height, blockStride.height)); 1402 1403 Size imgSize = _img.size(); 1404 1405 size_t nwindows = locations.size(); 1406 padding.width = (int)alignSize(std::max(padding.width, 0), cacheStride.width); 1407 padding.height = (int)alignSize(std::max(padding.height, 0), cacheStride.height); 1408 Size paddedImgSize(imgSize.width + padding.width*2, imgSize.height + padding.height*2); 1409 1410 CV_OCL_RUN(_img.dims() <= 2 && _img.type() == CV_8UC1 && _img.isUMat(), 1411 ocl_compute(_img, winStride, descriptors, DESCR_FORMAT_COL_BY_COL, blockSize, 1412 cellSize, nbins, blockStride, winSize, (float)getWinSigma(), gammaCorrection, L2HysThreshold, signedGradient)) 1413 1414 Mat img = _img.getMat(); 1415 HOGCache cache(this, img, padding, padding, nwindows == 0, cacheStride); 1416 1417 if( !nwindows ) 1418 nwindows = cache.windowsInImage(paddedImgSize, winStride).area(); 1419 1420 const HOGCache::BlockData* blockData = &cache.blockData[0]; 1421 1422 int nblocks = cache.nblocks.area(); 1423 int blockHistogramSize = cache.blockHistogramSize; 1424 size_t dsize = getDescriptorSize(); 1425 descriptors.resize(dsize*nwindows); 1426 1427 // for each window 1428 for( size_t i = 0; i < nwindows; i++ ) 1429 { 1430 float* descriptor = &descriptors[i*dsize]; 1431 1432 Point pt0; 1433 if( !locations.empty() ) 1434 { 1435 pt0 = locations[i]; 1436 if( pt0.x < -padding.width || pt0.x > img.cols + padding.width - winSize.width || 1437 pt0.y < -padding.height || pt0.y > img.rows + padding.height - winSize.height ) 1438 continue; 1439 } 1440 else 1441 { 1442 pt0 = cache.getWindow(paddedImgSize, winStride, (int)i).tl() - Point(padding); 1443 // CV_Assert(pt0.x % cacheStride.width == 0 && pt0.y % cacheStride.height == 0); 1444 } 1445 1446 for( int j = 0; j < nblocks; j++ ) 1447 { 1448 const HOGCache::BlockData& bj = blockData[j]; 1449 Point pt = pt0 + bj.imgOffset; 1450 1451 float* dst = descriptor + bj.histOfs; 1452 const float* src = cache.getBlock(pt, dst); 1453 if( src != dst ) 1454 memcpy(dst, src, blockHistogramSize * sizeof(float)); 1455 } 1456 } 1457 } 1458 1459 void HOGDescriptor::detect(const Mat& img, 1460 std::vector<Point>& hits, std::vector<double>& weights, double hitThreshold, 1461 Size winStride, Size padding, const std::vector<Point>& locations) const 1462 { 1463 hits.clear(); 1464 weights.clear(); 1465 if( svmDetector.empty() ) 1466 return; 1467 1468 if( winStride == Size() ) 1469 winStride = cellSize; 1470 Size cacheStride(gcd(winStride.width, blockStride.width), 1471 gcd(winStride.height, blockStride.height)); 1472 1473 size_t nwindows = locations.size(); 1474 padding.width = (int)alignSize(std::max(padding.width, 0), cacheStride.width); 1475 padding.height = (int)alignSize(std::max(padding.height, 0), cacheStride.height); 1476 Size paddedImgSize(img.cols + padding.width*2, img.rows + padding.height*2); 1477 1478 HOGCache cache(this, img, padding, padding, nwindows == 0, cacheStride); 1479 1480 if( !nwindows ) 1481 nwindows = cache.windowsInImage(paddedImgSize, winStride).area(); 1482 1483 const HOGCache::BlockData* blockData = &cache.blockData[0]; 1484 1485 int nblocks = cache.nblocks.area(); 1486 int blockHistogramSize = cache.blockHistogramSize; 1487 size_t dsize = getDescriptorSize(); 1488 1489 double rho = svmDetector.size() > dsize ? svmDetector[dsize] : 0; 1490 std::vector<float> blockHist(blockHistogramSize); 1491 1492 #if CV_SSE2 1493 float partSum[4]; 1494 #endif 1495 1496 for( size_t i = 0; i < nwindows; i++ ) 1497 { 1498 Point pt0; 1499 if( !locations.empty() ) 1500 { 1501 pt0 = locations[i]; 1502 if( pt0.x < -padding.width || pt0.x > img.cols + padding.width - winSize.width || 1503 pt0.y < -padding.height || pt0.y > img.rows + padding.height - winSize.height ) 1504 continue; 1505 } 1506 else 1507 { 1508 pt0 = cache.getWindow(paddedImgSize, winStride, (int)i).tl() - Point(padding); 1509 CV_Assert(pt0.x % cacheStride.width == 0 && pt0.y % cacheStride.height == 0); 1510 } 1511 double s = rho; 1512 const float* svmVec = &svmDetector[0]; 1513 1514 int j, k; 1515 for( j = 0; j < nblocks; j++, svmVec += blockHistogramSize ) 1516 { 1517 const HOGCache::BlockData& bj = blockData[j]; 1518 Point pt = pt0 + bj.imgOffset; 1519 1520 const float* vec = cache.getBlock(pt, &blockHist[0]); 1521 #if CV_SSE2 1522 __m128 _vec = _mm_loadu_ps(vec); 1523 __m128 _svmVec = _mm_loadu_ps(svmVec); 1524 __m128 sum = _mm_mul_ps(_svmVec, _vec); 1525 1526 for( k = 4; k <= blockHistogramSize - 4; k += 4 ) 1527 { 1528 _vec = _mm_loadu_ps(vec + k); 1529 _svmVec = _mm_loadu_ps(svmVec + k); 1530 1531 sum = _mm_add_ps(sum, _mm_mul_ps(_vec, _svmVec)); 1532 } 1533 1534 _mm_storeu_ps(partSum, sum); 1535 double t0 = partSum[0] + partSum[1]; 1536 double t1 = partSum[2] + partSum[3]; 1537 s += t0 + t1; 1538 #else 1539 for( k = 0; k <= blockHistogramSize - 4; k += 4 ) 1540 s += vec[k]*svmVec[k] + vec[k+1]*svmVec[k+1] + 1541 vec[k+2]*svmVec[k+2] + vec[k+3]*svmVec[k+3]; 1542 #endif 1543 for( ; k < blockHistogramSize; k++ ) 1544 s += vec[k]*svmVec[k]; 1545 } 1546 if( s >= hitThreshold ) 1547 { 1548 hits.push_back(pt0); 1549 weights.push_back(s); 1550 } 1551 } 1552 } 1553 1554 void HOGDescriptor::detect(const Mat& img, std::vector<Point>& hits, double hitThreshold, 1555 Size winStride, Size padding, const std::vector<Point>& locations) const 1556 { 1557 std::vector<double> weightsV; 1558 detect(img, hits, weightsV, hitThreshold, winStride, padding, locations); 1559 } 1560 1561 class HOGInvoker : 1562 public ParallelLoopBody 1563 { 1564 public: 1565 HOGInvoker( const HOGDescriptor* _hog, const Mat& _img, 1566 double _hitThreshold, const Size& _winStride, const Size& _padding, 1567 const double* _levelScale, std::vector<Rect> * _vec, Mutex* _mtx, 1568 std::vector<double>* _weights=0, std::vector<double>* _scales=0 ) 1569 { 1570 hog = _hog; 1571 img = _img; 1572 hitThreshold = _hitThreshold; 1573 winStride = _winStride; 1574 padding = _padding; 1575 levelScale = _levelScale; 1576 vec = _vec; 1577 weights = _weights; 1578 scales = _scales; 1579 mtx = _mtx; 1580 } 1581 1582 void operator()( const Range& range ) const 1583 { 1584 int i, i1 = range.start, i2 = range.end; 1585 double minScale = i1 > 0 ? levelScale[i1] : i2 > 1 ? levelScale[i1+1] : std::max(img.cols, img.rows); 1586 Size maxSz(cvCeil(img.cols/minScale), cvCeil(img.rows/minScale)); 1587 Mat smallerImgBuf(maxSz, img.type()); 1588 std::vector<Point> locations; 1589 std::vector<double> hitsWeights; 1590 1591 for( i = i1; i < i2; i++ ) 1592 { 1593 double scale = levelScale[i]; 1594 Size sz(cvRound(img.cols/scale), cvRound(img.rows/scale)); 1595 Mat smallerImg(sz, img.type(), smallerImgBuf.ptr()); 1596 if( sz == img.size() ) 1597 smallerImg = Mat(sz, img.type(), img.data, img.step); 1598 else 1599 resize(img, smallerImg, sz); 1600 hog->detect(smallerImg, locations, hitsWeights, hitThreshold, winStride, padding); 1601 Size scaledWinSize = Size(cvRound(hog->winSize.width*scale), cvRound(hog->winSize.height*scale)); 1602 1603 mtx->lock(); 1604 for( size_t j = 0; j < locations.size(); j++ ) 1605 { 1606 vec->push_back(Rect(cvRound(locations[j].x*scale), 1607 cvRound(locations[j].y*scale), 1608 scaledWinSize.width, scaledWinSize.height)); 1609 if (scales) 1610 scales->push_back(scale); 1611 } 1612 mtx->unlock(); 1613 1614 if (weights && (!hitsWeights.empty())) 1615 { 1616 mtx->lock(); 1617 for (size_t j = 0; j < locations.size(); j++) 1618 weights->push_back(hitsWeights[j]); 1619 mtx->unlock(); 1620 } 1621 } 1622 } 1623 1624 private: 1625 const HOGDescriptor* hog; 1626 Mat img; 1627 double hitThreshold; 1628 Size winStride; 1629 Size padding; 1630 const double* levelScale; 1631 std::vector<Rect>* vec; 1632 std::vector<double>* weights; 1633 std::vector<double>* scales; 1634 Mutex* mtx; 1635 }; 1636 1637 #ifdef HAVE_OPENCL 1638 1639 static bool ocl_classify_hists(int win_height, int win_width, int block_stride_y, int block_stride_x, 1640 int win_stride_y, int win_stride_x, int height, int width, 1641 const UMat& block_hists, UMat detector, 1642 float free_coef, float threshold, UMat& labels, Size descr_size, int block_hist_size) 1643 { 1644 int nthreads; 1645 bool is_cpu = cv::ocl::Device::getDefault().type() == cv::ocl::Device::TYPE_CPU; 1646 cv::String opts; 1647 1648 ocl::Kernel k; 1649 int idx = 0; 1650 switch (descr_size.width) 1651 { 1652 case 180: 1653 nthreads = 180; 1654 k.create("classify_hists_180_kernel", ocl::objdetect::objdetect_hog_oclsrc, ""); 1655 if(k.empty()) 1656 return false; 1657 if(is_cpu) 1658 opts = "-D CPU "; 1659 else 1660 opts = cv::format("-D WAVE_SIZE=%d", k.preferedWorkGroupSizeMultiple()); 1661 k.create("classify_hists_180_kernel", ocl::objdetect::objdetect_hog_oclsrc, opts); 1662 if(k.empty()) 1663 return false; 1664 idx = k.set(idx, descr_size.width); 1665 idx = k.set(idx, descr_size.height); 1666 break; 1667 1668 case 252: 1669 nthreads = 256; 1670 k.create("classify_hists_252_kernel", ocl::objdetect::objdetect_hog_oclsrc, ""); 1671 if(k.empty()) 1672 return false; 1673 if(is_cpu) 1674 opts = "-D CPU "; 1675 else 1676 opts = cv::format("-D WAVE_SIZE=%d", k.preferedWorkGroupSizeMultiple()); 1677 k.create("classify_hists_252_kernel", ocl::objdetect::objdetect_hog_oclsrc, opts); 1678 if(k.empty()) 1679 return false; 1680 idx = k.set(idx, descr_size.width); 1681 idx = k.set(idx, descr_size.height); 1682 break; 1683 1684 default: 1685 nthreads = 256; 1686 k.create("classify_hists_kernel", ocl::objdetect::objdetect_hog_oclsrc, ""); 1687 if(k.empty()) 1688 return false; 1689 if(is_cpu) 1690 opts = "-D CPU "; 1691 else 1692 opts = cv::format("-D WAVE_SIZE=%d", k.preferedWorkGroupSizeMultiple()); 1693 k.create("classify_hists_kernel", ocl::objdetect::objdetect_hog_oclsrc, opts); 1694 if(k.empty()) 1695 return false; 1696 idx = k.set(idx, descr_size.area()); 1697 idx = k.set(idx, descr_size.height); 1698 } 1699 1700 int win_block_stride_x = win_stride_x / block_stride_x; 1701 int win_block_stride_y = win_stride_y / block_stride_y; 1702 int img_win_width = (width - win_width + win_stride_x) / win_stride_x; 1703 int img_win_height = (height - win_height + win_stride_y) / win_stride_y; 1704 int img_block_width = (width - CELLS_PER_BLOCK_X * CELL_WIDTH + block_stride_x) / 1705 block_stride_x; 1706 1707 size_t globalThreads[3] = { img_win_width * nthreads, img_win_height, 1 }; 1708 size_t localThreads[3] = { nthreads, 1, 1 }; 1709 1710 idx = k.set(idx, block_hist_size); 1711 idx = k.set(idx, img_win_width); 1712 idx = k.set(idx, img_block_width); 1713 idx = k.set(idx, win_block_stride_x); 1714 idx = k.set(idx, win_block_stride_y); 1715 idx = k.set(idx, ocl::KernelArg::PtrReadOnly(block_hists)); 1716 idx = k.set(idx, ocl::KernelArg::PtrReadOnly(detector)); 1717 idx = k.set(idx, free_coef); 1718 idx = k.set(idx, threshold); 1719 idx = k.set(idx, ocl::KernelArg::PtrWriteOnly(labels)); 1720 1721 return k.run(2, globalThreads, localThreads, false); 1722 } 1723 1724 static bool ocl_detect(InputArray img, std::vector<Point> &hits, double hit_threshold, Size win_stride, 1725 const UMat& oclSvmDetector, Size blockSize, Size cellSize, int nbins, Size blockStride, Size winSize, 1726 bool gammaCorrection, double L2HysThreshold, float sigma, float free_coef, bool signedGradient) 1727 { 1728 hits.clear(); 1729 if (oclSvmDetector.empty()) 1730 return false; 1731 1732 Size imgSize = img.size(); 1733 Size effect_size = imgSize; 1734 UMat grad(imgSize, CV_32FC2); 1735 int qangle_type = ocl::Device::getDefault().isIntel() ? CV_32SC2 : CV_8UC2; 1736 UMat qangle(imgSize, qangle_type); 1737 1738 const size_t block_hist_size = getBlockHistogramSize(blockSize, cellSize, nbins); 1739 const Size blocks_per_img = numPartsWithin(imgSize, blockSize, blockStride); 1740 UMat block_hists(1, static_cast<int>(block_hist_size * blocks_per_img.area()) + 256, CV_32F); 1741 1742 Size wins_per_img = numPartsWithin(imgSize, winSize, win_stride); 1743 UMat labels(1, wins_per_img.area(), CV_8U); 1744 1745 float scale = 1.f / (2.f * sigma * sigma); 1746 Mat gaussian_lut(1, 512, CV_32FC1); 1747 int idx = 0; 1748 for(int i=-8; i<8; i++) 1749 for(int j=-8; j<8; j++) 1750 gaussian_lut.at<float>(idx++) = std::exp(-(j * j + i * i) * scale); 1751 for(int i=-8; i<8; i++) 1752 for(int j=-8; j<8; j++) 1753 gaussian_lut.at<float>(idx++) = (8.f - fabs(j + 0.5f)) * (8.f - fabs(i + 0.5f)) / 64.f; 1754 1755 if(!ocl_computeGradient(img, grad, qangle, nbins, effect_size, gammaCorrection, signedGradient)) 1756 return false; 1757 1758 UMat gauss_w_lut; 1759 gaussian_lut.copyTo(gauss_w_lut); 1760 if(!ocl_compute_hists(nbins, blockStride.width, blockStride.height, effect_size.height, 1761 effect_size.width, grad, qangle, gauss_w_lut, block_hists, block_hist_size)) 1762 return false; 1763 1764 if(!ocl_normalize_hists(nbins, blockStride.width, blockStride.height, effect_size.height, 1765 effect_size.width, block_hists, (float)L2HysThreshold)) 1766 return false; 1767 1768 Size blocks_per_win = numPartsWithin(winSize, blockSize, blockStride); 1769 1770 Size descr_size((int)block_hist_size*blocks_per_win.width, blocks_per_win.height); 1771 1772 if(!ocl_classify_hists(winSize.height, winSize.width, blockStride.height, 1773 blockStride.width, win_stride.height, win_stride.width, 1774 effect_size.height, effect_size.width, block_hists, oclSvmDetector, 1775 free_coef, (float)hit_threshold, labels, descr_size, (int)block_hist_size)) 1776 return false; 1777 1778 Mat labels_host = labels.getMat(ACCESS_READ); 1779 unsigned char *vec = labels_host.ptr(); 1780 for (int i = 0; i < wins_per_img.area(); i++) 1781 { 1782 int y = i / wins_per_img.width; 1783 int x = i - wins_per_img.width * y; 1784 if (vec[i]) 1785 { 1786 hits.push_back(Point(x * win_stride.width, y * win_stride.height)); 1787 } 1788 } 1789 return true; 1790 } 1791 1792 static bool ocl_detectMultiScale(InputArray _img, std::vector<Rect> &found_locations, std::vector<double>& level_scale, 1793 double hit_threshold, Size win_stride, double group_threshold, 1794 const UMat& oclSvmDetector, Size blockSize, Size cellSize, 1795 int nbins, Size blockStride, Size winSize, bool gammaCorrection, 1796 double L2HysThreshold, float sigma, float free_coef, bool signedGradient) 1797 { 1798 std::vector<Rect> all_candidates; 1799 std::vector<Point> locations; 1800 UMat image_scale; 1801 Size imgSize = _img.size(); 1802 image_scale.create(imgSize, _img.type()); 1803 1804 for (size_t i = 0; i<level_scale.size() ; i++) 1805 { 1806 double scale = level_scale[i]; 1807 Size effect_size = Size(cvRound(imgSize.width / scale), cvRound(imgSize.height / scale)); 1808 if (effect_size == imgSize) 1809 { 1810 if(!ocl_detect(_img, locations, hit_threshold, win_stride, oclSvmDetector, blockSize, cellSize, nbins, 1811 blockStride, winSize, gammaCorrection, L2HysThreshold, sigma, free_coef, signedGradient)) 1812 return false; 1813 } 1814 else 1815 { 1816 resize(_img, image_scale, effect_size); 1817 if(!ocl_detect(image_scale, locations, hit_threshold, win_stride, oclSvmDetector, blockSize, cellSize, nbins, 1818 blockStride, winSize, gammaCorrection, L2HysThreshold, sigma, free_coef, signedGradient)) 1819 return false; 1820 } 1821 Size scaled_win_size(cvRound(winSize.width * scale), 1822 cvRound(winSize.height * scale)); 1823 for (size_t j = 0; j < locations.size(); j++) 1824 all_candidates.push_back(Rect(Point2d(locations[j]) * scale, scaled_win_size)); 1825 } 1826 found_locations.assign(all_candidates.begin(), all_candidates.end()); 1827 groupRectangles(found_locations, (int)group_threshold, 0.2); 1828 clipObjects(imgSize, found_locations, 0, 0); 1829 1830 return true; 1831 } 1832 #endif //HAVE_OPENCL 1833 1834 void HOGDescriptor::detectMultiScale( 1835 InputArray _img, std::vector<Rect>& foundLocations, std::vector<double>& foundWeights, 1836 double hitThreshold, Size winStride, Size padding, 1837 double scale0, double finalThreshold, bool useMeanshiftGrouping) const 1838 { 1839 double scale = 1.; 1840 int levels = 0; 1841 1842 Size imgSize = _img.size(); 1843 std::vector<double> levelScale; 1844 for( levels = 0; levels < nlevels; levels++ ) 1845 { 1846 levelScale.push_back(scale); 1847 if( cvRound(imgSize.width/scale) < winSize.width || 1848 cvRound(imgSize.height/scale) < winSize.height || 1849 scale0 <= 1 ) 1850 break; 1851 scale *= scale0; 1852 } 1853 levels = std::max(levels, 1); 1854 levelScale.resize(levels); 1855 1856 if(winStride == Size()) 1857 winStride = blockStride; 1858 1859 CV_OCL_RUN(_img.dims() <= 2 && _img.type() == CV_8UC1 && scale0 > 1 && winStride.width % blockStride.width == 0 && 1860 winStride.height % blockStride.height == 0 && padding == Size(0,0) && _img.isUMat(), 1861 ocl_detectMultiScale(_img, foundLocations, levelScale, hitThreshold, winStride, finalThreshold, oclSvmDetector, 1862 blockSize, cellSize, nbins, blockStride, winSize, gammaCorrection, L2HysThreshold, (float)getWinSigma(), free_coef, signedGradient)); 1863 1864 std::vector<Rect> allCandidates; 1865 std::vector<double> tempScales; 1866 std::vector<double> tempWeights; 1867 std::vector<double> foundScales; 1868 1869 Mutex mtx; 1870 Mat img = _img.getMat(); 1871 Range range(0, (int)levelScale.size()); 1872 HOGInvoker invoker(this, img, hitThreshold, winStride, padding, &levelScale[0], &allCandidates, &mtx, &tempWeights, &tempScales); 1873 parallel_for_(range, invoker); 1874 1875 std::copy(tempScales.begin(), tempScales.end(), back_inserter(foundScales)); 1876 foundLocations.clear(); 1877 std::copy(allCandidates.begin(), allCandidates.end(), back_inserter(foundLocations)); 1878 foundWeights.clear(); 1879 std::copy(tempWeights.begin(), tempWeights.end(), back_inserter(foundWeights)); 1880 1881 if ( useMeanshiftGrouping ) 1882 groupRectangles_meanshift(foundLocations, foundWeights, foundScales, finalThreshold, winSize); 1883 else 1884 groupRectangles(foundLocations, foundWeights, (int)finalThreshold, 0.2); 1885 clipObjects(imgSize, foundLocations, 0, &foundWeights); 1886 } 1887 1888 void HOGDescriptor::detectMultiScale(InputArray img, std::vector<Rect>& foundLocations, 1889 double hitThreshold, Size winStride, Size padding, 1890 double scale0, double finalThreshold, bool useMeanshiftGrouping) const 1891 { 1892 std::vector<double> foundWeights; 1893 detectMultiScale(img, foundLocations, foundWeights, hitThreshold, winStride, 1894 padding, scale0, finalThreshold, useMeanshiftGrouping); 1895 } 1896 1897 template<typename _ClsName> struct RTTIImpl 1898 { 1899 public: 1900 static int isInstance(const void* ptr) 1901 { 1902 static _ClsName dummy; 1903 static void* dummyp = &dummy; 1904 union 1905 { 1906 const void* p; 1907 const void** pp; 1908 } a, b; 1909 a.p = dummyp; 1910 b.p = ptr; 1911 return *a.pp == *b.pp; 1912 } 1913 static void release(void** dbptr) 1914 { 1915 if(dbptr && *dbptr) 1916 { 1917 delete (_ClsName*)*dbptr; 1918 *dbptr = 0; 1919 } 1920 } 1921 static void* read(CvFileStorage* fs, CvFileNode* n) 1922 { 1923 FileNode fn(fs, n); 1924 _ClsName* obj = new _ClsName; 1925 if(obj->read(fn)) 1926 return obj; 1927 delete obj; 1928 return 0; 1929 } 1930 1931 static void write(CvFileStorage* _fs, const char* name, const void* ptr, CvAttrList) 1932 { 1933 if(ptr && _fs) 1934 { 1935 FileStorage fs(_fs, false); 1936 ((const _ClsName*)ptr)->write(fs, String(name)); 1937 } 1938 } 1939 1940 static void* clone(const void* ptr) 1941 { 1942 if(!ptr) 1943 return 0; 1944 return new _ClsName(*(const _ClsName*)ptr); 1945 } 1946 }; 1947 1948 typedef RTTIImpl<HOGDescriptor> HOGRTTI; 1949 1950 CvType hog_type( CV_TYPE_NAME_HOG_DESCRIPTOR, HOGRTTI::isInstance, 1951 HOGRTTI::release, HOGRTTI::read, HOGRTTI::write, HOGRTTI::clone); 1952 1953 std::vector<float> HOGDescriptor::getDefaultPeopleDetector() 1954 { 1955 static const float detector[] = { 1956 0.05359386f, -0.14721455f, -0.05532170f, 0.05077307f, 1957 0.11547081f, -0.04268804f, 0.04635834f, -0.05468199f, 0.08232084f, 1958 0.10424068f, -0.02294518f, 0.01108519f, 0.01378693f, 0.11193510f, 1959 0.01268418f, 0.08528346f, -0.06309239f, 0.13054633f, 0.08100729f, 1960 -0.05209739f, -0.04315529f, 0.09341384f, 0.11035026f, -0.07596218f, 1961 -0.05517511f, -0.04465296f, 0.02947334f, 0.04555536f, 1962 -3.55954492e-003f, 0.07818956f, 0.07730991f, 0.07890715f, 0.06222893f, 1963 0.09001380f, -0.03574381f, 0.03414327f, 0.05677258f, -0.04773581f, 1964 0.03746637f, -0.03521175f, 0.06955440f, -0.03849038f, 0.01052293f, 1965 0.01736112f, 0.10867710f, 0.08748853f, 3.29739624e-003f, 0.10907028f, 1966 0.07913758f, 0.10393070f, 0.02091867f, 0.11594022f, 0.13182420f, 1967 0.09879354f, 0.05362710f, -0.06745391f, -7.01260753e-003f, 1968 5.24702156e-003f, 0.03236255f, 0.01407916f, 0.02207983f, 0.02537322f, 1969 0.04547948f, 0.07200756f, 0.03129894f, -0.06274468f, 0.02107014f, 1970 0.06035208f, 0.08636236f, 4.53164103e-003f, 0.02193363f, 0.02309801f, 1971 0.05568166f, -0.02645093f, 0.04448695f, 0.02837519f, 0.08975694f, 1972 0.04461516f, 0.08975355f, 0.07514391f, 0.02306982f, 0.10410084f, 1973 0.06368385f, 0.05943464f, 4.58420580e-003f, 0.05220337f, 0.06675851f, 1974 0.08358569f, 0.06712101f, 0.06559004f, -0.03930482f, -9.15936660e-003f, 1975 -0.05897915f, 0.02816453f, 0.05032348f, 0.06780671f, 0.03377650f, 1976 -6.09417039e-004f, -0.01795146f, -0.03083684f, -0.01302475f, 1977 -0.02972313f, 7.88706727e-003f, -0.03525961f, -2.50397739e-003f, 1978 0.05245084f, 0.11791293f, -0.02167498f, 0.05299332f, 0.06640524f, 1979 0.05190265f, -8.27316567e-003f, 0.03033127f, 0.05842173f, 1980 -4.01050318e-003f, -6.25105947e-003f, 0.05862958f, -0.02465461f, 1981 0.05546781f, -0.08228195f, -0.07234028f, 0.04640540f, -0.01308254f, 1982 -0.02506191f, 0.03100746f, -0.04665651f, -0.04591486f, 0.02949927f, 1983 0.06035462f, 0.02244646f, -0.01698639f, 0.01040041f, 0.01131170f, 1984 0.05419579f, -0.02130277f, -0.04321722f, -0.03665198f, 0.01126490f, 1985 -0.02606488f, -0.02228328f, -0.02255680f, -0.03427236f, 1986 -7.75165204e-003f, -0.06195229f, 8.21638294e-003f, 0.09535975f, 1987 -0.03709979f, -0.06942501f, 0.14579427f, -0.05448192f, -0.02055904f, 1988 0.05747357f, 0.02781788f, -0.07077577f, -0.05178314f, -0.10429011f, 1989 -0.11235505f, 0.07529039f, -0.07559302f, -0.08786739f, 0.02983843f, 1990 0.02667585f, 0.01382199f, -0.01797496f, -0.03141199f, -0.02098101f, 1991 0.09029204f, 0.04955018f, 0.13718739f, 0.11379953f, 1.80019124e-003f, 1992 -0.04577610f, -1.11108483e-003f, -0.09470536f, -0.11596080f, 1993 0.04489342f, 0.01784211f, 3.06850672e-003f, 0.10781866f, 1994 3.36498418e-003f, -0.10842580f, -0.07436839f, -0.10535070f, 1995 -0.01866805f, 0.16057891f, -5.07316366e-003f, -0.04295658f, 1996 -5.90488780e-003f, 8.82003549e-003f, -0.01492646f, -0.05029279f, 1997 -0.12875880f, 8.78831954e-004f, -0.01297184f, -0.07592774f, 1998 -0.02668831f, -6.93787413e-004f, 0.02406698f, -0.01773298f, 1999 -0.03855745f, -0.05877856f, 0.03259695f, 0.12826584f, 0.06292590f, 2000 -4.10733931e-003f, 0.10996531f, 0.01332991f, 0.02088735f, 0.04037504f, 2001 -0.05210760f, 0.07760046f, 0.06399347f, -0.05751930f, -0.10053057f, 2002 0.07505023f, -0.02139782f, 0.01796176f, 2.34400877e-003f, -0.04208319f, 2003 0.07355055f, 0.05093350f, -0.02996780f, -0.02219072f, 0.03355330f, 2004 0.04418742f, -0.05580705f, -0.05037573f, -0.04548179f, 0.01379514f, 2005 0.02150671f, -0.02194211f, -0.13682702f, 0.05464972f, 0.01608082f, 2006 0.05309116f, 0.04701022f, 1.33690401e-003f, 0.07575664f, 0.09625306f, 2007 8.92647635e-003f, -0.02819123f, 0.10866830f, -0.03439325f, 2008 -0.07092371f, -0.06004780f, -0.02712298f, -7.07467366e-003f, 2009 -0.01637020f, 0.01336790f, -0.10313606f, 0.04906582f, -0.05732445f, 2010 -0.02731079f, 0.01042235f, -0.08340668f, 0.03686501f, 0.06108340f, 2011 0.01322748f, -0.07809529f, 0.03774724f, -0.03413248f, -0.06096525f, 2012 -0.04212124f, -0.07982176f, -1.25973229e-003f, -0.03045501f, 2013 -0.01236493f, -0.06312395f, 0.04789570f, -0.04602066f, 0.08576570f, 2014 0.02521080f, 0.02988098f, 0.10314583f, 0.07060035f, 0.04520544f, 2015 -0.04426654f, 0.13146530f, 0.08386490f, 0.02164590f, -2.12280243e-003f, 2016 -0.03686353f, -0.02074944f, -0.03829959f, -0.01530596f, 0.02689708f, 2017 0.11867401f, -0.06043470f, -0.02785023f, -0.04775074f, 0.04878745f, 2018 0.06350956f, 0.03494788f, 0.01467400f, 1.17890188e-003f, 0.04379614f, 2019 2.03681854e-003f, -0.03958609f, -0.01072688f, 6.43705716e-003f, 2020 0.02996500f, -0.03418507f, -0.01960307f, -0.01219154f, 2021 -4.37000440e-003f, -0.02549453f, 0.02646318f, -0.01632513f, 2022 6.46516960e-003f, -0.01929734f, 4.78711911e-003f, 0.04962371f, 2023 0.03809111f, 0.07265724f, 0.05758125f, -0.03741554f, 0.01648608f, 2024 -8.45285598e-003f, 0.03996826f, -0.08185477f, 0.02638875f, 2025 -0.04026615f, -0.02744674f, -0.04071517f, 1.05096330e-003f, 2026 -0.04741232f, -0.06733172f, 8.70434940e-003f, -0.02192543f, 2027 1.35350740e-003f, -0.03056974f, -0.02975521f, -0.02887780f, 2028 -0.01210713f, -0.04828526f, -0.09066251f, -0.09969629f, -0.03665164f, 2029 -8.88111943e-004f, -0.06826669f, -0.01866150f, -0.03627640f, 2030 -0.01408288f, 0.01874239f, -0.02075835f, 0.09145175f, -0.03547291f, 2031 0.05396780f, 0.04198981f, 0.01301925f, -0.03384354f, -0.12201976f, 2032 0.06830920f, -0.03715654f, 9.55848210e-003f, 5.05685573e-003f, 2033 0.05659294f, 3.90764466e-003f, 0.02808490f, -0.05518097f, -0.03711621f, 2034 -0.02835565f, -0.04420464f, -0.01031947f, 0.01883466f, 2035 -8.49525444e-003f, -0.09419250f, -0.01269387f, -0.02133371f, 2036 -0.10190815f, -0.07844430f, 2.43644323e-003f, -4.09610150e-003f, 2037 0.01202551f, -0.06452291f, -0.10593818f, -0.02464746f, -0.02199699f, 2038 -0.07401930f, 0.07285886f, 8.87513801e-004f, 9.97662079e-003f, 2039 8.46779719e-003f, 0.03730333f, -0.02905126f, 0.03573337f, -0.04393689f, 2040 -0.12014472f, 0.03176554f, -2.76015815e-003f, 0.10824566f, 0.05090732f, 2041 -3.30179278e-003f, -0.05123822f, 5.04784798e-003f, -0.05664124f, 2042 -5.99415926e-003f, -0.05341901f, -0.01221393f, 0.01291318f, 2043 9.91760660e-003f, -7.56987557e-003f, -0.06193124f, -2.24549137e-003f, 2044 0.01987562f, -0.02018840f, -0.06975540f, -0.06601523f, -0.03349112f, 2045 -0.08910118f, -0.03371435f, -0.07406893f, -0.02248047f, -0.06159951f, 2046 2.77751544e-003f, -0.05723337f, -0.04792468f, 0.07518548f, 2047 2.77279224e-003f, 0.04211938f, 0.03100502f, 0.05278448f, 0.03954679f, 2048 -0.03006846f, -0.03851741f, -0.02792403f, -0.02875333f, 0.01531280f, 2049 0.02186953f, -0.01989829f, 2.50679464e-003f, -0.10258728f, 2050 -0.04785743f, -0.02887216f, 3.85063468e-003f, 0.01112236f, 2051 8.29218887e-003f, -0.04822981f, -0.04503597f, -0.03713100f, 2052 -0.06988008f, -0.11002295f, -2.69209221e-003f, 1.85383670e-003f, 2053 -0.05921049f, -0.06105053f, -0.08458050f, -0.04527602f, 2054 8.90329306e-004f, -0.05875023f, -2.68602883e-003f, -0.01591195f, 2055 0.03631859f, 0.05493166f, 0.07300330f, 5.53333294e-003f, 0.06400407f, 2056 0.01847740f, -5.76280477e-003f, -0.03210877f, 4.25160583e-003f, 2057 0.01166520f, -1.44864211e-003f, 0.02253744f, -0.03367080f, 0.06983195f, 2058 -4.22323542e-003f, -8.89401045e-003f, -0.07943393f, 0.05199728f, 2059 0.06065201f, 0.04133492f, 1.44032843e-003f, -0.09585235f, -0.03964731f, 2060 0.04232114f, 0.01750465f, -0.04487902f, -7.59733608e-003f, 0.02011171f, 2061 0.04673622f, 0.09011173f, -0.07869188f, -0.04682482f, -0.05080139f, 2062 -3.99383716e-003f, -0.05346331f, 0.01085723f, -0.03599333f, 2063 -0.07097908f, 0.03551549f, 0.02680387f, 0.03471529f, 0.01790393f, 2064 0.05471273f, 9.62048303e-003f, -0.03180215f, 0.05864431f, 0.02330614f, 2065 0.01633144f, -0.05616681f, -0.10245429f, -0.08302189f, 0.07291322f, 2066 -0.01972590f, -0.02619633f, -0.02485327f, -0.04627592f, 2067 1.48853404e-003f, 0.05514185f, -0.01270860f, -0.01948900f, 0.06373586f, 2068 0.05002292f, -0.03009798f, 8.76216311e-003f, -0.02474238f, 2069 -0.05504891f, 1.74034527e-003f, -0.03333667f, 0.01524987f, 0.11663762f, 2070 -1.32344989e-003f, -0.06608453f, 0.05687166f, -6.89525274e-004f, 2071 -0.04402352f, 0.09450210f, -0.04222684f, -0.05360983f, 0.01779531f, 2072 0.02561388f, -0.11075410f, -8.77790991e-003f, -0.01099504f, 2073 -0.10380266f, 0.03103457f, -0.02105741f, -0.07371717f, 0.05146710f, 2074 0.10581432f, -0.08617968f, -0.02892107f, 0.01092199f, 0.14551543f, 2075 -2.24320893e-003f, -0.05818033f, -0.07390742f, 0.05701261f, 2076 0.12937020f, -0.04986651f, 0.10182415f, 0.05028650f, 0.12515625f, 2077 0.09175041f, 0.06404983f, 0.01523394f, 0.09460562f, 0.06106631f, 2078 -0.14266998f, -0.02926703f, 0.02762171f, 0.02164151f, 2079 -9.58488265e-004f, -0.04231362f, -0.09866509f, 0.04322244f, 2080 0.05872034f, -0.04838847f, 0.06319253f, 0.02443798f, -0.03606876f, 2081 9.38737206e-003f, 0.04289991f, -0.01027411f, 0.08156885f, 0.08751175f, 2082 -0.13191354f, 8.16054735e-003f, -0.01452161f, 0.02952677f, 0.03615945f, 2083 -2.09128903e-003f, 0.02246693f, 0.09623287f, 0.09412123f, -0.02924758f, 2084 -0.07815186f, -0.02203079f, -2.02566991e-003f, 0.01094733f, 2085 -0.01442332f, 0.02838561f, 0.11882371f, 7.28798332e-003f, -0.10345965f, 2086 0.07561217f, -0.02049661f, 4.44177445e-003f, 0.01609347f, -0.04893158f, 2087 -0.08758243f, -7.67420698e-003f, 0.08862378f, 0.06098121f, 0.06565887f, 2088 7.32981879e-003f, 0.03558407f, -0.03874352f, -0.02490055f, 2089 -0.06771075f, 0.09939223f, -0.01066077f, 0.01382995f, -0.07289080f, 2090 7.47184316e-003f, 0.10621431f, -0.02878659f, 0.02383525f, -0.03274646f, 2091 0.02137008f, 0.03837290f, 0.02450992f, -0.04296818f, -0.02895143f, 2092 0.05327370f, 0.01499020f, 0.04998732f, 0.12938657f, 0.09391870f, 2093 0.04292390f, -0.03359194f, -0.06809492f, 0.01125796f, 0.17290455f, 2094 -0.03430733f, -0.06255233f, -0.01813114f, 0.11726857f, -0.06127599f, 2095 -0.08677909f, -0.03429872f, 0.04684938f, 0.08161420f, 0.03538774f, 2096 0.01833884f, 0.11321855f, 0.03261845f, -0.04826299f, 0.01752407f, 2097 -0.01796414f, -0.10464549f, -3.30041884e-003f, 2.29343961e-004f, 2098 0.01457292f, -0.02132982f, -0.02602923f, -9.87351313e-003f, 2099 0.04273872f, -0.02103316f, -0.07994065f, 0.02614958f, -0.02111666f, 2100 -0.06964913f, -0.13453490f, -0.06861878f, -6.09341264e-003f, 2101 0.08251446f, 0.15612499f, 2.46531400e-003f, 8.88424646e-003f, 2102 -0.04152999f, 0.02054853f, 0.05277953f, -0.03087788f, 0.02817579f, 2103 0.13939077f, 0.07641046f, -0.03627627f, -0.03015098f, -0.04041540f, 2104 -0.01360690f, -0.06227205f, -0.02738223f, 0.13577610f, 0.15235767f, 2105 -0.05392922f, -0.11175954f, 0.02157129f, 0.01146481f, -0.05264937f, 2106 -0.06595174f, -0.02749175f, 0.11812254f, 0.17404149f, -0.06137035f, 2107 -0.11003478f, -0.01351621f, -0.01745916f, -0.08577441f, -0.04469909f, 2108 -0.06106115f, 0.10559758f, 0.20806813f, -0.09174948f, 7.09621934e-004f, 2109 0.03579374f, 0.07215115f, 0.02221742f, 0.01827742f, -7.90785067e-003f, 2110 0.01489554f, 0.14519960f, -0.06425831f, 0.02990399f, -1.80181325e-003f, 2111 -0.01401528f, -0.04171134f, -3.70530109e-003f, -0.09090481f, 2112 0.09520713f, 0.08845516f, -0.02651753f, -0.03016730f, 0.02562448f, 2113 0.03563816f, -0.03817881f, 0.01433385f, 0.02256983f, 0.02872120f, 2114 0.01001934f, -0.06332260f, 0.04338406f, 0.07001807f, -0.04705722f, 2115 -0.07318907f, 0.02630457f, 0.03106382f, 0.06648342f, 0.10913180f, 2116 -0.01630815f, 0.02910308f, 0.02895109f, 0.08040254f, 0.06969310f, 2117 0.06797734f, 6.08639978e-003f, 4.16588830e-003f, 0.08926726f, 2118 -0.03123648f, 0.02700146f, 0.01168734f, -0.01631594f, 4.61015804e-003f, 2119 8.51359498e-003f, -0.03544224f, 0.03571994f, 4.29766066e-003f, 2120 -0.01970077f, -8.79793242e-003f, 0.09607988f, 0.01544222f, 2121 -0.03923707f, 0.07308586f, 0.06061262f, 1.31683104e-004f, 2122 -7.98222050e-003f, 0.02399261f, -0.06084389f, -0.02743429f, 2123 -0.05475523f, -0.04131311f, 0.03559756f, 0.03055342f, 0.02981433f, 2124 0.14860515f, 0.01766787f, 0.02945257f, 0.04898238f, 0.01026922f, 2125 0.02811658f, 0.08267091f, 0.02732154f, -0.01237693f, 0.11760156f, 2126 0.03802063f, -0.03309754f, 5.24957618e-003f, -0.02460510f, 0.02691451f, 2127 0.05399988f, -0.10133506f, 0.06385437f, -0.01818005f, 0.02259503f, 2128 0.03573135f, 0.01042848f, -0.04153402f, -0.04043029f, 0.01643575f, 2129 0.08326677f, 4.61383024e-004f, -0.05308095f, -0.08536223f, 2130 -1.61011645e-003f, -0.02163720f, -0.01783352f, 0.03859637f, 2131 0.08498885f, -0.01725216f, 0.08625131f, 0.10995087f, 0.09177644f, 2132 0.08498347f, 0.07646490f, 0.05580502f, 0.02693516f, 0.09996913f, 2133 0.09070327f, 0.06667200f, 0.05873008f, -0.02247842f, 0.07772321f, 2134 0.12408436f, 0.12629253f, -8.41997913e-004f, 0.01477783f, 0.09165990f, 2135 -2.98401713e-003f, -0.06466447f, -0.07057302f, 2.09516948e-004f, 2136 0.02210209f, -0.02158809f, -0.08602506f, -0.02284836f, 2137 4.01876355e-003f, 9.56660323e-003f, -0.02073978f, -0.04635138f, 2138 -7.59423291e-003f, -0.01377393f, -0.04559359f, -0.13284740f, 2139 -0.08671406f, -0.03654395f, 0.01142869f, 0.03287891f, -0.04392983f, 2140 0.06142959f, 0.17710890f, 0.10385257f, 0.01329137f, 0.10067633f, 2141 0.12450829f, -0.04476709f, 0.09049144f, 0.04589312f, 0.11167907f, 2142 0.08587538f, 0.04767583f, 1.67188141e-003f, 0.02359802f, -0.03808852f, 2143 0.03126272f, -0.01919029f, -0.05698918f, -0.02365112f, -0.06519032f, 2144 -0.05599358f, -0.07097308f, -0.03301812f, -0.04719102f, -0.02566297f, 2145 0.01324074f, -0.09230672f, -0.05518232f, -0.04712864f, -0.03380903f, 2146 -0.06719479f, 0.01183908f, -0.09326738f, 0.01642865f, 0.03789867f, 2147 -6.61567831e-003f, 0.07796386f, 0.07246574f, 0.04706347f, -0.02523437f, 2148 -0.01696830f, -0.08068866f, 0.06030888f, 0.10527060f, -0.06611756f, 2149 0.02977346f, 0.02621830f, 0.01913855f, -0.08479366f, -0.06322418f, 2150 -0.13570616f, -0.07644490f, 9.31900274e-003f, -0.08095149f, 2151 -0.10197903f, -0.05204025f, 0.01413151f, -0.07800411f, -0.01885122f, 2152 -0.07509381f, -0.10136326f, -0.05212355f, -0.09944065f, 2153 -1.33606605e-003f, -0.06342617f, -0.04178550f, -0.12373723f, 2154 -0.02832736f, -0.06057501f, 0.05830070f, 0.07604282f, -0.06462587f, 2155 8.02447461e-003f, 0.11580125f, 0.12332212f, 0.01978462f, 2156 -2.72378162e-003f, 0.05850752f, -0.04674481f, 0.05148062f, 2157 -2.62542837e-003f, 0.11253355f, 0.09893716f, 0.09785093f, -0.04659257f, 2158 -0.01102429f, -0.07002308f, 0.03088913f, -0.02565549f, -0.07671449f, 2159 3.17443861e-003f, -0.10783514f, -0.02314270f, -0.11089555f, 2160 -0.01024768f, 0.03116021f, -0.04964825f, 0.02281825f, 5.50005678e-003f, 2161 -0.08427856f, -0.14685495f, -0.07719755f, -0.13342668f, -0.04525511f, 2162 -0.09914210f, 0.02588859f, 0.03469279f, 0.04664020f, 0.11688190f, 2163 0.09647275f, 0.10857815f, -0.01448726f, 0.04299758f, -0.06763151f, 2164 1.33257592e-003f, 0.14331576f, 0.07574340f, 0.09166205f, 0.05674926f, 2165 0.11325553f, -0.01106494f, 0.02062161f, -0.11484840f, -0.07492137f, 2166 -0.02864293f, -0.01275638f, -0.06946032f, -0.10101652f, -0.04113498f, 2167 -0.02214783f, -0.01273942f, -0.07480393f, -0.10556041f, -0.07622112f, 2168 -0.09988393f, -0.11453961f, -0.12073903f, -0.09412795f, -0.07146588f, 2169 -0.04054537f, -0.06127083f, 0.04221122f, 0.07688113f, 0.04099256f, 2170 0.12663734f, 0.14683802f, 0.21761774f, 0.12525328f, 0.18431792f, 2171 -1.66402373e-003f, 2.37777247e-003f, 0.01445475f, 0.03509416f, 2172 0.02654697f, 0.01716739f, 0.05374011f, 0.02944174f, 0.11323927f, 2173 -0.01485456f, -0.01611330f, -1.85554172e-003f, -0.01708549f, 2174 -0.05435753f, -0.05302101f, 0.05260378f, -0.03582945f, 2175 -3.42867890e-004f, 1.36076682e-003f, -0.04436073f, -0.04228432f, 2176 0.03281291f, -0.05480836f, -0.10197772f, -0.07206279f, -0.10741059f, 2177 -0.02366946f, 0.10278475f, -2.74783419e-003f, -0.03242477f, 2178 0.02308955f, 0.02835869f, 0.10348799f, 0.19580358f, 0.10252027f, 2179 0.08039929f, 0.05525554f, -0.13250865f, -0.14395352f, 3.13586881e-003f, 2180 -0.03387071f, 8.94669443e-003f, 0.05406157f, -4.97324532e-003f, 2181 -0.01189114f, 2.82919413e-004f, -0.03901557f, -0.04898705f, 2182 0.02164520f, -0.01382906f, -0.01850416f, 0.01869347f, -0.02450060f, 2183 0.02291678f, 0.08196463f, 0.03309153f, -0.10629974f, 0.02473924f, 2184 0.05344394f, -0.02404823f, -0.03243643f, -5.55244600e-003f, 2185 -0.08009996f, 0.02811539f, 0.04235742f, 0.01859004f, 0.04902123f, 2186 -0.01438252f, -0.01526853f, 0.02044195f, -0.05008660f, 0.04244113f, 2187 0.07611816f, 0.04950470f, -0.06020549f, -4.26026015e-003f, 0.13133512f, 2188 -0.01438738f, -0.01958807f, -0.04044152f, -0.12425045f, 2189 2.84353318e-003f, -0.05042776f, -0.09121484f, 7.34345755e-003f, 2190 0.09388847f, 0.11800314f, 4.72295098e-003f, 4.44378285e-003f, 2191 -0.07984917f, -0.03613737f, 0.04490915f, -0.02246483f, 0.04681071f, 2192 0.05240871f, 0.02157206f, -0.04603431f, -0.01197929f, -0.02748779f, 2193 0.13621049f, 0.08812155f, -0.07802048f, 4.86458559e-003f, -0.01598836f, 2194 0.01024450f, -0.03463517f, -0.02304239f, -0.08692665f, 0.06655128f, 2195 0.05785803f, -0.12640759f, 0.02307472f, 0.07337402f, 0.07525434f, 2196 0.04943763f, -0.02241034f, -0.09978238f, 0.14487994f, -0.06570521f, 2197 -0.07855482f, 0.02830222f, -5.29603509e-004f, -0.04669895f, 2198 -0.11822784f, -0.12246452f, -0.15365660f, -0.02969127f, 0.08078201f, 2199 0.13512598f, 0.11505685f, 0.04740673f, 0.01376022f, -0.05852978f, 2200 -0.01537809f, -0.05541119f, 0.02491065f, -0.02870786f, 0.02760978f, 2201 0.23836176f, 0.22347429f, 0.10306466f, -0.06919070f, -0.10132039f, 2202 -0.20198342f, -0.05040560f, 0.27163076f, 0.36987007f, 0.34540465f, 2203 0.29095781f, 0.05649706f, 0.04125737f, 0.07505883f, -0.02737836f, 2204 -8.43431335e-003f, 0.07368195f, 0.01653876f, -0.09402955f, 2205 -0.09574359f, 0.01474337f, -0.07128561f, -0.03460737f, 0.11438941f, 2206 0.13752601f, -0.06385452f, -0.06310338f, 8.19548313e-003f, 0.11622470f, 2207 5.05133113e-003f, -0.07602754f, 0.06695660f, 0.25723928f, 0.09037900f, 2208 0.28826267f, 0.13165380f, -0.05312614f, -0.02137198f, -0.03442232f, 2209 -0.06255679f, 0.03899667f, 0.18391028f, 0.26016650f, 0.03374462f, 2210 0.01860465f, 0.19077586f, 0.18160543f, 3.43634398e-003f, -0.03036782f, 2211 0.19683038f, 0.35378191f, 0.24968483f, -0.03222649f, 0.28972381f, 2212 0.43091634f, 0.30778357f, 0.02335266f, -0.09877399f, -6.85245218e-003f, 2213 0.08945240f, -0.08150686f, 0.02792493f, 0.24806842f, 0.17338486f, 2214 0.06231801f, -0.10432383f, -0.16653322f, -0.13197899f, -0.08531576f, 2215 -0.19271527f, -0.13536365f, 0.22240199f, 0.39219588f, 0.26597717f, 2216 -0.01231649f, 0.01016179f, 0.13379875f, 0.12018334f, -0.04852953f, 2217 -0.07915270f, 0.07036012f, 3.87723115e-003f, -0.06126805f, 2218 -0.15015170f, -0.11406515f, -0.08556531f, -0.07429333f, -0.16115491f, 2219 0.13214062f, 0.25691369f, 0.05697750f, 0.06861912f, -6.02903729e-003f, 2220 -7.94562511e-003f, 0.04799571f, 0.06695165f, -0.01926842f, 0.06206308f, 2221 0.13450983f, -0.06381495f, -2.98370165e-003f, -0.03482971f, 2222 7.53991678e-003f, 0.03895611f, 0.11464261f, 0.01669971f, 2223 8.27818643e-003f, -7.49160210e-003f, -0.11712562f, -0.10650621f, 2224 -0.10353880f, -0.04994106f, -7.65618810e-004f, 0.03023767f, 2225 -0.04759270f, -0.07302686f, -0.05825012f, -0.13156348f, -0.10639747f, 2226 -0.19393684f, -0.09973683f, -0.07918908f, 4.63177625e-004f, 2227 -6.61382044e-004f, 0.15853868f, 0.08561199f, -0.07660093f, 2228 -0.08015265f, -0.06164073f, 0.01882577f, -7.29908410e-004f, 2229 0.06840892f, 0.03843764f, 0.20274927f, 0.22028814f, -5.26101235e-003f, 2230 0.01452435f, -0.06331623f, 0.02865064f, 0.05673740f, 0.12171564f, 2231 0.03837196f, 0.03555467f, -0.02662914f, -0.10280123f, -0.06526285f, 2232 -0.11066351f, -0.08988424f, -0.10103678f, 8.10526591e-003f, 2233 5.95238712e-003f, 0.02617721f, -0.01705742f, -0.10897956f, 2234 -0.08004991f, -0.11271993f, -0.06185647f, -0.06103712f, 0.01597041f, 2235 -0.05923606f, 0.09410726f, 0.22858568f, 0.03263380f, 0.06772990f, 2236 -0.09003516f, 0.01017870f, 0.01931688f, 0.08628357f, -0.01430009f, 2237 0.10954945f, 0.16612452f, -0.02434544f, -0.03310068f, -0.04236627f, 2238 0.01212392f, -6.15046406e-003f, 0.06954194f, 0.03015283f, 0.01787957f, 2239 0.02781667f, -0.05561153f, -8.96244217e-003f, -0.04971489f, 2240 0.07510284f, 0.01775282f, 0.05889897f, -0.07981427f, 0.03647643f, 2241 -3.73833324e-003f, -0.08894575f, -0.06429435f, -0.08068276f, 2242 0.03567704f, -0.07131936f, -7.21910037e-003f, -0.09566668f, 2243 0.17886090f, 0.14911725f, 0.02070032f, -0.05017120f, -0.04992622f, 2244 0.01570143f, -0.09906903f, 0.06456193f, 0.15329507f, 0.18820767f, 2245 0.11689861f, -0.01178513f, -0.02225163f, -0.01905318f, 0.10271224f, 2246 -7.27029052e-003f, 0.11664233f, 0.14796902f, 0.07771893f, 0.02400013f, 2247 -0.05361797f, -0.01972888f, 0.01376177f, 0.06740040f, -0.06525395f, 2248 0.05726178f, -0.02404981f, -0.14018567f, -0.02074987f, -0.04621970f, 2249 -0.04688627f, -0.01842059f, 0.07722727f, -0.04852883f, 0.01529004f, 2250 -0.19639495f, 0.10817073f, 0.03795860f, -0.09435206f, -0.07984378f, 2251 -0.03383440f, 0.11081333f, 0.02237366f, 0.12703256f, 0.21613893f, 2252 0.02918790f, 4.66472283e-003f, -0.10274266f, -0.04854131f, 2253 -3.46305710e-003f, 0.08652268f, 0.02251546f, 0.09636052f, 0.17180754f, 2254 -0.09272388f, 4.59174305e-004f, -0.11723048f, -0.12210111f, 2255 -0.15547538f, 0.07218186f, -0.05297846f, 0.03779940f, 0.05150875f, 2256 -0.03802310f, 0.03870645f, -0.15250699f, -0.08696499f, -0.02021560f, 2257 0.04118926f, -0.15177974f, 0.01577647f, 0.10249301f, 7.50041893e-003f, 2258 0.01721806f, -0.06828983f, -0.02397596f, -0.06598977f, -0.04317593f, 2259 -0.08064980f, 6.66632550e-003f, 0.03333484f, 0.07093620f, 0.08231064f, 2260 -0.06577903f, -0.06698844f, -0.06984019f, -0.06508023f, -0.14145090f, 2261 -0.02393239f, 0.06485303f, 8.83263443e-003f, 0.09251080f, -0.07557579f, 2262 -0.05067699f, -0.09798748f, -0.06703258f, -0.14056294f, 0.03245994f, 2263 0.12554143f, 0.01761621f, 0.12980327f, -0.04081950f, -0.11906909f, 2264 -0.14813015f, -0.08376863f, -0.12200681f, 0.04988137f, 0.05424247f, 2265 -3.90952639e-003f, 0.03255733f, -0.12717837f, -0.07461493f, 2266 -0.05703964f, -0.01736189f, -0.08026433f, -0.05433894f, -0.01719359f, 2267 0.02886275f, 0.01772653f, -0.09163518f, 3.57789593e-003f, -0.10129993f, 2268 -0.02653764f, -0.08131415f, -0.03847986f, -7.62157550e-004f, 2269 0.06486648f, 0.19675669f, -0.04919156f, -0.07059129f, -0.04857785f, 2270 -0.01042383f, -0.08328653f, 0.03660302f, -0.03696846f, 0.04969259f, 2271 0.08241162f, -0.12514858f, -0.06122676f, -0.03750202f, 2272 6.52989605e-003f, -0.10247213f, 0.02568346f, 4.51781414e-003f, 2273 -0.03734229f, -0.01131264f, -0.05412074f, 8.89345480e-004f, 2274 -0.12388977f, -0.05959237f, -0.12418608f, -0.06151643f, -0.07310260f, 2275 0.02441575f, 0.07023528f, -0.07548289f, -7.57147965e-004f, 2276 -0.09061348f, -0.08112976f, -0.06920306f, 9.54394229e-003f, 2277 -0.01219902f, 1.21273217e-003f, -8.88989680e-003f, -0.08309301f, 2278 -0.04552661f, -0.10739882f, -0.05691034f, -0.13928030f, 0.09027749f, 2279 0.15123098f, 0.03175976f, 0.17763577f, 3.29913251e-004f, 0.05151888f, 2280 -0.09844074f, -0.09475287f, -0.08571247f, 0.16241577f, 0.19336018f, 2281 8.57454538e-003f, 0.11474732f, -0.01493934f, 0.03352379f, -0.08966240f, 2282 -0.02322310f, 0.02663568f, 0.05448750f, -0.03536883f, -0.07210463f, 2283 -0.06807277f, -0.03121621f, -0.05932408f, -0.17282860f, -0.15873498f, 2284 -0.04956378f, 0.01603377f, -0.12385946f, 0.13878587f, 0.21468069f, 2285 0.13510075f, 0.20992437f, 0.08845878f, 0.08104013f, 0.03754176f, 2286 0.12173114f, 0.11103114f, 0.10643122f, 0.13941477f, 0.11640384f, 2287 0.14786847f, 0.01218238f, 0.01160753f, 0.03547940f, 0.08794311f, 2288 -0.01695384f, -0.07692261f, -0.08236158f, 6.79194089e-003f, 2289 -0.02458403f, 0.13022894f, 0.10953187f, 0.09857773f, 0.04735930f, 2290 -0.04353498f, -0.15173385f, -0.17904443f, -0.10450364f, -0.13418166f, 2291 -0.06633098f, -0.03170381f, -0.06839000f, -0.11350126f, -0.06983913f, 2292 0.19083543f, 0.17604128f, 0.07730632f, 0.10022651f, 0.36428109f, 2293 0.28291923f, 0.12688625f, 0.15942036f, 0.14064661f, -0.11201853f, 2294 -0.13969108f, -0.09088077f, -0.14107047f, 0.05117374f, 2295 -2.63348082e-003f, -0.10794610f, -0.09715455f, -0.05284977f, 2296 0.01565668f, 0.05031200f, 0.07021113f, -0.02963028f, 0.01766960f, 2297 0.08333644f, -0.03211382f, 4.90096770e-003f, 0.05186674f, -0.05045737f, 2298 -0.09624767f, -0.02525997f, 0.06916669f, 0.01213916f, 0.05333899f, 2299 -0.03443280f, -0.10055527f, -0.06291115f, 5.42851724e-003f, 2300 -6.30360236e-003f, 0.02270257f, -0.01769792f, 0.03273688f, 0.07746078f, 2301 7.77099328e-003f, 0.05041346f, 0.01648103f, -0.02321534f, -0.09930186f, 2302 -0.02293853f, 0.02034990f, -0.08324204f, 0.08510064f, -0.03732836f, 2303 -0.06465405f, -0.06086946f, 0.13680504f, -0.11469388f, -0.03896406f, 2304 -0.07142810f, 2.67581246e-003f, -0.03639632f, -0.09849060f, 2305 -0.11014334f, 0.17489147f, 0.17610909f, -0.16091567f, -0.07248894f, 2306 0.01567141f, 0.23742996f, 0.07552249f, -0.06270349f, -0.07303379f, 2307 0.25442186f, 0.16903116f, -0.08168741f, -0.05913896f, -0.03954096f, 2308 6.81776879e-003f, -0.05615319f, -0.07303037f, -0.12176382f, 2309 0.12385108f, 0.22084464f, -0.05543206f, -0.03310431f, 0.05731593f, 2310 0.19481890f, 0.04016430f, -0.06480758f, -0.12353460f, 0.18733442f, 2311 -0.09631214f, -0.11192076f, 0.12404587f, 0.15671748f, 0.19256128f, 2312 0.10895617f, 0.03391477f, -0.13032004f, -0.05626907f, -0.09025607f, 2313 0.23485197f, 0.27812332f, 0.26725492f, 0.07255980f, 0.16565137f, 2314 0.22388470f, 0.07441066f, -0.21003133f, -0.08075339f, -0.15031935f, 2315 0.07023834f, 0.10872041f, 0.18156518f, 0.20037253f, 0.13571967f, 2316 -0.11915682f, -0.11131983f, -0.18878011f, 0.06074620f, 0.20578890f, 2317 0.12413109f, 0.03930207f, 0.29176015f, 0.29502738f, 0.27856228f, 2318 -0.01803601f, 0.16646385f, 0.19268319f, 0.01900682f, 0.06026287f, 2319 2.35868432e-003f, 0.01558199f, 0.02707230f, 0.11383014f, 0.12103992f, 2320 0.03907350f, 0.04637353f, 0.09020995f, 0.11919726f, -3.63007211e-003f, 2321 0.02220155f, 0.10336831f, 0.17351882f, 0.12259731f, 0.18983354f, 2322 0.15736865f, 0.01160725f, -0.01690723f, -9.69582412e-004f, 0.07213813f, 2323 0.01161613f, 0.17864859f, 0.24486147f, 0.18208991f, 0.20177495f, 2324 0.05972528f, -8.93934630e-003f, -0.02316955f, 0.14436610f, 0.14114498f, 2325 0.05520950f, 0.06353590f, -0.19124921f, 0.10174713f, 0.29414919f, 2326 0.26448128f, 0.09344960f, 0.15284036f, 0.19797507f, 0.11369792f, 2327 -0.12722753f, -0.21396367f, -0.02008235f, -0.06566695f, -0.01662150f, 2328 -0.03937003f, 0.04778343f, 0.05017274f, -0.02299062f, -0.20208496f, 2329 -0.06395898f, 0.13721776f, 0.22544557f, 0.14888357f, 0.08687132f, 2330 0.27088094f, 0.32206613f, 0.09782200f, -0.18523243f, -0.17232181f, 2331 -0.01041531f, 0.04008654f, 0.04199702f, -0.08081299f, -0.03755421f, 2332 -0.04809646f, -0.05222081f, -0.21709201f, -0.06622940f, 0.02945281f, 2333 -0.04600435f, -0.05256077f, -0.08432942f, 0.02848100f, 0.03490564f, 2334 8.28621630e-003f, -0.11051246f, -0.11210597f, -0.01998289f, 2335 -0.05369405f, -0.08869293f, -0.18799506f, -0.05436598f, -0.05011634f, 2336 -0.05419716f, -0.06151857f, -0.10827805f, 0.04346735f, 0.04016083f, 2337 0.01520820f, -0.12173316f, -0.04880285f, -0.01101406f, 0.03250847f, 2338 -0.06009551f, -0.03082932f, -0.02295134f, -0.06856834f, -0.08775249f, 2339 -0.23793389f, -0.09174541f, -0.05538322f, -0.04321031f, -0.11874759f, 2340 -0.04221844f, -0.06070468f, 0.01194489f, 0.02608565f, -0.03892140f, 2341 -0.01643151f, -0.02602034f, -0.01305472f, 0.03920100f, -0.06514261f, 2342 0.01126918f, -6.27710763e-003f, -0.02720047f, -0.11133634f, 2343 0.03300330f, 0.02398472f, 0.04079665f, -0.10564448f, 0.05966159f, 2344 0.01195221f, -0.03179441f, -0.01692590f, -0.06177841f, 0.01841576f, 2345 -5.51078189e-003f, -0.06821765f, -0.03191888f, -0.09545476f, 2346 0.03030550f, -0.04896152f, -0.02914624f, -0.13283344f, -0.04783419f, 2347 6.07836898e-003f, -0.01449538f, -0.13358212f, -0.09687774f, 2348 -0.02813793f, 0.01213498f, 0.06650011f, -0.02039067f, 0.13356198f, 2349 0.05986415f, -9.12760664e-003f, -0.18780160f, -0.11992817f, 2350 -0.06342237f, 0.01229534f, 0.07143231f, 0.10713009f, 0.11085765f, 2351 0.06569190f, -0.02956399f, -0.16288325f, -0.13993549f, -0.01292515f, 2352 0.03833013f, 0.09130384f, -0.05086257f, 0.05617329f, -0.03896667f, 2353 -0.06282311f, -0.11490010f, -0.14264110f, -0.04530499f, 0.01598189f, 2354 0.09167797f, 0.08663294f, 0.04885277f, -0.05741219f, -0.07565769f, 2355 -0.17136464f, -0.02619422f, -0.02477579f, 0.02679587f, 0.11621952f, 2356 0.08788391f, 0.15520640f, 0.04709549f, 0.04504483f, -0.10214074f, 2357 -0.12293372f, -0.04820546f, -0.05484834f, 0.05473754f, 0.07346445f, 2358 0.05577277f, -0.08209965f, 0.03462975f, -0.20962234f, -0.09324598f, 2359 3.79481679e-003f, 0.03617633f, 0.16742408f, 0.07058107f, 0.10204960f, 2360 -0.06795346f, 3.22807301e-003f, -0.12589309f, -0.17496960f, 2361 0.02078314f, -0.07694324f, 0.12184640f, 0.08997164f, 0.04793497f, 2362 -0.11383379f, -0.08046359f, -0.25716835f, -0.08080962f, 2363 6.80711539e-003f, -0.02930280f, -3.04938294e-003f, -0.11106286f, 2364 -0.04628860f, -0.07821649f, 7.70127494e-003f, -0.10247706f, 2365 1.21042714e-003f, 0.20573859f, -0.03241005f, 8.42972286e-003f, 2366 0.01946464f, -0.01197973f, -0.14579976f, 0.04233614f, 2367 -4.14096704e-003f, -0.06866436f, -0.02431862f, -0.13529138f, 2368 1.25891645e-003f, -0.11425111f, -0.04303651f, -0.01694815f, 2369 0.05720210f, -0.16040207f, 0.02772896f, 0.05498345f, -0.15010567f, 2370 0.01450866f, 0.02350303f, -0.04301004f, -0.04951802f, 0.21702233f, 2371 -0.03159155f, -0.01963303f, 0.18232647f, -0.03263875f, 2372 -2.88476888e-003f, 0.01587562f, -1.94303901e-003f, -0.07789494f, 2373 0.04674156f, -6.25576358e-003f, 0.08925962f, 0.21353747f, 0.01254677f, 2374 -0.06999976f, -0.05931328f, -0.01884327f, -0.04306272f, 0.11794136f, 2375 0.03842728f, -0.03907030f, 0.05636114f, -0.09766009f, -0.02104000f, 2376 8.72711372e-003f, -0.02736877f, -0.05112274f, 0.16996814f, 0.02955785f, 2377 0.02094014f, 0.08414304f, -0.03335762f, -0.03617457f, -0.05808248f, 2378 -0.08872101f, 0.02927705f, 0.27077839f, 0.06075108f, 0.07478261f, 2379 0.15282831f, -0.03908454f, -0.05101782f, -9.51998029e-003f, 2380 -0.03272416f, -0.08735625f, 0.07633440f, -0.07185312f, 0.13841286f, 2381 0.07812646f, -0.12901451f, -0.05488589f, -0.05644578f, -0.03290703f, 2382 -0.11184757f, 0.03751570f, -0.05978153f, -0.09155276f, 0.05657315f, 2383 -0.04328186f, -0.03047933f, -0.01413135f, -0.10181040f, -0.01384013f, 2384 0.20132534f, -0.01536873f, -0.07641169f, 0.05906778f, -0.07833145f, 2385 -0.01523801f, -0.07502609f, -0.09461885f, -0.15013233f, 0.16050665f, 2386 0.09021381f, 0.08473236f, 0.03386267f, -0.09147339f, -0.09170618f, 2387 -0.08498498f, -0.05119187f, -0.10431040f, 0.01041618f, -0.03064913f, 2388 0.09340212f, 0.06448522f, -0.03881054f, -0.04985436f, -0.14794017f, 2389 -0.05200112f, -0.02144495f, 0.04000821f, 0.12420804f, -0.01851651f, 2390 -0.04116732f, -0.11951703f, -0.04879033f, -0.08722515f, -0.08454733f, 2391 -0.10549165f, 0.11251976f, 0.10766345f, 0.19201984f, 0.06128913f, 2392 -0.02734615f, -0.08834923f, -0.16999826f, -0.03548348f, 2393 -5.36092324e-003f, 0.08297954f, 0.07226378f, 0.04194529f, 0.04668673f, 2394 8.73902347e-003f, 0.06980139f, 0.05652480f, 0.05879445f, 0.02477076f, 2395 0.02451423f, 0.12433673f, 0.05600227f, 0.06886370f, 0.03863076f, 2396 0.07459056f, 0.02264139f, 0.01495469f, 0.06344220f, 0.06945208f, 2397 0.02931899f, 0.11719371f, 0.04527427f, 0.03248192f, 2.08271481e-003f, 2398 0.02044626f, 0.11403449f, 0.04303892f, 0.06444661f, 0.04959024f, 2399 0.08174094f, 0.09240247f, 0.04894639f, 0.02252937f, -0.01652530f, 2400 0.07587013f, 0.06064249f, 0.13954395f, 0.02772832f, 0.07093039f, 2401 0.08501238f, 0.01701301f, 0.09055722f, 0.33421436f, 0.20163782f, 2402 0.09821030f, 0.07951369f, 0.08695120f, -0.12757730f, -0.13865978f, 2403 -0.06610068f, -0.10985506f, 0.03406816f, -0.01116336f, -0.07281768f, 2404 -0.13525715f, -0.12844718f, 0.08956250f, 0.09171610f, 0.10092317f, 2405 0.23385370f, 0.34489515f, 0.09901748f, 0.02002922f, 0.12335990f, 2406 0.07606190f, -0.14899330f, -0.15634622f, -0.06494618f, -0.01760547f, 2407 0.03404277f, -0.13208845f, -0.12101169f, -0.18294574f, -0.16560709f, 2408 0.02183887f, -0.02752613f, 0.01813638f, 0.02000757f, 0.01319924f, 2409 0.08030242f, 0.01220535f, 2.98233377e-003f, -0.01307070f, 0.05970297f, 2410 -0.05345284f, -0.03381982f, -9.87543724e-003f, -0.06869387f, 2411 0.03956730f, -0.03108176f, -0.05732809f, 0.02172386f, 0.04159765f, 2412 2.62783933e-003f, 0.04813229f, 0.09358983f, -8.18389002e-003f, 2413 0.01724574f, -0.02547474f, -0.04967288f, -0.02390376f, 0.06640504f, 2414 -0.06306566f, 0.01137518f, 0.05589378f, -0.08237787f, 0.02455001f, 2415 -0.03059422f, -0.08953978f, 0.06851497f, 0.07190268f, -0.07610799f, 2416 7.87237938e-003f, -7.85830803e-003f, 0.06006952f, -0.01126728f, 2417 -2.85743061e-003f, -0.04772895f, 0.01884944f, 0.15005857f, 2418 -0.06268821f, -0.01989072f, 0.01138399f, 0.08760451f, 0.03879007f, 2419 -9.66926850e-003f, -0.08012961f, 0.06414555f, -0.01362950f, 2420 -0.09135523f, 0.01755159f, 0.04459474f, 0.09650917f, 0.05219948f, 2421 -2.19440833e-003f, -0.07037939f, -0.01599054f, 0.13103317f, 2422 -0.02492603f, -0.01032540f, -0.02903307f, 0.04489160f, 0.05148086f, 2423 0.01858173f, -0.02919228f, 0.08299296f, -0.04590359f, -0.15745632f, 2424 -0.09068198f, -0.02972453f, 0.12985018f, 0.22320485f, 0.24261914f, 2425 0.03642650f, -0.05506422f, 2.67413049e-003f, -0.03834032f, 0.06449424f, 2426 0.03834866f, 0.03816991f, 0.25039271f, 0.34212017f, 0.32433882f, 2427 0.18824573f, -0.08599839f, -0.17599408f, -0.15317015f, -0.09913155f, 2428 -0.02856072f, -0.05304699f, -1.06437842e-003f, -0.06641813f, 2429 -0.07509298f, 0.01463361f, -0.07551918f, -0.04510373f, 2430 -8.44620075e-003f, 0.01772176f, 0.04068235f, 0.20295307f, 0.15719447f, 2431 0.05712103f, 0.26296997f, 0.14657754f, 0.01547317f, -0.05052776f, 2432 -0.03881342f, -0.01437883f, -0.04930177f, 0.11719568f, 0.24098417f, 2433 0.26468599f, 0.31698579f, 0.10103608f, -0.01096375f, -0.01367013f, 2434 0.17104232f, 0.20065314f, 2.67622480e-003f, -0.01190034f, 0.18301608f, 2435 0.09459770f, -0.06357619f, -0.06473801f, 0.01377906f, -0.10032775f, 2436 -0.06388740f, 3.80393048e-003f, 0.06206078f, 0.10349120f, 0.26804337f, 2437 8.17918684e-003f, -0.02314351f, 9.34422202e-003f, 0.09198381f, 2438 0.03681326f, -8.77339672e-003f, -0.09662418f, -0.02715708f, 2439 0.13503517f, 0.08962728f, -6.57071499e-003f, -0.03201199f, 0.28510824f, 2440 0.32095715f, 0.18512695f, -0.14230858f, -0.14048551f, -0.07181299f, 2441 -0.08575408f, -0.08661680f, -0.17416079f, 7.54326640e-004f, 2442 0.05601677f, 0.13585392f, -0.04960437f, -0.07708392f, 0.10676333f, 2443 -0.04407546f, -0.07209078f, 0.03663663f, 0.28949317f, 0.41127121f, 2444 0.27431169f, -0.06900328f, -0.21474190f, -0.15578632f, -0.19555484f, 2445 -0.15209621f, -0.11269179f, 0.07416003f, 0.18991330f, 0.26858172f, 2446 0.01952259f, 0.01017922f, 0.02159843f, -4.95165400e-003f, -0.04368168f, 2447 -0.12721671f, -0.06673957f, -0.11275250f, 0.04413409f, 0.05578312f, 2448 0.03896771f, 0.03566417f, -0.05871816f, -0.07388090f, -0.17965563f, 2449 -0.08570268f, -0.15273231f, -0.06022318f, -0.06999847f, 2450 -6.81510568e-003f, 0.06294262f, -6.54901436e-004f, -0.01128654f, 2451 -0.02289657f, 0.04849290f, 0.04140804f, 0.23681939f, 0.14545733f, 2452 0.01989965f, 0.12032662f, 3.87463090e-003f, -6.02597650e-003f, 2453 -0.05919775f, -0.03067224f, -0.07787777f, 0.10834727f, 0.02153730f, 2454 0.02765649f, 0.03975543f, -0.12182906f, -0.04900113f, -0.09940100f, 2455 -0.06453611f, -0.13757215f, -0.03721382f, 0.02827376f, -0.04351249f, 2456 0.01907038f, -0.10284120f, -0.05671160f, -0.10760647f, -0.09624009f, 2457 -0.09565596f, -0.01303654f, 0.03080539f, 0.01416511f, 0.05846142f, 2458 -5.42971538e-003f, 0.06221476f, -0.03320325f, -0.06791797f, 2459 -0.05791342f, 0.12851369f, 0.14990346f, 0.03634374f, 0.14262885f, 2460 0.04330391f, 0.05032569f, -0.05631914f, 0.01606137f, 0.04387223f, 2461 0.22344995f, 0.15722635f, -0.04693628f, 0.03006579f, -2.52882647e-003f, 2462 0.05717621f, -0.07529724f, -0.02848588f, -0.06868757f, 2463 -4.51729307e-003f, 0.06466042f, -0.05935378f, -0.04704857f, 2464 -0.07363959f, 0.04843248f, -0.13421375f, -0.09789340f, -0.10255270f, 2465 0.03509852f, 0.04751543f, -0.03822323f, 0.09740467f, 0.04762916f, 2466 0.03940146f, -0.08283259f, 0.09552965f, 0.05038739f, 0.21258622f, 2467 0.09646992f, 0.03241193f, 0.05167701f, 0.04614570f, 0.04330090f, 2468 -0.02671840f, -0.06259909f, -0.02301898f, 0.18829170f, 0.10522786f, 2469 0.04313190f, 0.01670948f, -0.08421925f, 0.05911417f, -0.10582602f, 2470 -0.04855484f, -0.08373898f, 0.07775915f, 0.03723533f, -0.12047344f, 2471 4.86345543e-003f, -0.10520902f, 0.06571782f, -0.07528137f, 2472 -0.03245651f, -0.09869066f, -0.02917477f, -0.18293270f, 0.14810945f, 2473 9.24033765e-003f, -0.04354914f, 0.02266885f, -0.11872729f, 2474 -0.04016589f, 0.02830229f, 0.22539048f, 0.20565644f, 0.16701797f, 2475 0.09019924f, 0.01300652f, 0.09760600f, -0.03675831f, -0.01935448f, 2476 -0.06894835f, 0.08077277f, 0.19047537f, 0.11312226f, 0.04106043f, 2477 -0.11187182f, 0.04312806f, -0.18548580f, -0.11287174f, -0.08794551f, 2478 0.02078281f, -0.15295486f, 0.11806386f, -0.01103218f, -0.15971117f, 2479 0.02153538f, -0.05232147f, -0.10835317f, -0.13910367f, 0.05920752f, 2480 -0.10122602f, 0.20174250f, 0.09105796f, -0.01881348f, 0.09559010f, 2481 -0.03725745f, -0.09442931f, -0.09763174f, 0.05854454f, 0.08287182f, 2482 0.12919849f, 0.08594352f, -2.49806582e-003f, 0.02398440f, 2483 5.67950122e-003f, -0.06296340f, -0.12993270f, 0.03855852f, 0.05186560f, 2484 0.10839908f, -0.03380463f, -0.12654832f, -0.05399339f, -0.07456800f, 2485 -0.04736232f, -0.10164231f, 0.07496139f, 0.08125214f, 0.07656177f, 2486 -0.04999603f, -0.12823077f, -0.07692395f, -0.11317524f, -0.09118655f, 2487 -0.05695669f, 0.10477209f, 0.07468581f, 0.01630048f, -8.00961629e-003f, 2488 -0.06582128f, -0.04019095f, -0.04682907f, -0.01907842f, -0.10997720f, 2489 0.04911406f, 0.02931030f, 0.04197735f, -0.05773980f, -0.09670641f, 2490 -0.03594951f, -0.03402121f, -0.07149299f, -0.10566200f, 0.10601286f, 2491 0.06340689f, -0.01518632f, -5.96402306e-003f, -0.07628012f, 2492 -3.52779147e-003f, -0.02683854f, -0.10265494f, -0.02680815f, 2493 0.16338381f, 0.03103515f, 0.02296976f, 0.01624348f, -0.10831620f, 2494 -0.02314233f, -0.04789969f, -0.05530700f, -0.06461314f, 0.10494506f, 2495 0.04642856f, -0.07592955f, -0.06197905f, -0.09042154f, -0.01445521f, 2496 -0.04297818f, -0.11262015f, -0.11430512f, 0.03174541f, -0.03677487f, 2497 -0.02963996f, -0.06610169f, -0.13292049f, -0.07059067f, -0.08444111f, 2498 -0.02640536f, -0.07136250f, 0.04559967f, 0.01459980f, 0.17989251f, 2499 0.04435328f, -0.12464730f, -0.02871115f, -0.10752209f, -0.03393742f, 2500 -0.03791408f, 0.02548251f, 0.01956050f, 0.19245651f, 0.13963254f, 2501 -0.05904696f, -0.07424626f, -0.10411884f, 1.54176133e-003f, 2502 0.01797429f, 0.13025844f, 0.04547642f, -0.05710349f, -0.10697161f, 2503 -0.13489437f, -0.06515755f, -0.06406886f, -4.08572936e-003f, 2504 -0.01336483f, 0.04368737f, -0.11259720f, -0.05701635f, -0.06469971f, 2505 -0.08346602f, -0.04166770f, -0.05795543f, -0.08247511f, -0.05742628f, 2506 0.08452254f, -0.03350224f, 0.13980860f, 0.13252275f, 0.07589617f, 2507 0.07539988f, 0.12155797f, 0.19087289f, 0.15050751f, 0.21250245f, 2508 0.14206800f, 0.01298489f, 0.07450245f, 0.06559097f, 0.01700557f, 2509 0.04512971f, 0.16950700f, 0.10261577f, 0.16389982f, 0.05505059f, 2510 -0.03453077f, 0.08622462f, 0.07935954f, 0.03976260f, 0.02036091f, 2511 3.95744899e-003f, 0.03267065f, 0.15235919f, 0.01297494f, -0.08109194f, 2512 0.01407558f, 4.40693414e-003f, -0.15157418f, -0.11390478f, 2513 -0.07487597f, -7.81322457e-003f, -0.02749545f, -0.10181408f, 2514 0.13755716f, 0.14007211f, 0.13482562f, 0.27517235f, 0.34251109f, 2515 0.07639657f, 0.07268607f, 0.19823882f, 0.16135791f, -0.04186463f, 2516 -0.12784107f, -0.09846287f, 0.03169041f, 0.10974082f, -0.15051922f, 2517 -0.08916726f, -0.07138767f, -0.04153349f, 6.25418453e-003f, 2518 0.01266654f, 0.10533249f, 0.12749144f, 0.15148053f, 0.01498513f, 2519 0.06305949f, -0.01247123f, -0.08778401f, -0.08551880f, -0.11955146f, 2520 -0.08493572f, -0.02901620f, -0.02394859f, -0.13427313f, -0.11053200f, 2521 -0.14413260f, -0.15203285f, 0.03972760f, -3.72127310e-004f, 2522 -0.04200919f, 0.06105104f, 0.01904975f, -0.01106191f, 2523 -7.27445772e-003f, -0.01520341f, 1.10228511e-003f, -0.04949187f, 2524 -0.08013099f, 5.72071038e-003f, 0.08415454f, -0.06523152f, 0.03664081f, 2525 -0.02673042f, -0.12066154f, -0.03702074f, 0.06006580f, 0.01628682f, 2526 -6.17772620e-003f, 0.08192339f, -3.41629819e-003f, 0.02870512f, 2527 0.05807141f, 0.04959986f, 0.04618251f, -0.04901629f, -0.10579574f, 2528 0.02274442f, 0.12070961f, 2.23597488e-003f, 0.09831765f, -0.03019848f, 2529 -0.11181970f, -0.04961075f, 0.02498928f, -0.03714991f, -0.01619653f, 2530 0.02643486f, -7.62964319e-003f, -0.02882290f, -0.06242594f, 2531 -0.08439861f, 0.07220893f, 0.07263952f, 0.01561574f, 0.03091968f, 2532 0.01708712f, -0.03797151f, -3.18561122e-003f, 0.01624021f, 2533 -0.02828573f, 0.11284444f, -1.32280716e-003f, -0.07784860f, 2534 -0.07209100f, 0.03372242f, 0.12154529f, 0.02278104f, -0.05275500f, 2535 -0.01918484f, 0.12989293f, 0.05424401f, 0.02333086f, 0.04029022f, 2536 0.12392918f, 0.09495489f, 0.09190340f, 0.07935889f, 8.76816828e-003f, 2537 0.17148446f, -8.51302687e-003f, -0.08011249f, -0.06796283f, 2538 0.04884845f, 0.01112272f, -0.07835306f, -1.14811445e-003f, 2539 -0.03440760f, 0.02845243f, 0.07695542f, -0.07069533f, -0.01151784f, 2540 -8.53884313e-003f, -0.01662786f, -0.04163864f, 0.05400505f, 2541 0.02859163f, 0.02921852f, 0.05003135f, -6.85718050e-003f, -0.01632611f, 2542 0.07780217f, 0.04042810f, -0.01216440f, 3.60914599e-003f, -0.06322435f, 2543 0.09516726f, 0.12877031f, -9.69162490e-003f, 0.01031179f, 0.05180895f, 2544 -9.34659224e-003f, -0.01644533f, -0.04849347f, -0.04343236f, 2545 0.10514783f, 0.08046635f, -0.04615205f, -0.03975486f, -0.01485525f, 2546 0.13096830f, -0.01517950f, -0.06571898f, -0.04016372f, 0.01849786f, 2547 0.02439670f, 0.08067258f, 1.74824719e-003f, 0.07053747f, 0.08819518f, 2548 -5.08352555e-003f, -0.06550863f, -0.08266170f, -0.07780605f, 2549 0.01453450f, -0.08756890f, 0.01096501f, -8.71319138e-003f, 0.10110464f, 2550 0.02420769f, -0.06708383f, 0.02007811f, 5.93133038e-003f, 0.05398923f, 2551 0.07538138f, 0.02049227f, 0.02242589f, 0.04011070f, -1.44875818e-003f, 2552 -4.19115182e-003f, 0.06367654f, 0.02506934f, 0.02434536f, 0.05879405f, 2553 -8.22952855e-003f, -0.01242441f, 0.04224926f, -0.01754923f, 2554 0.05958161f, 0.03818886f, -0.01830363f, -0.04308917f, -0.04422197f, 2555 -0.02432721f, 0.02264866f, 2.03751423e-003f, 0.01197031f, 0.04439203f, 2556 0.12169247f, 0.03602713f, -0.02599251f, -1.98226492e-003f, 0.02046336f, 2557 -0.02639058f, -1.91242550e-003f, -0.09334669f, -0.03595153f, 2558 -9.88179818e-003f, -0.06848445f, -0.04666303f, -0.09955736f, 2559 -0.04206430f, 0.02609075f, 9.09005292e-003f, -0.07138551f, 2560 -4.22313227e-004f, 0.01766645f, 0.02756404f, 0.01308276f, 0.04052891f, 2561 0.02387515f, 0.05337298f, 0.02500631f, -0.04970853f, -0.12467445f, 2562 0.17604403f, 0.12256411f, -0.07512254f, 8.70451052e-003f, -0.05697548f, 2563 -0.03626474f, -8.76623299e-003f, -0.01210897f, -0.09451522f, 2564 0.07490732f, -0.02008001f, -0.02681278f, -0.06463405f, -0.01517507f, 2565 7.33757764e-003f, 6.07147906e-003f, -0.09316964f, -0.04575328f, 2566 0.13261597f, 0.15424870f, -0.01655918f, -0.02772390f, -0.05243644f, 2567 -0.02356456f, -0.02351753f, -0.10211615f, -0.12873036f, 0.14549787f, 2568 0.12519856f, 4.38762689e-003f, 0.02795992f, 0.05170322f, 0.09223596f, 2569 0.05890015f, 0.02376701f, -0.02777346f, 0.09506908f, 0.02328936f, 2570 -0.02319928f, -0.03218696f, -0.01527841f, -0.01016694f, -0.02674719f, 2571 0.05137179f, 0.01980666f, 0.06544447f, -0.01746171f, 0.01026380f, 2572 0.01561806f, 7.97004555e-004f, 0.07601810f, 0.01907250f, -0.03083035f, 2573 -0.05987392f, 0.09242783f, 0.14555025f, 0.01035827f, 0.03092401f, 2574 -0.09562709f, -0.03802354f, 0.02531144f, 0.03079449f, -0.07100715f, 2575 0.03330721f, -2.69116857e-003f, 0.03167490f, 0.05744999f, 0.03259895f, 2576 1.91266940e-003f, 0.03194578f, 0.07389776f, 0.02198060f, 0.07633314f, 2577 0.03293105f, -0.09103648f, 0.04718142f, 0.06102672f, -0.01003063f, 2578 5.85481385e-003f, -0.01522574f, 0.02323526f, 0.10584345f, 2579 4.35879454e-003f, 0.06107873f, 0.05868603f, -0.03115531f, 0.01214679f, 2580 0.08567052f, 3.93926632e-003f, -0.02521488f, -1.88425183e-003f, 2581 0.02038053f, -6.26854831e-004f, 0.04897438f, -0.04280585f, 2582 -0.04819689f, -0.04812867f, -0.01451186f, 0.05101469f, 2583 -9.01125465e-003f, -0.03333859f, 0.03917955f, 0.04196448f, 0.04292135f, 2584 0.02809529f, 0.02999715f, 0.04081348f, 9.10039060e-003f, 0.09703232f, 2585 0.10379741f, 0.02348725f, -4.72756615e-003f, 0.01027325f, 0.10402658f, 2586 0.12071823f, 0.09817299f, -0.02612033f, 0.03638414f, 0.05896405f, 2587 0.04865025f, 0.04793910f, -0.03882321f, -0.02962117f, -0.01222268f, 2588 0.04071597f, 0.01922777f, -0.02287866f, 0.03328381f, 0.01859092f, 2589 0.09024994f, 0.03804455f, -0.01424510f, 0.01953739f, 0.02509617f, 2590 -0.03390914f, -0.05663941f, -0.01641979f, 0.05848591f, 0.04639670f, 2591 0.02092116f, 0.12911791f, 0.19918139f, 0.07739855f, -7.25806039e-003f, 2592 0.04074838f, 0.03183993f, 1.39251316e-003f, -0.01428625f, 0.01865480f, 2593 0.08529541f, 0.13547510f, 0.11189661f, 0.03998901f, 0.09575938f, 2594 -0.02631102f, -0.03458253f, -0.04749985f, -0.06070716f, 2595 4.71884012e-003f, 0.06445789f, -0.02450038f, -0.05483776f, 2596 -0.04657237f, -0.02030717f, -0.03480766f, -0.09397731f, -0.06399718f, 2597 -0.01804585f, 5.62348310e-003f, -6.64811488e-003f, -0.06517869f, 2598 6.96210237e-003f, -0.01860148f, -0.04245830f, -0.05850367f, 2599 -3.24417115e-003f, 0.07700698f, 0.11290991f, 0.09923030f, -0.02970599f, 2600 0.05592411f, 0.04813979f, -0.09811195f, -0.09357996f, -0.03276114f, 2601 0.05218338f, 0.04141375f, 3.92977800e-003f, -0.05047480f, 0.15960084f, 2602 0.04612800f, -0.03114098f, -0.04650044f, -0.03249795f, -0.02425641f, 2603 -0.04311355f, 0.04307659f, -0.09401883f, -0.04742785f, -0.01254499f, 2604 -0.06598741f, 3.41369561e-003f, -0.05620445f, -7.28127593e-003f, 2605 -0.05998361f, -0.03274450f, -0.07376868f, 3.19015374e-003f, 2606 -0.07733069f, 0.05815864f, -0.02471071f, 0.03850617f, 0.13838784f, 2607 0.15399861f, 0.01731321f, -0.01477586f, 0.10393341f, 0.05159833f, 2608 -0.01945555f, -0.03427503f, -0.04867341f, 0.09237480f, 0.10732719f, 2609 0.06071450f, -0.01355071f, 0.01844356f, -0.03480803f, -0.03796671f, 2610 2.15628621e-004f, -0.05440186f, 0.01889855f, -0.01443413f, 2611 -0.02607902f, -0.02938001f, 0.02720689f, -0.06228397f, -0.02970936f, 2612 -0.03426210f, -0.10280876f, -0.06739304f, -0.05227850f, 0.03360292f, 2613 -0.11278441f, -0.06966180f, -0.13937433f, 9.10932291e-003f, 2614 2.52020749e-004f, -4.07359656e-003f, 0.12310639f, 0.09343060f, 2615 0.07302511f, 0.03222093f, 0.07532879f, 0.03792387f, -0.04985180f, 2616 0.01804602f, 0.02694195f, 0.13481498f, 0.04601225f, 0.04106982f, 2617 0.08511057f, 0.12314661f, 0.01320830f, 0.05044121f, -5.52943908e-003f, 2618 -0.08992624f, -0.02249301f, -0.08181777f, 0.06165213f, -0.03256603f, 2619 -0.01068920f, -0.01323473f, -0.11970232f, -0.04616347f, -0.12088681f, 2620 -0.06762606f, -0.08676834f, -0.06434575f, 0.01772529f, 0.03469615f, 2621 -0.10926618f, 0.03013873f, 0.14030397f, 0.16130108f, 0.17985588f, 2622 0.11281928f, 0.10530639f, 0.08905948f, 0.07733764f, 0.06695238f, 2623 0.02142088f, 0.06438877f, 0.09794453f, 0.05745072f, 0.02788557f, 2624 0.02632830f, 0.07985807f, 4.24902979e-003f, 8.47890321e-003f, 2625 -0.02679466f, -5.28812688e-003f, -0.02162580f, -0.07490715f, 2626 -0.08251337f, -0.02056576f, -0.01026194f, -1.15492963e-003f, 2627 -5.75720915e-004f, -0.07210591f, -0.07320981f, -0.04883312f, 2628 -0.10897151f, -0.07477258f, -0.08867134f, -0.09222437f, -0.10924666f, 2629 -0.10430276f, 0.07953499f, 0.02767959f, 0.11393359f, 0.18779543f, 2630 0.03313421f, 0.02143700f, 0.05852016f, -2.12067598e-003f, 2631 -3.76984011e-003f, 0.02774167f, -0.03124610f, 0.01465141f, 0.01616004f, 2632 -0.01391913f, -0.04404102f, -0.05444227f, -0.14684731f, -0.15016587f, 2633 0.04509468f, 1.29563001e-003f, 0.01398350f, 0.05610404f, -0.04868806f, 2634 -0.04776716f, -8.16873740e-003f, -2.30126386e-003f, -0.02286313f, 2635 0.11983398f, -0.04703261f, -0.08814441f, -0.07585249f, -0.10799607f, 2636 -0.03232087f, 0.01509786f, -0.04843464f, -0.03967846f, 0.09589416f, 2637 0.01352560f, -0.01458119f, 0.01050829f, -0.03038946f, 0.01608388f, 2638 1.11975556e-003f, -0.01250656f, 2.86211423e-003f, 0.04333691f, 2639 -0.14603497f, -0.01946543f, -0.02327525f, -0.01973944f, 0.07944400f, 2640 -0.02224544f, -0.06701808f, 0.03476532f, 0.11505594f, -0.02712801f, 2641 -0.01665113f, 0.06315716f, -0.08205860f, 0.07431999f, 0.04915778f, 2642 -0.04468752f, -0.01490402f, 0.07400476f, -0.11650901f, 0.05102430f, 2643 0.04559118f, -0.05916039f, 0.08840760f, -0.01587902f, -0.14890194f, 2644 0.07857784f, 0.04710254f, -0.05381983f, -0.07331945f, -0.03604643f, 2645 0.15611970f, 0.07649943f, -0.05959348f, -0.02776607f, 0.11098688f, 2646 0.03758875f, -0.04446875f, 0.04933187f, 0.01345535f, 0.06921103f, 2647 0.07364785f, 0.05518956f, 0.02899585f, 0.09375840f, 0.10518434f, 2648 -0.04420241f, 0.01915282f, -3.56386811e-003f, 0.14586878f, 0.10286101f, 2649 -0.04360626f, -0.12723237f, 0.09076386f, 0.11119842f, -0.06035013f, 2650 0.09674817f, 0.08938243f, 0.07065924f, 0.02603180f, 5.84815582e-003f, 2651 -0.05922065f, 0.12360309f, 3.59695964e-003f, 2.99844006e-003f, 2652 0.03697936f, 0.02043072f, 0.04168725f, 0.01025975f, -0.01359980f, 2653 -0.01600920f, 0.02581056f, 0.02329250f, 2.98100687e-003f, 0.01629762f, 2654 0.06652115f, 0.05855627f, 0.01237463f, -0.01297135f, 0.01761587f, 2655 0.05090865f, 0.06549342f, -0.04425945f, 2.43203156e-003f, 2656 3.07327788e-003f, 0.06678630f, -0.04303836f, 0.01082393f, -0.06476044f, 2657 0.04077786f, 0.12441979f, 0.08237778f, 0.07424165f, 0.04065890f, 2658 0.06905543f, 0.09556347f, 0.12724875f, -0.02132082f, 0.08514154f, 2659 -0.04175328f, -0.02666954f, 0.01897836f, 0.03317382f, 9.45465732e-003f, 2660 -0.01238974f, -0.04242500f, -0.01419479f, -0.03545213f, -0.02440874f, 2661 0.08684119f, 0.04212951f, 0.02462858f, -0.01104825f, -5.01706870e-003f, 2662 0.02968982f, 0.02597476f, -0.01568939f, 0.04514892f, 0.06974549f, 2663 0.08670278f, 0.06828108f, 0.10238872f, 0.05405957f, 0.06548470f, 2664 -0.03763957f, 0.01366090f, 0.07069602f, 0.05363748f, 0.04798120f, 2665 0.11706422f, 0.05466456f, -0.01869259f, 0.06344382f, 0.03106543f, 2666 0.08432506f, -0.02061096f, 0.03821088f, -6.92190882e-003f, 2667 6.40467042e-003f, -0.01271779f, 6.89014705e-005f, 0.04541415f, 2668 -0.01899539f, -0.05020239f, 0.03000903f, 0.01090422f, 4.52452758e-003f, 2669 0.02573632f, -0.02388454f, -0.04200457f, 1.72783900e-003f, 2670 -0.05978370f, -0.02720562f, 0.06573715f, 0.01154317f, 0.01265615f, 2671 0.07375994f, -9.19828378e-003f, -0.04914120f, 0.02124831f, 0.06455322f, 2672 0.04372910f, -0.03310043f, 0.03605788f, -6.78055827e-003f, 2673 9.36202332e-003f, 0.01747596f, -0.06406314f, -0.06812935f, 0.08080816f, 2674 -0.02778088f, 0.02735260f, 0.06393493f, 0.06652229f, 0.05676993f, 2675 0.08640018f, -7.59188086e-003f, -0.02012847f, -0.04741159f, 2676 -0.01657069f, -0.01624399f, 0.05547778f, -2.33309763e-003f, 2677 0.01120033f, 0.06141156f, -0.06285004f, -0.08732341f, -0.09313398f, 2678 -0.04267832f, 5.57443965e-003f, 0.04809862f, 0.01773641f, 2679 5.37361018e-003f, 0.14842421f, -0.06298012f, -0.02935147f, 0.11443478f, 2680 -0.05034208f, 5.65494271e-003f, 0.02076526f, -0.04577984f, 2681 -0.04735741f, 0.02961071f, -0.09307127f, -0.04417921f, -0.04990027f, 2682 -0.03940028f, 0.01306016f, 0.06267900f, 0.03758737f, 0.08460117f, 2683 0.13858789f, 0.04862388f, -0.06319809f, -0.05655516f, 0.01885816f, 2684 -0.03285607f, 0.03371567f, -0.07040928f, -0.04514049f, 0.01392166f, 2685 0.08184422f, -0.07230316f, 0.02386871f, 0.02184591f, 0.02605764f, 2686 -0.01033954f, 9.29878280e-003f, 7.67351175e-003f, 0.15189242f, 2687 0.02069071f, -0.09738296f, -0.08894105f, -0.07768748f, 0.02332268f, 2688 -0.01778995f, -0.03258888f, -0.08180822f, -0.08492987f, 0.02290156f, 2689 -0.11368170f, -0.03554465f, -0.04533844f, -0.02861580f, 0.06782424f, 2690 0.01113123f, 0.02453644f, 0.12721945f, 0.08084814f, -0.03607795f, 2691 0.01109122f, 0.04803548f, -0.03489929f, 0.03399536f, -0.05682014f, 2692 8.59533902e-003f, -4.27904585e-003f, 0.03230887f, -0.01300198f, 2693 -0.01038137f, -0.07930113f, 8.33097473e-003f, 0.02296994f, 2694 -0.01306500f, -0.01881626f, 0.04413369f, 0.05729880f, -0.03761553f, 2695 0.01942326f, 1.64540811e-003f, -0.03811319f, 0.04190650f, -0.14978096f, 2696 -0.04514487f, 0.01209545f, -5.46460645e-003f, -0.01647195f, 2697 7.63064111e-003f, -0.07494587f, 0.08415288f, 0.10020141f, -0.01228561f, 2698 0.06553826f, 0.04554005f, 0.07890417f, 0.03041138f, 0.01752007f, 2699 0.09208256f, -3.74419295e-004f, 0.10549527f, 0.04686913f, 0.01894833f, 2700 -0.02651412f, -4.34682379e-003f, 5.44942822e-003f, 0.01444484f, 2701 0.05882156f, -0.03336544f, 0.04603891f, -0.10432546f, 0.01923928f, 2702 0.01842845f, -0.01712168f, -0.02222766f, 0.04693324f, -0.06202956f, 2703 -0.01422159f, 0.08732220f, -0.07706107f, 0.02661049f, -0.04300238f, 2704 -0.03092422f, -0.03552184f, -0.01886088f, -0.04979934f, 0.03906401f, 2705 0.04608644f, 0.04966111f, 0.04275464f, -0.04621769f, -0.02653212f, 2706 8.57011229e-003f, 0.03839684f, 0.05818764f, 0.03880796f, 2707 -2.76100676e-004f, 0.03076511f, -0.03266929f, -0.05374557f, 2708 0.04986527f, -9.45429131e-003f, 0.03582499f, -2.64564669e-003f, 2709 -1.07461517e-003f, 0.02962313f, -0.01483363f, 0.03060869f, 0.02448327f, 2710 0.01845641f, 0.03282966f, -0.03534438f, -0.01084059f, -0.01119136f, 2711 -1.85360224e-003f, -5.94652840e-004f, -0.04451817f, 2.98327743e-003f, 2712 0.06272484f, -0.02152076f, -3.05971340e-003f, -0.05070828f, 2713 0.01531762f, 0.01282815f, 0.05167150f, 9.46266949e-003f, 2714 -3.34558333e-003f, 0.11442288f, -0.03906701f, -2.67325155e-003f, 2715 0.03069184f, -0.01134165f, 0.02949462f, 0.02879886f, 0.03855566f, 2716 -0.03450781f, 0.09142872f, -0.02156654f, 0.06075062f, -0.06220816f, 2717 0.01944680f, 6.68372354e-003f, -0.06656796f, 8.70784000e-003f, 2718 0.03456013f, 0.02434320f, -0.13236357f, -0.04177035f, -0.02069627f, 2719 0.01068112f, 0.01505432f, -0.07517391f, -3.83571628e-003f, 2720 -0.06298508f, -0.02881260f, -0.13101046f, -0.07221562f, 2721 -5.79945277e-003f, -8.57300125e-003f, 0.03782469f, 0.02762164f, 2722 0.04942456f, -0.02936396f, 0.09597211f, 0.01921411f, 0.06101191f, 2723 -0.04787507f, -0.01379578f, -7.40224449e-003f, -0.02220136f, 2724 -0.01313756f, 7.77558051e-003f, 0.12296968f, 0.02939998f, 0.03594062f, 2725 -0.07788624f, -0.01133144f, 3.99316690e-004f, -0.06090347f, 2726 -0.01122066f, -4.68682544e-003f, 0.07633100f, -0.06748922f, 2727 -0.05640298f, -0.05265681f, -0.01139122f, -0.01624347f, -0.04715714f, 2728 -0.01099092f, 0.01048561f, 3.28499987e-003f, -0.05810167f, 2729 -0.07699911f, -0.03330683f, 0.04185145f, 0.03478536f, 0.02275165f, 2730 0.02304766f, 6.66040834e-003f, 0.10968148f, -5.93013782e-003f, 2731 -0.04858336f, -0.04203213f, -0.09316786f, -6.13074889e-003f, 2732 -0.02544625f, 0.01366201f, 9.18555818e-003f, -0.01846578f, 2733 -0.05622401f, -0.03989377f, -0.07810296f, 6.91275718e-003f, 2734 0.05957597f, -0.03901334f, 0.01572002f, -0.01193903f, 2735 -6.89400872e-003f, -0.03093356f, -0.04136098f, -0.01562869f, 2736 -0.04604580f, 0.02865234f, -0.08678447f, -0.03232484f, -0.05364593f, 2737 -0.01445016f, -0.07003860f, -0.08669746f, -0.04520775f, 0.04274122f, 2738 0.03117515f, 0.08175703f, 0.01081109f, 0.06379741f, 0.06199206f, 2739 0.02865988f, 0.02360346f, 0.06725410f, -0.03248780f, -9.37702879e-003f, 2740 0.08265898f, -0.02245839f, 0.05125763f, -0.01862395f, 0.01973453f, 2741 -0.01994494f, -0.10770868f, 0.03180375f, 3.23935156e-003f, 2742 -0.02142080f, -0.04256190f, 0.04760900f, 0.04282863f, 0.05635953f, 2743 -0.01870849f, 0.05540622f, -0.03042666f, 0.01455277f, -0.06630179f, 2744 -0.05843807f, -0.03739681f, -0.09739155f, -0.03220233f, -0.05620182f, 2745 -0.10381401f, 0.07400211f, 4.20676917e-003f, 0.03258535f, 2746 2.14308966e-003f, 0.05121966f, -0.01274337f, 0.02384761f, 0.06335578f, 2747 -0.07905591f, 0.08375625f, -0.07898903f, -0.06508528f, -0.02498444f, 2748 0.06535810f, 0.03970535f, 0.04895468f, -0.01169566f, -0.03980601f, 2749 0.05682293f, 0.05925463f, -0.01165808f, -0.07936699f, -0.04208954f, 2750 0.01333987f, 0.09051196f, 0.10098671f, -0.03974256f, 0.01238771f, 2751 -0.07501741f, -0.03655440f, -0.04301528f, 0.09216860f, 2752 4.63579083e-004f, 0.02851115f, 0.02142735f, 1.28244064e-004f, 2753 0.02879687f, -0.08554889f, -0.04838862f, 0.08135369f, -0.05756533f, 2754 0.01413900f, 0.03451880f, -0.06619488f, -0.03053130f, 0.02961676f, 2755 -0.07384635f, 0.01135692f, 0.05283910f, -0.07778034f, -0.02107482f, 2756 -0.05511716f, -0.13473752f, 0.03030157f, 0.06722020f, -0.06218817f, 2757 -0.05826827f, 0.06254654f, 0.02895772f, -0.01664000f, -0.03620280f, 2758 -0.01612278f, -1.46097376e-003f, 0.14013411f, -8.96181818e-003f, 2759 -0.03250246f, 3.38630192e-003f, 2.64779478e-003f, 0.03359732f, 2760 -0.02411991f, -0.04229729f, 0.10666174f, -6.66579151f }; 2761 return std::vector<float>(detector, detector + sizeof(detector)/sizeof(detector[0])); 2762 } 2763 2764 // This function renurn 1981 SVM coeffs obtained from daimler's base. 2765 // To use these coeffs the detection window size should be (48,96) 2766 std::vector<float> HOGDescriptor::getDaimlerPeopleDetector() 2767 { 2768 static const float detector[] = { 2769 0.294350f, -0.098796f, -0.129522f, 0.078753f, 2770 0.387527f, 0.261529f, 0.145939f, 0.061520f, 2771 0.328699f, 0.227148f, -0.066467f, -0.086723f, 2772 0.047559f, 0.106714f, 0.037897f, 0.111461f, 2773 -0.024406f, 0.304769f, 0.254676f, -0.069235f, 2774 0.082566f, 0.147260f, 0.326969f, 0.148888f, 2775 0.055270f, -0.087985f, 0.261720f, 0.143442f, 2776 0.026812f, 0.238212f, 0.194020f, 0.056341f, 2777 -0.025854f, -0.034444f, -0.156631f, 0.205174f, 2778 0.089008f, -0.139811f, -0.100147f, -0.037830f, 2779 -0.029230f, -0.055641f, 0.033248f, -0.016512f, 2780 0.155244f, 0.247315f, -0.124694f, -0.048414f, 2781 -0.062219f, 0.193683f, 0.004574f, 0.055089f, 2782 0.093565f, 0.167712f, 0.167581f, 0.018895f, 2783 0.215258f, 0.122609f, 0.090520f, -0.067219f, 2784 -0.049029f, -0.099615f, 0.241804f, -0.094893f, 2785 -0.176248f, 0.001727f, -0.134473f, 0.104442f, 2786 0.050942f, 0.081165f, 0.072156f, 0.121646f, 2787 0.002656f, -0.297974f, -0.133587f, -0.060121f, 2788 -0.092515f, -0.048974f, -0.084754f, -0.180111f, 2789 -0.038590f, 0.086283f, -0.134636f, -0.107249f, 2790 0.132890f, 0.141556f, 0.249425f, 0.130273f, 2791 -0.030031f, 0.073212f, -0.008155f, 0.019931f, 2792 0.071688f, 0.000300f, -0.019525f, -0.021725f, 2793 -0.040993f, -0.086841f, 0.070124f, 0.240033f, 2794 0.265350f, 0.043208f, 0.166754f, 0.091453f, 2795 0.060916f, -0.036972f, -0.091043f, 0.079873f, 2796 0.219781f, 0.158102f, -0.140618f, -0.043016f, 2797 0.124802f, 0.093668f, 0.103208f, 0.094872f, 2798 0.080541f, 0.137711f, 0.160566f, -0.169231f, 2799 0.013983f, 0.309508f, -0.004217f, -0.057200f, 2800 -0.064489f, 0.014066f, 0.361009f, 0.251328f, 2801 -0.080983f, -0.044183f, 0.061436f, -0.037381f, 2802 -0.078786f, 0.030993f, 0.066314f, 0.037683f, 2803 0.152325f, -0.091683f, 0.070203f, 0.217856f, 2804 0.036435f, -0.076462f, 0.006254f, -0.094431f, 2805 0.154829f, -0.023038f, -0.196961f, -0.024594f, 2806 0.178465f, -0.050139f, -0.045932f, -0.000965f, 2807 0.109112f, 0.046165f, -0.159373f, -0.008713f, 2808 0.041307f, 0.097129f, -0.057211f, -0.064599f, 2809 0.077165f, 0.176167f, 0.138322f, 0.065753f, 2810 -0.104950f, 0.017933f, 0.136255f, -0.011598f, 2811 0.047007f, 0.080550f, 0.068619f, 0.084661f, 2812 -0.035493f, -0.091314f, -0.041411f, 0.060971f, 2813 -0.101912f, -0.079870f, -0.085977f, -0.022686f, 2814 0.079788f, -0.098064f, -0.054603f, 0.040383f, 2815 0.300794f, 0.128603f, 0.094844f, 0.047407f, 2816 0.101825f, 0.061832f, -0.162160f, -0.204553f, 2817 -0.035165f, 0.101450f, -0.016641f, -0.027140f, 2818 -0.134392f, -0.008743f, 0.102331f, 0.114853f, 2819 0.009644f, 0.062823f, 0.237339f, 0.167843f, 2820 0.053066f, -0.012592f, 0.043158f, 0.002305f, 2821 0.065001f, -0.038929f, -0.020356f, 0.152343f, 2822 0.043469f, -0.029967f, -0.042948f, 0.032481f, 2823 0.068488f, -0.110840f, -0.111083f, 0.111980f, 2824 -0.002072f, -0.005562f, 0.082926f, 0.006635f, 2825 -0.108153f, 0.024242f, -0.086464f, -0.189884f, 2826 -0.017492f, 0.191456f, -0.007683f, -0.128769f, 2827 -0.038017f, -0.132380f, 0.091926f, 0.079696f, 2828 -0.106728f, -0.007656f, 0.172744f, 0.011576f, 2829 0.009883f, 0.083258f, -0.026516f, 0.145534f, 2830 0.153924f, -0.130290f, -0.108945f, 0.124490f, 2831 -0.003186f, -0.100485f, 0.015024f, -0.060512f, 2832 0.026288f, -0.086713f, -0.169012f, 0.076517f, 2833 0.215778f, 0.043701f, -0.131642f, -0.012585f, 2834 -0.045181f, -0.118183f, -0.241544f, -0.167293f, 2835 -0.020107f, -0.019917f, -0.101827f, -0.107096f, 2836 -0.010503f, 0.044938f, 0.189680f, 0.217119f, 2837 -0.046086f, 0.044508f, 0.199716f, -0.036004f, 2838 -0.148927f, 0.013355f, -0.078279f, 0.030451f, 2839 0.056301f, -0.024609f, 0.083224f, 0.099533f, 2840 -0.039432f, -0.138880f, 0.005482f, -0.024120f, 2841 -0.140468f, -0.066381f, -0.017057f, 0.009260f, 2842 -0.058004f, -0.028486f, -0.061610f, 0.007483f, 2843 -0.158309f, -0.150687f, -0.044595f, -0.105121f, 2844 -0.045763f, -0.006618f, -0.024419f, -0.117713f, 2845 -0.119366f, -0.175941f, -0.071542f, 0.119027f, 2846 0.111362f, 0.043080f, 0.034889f, 0.093003f, 2847 0.007842f, 0.057368f, -0.108834f, -0.079968f, 2848 0.230959f, 0.020205f, 0.011470f, 0.098877f, 2849 0.101310f, -0.030215f, -0.018018f, -0.059552f, 2850 -0.106157f, 0.021866f, -0.036471f, 0.080051f, 2851 0.041165f, -0.082101f, 0.117726f, 0.030961f, 2852 -0.054763f, -0.084102f, -0.185778f, -0.061305f, 2853 -0.038089f, -0.110728f, -0.264010f, 0.076675f, 2854 -0.077111f, -0.137644f, 0.036232f, 0.277995f, 2855 0.019116f, 0.107738f, 0.144003f, 0.080304f, 2856 0.215036f, 0.228897f, 0.072713f, 0.077773f, 2857 0.120168f, 0.075324f, 0.062730f, 0.122478f, 2858 -0.049008f, 0.164912f, 0.162450f, 0.041246f, 2859 0.009891f, -0.097827f, -0.038700f, -0.023027f, 2860 -0.120020f, 0.203364f, 0.248474f, 0.149810f, 2861 -0.036276f, -0.082814f, -0.090343f, -0.027143f, 2862 -0.075689f, -0.320310f, -0.000500f, -0.143334f, 2863 -0.065077f, -0.186936f, 0.129372f, 0.116431f, 2864 0.181699f, 0.170436f, 0.418854f, 0.460045f, 2865 0.333719f, 0.230515f, 0.047822f, -0.044954f, 2866 -0.068086f, 0.140179f, -0.044821f, 0.085550f, 2867 0.092483f, -0.107296f, -0.130670f, -0.206629f, 2868 0.114601f, -0.317869f, -0.076663f, 0.038680f, 2869 0.212753f, -0.016059f, -0.126526f, -0.163602f, 2870 0.210154f, 0.099887f, -0.126366f, 0.118453f, 2871 0.019309f, -0.021611f, -0.096499f, -0.111809f, 2872 -0.200489f, 0.142854f, 0.228840f, -0.353346f, 2873 -0.179151f, 0.116834f, 0.252389f, -0.031728f, 2874 -0.188135f, -0.158998f, 0.386523f, 0.122315f, 2875 0.209944f, 0.394023f, 0.359030f, 0.260717f, 2876 0.170335f, 0.013683f, -0.142596f, -0.026138f, 2877 -0.011878f, -0.150519f, 0.047159f, -0.107062f, 2878 -0.147347f, -0.187689f, -0.186027f, -0.208048f, 2879 0.058468f, -0.073026f, -0.236556f, -0.079788f, 2880 -0.146216f, -0.058563f, -0.101361f, -0.071294f, 2881 -0.071093f, 0.116919f, 0.234304f, 0.306781f, 2882 0.321866f, 0.240000f, 0.073261f, -0.012173f, 2883 0.026479f, 0.050173f, 0.166127f, 0.228955f, 2884 0.061905f, 0.156460f, 0.205990f, 0.120672f, 2885 0.037350f, 0.167884f, 0.290099f, 0.420900f, 2886 -0.012601f, 0.189839f, 0.306378f, 0.118383f, 2887 -0.095598f, -0.072360f, -0.132496f, -0.224259f, 2888 -0.126021f, 0.022714f, 0.284039f, 0.051369f, 2889 -0.000927f, -0.058735f, -0.083354f, -0.141254f, 2890 -0.187578f, -0.202669f, 0.048902f, 0.246597f, 2891 0.441863f, 0.342519f, 0.066979f, 0.215286f, 2892 0.188191f, -0.072240f, -0.208142f, -0.030196f, 2893 0.178141f, 0.136985f, -0.043374f, -0.181098f, 2894 0.091815f, 0.116177f, -0.126690f, -0.386625f, 2895 0.368165f, 0.269149f, -0.088042f, -0.028823f, 2896 0.092961f, 0.024099f, 0.046112f, 0.176756f, 2897 0.135849f, 0.124955f, 0.195467f, -0.037218f, 2898 0.167217f, 0.188938f, 0.053528f, -0.066561f, 2899 0.133721f, -0.070565f, 0.115898f, 0.152435f, 2900 -0.116993f, -0.110592f, -0.179005f, 0.026668f, 2901 0.080530f, 0.075084f, -0.070401f, 0.012497f, 2902 0.021849f, -0.139764f, -0.022020f, -0.096301f, 2903 -0.064954f, -0.127446f, -0.013806f, -0.108315f, 2904 0.156285f, 0.149867f, -0.011382f, 0.064532f, 2905 0.029168f, 0.027393f, 0.069716f, 0.153735f, 2906 0.038459f, 0.230714f, 0.253840f, 0.059522f, 2907 -0.045053f, 0.014083f, 0.071103f, 0.068747f, 2908 0.095887f, 0.005832f, 0.144887f, 0.026357f, 2909 -0.067359f, -0.044151f, -0.123283f, -0.019911f, 2910 0.005318f, 0.109208f, -0.003201f, -0.021734f, 2911 0.142025f, -0.066907f, -0.120070f, -0.188639f, 2912 0.012472f, -0.048704f, -0.012366f, -0.184828f, 2913 0.168591f, 0.267166f, 0.058208f, -0.044101f, 2914 0.033500f, 0.178558f, 0.104550f, 0.122418f, 2915 0.080177f, 0.173246f, 0.298537f, 0.064173f, 2916 0.053397f, 0.174341f, 0.230984f, 0.117025f, 2917 0.166242f, 0.227781f, 0.120623f, 0.176952f, 2918 -0.011393f, -0.086483f, -0.008270f, 0.051700f, 2919 -0.153369f, -0.058837f, -0.057639f, -0.060115f, 2920 0.026349f, -0.160745f, -0.037894f, -0.048575f, 2921 0.041052f, -0.022112f, 0.060365f, 0.051906f, 2922 0.162657f, 0.138519f, -0.050185f, -0.005938f, 2923 0.071301f, 0.127686f, 0.062342f, 0.144400f, 2924 0.072600f, 0.198436f, 0.246219f, -0.078185f, 2925 -0.036169f, 0.075934f, 0.047328f, -0.013601f, 2926 0.087205f, 0.019900f, 0.022606f, -0.015365f, 2927 -0.092506f, 0.075275f, -0.116375f, 0.050500f, 2928 0.045118f, 0.166567f, 0.072073f, 0.060371f, 2929 0.131747f, -0.169863f, -0.039352f, -0.047486f, 2930 -0.039797f, -0.204312f, 0.021710f, 0.129443f, 2931 -0.021173f, 0.173416f, -0.070794f, -0.063986f, 2932 0.069689f, -0.064099f, -0.123201f, -0.017372f, 2933 -0.206870f, 0.065863f, 0.113226f, 0.024707f, 2934 -0.071341f, -0.066964f, -0.098278f, -0.062927f, 2935 0.075840f, 0.014716f, 0.019378f, 0.132699f, 2936 -0.074191f, -0.089557f, -0.078446f, -0.197488f, 2937 -0.173665f, 0.052583f, 0.044361f, 0.113549f, 2938 0.098492f, 0.077379f, -0.011146f, -0.192593f, 2939 -0.164435f, 0.045568f, 0.205699f, 0.049187f, 2940 -0.082281f, 0.134874f, 0.185499f, 0.034968f, 2941 -0.119561f, -0.112372f, -0.115091f, -0.054042f, 2942 -0.183816f, -0.078100f, 0.190695f, 0.091617f, 2943 0.004257f, -0.041135f, -0.061453f, -0.141592f, 2944 -0.194809f, -0.120638f, 0.020168f, 0.109672f, 2945 0.067398f, -0.015238f, -0.239145f, -0.264671f, 2946 -0.185176f, 0.050472f, 0.020793f, 0.035678f, 2947 0.022839f, -0.052055f, -0.127968f, -0.113049f, 2948 -0.228416f, -0.258281f, -0.053437f, 0.076424f, 2949 0.061450f, 0.237478f, 0.003618f, -0.055865f, 2950 -0.108087f, -0.028937f, 0.045585f, 0.052829f, 2951 -0.001471f, 0.022826f, 0.059565f, -0.104430f, 2952 -0.077266f, -0.211882f, -0.212078f, 0.028074f, 2953 0.075846f, 0.016265f, 0.161879f, 0.134477f, 2954 0.008935f, -0.048041f, 0.074692f, 0.004928f, 2955 -0.025156f, 0.192874f, 0.074410f, 0.308732f, 2956 0.267400f, 0.094208f, -0.005251f, 0.042041f, 2957 -0.032148f, 0.015588f, 0.252869f, 0.175302f, 2958 0.022892f, 0.081673f, 0.063208f, 0.162626f, 2959 0.194426f, 0.233890f, 0.262292f, 0.186930f, 2960 0.084079f, -0.286388f, -0.213034f, -0.048867f, 2961 -0.207669f, -0.170050f, 0.011673f, -0.092958f, 2962 -0.192786f, -0.273536f, 0.230904f, 0.266732f, 2963 0.320519f, 0.297155f, 0.548169f, 0.304922f, 2964 0.132687f, 0.247333f, 0.212488f, -0.271472f, 2965 -0.142105f, -0.002627f, -0.119215f, 0.128383f, 2966 0.100079f, -0.057490f, -0.121902f, -0.228892f, 2967 0.202292f, -0.399795f, -0.371326f, -0.095836f, 2968 -0.063626f, -0.161375f, -0.311180f, -0.294797f, 2969 0.242122f, 0.011788f, 0.095573f, 0.322523f, 2970 0.511840f, 0.322880f, 0.313259f, 0.173331f, 2971 0.002542f, -0.029802f, 0.324766f, -0.326170f, 2972 -0.340547f, -0.138288f, -0.002963f, -0.114060f, 2973 -0.377312f, -0.442570f, 0.212446f, -0.007759f, 2974 -0.011576f, 0.169711f, 0.308689f, 0.317348f, 2975 0.539390f, 0.332845f, 0.057331f, -0.068180f, 2976 0.101994f, 0.266995f, 0.209570f, 0.355730f, 2977 0.091635f, 0.170238f, 0.125215f, 0.274154f, 2978 0.070223f, 0.025515f, 0.049946f, -0.000550f, 2979 0.043715f, -0.141843f, 0.020844f, 0.129871f, 2980 0.256588f, 0.105015f, 0.148339f, 0.170682f, 2981 0.028792f, 0.074037f, 0.160042f, 0.405137f, 2982 0.246187f, 0.352160f, 0.168951f, 0.222263f, 2983 0.264439f, 0.065945f, 0.021963f, -0.075084f, 2984 0.093105f, 0.027318f, 0.098864f, 0.057566f, 2985 -0.080282f, 0.185032f, 0.314419f, 0.333727f, 2986 0.125798f, 0.294919f, 0.386002f, 0.217619f, 2987 -0.183517f, -0.278622f, -0.002342f, -0.027821f, 2988 -0.134266f, -0.331843f, -0.008296f, 0.124564f, 2989 0.053712f, -0.369016f, -0.095036f, 0.209381f, 2990 0.423760f, 0.371760f, 0.106397f, 0.369408f, 2991 0.485608f, 0.231201f, -0.138685f, -0.349208f, 2992 -0.070083f, 0.028991f, -0.081630f, -0.395992f, 2993 -0.146791f, -0.027354f, 0.063396f, -0.272484f, 2994 0.058299f, 0.338207f, 0.110767f, -0.052642f, 2995 -0.233848f, -0.027448f, 0.030328f, 0.155572f, 2996 -0.093826f, 0.019331f, 0.120638f, 0.006292f, 2997 -0.106083f, -0.236290f, -0.140933f, -0.088067f, 2998 -0.025138f, -0.208395f, -0.025502f, 0.144192f, 2999 -0.048353f, -0.106144f, -0.305121f, -0.114147f, 3000 0.090963f, 0.327727f, 0.035606f, -0.093779f, 3001 0.002651f, -0.171081f, -0.188131f, -0.216571f, 3002 -0.209101f, -0.054402f, 0.157147f, -0.057127f, 3003 0.066584f, 0.008988f, 0.041191f, 0.034456f, 3004 -0.078255f, 0.052099f, -0.022239f, 0.066981f, 3005 -0.117520f, -0.072637f, 0.062512f, 0.037570f, 3006 -0.057544f, -0.312359f, 0.034357f, -0.031549f, 3007 0.002566f, -0.207375f, -0.070654f, -0.018786f, 3008 -0.044815f, -0.012814f, -0.076320f, 0.078183f, 3009 0.023877f, 0.117078f, 0.022292f, -0.205424f, 3010 -0.060430f, -0.017296f, -0.004827f, -0.321036f, 3011 -0.092155f, 0.038837f, 0.073190f, -0.067513f, 3012 0.026521f, 0.171945f, 0.087318f, 0.034495f, 3013 -0.034089f, 0.154410f, -0.061431f, 0.007435f, 3014 -0.111094f, -0.095976f, 0.014741f, -0.132324f, 3015 -0.029517f, -0.192160f, 0.098667f, 0.020762f, 3016 0.177050f, -0.064510f, -0.054437f, -0.058678f, 3017 -0.001858f, 0.167602f, 0.015735f, 0.054338f, 3018 0.016477f, 0.186381f, -0.010667f, 0.054692f, 3019 0.126742f, 0.013140f, 0.090353f, -0.133608f, 3020 -0.018017f, -0.152619f, 0.027600f, -0.138700f, 3021 -0.050274f, 0.045141f, -0.118731f, 0.094797f, 3022 -0.167605f, 0.097461f, -0.009131f, 0.199920f, 3023 -0.052976f, 0.158194f, 0.178568f, -0.107600f, 3024 0.009671f, -0.084072f, -0.040258f, -0.205673f, 3025 0.102891f, 0.223511f, 0.042699f, 0.118548f, 3026 -0.021274f, 0.110997f, -0.155121f, 0.027696f, 3027 -0.149968f, 0.051552f, -0.129219f, 0.173524f, 3028 0.073972f, -0.189045f, -0.034523f, -0.106655f, 3029 -0.011843f, -0.197381f, 0.219413f, 0.183197f, 3030 -0.054920f, 0.144955f, 0.036517f, -0.085412f, 3031 -0.229070f, -0.143710f, -0.049486f, 0.156634f, 3032 -0.008673f, -0.064778f, 0.082344f, 0.145673f, 3033 0.002912f, -0.210121f, -0.116564f, 0.078425f, 3034 0.220908f, -0.067594f, 0.048610f, 0.084912f, 3035 -0.066202f, -0.112515f, -0.217767f, -0.082640f, 3036 -0.017414f, 0.230265f, -0.070735f, 0.066073f, 3037 0.215256f, 0.071157f, -0.087220f, -0.202235f, 3038 -0.011918f, 0.099562f, 0.174716f, -0.063845f, 3039 -0.121055f, 0.014367f, 0.132709f, -0.005060f, 3040 -0.244606f, -0.179693f, -0.134690f, 0.023239f, 3041 -0.193116f, -0.076975f, -0.021164f, -0.001938f, 3042 -0.163799f, -0.111437f, -0.210362f, -0.166376f, 3043 0.034754f, 0.010036f, -0.021917f, 0.068014f, 3044 -0.086893f, -0.251746f, -0.267171f, 0.037383f, 3045 0.003966f, 0.033571f, -0.151506f, 0.025437f, 3046 -0.020626f, -0.308454f, -0.343143f, -0.092263f, 3047 -0.026261f, -0.028345f, 0.036036f, 0.035169f, 3048 0.129470f, 0.122205f, 0.015661f, -0.070612f, 3049 -0.094333f, -0.066055f, -0.041083f, 0.159146f, 3050 0.073184f, 0.110044f, 0.174471f, 0.078069f, 3051 -0.014881f, 0.008116f, 0.013209f, 0.075857f, 3052 0.195605f, 0.062714f, 0.067955f, 0.056544f, 3053 -0.153908f, -0.141749f, -0.072550f, 0.033523f, 3054 -0.024665f, 0.134487f, 0.079076f, 0.133562f, 3055 0.227130f, 0.018054f, 0.004928f, 0.169162f, 3056 0.065152f, 0.072160f, 0.131631f, 0.096303f, 3057 0.054288f, 0.106256f, 0.114632f, 0.119038f, 3058 0.515200f, 0.247429f, 0.199134f, 0.211957f, 3059 0.127558f, -0.294684f, -0.194890f, -0.049988f, 3060 -0.112247f, -0.008122f, -0.006176f, 0.037035f, 3061 -0.110881f, -0.249989f, 0.152434f, 0.234621f, 3062 0.153340f, 0.349283f, 0.683049f, 0.157174f, 3063 0.124844f, 0.099136f, 0.064407f, -0.248400f, 3064 -0.155323f, -0.026498f, -0.023450f, 0.049051f, 3065 -0.114187f, 0.007195f, -0.176825f, -0.376926f, 3066 0.366159f, -0.179938f, -0.148508f, 0.006043f, 3067 0.170048f, 0.097866f, -0.102658f, -0.260430f, 3068 0.248868f, 0.037019f, -0.118111f, 0.078176f, 3069 0.194171f, 0.211328f, 0.368612f, 0.361213f, 3070 0.130013f, 0.094650f, 0.227396f, -0.178058f, 3071 -0.114782f, -0.008093f, 0.231080f, -0.011843f, 3072 -0.097917f, -0.325788f, 0.141879f, 0.119738f, 3073 -0.230427f, -0.117419f, -0.114153f, 0.037903f, 3074 0.116383f, 0.218773f, -0.101884f, 0.059466f, 3075 0.119255f, 0.010874f, -0.031449f, 0.045996f, 3076 0.119931f, 0.273760f, 0.311700f, 0.261794f, 3077 0.194809f, 0.339829f, 0.239449f, 0.064140f, 3078 0.077597f, 0.098996f, 0.143534f, 0.184602f, 3079 0.037507f, 0.225494f, 0.096142f, -0.147370f, 3080 -0.207833f, -0.174742f, -0.086391f, -0.038942f, 3081 0.159577f, -0.088492f, -0.000989f, 0.108154f, 3082 -0.025890f, -0.072713f, 0.025997f, -0.006803f, 3083 -0.086879f, -0.011290f, -0.269200f, -0.103450f, 3084 -0.124910f, -0.116340f, 0.141459f, 0.208800f, 3085 0.042268f, 0.265034f, 0.516474f, 0.217591f, 3086 -0.018843f, -0.313328f, -0.168363f, 0.047129f, 3087 0.090480f, -0.109852f, -0.018761f, 0.210669f, 3088 0.281269f, -0.043591f, -0.034147f, -0.237772f, 3089 -0.134843f, -0.072481f, -0.103831f, 0.038355f, 3090 0.308619f, 0.148023f, -0.045867f, -0.123950f, 3091 -0.210860f, -0.064973f, -0.036308f, -0.046731f, 3092 -0.022099f, 0.095776f, 0.409423f, 0.060635f, 3093 -0.065196f, 0.051828f, 0.027981f, -0.009609f, 3094 -0.137681f, -0.095011f, -0.019045f, 0.177278f, 3095 0.009759f, -0.092119f, -0.016958f, -0.133860f, 3096 -0.118421f, -0.032039f, -0.006214f, -0.084541f, 3097 0.063971f, -0.073642f, 0.165676f, 0.110443f, 3098 0.044131f, 0.046568f, 0.053292f, -0.055466f, 3099 0.015512f, 0.371947f, 0.232102f, -0.016923f, 3100 0.103979f, -0.091758f, 0.005907f, 0.209100f, 3101 0.157433f, 0.030518f, 0.250366f, 0.062322f, 3102 0.036720f, 0.094676f, 0.017306f, -0.010328f, 3103 -0.079012f, 0.016781f, -0.112435f, 0.061795f, 3104 0.042543f, -0.126799f, -0.009975f, -0.056760f, 3105 0.046424f, -0.194712f, -0.139399f, -0.037731f, 3106 0.157989f, -0.016261f, 0.123345f, 0.230563f, 3107 0.083300f, -0.016392f, 0.059567f, -0.016035f, 3108 -0.064767f, 0.231945f, 0.156629f, 0.034602f, 3109 0.145628f, 0.041315f, 0.034535f, 0.019967f, 3110 -0.089188f, -0.012091f, 0.307857f, 0.211405f, 3111 -0.025091f, -0.148249f, -0.129384f, 0.063536f, 3112 -0.068603f, -0.067941f, -0.035104f, 0.210832f, 3113 0.063810f, 0.062764f, -0.089889f, -0.030554f, 3114 0.014791f, -0.053362f, -0.037818f, -0.196640f, 3115 0.008388f, -0.082654f, 0.143056f, 0.064221f, 3116 0.069795f, 0.191040f, 0.097321f, -0.028679f, 3117 0.075794f, 0.313154f, 0.086240f, 0.207643f, 3118 0.017809f, 0.122867f, 0.224586f, 0.167403f, 3119 -0.023884f, 0.047434f, 0.344091f, 0.187745f, 3120 0.136177f, 0.141738f, 0.063799f, 0.045233f, 3121 -0.077342f, -0.003525f, -0.165041f, -0.025616f, 3122 -0.073745f, 0.164439f, 0.011200f, -0.145896f, 3123 -0.027954f, -0.061987f, -0.039874f, -0.142775f, 3124 0.151042f, -0.038238f, 0.053152f, 0.078615f, 3125 0.086061f, 0.100593f, 0.128046f, -0.071006f, 3126 -0.116558f, 0.208445f, 0.051086f, 0.076843f, 3127 0.023191f, -0.084781f, -0.011790f, 0.147807f, 3128 -0.048554f, -0.113932f, 0.283322f, 0.190934f, 3129 0.092789f, 0.033018f, -0.142428f, -0.142480f, 3130 -0.099023f, -0.041020f, -0.042760f, 0.203295f, 3131 -0.053475f, 0.042424f, 0.222839f, -0.019167f, 3132 -0.133176f, -0.276216f, -0.031998f, 0.117290f, 3133 0.177827f, -0.059973f, -0.064744f, -0.117040f, 3134 -0.155482f, -0.099531f, 0.164121f, -0.026682f, 3135 -0.093810f, 0.238993f, -0.006506f, 0.007830f, 3136 0.065819f, -0.203643f, -0.100925f, -0.053652f, 3137 -0.130770f, 0.026277f, 0.131796f, 0.032742f, 3138 0.127186f, 0.116694f, -0.161122f, -0.279773f, 3139 -0.252515f, -0.002638f, 0.042812f, 0.096776f, 3140 -0.123280f, 0.064858f, -0.010455f, -0.219760f, 3141 -0.239331f, -0.104363f, -0.058022f, -0.053584f, 3142 0.025611f, 0.005129f, -0.100418f, -0.045712f, 3143 -0.194418f, -0.126366f, -0.030530f, 0.051168f, 3144 0.215959f, 0.172402f, -0.054700f, -0.185995f, 3145 -0.278360f, -0.193693f, -0.040309f, 0.003735f, 3146 -0.007770f, 0.123556f, 0.190179f, -0.077315f, 3147 0.117403f, 0.212942f, 0.012160f, 0.000113f, 3148 0.027331f, 0.040202f, 0.033293f, 0.219438f, 3149 0.184174f, 0.259349f, 0.311206f, 0.082547f, 3150 -0.047875f, -0.078417f, 0.010746f, 0.082620f, 3151 0.311931f, 0.307605f, 0.003863f, 0.021405f, 3152 -0.026388f, -0.019572f, 0.020582f, -0.059353f, 3153 0.025199f, 0.261319f, 0.086316f, 0.143614f, 3154 0.107780f, 0.003900f, -0.188397f, -0.038563f, 3155 -0.106045f, -0.125154f, -0.010509f, 0.054021f, 3156 0.242130f, 0.279152f, 0.215546f, 0.346995f, 3157 0.440856f, 0.237452f, 0.234154f, 0.301646f, 3158 0.168929f, -0.208358f, -0.126848f, 0.010260f, 3159 0.121018f, -0.062975f, -0.052848f, 0.050341f, 3160 -0.061103f, -0.266482f, 0.107186f, 0.140221f, 3161 0.280065f, 0.287889f, 0.373198f, 0.151596f, 3162 0.013593f, 0.115616f, 0.014616f, -0.281710f, 3163 -0.237597f, -0.117305f, -0.000034f, -0.136739f, 3164 -0.196275f, -0.095225f, -0.125310f, -0.250514f, 3165 0.236804f, -0.071805f, -0.037421f, 0.048230f, 3166 0.321596f, 0.063632f, 0.024039f, -0.029133f, 3167 0.230983f, 0.160593f, -0.154355f, -0.013086f, 3168 -0.079929f, 0.094692f, 0.160391f, 0.180239f, 3169 0.053895f, 0.100759f, 0.288631f, 0.038191f, 3170 0.181692f, 0.229682f, 0.440166f, 0.063401f, 3171 0.006273f, 0.020865f, 0.338695f, 0.256244f, 3172 -0.043927f, 0.115617f, 0.003296f, 0.173965f, 3173 0.021318f, -0.040936f, -0.118932f, 0.182380f, 3174 0.235922f, -0.053233f, -0.015053f, -0.101057f, 3175 0.095341f, 0.051111f, 0.161831f, 0.032614f, 3176 0.159496f, 0.072375f, 0.025089f, 0.023748f, 3177 0.029151f, 0.161284f, -0.117717f, -0.036191f, 3178 -0.176822f, -0.162006f, 0.226542f, -0.078329f, 3179 0.043079f, -0.119172f, 0.054614f, -0.101365f, 3180 -0.064541f, -0.115304f, 0.135170f, 0.298872f, 3181 0.098060f, 0.089428f, -0.007497f, 0.110391f, 3182 -0.028824f, 0.020835f, -0.036804f, 0.125411f, 3183 0.192105f, -0.048931f, 0.003086f, -0.010681f, 3184 0.074698f, -0.016263f, 0.096063f, 0.060267f, 3185 -0.007277f, 0.139139f, -0.080635f, 0.036628f, 3186 0.086058f, 0.131979f, 0.085707f, 0.025301f, 3187 0.226094f, 0.194759f, 0.042193f, -0.157846f, 3188 -0.068402f, -0.141450f, -0.112659f, -0.076305f, 3189 -0.069085f, -0.114332f, -0.102005f, 0.132193f, 3190 -0.067042f, 0.106643f, 0.198964f, 0.171616f, 3191 0.167237f, -0.033730f, -0.026755f, 0.083621f, 3192 0.149459f, -0.002799f, -0.000318f, 0.011753f, 3193 0.065889f, -0.089375f, -0.049610f, 0.224579f, 3194 0.216548f, -0.034908f, -0.017851f, -0.088144f, 3195 0.007530f, 0.240268f, 0.073270f, 0.013263f, 3196 0.175323f, 0.012082f, 0.093993f, 0.015282f, 3197 0.105854f, 0.107990f, 0.077798f, -0.096166f, 3198 -0.079607f, 0.177820f, 0.142392f, 0.033337f, 3199 -0.078100f, -0.081616f, -0.046993f, 0.139459f, 3200 0.020272f, -0.123161f, 0.175269f, 0.105217f, 3201 0.057328f, 0.080909f, -0.012612f, -0.097081f, 3202 0.082060f, -0.096716f, -0.063921f, 0.201884f, 3203 0.128166f, -0.035051f, -0.032227f, -0.068139f, 3204 -0.115915f, 0.095080f, -0.086007f, -0.067543f, 3205 0.030776f, 0.032712f, 0.088937f, 0.054336f, 3206 -0.039329f, -0.114022f, 0.171672f, -0.112321f, 3207 -0.217646f, 0.065186f, 0.060223f, 0.192174f, 3208 0.055580f, -0.131107f, -0.144338f, 0.056730f, 3209 -0.034707f, -0.081616f, -0.135298f, -0.000614f, 3210 0.087189f, 0.014614f, 0.067709f, 0.107689f, 3211 0.225780f, 0.084361f, -0.008544f, 0.051649f, 3212 -0.048369f, -0.037739f, -0.060710f, 0.002654f, 3213 0.016935f, 0.085563f, -0.015961f, -0.019265f, 3214 0.111788f, 0.062376f, 0.202019f, 0.047713f, 3215 0.042261f, 0.069716f, 0.242913f, 0.021052f, 3216 -0.072812f, -0.155920f, -0.026436f, 0.035621f, 3217 -0.079300f, -0.028787f, -0.048329f, 0.084718f, 3218 -0.060565f, -0.083750f, -0.164075f, -0.040742f, 3219 -0.086219f, 0.015271f, -0.005204f, -0.016038f, 3220 0.045816f, -0.050433f, -0.077652f, 0.117109f, 3221 0.009611f, -0.009045f, -0.008634f, -0.055373f, 3222 -0.085968f, 0.028527f, -0.054736f, -0.168089f, 3223 0.175839f, 0.071205f, -0.023603f, 0.037907f, 3224 -0.004561f, -0.022634f, 0.123831f, 0.094469f, 3225 -0.072920f, -0.133642f, -0.014032f, -0.142754f, 3226 -0.026999f, -0.199409f, 0.013268f, 0.226989f, 3227 0.048650f, -0.170988f, -0.050141f, 0.007880f, 3228 0.061880f, 0.019078f, -0.043578f, -0.038139f, 3229 0.134814f, 0.054097f, -0.081670f, 0.176838f, 3230 0.047920f, -0.038176f, 0.050406f, -0.107181f, 3231 -0.036279f, 0.027060f, 0.081594f, -0.002820f, 3232 0.090507f, -0.033338f, -0.059571f, 0.013404f, 3233 -0.099860f, 0.073371f, 0.342805f, 0.098305f, 3234 -0.150910f, -0.020822f, -0.056960f, 0.046262f, 3235 -0.043413f, -0.149405f, -0.129105f, -0.010899f, 3236 -0.014229f, -0.179949f, -0.113044f, -0.049468f, 3237 -0.065513f, 0.090269f, -0.011919f, 0.087846f, 3238 0.095796f, 0.146127f, 0.101599f, 0.078066f, 3239 -0.084348f, -0.100002f, -0.020134f, -0.050169f, 3240 0.062122f, 0.014640f, 0.019143f, 0.036543f, 3241 0.180924f, -0.013976f, -0.066768f, -0.001090f, 3242 -0.070419f, -0.004839f, -0.001504f, 0.034483f, 3243 -0.044954f, -0.050336f, -0.088638f, -0.174782f, 3244 -0.116082f, -0.205507f, 0.015587f, -0.042839f, 3245 -0.096879f, -0.144097f, -0.050268f, -0.196796f, 3246 0.109639f, 0.271411f, 0.173732f, 0.108070f, 3247 0.156437f, 0.124255f, 0.097242f, 0.238693f, 3248 0.083941f, 0.109105f, 0.223940f, 0.267188f, 3249 0.027385f, 0.025819f, 0.125070f, 0.093738f, 3250 0.040353f, 0.038645f, -0.012730f, 0.144063f, 3251 0.052931f, -0.009138f, 0.084193f, 0.160272f, 3252 -0.041366f, 0.011951f, -0.121446f, -0.106713f, 3253 -0.047566f, 0.047984f, -0.255224f, -0.076116f, 3254 0.098685f, -0.150845f, -0.171513f, -0.156590f, 3255 0.058331f, 0.187493f, 0.413018f, 0.554265f, 3256 0.372242f, 0.237943f, 0.124571f, 0.110829f, 3257 0.010322f, -0.174477f, -0.067627f, -0.001979f, 3258 0.142913f, 0.040597f, 0.019907f, 0.025963f, 3259 -0.043585f, -0.120732f, 0.099937f, 0.091059f, 3260 0.247307f, 0.204226f, -0.042753f, -0.068580f, 3261 -0.119002f, 0.026722f, 0.034853f, -0.060934f, 3262 -0.025054f, -0.093026f, -0.035372f, -0.233209f, 3263 -0.049869f, -0.039151f, -0.022279f, -0.065380f, 3264 -9.063785f}; 3265 return std::vector<float>(detector, detector + sizeof(detector)/sizeof(detector[0])); 3266 } 3267 3268 class HOGConfInvoker : 3269 public ParallelLoopBody 3270 { 3271 public: 3272 HOGConfInvoker( const HOGDescriptor* _hog, const Mat& _img, 3273 double _hitThreshold, const Size& _padding, 3274 std::vector<DetectionROI>* locs, 3275 std::vector<Rect>* _vec, Mutex* _mtx ) 3276 { 3277 hog = _hog; 3278 img = _img; 3279 hitThreshold = _hitThreshold; 3280 padding = _padding; 3281 locations = locs; 3282 vec = _vec; 3283 mtx = _mtx; 3284 } 3285 3286 void operator()( const Range& range ) const 3287 { 3288 int i, i1 = range.start, i2 = range.end; 3289 3290 Size maxSz(cvCeil(img.cols/(*locations)[0].scale), cvCeil(img.rows/(*locations)[0].scale)); 3291 Mat smallerImgBuf(maxSz, img.type()); 3292 std::vector<Point> dets; 3293 3294 for( i = i1; i < i2; i++ ) 3295 { 3296 double scale = (*locations)[i].scale; 3297 3298 Size sz(cvRound(img.cols / scale), cvRound(img.rows / scale)); 3299 Mat smallerImg(sz, img.type(), smallerImgBuf.ptr()); 3300 3301 if( sz == img.size() ) 3302 smallerImg = Mat(sz, img.type(), img.data, img.step); 3303 else 3304 resize(img, smallerImg, sz); 3305 3306 hog->detectROI(smallerImg, (*locations)[i].locations, dets, (*locations)[i].confidences, hitThreshold, Size(), padding); 3307 Size scaledWinSize = Size(cvRound(hog->winSize.width*scale), cvRound(hog->winSize.height*scale)); 3308 mtx->lock(); 3309 for( size_t j = 0; j < dets.size(); j++ ) 3310 vec->push_back(Rect(cvRound(dets[j].x*scale), 3311 cvRound(dets[j].y*scale), 3312 scaledWinSize.width, scaledWinSize.height)); 3313 mtx->unlock(); 3314 } 3315 } 3316 3317 const HOGDescriptor* hog; 3318 Mat img; 3319 double hitThreshold; 3320 std::vector<DetectionROI>* locations; 3321 Size padding; 3322 std::vector<Rect>* vec; 3323 Mutex* mtx; 3324 }; 3325 3326 void HOGDescriptor::detectROI(const cv::Mat& img, const std::vector<cv::Point> &locations, 3327 CV_OUT std::vector<cv::Point>& foundLocations, CV_OUT std::vector<double>& confidences, 3328 double hitThreshold, cv::Size winStride, cv::Size padding) const 3329 { 3330 foundLocations.clear(); 3331 confidences.clear(); 3332 3333 if( svmDetector.empty() || locations.empty()) 3334 return; 3335 3336 if( winStride == Size() ) 3337 winStride = cellSize; 3338 Size cacheStride(gcd(winStride.width, blockStride.width), 3339 gcd(winStride.height, blockStride.height)); 3340 3341 size_t nwindows = locations.size(); 3342 padding.width = (int)alignSize(std::max(padding.width, 0), cacheStride.width); 3343 padding.height = (int)alignSize(std::max(padding.height, 0), cacheStride.height); 3344 Size paddedImgSize(img.cols + padding.width*2, img.rows + padding.height*2); 3345 3346 // HOGCache cache(this, img, padding, padding, nwindows == 0, cacheStride); 3347 HOGCache cache(this, img, padding, padding, true, cacheStride); 3348 if( !nwindows ) 3349 nwindows = cache.windowsInImage(paddedImgSize, winStride).area(); 3350 3351 const HOGCache::BlockData* blockData = &cache.blockData[0]; 3352 3353 int nblocks = cache.nblocks.area(); 3354 int blockHistogramSize = cache.blockHistogramSize; 3355 size_t dsize = getDescriptorSize(); 3356 3357 double rho = svmDetector.size() > dsize ? svmDetector[dsize] : 0; 3358 std::vector<float> blockHist(blockHistogramSize); 3359 3360 #if CV_SSE2 3361 float partSum[4]; 3362 #endif 3363 3364 for( size_t i = 0; i < nwindows; i++ ) 3365 { 3366 Point pt0; 3367 pt0 = locations[i]; 3368 if( pt0.x < -padding.width || pt0.x > img.cols + padding.width - winSize.width || 3369 pt0.y < -padding.height || pt0.y > img.rows + padding.height - winSize.height ) 3370 { 3371 // out of image 3372 confidences.push_back(-10.0); 3373 continue; 3374 } 3375 3376 double s = rho; 3377 const float* svmVec = &svmDetector[0]; 3378 int j, k; 3379 3380 for( j = 0; j < nblocks; j++, svmVec += blockHistogramSize ) 3381 { 3382 const HOGCache::BlockData& bj = blockData[j]; 3383 Point pt = pt0 + bj.imgOffset; 3384 3385 // need to devide this into 4 parts! 3386 const float* vec = cache.getBlock(pt, &blockHist[0]); 3387 #if CV_SSE2 3388 __m128 _vec = _mm_loadu_ps(vec); 3389 __m128 _svmVec = _mm_loadu_ps(svmVec); 3390 __m128 sum = _mm_mul_ps(_svmVec, _vec); 3391 3392 for( k = 4; k <= blockHistogramSize - 4; k += 4 ) 3393 { 3394 _vec = _mm_loadu_ps(vec + k); 3395 _svmVec = _mm_loadu_ps(svmVec + k); 3396 3397 sum = _mm_add_ps(sum, _mm_mul_ps(_vec, _svmVec)); 3398 } 3399 3400 _mm_storeu_ps(partSum, sum); 3401 double t0 = partSum[0] + partSum[1]; 3402 double t1 = partSum[2] + partSum[3]; 3403 s += t0 + t1; 3404 #else 3405 for( k = 0; k <= blockHistogramSize - 4; k += 4 ) 3406 s += vec[k]*svmVec[k] + vec[k+1]*svmVec[k+1] + 3407 vec[k+2]*svmVec[k+2] + vec[k+3]*svmVec[k+3]; 3408 #endif 3409 for( ; k < blockHistogramSize; k++ ) 3410 s += vec[k]*svmVec[k]; 3411 } 3412 confidences.push_back(s); 3413 3414 if( s >= hitThreshold ) 3415 foundLocations.push_back(pt0); 3416 } 3417 } 3418 3419 void HOGDescriptor::detectMultiScaleROI(const cv::Mat& img, 3420 CV_OUT std::vector<cv::Rect>& foundLocations, std::vector<DetectionROI>& locations, 3421 double hitThreshold, int groupThreshold) const 3422 { 3423 std::vector<Rect> allCandidates; 3424 Mutex mtx; 3425 3426 parallel_for_(Range(0, (int)locations.size()), 3427 HOGConfInvoker(this, img, hitThreshold, Size(8, 8), 3428 &locations, &allCandidates, &mtx)); 3429 3430 foundLocations.resize(allCandidates.size()); 3431 std::copy(allCandidates.begin(), allCandidates.end(), foundLocations.begin()); 3432 cv::groupRectangles(foundLocations, groupThreshold, 0.2); 3433 } 3434 3435 void HOGDescriptor::readALTModel(String modelfile) 3436 { 3437 // read model from SVMlight format.. 3438 FILE *modelfl; 3439 if ((modelfl = fopen(modelfile.c_str(), "rb")) == NULL) 3440 { 3441 String eerr("file not exist"); 3442 String efile(__FILE__); 3443 String efunc(__FUNCTION__); 3444 throw Exception(Error::StsError, eerr, efile, efunc, __LINE__); 3445 } 3446 char version_buffer[10]; 3447 if (!fread (&version_buffer,sizeof(char),10,modelfl)) 3448 { 3449 String eerr("version?"); 3450 String efile(__FILE__); 3451 String efunc(__FUNCTION__); 3452 throw Exception(Error::StsError, eerr, efile, efunc, __LINE__); 3453 } 3454 if(strcmp(version_buffer,"V6.01")) { 3455 String eerr("version doesnot match"); 3456 String efile(__FILE__); 3457 String efunc(__FUNCTION__); 3458 throw Exception(Error::StsError, eerr, efile, efunc, __LINE__); 3459 } 3460 /* read version number */ 3461 int version = 0; 3462 if (!fread (&version,sizeof(int),1,modelfl)) 3463 { throw Exception(); } 3464 if (version < 200) 3465 { 3466 String eerr("version doesnot match"); 3467 String efile(__FILE__); 3468 String efunc(__FUNCTION__); 3469 throw Exception(); 3470 } 3471 int kernel_type; 3472 size_t nread; 3473 nread=fread(&(kernel_type),sizeof(int),1,modelfl); 3474 3475 {// ignore these 3476 int poly_degree; 3477 nread=fread(&(poly_degree),sizeof(int),1,modelfl); 3478 3479 double rbf_gamma; 3480 nread=fread(&(rbf_gamma),sizeof(double), 1, modelfl); 3481 double coef_lin; 3482 nread=fread(&(coef_lin),sizeof(double),1,modelfl); 3483 double coef_const; 3484 nread=fread(&(coef_const),sizeof(double),1,modelfl); 3485 int l; 3486 nread=fread(&l,sizeof(int),1,modelfl); 3487 char* custom = new char[l]; 3488 nread=fread(custom,sizeof(char),l,modelfl); 3489 delete[] custom; 3490 } 3491 int totwords; 3492 nread=fread(&(totwords),sizeof(int),1,modelfl); 3493 {// ignore these 3494 int totdoc; 3495 nread=fread(&(totdoc),sizeof(int),1,modelfl); 3496 int sv_num; 3497 nread=fread(&(sv_num), sizeof(int),1,modelfl); 3498 } 3499 3500 double linearbias; 3501 nread=fread(&linearbias, sizeof(double), 1, modelfl); 3502 3503 std::vector<float> detector; 3504 detector.clear(); 3505 if(kernel_type == 0) { /* linear kernel */ 3506 /* save linear wts also */ 3507 double *linearwt = new double[totwords+1]; 3508 int length = totwords; 3509 nread = fread(linearwt, sizeof(double), totwords + 1, modelfl); 3510 if(nread != static_cast<size_t>(length) + 1) { 3511 delete [] linearwt; 3512 throw Exception(); 3513 } 3514 3515 for(int i = 0; i < length; i++) 3516 detector.push_back((float)linearwt[i]); 3517 3518 detector.push_back((float)-linearbias); 3519 setSVMDetector(detector); 3520 delete [] linearwt; 3521 } else { 3522 throw Exception(); 3523 } 3524 fclose(modelfl); 3525 } 3526 3527 void HOGDescriptor::groupRectangles(std::vector<cv::Rect>& rectList, std::vector<double>& weights, int groupThreshold, double eps) const 3528 { 3529 if( groupThreshold <= 0 || rectList.empty() ) 3530 { 3531 return; 3532 } 3533 3534 CV_Assert(rectList.size() == weights.size()); 3535 3536 std::vector<int> labels; 3537 int nclasses = partition(rectList, labels, SimilarRects(eps)); 3538 3539 std::vector<cv::Rect_<double> > rrects(nclasses); 3540 std::vector<int> numInClass(nclasses, 0); 3541 std::vector<double> foundWeights(nclasses, -std::numeric_limits<double>::max()); 3542 int i, j, nlabels = (int)labels.size(); 3543 3544 for( i = 0; i < nlabels; i++ ) 3545 { 3546 int cls = labels[i]; 3547 rrects[cls].x += rectList[i].x; 3548 rrects[cls].y += rectList[i].y; 3549 rrects[cls].width += rectList[i].width; 3550 rrects[cls].height += rectList[i].height; 3551 foundWeights[cls] = max(foundWeights[cls], weights[i]); 3552 numInClass[cls]++; 3553 } 3554 3555 for( i = 0; i < nclasses; i++ ) 3556 { 3557 // find the average of all ROI in the cluster 3558 cv::Rect_<double> r = rrects[i]; 3559 double s = 1.0/numInClass[i]; 3560 rrects[i] = cv::Rect_<double>(cv::saturate_cast<double>(r.x*s), 3561 cv::saturate_cast<double>(r.y*s), 3562 cv::saturate_cast<double>(r.width*s), 3563 cv::saturate_cast<double>(r.height*s)); 3564 } 3565 3566 rectList.clear(); 3567 weights.clear(); 3568 3569 for( i = 0; i < nclasses; i++ ) 3570 { 3571 cv::Rect r1 = rrects[i]; 3572 int n1 = numInClass[i]; 3573 double w1 = foundWeights[i]; 3574 if( n1 <= groupThreshold ) 3575 continue; 3576 // filter out small rectangles inside large rectangles 3577 for( j = 0; j < nclasses; j++ ) 3578 { 3579 int n2 = numInClass[j]; 3580 3581 if( j == i || n2 <= groupThreshold ) 3582 continue; 3583 3584 cv::Rect r2 = rrects[j]; 3585 3586 int dx = cv::saturate_cast<int>( r2.width * eps ); 3587 int dy = cv::saturate_cast<int>( r2.height * eps ); 3588 3589 if( r1.x >= r2.x - dx && 3590 r1.y >= r2.y - dy && 3591 r1.x + r1.width <= r2.x + r2.width + dx && 3592 r1.y + r1.height <= r2.y + r2.height + dy && 3593 (n2 > std::max(3, n1) || n1 < 3) ) 3594 break; 3595 } 3596 3597 if( j == nclasses ) 3598 { 3599 rectList.push_back(r1); 3600 weights.push_back(w1); 3601 } 3602 } 3603 } 3604 } 3605