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
ResNet50_migraphx
Commits
a3e8d27f
Commit
a3e8d27f
authored
Jun 12, 2023
by
liucong
Browse files
简化代码
parent
3af6f22a
Changes
13
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
95 additions
and
205 deletions
+95
-205
CMakeLists.txt
CMakeLists.txt
+1
-2
Doc/Tutorial_Cpp.md
Doc/Tutorial_Cpp.md
+1
-1
Doc/Tutorial_Python.md
Doc/Tutorial_Python.md
+2
-2
README.md
README.md
+2
-2
Src/Classifier.cpp
Src/Classifier.cpp
+30
-30
Src/Classifier.h
Src/Classifier.h
+3
-4
Src/Utility/CommonDefinition.h
Src/Utility/CommonDefinition.h
+7
-26
Src/Utility/CommonUtility.cpp
Src/Utility/CommonUtility.cpp
+1
-97
Src/Utility/CommonUtility.h
Src/Utility/CommonUtility.h
+1
-8
Src/Utility/Filesystem.cpp
Src/Utility/Filesystem.cpp
+33
-16
Src/Utility/Filesystem.h
Src/Utility/Filesystem.h
+7
-10
Src/Utility/SimpleLog.h
Src/Utility/SimpleLog.h
+1
-1
Src/main.cpp
Src/main.cpp
+6
-6
No files found.
CMakeLists.txt
View file @
a3e8d27f
...
...
@@ -12,7 +12,6 @@ set(CMAKE_BUILD_TYPE release)
# 添加头文件路径
set
(
INCLUDE_PATH
${
CMAKE_CURRENT_SOURCE_DIR
}
/Src/
${
CMAKE_CURRENT_SOURCE_DIR
}
/Src/Utility/
${
CMAKE_CURRENT_SOURCE_DIR
}
/Src/Resnet50/
$ENV{DTKROOT}/include/
${
CMAKE_CURRENT_SOURCE_DIR
}
/depend/include/
)
include_directories
(
${
INCLUDE_PATH
}
)
...
...
@@ -37,7 +36,7 @@ link_libraries(${LIBRARY})
# 添加源文件
set
(
SOURCE_FILES
${
CMAKE_CURRENT_SOURCE_DIR
}
/Src/main.cpp
${
CMAKE_CURRENT_SOURCE_DIR
}
/Src/
Resnet50/resnet50
.cpp
${
CMAKE_CURRENT_SOURCE_DIR
}
/Src/
Classifier
.cpp
${
CMAKE_CURRENT_SOURCE_DIR
}
/Src/Utility/CommonUtility.cpp
${
CMAKE_CURRENT_SOURCE_DIR
}
/Src/Utility/Filesystem.cpp
)
...
...
Doc/Tutorial_Cpp
/ResNet50
.md
→
Doc/Tutorial_Cpp.md
View file @
a3e8d27f
...
...
@@ -58,7 +58,7 @@ ErrorCode Classifier::Classify(const std::vector<cv::Mat> &srcImages,std::vector
// 预处理
// 输入数据
//
创建
输入数据
std
::
unordered_map
<
std
::
string
,
migraphx
::
argument
>
inputData
;
inputData
[
inputName
]
=
migraphx
::
argument
{
inputShape
,
(
float
*
)
inputBlob
.
data
};
...
...
Doc/Tutorial_Python
/ResNet50
.md
→
Doc/Tutorial_Python.md
View file @
a3e8d27f
...
...
@@ -48,11 +48,11 @@ if __name__ == '__main__':
...
# 预处理
pathOfImage ="../Resource/Images/
mnist_9
.jpg"
pathOfImage ="../Resource/Images/
ImageNet_01
.jpg"
image = Preprocessing(pathOfImage)
# 推理
results = model.run({inputName:
migraphx.argument(
image
)
}) # 推理结果,list类型
results = model.run({inputName: image}) # 推理结果,list类型
# 获取输出节点属性
result=results[0] # 获取第一个输出节点的数据,migraphx.argument类型
...
...
README.md
View file @
a3e8d27f
...
...
@@ -8,7 +8,7 @@ ResNet50模型包含了49个卷积层、一个全连接层。
## Python版本推理
下面介绍如何运行python代码示例,具体推理代码解析,在Doc/Tutorial_Python
目录
中有详细说明。
下面介绍如何运行python代码示例,具体推理代码解析,在Doc/Tutorial_Python
.md
中有详细说明。
### 构建安装
...
...
@@ -53,7 +53,7 @@ python Classifier.py
## C++版本推理
下面介绍如何运行C++代码示例,具体推理代码解析,在Doc/Tutorial_Cpp目录中有详细说明。
下面介绍如何运行C++代码示例,具体推理代码解析,在Doc/Tutorial_Cpp
.md
目录中有详细说明。
参考Python版本推理中的构建安装,在光源中拉取推理的docker镜像。
...
...
Src/
Resnet50/resnet50
.cpp
→
Src/
Classifier
.cpp
View file @
a3e8d27f
#include <resnet50.h>
#include <Classifier.h>
#include <migraphx/onnx.hpp>
#include <migraphx/gpu/target.hpp>
#include <migraphx/quantization.hpp>
#include <opencv2/dnn.hpp>
#include <CommonUtility.h>
#include <Filesystem.h>
#include <SimpleLog.h>
...
...
@@ -22,13 +22,13 @@ Classifier::~Classifier()
ErrorCode
Classifier
::
Initialize
(
InitializationParameterOfClassifier
initializationParameterOfClassifier
)
{
// 读取配置文件
std
::
string
configFilePath
=
CONFIG_FILE
;
std
::
string
configFilePath
=
initializationParameterOfClassifier
.
configFilePath
;
if
(
Exists
(
configFilePath
)
==
false
)
{
LOG_ERROR
(
stdout
,
"no configuration file!
\n
"
);
return
CONFIG_FILE_NOT_EXIST
;
}
if
(
!
configurationFile
.
open
(
configFilePath
,
FileStorage
::
READ
))
if
(
!
configurationFile
.
open
(
configFilePath
,
cv
::
FileStorage
::
READ
))
{
LOG_ERROR
(
stdout
,
"fail to open configuration file
\n
"
);
return
FAIL_TO_OPEN_CONFIG_FILE
;
...
...
@@ -36,7 +36,7 @@ ErrorCode Classifier::Initialize(InitializationParameterOfClassifier initializat
LOG_INFO
(
stdout
,
"succeed to open configuration file
\n
"
);
// 获取配置文件参数
FileNode
netNode
=
configurationFile
[
"Classifier"
];
cv
::
FileNode
netNode
=
configurationFile
[
"Classifier"
];
std
::
string
modelPath
=
(
std
::
string
)
netNode
[
"ModelPath"
];
scale
=
(
float
)
netNode
[
"Scale"
];
meanValue
.
val
[
0
]
=
(
float
)
netNode
[
"MeanValue1"
];
...
...
@@ -50,11 +50,11 @@ ErrorCode Classifier::Initialize(InitializationParameterOfClassifier initializat
// 加载模型
if
(
Exists
(
modelPath
)
==
false
)
{
LOG_ERROR
(
logFile
,
"%s not exist!
\n
"
,
modelPath
.
c_str
());
LOG_ERROR
(
stdout
,
"%s not exist!
\n
"
,
modelPath
.
c_str
());
return
MODEL_NOT_EXIST
;
}
net
=
migraphx
::
parse_onnx
(
modelPath
);
LOG_INFO
(
logFile
,
"succeed to load model: %s
\n
"
,
GetFileName
(
modelPath
).
c_str
());
LOG_INFO
(
stdout
,
"succeed to load model: %s
\n
"
,
GetFileName
(
modelPath
).
c_str
());
// 获取模型输入属性
std
::
unordered_map
<
std
::
string
,
migraphx
::
shape
>
inputMap
=
net
.
get_parameter_shapes
();
...
...
@@ -94,32 +94,33 @@ ErrorCode Classifier::Initialize(InitializationParameterOfClassifier initializat
// INT8量化
migraphx
::
quantize_int8
(
net
,
gpuTarget
,
calibrationData
);
}
if
(
useFP16
)
else
if
(
useFP16
)
{
migraphx
::
quantize_fp16
(
net
);
}
// 编译模型
migraphx
::
compile_options
options
;
options
.
device_id
=
0
;
// 设置GPU设备,默认为0号设备
options
.
offload_copy
=
true
;
options
.
device_id
=
0
;
// 设置GPU设备,默认为0号设备
options
.
offload_copy
=
true
;
net
.
compile
(
gpuTarget
,
options
);
LOG_INFO
(
logFile
,
"succeed to compile model: %s
\n
"
,
GetFileName
(
modelPath
).
c_str
());
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
};
net
.
eval
(
inputData
);
// log
LOG_INFO
(
logFile
,
"InputSize:%dx%d
\n
"
,
inputSize
.
width
,
inputSize
.
height
);
LOG_INFO
(
logFile
,
"InputName:%s
\n
"
,
inputName
.
c_str
());
LOG_INFO
(
logFile
,
"Scale:%.6f
\n
"
,
scale
);
LOG_INFO
(
logFile
,
"Mean:%.2f,%.2f,%.2f
\n
"
,
meanValue
.
val
[
0
],
meanValue
.
val
[
1
],
meanValue
.
val
[
2
]);
LOG_INFO
(
logFile
,
"SwapRB:%d
\n
"
,(
int
)
swapRB
);
LOG_INFO
(
logFile
,
"Crop:%d
\n
"
,(
int
)
crop
);
LOG_INFO
(
logFile
,
"UseInt8:%d
\n
"
,(
int
)
useInt8
);
LOG_INFO
(
logFile
,
"UseFP16:%d
\n
"
,(
int
)
useFP16
);
LOG_INFO
(
stdout
,
"InputSize:%dx%d
\n
"
,
inputSize
.
width
,
inputSize
.
height
);
LOG_INFO
(
stdout
,
"InputName:%s
\n
"
,
inputName
.
c_str
());
LOG_INFO
(
stdout
,
"Scale:%.6f
\n
"
,
scale
);
LOG_INFO
(
stdout
,
"Mean:%.2f,%.2f,%.2f
\n
"
,
meanValue
.
val
[
0
],
meanValue
.
val
[
1
],
meanValue
.
val
[
2
]);
LOG_INFO
(
stdout
,
"SwapRB:%d
\n
"
,(
int
)
swapRB
);
LOG_INFO
(
stdout
,
"Crop:%d
\n
"
,(
int
)
crop
);
LOG_INFO
(
stdout
,
"UseInt8:%d
\n
"
,(
int
)
useInt8
);
LOG_INFO
(
stdout
,
"UseFP16:%d
\n
"
,(
int
)
useFP16
);
return
SUCCESS
;
}
...
...
@@ -128,11 +129,11 @@ ErrorCode Classifier::Classify(const std::vector<cv::Mat> &srcImages,std::vector
{
if
(
srcImages
.
size
()
==
0
||
srcImages
[
0
].
empty
()
||
srcImages
[
0
].
depth
()
!=
CV_8U
)
{
LOG_ERROR
(
logFile
,
"image error!
\n
"
);
LOG_ERROR
(
stdout
,
"image error!
\n
"
);
return
IMAGE_ERROR
;
}
// 预处理并转换为NCHW
//
数据
预处理并转换为NCHW
cv
::
Mat
inputBlob
;
cv
::
dnn
::
blobFromImages
(
srcImages
,
inputBlob
,
...
...
@@ -142,7 +143,7 @@ ErrorCode Classifier::Classify(const std::vector<cv::Mat> &srcImages,std::vector
swapRB
,
false
);
// 输入数据
//
创建
输入数据
std
::
unordered_map
<
std
::
string
,
migraphx
::
argument
>
inputData
;
inputData
[
inputName
]
=
migraphx
::
argument
{
inputShape
,
(
float
*
)
inputBlob
.
data
};
...
...
@@ -150,11 +151,11 @@ ErrorCode Classifier::Classify(const std::vector<cv::Mat> &srcImages,std::vector
std
::
vector
<
migraphx
::
argument
>
results
=
net
.
eval
(
inputData
);
// 获取输出节点的属性
migraphx
::
argument
result
=
results
[
0
];
// 获取第一个输出节点的数据
migraphx
::
shape
outputShape
=
result
.
get_shape
();
// 输出节点的shape
std
::
vector
<
std
::
size_t
>
outputSize
=
outputShape
.
lens
();
// 每一维大小,维度顺序为(N,C,H,W)
int
numberOfOutput
=
outputShape
.
elements
();
// 输出节点元素的个数
float
*
logits
=
(
float
*
)
result
.
data
();
// 输出节点数据指针
migraphx
::
argument
result
=
results
[
0
];
// 获取第一个输出节点的数据
migraphx
::
shape
outputShape
=
result
.
get_shape
();
// 输出节点的shape
std
::
vector
<
std
::
size_t
>
outputSize
=
outputShape
.
lens
();
// 每一维大小,维度顺序为(N,C,H,W)
int
numberOfOutput
=
outputShape
.
elements
();
// 输出节点元素的个数
float
*
logits
=
(
float
*
)
result
.
data
();
// 输出节点数据指针
// 获取每张图像的预测结果
int
numberOfClasses
=
numberOfOutput
/
srcImages
.
size
();
...
...
@@ -162,7 +163,6 @@ ErrorCode Classifier::Classify(const std::vector<cv::Mat> &srcImages,std::vector
{
int
startIndex
=
numberOfClasses
*
i
;
// 获取每幅图像对应的输出
std
::
vector
<
float
>
logit
;
for
(
int
j
=
0
;
j
<
numberOfClasses
;
++
j
)
{
...
...
Src/
Resnet50/resnet50
.h
→
Src/
Classifier
.h
View file @
a3e8d27f
#ifndef __CLASSIFIER_H__
#define __CLASSIFIER_H__
#include <string>
#include <migraphx/program.hpp>
#include <opencv2/opencv.hpp>
#include <CommonDefinition.h>
namespace
migraphxSamples
...
...
@@ -22,7 +21,6 @@ public:
private:
cv
::
FileStorage
configurationFile
;
FILE
*
logFile
;
migraphx
::
program
net
;
cv
::
Size
inputSize
;
...
...
@@ -34,7 +32,8 @@ private:
bool
swapRB
;
bool
crop
;
bool
useInt8
;
bool
useFP16
;
bool
useFP16
;
};
...
...
Src/Utility/CommonDefinition.h
View file @
a3e8d27f
// 常用
数据类型和宏
定义
// 常用定义
#ifndef __COMMON_DEFINITION_H__
#define __COMMON_DEFINITION_H__
#include <string>
#include <opencv2/opencv.hpp>
using
namespace
std
;
using
namespace
cv
;
namespace
migraphxSamples
{
...
...
@@ -21,20 +17,7 @@ namespace migraphxSamples
#define CONFIG_FILE "../Resource/Configuration.xml"
typedef
struct
__Time
{
string
year
;
string
month
;
string
day
;
string
hour
;
string
minute
;
string
second
;
string
millisecond
;
// ms
string
microsecond
;
// us
string
weekDay
;
}
_Time
;
typedef
enum
_ErrorCode
typedef
enum
_ErrorCode
{
SUCCESS
=
0
,
// 0
MODEL_NOT_EXIST
,
// 模型不存在
...
...
@@ -44,7 +27,7 @@ typedef enum _ErrorCode
IMAGE_ERROR
,
// 图像错误
}
ErrorCode
;
typedef
struct
_ResultOfPrediction
typedef
struct
_ResultOfPrediction
{
float
confidence
;
int
label
;
...
...
@@ -52,24 +35,22 @@ typedef struct _ResultOfPrediction
}
ResultOfPrediction
;
typedef
struct
_ResultOfDetection
typedef
struct
_ResultOfDetection
{
Rect
boundingBox
;
cv
::
Rect
boundingBox
;
float
confidence
;
int
classID
;
string
className
;
std
::
string
className
;
bool
exist
;
_ResultOfDetection
()
:
confidence
(
0.0
f
),
classID
(
0
),
exist
(
true
){}
}
ResultOfDetection
;
typedef
struct
_InitializationParameterOfClassifier
typedef
struct
_InitializationParameterOfClassifier
{
std
::
string
parentPath
;
std
::
string
configFilePath
;
cv
::
Size
inputSize
;
std
::
string
logName
;
}
InitializationParameterOfClassifier
;
}
...
...
Src/Utility/CommonUtility.cpp
View file @
a3e8d27f
#include <CommonUtility.h>
#include <assert.h>
#include <ctype.h>
#include <time.h>
#include <stdlib.h>
#include <algorithm>
#include <sstream>
#include <vector>
#ifdef _WIN32
#include <io.h>
#include <direct.h>
#include <Windows.h>
#else
#include <unistd.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/time.h>
#endif
#include <SimpleLog.h>
namespace
migraphxSamples
{
_Time
GetCurrentTime3
()
{
_Time
currentTime
;
#if (defined WIN32 || defined _WIN32)
SYSTEMTIME
systemTime
;
GetLocalTime
(
&
systemTime
);
char
temp
[
8
]
=
{
0
};
sprintf
(
temp
,
"%04d"
,
systemTime
.
wYear
);
currentTime
.
year
=
string
(
temp
);
sprintf
(
temp
,
"%02d"
,
systemTime
.
wMonth
);
currentTime
.
month
=
string
(
temp
);
sprintf
(
temp
,
"%02d"
,
systemTime
.
wDay
);
currentTime
.
day
=
string
(
temp
);
sprintf
(
temp
,
"%02d"
,
systemTime
.
wHour
);
currentTime
.
hour
=
string
(
temp
);
sprintf
(
temp
,
"%02d"
,
systemTime
.
wMinute
);
currentTime
.
minute
=
string
(
temp
);
sprintf
(
temp
,
"%02d"
,
systemTime
.
wSecond
);
currentTime
.
second
=
string
(
temp
);
sprintf
(
temp
,
"%03d"
,
systemTime
.
wMilliseconds
);
currentTime
.
millisecond
=
string
(
temp
);
sprintf
(
temp
,
"%d"
,
systemTime
.
wDayOfWeek
);
currentTime
.
weekDay
=
string
(
temp
);
#else
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"
,
tv
.
tv_usec
/
1000
);
currentTime
.
millisecond
=
string
(
temp
);
sprintf
(
temp
,
"%03d"
,
tv
.
tv_usec
%
1000
);
currentTime
.
microsecond
=
string
(
temp
);
sprintf
(
temp
,
"%d"
,
p
->
tm_wday
);
currentTime
.
weekDay
=
string
(
temp
);
#endif
return
currentTime
;
}
std
::
vector
<
std
::
string
>
SplitString
(
std
::
string
str
,
std
::
string
separator
)
{
std
::
string
::
size_type
pos
;
std
::
vector
<
std
::
string
>
result
;
str
+=
separator
;
//扩展字符串以方便操作
int
size
=
str
.
size
();
for
(
int
i
=
0
;
i
<
size
;
i
++
)
{
pos
=
str
.
find
(
separator
,
i
);
if
(
pos
<
size
)
{
std
::
string
s
=
str
.
substr
(
i
,
pos
-
i
);
result
.
push_back
(
s
);
i
=
pos
+
separator
.
size
()
-
1
;
}
}
return
result
;
}
bool
CompareConfidence
(
const
ResultOfDetection
&
L
,
const
ResultOfDetection
&
R
)
{
return
L
.
confidence
>
R
.
confidence
;
...
...
@@ -109,7 +13,7 @@ bool CompareArea(const ResultOfDetection &L,const ResultOfDetection &R)
return
L
.
boundingBox
.
area
()
>
R
.
boundingBox
.
area
();
}
void
NMS
(
vector
<
ResultOfDetection
>
&
detections
,
float
IOUThreshold
)
void
NMS
(
std
::
vector
<
ResultOfDetection
>
&
detections
,
float
IOUThreshold
)
{
// sort
std
::
sort
(
detections
.
begin
(),
detections
.
end
(),
CompareConfidence
);
...
...
Src/Utility/CommonUtility.h
View file @
a3e8d27f
...
...
@@ -3,23 +3,16 @@
#ifndef __COMMON_UTILITY_H__
#define __COMMON_UTILITY_H__
#include <mutex>
#include <string>
#include <vector>
#include <CommonDefinition.h>
using
namespace
std
;
namespace
migraphxSamples
{
// 分割字符串
std
::
vector
<
std
::
string
>
SplitString
(
std
::
string
str
,
std
::
string
separator
);
// 排序规则: 按照置信度或者按照面积排序
bool
CompareConfidence
(
const
ResultOfDetection
&
L
,
const
ResultOfDetection
&
R
);
bool
CompareArea
(
const
ResultOfDetection
&
L
,
const
ResultOfDetection
&
R
);
// 非极大抑制
void
NMS
(
std
::
vector
<
ResultOfDetection
>
&
detections
,
float
IOUThreshold
);
}
...
...
Src/Utility/Filesystem.cpp
View file @
a3e8d27f
...
...
@@ -11,12 +11,7 @@
#include <unistd.h>
#include <dirent.h>
#endif
#include <CommonUtility.h>
#include <opencv2/opencv.hpp>
#include <SimpleLog.h>
using
namespace
cv
;
// 路径分隔符(Linux:‘/’,Windows:’\\’)
#ifdef _WIN32
#define PATH_SEPARATOR '\\'
...
...
@@ -24,9 +19,31 @@ using namespace cv;
#define PATH_SEPARATOR '/'
#endif
using
namespace
std
;
namespace
migraphxSamples
{
static
std
::
vector
<
std
::
string
>
SplitString
(
std
::
string
str
,
std
::
string
separator
)
{
std
::
string
::
size_type
pos
;
std
::
vector
<
std
::
string
>
result
;
str
+=
separator
;
//扩展字符串以方便操作
int
size
=
str
.
size
();
for
(
int
i
=
0
;
i
<
size
;
i
++
)
{
pos
=
str
.
find
(
separator
,
i
);
if
(
pos
<
size
)
{
std
::
string
s
=
str
.
substr
(
i
,
pos
-
i
);
result
.
push_back
(
s
);
i
=
pos
+
separator
.
size
()
-
1
;
}
}
return
result
;
}
#if defined _WIN32 || defined WINCE
const
char
dir_separators
[]
=
"/
\\
"
;
...
...
@@ -293,7 +310,7 @@ namespace migraphxSamples
}
else
{
LOG_INFO
(
stdout
,
"could not open directory: %s"
,
directory
.
c_str
());
printf
(
"could not open directory: %s"
,
directory
.
c_str
());
}
}
...
...
@@ -390,7 +407,7 @@ namespace migraphxSamples
#endif
if
(
!
result
)
{
LOG_INFO
(
stdout
,
"can't remove directory: %s
\n
"
,
path
.
c_str
());
printf
(
"can't remove directory: %s
\n
"
,
path
.
c_str
());
}
}
else
...
...
@@ -402,7 +419,7 @@ namespace migraphxSamples
#endif
if
(
!
result
)
{
LOG_INFO
(
stdout
,
"can't remove file: %s
\n
"
,
path
.
c_str
());
printf
(
"can't remove file: %s
\n
"
,
path
.
c_str
());
}
}
}
...
...
@@ -438,7 +455,7 @@ namespace migraphxSamples
{
RemoveAll
(
path
);
++
numberOfFiles
;
LOG_INFO
(
stdout
,
"%s deleted! number of deleted files:%d
\n
"
,
path
.
c_str
(),
numberOfFiles
);
printf
(
"%s deleted! number of deleted files:%d
\n
"
,
path
.
c_str
(),
numberOfFiles
);
}
}
...
...
@@ -452,7 +469,7 @@ namespace migraphxSamples
}
else
{
LOG_INFO
(
stdout
,
"could not open directory: %s"
,
directory
.
c_str
());
printf
(
"could not open directory: %s"
,
directory
.
c_str
());
}
// ����RemoveAllɾ��Ŀ¼
...
...
@@ -592,17 +609,17 @@ namespace migraphxSamples
if
(
!
srcFile
.
is_open
())
{
LOG_ERROR
(
stdout
,
"can not open %s
\n
"
,
srcPath
.
c_str
());
printf
(
"can not open %s
\n
"
,
srcPath
.
c_str
());
return
false
;
}
if
(
!
dstFile
.
is_open
())
{
LOG_ERROR
(
stdout
,
"can not open %s
\n
"
,
dstPath
.
c_str
());
printf
(
"can not open %s
\n
"
,
dstPath
.
c_str
());
return
false
;
}
if
(
srcPath
==
dstPath
)
{
LOG_ERROR
(
stdout
,
"src can not be same with dst
\n
"
);
printf
(
"src can not be same with dst
\n
"
);
return
false
;
}
char
buffer
[
2048
];
...
...
@@ -622,7 +639,7 @@ namespace migraphxSamples
{
if
(
srcPath
==
dstPath
)
{
LOG_ERROR
(
stdout
,
"src can not be same with dst
\n
"
);
printf
(
"src can not be same with dst
\n
"
);
return
false
;
}
...
...
@@ -662,9 +679,9 @@ namespace migraphxSamples
// process
double
process
=
(
1.0
*
(
i
+
1
)
/
fileNameList
.
size
())
*
100
;
LOG_INFO
(
stdout
,
"%s done! %f%
\n
"
,
GetFileName
(
fileNameList
[
i
]).
c_str
(),
process
);
printf
(
"%s done! %f%
\n
"
,
GetFileName
(
fileNameList
[
i
]).
c_str
(),
process
);
}
LOG_INFO
(
stdout
,
"all done!(the number of files:%d)
\n
"
,
fileNameList
.
size
());
printf
(
"all done!(the number of files:%d)
\n
"
,
fileNameList
.
size
());
return
true
;
...
...
Src/Utility/Filesystem.h
View file @
a3e8d27f
...
...
@@ -3,10 +3,8 @@
#ifndef __FILE_SYSTEM_H__
#define __FILE_SYSTEM_H__
#include <vector>
#include <string>
using
namespace
std
;
#include <vector>
namespace
migraphxSamples
{
...
...
@@ -21,7 +19,7 @@ bool IsDirectory(const std::string &path);
bool
IsPathSeparator
(
char
c
);
// 路径拼接
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
);
...
...
@@ -49,14 +47,13 @@ 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/
*/
string
GetFileName
(
const
std
::
string
&
path
);
// 1.txt
string
GetFileName_NoExtension
(
const
std
::
string
&
path
);
// 1
string
GetExtension
(
const
std
::
string
&
path
);
// .txt
string
GetParentPath
(
const
std
::
string
&
path
);
// 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
);
// 拷贝文件
:CopyFile("D:/1.txt","D:/2.txt");将1.txt拷贝为2.txt
// 拷贝文件
bool
CopyFile
(
const
std
::
string
srcPath
,
const
std
::
string
dstPath
);
/** 拷贝目录
...
...
Src/Utility/SimpleLog.h
View file @
a3e8d27f
...
...
@@ -19,7 +19,7 @@ using namespace std;
/** 简易日志
*
*
轻量级日志系统,
不依赖于其他第三方库,只需要包含一个头文件就可以使用。提供了4种日志级别,包括INFO,DEBUG,WARN和ERROR。
* 不依赖于其他第三方库,只需要包含一个头文件就可以使用。提供了4种日志级别,包括INFO,DEBUG,WARN和ERROR。
*
* 示例1:
// 初始化日志,在./Log/目录下创建两个日志文件log1.log和log2.log(注意:目录./Log/需要存在,否则日志创建失败)
...
...
Src/main.cpp
View file @
a3e8d27f
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <opencv2/dnn.hpp>
#include <SimpleLog.h>
#include <
CommonDefinition
.h>
#include <
resnet50
.h>
#include <
Filesystem
.h>
#include <
Classifier
.h>
int
main
()
{
// 创建分类器
migraphxSamples
::
Classifier
classifier
;
migraphxSamples
::
InitializationParameterOfClassifier
initParamOfClassifier
;
initParamOfClassifier
.
configFilePath
=
CONFIG_FILE
;
migraphxSamples
::
ErrorCode
errorCode
=
classifier
.
Initialize
(
initParamOfClassifier
);
if
(
errorCode
!=
migraphxSamples
::
SUCCESS
)
{
...
...
@@ -32,10 +32,10 @@ int main()
// 推理
std
::
vector
<
std
::
vector
<
migraphxSamples
::
ResultOfPrediction
>>
predictions
;
double
time1
=
getTickCount
();
double
time1
=
cv
::
getTickCount
();
classifier
.
Classify
(
srcImages
,
predictions
);
double
time2
=
getTickCount
();
double
elapsedTime
=
(
time2
-
time1
)
*
1000
/
getTickFrequency
();
double
time2
=
cv
::
getTickCount
();
double
elapsedTime
=
(
time2
-
time1
)
*
1000
/
cv
::
getTickFrequency
();
LOG_INFO
(
stdout
,
"inference time:%f ms
\n
"
,
elapsedTime
);
// 获取推理结果
...
...
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