Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
O
opencv
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
opencv
Commits
061dd7e8
Commit
061dd7e8
authored
Mar 13, 2013
by
cuda-geek
Committed by
OpenCV Buildbot
Mar 13, 2013
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #643 from cuda-geek:refactor-softcascade-globbing
parents
9f3ce0dd
18aa5c92
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
55 additions
and
363 deletions
+55
-363
dataset.cpp
apps/sft/dataset.cpp
+7
-91
_random.hpp
modules/softcascade/src/_random.hpp
+0
-162
integral_channel_builder.cpp
modules/softcascade/src/integral_channel_builder.cpp
+0
-14
precomp.hpp
modules/softcascade/src/precomp.hpp
+41
-1
test_training.cpp
modules/softcascade/test/test_training.cpp
+7
-95
No files found.
apps/sft/dataset.cpp
View file @
061dd7e8
...
...
@@ -46,116 +46,32 @@
#include <iostream>
#include <queue>
inline
std
::
string
itoa
(
long
i
)
{
return
cv
::
format
(
"%ld"
,
i
);
}
#if !defined (_WIN32) && ! defined(__MINGW32__)
# include <glob.h>
namespace
{
using
namespace
sft
;
void
glob
(
const
string
&
path
,
svector
&
ret
)
{
glob_t
glob_result
;
glob
(
path
.
c_str
(),
GLOB_TILDE
,
0
,
&
glob_result
);
ret
.
clear
();
ret
.
reserve
(
glob_result
.
gl_pathc
);
for
(
unsigned
int
i
=
0
;
i
<
glob_result
.
gl_pathc
;
++
i
)
{
ret
.
push_back
(
std
::
string
(
glob_result
.
gl_pathv
[
i
]));
dprintf
(
"%s
\n
"
,
ret
[
i
].
c_str
());
}
globfree
(
&
glob_result
);
}
}
#else
# include <windows.h>
namespace
{
using
namespace
sft
;
void
glob
(
const
string
&
refRoot
,
const
string
&
refExt
,
svector
&
refvecFiles
)
{
std
::
string
strFilePath
;
// File path
std
::
string
strExtension
;
// Extension
std
::
string
strPattern
=
refRoot
+
"
\\
*.*"
;
WIN32_FIND_DATA
FileInformation
;
// File information
HANDLE
hFile
=
::
FindFirstFile
(
strPattern
.
c_str
(),
&
FileInformation
);
if
(
hFile
==
INVALID_HANDLE_VALUE
)
CV_Error
(
CV_StsBadArg
,
"Your dataset search path is incorrect"
);
do
{
if
(
FileInformation
.
cFileName
[
0
]
!=
'.'
)
{
strFilePath
.
erase
();
strFilePath
=
refRoot
+
"
\\
"
+
FileInformation
.
cFileName
;
if
(
!
(
FileInformation
.
dwFileAttributes
&
FILE_ATTRIBUTE_DIRECTORY
)
)
{
// Check extension
strExtension
=
FileInformation
.
cFileName
;
strExtension
=
strExtension
.
substr
(
strExtension
.
rfind
(
"."
)
+
1
);
if
(
strExtension
==
refExt
)
// Save filename
refvecFiles
.
push_back
(
strFilePath
);
}
}
}
while
(
::
FindNextFile
(
hFile
,
&
FileInformation
)
==
TRUE
);
// Close handle
::
FindClose
(
hFile
);
DWORD
dwError
=
::
GetLastError
();
if
(
dwError
!=
ERROR_NO_MORE_FILES
)
CV_Error
(
CV_StsBadArg
,
"Your dataset search path is incorrect"
);
}
}
#endif
// in the default case data folders should be aligned as following:
// 1. positives: <train or test path>/octave_<octave number>/pos/*.png
// 2. negatives: <train or test path>/octave_<octave number>/neg/*.png
ScaledDataset
::
ScaledDataset
(
const
string
&
path
,
const
int
oct
)
sft
::
ScaledDataset
::
ScaledDataset
(
const
string
&
path
,
const
int
oct
)
{
dprintf
(
"%s
\n
"
,
"get dataset file names..."
);
dprintf
(
"%s
\n
"
,
"Positives globing..."
);
#if !defined (_WIN32) && ! defined(__MINGW32__)
glob
(
path
+
"/pos/octave_"
+
itoa
(
oct
)
+
"/*.png"
,
pos
);
#else
glob
(
path
+
"/pos/octave_"
+
itoa
(
oct
),
"png"
,
pos
);
#endif
cv
::
glob
(
path
+
"/pos/octave_"
+
cv
::
format
(
"%d"
,
oct
)
+
"/*.png"
,
pos
);
dprintf
(
"%s
\n
"
,
"Negatives globing..."
);
#if !defined (_WIN32) && ! defined(__MINGW32__)
glob
(
path
+
"/neg/octave_"
+
itoa
(
oct
)
+
"/*.png"
,
neg
);
#else
glob
(
path
+
"/neg/octave_"
+
itoa
(
oct
),
"png"
,
neg
);
#endif
cv
::
glob
(
path
+
"/neg/octave_"
+
cv
::
format
(
"%d"
,
oct
)
+
"/*.png"
,
neg
);
// Check: files not empty
CV_Assert
(
pos
.
size
()
!=
size_t
(
0
));
CV_Assert
(
neg
.
size
()
!=
size_t
(
0
));
}
cv
::
Mat
ScaledDataset
::
get
(
SampleType
type
,
int
idx
)
const
cv
::
Mat
sft
::
ScaledDataset
::
get
(
SampleType
type
,
int
idx
)
const
{
const
std
::
string
&
src
=
(
type
==
POSITIVE
)
?
pos
[
idx
]
:
neg
[
idx
];
return
cv
::
imread
(
src
);
}
int
ScaledDataset
::
available
(
SampleType
type
)
const
int
sft
::
ScaledDataset
::
available
(
SampleType
type
)
const
{
return
(
int
)((
type
==
POSITIVE
)
?
pos
.
size
()
:
neg
.
size
());
}
ScaledDataset
::~
ScaledDataset
(){}
\ No newline at end of file
sft
::
ScaledDataset
::~
ScaledDataset
(){}
\ No newline at end of file
modules/softcascade/src/_random.hpp
deleted
100644 → 0
View file @
9f3ce0dd
/*M///////////////////////////////////////////////////////////////////////////////////////
//
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
//
// By downloading, copying, installing or using the software you agree to this license.
// If you do not agree to this license, do not download, install,
// copy or use the software.
//
//
// License Agreement
// For Open Source Computer Vision Library
//
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
// Copyright (C) 2008-2012, Willow Garage Inc., all rights reserved.
// Third party copyrights are property of their respective owners.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// * Redistribution's of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// * Redistribution's in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and / or other materials provided with the distribution.
//
// * The name of the copyright holders may not be used to endorse or promote products
// derived from this software without specific prior written permission.
//
// This software is provided by the copyright holders and contributors "as is" and
// any express or implied warranties, including, but not limited to, the implied
// warranties of merchantability and fitness for a particular purpose are disclaimed.
// In no event shall the Intel Corporation or contributors be liable for any direct,
// indirect, incidental, special, exemplary, or consequential damages
// (including, but not limited to, procurement of substitute goods or services;
// loss of use, data, or profits; or business interruption) however caused
// and on any theory of liability, whether in contract, strict liability,
// or tort (including negligence or otherwise) arising in any way out of
// the use of this software, even if advised of the possibility of such damage.
//
//M*/
#ifndef __SFT_RANDOM_HPP__
#define __SFT_RANDOM_HPP__
#if defined(_MSC_VER) && _MSC_VER >= 1600
# include <random>
namespace
cv
{
namespace
softcascade
{
namespace
internal
{
struct
Random
{
typedef
std
::
mt19937
engine
;
typedef
engine
::
result_type
seed_type
;
typedef
std
::
uniform_int
<
int
>
uniform
;
};
}}}
#elif (__GNUC__) && __GNUC__ > 3 && __GNUC_MINOR__ > 1 && !defined(__ANDROID__)
# if defined (__cplusplus) && __cplusplus > 201100L
# include <random>
namespace
cv
{
namespace
softcascade
{
namespace
internal
{
struct
Random
{
typedef
std
::
mt19937
engine
;
typedef
engine
::
result_type
seed_type
;
// True if we're using C++11.
#if __cplusplus >= 201103L
// C++11 removes uniform_int.
typedef
std
::
uniform_int_distribution
<
int
>
uniform
;
#else
typedef
std
::
uniform_int
<
int
>
uniform
;
#endif
};
}}}
# else
# include <tr1/random>
namespace
cv
{
namespace
softcascade
{
namespace
internal
{
struct
Random
{
typedef
std
::
tr1
::
mt19937
engine
;
typedef
engine
::
result_type
seed_type
;
typedef
std
::
tr1
::
uniform_int
<
int
>
uniform
;
};
}}}
# endif
#else
# include <opencv2/core/core.hpp>
namespace
cv
{
namespace
softcascade
{
namespace
internal
{
namespace
rnd
{
typedef
cv
::
RNG
engine
;
template
<
typename
T
>
struct
uniform_int
{
uniform_int
(
const
int
_min
,
const
int
_max
)
:
min
(
_min
),
max
(
_max
)
{}
T
operator
()
(
engine
&
eng
,
const
int
bound
)
const
{
return
(
T
)
eng
.
uniform
(
min
,
bound
);
}
T
operator
()
(
engine
&
eng
)
const
{
return
(
T
)
eng
.
uniform
(
min
,
max
);
}
private
:
int
min
;
int
max
;
};
}
struct
Random
{
typedef
rnd
::
engine
engine
;
typedef
uint64
seed_type
;
typedef
rnd
::
uniform_int
<
int
>
uniform
;
};
}}}
#endif
#if defined _WIN32 && (_WIN32 || _WIN64)
# if _WIN64
# define USE_LONG_SEEDS
# endif
#endif
#if defined (__GNUC__) &&__GNUC__
# if defined(__x86_64__) || defined(__ppc64__)
# define USE_LONG_SEEDS
# endif
#endif
#if defined USE_LONG_SEEDS
# define FEATURE_RECT_SEED 8854342234LU
# define INDEX_ENGINE_SEED 764224349868LU
#else
# define FEATURE_RECT_SEED 88543422LU
# define INDEX_ENGINE_SEED 76422434LU
#endif
#undef USE_LONG_SEEDS
#define DCHANNELS_SEED 314152314LU
#define DX_DY_SEED 65633343LU
#endif
modules/softcascade/src/integral_channel_builder.cpp
View file @
061dd7e8
...
...
@@ -238,22 +238,8 @@ void ChannelFeaturePool::fill(int desired)
int
x
=
xRand
(
eng
);
int
y
=
yRand
(
eng
);
#if __cplusplus >= 201103L
// The interface changed slightly going from uniform_int to
// uniform_int_distribution. See this page to understand
// the old behavior:
// http://www.boost.org/doc/libs/1_47_0/boost/random/uniform_int.hpp
int
w
=
1
+
wRand
(
eng
,
// This extra "- 1" appears to be necessary, based on the Boost docs.
Random
::
uniform
::
param_type
(
0
,
(
model
.
width
-
x
-
1
)
-
1
));
int
h
=
1
+
hRand
(
eng
,
Random
::
uniform
::
param_type
(
0
,
(
model
.
height
-
y
-
1
)
-
1
));
#else
int
w
=
1
+
wRand
(
eng
,
model
.
width
-
x
-
1
);
int
h
=
1
+
hRand
(
eng
,
model
.
height
-
y
-
1
);
#endif
CV_Assert
(
w
>
0
);
CV_Assert
(
h
>
0
);
...
...
modules/softcascade/src/precomp.hpp
View file @
061dd7e8
...
...
@@ -53,6 +53,46 @@
#include "opencv2/core/core_c.h"
#include "opencv2/core/internal.hpp"
#include "opencv2/ml/ml.hpp"
#include "_random.hpp"
namespace
cv
{
namespace
softcascade
{
namespace
internal
{
namespace
rnd
{
typedef
cv
::
RNG_MT19937
engine
;
template
<
typename
T
>
struct
uniform_int
{
uniform_int
(
const
int
_min
,
const
int
_max
)
:
min
(
_min
),
max
(
_max
)
{}
T
operator
()
(
engine
&
eng
,
const
int
bound
)
const
{
return
(
T
)
eng
.
uniform
(
min
,
bound
);
}
T
operator
()
(
engine
&
eng
)
const
{
return
(
T
)
eng
.
uniform
(
min
,
max
);
}
private
:
int
min
;
int
max
;
};
}
struct
Random
{
typedef
rnd
::
engine
engine
;
typedef
uint64
seed_type
;
typedef
rnd
::
uniform_int
<
int
>
uniform
;
};
}}}
#define FEATURE_RECT_SEED 88543422U
#define INDEX_ENGINE_SEED 76422434U
#define DCHANNELS_SEED 314152314U
#define DX_DY_SEED 65633343U
#endif
modules/softcascade/test/test_training.cpp
View file @
061dd7e8
...
...
@@ -42,17 +42,11 @@
#if !defined(ANDROID)
#include <test_precomp.hpp>
#include <string>
#include <fstream>
#include <vector>
#include "test_precomp.hpp"
#if !defined (_WIN32) && ! defined(__MINGW32__)
# include <glob.h>
#else
# include <windows.h>
#endif
using
namespace
std
;
namespace
{
...
...
@@ -74,92 +68,10 @@ private:
svector
neg
;
};
string
itoa
(
long
i
)
{
char
s
[
65
];
sprintf
(
s
,
"%ld"
,
i
);
return
std
::
string
(
s
);
}
#if !defined (_WIN32) && ! defined(__MINGW32__)
void
glob
(
const
string
&
path
,
svector
&
ret
)
{
glob_t
glob_result
;
glob
(
path
.
c_str
(),
GLOB_TILDE
,
0
,
&
glob_result
);
ret
.
clear
();
ret
.
reserve
(
glob_result
.
gl_pathc
);
for
(
unsigned
int
i
=
0
;
i
<
glob_result
.
gl_pathc
;
++
i
)
{
ret
.
push_back
(
std
::
string
(
glob_result
.
gl_pathv
[
i
]));
}
globfree
(
&
glob_result
);
}
#else
void
glob
(
const
string
&
refRoot
,
const
string
&
refExt
,
svector
&
refvecFiles
)
{
std
::
string
strFilePath
;
// File path
std
::
string
strExtension
;
// Extension
std
::
string
strPattern
=
refRoot
+
"
\\
*.*"
;
WIN32_FIND_DATA
FileInformation
;
// File information
HANDLE
hFile
=
::
FindFirstFile
(
strPattern
.
c_str
(),
&
FileInformation
);
if
(
hFile
==
INVALID_HANDLE_VALUE
)
CV_Error
(
CV_StsBadArg
,
"Your dataset search path is incorrect"
);
do
{
if
(
FileInformation
.
cFileName
[
0
]
!=
'.'
)
{
strFilePath
.
erase
();
strFilePath
=
refRoot
+
"
\\
"
+
FileInformation
.
cFileName
;
if
(
!
(
FileInformation
.
dwFileAttributes
&
FILE_ATTRIBUTE_DIRECTORY
)
)
{
// Check extension
strExtension
=
FileInformation
.
cFileName
;
strExtension
=
strExtension
.
substr
(
strExtension
.
rfind
(
"."
)
+
1
);
if
(
strExtension
==
refExt
)
// Save filename
refvecFiles
.
push_back
(
strFilePath
);
}
}
}
while
(
::
FindNextFile
(
hFile
,
&
FileInformation
)
==
TRUE
);
// Close handle
::
FindClose
(
hFile
);
DWORD
dwError
=
::
GetLastError
();
if
(
dwError
!=
ERROR_NO_MORE_FILES
)
CV_Error
(
CV_StsBadArg
,
"Your dataset search path is incorrect"
);
}
#endif
ScaledDataset
::
ScaledDataset
(
const
string
&
path
,
const
int
oct
)
{
#if !defined (_WIN32) && ! defined(__MINGW32__)
glob
(
path
+
"/pos/octave_"
+
itoa
(
oct
)
+
"/*.png"
,
pos
);
#else
glob
(
path
+
"/pos/octave_"
+
itoa
(
oct
),
"png"
,
pos
);
#endif
#if !defined (_WIN32) && ! defined(__MINGW32__)
glob
(
path
+
"/neg/octave_"
+
itoa
(
oct
)
+
"/*.png"
,
neg
);
#else
glob
(
path
+
"/neg/octave_"
+
itoa
(
oct
),
"png"
,
neg
);
#endif
cv
::
glob
(
path
+
cv
::
format
(
"/octave_%d/*.png"
,
oct
),
pos
);
cv
::
glob
(
path
+
"/*.png"
,
neg
);
// Check: files not empty
CV_Assert
(
pos
.
size
()
!=
size_t
(
0
));
...
...
@@ -181,7 +93,7 @@ ScaledDataset::~ScaledDataset(){}
}
TEST
(
DISABLED_
SoftCascade
,
training
)
TEST
(
SoftCascade
,
training
)
{
// // 2. check and open output file
string
outXmlPath
=
cv
::
tempfile
(
".xml"
);
...
...
@@ -214,8 +126,8 @@ TEST(DISABLED_SoftCascade, training)
cv
::
Ptr
<
FeaturePool
>
pool
=
FeaturePool
::
create
(
model
,
nfeatures
,
10
);
nfeatures
=
pool
->
size
();
int
npositives
=
2
0
;
int
nnegatives
=
4
0
;
int
npositives
=
1
0
;
int
nnegatives
=
2
0
;
cv
::
Rect
boundingBox
=
cv
::
Rect
(
cvRound
(
20
*
octave
),
cvRound
(
20
*
octave
),
cvRound
(
64
*
octave
),
cvRound
(
128
*
octave
));
...
...
@@ -223,7 +135,7 @@ TEST(DISABLED_SoftCascade, training)
cv
::
Ptr
<
ChannelFeatureBuilder
>
builder
=
ChannelFeatureBuilder
::
create
(
"HOG6MagLuv"
);
cv
::
Ptr
<
Octave
>
boost
=
Octave
::
create
(
boundingBox
,
npositives
,
nnegatives
,
*
it
,
shrinkage
,
builder
);
std
::
string
path
=
cvtest
::
TS
::
ptr
()
->
get_data_path
()
+
"
softcascade
/sample_training_set"
;
std
::
string
path
=
cvtest
::
TS
::
ptr
()
->
get_data_path
()
+
"
cascadeandhog
/sample_training_set"
;
ScaledDataset
dataset
(
path
,
*
it
);
if
(
boost
->
train
(
&
dataset
,
pool
,
3
,
2
))
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment