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
d874d93e
Commit
d874d93e
authored
Jan 31, 2013
by
cuda-geek
Committed by
OpenCV Buildbot
Jan 31, 2013
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #372 from cuda-geek:gpu-cascade-fixes
parents
6b4304ef
cb329400
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
185 additions
and
215 deletions
+185
-215
gpu.hpp
modules/gpu/include/opencv2/gpu/gpu.hpp
+4
-4
perf_softcascade.cpp
modules/gpu/perf/perf_softcascade.cpp
+22
-66
icf-sc.cu
modules/gpu/src/cuda/icf-sc.cu
+6
-5
softcascade.cpp
modules/gpu/src/softcascade.cpp
+87
-75
test_softcascade.cpp
modules/gpu/test/test_softcascade.cpp
+65
-62
objdetect.hpp
modules/objdetect/include/opencv2/objdetect/objdetect.hpp
+0
-1
softcascade.cpp
modules/objdetect/src/softcascade.cpp
+1
-2
No files found.
modules/gpu/include/opencv2/gpu/gpu.hpp
View file @
d874d93e
...
...
@@ -1556,7 +1556,7 @@ protected:
ChannelsProcessor
();
};
// Implementation of soft (stageless) cascaded detector.
// Implementation of soft (stage
-
less) cascaded detector.
class
CV_EXPORTS
SCascade
:
public
Algorithm
{
public
:
...
...
@@ -1577,8 +1577,8 @@ public:
enum
{
NO_REJECT
=
1
,
DOLLAR
=
2
,
/*PASCAL = 4,*/
DEFAULT
=
NO_REJECT
,
NMS_MASK
=
0xF
};
// An empty cascade will be created.
// Param minScale is a minimum scale relative to the original size of the image on which cascade will be appl
y
ed.
// Param minScale is a maximum scale relative to the original size of the image on which cascade will be appl
y
ed.
// Param minScale is a minimum scale relative to the original size of the image on which cascade will be appl
i
ed.
// Param minScale is a maximum scale relative to the original size of the image on which cascade will be appl
i
ed.
// Param scales is a number of scales from minScale to maxScale.
// Param flags is an extra tuning flags.
SCascade
(
const
double
minScale
=
0.4
,
const
double
maxScale
=
5.
,
const
int
scales
=
55
,
...
...
@@ -1595,7 +1595,7 @@ public:
// Load cascade config.
virtual
void
read
(
const
FileNode
&
fn
);
// Return the matrix of of detect
ion
ed objects.
// Return the matrix of of detected objects.
// Param image is a frame on which detector will be applied.
// Param rois is a regions of interests mask generated by genRoi.
// Only the objects that fall into one of the regions will be returned.
...
...
modules/gpu/perf/perf_softcascade.cpp
View file @
d874d93e
#include "perf_precomp.hpp"
#define
PERF_TEST_P1
(fixture, name, params) \
#define
SC_PERF_TEST_P
(fixture, name, params) \
class fixture##_##name : public fixture {\
public:\
fixture##_##name() {}\
...
...
@@ -28,7 +28,7 @@ namespace {
bool
operator
()(
const
cv
::
gpu
::
SCascade
::
Detection
&
a
,
const
cv
::
gpu
::
SCascade
::
Detection
&
b
)
const
{
if
(
a
.
x
!=
b
.
x
)
return
a
.
x
<
b
.
x
;
if
(
a
.
x
!=
b
.
x
)
return
a
.
x
<
b
.
x
;
else
if
(
a
.
y
!=
b
.
y
)
return
a
.
y
<
b
.
y
;
else
if
(
a
.
w
!=
b
.
w
)
return
a
.
w
<
b
.
w
;
else
return
a
.
h
<
b
.
h
;
...
...
@@ -52,10 +52,11 @@ namespace {
typedef
std
::
tr1
::
tuple
<
std
::
string
,
std
::
string
>
fixture_t
;
typedef
perf
::
TestBaseWithParam
<
fixture_t
>
SCascadeTest
;
PERF_TEST_P1
(
SCascadeTest
,
detect
,
SC_PERF_TEST_P
(
SCascadeTest
,
detect
,
testing
::
Combine
(
testing
::
Values
(
std
::
string
(
"cv/cascadeandhog/sc_cvpr_2012_to_opencv.xml"
)),
testing
::
Values
(
std
::
string
(
"cv/cascadeandhog/bahnhof/image_00000000_0.png"
))))
testing
::
Values
(
std
::
string
(
"cv/cascadeandhog/cascades/inria_caltech-17.01.2013.xml"
),
std
::
string
(
"cv/cascadeandhog/cascades/sc_cvpr_2012_to_opencv_new_format.xml"
)),
testing
::
Values
(
std
::
string
(
"cv/cascadeandhog/images/image_00000000_0.png"
))))
RUN_GPU
(
SCascadeTest
,
detect
)
{
...
...
@@ -108,10 +109,11 @@ static cv::Rect getFromTable(int idx)
typedef
std
::
tr1
::
tuple
<
std
::
string
,
std
::
string
,
int
>
roi_fixture_t
;
typedef
perf
::
TestBaseWithParam
<
roi_fixture_t
>
SCascadeTestRoi
;
PERF_TEST_P1
(
SCascadeTestRoi
,
detectInRoi
,
SC_PERF_TEST_P
(
SCascadeTestRoi
,
detectInRoi
,
testing
::
Combine
(
testing
::
Values
(
std
::
string
(
"cv/cascadeandhog/sc_cvpr_2012_to_opencv.xml"
)),
testing
::
Values
(
std
::
string
(
"cv/cascadeandhog/bahnhof/image_00000000_0.png"
)),
testing
::
Values
(
std
::
string
(
"cv/cascadeandhog/cascades/inria_caltech-17.01.2013.xml"
),
std
::
string
(
"cv/cascadeandhog/cascades/sc_cvpr_2012_to_opencv_new_format.xml"
)),
testing
::
Values
(
std
::
string
(
"cv/cascadeandhog/images/image_00000000_0.png"
)),
testing
::
Range
(
0
,
5
)))
RUN_GPU
(
SCascadeTestRoi
,
detectInRoi
)
...
...
@@ -152,10 +154,11 @@ RUN_GPU(SCascadeTestRoi, detectInRoi)
NO_CPU
(
SCascadeTestRoi
,
detectInRoi
)
PERF_TEST_P1
(
SCascadeTestRoi
,
detectEachRoi
,
SC_PERF_TEST_P
(
SCascadeTestRoi
,
detectEachRoi
,
testing
::
Combine
(
testing
::
Values
(
std
::
string
(
"cv/cascadeandhog/sc_cvpr_2012_to_opencv.xml"
)),
testing
::
Values
(
std
::
string
(
"cv/cascadeandhog/bahnhof/image_00000000_0.png"
)),
testing
::
Values
(
std
::
string
(
"cv/cascadeandhog/cascades/inria_caltech-17.01.2013.xml"
),
std
::
string
(
"cv/cascadeandhog/cascades/sc_cvpr_2012_to_opencv_new_format.xml"
)),
testing
::
Values
(
std
::
string
(
"cv/cascadeandhog/images/image_00000000_0.png"
)),
testing
::
Range
(
0
,
10
)))
RUN_GPU
(
SCascadeTestRoi
,
detectEachRoi
)
...
...
@@ -191,58 +194,11 @@ RUN_GPU(SCascadeTestRoi, detectEachRoi)
NO_CPU
(
SCascadeTestRoi
,
detectEachRoi
)
PERF_TEST_P1
(
SCascadeTest
,
detectOnIntegral
,
SC_PERF_TEST_P
(
SCascadeTest
,
detectStream
,
testing
::
Combine
(
testing
::
Values
(
std
::
string
(
"cv/cascadeandhog/sc_cvpr_2012_to_opencv.xml"
)),
testing
::
Values
(
std
::
string
(
"cv/cascadeandhog/integrals.xml"
))))
static
std
::
string
itoa
(
long
i
)
{
static
char
s
[
65
];
sprintf
(
s
,
"%ld"
,
i
);
return
std
::
string
(
s
);
}
RUN_GPU
(
SCascadeTest
,
detectOnIntegral
)
{
cv
::
FileStorage
fsi
(
perf
::
TestBase
::
getDataPath
(
GET_PARAM
(
1
)),
cv
::
FileStorage
::
READ
);
ASSERT_TRUE
(
fsi
.
isOpened
());
cv
::
gpu
::
GpuMat
hogluv
(
121
*
10
,
161
,
CV_32SC1
);
for
(
int
i
=
0
;
i
<
10
;
++
i
)
{
cv
::
Mat
channel
;
fsi
[
std
::
string
(
"channel"
)
+
itoa
(
i
)]
>>
channel
;
cv
::
gpu
::
GpuMat
gchannel
(
hogluv
,
cv
::
Rect
(
0
,
121
*
i
,
161
,
121
));
gchannel
.
upload
(
channel
);
}
cv
::
gpu
::
SCascade
cascade
;
cv
::
FileStorage
fs
(
perf
::
TestBase
::
getDataPath
(
GET_PARAM
(
0
)),
cv
::
FileStorage
::
READ
);
ASSERT_TRUE
(
fs
.
isOpened
());
ASSERT_TRUE
(
cascade
.
load
(
fs
.
getFirstTopLevelNode
()));
cv
::
gpu
::
GpuMat
objectBoxes
(
1
,
10000
*
sizeof
(
cv
::
gpu
::
SCascade
::
Detection
),
CV_8UC1
),
rois
(
cv
::
Size
(
640
,
480
),
CV_8UC1
);
rois
.
setTo
(
1
);
cascade
.
detect
(
hogluv
,
rois
,
objectBoxes
);
TEST_CYCLE
()
{
cascade
.
detect
(
hogluv
,
rois
,
objectBoxes
);
}
SANITY_CHECK
(
sortDetections
(
objectBoxes
));
}
NO_CPU
(
SCascadeTest
,
detectOnIntegral
)
PERF_TEST_P1
(
SCascadeTest
,
detectStream
,
testing
::
Combine
(
testing
::
Values
(
std
::
string
(
"cv/cascadeandhog/sc_cvpr_2012_to_opencv.xml"
)),
testing
::
Values
(
std
::
string
(
"cv/cascadeandhog/bahnhof/image_00000000_0.png"
))))
testing
::
Values
(
std
::
string
(
"cv/cascadeandhog/cascades/inria_caltech-17.01.2013.xml"
),
std
::
string
(
"cv/cascadeandhog/cascades/sc_cvpr_2012_to_opencv_new_format.xml"
)),
testing
::
Values
(
std
::
string
(
"cv/cascadeandhog/images/image_00000000_0.png"
))))
RUN_GPU
(
SCascadeTest
,
detectStream
)
{
...
...
@@ -269,11 +225,10 @@ RUN_GPU(SCascadeTest, detectStream)
cascade
.
detect
(
colored
,
rois
,
objectBoxes
,
s
);
}
#ifdef HAVE_CUDA
cudaDeviceSynchronize
();
#endif
s
.
waitForCompletion
();
SANITY_CHECK
(
sortDetections
(
objectBoxes
));
}
NO_CPU
(
SCascadeTest
,
detectStream
)
#undef SC_PERF_TEST_P
\ No newline at end of file
modules/gpu/src/cuda/icf-sc.cu
View file @
d874d93e
...
...
@@ -352,7 +352,7 @@ namespace icf {
{
#if defined __CUDA_ARCH__ && __CUDA_ARCH__ >= 300
#pragma unroll
// scan on shuffl functions
// scan on shuffl
e
functions
for (int i = 1; i < Policy::WARP; i *= 2)
{
const float n = __shfl_up(impact, i, Policy::WARP);
...
...
@@ -459,7 +459,7 @@ __device void CascadeInvoker<Policy>::detect(Detection* objects, const uint ndet
const int y = blockIdx.y * blockDim.y + threadIdx.y;
const int x = blockIdx.x;
// load L
a
vel
// load L
e
vel
__shared__ Level level;
// check POI
...
...
@@ -501,11 +501,12 @@ __device void CascadeInvoker<Policy>::detect(Detection* objects, const uint ndet
float impact = leaves[(st + threadIdx.x) * 4 + lShift];
PrefixSum<Policy>::apply(impact);
confidence += impact;
#if __CUDA_ARCH__ >= 120
if(__any((confidence <= stages[(st + threadIdx.x)]))) st += 2048;
if(__any((confidence
+ impact
<= stages[(st + threadIdx.x)]))) st += 2048;
#endif
impact = __shfl(impact, 31);
confidence += impact;
}
if(!threadIdx.x && st == stEnd && ((confidence - FLT_EPSILON) >= 0))
...
...
@@ -546,7 +547,7 @@ void CascadeInvoker<Policy>::operator()(const PtrStepSzb& roi, const PtrStepSzi&
soft_cascade<Policy, false><<<grid, Policy::block(), 0, stream>>>(inv, det, max_det, ctr, 0);
cudaSafeCall( cudaGetLastError());
grid = dim3(fw, fh / Policy::STA_Y,
scales
- downscales);
grid = dim3(fw, fh / Policy::STA_Y,
min(38, scales)
- downscales);
soft_cascade<Policy, true><<<grid, Policy::block(), 0, stream>>>(inv, det, max_det, ctr, downscales);
if (!stream)
...
...
modules/gpu/src/softcascade.cpp
View file @
d874d93e
...
...
@@ -103,43 +103,40 @@ struct cv::gpu::SCascade::Fields
{
static
const
char
*
const
SC_STAGE_TYPE
=
"stageType"
;
static
const
char
*
const
SC_BOOST
=
"BOOST"
;
static
const
char
*
const
SC_FEATURE_TYPE
=
"featureType"
;
static
const
char
*
const
SC_ICF
=
"ICF"
;
static
const
char
*
const
SC_ORIG_W
=
"width"
;
static
const
char
*
const
SC_ORIG_H
=
"height"
;
static
const
char
*
const
SC_FEATURE_FORMAT
=
"featureFormat"
;
static
const
char
*
const
SC_SHRINKAGE
=
"shrinkage"
;
static
const
char
*
const
SC_OCTAVES
=
"octaves"
;
static
const
char
*
const
SC_OCT_SCALE
=
"scale"
;
static
const
char
*
const
SC_OCT_WEAKS
=
"weaks"
;
static
const
char
*
const
SC_TREES
=
"trees"
;
static
const
char
*
const
SC_WEAK_THRESHOLD
=
"treeThreshold"
;
static
const
char
*
const
SC_FEATURES
=
"features"
;
static
const
char
*
const
SC_INTERNAL
=
"internalNodes"
;
static
const
char
*
const
SC_LEAF
=
"leafValues"
;
static
const
char
*
const
SC_F_CHANNEL
=
"channel"
;
static
const
char
*
const
SC_F_RECT
=
"rect"
;
// only Ada Boost supported
std
::
string
stageTypeStr
=
(
string
)
root
[
SC_STAGE_TYPE
];
CV_Assert
(
stageTypeStr
==
SC_BOOST
);
// only HOG-like integral channel features
c
upported
// only HOG-like integral channel features
s
upported
string
featureTypeStr
=
(
string
)
root
[
SC_FEATURE_TYPE
];
CV_Assert
(
featureTypeStr
==
SC_ICF
);
static
const
char
*
const
SC_ORIG_W
=
"width"
;
static
const
char
*
const
SC_ORIG_H
=
"height"
;
int
origWidth
=
(
int
)
root
[
SC_ORIG_W
];
int
origHeight
=
(
int
)
root
[
SC_ORIG_H
];
static
const
char
*
const
SC_OCTAVES
=
"octaves"
;
static
const
char
*
const
SC_STAGES
=
"stages"
;
static
const
char
*
const
SC_FEATURES
=
"features"
;
static
const
char
*
const
SC_WEEK
=
"weakClassifiers"
;
static
const
char
*
const
SC_INTERNAL
=
"internalNodes"
;
static
const
char
*
const
SC_LEAF
=
"leafValues"
;
static
const
char
*
const
SC_OCT_SCALE
=
"scale"
;
static
const
char
*
const
SC_OCT_STAGES
=
"stageNum"
;
static
const
char
*
const
SC_OCT_SHRINKAGE
=
"shrinkingFactor"
;
static
const
char
*
const
SC_STAGE_THRESHOLD
=
"stageThreshold"
;
static
const
char
*
const
SC_F_CHANNEL
=
"channel"
;
static
const
char
*
const
SC_F_RECT
=
"rect"
;
std
::
string
fformat
=
(
string
)
root
[
SC_FEATURE_FORMAT
];
bool
useBoxes
=
(
fformat
==
"BOX"
);
ushort
shrinkage
=
cv
::
saturate_cast
<
ushort
>
((
int
)
root
[
SC_SHRINKAGE
]);
FileNode
fn
=
root
[
SC_OCTAVES
];
if
(
fn
.
empty
())
return
false
;
if
(
fn
.
empty
())
return
0
;
using
namespace
device
::
icf
;
...
...
@@ -149,82 +146,97 @@ struct cv::gpu::SCascade::Fields
std
::
vector
<
float
>
vleaves
;
FileNodeIterator
it
=
fn
.
begin
(),
it_end
=
fn
.
end
();
int
feature_offset
=
0
;
ushort
octIndex
=
0
;
ushort
shrinkage
=
1
;
for
(;
it
!=
it_end
;
++
it
)
for
(
ushort
octIndex
=
0
;
it
!=
it_end
;
++
it
,
++
octIndex
)
{
FileNode
fns
=
*
it
;
float
scale
=
(
float
)
fns
[
SC_OCT_SCALE
];
float
scale
=
powf
(
2.
f
,
saturate_cast
<
float
>
((
int
)
fns
[
SC_OCT_SCALE
]));
bool
isUPOctave
=
scale
>=
1
;
ushort
nstages
=
saturate_cast
<
ushort
>
((
int
)
fns
[
SC_OCT_STAGES
]);
ushort
nweaks
=
saturate_cast
<
ushort
>
((
int
)
fns
[
SC_OCT_WEAKS
]);
ushort2
size
;
size
.
x
=
cvRound
(
origWidth
*
scale
);
size
.
y
=
cvRound
(
origHeight
*
scale
);
shrinkage
=
saturate_cast
<
ushort
>
((
int
)
fns
[
SC_OCT_SHRINKAGE
]);
Octave
octave
(
octIndex
,
n
stage
s
,
shrinkage
,
size
,
scale
);
Octave
octave
(
octIndex
,
n
weak
s
,
shrinkage
,
size
,
scale
);
CV_Assert
(
octave
.
stages
>
0
);
voctaves
.
push_back
(
octave
);
FileNode
ffs
=
fns
[
SC_FEATURES
];
if
(
ffs
.
empty
())
return
false
;
if
(
ffs
.
empty
())
return
0
;
FileNodeIterator
ftrs
=
ffs
.
begin
();
std
::
vector
<
cv
::
Rect
>
feature_rects
;
std
::
vector
<
int
>
feature_channels
;
fns
=
fns
[
SC_STAGES
];
FileNodeIterator
ftrs
=
ffs
.
begin
(),
ftrs_end
=
ffs
.
end
();
int
feature_offset
=
0
;
for
(;
ftrs
!=
ftrs_end
;
++
ftrs
,
++
feature_offset
)
{
cv
::
FileNode
ftn
=
(
*
ftrs
)[
SC_F_RECT
];
cv
::
FileNodeIterator
r_it
=
ftn
.
begin
();
int
x
=
(
int
)
*
(
r_it
++
);
int
y
=
(
int
)
*
(
r_it
++
);
int
w
=
(
int
)
*
(
r_it
++
);
int
h
=
(
int
)
*
(
r_it
++
);
if
(
useBoxes
)
{
if
(
isUPOctave
)
{
w
-=
x
;
h
-=
y
;
}
}
else
{
if
(
!
isUPOctave
)
{
w
+=
x
;
h
+=
y
;
}
}
feature_rects
.
push_back
(
cv
::
Rect
(
x
,
y
,
w
,
h
));
feature_channels
.
push_back
((
int
)(
*
ftrs
)[
SC_F_CHANNEL
]);
}
fns
=
fns
[
SC_TREES
];
if
(
fn
.
empty
())
return
false
;
// for each stage (~ decision tree with H = 2)
FileNodeIterator
st
=
fns
.
begin
(),
st_end
=
fns
.
end
();
for
(;
st
!=
st_end
;
++
st
)
{
fns
=
*
st
;
vstages
.
push_back
((
float
)
fns
[
SC_STAGE_THRESHOLD
]);
FileNode
octfn
=
*
st
;
float
threshold
=
(
float
)
octfn
[
SC_WEAK_THRESHOLD
];
vstages
.
push_back
(
threshold
);
fns
=
fns
[
SC_WEEK
];
FileNodeIterator
ftr
=
fns
.
begin
(),
ft_end
=
fns
.
end
();
for
(;
ftr
!=
ft_end
;
++
ftr
)
FileNode
intfns
=
octfn
[
SC_INTERNAL
];
FileNodeIterator
inIt
=
intfns
.
begin
(),
inIt_end
=
int
fns
.
end
();
for
(;
inIt
!=
inIt_end
;
)
{
fns
=
(
*
ftr
)[
SC_INTERNAL
];
FileNodeIterator
inIt
=
fns
.
begin
(),
inIt_end
=
fns
.
end
();
for
(;
inIt
!=
inIt_end
;)
{
// int feature = (int)(*(inIt +=2)) + feature_offset;
inIt
+=
3
;
// extract feature, Todo:check it
unsigned
int
th
=
saturate_cast
<
unsigned
int
>
((
float
)(
*
(
inIt
++
)));
cv
::
FileNode
ftn
=
(
*
ftrs
)[
SC_F_RECT
];
cv
::
FileNodeIterator
r_it
=
ftn
.
begin
();
uchar4
rect
;
rect
.
x
=
saturate_cast
<
uchar
>
((
int
)
*
(
r_it
++
));
rect
.
y
=
saturate_cast
<
uchar
>
((
int
)
*
(
r_it
++
));
rect
.
z
=
saturate_cast
<
uchar
>
((
int
)
*
(
r_it
++
));
rect
.
w
=
saturate_cast
<
uchar
>
((
int
)
*
(
r_it
++
));
if
(
isUPOctave
)
{
rect
.
z
-=
rect
.
x
;
rect
.
w
-=
rect
.
y
;
}
unsigned
int
channel
=
saturate_cast
<
unsigned
int
>
((
int
)(
*
ftrs
)[
SC_F_CHANNEL
]);
vnodes
.
push_back
(
Node
(
rect
,
channel
,
th
));
++
ftrs
;
}
inIt
+=
2
;
int
featureIdx
=
(
int
)(
*
(
inIt
++
));
float
orig_threshold
=
(
float
)(
*
(
inIt
++
));
unsigned
int
th
=
saturate_cast
<
unsigned
int
>
((
int
)
orig_threshold
);
cv
::
Rect
&
r
=
feature_rects
[
featureIdx
];
uchar4
rect
;
rect
.
x
=
saturate_cast
<
uchar
>
(
r
.
x
);
rect
.
y
=
saturate_cast
<
uchar
>
(
r
.
y
);
rect
.
z
=
saturate_cast
<
uchar
>
(
r
.
width
);
rect
.
w
=
saturate_cast
<
uchar
>
(
r
.
height
);
unsigned
int
channel
=
saturate_cast
<
unsigned
int
>
(
feature_channels
[
featureIdx
]);
vnodes
.
push_back
(
Node
(
rect
,
channel
,
th
));
}
fns
=
(
*
ftr
)[
SC_LEAF
];
inIt
=
fns
.
begin
(),
inIt_end
=
fns
.
end
();
for
(;
inIt
!=
inIt_end
;
++
inIt
)
vleaves
.
push_back
((
float
)(
*
inIt
));
intfns
=
octfn
[
SC_LEAF
];
inIt
=
intfns
.
begin
(),
inIt_end
=
intfns
.
end
();
for
(;
inIt
!=
inIt_end
;
++
inIt
)
{
vleaves
.
push_back
((
float
)(
*
inIt
));
}
}
feature_offset
+=
octave
.
stages
*
3
;
++
octIndex
;
}
cv
::
Mat
hoctaves
(
1
,
(
int
)
(
voctaves
.
size
()
*
sizeof
(
Octave
)),
CV_8UC1
,
(
uchar
*
)
&
(
voctaves
[
0
]));
...
...
@@ -400,7 +412,7 @@ public:
// 160x120x10
GpuMat
shrunk
;
// tempor
ial mat for integral
l
// tempor
al mat for integra
l
GpuMat
integralBuffer
;
// 161x121x10
...
...
@@ -567,7 +579,7 @@ private:
cv
::
gpu
::
cartToPolar
(
dfdx
,
dfdy
,
mag
,
ang
,
true
,
s
);
// norm
o
lize magnitude to uchar interval and angles to 6 bins
// norm
a
lize magnitude to uchar interval and angles to 6 bins
GpuMat
nmag
(
fplane
,
cv
::
Rect
(
0
,
4
*
fh
,
fw
,
fh
));
GpuMat
nang
(
fplane
,
cv
::
Rect
(
0
,
5
*
fh
,
fw
,
fh
));
...
...
modules/gpu/test/test_softcascade.cpp
View file @
d874d93e
...
...
@@ -51,20 +51,25 @@ using cv::gpu::GpuMat;
#if defined SHOW_DETECTIONS
# define SHOW(res) \
cv::imshow(#res, res
ult);
\
cv::imshow(#res, res
);
\
cv::waitKey(0);
#else
# define SHOW(res)
#endif
static
std
::
string
path
(
std
::
string
relative
)
{
return
cvtest
::
TS
::
ptr
()
->
get_data_path
()
+
"../cv/cascadeandhog/"
+
relative
;
}
TEST
(
SCascadeTest
,
readCascade
)
{
std
::
string
xml
=
cvtest
::
TS
::
ptr
()
->
get_data_path
()
+
"../cv/cascadeandhog/icf-template.xml"
;
std
::
string
xml
=
path
(
"cascades/inria_caltech-17.01.2013.xml"
);
cv
::
FileStorage
fs
(
xml
,
cv
::
FileStorage
::
READ
);
cv
::
gpu
::
SCascade
cascade
;
cv
::
FileStorage
fs
(
xml
,
cv
::
FileStorage
::
READ
);
ASSERT_TRUE
(
fs
.
isOpened
());
ASSERT_TRUE
(
cascade
.
load
(
fs
.
getFirstTopLevelNode
()));
}
...
...
@@ -92,12 +97,6 @@ namespace
return
rois
[
idx
];
}
std
::
string
itoa
(
long
i
)
{
static
char
s
[
65
];
sprintf
(
s
,
"%ld"
,
i
);
return
std
::
string
(
s
);
}
void
print
(
std
::
ostream
&
out
,
const
Detection
&
d
)
{
...
...
@@ -127,6 +126,13 @@ namespace
#endif
}
std
::
string
itoa
(
long
i
)
{
static
char
s
[
65
];
sprintf
(
s
,
"%ld"
,
i
);
return
std
::
string
(
s
);
}
#if defined SHOW_DETECTIONS
std
::
string
getImageName
(
int
level
)
{
...
...
@@ -152,17 +158,20 @@ namespace
PARAM_TEST_CASE
(
SCascadeTestRoi
,
cv
::
gpu
::
DeviceInfo
,
std
::
string
,
std
::
string
,
int
)
{
virtual
void
SetUp
()
{
cv
::
gpu
::
setDevice
(
GET_PARAM
(
0
).
deviceID
());
}
};
GPU_TEST_P
(
SCascadeTestRoi
,
Detect
)
{
cv
::
gpu
::
setDevice
(
GET_PARAM
(
0
).
deviceID
());
cv
::
Mat
coloredCpu
=
cv
::
imread
(
cvtest
::
TS
::
ptr
()
->
get_data_path
()
+
GET_PARAM
(
2
));
cv
::
Mat
coloredCpu
=
cv
::
imread
(
path
(
GET_PARAM
(
2
)));
ASSERT_FALSE
(
coloredCpu
.
empty
());
cv
::
gpu
::
SCascade
cascade
;
cv
::
FileStorage
fs
(
p
erf
::
TestBase
::
getDataP
ath
(
GET_PARAM
(
1
)),
cv
::
FileStorage
::
READ
);
cv
::
FileStorage
fs
(
path
(
GET_PARAM
(
1
)),
cv
::
FileStorage
::
READ
);
ASSERT_TRUE
(
fs
.
isOpened
());
ASSERT_TRUE
(
cascade
.
load
(
fs
.
getFirstTopLevelNode
()));
...
...
@@ -204,21 +213,41 @@ GPU_TEST_P(SCascadeTestRoi, Detect)
INSTANTIATE_TEST_CASE_P
(
GPU_SoftCascade
,
SCascadeTestRoi
,
testing
::
Combine
(
ALL_DEVICES
,
testing
::
Values
(
std
::
string
(
"cv/cascadeandhog/sc_cvpr_2012_to_opencv.xml"
)),
testing
::
Values
(
std
::
string
(
"../cv/cascadeandhog/bahnhof/image_00000000_0.png"
)),
testing
::
Values
(
std
::
string
(
"cascades/inria_caltech-17.01.2013.xml"
),
std
::
string
(
"cascades/sc_cvpr_2012_to_opencv_new_format.xml"
)),
testing
::
Values
(
std
::
string
(
"images/image_00000000_0.png"
)),
testing
::
Range
(
0
,
5
)));
struct
SCascadeTestAll
:
testing
::
TestWithParam
<
cv
::
gpu
::
DeviceInfo
>
////////////////////////////////////////
namespace
{
struct
Fixture
{
std
::
string
path
;
int
expected
;
Fixture
(){}
Fixture
(
std
::
string
p
,
int
e
)
:
path
(
p
),
expected
(
e
)
{}
};
}
PARAM_TEST_CASE
(
SCascadeTestAll
,
cv
::
gpu
::
DeviceInfo
,
Fixture
)
{
std
::
string
xml
;
int
expected
;
virtual
void
SetUp
()
{
cv
::
gpu
::
setDevice
(
GetParam
().
deviceID
());
cv
::
gpu
::
setDevice
(
GET_PARAM
(
0
).
deviceID
());
xml
=
path
(
GET_PARAM
(
1
).
path
);
expected
=
GET_PARAM
(
1
).
expected
;
}
};
GPU_TEST_P
(
SCascadeTestAll
,
detect
)
{
std
::
string
xml
=
cvtest
::
TS
::
ptr
()
->
get_data_path
()
+
"../cv/cascadeandhog/sc_cvpr_2012_to_opencv.xml"
;
cv
::
gpu
::
SCascade
cascade
;
cv
::
FileStorage
fs
(
xml
,
cv
::
FileStorage
::
READ
);
...
...
@@ -226,61 +255,36 @@ GPU_TEST_P(SCascadeTestAll, detect)
ASSERT_TRUE
(
cascade
.
load
(
fs
.
getFirstTopLevelNode
()));
cv
::
Mat
coloredCpu
=
cv
::
imread
(
cvtest
::
TS
::
ptr
()
->
get_data_path
()
+
"../cv/cascadeandhog/bahnhof/image_00000000_0.png"
);
cv
::
Mat
coloredCpu
=
cv
::
imread
(
path
(
"images/image_00000000_0.png"
));
ASSERT_FALSE
(
coloredCpu
.
empty
());
GpuMat
colored
(
coloredCpu
),
objectBoxes
,
rois
(
colored
.
size
(),
CV_8UC1
);
rois
.
setTo
(
0
);
GpuMat
sub
(
rois
,
cv
::
Rect
(
rois
.
cols
/
4
,
rois
.
rows
/
4
,
rois
.
cols
/
2
,
rois
.
rows
/
2
));
sub
.
setTo
(
cv
::
Scalar
::
all
(
1
));
rois
.
setTo
(
1
);
cascade
.
detect
(
colored
,
rois
,
objectBoxes
);
typedef
cv
::
gpu
::
SCascade
::
Detection
Detection
;
cv
::
Mat
detections
(
objectBoxes
);
int
a
=
*
(
detections
.
ptr
<
int
>
(
0
));
ASSERT_EQ
(
a
,
2448
);
}
cv
::
Mat
dt
(
objectBoxes
);
GPU_TEST_P
(
SCascadeTestAll
,
detectOnIntegral
)
{
std
::
string
xml
=
cvtest
::
TS
::
ptr
()
->
get_data_path
()
+
"../cv/cascadeandhog/sc_cvpr_2012_to_opencv.xml"
;
cv
::
gpu
::
SCascade
cascade
;
cv
::
FileStorage
fs
(
xml
,
cv
::
FileStorage
::
READ
);
ASSERT_TRUE
(
fs
.
isOpened
());
ASSERT_TRUE
(
cascade
.
load
(
fs
.
getFirstTopLevelNode
()));
Detection
*
dts
=
((
Detection
*
)
dt
.
data
)
+
1
;
int
*
count
=
dt
.
ptr
<
int
>
(
0
);
std
::
string
intPath
=
cvtest
::
TS
::
ptr
()
->
get_data_path
()
+
"../cv/cascadeandhog/integrals.xml"
;
cv
::
FileStorage
fsi
(
intPath
,
cv
::
FileStorage
::
READ
);
ASSERT_TRUE
(
fsi
.
isOpened
());
printTotal
(
std
::
cout
,
*
count
);
GpuMat
hogluv
(
121
*
10
,
161
,
CV_32SC1
);
for
(
int
i
=
0
;
i
<
10
;
++
i
)
for
(
int
i
=
0
;
i
<
*
count
;
++
i
)
{
cv
::
Mat
channel
;
fsi
[
std
::
string
(
"channel"
)
+
itoa
(
i
)]
>>
channel
;
GpuMat
gchannel
(
hogluv
,
cv
::
Rect
(
0
,
121
*
i
,
161
,
121
));
gchannel
.
upload
(
channel
);
Detection
d
=
dts
[
i
];
print
(
std
::
cout
,
d
);
cv
::
rectangle
(
coloredCpu
,
cv
::
Rect
(
d
.
x
,
d
.
y
,
d
.
w
,
d
.
h
),
cv
::
Scalar
(
255
,
0
,
0
,
255
),
1
);
}
GpuMat
objectBoxes
(
1
,
100000
,
CV_8UC1
),
rois
(
cv
::
Size
(
640
,
480
),
CV_8UC1
);
rois
.
setTo
(
1
);
objectBoxes
.
setTo
(
0
);
cascade
.
detect
(
hogluv
,
rois
,
objectBoxes
);
typedef
cv
::
gpu
::
SCascade
::
Detection
Detection
;
cv
::
Mat
detections
(
objectBoxes
);
int
a
=
*
(
detections
.
ptr
<
int
>
(
0
));
ASSERT_EQ
(
a
,
1024
);
SHOW
(
coloredCpu
);
ASSERT_EQ
(
*
count
,
expected
);
}
GPU_TEST_P
(
SCascadeTestAll
,
detectStream
)
{
std
::
string
xml
=
cvtest
::
TS
::
ptr
()
->
get_data_path
()
+
"../cv/cascadeandhog/sc_cvpr_2012_to_opencv.xml"
;
cv
::
gpu
::
SCascade
cascade
;
cv
::
FileStorage
fs
(
xml
,
cv
::
FileStorage
::
READ
);
...
...
@@ -288,14 +292,11 @@ GPU_TEST_P(SCascadeTestAll, detectStream)
ASSERT_TRUE
(
cascade
.
load
(
fs
.
getFirstTopLevelNode
()));
cv
::
Mat
coloredCpu
=
cv
::
imread
(
cvtest
::
TS
::
ptr
()
->
get_data_path
()
+
"../cv/cascadeandhog/bahnhof/image_00000000_0.png"
);
cv
::
Mat
coloredCpu
=
cv
::
imread
(
path
(
"images/image_00000000_0.png"
));
ASSERT_FALSE
(
coloredCpu
.
empty
());
GpuMat
colored
(
coloredCpu
),
objectBoxes
(
1
,
100000
,
CV_8UC1
),
rois
(
colored
.
size
(),
CV_8UC1
);
rois
.
setTo
(
0
);
GpuMat
sub
(
rois
,
cv
::
Rect
(
rois
.
cols
/
4
,
rois
.
rows
/
4
,
rois
.
cols
/
2
,
rois
.
rows
/
2
));
sub
.
setTo
(
cv
::
Scalar
::
all
(
1
));
rois
.
setTo
(
cv
::
Scalar
::
all
(
1
));
cv
::
gpu
::
Stream
s
;
...
...
@@ -306,9 +307,11 @@ GPU_TEST_P(SCascadeTestAll, detectStream)
typedef
cv
::
gpu
::
SCascade
::
Detection
Detection
;
cv
::
Mat
detections
(
objectBoxes
);
int
a
=
*
(
detections
.
ptr
<
int
>
(
0
));
ASSERT_EQ
(
a
,
2448
);
ASSERT_EQ
(
a
,
expected
);
}
INSTANTIATE_TEST_CASE_P
(
GPU_SoftCascade
,
SCascadeTestAll
,
ALL_DEVICES
);
INSTANTIATE_TEST_CASE_P
(
GPU_SoftCascade
,
SCascadeTestAll
,
testing
::
Combine
(
ALL_DEVICES
,
testing
::
Values
(
Fixture
(
"cascades/inria_caltech-17.01.2013.xml"
,
7
),
Fixture
(
"cascades/sc_cvpr_2012_to_opencv_new_format.xml"
,
1291
))));
#endif
modules/objdetect/include/opencv2/objdetect/objdetect.hpp
View file @
d874d93e
...
...
@@ -488,7 +488,6 @@ protected:
Ptr
<
MaskGenerator
>
maskGenerator
;
};
// Implementation of soft (stageless) cascaded detector.
class
CV_EXPORTS_W
SCascade
:
public
Algorithm
{
...
...
modules/objdetect/src/softcascade.cpp
View file @
d874d93e
...
...
@@ -41,7 +41,6 @@
//M*/
#include "precomp.hpp"
#include <iostream>
namespace
{
...
...
@@ -365,7 +364,7 @@ struct cv::SCascade::Fields
std
::
string
fformat
=
(
string
)
root
[
FEATURE_FORMAT
];
bool
useBoxes
=
(
fformat
==
"BOX"
);
// only HOG-like integral channel features
c
upported
// only HOG-like integral channel features
s
upported
string
featureTypeStr
=
(
string
)
root
[
SC_FEATURE_TYPE
];
CV_Assert
(
featureTypeStr
==
SC_ICF
);
...
...
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