Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ModelZoo
PaddleOCR_migraphx
Commits
2475c919
Commit
2475c919
authored
Nov 15, 2023
by
liucong
Browse files
重新Cpp代码格式化
parent
466992ff
Changes
17
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
17 changed files
with
6480 additions
and
5818 deletions
+6480
-5818
Src/PaddleOCR/OcrDB.cpp
Src/PaddleOCR/OcrDB.cpp
+375
-358
Src/PaddleOCR/OcrDB.h
Src/PaddleOCR/OcrDB.h
+51
-47
Src/PaddleOCR/OcrSVTR.cpp
Src/PaddleOCR/OcrSVTR.cpp
+74
-74
Src/PaddleOCR/OcrSVTR.h
Src/PaddleOCR/OcrSVTR.h
+5
-5
Src/PaddleOCR/VLPR.cpp
Src/PaddleOCR/VLPR.cpp
+14
-19
Src/PaddleOCR/VLPR.h
Src/PaddleOCR/VLPR.h
+8
-7
Src/PaddleOCR/clipper.cpp
Src/PaddleOCR/clipper.cpp
+4386
-3870
Src/PaddleOCR/clipper.h
Src/PaddleOCR/clipper.h
+346
-308
Src/PaddleOCR/utility.cpp
Src/PaddleOCR/utility.cpp
+379
-329
Src/PaddleOCR/utility.h
Src/PaddleOCR/utility.h
+65
-58
Src/Utility/CommonDefinition.h
Src/Utility/CommonDefinition.h
+16
-17
Src/Utility/CommonUtility.cpp
Src/Utility/CommonUtility.cpp
+14
-12
Src/Utility/CommonUtility.h
Src/Utility/CommonUtility.h
+4
-4
Src/Utility/Filesystem.cpp
Src/Utility/Filesystem.cpp
+576
-570
Src/Utility/Filesystem.h
Src/Utility/Filesystem.h
+27
-19
Src/Utility/SimpleLog.h
Src/Utility/SimpleLog.h
+136
-117
Src/main.cpp
Src/main.cpp
+4
-4
No files found.
Src/PaddleOCR/OcrDB.cpp
View file @
2475c919
This diff is collapsed.
Click to expand it.
Src/PaddleOCR/OcrDB.h
View file @
2475c919
...
...
@@ -20,20 +20,20 @@ typedef struct _DBParameter
int
LimitSideLen
;
std
::
string
ScoreMode
;
}
DBParameter
;
}
DBParameter
;
class
DB
{
public:
public:
DB
();
~
DB
();
ErrorCode
Initialize
(
InitializationParameterOfDB
InitializationParameterOfDB
);
ErrorCode
Infer
(
const
cv
::
Mat
&
img
,
std
::
vector
<
cv
::
Mat
>
&
imgList
);
ErrorCode
Infer
(
const
cv
::
Mat
&
img
,
std
::
vector
<
cv
::
Mat
>&
imgList
);
private:
private:
cv
::
FileStorage
configurationFile
;
migraphx
::
program
net
;
...
...
@@ -41,65 +41,69 @@ private:
std
::
string
inputName
;
migraphx
::
shape
inputShape
;
DBParameter
dbParameter
;
};
class
DBPostProcessor
{
public:
void
GetContourArea
(
const
std
::
vector
<
std
::
vector
<
float
>>
&
box
,
float
unclip_ratio
,
float
&
distance
);
class
DBPostProcessor
{
public:
void
GetContourArea
(
const
std
::
vector
<
std
::
vector
<
float
>>&
box
,
float
unclip_ratio
,
float
&
distance
);
cv
::
RotatedRect
UnClip
(
std
::
vector
<
std
::
vector
<
float
>>
box
,
const
float
&
unclip_ratio
);
cv
::
RotatedRect
UnClip
(
std
::
vector
<
std
::
vector
<
float
>>
box
,
const
float
&
unclip_ratio
);
float
**
Mat2Vec
(
cv
::
Mat
mat
);
float
**
Mat2Vec
(
cv
::
Mat
mat
);
std
::
vector
<
std
::
vector
<
int
>>
OrderPointsClockwise
(
std
::
vector
<
std
::
vector
<
int
>>
pts
);
std
::
vector
<
std
::
vector
<
int
>>
OrderPointsClockwise
(
std
::
vector
<
std
::
vector
<
int
>>
pts
);
std
::
vector
<
std
::
vector
<
float
>>
GetMiniBoxes
(
cv
::
RotatedRect
box
,
float
&
ssid
);
std
::
vector
<
std
::
vector
<
float
>>
GetMiniBoxes
(
cv
::
RotatedRect
box
,
float
&
ssid
);
float
BoxScoreFast
(
std
::
vector
<
std
::
vector
<
float
>>
box_array
,
cv
::
Mat
pred
);
float
PolygonScoreAcc
(
std
::
vector
<
cv
::
Point
>
contour
,
cv
::
Mat
pred
);
float
BoxScoreFast
(
std
::
vector
<
std
::
vector
<
float
>>
box_array
,
cv
::
Mat
pred
);
float
PolygonScoreAcc
(
std
::
vector
<
cv
::
Point
>
contour
,
cv
::
Mat
pred
);
std
::
vector
<
std
::
vector
<
std
::
vector
<
int
>>>
BoxesFromBitmap
(
const
cv
::
Mat
pred
,
const
cv
::
Mat
bitmap
,
const
float
&
box_thresh
,
const
float
&
det_db_unclip_ratio
,
const
std
::
string
&
det_db_score_mode
);
std
::
vector
<
std
::
vector
<
std
::
vector
<
int
>>>
BoxesFromBitmap
(
const
cv
::
Mat
pred
,
const
cv
::
Mat
bitmap
,
const
float
&
box_thresh
,
const
float
&
det_db_unclip_ratio
,
const
std
::
string
&
det_db_score_mode
);
std
::
vector
<
std
::
vector
<
std
::
vector
<
int
>>>
FilterTagDetRes
(
std
::
vector
<
std
::
vector
<
std
::
vector
<
int
>>>
boxes
,
float
ratio_h
,
float
ratio_w
,
cv
::
Mat
srcimg
);
std
::
vector
<
std
::
vector
<
std
::
vector
<
int
>>>
FilterTagDetRes
(
std
::
vector
<
std
::
vector
<
std
::
vector
<
int
>>>
boxes
,
float
ratio_h
,
float
ratio_w
,
cv
::
Mat
srcimg
);
private:
static
bool
XsortInt
(
std
::
vector
<
int
>
a
,
std
::
vector
<
int
>
b
);
private:
static
bool
XsortInt
(
std
::
vector
<
int
>
a
,
std
::
vector
<
int
>
b
);
static
bool
XsortFp32
(
std
::
vector
<
float
>
a
,
std
::
vector
<
float
>
b
);
static
bool
XsortFp32
(
std
::
vector
<
float
>
a
,
std
::
vector
<
float
>
b
);
std
::
vector
<
std
::
vector
<
float
>>
Mat2Vector
(
cv
::
Mat
mat
);
std
::
vector
<
std
::
vector
<
float
>>
Mat2Vector
(
cv
::
Mat
mat
);
inline
int
_max
(
int
a
,
int
b
)
{
return
a
>=
b
?
a
:
b
;
}
inline
int
_max
(
int
a
,
int
b
)
{
return
a
>=
b
?
a
:
b
;
}
inline
int
_min
(
int
a
,
int
b
)
{
return
a
>=
b
?
b
:
a
;
}
inline
int
_min
(
int
a
,
int
b
)
{
return
a
>=
b
?
b
:
a
;
}
template
<
class
T
>
inline
T
clamp
(
T
x
,
T
min
,
T
max
)
{
if
(
x
>
max
)
return
max
;
if
(
x
<
min
)
return
min
;
return
x
;
}
template
<
class
T
>
inline
T
clamp
(
T
x
,
T
min
,
T
max
)
{
if
(
x
>
max
)
return
max
;
if
(
x
<
min
)
return
min
;
return
x
;
}
inline
float
clampf
(
float
x
,
float
min
,
float
max
)
{
if
(
x
>
max
)
return
max
;
if
(
x
<
min
)
return
min
;
return
x
;
}
inline
float
clampf
(
float
x
,
float
min
,
float
max
)
{
if
(
x
>
max
)
return
max
;
if
(
x
<
min
)
return
min
;
return
x
;
}
};
}
}
// namespace migraphxSamples
#endif
\ No newline at end of file
Src/PaddleOCR/OcrSVTR.cpp
View file @
2475c919
...
...
@@ -6,20 +6,14 @@
namespace
migraphxSamples
{
SVTR
::
SVTR
()
{
}
SVTR
::
SVTR
()
{}
SVTR
::~
SVTR
()
{
configurationFile
.
release
();
}
SVTR
::~
SVTR
()
{
configurationFile
.
release
();
}
ErrorCode
SVTR
::
Initialize
(
InitializationParameterOfSVTR
InitializationParameterOfSVTR
)
{
// 读取配置文件
std
::
string
configFilePath
=
InitializationParameterOfSVTR
.
configFilePath
;
std
::
string
configFilePath
=
InitializationParameterOfSVTR
.
configFilePath
;
if
(
!
Exists
(
configFilePath
))
{
LOG_ERROR
(
stdout
,
"no configuration file!
\n
"
);
...
...
@@ -27,58 +21,58 @@ ErrorCode SVTR::Initialize(InitializationParameterOfSVTR InitializationParameter
}
if
(
!
configurationFile
.
open
(
configFilePath
,
cv
::
FileStorage
::
READ
))
{
LOG_ERROR
(
stdout
,
"fail to open configuration file
\n
"
);
return
FAIL_TO_OPEN_CONFIG_FILE
;
LOG_ERROR
(
stdout
,
"fail to open configuration file
\n
"
);
return
FAIL_TO_OPEN_CONFIG_FILE
;
}
LOG_INFO
(
stdout
,
"succeed to open configuration file
\n
"
);
// 获取配置文件参数
cv
::
FileNode
netNode
=
configurationFile
[
"OcrSVTR"
];
cv
::
FileNode
netNode
=
configurationFile
[
"OcrSVTR"
];
std
::
string
modelPath
=
(
std
::
string
)
netNode
[
"ModelPath"
];
std
::
string
dictPath
=
(
std
::
string
)
netNode
[
"DictPath"
];
std
::
string
dictPath
=
(
std
::
string
)
netNode
[
"DictPath"
];
// 加载模型
// 加载模型
if
(
!
Exists
(
modelPath
))
{
LOG_ERROR
(
stdout
,
"%s not exist!
\n
"
,
modelPath
.
c_str
());
LOG_ERROR
(
stdout
,
"%s not exist!
\n
"
,
modelPath
.
c_str
());
return
MODEL_NOT_EXIST
;
}
migraphx
::
onnx_options
onnx_options
;
onnx_options
.
map_input_dims
[
"x"
]
=
{
1
,
3
,
48
,
320
};
// 设置最大shape
net
=
migraphx
::
parse_onnx
(
modelPath
,
onnx_options
);
LOG_INFO
(
stdout
,
"succeed to load model: %s
\n
"
,
GetFileName
(
modelPath
).
c_str
());
onnx_options
.
map_input_dims
[
"x"
]
=
{
1
,
3
,
48
,
320
};
// 设置最大shape
net
=
migraphx
::
parse_onnx
(
modelPath
,
onnx_options
);
LOG_INFO
(
stdout
,
"succeed to load model: %s
\n
"
,
GetFileName
(
modelPath
).
c_str
());
// 获取模型输入/输出节点信息
std
::
unordered_map
<
std
::
string
,
migraphx
::
shape
>
inputs
=
net
.
get_inputs
();
std
::
unordered_map
<
std
::
string
,
migraphx
::
shape
>
outputs
=
net
.
get_outputs
();
inputName
=
inputs
.
begin
()
->
first
;
inputShape
=
inputs
.
begin
()
->
second
;
int
N
=
inputShape
.
lens
()[
0
];
int
C
=
inputShape
.
lens
()[
1
];
int
H
=
inputShape
.
lens
()[
2
];
int
W
=
inputShape
.
lens
()[
3
];
inputSize
=
cv
::
Size
(
W
,
H
);
std
::
unordered_map
<
std
::
string
,
migraphx
::
shape
>
inputs
=
net
.
get_inputs
();
std
::
unordered_map
<
std
::
string
,
migraphx
::
shape
>
outputs
=
net
.
get_outputs
();
inputName
=
inputs
.
begin
()
->
first
;
inputShape
=
inputs
.
begin
()
->
second
;
int
N
=
inputShape
.
lens
()[
0
];
int
C
=
inputShape
.
lens
()[
1
];
int
H
=
inputShape
.
lens
()[
2
];
int
W
=
inputShape
.
lens
()[
3
];
inputSize
=
cv
::
Size
(
W
,
H
);
// 设置模型为GPU模式
migraphx
::
target
gpuTarget
=
migraphx
::
gpu
::
target
{};
// 编译模型
migraphx
::
compile_options
options
;
options
.
device_id
=
0
;
// 设置GPU设备,默认为0号设备
options
.
offload_copy
=
true
;
net
.
compile
(
gpuTarget
,
options
);
LOG_INFO
(
stdout
,
"succeed to compile model: %s
\n
"
,
GetFileName
(
modelPath
).
c_str
());
options
.
device_id
=
0
;
// 设置GPU设备,默认为0号设备
options
.
offload_copy
=
true
;
net
.
compile
(
gpuTarget
,
options
);
LOG_INFO
(
stdout
,
"succeed to compile model: %s
\n
"
,
GetFileName
(
modelPath
).
c_str
());
// warm up
std
::
unordered_map
<
std
::
string
,
migraphx
::
argument
>
inputData
;
inputData
[
inputName
]
=
migraphx
::
argument
{
inputShape
};
inputData
[
inputName
]
=
migraphx
::
argument
{
inputShape
};
net
.
eval
(
inputData
);
std
::
ifstream
in
(
dictPath
);
std
::
string
line
;
if
(
in
)
if
(
in
)
{
while
(
getline
(
in
,
line
))
while
(
getline
(
in
,
line
))
{
charactorDict
.
push_back
(
line
);
}
...
...
@@ -92,15 +86,16 @@ ErrorCode SVTR::Initialize(InitializationParameterOfSVTR InitializationParameter
}
// log
LOG_INFO
(
stdout
,
"InputMaxSize:%dx%d
\n
"
,
inputSize
.
width
,
inputSize
.
height
);
LOG_INFO
(
stdout
,
"InputName:%s
\n
"
,
inputName
.
c_str
());
LOG_INFO
(
stdout
,
"InputMaxSize:%dx%d
\n
"
,
inputSize
.
width
,
inputSize
.
height
);
LOG_INFO
(
stdout
,
"InputName:%s
\n
"
,
inputName
.
c_str
());
return
SUCCESS
;
}
ErrorCode
SVTR
::
Infer
(
cv
::
Mat
&
img
,
std
::
string
&
resultsChar
,
float
&
resultsdScore
,
float
&
maxWHRatio
)
ErrorCode
SVTR
::
Infer
(
cv
::
Mat
&
img
,
std
::
string
&
resultsChar
,
float
&
resultsdScore
,
float
&
maxWHRatio
)
{
if
(
img
.
empty
()
||
img
.
type
()
!=
CV_8UC3
)
if
(
img
.
empty
()
||
img
.
type
()
!=
CV_8UC3
)
{
LOG_ERROR
(
stdout
,
"image error!
\n
"
);
return
IMAGE_ERROR
;
...
...
@@ -114,8 +109,8 @@ ErrorCode SVTR::Infer(cv::Mat &img, std::string &resultsChar, float &resultsdSco
int
imgC
=
3
,
imgH
=
48
;
int
resizeW
;
int
imgW
=
int
((
48
*
maxWHRatio
));
ratio
=
float
(
srcImage
.
cols
)
/
float
(
srcImage
.
rows
);
if
(
ceil
(
imgH
*
ratio
)
>
imgW
)
ratio
=
float
(
srcImage
.
cols
)
/
float
(
srcImage
.
rows
);
if
(
ceil
(
imgH
*
ratio
)
>
imgW
)
{
resizeW
=
imgW
;
}
...
...
@@ -124,59 +119,64 @@ ErrorCode SVTR::Infer(cv::Mat &img, std::string &resultsChar, float &resultsdSco
resizeW
=
int
(
ceil
(
imgH
*
ratio
));
}
cv
::
resize
(
srcImage
,
resizeImg
,
cv
::
Size
(
resizeW
,
imgH
));
cv
::
copyMakeBorder
(
resizeImg
,
resizeImg
,
0
,
0
,
0
,
int
(
imgW
-
resizeImg
.
cols
),
cv
::
BORDER_CONSTANT
,
{
127
,
127
,
127
});
resizeImg
.
convertTo
(
resizeImg
,
CV_32FC3
,
1.0
/
255.0
);
cv
::
copyMakeBorder
(
resizeImg
,
resizeImg
,
0
,
0
,
0
,
int
(
imgW
-
resizeImg
.
cols
),
cv
::
BORDER_CONSTANT
,
{
127
,
127
,
127
});
resizeImg
.
convertTo
(
resizeImg
,
CV_32FC3
,
1.0
/
255.0
);
std
::
vector
<
cv
::
Mat
>
bgrChannels
(
3
);
cv
::
split
(
resizeImg
,
bgrChannels
);
std
::
vector
<
float
>
mean
=
{
0.485
f
,
0.456
f
,
0.406
f
};
std
::
vector
<
float
>
mean
=
{
0.485
f
,
0.456
f
,
0.406
f
};
std
::
vector
<
float
>
scale
=
{
1
/
0.229
f
,
1
/
0.224
f
,
1
/
0.225
f
};
for
(
auto
i
=
0
;
i
<
bgrChannels
.
size
();
i
++
)
for
(
auto
i
=
0
;
i
<
bgrChannels
.
size
();
i
++
)
{
bgrChannels
[
i
].
convertTo
(
bgrChannels
[
i
],
CV_32FC1
,
1.0
*
scale
[
i
],
(
0.0
-
mean
[
i
])
*
scale
[
i
]);
bgrChannels
[
i
].
convertTo
(
bgrChannels
[
i
],
CV_32FC1
,
1.0
*
scale
[
i
],
(
0.0
-
mean
[
i
])
*
scale
[
i
]);
}
cv
::
merge
(
bgrChannels
,
resizeImg
);
cv
::
Mat
inputBlob
=
cv
::
dnn
::
blobFromImage
(
resizeImg
);
std
::
vector
<
std
::
size_t
>
inputShapeOfInfer
=
{
1
,
3
,
48
,
resizeW
};
cv
::
Mat
inputBlob
=
cv
::
dnn
::
blobFromImage
(
resizeImg
);
std
::
vector
<
std
::
size_t
>
inputShapeOfInfer
=
{
1
,
3
,
48
,
resizeW
};
// 创建输入数据
std
::
unordered_map
<
std
::
string
,
migraphx
::
argument
>
inputData
;
inputData
[
inputName
]
=
migraphx
::
argument
{
migraphx
::
shape
(
inputShape
.
type
(),
inputShapeOfInfer
),
(
float
*
)
inputBlob
.
data
};
inputData
[
inputName
]
=
migraphx
::
argument
{
migraphx
::
shape
(
inputShape
.
type
(),
inputShapeOfInfer
),
(
float
*
)
inputBlob
.
data
};
// 推理
std
::
vector
<
migraphx
::
argument
>
inferenceResults
=
net
.
eval
(
inputData
);
// 获取推理结果
migraphx
::
argument
result
=
inferenceResults
[
0
];
migraphx
::
argument
result
=
inferenceResults
[
0
];
migraphx
::
shape
outputShape
=
result
.
get_shape
();
int
n2
=
outputShape
.
lens
()[
1
];
int
n3
=
outputShape
.
lens
()[
2
];
int
n
=
n2
*
n3
;
int
n2
=
outputShape
.
lens
()[
1
];
int
n3
=
outputShape
.
lens
()[
2
];
int
n
=
n2
*
n3
;
std
::
vector
<
float
>
out
(
n
);
memcpy
(
out
.
data
(),
result
.
data
(),
sizeof
(
float
)
*
outputShape
.
elements
());
memcpy
(
out
.
data
(),
result
.
data
(),
sizeof
(
float
)
*
outputShape
.
elements
());
out
.
resize
(
n
);
int
argmaxIdx
;
int
lastIndex
=
0
;
float
score
=
0.
f
;
int
count
=
0
;
int
lastIndex
=
0
;
float
score
=
0.
f
;
int
count
=
0
;
float
maxValue
=
0.0
f
;
for
(
int
j
=
0
;
j
<
n2
;
j
++
)
for
(
int
j
=
0
;
j
<
n2
;
j
++
)
{
argmaxIdx
=
int
(
std
::
distance
(
&
out
[(
j
)
*
n3
],
std
::
max_element
(
&
out
[(
j
)
*
n3
],
&
out
[(
j
+
1
)
*
n3
])));
maxValue
=
float
(
*
std
::
max_element
(
&
out
[(
j
)
*
n3
],
&
out
[(
j
+
1
)
*
n3
]));
if
(
argmaxIdx
>
0
&&
(
!
(
n
>
0
&&
argmaxIdx
==
lastIndex
)))
{
score
+=
maxValue
;
count
+=
1
;
resultsChar
+=
charactorDict
[
argmaxIdx
];
}
argmaxIdx
=
int
(
std
::
distance
(
&
out
[(
j
)
*
n3
],
std
::
max_element
(
&
out
[(
j
)
*
n3
],
&
out
[(
j
+
1
)
*
n3
])));
maxValue
=
float
(
*
std
::
max_element
(
&
out
[(
j
)
*
n3
],
&
out
[(
j
+
1
)
*
n3
]));
if
(
argmaxIdx
>
0
&&
(
!
(
n
>
0
&&
argmaxIdx
==
lastIndex
)))
{
score
+=
maxValue
;
count
+=
1
;
resultsChar
+=
charactorDict
[
argmaxIdx
];
}
lastIndex
=
argmaxIdx
;
}
resultsdScore
=
score
/
count
;
...
...
@@ -184,4 +184,4 @@ ErrorCode SVTR::Infer(cv::Mat &img, std::string &resultsChar, float &resultsdSco
return
SUCCESS
;
}
}
}
// namespace migraphxSamples
Src/PaddleOCR/OcrSVTR.h
View file @
2475c919
...
...
@@ -11,16 +11,17 @@ namespace migraphxSamples
class
SVTR
{
public:
public:
SVTR
();
~
SVTR
();
ErrorCode
Initialize
(
InitializationParameterOfSVTR
InitializationParameterOfSVTR
);
ErrorCode
Infer
(
cv
::
Mat
&
img
,
std
::
string
&
resultsChar
,
float
&
resultsdScore
,
float
&
maxWHRatio
);
ErrorCode
Infer
(
cv
::
Mat
&
img
,
std
::
string
&
resultsChar
,
float
&
resultsdScore
,
float
&
maxWHRatio
);
private:
private:
cv
::
FileStorage
configurationFile
;
migraphx
::
program
net
;
...
...
@@ -29,8 +30,7 @@ private:
migraphx
::
shape
inputShape
;
std
::
string
dictPath
;
std
::
vector
<
std
::
string
>
charactorDict
;
};
}
}
// namespace migraphxSamples
#endif
\ No newline at end of file
Src/PaddleOCR/VLPR.cpp
View file @
2475c919
...
...
@@ -3,22 +3,17 @@
namespace
migraphxSamples
{
VLPR
::
VLPR
()
{
VLPR
::
VLPR
()
{}
}
VLPR
::~
VLPR
()
{
configurationFile
.
release
();
}
VLPR
::~
VLPR
()
{
configurationFile
.
release
();
}
ErrorCode
VLPR
::
Initialize
(
InitializationParameterOfDB
initParamOfDB
,
InitializationParameterOfSVTR
initParamOfSVTR
)
ErrorCode
VLPR
::
Initialize
(
InitializationParameterOfDB
initParamOfDB
,
InitializationParameterOfSVTR
initParamOfSVTR
)
{
// 初始化DB
initParamOfDB
.
configFilePath
=
CONFIG_FILE
;
ErrorCode
errorCode
=
db
.
Initialize
(
initParamOfDB
);
if
(
errorCode
!=
SUCCESS
)
ErrorCode
errorCode
=
db
.
Initialize
(
initParamOfDB
);
if
(
errorCode
!=
SUCCESS
)
{
LOG_ERROR
(
stdout
,
"fail to initialize db!
\n
"
);
exit
(
-
1
);
...
...
@@ -27,8 +22,8 @@ ErrorCode VLPR::Initialize(InitializationParameterOfDB initParamOfDB, Initializa
// 初始化SVTR
initParamOfSVTR
.
configFilePath
=
CONFIG_FILE
;
errorCode
=
svtr
.
Initialize
(
initParamOfSVTR
);
if
(
errorCode
!=
SUCCESS
)
errorCode
=
svtr
.
Initialize
(
initParamOfSVTR
);
if
(
errorCode
!=
SUCCESS
)
{
LOG_ERROR
(
stdout
,
"fail to initialize svtr!
\n
"
);
exit
(
-
1
);
...
...
@@ -36,15 +31,16 @@ ErrorCode VLPR::Initialize(InitializationParameterOfDB initParamOfDB, Initializa
LOG_INFO
(
stdout
,
"succeed to initialize svtr
\n
"
);
}
ErrorCode
VLPR
::
Infer
(
cv
::
Mat
&
img
,
std
::
vector
<
std
::
string
>
&
recTexts
,
std
::
vector
<
float
>
&
recTextScores
)
ErrorCode
VLPR
::
Infer
(
cv
::
Mat
&
img
,
std
::
vector
<
std
::
string
>&
recTexts
,
std
::
vector
<
float
>&
recTextScores
)
{
// DB推理
db
.
Infer
(
img
,
imgLists
);
db
.
Infer
(
img
,
imgLists
);
for
(
int
i
=
0
;
i
<
imgLists
.
size
();
i
++
)
for
(
int
i
=
0
;
i
<
imgLists
.
size
();
i
++
)
{
float
maxWHRatio
=
float
(
imgLists
[
i
].
cols
)
/
float
(
imgLists
[
i
].
rows
);
// SVTR推理
svtr
.
Infer
(
imgLists
[
i
],
recText
,
recTextScore
,
maxWHRatio
);
recTexts
.
push_back
(
recText
);
...
...
@@ -52,7 +48,6 @@ ErrorCode VLPR::Infer(cv::Mat &img, std::vector<std::string> &recTexts, std::vec
}
return
SUCCESS
;
}
}
\ No newline at end of file
}
// namespace migraphxSamples
\ No newline at end of file
Src/PaddleOCR/VLPR.h
View file @
2475c919
...
...
@@ -12,24 +12,25 @@ namespace migraphxSamples
class
VLPR
{
public:
public:
VLPR
();
~
VLPR
();
ErrorCode
Initialize
(
InitializationParameterOfDB
initParamOfDB
,
InitializationParameterOfSVTR
initParamOfSVTR
);
ErrorCode
Initialize
(
InitializationParameterOfDB
initParamOfDB
,
InitializationParameterOfSVTR
initParamOfSVTR
);
ErrorCode
Infer
(
cv
::
Mat
&
img
,
std
::
vector
<
std
::
string
>
&
recTexts
,
std
::
vector
<
float
>
&
recTextScores
);
ErrorCode
Infer
(
cv
::
Mat
&
img
,
std
::
vector
<
std
::
string
>&
recTexts
,
std
::
vector
<
float
>&
recTextScores
);
private:
private:
DB
db
;
SVTR
svtr
;
cv
::
FileStorage
configurationFile
;
std
::
vector
<
cv
::
Mat
>
imgLists
;
std
::
vector
<
cv
::
Mat
>
imgLists
;
std
::
string
recText
;
float
recTextScore
;
};
}
}
// namespace migraphxSamples
#endif
\ No newline at end of file
Src/PaddleOCR/clipper.cpp
View file @
2475c919
This diff is collapsed.
Click to expand it.
Src/PaddleOCR/clipper.h
View file @
2475c919
This diff is collapsed.
Click to expand it.
Src/PaddleOCR/utility.cpp
View file @
2475c919
This diff is collapsed.
Click to expand it.
Src/PaddleOCR/utility.h
View file @
2475c919
...
...
@@ -30,84 +30,91 @@
#include "opencv2/imgcodecs.hpp"
#include "opencv2/imgproc.hpp"
namespace
migraphxSamples
{
struct
OCRPredictResult
{
std
::
vector
<
std
::
vector
<
int
>>
box
;
std
::
string
text
;
float
score
=
-
1.0
;
float
cls_score
;
int
cls_label
=
-
1
;
namespace
migraphxSamples
{
struct
OCRPredictResult
{
std
::
vector
<
std
::
vector
<
int
>>
box
;
std
::
string
text
;
float
score
=
-
1.0
;
float
cls_score
;
int
cls_label
=
-
1
;
};
struct
StructurePredictResult
{
std
::
vector
<
float
>
box
;
std
::
vector
<
std
::
vector
<
int
>>
cell_box
;
std
::
string
type
;
std
::
vector
<
OCRPredictResult
>
text_res
;
std
::
string
html
;
float
html_score
=
-
1
;
float
confidence
;
struct
StructurePredictResult
{
std
::
vector
<
float
>
box
;
std
::
vector
<
std
::
vector
<
int
>>
cell_box
;
std
::
string
type
;
std
::
vector
<
OCRPredictResult
>
text_res
;
std
::
string
html
;
float
html_score
=
-
1
;
float
confidence
;
};
class
Utility
{
public:
static
std
::
vector
<
std
::
string
>
ReadDict
(
const
std
::
string
&
path
);
class
Utility
{
public:
static
std
::
vector
<
std
::
string
>
ReadDict
(
const
std
::
string
&
path
);
static
void
VisualizeBboxes
(
const
cv
::
Mat
&
srcimg
,
const
std
::
vector
<
OCRPredictResult
>
&
ocr_result
,
const
std
::
string
&
save_path
);
static
void
VisualizeBboxes
(
const
cv
::
Mat
&
srcimg
,
const
std
::
vector
<
OCRPredictResult
>&
ocr_result
,
const
std
::
string
&
save_path
);
static
void
VisualizeBboxes
(
const
cv
::
Mat
&
srcimg
,
const
StructurePredictResult
&
structure_result
,
const
std
::
string
&
save_path
);
static
void
VisualizeBboxes
(
const
cv
::
Mat
&
srcimg
,
const
StructurePredictResult
&
structure_result
,
const
std
::
string
&
save_path
);
template
<
class
ForwardIterator
>
inline
static
size_t
argmax
(
ForwardIterator
first
,
ForwardIterator
last
)
{
return
std
::
distance
(
first
,
std
::
max_element
(
first
,
last
));
}
template
<
class
ForwardIterator
>
inline
static
size_t
argmax
(
ForwardIterator
first
,
ForwardIterator
last
)
{
return
std
::
distance
(
first
,
std
::
max_element
(
first
,
last
));
}
static
void
GetAllFiles
(
const
char
*
dir_name
,
std
::
vector
<
std
::
string
>
&
all_inputs
);
static
void
GetAllFiles
(
const
char
*
dir_name
,
std
::
vector
<
std
::
string
>&
all_inputs
);
static
cv
::
Mat
GetRotateCropImage
(
const
cv
::
Mat
&
srcimage
,
std
::
vector
<
std
::
vector
<
int
>>
box
);
static
cv
::
Mat
GetRotateCropImage
(
const
cv
::
Mat
&
srcimage
,
std
::
vector
<
std
::
vector
<
int
>>
box
);
static
std
::
vector
<
int
>
argsort
(
const
std
::
vector
<
float
>
&
array
);
static
std
::
vector
<
int
>
argsort
(
const
std
::
vector
<
float
>&
array
);
static
std
::
string
basename
(
const
std
::
string
&
filename
);
static
std
::
string
basename
(
const
std
::
string
&
filename
);
static
bool
PathExists
(
const
std
::
string
&
path
);
static
bool
PathExists
(
const
std
::
string
&
path
);
static
void
CreateDir
(
const
std
::
string
&
path
);
static
void
CreateDir
(
const
std
::
string
&
path
);
static
void
print_result
(
const
std
::
vector
<
OCRPredictResult
>
&
ocr_result
);
static
void
print_result
(
const
std
::
vector
<
OCRPredictResult
>&
ocr_result
);
static
cv
::
Mat
crop_image
(
cv
::
Mat
&
img
,
const
std
::
vector
<
int
>
&
area
);
static
cv
::
Mat
crop_image
(
cv
::
Mat
&
img
,
const
std
::
vector
<
float
>
&
area
);
static
cv
::
Mat
crop_image
(
cv
::
Mat
&
img
,
const
std
::
vector
<
int
>&
area
);
static
cv
::
Mat
crop_image
(
cv
::
Mat
&
img
,
const
std
::
vector
<
float
>&
area
);
static
void
sorted_boxes
(
std
::
vector
<
OCRPredictResult
>
&
ocr_result
);
static
void
sorted_boxes
(
std
::
vector
<
OCRPredictResult
>&
ocr_result
);
static
std
::
vector
<
int
>
xyxyxyxy2xyxy
(
std
::
vector
<
std
::
vector
<
int
>>
&
box
);
static
std
::
vector
<
int
>
xyxyxyxy2xyxy
(
std
::
vector
<
int
>
&
box
);
static
std
::
vector
<
int
>
xyxyxyxy2xyxy
(
std
::
vector
<
std
::
vector
<
int
>>&
box
);
static
std
::
vector
<
int
>
xyxyxyxy2xyxy
(
std
::
vector
<
int
>&
box
);
static
float
fast_exp
(
float
x
);
static
std
::
vector
<
float
>
activation_function_softmax
(
std
::
vector
<
float
>
&
src
);
static
float
iou
(
std
::
vector
<
int
>
&
box1
,
std
::
vector
<
int
>
&
box2
);
static
float
iou
(
std
::
vector
<
float
>
&
box1
,
std
::
vector
<
float
>
&
box2
);
static
float
fast_exp
(
float
x
);
static
std
::
vector
<
float
>
activation_function_softmax
(
std
::
vector
<
float
>&
src
);
static
float
iou
(
std
::
vector
<
int
>&
box1
,
std
::
vector
<
int
>&
box2
);
static
float
iou
(
std
::
vector
<
float
>&
box1
,
std
::
vector
<
float
>&
box2
);
private:
static
bool
comparison_box
(
const
OCRPredictResult
&
result1
,
const
OCRPredictResult
&
result2
)
{
if
(
result1
.
box
[
0
][
1
]
<
result2
.
box
[
0
][
1
])
{
return
true
;
}
else
if
(
result1
.
box
[
0
][
1
]
==
result2
.
box
[
0
][
1
])
{
return
result1
.
box
[
0
][
0
]
<
result2
.
box
[
0
][
0
];
}
else
{
return
false
;
private:
static
bool
comparison_box
(
const
OCRPredictResult
&
result1
,
const
OCRPredictResult
&
result2
)
{
if
(
result1
.
box
[
0
][
1
]
<
result2
.
box
[
0
][
1
])
{
return
true
;
}
else
if
(
result1
.
box
[
0
][
1
]
==
result2
.
box
[
0
][
1
])
{
return
result1
.
box
[
0
][
0
]
<
result2
.
box
[
0
][
0
];
}
else
{
return
false
;
}
}
}
};
}
// namespace migraphxSamples
\ No newline at end of file
Src/Utility/CommonDefinition.h
View file @
2475c919
...
...
@@ -7,33 +7,33 @@
namespace
migraphxSamples
{
// 路径分隔符(Linux:‘/’,Windows:’\\’)
#ifdef _WIN32
#define
PATH_SEPARATOR '\\'
#define PATH_SEPARATOR '\\'
#else
#define
PATH_SEPARATOR '/'
#define PATH_SEPARATOR '/'
#endif
#define CONFIG_FILE
"../Resource/Configuration.xml"
#define CONFIG_FILE "../Resource/Configuration.xml"
typedef
enum
_ErrorCode
{
SUCCESS
=
0
,
// 0
MODEL_NOT_EXIST
,
// 模型不存在
CONFIG_FILE_NOT_EXIST
,
// 配置文件不存在
FAIL_TO_LOAD_MODEL
,
// 加载模型失败
SUCCESS
=
0
,
// 0
MODEL_NOT_EXIST
,
// 模型不存在
CONFIG_FILE_NOT_EXIST
,
// 配置文件不存在
FAIL_TO_LOAD_MODEL
,
// 加载模型失败
FAIL_TO_OPEN_CONFIG_FILE
,
// 加载配置文件失败
IMAGE_ERROR
,
// 图像错误
}
ErrorCode
;
IMAGE_ERROR
,
// 图像错误
}
ErrorCode
;
typedef
struct
_ResultOfPrediction
{
float
confidence
;
int
label
;
_ResultOfPrediction
()
:
confidence
(
0.0
f
),
label
(
0
){}
_ResultOfPrediction
()
:
confidence
(
0.0
f
),
label
(
0
)
{}
}
ResultOfPrediction
;
}
ResultOfPrediction
;
typedef
struct
_ResultOfDetection
{
...
...
@@ -43,15 +43,15 @@ typedef struct _ResultOfDetection
std
::
string
className
;
bool
exist
;
_ResultOfDetection
()
:
confidence
(
0.0
f
),
classID
(
0
),
exist
(
true
){}
_ResultOfDetection
()
:
confidence
(
0.0
f
),
classID
(
0
),
exist
(
true
)
{}
}
ResultOfDetection
;
}
ResultOfDetection
;
typedef
struct
_InitializationParameterOfDetector
{
std
::
string
parentPath
;
std
::
string
configFilePath
;
}
InitializationParameterOfDetector
;
}
InitializationParameterOfDetector
;
typedef
struct
_InitializationParameterOfDetector
InitializationParameterOfClassifier
;
typedef
struct
_InitializationParameterOfDetector
InitializationParameterOfSuperresolution
;
...
...
@@ -61,7 +61,6 @@ typedef struct _InitializationParameterOfDetector InitializationParameterOfOcr;
typedef
struct
_InitializationParameterOfDetector
InitializationParameterOfDB
;
typedef
struct
_InitializationParameterOfDetector
InitializationParameterOfSVTR
;
}
}
// namespace migraphxSamples
#endif
Src/Utility/CommonUtility.cpp
View file @
2475c919
...
...
@@ -3,34 +3,37 @@
namespace
migraphxSamples
{
bool
CompareConfidence
(
const
ResultOfDetection
&
L
,
const
ResultOfDetection
&
R
)
bool
CompareConfidence
(
const
ResultOfDetection
&
L
,
const
ResultOfDetection
&
R
)
{
return
L
.
confidence
>
R
.
confidence
;
}
bool
CompareArea
(
const
ResultOfDetection
&
L
,
const
ResultOfDetection
&
R
)
bool
CompareArea
(
const
ResultOfDetection
&
L
,
const
ResultOfDetection
&
R
)
{
return
L
.
boundingBox
.
area
()
>
R
.
boundingBox
.
area
();
}
void
NMS
(
std
::
vector
<
ResultOfDetection
>
&
detections
,
float
IOUThreshold
)
void
NMS
(
std
::
vector
<
ResultOfDetection
>&
detections
,
float
IOUThreshold
)
{
// sort
std
::
sort
(
detections
.
begin
(),
detections
.
end
(),
CompareConfidence
);
for
(
int
i
=
0
;
i
<
detections
.
size
();
++
i
)
for
(
int
i
=
0
;
i
<
detections
.
size
();
++
i
)
{
if
(
detections
[
i
].
exist
)
if
(
detections
[
i
].
exist
)
{
for
(
int
j
=
i
+
1
;
j
<
detections
.
size
();
++
j
)
for
(
int
j
=
i
+
1
;
j
<
detections
.
size
();
++
j
)
{
if
(
detections
[
j
].
exist
)
if
(
detections
[
j
].
exist
)
{
// compute IOU
float
intersectionArea
=
(
detections
[
i
].
boundingBox
&
detections
[
j
].
boundingBox
).
area
();
float
intersectionRate
=
intersectionArea
/
(
detections
[
i
].
boundingBox
.
area
()
+
detections
[
j
].
boundingBox
.
area
()
-
intersectionArea
);
float
intersectionArea
=
(
detections
[
i
].
boundingBox
&
detections
[
j
].
boundingBox
).
area
();
float
intersectionRate
=
intersectionArea
/
(
detections
[
i
].
boundingBox
.
area
()
+
detections
[
j
].
boundingBox
.
area
()
-
intersectionArea
);
if
(
intersectionRate
>
IOUThreshold
)
if
(
intersectionRate
>
IOUThreshold
)
{
detections
[
j
].
exist
=
false
;
}
...
...
@@ -38,7 +41,6 @@ void NMS(std::vector<ResultOfDetection> &detections, float IOUThreshold)
}
}
}
}
}
}
// namespace migraphxSamples
Src/Utility/CommonUtility.h
View file @
2475c919
...
...
@@ -9,12 +9,12 @@ namespace migraphxSamples
{
// 排序规则: 按照置信度或者按照面积排序
bool
CompareConfidence
(
const
ResultOfDetection
&
L
,
const
ResultOfDetection
&
R
);
bool
CompareArea
(
const
ResultOfDetection
&
L
,
const
ResultOfDetection
&
R
);
bool
CompareConfidence
(
const
ResultOfDetection
&
L
,
const
ResultOfDetection
&
R
);
bool
CompareArea
(
const
ResultOfDetection
&
L
,
const
ResultOfDetection
&
R
);
// 非极大抑制
void
NMS
(
std
::
vector
<
ResultOfDetection
>
&
detections
,
float
IOUThreshold
);
void
NMS
(
std
::
vector
<
ResultOfDetection
>&
detections
,
float
IOUThreshold
);
}
}
// namespace migraphxSamples
#endif
Src/Utility/Filesystem.cpp
View file @
2475c919
This diff is collapsed.
Click to expand it.
Src/Utility/Filesystem.h
View file @
2475c919
...
...
@@ -5,27 +5,27 @@
#include <string>
#include <vector>
namespace
migraphxSamples
{
// 路径是否存在
bool
Exists
(
const
std
::
string
&
path
);
bool
Exists
(
const
std
::
string
&
path
);
// 路径是否为目录
bool
IsDirectory
(
const
std
::
string
&
path
);
bool
IsDirectory
(
const
std
::
string
&
path
);
// 是否是路径分隔符(Linux:‘/’,Windows:’\\’)
bool
IsPathSeparator
(
char
c
);
// 路径拼接
std
::
string
JoinPath
(
const
std
::
string
&
base
,
const
std
::
string
&
path
);
std
::
string
JoinPath
(
const
std
::
string
&
base
,
const
std
::
string
&
path
);
// 创建多级目录,注意:创建多级目录的时候,目标目录是不能有文件存在的
bool
CreateDirectories
(
const
std
::
string
&
directoryPath
);
bool
CreateDirectories
(
const
std
::
string
&
directoryPath
);
/** 生成符合指定模式的文件名列表(支持递归遍历)
*
*
* pattern: 模式,比如"*.jpg","*.png","*.jpg,*.png"
* addPath:是否包含父路径
* 注意:
...
...
@@ -36,35 +36,43 @@ bool CreateDirectories(const std::string &directoryPath);
5. 不能返回子目录名
*
*/
void
GetFileNameList
(
const
std
::
string
&
directory
,
const
std
::
string
&
pattern
,
std
::
vector
<
std
::
string
>
&
result
,
bool
recursive
,
bool
addPath
);
void
GetFileNameList
(
const
std
::
string
&
directory
,
const
std
::
string
&
pattern
,
std
::
vector
<
std
::
string
>&
result
,
bool
recursive
,
bool
addPath
);
// 与GetFileNameList的区别在于如果有子目录,在addPath为true的时候会返回子目录路径(目录名最后有"/")
void
GetFileNameList2
(
const
std
::
string
&
directory
,
const
std
::
string
&
pattern
,
std
::
vector
<
std
::
string
>
&
result
,
bool
recursive
,
bool
addPath
);
void
GetFileNameList2
(
const
std
::
string
&
directory
,
const
std
::
string
&
pattern
,
std
::
vector
<
std
::
string
>&
result
,
bool
recursive
,
bool
addPath
);
// 删除文件或者目录,支持递归删除
void
Remove
(
const
std
::
string
&
directory
,
const
std
::
string
&
extension
=
""
);
void
Remove
(
const
std
::
string
&
directory
,
const
std
::
string
&
extension
=
""
);
/** 获取路径的文件名和扩展名
*
*
* 示例:path为D:/1/1.txt,则GetFileName()为1.txt,GetFileName_NoExtension()为1,GetExtension()为.txt,GetParentPath()为D:/1/
*/
std
::
string
GetFileName
(
const
std
::
string
&
path
);
std
::
string
GetFileName_NoExtension
(
const
std
::
string
&
path
);
std
::
string
GetExtension
(
const
std
::
string
&
path
);
std
::
string
GetParentPath
(
const
std
::
string
&
path
);
*/
std
::
string
GetFileName
(
const
std
::
string
&
path
);
std
::
string
GetFileName_NoExtension
(
const
std
::
string
&
path
);
std
::
string
GetExtension
(
const
std
::
string
&
path
);
std
::
string
GetParentPath
(
const
std
::
string
&
path
);
// 拷贝文件
bool
CopyFile
(
const
std
::
string
srcPath
,
const
std
::
string
dstPath
);
bool
CopyFile
(
const
std
::
string
srcPath
,
const
std
::
string
dstPath
);
/** 拷贝目录
*
*
* 示例:CopyDirectories("D:/0/1/2/","E:/3/");实现把D:/0/1/2/目录拷贝到E:/3/目录中(即拷贝完成后的目录结构为E:/3/2/)
* 注意:
1.第一个参数的最后不能加”/”
2.不能拷贝隐藏文件
*/
bool
CopyDirectories
(
std
::
string
srcPath
,
const
std
::
string
dstPath
);
bool
CopyDirectories
(
std
::
string
srcPath
,
const
std
::
string
dstPath
);
}
}
// namespace migraphxSamples
#endif
Src/Utility/SimpleLog.h
View file @
2475c919
...
...
@@ -8,7 +8,7 @@
#include <map>
#include <thread>
#include <mutex>
#if
(defined WIN32 || defined _WIN32)
#if(defined WIN32 || defined _WIN32)
#include <Windows.h>
#else
#include <sys/time.h>
...
...
@@ -16,13 +16,13 @@
using
namespace
std
;
/** 简易日志
*
*
* 不依赖于其他第三方库,只需要包含一个头文件就可以使用。提供了4种日志级别,包括INFO,DEBUG,WARN和ERROR。
*
*
* 示例1:
// 初始化日志,在./Log/目录下创建两个日志文件log1.log和log2.log(注意:目录./Log/需要存在,否则日志创建失败)
//
初始化日志,在./Log/目录下创建两个日志文件log1.log和log2.log(注意:目录./Log/需要存在,否则日志创建失败)
LogManager::GetInstance()->Initialize("./Log/","log1");
LogManager::GetInstance()->Initialize("./Log/","log2");
...
...
@@ -34,11 +34,11 @@ using namespace std;
// 关闭日志
LogManager::GetInstance()->Close("log1");
LogManager::GetInstance()->Close("log2");
* 示例2:
// 将日志输出到控制台
string log = "Hello World";
LOG_INFO(stdout, "%s\n", log.c_str());
LOG_INFO(stdout, "%s\n", log.c_str());
* 注意:
1. 需要C++11
...
...
@@ -50,44 +50,43 @@ using namespace std;
class
LogManager
{
private:
LogManager
(){}
private:
LogManager
()
{}
public:
~
LogManager
(){}
inline
void
Initialize
(
const
string
&
parentPath
,
const
string
&
logName
)
public:
~
LogManager
()
{}
inline
void
Initialize
(
const
string
&
parentPath
,
const
string
&
logName
)
{
// 日志名为空表示输出到控制台
if
(
logName
.
size
()
==
0
)
if
(
logName
.
size
()
==
0
)
return
;
// 查找该日志文件,如果没有则创建
std
::
map
<
string
,
FILE
*>::
const_iterator
iter
=
logMap
.
find
(
logName
);
if
(
iter
==
logMap
.
end
())
if
(
iter
==
logMap
.
end
())
{
string
pathOfLog
=
parentPath
+
logName
+
".log"
;
FILE
*
logFile
=
fopen
(
pathOfLog
.
c_str
(),
"a"
);
// w:覆盖原有文件,a:追加
if
(
logFile
!=
NULL
)
string
pathOfLog
=
parentPath
+
logName
+
".log"
;
FILE
*
logFile
=
fopen
(
pathOfLog
.
c_str
(),
"a"
);
// w:覆盖原有文件,a:追加
if
(
logFile
!=
NULL
)
{
logMap
.
insert
(
std
::
make_pair
(
logName
,
logFile
));
}
}
}
inline
FILE
*
GetLogFile
(
const
string
&
logName
)
inline
FILE
*
GetLogFile
(
const
string
&
logName
)
{
std
::
map
<
string
,
FILE
*>::
const_iterator
iter
=
logMap
.
find
(
logName
);
if
(
iter
==
logMap
.
end
())
std
::
map
<
string
,
FILE
*>::
const_iterator
iter
=
logMap
.
find
(
logName
);
if
(
iter
==
logMap
.
end
())
{
return
NULL
;
}
return
(
*
iter
).
second
;
}
inline
void
Close
(
const
string
&
logName
)
inline
void
Close
(
const
string
&
logName
)
{
std
::
map
<
string
,
FILE
*>::
const_iterator
iter
=
logMap
.
find
(
logName
);
if
(
iter
==
logMap
.
end
())
std
::
map
<
string
,
FILE
*>::
const_iterator
iter
=
logMap
.
find
(
logName
);
if
(
iter
==
logMap
.
end
())
{
return
;
}
...
...
@@ -95,10 +94,7 @@ public:
fclose
((
*
iter
).
second
);
logMap
.
erase
(
iter
);
}
inline
std
::
mutex
&
GetLogMutex
()
{
return
logMutex
;
}
inline
std
::
mutex
&
GetLogMutex
()
{
return
logMutex
;
}
// Singleton
static
LogManager
*
GetInstance
()
...
...
@@ -106,21 +102,22 @@ public:
static
LogManager
logManager
;
return
&
logManager
;
}
private:
private:
std
::
map
<
string
,
FILE
*>
logMap
;
std
::
mutex
logMutex
;
};
#ifdef LOG_MUTEX
#define LOCK
LogManager::GetInstance()->GetLogMutex().lock()
#define UNLOCK
LogManager::GetInstance()->GetLogMutex().unlock()
#define LOCK
LogManager::GetInstance()->GetLogMutex().lock()
#define UNLOCK
LogManager::GetInstance()->GetLogMutex().unlock()
#else
#define LOCK
#define UNLOCK
#define LOCK
#define UNLOCK
#endif
// log time
typedef
struct
_LogTime
typedef
struct
_LogTime
{
string
year
;
string
month
;
...
...
@@ -131,53 +128,53 @@ typedef struct _LogTime
string
millisecond
;
// ms
string
microsecond
;
// us
string
weekDay
;
}
LogTime
;
}
LogTime
;
inline
LogTime
GetTime
()
{
LogTime
currentTime
;
#if
(defined WIN32 || defined _WIN32)
#if(defined WIN32 || defined _WIN32)
SYSTEMTIME
systemTime
;
GetLocalTime
(
&
systemTime
);
char
temp
[
8
]
=
{
0
};
char
temp
[
8
]
=
{
0
};
sprintf
(
temp
,
"%04d"
,
systemTime
.
wYear
);
currentTime
.
year
=
string
(
temp
);
currentTime
.
year
=
string
(
temp
);
sprintf
(
temp
,
"%02d"
,
systemTime
.
wMonth
);
currentTime
.
month
=
string
(
temp
);
currentTime
.
month
=
string
(
temp
);
sprintf
(
temp
,
"%02d"
,
systemTime
.
wDay
);
currentTime
.
day
=
string
(
temp
);
currentTime
.
day
=
string
(
temp
);
sprintf
(
temp
,
"%02d"
,
systemTime
.
wHour
);
currentTime
.
hour
=
string
(
temp
);
currentTime
.
hour
=
string
(
temp
);
sprintf
(
temp
,
"%02d"
,
systemTime
.
wMinute
);
currentTime
.
minute
=
string
(
temp
);
currentTime
.
minute
=
string
(
temp
);
sprintf
(
temp
,
"%02d"
,
systemTime
.
wSecond
);
currentTime
.
second
=
string
(
temp
);
currentTime
.
second
=
string
(
temp
);
sprintf
(
temp
,
"%03d"
,
systemTime
.
wMilliseconds
);
currentTime
.
millisecond
=
string
(
temp
);
currentTime
.
millisecond
=
string
(
temp
);
sprintf
(
temp
,
"%d"
,
systemTime
.
wDayOfWeek
);
currentTime
.
weekDay
=
string
(
temp
);
currentTime
.
weekDay
=
string
(
temp
);
#else
struct
timeval
tv
;
struct
tm
*
p
;
struct
timeval
tv
;
struct
tm
*
p
;
gettimeofday
(
&
tv
,
NULL
);
p
=
localtime
(
&
tv
.
tv_sec
);
char
temp
[
8
]
=
{
0
};
sprintf
(
temp
,
"%04d"
,
1900
+
p
->
tm_year
);
currentTime
.
year
=
string
(
temp
);
sprintf
(
temp
,
"%02d"
,
1
+
p
->
tm_mon
);
currentTime
.
month
=
string
(
temp
);
sprintf
(
temp
,
"%02d"
,
p
->
tm_mday
);
currentTime
.
day
=
string
(
temp
);
sprintf
(
temp
,
"%02d"
,
p
->
tm_hour
);
currentTime
.
hour
=
string
(
temp
);
sprintf
(
temp
,
"%02d"
,
p
->
tm_min
);
currentTime
.
minute
=
string
(
temp
);
sprintf
(
temp
,
"%02d"
,
p
->
tm_sec
);
currentTime
.
second
=
string
(
temp
);
sprintf
(
temp
,
"%03d"
,(
int
)(
tv
.
tv_usec
/
1000
));
char
temp
[
8
]
=
{
0
};
sprintf
(
temp
,
"%04d"
,
1900
+
p
->
tm_year
);
currentTime
.
year
=
string
(
temp
);
sprintf
(
temp
,
"%02d"
,
1
+
p
->
tm_mon
);
currentTime
.
month
=
string
(
temp
);
sprintf
(
temp
,
"%02d"
,
p
->
tm_mday
);
currentTime
.
day
=
string
(
temp
);
sprintf
(
temp
,
"%02d"
,
p
->
tm_hour
);
currentTime
.
hour
=
string
(
temp
);
sprintf
(
temp
,
"%02d"
,
p
->
tm_min
);
currentTime
.
minute
=
string
(
temp
);
sprintf
(
temp
,
"%02d"
,
p
->
tm_sec
);
currentTime
.
second
=
string
(
temp
);
sprintf
(
temp
,
"%03d"
,
(
int
)(
tv
.
tv_usec
/
1000
));
currentTime
.
millisecond
=
string
(
temp
);
sprintf
(
temp
,
"%03d"
,
(
int
)(
tv
.
tv_usec
%
1000
));
currentTime
.
microsecond
=
string
(
temp
);
...
...
@@ -187,61 +184,83 @@ inline LogTime GetTime()
return
currentTime
;
}
#define LOG_TIME(logFile) \
do\
{\
LogTime currentTime=GetTime(); \
fprintf(((logFile == NULL) ? stdout : logFile), "%s-%s-%s %s:%s:%s.%s\t",currentTime.year.c_str(),currentTime.month.c_str(),currentTime.day.c_str(),currentTime.hour.c_str(),currentTime.minute.c_str(),currentTime.second.c_str(),currentTime.millisecond.c_str()); \
}while (0)
#define LOG_INFO(logFile,logInfo, ...) \
do\
{\
LOCK; \
LOG_TIME(logFile); \
fprintf(((logFile == NULL) ? stdout : logFile), "INFO\t"); \
fprintf(((logFile == NULL) ? stdout : logFile), "[%s:%d (%s) ]: ", __FILE__, __LINE__, __FUNCTION__); \
fprintf(((logFile == NULL) ? stdout : logFile), logInfo, ## __VA_ARGS__); \
fflush(logFile); \
UNLOCK; \
} while (0)
#define LOG_DEBUG(logFile,logInfo, ...) \
do\
{\
LOCK; \
LOG_TIME(logFile);\
fprintf(((logFile==NULL)?stdout:logFile), "DEBUG\t"); \
fprintf(((logFile==NULL)?stdout:logFile), "[%s:%d (%s) ]: ", __FILE__, __LINE__, __FUNCTION__); \
fprintf(((logFile==NULL)?stdout:logFile),logInfo, ## __VA_ARGS__); \
fflush(logFile); \
UNLOCK; \
} while (0)
#define LOG_ERROR(logFile,logInfo, ...) \
do\
{\
LOCK; \
LOG_TIME(logFile);\
fprintf(((logFile==NULL)?stdout:logFile), "ERROR\t"); \
fprintf(((logFile==NULL)?stdout:logFile), "[%s:%d (%s) ]: ", __FILE__, __LINE__, __FUNCTION__); \
fprintf(((logFile==NULL)?stdout:logFile),logInfo, ## __VA_ARGS__); \
fflush(logFile); \
UNLOCK; \
} while (0)
#define LOG_WARN(logFile,logInfo, ...) \
do\
{\
LOCK; \
LOG_TIME(logFile);\
fprintf(((logFile==NULL)?stdout:logFile), "WARN\t"); \
fprintf(((logFile==NULL)?stdout:logFile), "[%s:%d (%s) ]: ", __FILE__, __LINE__, __FUNCTION__); \
fprintf(((logFile==NULL)?stdout:logFile),logInfo, ## __VA_ARGS__); \
fflush(logFile); \
UNLOCK; \
} while (0)
#define LOG_TIME(logFile) \
do \
{ \
LogTime currentTime = GetTime(); \
fprintf(((logFile == NULL) ? stdout : logFile), \
"%s-%s-%s %s:%s:%s.%s\t", \
currentTime.year.c_str(), \
currentTime.month.c_str(), \
currentTime.day.c_str(), \
currentTime.hour.c_str(), \
currentTime.minute.c_str(), \
currentTime.second.c_str(), \
currentTime.millisecond.c_str()); \
} while(0)
#endif // __SIMPLE_LOG_H__
#define LOG_INFO(logFile, logInfo, ...) \
do \
{ \
LOCK; \
LOG_TIME(logFile); \
fprintf(((logFile == NULL) ? stdout : logFile), "INFO\t"); \
fprintf(((logFile == NULL) ? stdout : logFile), \
"[%s:%d (%s) ]: ", \
__FILE__, \
__LINE__, \
__FUNCTION__); \
fprintf(((logFile == NULL) ? stdout : logFile), logInfo, ##__VA_ARGS__); \
fflush(logFile); \
UNLOCK; \
} while(0)
#define LOG_DEBUG(logFile, logInfo, ...) \
do \
{ \
LOCK; \
LOG_TIME(logFile); \
fprintf(((logFile == NULL) ? stdout : logFile), "DEBUG\t"); \
fprintf(((logFile == NULL) ? stdout : logFile), \
"[%s:%d (%s) ]: ", \
__FILE__, \
__LINE__, \
__FUNCTION__); \
fprintf(((logFile == NULL) ? stdout : logFile), logInfo, ##__VA_ARGS__); \
fflush(logFile); \
UNLOCK; \
} while(0)
#define LOG_ERROR(logFile, logInfo, ...) \
do \
{ \
LOCK; \
LOG_TIME(logFile); \
fprintf(((logFile == NULL) ? stdout : logFile), "ERROR\t"); \
fprintf(((logFile == NULL) ? stdout : logFile), \
"[%s:%d (%s) ]: ", \
__FILE__, \
__LINE__, \
__FUNCTION__); \
fprintf(((logFile == NULL) ? stdout : logFile), logInfo, ##__VA_ARGS__); \
fflush(logFile); \
UNLOCK; \
} while(0)
#define LOG_WARN(logFile, logInfo, ...) \
do \
{ \
LOCK; \
LOG_TIME(logFile); \
fprintf(((logFile == NULL) ? stdout : logFile), "WARN\t"); \
fprintf(((logFile == NULL) ? stdout : logFile), \
"[%s:%d (%s) ]: ", \
__FILE__, \
__LINE__, \
__FUNCTION__); \
fprintf(((logFile == NULL) ? stdout : logFile), logInfo, ##__VA_ARGS__); \
fflush(logFile); \
UNLOCK; \
} while(0)
#endif // __SIMPLE_LOG_H__
Src/main.cpp
View file @
2475c919
...
...
@@ -10,20 +10,20 @@ int main()
{
// 创建PaddleOCR车牌识别
migraphxSamples
::
VLPR
vlpr
;
migraphxSamples
::
InitializationParameterOfDB
initParamOfDB
;
migraphxSamples
::
InitializationParameterOfDB
initParamOfDB
;
migraphxSamples
::
InitializationParameterOfSVTR
initParamOfSVTR
;
vlpr
.
Initialize
(
initParamOfDB
,
initParamOfSVTR
);
// 读取测试图片
cv
::
Mat
Image
=
cv
::
imread
(
"../Resource/Images/vlpr.jpg"
,
1
);
cv
::
Mat
Image
=
cv
::
imread
(
"../Resource/Images/vlpr.jpg"
,
1
);
// 推理
std
::
vector
<
std
::
string
>
recTexts
;
std
::
vector
<
float
>
recTextScores
;
vlpr
.
Infer
(
Image
,
recTexts
,
recTextScores
);
vlpr
.
Infer
(
Image
,
recTexts
,
recTextScores
);
// 打印结果
for
(
int
i
=
0
;
i
<
recTexts
.
size
();
i
++
)
for
(
int
i
=
0
;
i
<
recTexts
.
size
();
i
++
)
{
printf
(
"VLPR Result:%s
\n
"
,
recTexts
[
i
].
c_str
());
}
...
...
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