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
aa92be34
Commit
aa92be34
authored
Nov 12, 2012
by
marina.kolpakova
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
GK107 Policy
parent
580d8173
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
39 additions
and
38 deletions
+39
-38
isf-sc.cu
modules/gpu/src/cuda/isf-sc.cu
+0
-0
icf.hpp
modules/gpu/src/icf.hpp
+18
-8
softcascade.cpp
modules/gpu/src/softcascade.cpp
+16
-25
test_softcascade.cpp
modules/gpu/test/test_softcascade.cpp
+5
-5
No files found.
modules/gpu/src/cuda/isf-sc.cu
View file @
aa92be34
This diff is collapsed.
Click to expand it.
modules/gpu/src/icf.hpp
View file @
aa92be34
...
...
@@ -72,9 +72,9 @@ struct __align__(16) Octave
struct
__align__
(
8
)
Level
//is actually 24 bytes
{
int
octave
;
int
step
;
float
relScale
;
float
shrScale
;
// used for marking detection
float
scaling
[
2
];
// calculated according to Dollal paper
// for 640x480 we can not get overflow
...
...
@@ -115,31 +115,41 @@ struct __align__(16) Detection
:
x
(
_x
),
y
(
_y
),
w
(
_w
),
h
(
_h
),
confidence
(
c
),
kind
(
0
)
{};
};
struct
CascadePolicy
struct
GK107PolicyX4
{
enum
{
STA_X
=
32
,
STA_Y
=
8
};
enum
{
WARP
=
32
,
STA_X
=
WARP
,
STA_Y
=
8
,
SHRINKAGE
=
4
};
static
const
dim3
block
()
{
return
dim3
(
GK107PolicyX4
::
STA_X
,
GK107PolicyX4
::
STA_Y
);
}
};
template
<
typename
Policy
>
struct
CascadeInvoker
{
CascadeInvoker
()
:
levels
(
0
),
octaves
(
0
),
stages
(
0
),
nodes
(
0
),
leaves
(
0
)
{}
CascadeInvoker
()
:
levels
(
0
),
stages
(
0
),
nodes
(
0
),
leaves
(
0
),
scales
(
0
)
{}
CascadeInvoker
(
const
PtrStepSzb
&
_levels
,
const
PtrStepSzb
&
_octaves
,
const
PtrStepSzf
&
_stages
,
const
PtrStepSzb
&
_nodes
,
const
PtrStepSzf
&
_leaves
)
:
levels
((
const
Level
*
)
_levels
.
ptr
()),
octaves
((
const
Octave
*
)
_octaves
.
ptr
()),
stages
((
const
float
*
)
_stages
.
ptr
()),
nodes
((
const
Node
*
)
_nodes
.
ptr
()),
leaves
((
const
float
*
)
_leaves
.
ptr
())
:
levels
((
const
Level
*
)
_levels
.
ptr
()),
stages
((
const
float
*
)
_stages
.
ptr
()),
nodes
((
const
Node
*
)
_nodes
.
ptr
()),
leaves
((
const
float
*
)
_leaves
.
ptr
()),
scales
(
_levels
.
cols
/
sizeof
(
Level
))
{}
const
Level
*
levels
;
const
Octave
*
octaves
;
const
float
*
stages
;
const
Node
*
nodes
;
const
float
*
leaves
;
int
scales
;
void
operator
()(
const
PtrStepSzb
&
roi
,
const
PtrStepSzi
&
hogluv
,
PtrStepSz
<
uchar4
>
objects
,
PtrStepSzi
counter
,
const
int
downscales
,
const
int
csale
=
-
1
,
const
cudaStream_t
&
stream
=
0
)
const
;
template
<
bool
isUp
>
__device
void
detect
(
Detection
*
objects
,
const
uint
ndetections
,
uint
*
ctr
,
const
int
downscales
)
const
;
};
}
...
...
modules/gpu/src/softcascade.cpp
View file @
aa92be34
...
...
@@ -63,7 +63,7 @@ void cv::gpu::SCascade::read(const FileNode& fn) { Algorithm::read(fn); }
#include <icf.hpp>
cv
::
gpu
::
device
::
icf
::
Level
::
Level
(
int
idx
,
const
Octave
&
oct
,
const
float
scale
,
const
int
w
,
const
int
h
)
:
octave
(
idx
),
relScale
(
scale
/
oct
.
scale
),
shrScale
(
relScale
/
(
float
)
oct
.
shrinkag
e
)
:
octave
(
idx
),
step
(
oct
.
stages
),
relScale
(
scale
/
oct
.
scal
e
)
{
workRect
.
x
=
round
(
w
/
(
float
)
oct
.
shrinkage
);
workRect
.
y
=
round
(
h
/
(
float
)
oct
.
shrinkage
);
...
...
@@ -100,7 +100,7 @@ namespace imgproc {
struct
cv
::
gpu
::
SCascade
::
Fields
{
static
Fields
*
parseCascade
(
const
FileNode
&
root
,
const
float
mins
,
const
float
maxs
)
static
Fields
*
parseCascade
(
const
FileNode
&
root
,
const
float
mins
,
const
float
maxs
,
const
int
totals
)
{
static
const
char
*
const
SC_STAGE_TYPE
=
"stageType"
;
static
const
char
*
const
SC_BOOST
=
"BOOST"
;
...
...
@@ -119,11 +119,8 @@ struct cv::gpu::SCascade::Fields
static
const
char
*
const
SC_ORIG_W
=
"width"
;
static
const
char
*
const
SC_ORIG_H
=
"height"
;
int
origWidth
=
(
int
)
root
[
SC_ORIG_W
];
CV_Assert
(
origWidth
==
ORIG_OBJECT_WIDTH
);
int
origWidth
=
(
int
)
root
[
SC_ORIG_W
];
int
origHeight
=
(
int
)
root
[
SC_ORIG_H
];
CV_Assert
(
origHeight
==
ORIG_OBJECT_HEIGHT
);
static
const
char
*
const
SC_OCTAVES
=
"octaves"
;
static
const
char
*
const
SC_STAGES
=
"stages"
;
...
...
@@ -142,7 +139,6 @@ struct cv::gpu::SCascade::Fields
static
const
char
*
const
SC_F_CHANNEL
=
"channel"
;
static
const
char
*
const
SC_F_RECT
=
"rect"
;
FileNode
fn
=
root
[
SC_OCTAVES
];
if
(
fn
.
empty
())
return
false
;
...
...
@@ -167,8 +163,8 @@ struct cv::gpu::SCascade::Fields
ushort
nstages
=
saturate_cast
<
ushort
>
((
int
)
fns
[
SC_OCT_STAGES
]);
ushort2
size
;
size
.
x
=
cvRound
(
ORIG_OBJECT_WIDTH
*
scale
);
size
.
y
=
cvRound
(
ORIG_OBJECT_HEIGHT
*
scale
);
size
.
x
=
cvRound
(
origWidth
*
scale
);
size
.
y
=
cvRound
(
origHeight
*
scale
);
shrinkage
=
saturate_cast
<
ushort
>
((
int
)
fns
[
SC_OCT_SHRINKAGE
]);
Octave
octave
(
octIndex
,
nstages
,
shrinkage
,
size
,
scale
);
...
...
@@ -245,11 +241,11 @@ struct cv::gpu::SCascade::Fields
CV_Assert
(
!
hleaves
.
empty
());
std
::
vector
<
Level
>
vlevels
;
float
logFactor
=
(
::
log
(
maxs
)
-
::
log
(
mins
))
/
(
TOTAL_SCALES
-
1
);
float
logFactor
=
(
::
log
(
maxs
)
-
::
log
(
mins
))
/
(
totals
-
1
);
float
scale
=
mins
;
int
downscales
=
0
;
for
(
int
sc
=
0
;
sc
<
TOTAL_SCALES
;
++
sc
)
for
(
int
sc
=
0
;
sc
<
totals
;
++
sc
)
{
int
width
=
::
std
::
max
(
0.0
f
,
FRAME_WIDTH
-
(
origWidth
*
scale
));
int
height
=
::
std
::
max
(
0.0
f
,
FRAME_HEIGHT
-
(
origHeight
*
scale
));
...
...
@@ -302,7 +298,7 @@ struct cv::gpu::SCascade::Fields
leaves
.
upload
(
hleaves
);
levels
.
upload
(
hlevels
);
invoker
=
device
::
icf
::
CascadeInvoker
<
device
::
icf
::
CascadePolicy
>
(
levels
,
octaves
,
stages
,
nodes
,
leaves
);
invoker
=
device
::
icf
::
CascadeInvoker
<
device
::
icf
::
GK107PolicyX4
>
(
levels
,
octaves
,
stages
,
nodes
,
leaves
);
}
...
...
@@ -456,16 +452,13 @@ public:
GpuMat
sobelBuf
;
device
::
icf
::
CascadeInvoker
<
device
::
icf
::
CascadePolicy
>
invoker
;
device
::
icf
::
CascadeInvoker
<
device
::
icf
::
GK107PolicyX4
>
invoker
;
enum
{
BOOST
=
0
};
enum
{
FRAME_WIDTH
=
640
,
FRAME_HEIGHT
=
480
,
TOTAL_SCALES
=
55
,
ORIG_OBJECT_WIDTH
=
64
,
ORIG_OBJECT_HEIGHT
=
128
,
HOG_BINS
=
6
,
LUV_BINS
=
3
,
HOG_LUV_BINS
=
10
...
...
@@ -480,21 +473,19 @@ cv::gpu::SCascade::~SCascade() { delete fields; }
bool
cv
::
gpu
::
SCascade
::
load
(
const
FileNode
&
fn
)
{
if
(
fields
)
delete
fields
;
fields
=
Fields
::
parseCascade
(
fn
,
minScale
,
maxScale
);
fields
=
Fields
::
parseCascade
(
fn
,
minScale
,
maxScale
,
scales
);
return
fields
!=
0
;
}
void
cv
::
gpu
::
SCascade
::
detect
(
InputArray
image
,
InputArray
_rois
,
OutputArray
_objects
,
Stream
&
s
)
const
{
CV_Assert
(
fields
);
const
GpuMat
colored
=
image
.
getGpuMat
();
// only color images are supperted
CV_Assert
(
colored
.
type
()
==
CV_8UC3
||
colored
.
type
()
==
CV_32SC1
);
GpuMat
rois
=
_rois
.
getGpuMat
(),
objects
=
_objects
.
getGpuMat
();
// we guess user knows about shrincage
// CV_Assert((rois.size().width == getRoiSize().height) && (rois.type() == CV_8UC1));
Fields
&
flds
=
*
fields
;
if
(
colored
.
type
()
==
CV_8UC3
)
...
...
@@ -518,15 +509,13 @@ void cv::gpu::SCascade::detect(InputArray image, InputArray _rois, OutputArray _
void
cv
::
gpu
::
SCascade
::
detect
(
InputArray
image
,
InputArray
_rois
,
OutputArray
_objects
,
const
int
level
,
Stream
&
s
)
const
{
CV_Assert
(
fields
);
const
GpuMat
colored
=
image
.
getGpuMat
();
// only color images are supperted
CV_Assert
(
colored
.
type
()
==
CV_8UC3
||
colored
.
type
()
==
CV_32SC1
);
// we guess user knows about shrincage
// CV_Assert((rois.size().width == getRoiSize().height) && (rois.type() == CV_8UC1));
Fields
&
flds
=
*
fields
;
if
(
colored
.
type
()
==
CV_8UC3
)
{
// only this window size allowed
...
...
@@ -549,6 +538,8 @@ void cv::gpu::SCascade::detect(InputArray image, InputArray _rois, OutputArray _
void
cv
::
gpu
::
SCascade
::
genRoi
(
InputArray
_roi
,
OutputArray
_mask
,
Stream
&
stream
)
const
{
CV_Assert
(
fields
);
const
GpuMat
roi
=
_roi
.
getGpuMat
();
_mask
.
create
(
roi
.
cols
/
4
,
roi
.
rows
/
4
,
roi
.
type
()
);
GpuMat
mask
=
_mask
.
getGpuMat
();
...
...
modules/gpu/test/test_softcascade.cpp
View file @
aa92be34
...
...
@@ -172,7 +172,7 @@ GPU_TEST_P(SCascadeTestRoi, detect,
sub
.
setTo
(
1
);
cv
::
rectangle
(
result
,
r
,
cv
::
Scalar
(
0
,
0
,
255
,
255
),
1
);
}
objectBoxes
.
setTo
(
0
);
cascade
.
genRoi
(
rois
,
trois
);
cascade
.
detect
(
colored
,
trois
,
objectBoxes
);
...
...
@@ -222,7 +222,7 @@ GPU_TEST_P(SCascadeTestLevel, detect,
cv
::
gpu
::
GpuMat
trois
;
cascade
.
genRoi
(
rois
,
trois
);
objectBoxes
.
setTo
(
0
);
int
level
=
GET_PARAM
(
3
);
cascade
.
detect
(
colored
,
trois
,
objectBoxes
,
level
);
...
...
@@ -281,7 +281,7 @@ GPU_TEST_P(SCascadeTestAll, detect,
cv
::
gpu
::
GpuMat
trois
;
cascade
.
genRoi
(
rois
,
trois
);
objectBoxes
.
setTo
(
0
);
cascade
.
detect
(
colored
,
trois
,
objectBoxes
);
typedef
cv
::
gpu
::
SCascade
::
Detection
Detection
;
...
...
@@ -321,7 +321,7 @@ GPU_TEST_P(SCascadeTestAll, detectOnIntegral,
cv
::
gpu
::
GpuMat
trois
;
cascade
.
genRoi
(
rois
,
trois
);
objectBoxes
.
setTo
(
0
);
cascade
.
detect
(
hogluv
,
trois
,
objectBoxes
);
typedef
cv
::
gpu
::
SCascade
::
Detection
Detection
;
...
...
@@ -357,7 +357,7 @@ GPU_TEST_P(SCascadeTestAll, detectStream,
cv
::
gpu
::
GpuMat
trois
;
cascade
.
genRoi
(
rois
,
trois
,
s
);
objectBoxes
.
setTo
(
0
);
cascade
.
detect
(
colored
,
trois
,
objectBoxes
,
s
);
cudaDeviceSynchronize
();
...
...
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