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
0ed76f01
Commit
0ed76f01
authored
Nov 15, 2023
by
liucong
Browse files
重新进行Cpp代码格式化
parent
061ca3e8
Changes
9
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
980 additions
and
919 deletions
+980
-919
Src/Classifier.cpp
Src/Classifier.cpp
+96
-95
Src/Classifier.h
Src/Classifier.h
+12
-14
Src/Utility/CommonDefinition.h
Src/Utility/CommonDefinition.h
+14
-15
Src/Utility/CommonUtility.cpp
Src/Utility/CommonUtility.cpp
+44
-36
Src/Utility/CommonUtility.h
Src/Utility/CommonUtility.h
+61
-38
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
+14
-15
No files found.
Src/Classifier.cpp
View file @
0ed76f01
...
@@ -12,23 +12,17 @@
...
@@ -12,23 +12,17 @@
namespace
migraphxSamples
namespace
migraphxSamples
{
{
Classifier
::
Classifier
()
Classifier
::
Classifier
()
{}
{
}
Classifier
::~
Classifier
()
Classifier
::~
Classifier
()
{
configurationFile
.
release
();
}
{
configurationFile
.
release
();
}
cv
::
Mat
Classifier
::
Preprocess
(
const
std
::
vector
<
cv
::
Mat
>
&
srcImages
)
cv
::
Mat
Classifier
::
Preprocess
(
const
std
::
vector
<
cv
::
Mat
>&
srcImages
)
{
{
// 数据预处理
// 数据预处理
std
::
vector
<
cv
::
Mat
>
image
;
std
::
vector
<
cv
::
Mat
>
image
;
for
(
int
i
=
0
;
i
<
srcImages
.
size
();
++
i
)
for
(
int
i
=
0
;
i
<
srcImages
.
size
();
++
i
)
{
{
//BGR转换为RGB
//
BGR转换为RGB
cv
::
Mat
imgRGB
;
cv
::
Mat
imgRGB
;
cv
::
cvtColor
(
srcImages
[
i
],
imgRGB
,
cv
::
COLOR_BGR2RGB
);
cv
::
cvtColor
(
srcImages
[
i
],
imgRGB
,
cv
::
COLOR_BGR2RGB
);
...
@@ -45,8 +39,8 @@ cv::Mat Classifier::Preprocess(const std::vector<cv::Mat> &srcImages)
...
@@ -45,8 +39,8 @@ cv::Mat Classifier::Preprocess(const std::vector<cv::Mat> &srcImages)
}
}
// 裁剪中心窗口为224*224
// 裁剪中心窗口为224*224
int
start_x
=
shrink
.
cols
/
2
-
224
/
2
;
int
start_x
=
shrink
.
cols
/
2
-
224
/
2
;
int
start_y
=
shrink
.
rows
/
2
-
224
/
2
;
int
start_y
=
shrink
.
rows
/
2
-
224
/
2
;
cv
::
Rect
rect
(
start_x
,
start_y
,
224
,
224
);
cv
::
Rect
rect
(
start_x
,
start_y
,
224
,
224
);
cv
::
Mat
images
=
shrink
(
rect
);
cv
::
Mat
images
=
shrink
(
rect
);
image
.
push_back
(
images
);
image
.
push_back
(
images
);
...
@@ -55,17 +49,18 @@ cv::Mat Classifier::Preprocess(const std::vector<cv::Mat> &srcImages)
...
@@ -55,17 +49,18 @@ cv::Mat Classifier::Preprocess(const std::vector<cv::Mat> &srcImages)
// normalize并转换为NCHW
// normalize并转换为NCHW
cv
::
Mat
inputBlob
;
cv
::
Mat
inputBlob
;
Image2BlobParams
image2BlobParams
;
Image2BlobParams
image2BlobParams
;
image2BlobParams
.
scalefactor
=
cv
::
Scalar
(
1
/
58.395
,
1
/
57.12
,
1
/
57.375
);
image2BlobParams
.
scalefactor
=
cv
::
Scalar
(
1
/
58.395
,
1
/
57.12
,
1
/
57.375
);
image2BlobParams
.
mean
=
cv
::
Scalar
(
123.675
,
116.28
,
103.53
);
image2BlobParams
.
mean
=
cv
::
Scalar
(
123.675
,
116.28
,
103.53
);
image2BlobParams
.
swapRB
=
false
;
image2BlobParams
.
swapRB
=
false
;
blobFromImagesWithParams
(
image
,
inputBlob
,
image2BlobParams
);
blobFromImagesWithParams
(
image
,
inputBlob
,
image2BlobParams
);
return
inputBlob
;
return
inputBlob
;
}
}
ErrorCode
Classifier
::
Initialize
(
InitializationParameterOfClassifier
initializationParameterOfClassifier
)
ErrorCode
Classifier
::
Initialize
(
InitializationParameterOfClassifier
initializationParameterOfClassifier
)
{
{
// 读取配置文件
// 读取配置文件
std
::
string
configFilePath
=
initializationParameterOfClassifier
.
configFilePath
;
std
::
string
configFilePath
=
initializationParameterOfClassifier
.
configFilePath
;
if
(
!
Exists
(
configFilePath
))
if
(
!
Exists
(
configFilePath
))
{
{
LOG_ERROR
(
stdout
,
"no configuration file!
\n
"
);
LOG_ERROR
(
stdout
,
"no configuration file!
\n
"
);
...
@@ -73,39 +68,39 @@ ErrorCode Classifier::Initialize(InitializationParameterOfClassifier initializat
...
@@ -73,39 +68,39 @@ ErrorCode Classifier::Initialize(InitializationParameterOfClassifier initializat
}
}
if
(
!
configurationFile
.
open
(
configFilePath
,
cv
::
FileStorage
::
READ
))
if
(
!
configurationFile
.
open
(
configFilePath
,
cv
::
FileStorage
::
READ
))
{
{
LOG_ERROR
(
stdout
,
"fail to open configuration file
\n
"
);
LOG_ERROR
(
stdout
,
"fail to open configuration file
\n
"
);
return
FAIL_TO_OPEN_CONFIG_FILE
;
return
FAIL_TO_OPEN_CONFIG_FILE
;
}
}
LOG_INFO
(
stdout
,
"succeed to open configuration file
\n
"
);
LOG_INFO
(
stdout
,
"succeed to open configuration file
\n
"
);
// 获取配置文件参数
// 获取配置文件参数
cv
::
FileNode
netNode
=
configurationFile
[
"Classifier"
];
cv
::
FileNode
netNode
=
configurationFile
[
"Classifier"
];
std
::
string
modelPath
=
(
std
::
string
)
netNode
[
"ModelPath"
];
std
::
string
modelPath
=
(
std
::
string
)
netNode
[
"ModelPath"
];
useInt8
=
(
bool
)(
int
)
netNode
[
"UseInt8"
];
useInt8
=
(
bool
)(
int
)
netNode
[
"UseInt8"
];
useFP16
=
(
bool
)(
int
)
netNode
[
"UseFP16"
];
useFP16
=
(
bool
)(
int
)
netNode
[
"UseFP16"
];
useoffloadcopy
=
(
bool
)(
int
)
netNode
[
"Useoffloadcopy"
];
useoffloadcopy
=
(
bool
)(
int
)
netNode
[
"Useoffloadcopy"
];
// 加载模型
// 加载模型
if
(
!
Exists
(
modelPath
))
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
;
return
MODEL_NOT_EXIST
;
}
}
net
=
migraphx
::
parse_onnx
(
modelPath
);
net
=
migraphx
::
parse_onnx
(
modelPath
);
LOG_INFO
(
stdout
,
"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
>
inputs
=
net
.
get_inputs
();
std
::
unordered_map
<
std
::
string
,
migraphx
::
shape
>
inputs
=
net
.
get_inputs
();
std
::
unordered_map
<
std
::
string
,
migraphx
::
shape
>
outputs
=
net
.
get_outputs
();
std
::
unordered_map
<
std
::
string
,
migraphx
::
shape
>
outputs
=
net
.
get_outputs
();
inputName
=
inputs
.
begin
()
->
first
;
inputName
=
inputs
.
begin
()
->
first
;
inputShape
=
inputs
.
begin
()
->
second
;
inputShape
=
inputs
.
begin
()
->
second
;
outputName
=
outputs
.
begin
()
->
first
;
outputName
=
outputs
.
begin
()
->
first
;
outputShape
=
outputs
.
begin
()
->
second
;
outputShape
=
outputs
.
begin
()
->
second
;
int
N
=
inputShape
.
lens
()[
0
];
int
N
=
inputShape
.
lens
()[
0
];
int
C
=
inputShape
.
lens
()[
1
];
int
C
=
inputShape
.
lens
()[
1
];
int
H
=
inputShape
.
lens
()[
2
];
int
H
=
inputShape
.
lens
()[
2
];
int
W
=
inputShape
.
lens
()[
3
];
int
W
=
inputShape
.
lens
()[
3
];
inputSize
=
cv
::
Size
(
W
,
H
);
inputSize
=
cv
::
Size
(
W
,
H
);
// 设置模型为GPU模式
// 设置模型为GPU模式
migraphx
::
target
gpuTarget
=
migraphx
::
gpu
::
target
{};
migraphx
::
target
gpuTarget
=
migraphx
::
gpu
::
target
{};
...
@@ -114,9 +109,9 @@ ErrorCode Classifier::Initialize(InitializationParameterOfClassifier initializat
...
@@ -114,9 +109,9 @@ ErrorCode Classifier::Initialize(InitializationParameterOfClassifier initializat
if
(
useInt8
)
if
(
useInt8
)
{
{
// 创建量化校准数据,建议使用测试集中的多张典型图像
// 创建量化校准数据,建议使用测试集中的多张典型图像
cv
::
Mat
srcImage
=
cv
::
imread
(
"../Resource/Images/ImageNet_test.jpg"
,
1
);
cv
::
Mat
srcImage
=
cv
::
imread
(
"../Resource/Images/ImageNet_test.jpg"
,
1
);
std
::
vector
<
cv
::
Mat
>
srcImages
;
std
::
vector
<
cv
::
Mat
>
srcImages
;
for
(
int
i
=
0
;
i
<
inputShape
.
lens
()[
0
];
++
i
)
for
(
int
i
=
0
;
i
<
inputShape
.
lens
()[
0
];
++
i
)
{
{
srcImages
.
push_back
(
srcImage
);
srcImages
.
push_back
(
srcImage
);
}
}
...
@@ -124,8 +119,9 @@ ErrorCode Classifier::Initialize(InitializationParameterOfClassifier initializat
...
@@ -124,8 +119,9 @@ ErrorCode Classifier::Initialize(InitializationParameterOfClassifier initializat
// 数据预处理
// 数据预处理
cv
::
Mat
inputBlob
=
Preprocess
(
srcImages
);
cv
::
Mat
inputBlob
=
Preprocess
(
srcImages
);
std
::
unordered_map
<
std
::
string
,
migraphx
::
argument
>
inputData
;
std
::
unordered_map
<
std
::
string
,
migraphx
::
argument
>
inputData
;
inputData
[
inputName
]
=
migraphx
::
argument
{
inputShape
,
(
float
*
)
inputBlob
.
data
};
inputData
[
inputName
]
=
migraphx
::
argument
{
inputShape
,
(
float
*
)
inputBlob
.
data
};
std
::
vector
<
std
::
unordered_map
<
std
::
string
,
migraphx
::
argument
>>
calibrationData
=
{
inputData
};
std
::
vector
<
std
::
unordered_map
<
std
::
string
,
migraphx
::
argument
>>
calibrationData
=
{
inputData
};
// INT8量化
// INT8量化
migraphx
::
quantize_int8
(
net
,
gpuTarget
,
calibrationData
);
migraphx
::
quantize_int8
(
net
,
gpuTarget
,
calibrationData
);
...
@@ -137,66 +133,67 @@ ErrorCode Classifier::Initialize(InitializationParameterOfClassifier initializat
...
@@ -137,66 +133,67 @@ ErrorCode Classifier::Initialize(InitializationParameterOfClassifier initializat
// 编译模型
// 编译模型
migraphx
::
compile_options
options
;
migraphx
::
compile_options
options
;
options
.
device_id
=
0
;
// 设置GPU设备,默认为0号设备
options
.
device_id
=
0
;
// 设置GPU设备,默认为0号设备
if
(
useoffloadcopy
)
if
(
useoffloadcopy
)
{
{
options
.
offload_copy
=
true
;
options
.
offload_copy
=
true
;
}
}
else
else
{
{
options
.
offload_copy
=
false
;
options
.
offload_copy
=
false
;
}
}
net
.
compile
(
gpuTarget
,
options
);
net
.
compile
(
gpuTarget
,
options
);
LOG_INFO
(
stdout
,
"succeed to compile model: %s
\n
"
,
GetFileName
(
modelPath
).
c_str
());
LOG_INFO
(
stdout
,
"succeed to compile model: %s
\n
"
,
GetFileName
(
modelPath
).
c_str
());
// offloadcopy为false的时候,分配输入和输出内存
// offloadcopy为false的时候,分配输入和输出内存
if
(
!
useoffloadcopy
)
if
(
!
useoffloadcopy
)
{
{
// 分配device输入内存
// 分配device输入内存
inputBuffer_Device
=
nullptr
;
inputBuffer_Device
=
nullptr
;
hipMalloc
(
&
inputBuffer_Device
,
inputShape
.
bytes
());
hipMalloc
(
&
inputBuffer_Device
,
inputShape
.
bytes
());
programParameters
[
inputName
]
=
migraphx
::
argument
{
inputShape
,
inputBuffer_Device
};
programParameters
[
inputName
]
=
migraphx
::
argument
{
inputShape
,
inputBuffer_Device
};
// 分配device和host输出内存
// 分配device和host输出内存
outputBuffer_Device
=
nullptr
;
outputBuffer_Device
=
nullptr
;
hipMalloc
(
&
outputBuffer_Device
,
outputShape
.
bytes
());
hipMalloc
(
&
outputBuffer_Device
,
outputShape
.
bytes
());
programParameters
[
outputName
]
=
migraphx
::
argument
{
outputShape
,
outputBuffer_Device
};
programParameters
[
outputName
]
=
migraphx
::
argument
{
outputShape
,
outputBuffer_Device
};
outputBuffer_Host
=
nullptr
;
// host内存
outputBuffer_Host
=
nullptr
;
// host内存
outputBuffer_Host
=
malloc
(
outputShape
.
bytes
());
outputBuffer_Host
=
malloc
(
outputShape
.
bytes
());
}
}
// warm up
// warm up
if
(
useoffloadcopy
)
if
(
useoffloadcopy
)
{
{
std
::
unordered_map
<
std
::
string
,
migraphx
::
argument
>
inputData
;
std
::
unordered_map
<
std
::
string
,
migraphx
::
argument
>
inputData
;
inputData
[
inputName
]
=
migraphx
::
argument
{
inputShape
};
inputData
[
inputName
]
=
migraphx
::
argument
{
inputShape
};
net
.
eval
(
inputData
);
net
.
eval
(
inputData
);
}
}
else
else
{
{
migraphx
::
argument
inputData
=
migraphx
::
argument
{
inputShape
};
migraphx
::
argument
inputData
=
migraphx
::
argument
{
inputShape
};
hipMemcpy
(
inputBuffer_Device
,
inputData
.
data
(),
inputShape
.
bytes
(),
hipMemcpyHostToDevice
);
hipMemcpy
(
inputBuffer_Device
,
inputData
.
data
(),
inputShape
.
bytes
(),
hipMemcpyHostToDevice
);
net
.
eval
(
programParameters
);
net
.
eval
(
programParameters
);
}
}
// log
// log
LOG_INFO
(
stdout
,
"InputSize:%dx%d
\n
"
,
inputSize
.
width
,
inputSize
.
height
);
LOG_INFO
(
stdout
,
"InputSize:%dx%d
\n
"
,
inputSize
.
width
,
inputSize
.
height
);
LOG_INFO
(
stdout
,
"InputName:%s
\n
"
,
inputName
.
c_str
());
LOG_INFO
(
stdout
,
"InputName:%s
\n
"
,
inputName
.
c_str
());
LOG_INFO
(
stdout
,
"UseInt8:%d
\n
"
,(
int
)
useInt8
);
LOG_INFO
(
stdout
,
"UseInt8:%d
\n
"
,
(
int
)
useInt8
);
LOG_INFO
(
stdout
,
"UseFP16:%d
\n
"
,(
int
)
useFP16
);
LOG_INFO
(
stdout
,
"UseFP16:%d
\n
"
,
(
int
)
useFP16
);
LOG_INFO
(
stdout
,
"Useoffloadcopy:%d
\n
"
,(
int
)
useoffloadcopy
);
LOG_INFO
(
stdout
,
"Useoffloadcopy:%d
\n
"
,
(
int
)
useoffloadcopy
);
return
SUCCESS
;
return
SUCCESS
;
}
}
ErrorCode
Classifier
::
Classify
(
const
std
::
vector
<
cv
::
Mat
>
&
srcImages
,
std
::
vector
<
std
::
vector
<
ResultOfPrediction
>>
&
predictions
)
ErrorCode
Classifier
::
Classify
(
const
std
::
vector
<
cv
::
Mat
>&
srcImages
,
std
::
vector
<
std
::
vector
<
ResultOfPrediction
>>&
predictions
)
{
{
if
(
srcImages
.
size
()
==
0
||
srcImages
[
0
].
empty
()
||
srcImages
[
0
].
depth
()
!=
CV_8U
)
if
(
srcImages
.
size
()
==
0
||
srcImages
[
0
].
empty
()
||
srcImages
[
0
].
depth
()
!=
CV_8U
)
{
{
LOG_ERROR
(
stdout
,
"image error!
\n
"
);
LOG_ERROR
(
stdout
,
"image error!
\n
"
);
return
IMAGE_ERROR
;
return
IMAGE_ERROR
;
}
}
// 数据预处理
// 数据预处理
cv
::
Mat
inputBlob
=
Preprocess
(
srcImages
);
cv
::
Mat
inputBlob
=
Preprocess
(
srcImages
);
...
@@ -204,36 +201,37 @@ ErrorCode Classifier::Classify(const std::vector<cv::Mat> &srcImages,std::vector
...
@@ -204,36 +201,37 @@ ErrorCode Classifier::Classify(const std::vector<cv::Mat> &srcImages,std::vector
if
(
useoffloadcopy
)
if
(
useoffloadcopy
)
{
{
std
::
unordered_map
<
std
::
string
,
migraphx
::
argument
>
inputData
;
std
::
unordered_map
<
std
::
string
,
migraphx
::
argument
>
inputData
;
inputData
[
inputName
]
=
migraphx
::
argument
{
inputShape
,
(
float
*
)
inputBlob
.
data
};
inputData
[
inputName
]
=
migraphx
::
argument
{
inputShape
,
(
float
*
)
inputBlob
.
data
};
// 推理
// 推理
std
::
vector
<
migraphx
::
argument
>
results
=
net
.
eval
(
inputData
);
std
::
vector
<
migraphx
::
argument
>
results
=
net
.
eval
(
inputData
);
// 获取输出节点的属性
// 获取输出节点的属性
migraphx
::
argument
result
=
results
[
0
];
// 获取第一个输出节点的数据
migraphx
::
argument
result
=
results
[
0
];
// 获取第一个输出节点的数据
migraphx
::
shape
outputShapes
=
result
.
get_shape
();
// 输出节点的shape
migraphx
::
shape
outputShapes
=
result
.
get_shape
();
// 输出节点的shape
std
::
vector
<
std
::
size_t
>
outputSize
=
outputShapes
.
lens
();
// 每一维大小,维度顺序为(N,C,H,W)
std
::
vector
<
std
::
size_t
>
outputSize
=
int
numberOfOutput
=
outputShapes
.
elements
();
// 输出节点元素的个数
outputShapes
.
lens
();
// 每一维大小,维度顺序为(N,C,H,W)
float
*
logits
=
(
float
*
)
result
.
data
();
// 输出节点数据指针
int
numberOfOutput
=
outputShapes
.
elements
();
// 输出节点元素的个数
float
*
logits
=
(
float
*
)
result
.
data
();
// 输出节点数据指针
// 获取每张图像的预测结果
// 获取每张图像的预测结果
int
numberOfClasses
=
numberOfOutput
/
srcImages
.
size
();
int
numberOfClasses
=
numberOfOutput
/
srcImages
.
size
();
for
(
int
i
=
0
;
i
<
srcImages
.
size
();
++
i
)
for
(
int
i
=
0
;
i
<
srcImages
.
size
();
++
i
)
{
{
int
startIndex
=
numberOfClasses
*
i
;
int
startIndex
=
numberOfClasses
*
i
;
std
::
vector
<
float
>
logit
;
std
::
vector
<
float
>
logit
;
for
(
int
j
=
0
;
j
<
numberOfClasses
;
++
j
)
for
(
int
j
=
0
;
j
<
numberOfClasses
;
++
j
)
{
{
logit
.
push_back
(
logits
[
startIndex
+
j
]);
logit
.
push_back
(
logits
[
startIndex
+
j
]);
}
}
std
::
vector
<
ResultOfPrediction
>
resultOfPredictions
;
std
::
vector
<
ResultOfPrediction
>
resultOfPredictions
;
for
(
int
j
=
0
;
j
<
numberOfClasses
;
++
j
)
for
(
int
j
=
0
;
j
<
numberOfClasses
;
++
j
)
{
{
ResultOfPrediction
prediction
;
ResultOfPrediction
prediction
;
prediction
.
label
=
j
;
prediction
.
label
=
j
;
prediction
.
confidence
=
logit
[
j
];
prediction
.
confidence
=
logit
[
j
];
resultOfPredictions
.
push_back
(
prediction
);
resultOfPredictions
.
push_back
(
prediction
);
}
}
...
@@ -241,7 +239,7 @@ ErrorCode Classifier::Classify(const std::vector<cv::Mat> &srcImages,std::vector
...
@@ -241,7 +239,7 @@ ErrorCode Classifier::Classify(const std::vector<cv::Mat> &srcImages,std::vector
predictions
.
push_back
(
resultOfPredictions
);
predictions
.
push_back
(
resultOfPredictions
);
}
}
}
}
else
// 当offload为false时,需要内存拷贝
else
// 当offload为false时,需要内存拷贝
{
{
migraphx
::
argument
inputData
=
migraphx
::
argument
{
inputShape
,
(
float
*
)
inputBlob
.
data
};
migraphx
::
argument
inputData
=
migraphx
::
argument
{
inputShape
,
(
float
*
)
inputBlob
.
data
};
...
@@ -253,31 +251,35 @@ ErrorCode Classifier::Classify(const std::vector<cv::Mat> &srcImages,std::vector
...
@@ -253,31 +251,35 @@ ErrorCode Classifier::Classify(const std::vector<cv::Mat> &srcImages,std::vector
std
::
vector
<
migraphx
::
argument
>
results
=
net
.
eval
(
programParameters
);
std
::
vector
<
migraphx
::
argument
>
results
=
net
.
eval
(
programParameters
);
// 获取输出节点的属性
// 获取输出节点的属性
migraphx
::
argument
result
=
results
[
0
];
// 获取第一个输出节点的数据
migraphx
::
argument
result
=
results
[
0
];
// 获取第一个输出节点的数据
migraphx
::
shape
outputShapes
=
result
.
get_shape
();
// 输出节点的shape
migraphx
::
shape
outputShapes
=
result
.
get_shape
();
// 输出节点的shape
std
::
vector
<
std
::
size_t
>
outputSize
=
outputShapes
.
lens
();
// 每一维大小,维度顺序为(N,C,H,W)
std
::
vector
<
std
::
size_t
>
outputSize
=
int
numberOfOutput
=
outputShapes
.
elements
();
// 输出节点元素的个数
outputShapes
.
lens
();
// 每一维大小,维度顺序为(N,C,H,W)
int
numberOfOutput
=
outputShapes
.
elements
();
// 输出节点元素的个数
// 将device输出数据拷贝到分配好的host输出内存
// 将device输出数据拷贝到分配好的host输出内存
hipMemcpy
(
outputBuffer_Host
,
outputBuffer_Device
,
outputShapes
.
bytes
(),
hipMemcpyDeviceToHost
);
// 直接使用事先分配好的输出内存拷贝
hipMemcpy
(
outputBuffer_Host
,
outputBuffer_Device
,
outputShapes
.
bytes
(),
hipMemcpyDeviceToHost
);
// 直接使用事先分配好的输出内存拷贝
// 获取每张图像的预测结果
// 获取每张图像的预测结果
int
numberOfClasses
=
numberOfOutput
/
srcImages
.
size
();
int
numberOfClasses
=
numberOfOutput
/
srcImages
.
size
();
std
::
vector
<
float
>
logit
;
std
::
vector
<
float
>
logit
;
for
(
int
i
=
0
;
i
<
srcImages
.
size
();
++
i
)
for
(
int
i
=
0
;
i
<
srcImages
.
size
();
++
i
)
{
{
int
startIndex
=
numberOfClasses
*
i
;
int
startIndex
=
numberOfClasses
*
i
;
for
(
int
j
=
0
;
j
<
numberOfClasses
;
++
j
)
for
(
int
j
=
0
;
j
<
numberOfClasses
;
++
j
)
{
{
logit
.
push_back
(((
float
*
)
outputBuffer_Host
)[
startIndex
+
j
]);
logit
.
push_back
(((
float
*
)
outputBuffer_Host
)[
startIndex
+
j
]);
}
}
std
::
vector
<
ResultOfPrediction
>
resultOfPredictions
;
std
::
vector
<
ResultOfPrediction
>
resultOfPredictions
;
for
(
int
j
=
0
;
j
<
numberOfClasses
;
++
j
)
for
(
int
j
=
0
;
j
<
numberOfClasses
;
++
j
)
{
{
ResultOfPrediction
prediction
;
ResultOfPrediction
prediction
;
prediction
.
label
=
j
;
prediction
.
label
=
j
;
prediction
.
confidence
=
logit
[
j
];
prediction
.
confidence
=
logit
[
j
];
resultOfPredictions
.
push_back
(
prediction
);
resultOfPredictions
.
push_back
(
prediction
);
}
}
...
@@ -292,7 +294,6 @@ ErrorCode Classifier::Classify(const std::vector<cv::Mat> &srcImages,std::vector
...
@@ -292,7 +294,6 @@ ErrorCode Classifier::Classify(const std::vector<cv::Mat> &srcImages,std::vector
}
}
return
SUCCESS
;
return
SUCCESS
;
}
}
}
}
// namespace migraphxSamples
Src/Classifier.h
View file @
0ed76f01
...
@@ -8,22 +8,23 @@
...
@@ -8,22 +8,23 @@
namespace
migraphxSamples
namespace
migraphxSamples
{
{
class
Classifier
class
Classifier
{
{
public:
public:
Classifier
();
Classifier
();
~
Classifier
();
~
Classifier
();
ErrorCode
Initialize
(
InitializationParameterOfClassifier
initializationParameterOfClassifier
);
ErrorCode
Initialize
(
InitializationParameterOfClassifier
initializationParameterOfClassifier
);
cv
::
Mat
Preprocess
(
const
std
::
vector
<
cv
::
Mat
>
&
srcImages
);
cv
::
Mat
Preprocess
(
const
std
::
vector
<
cv
::
Mat
>&
srcImages
);
ErrorCode
Classify
(
const
std
::
vector
<
cv
::
Mat
>
&
srcImages
,
std
::
vector
<
std
::
vector
<
ResultOfPrediction
>>
&
predictions
);
ErrorCode
Classify
(
const
std
::
vector
<
cv
::
Mat
>&
srcImages
,
std
::
vector
<
std
::
vector
<
ResultOfPrediction
>>&
predictions
);
private:
private:
cv
::
FileStorage
configurationFile
;
cv
::
FileStorage
configurationFile
;
migraphx
::
program
net
;
migraphx
::
program
net
;
cv
::
Size
inputSize
;
cv
::
Size
inputSize
;
std
::
string
inputName
;
std
::
string
inputName
;
...
@@ -32,18 +33,15 @@ private:
...
@@ -32,18 +33,15 @@ private:
migraphx
::
shape
outputShape
;
migraphx
::
shape
outputShape
;
std
::
unordered_map
<
std
::
string
,
migraphx
::
argument
>
programParameters
;
std
::
unordered_map
<
std
::
string
,
migraphx
::
argument
>
programParameters
;
void
*
inputBuffer_Device
;
void
*
inputBuffer_Device
;
void
*
outputBuffer_Device
;
void
*
outputBuffer_Device
;
void
*
outputBuffer_Host
;
void
*
outputBuffer_Host
;
bool
useInt8
;
bool
useInt8
;
bool
useFP16
;
bool
useFP16
;
bool
useoffloadcopy
;
bool
useoffloadcopy
;
};
};
}
}
// namespace migraphxSamples
#endif
#endif
Src/Utility/CommonDefinition.h
View file @
0ed76f01
...
@@ -7,41 +7,40 @@
...
@@ -7,41 +7,40 @@
namespace
migraphxSamples
namespace
migraphxSamples
{
{
// 路径分隔符(Linux:‘/’,Windows:’\\’)
// 路径分隔符(Linux:‘/’,Windows:’\\’)
#ifdef _WIN32
#ifdef _WIN32
#define
PATH_SEPARATOR '\\'
#define PATH_SEPARATOR '\\'
#else
#else
#define
PATH_SEPARATOR '/'
#define PATH_SEPARATOR '/'
#endif
#endif
#define CONFIG_FILE
"../Resource/Configuration.xml"
#define CONFIG_FILE "../Resource/Configuration.xml"
typedef
enum
_ErrorCode
typedef
enum
_ErrorCode
{
{
SUCCESS
=
0
,
// 0
SUCCESS
=
0
,
// 0
MODEL_NOT_EXIST
,
// 模型不存在
MODEL_NOT_EXIST
,
// 模型不存在
CONFIG_FILE_NOT_EXIST
,
// 配置文件不存在
CONFIG_FILE_NOT_EXIST
,
// 配置文件不存在
FAIL_TO_LOAD_MODEL
,
// 加载模型失败
FAIL_TO_LOAD_MODEL
,
// 加载模型失败
FAIL_TO_OPEN_CONFIG_FILE
,
// 加载配置文件失败
FAIL_TO_OPEN_CONFIG_FILE
,
// 加载配置文件失败
IMAGE_ERROR
,
// 图像错误
IMAGE_ERROR
,
// 图像错误
}
ErrorCode
;
}
ErrorCode
;
typedef
struct
_ResultOfPrediction
typedef
struct
_ResultOfPrediction
{
{
float
confidence
;
float
confidence
;
int
label
;
int
label
;
_ResultOfPrediction
()
:
confidence
(
0.0
f
),
label
(
0
){}
_ResultOfPrediction
()
:
confidence
(
0.0
f
),
label
(
0
)
{}
}
ResultOfPrediction
;
}
ResultOfPrediction
;
typedef
struct
_InitializationParameterOfClassifier
typedef
struct
_InitializationParameterOfClassifier
{
{
std
::
string
parentPath
;
std
::
string
parentPath
;
std
::
string
configFilePath
;
std
::
string
configFilePath
;
}
InitializationParameterOfClassifier
;
}
InitializationParameterOfClassifier
;
}
}
// namespace migraphxSamples
#endif
#endif
Src/Utility/CommonUtility.cpp
View file @
0ed76f01
...
@@ -6,37 +6,44 @@ using namespace cv::dnn;
...
@@ -6,37 +6,44 @@ using namespace cv::dnn;
namespace
migraphxSamples
namespace
migraphxSamples
{
{
void
blobFromImagesWithParams
(
InputArrayOfArrays
images_
,
OutputArray
blob_
,
const
Image2BlobParams
&
param
)
void
blobFromImagesWithParams
(
InputArrayOfArrays
images_
,
OutputArray
blob_
,
const
Image2BlobParams
&
param
)
{
{
if
(
images_
.
kind
()
!=
_InputArray
::
STD_VECTOR_MAT
&&
images_
.
kind
()
!=
_InputArray
::
STD_ARRAY_MAT
&&
if
(
images_
.
kind
()
!=
_InputArray
::
STD_VECTOR_MAT
&&
images_
.
kind
()
!=
_InputArray
::
STD_VECTOR_VECTOR
)
{
images_
.
kind
()
!=
_InputArray
::
STD_ARRAY_MAT
&&
images_
.
kind
()
!=
_InputArray
::
STD_VECTOR_VECTOR
)
{
String
error_message
=
"The data is expected as vectors of vectors or vectors of matrices."
;
String
error_message
=
"The data is expected as vectors of vectors or vectors of matrices."
;
CV_Error
(
Error
::
StsBadArg
,
error_message
);
CV_Error
(
Error
::
StsBadArg
,
error_message
);
}
}
CV_CheckType
(
param
.
ddepth
,
param
.
ddepth
==
CV_32F
||
param
.
ddepth
==
CV_8U
,
CV_CheckType
(
param
.
ddepth
,
param
.
ddepth
==
CV_32F
||
param
.
ddepth
==
CV_8U
,
"Blob depth should be CV_32F or CV_8U"
);
"Blob depth should be CV_32F or CV_8U"
);
Size
size
=
param
.
size
;
Size
size
=
param
.
size
;
std
::
vector
<
Mat
>
images
;
std
::
vector
<
Mat
>
images
;
images_
.
getMatVector
(
images
);
images_
.
getMatVector
(
images
);
CV_Assert
(
!
images
.
empty
());
CV_Assert
(
!
images
.
empty
());
int
nch
=
images
[
0
].
channels
();
int
nch
=
images
[
0
].
channels
();
Scalar
scalefactor
=
param
.
scalefactor
;
Scalar
scalefactor
=
param
.
scalefactor
;
if
(
param
.
ddepth
==
CV_8U
)
if
(
param
.
ddepth
==
CV_8U
)
{
{
CV_Assert
(
scalefactor
==
Scalar
::
all
(
1.0
)
&&
"Scaling is not supported for CV_8U blob depth"
);
CV_Assert
(
scalefactor
==
Scalar
::
all
(
1.0
)
&&
CV_Assert
(
param
.
mean
==
Scalar
()
&&
"Mean subtraction is not supported for CV_8U blob depth"
);
"Scaling is not supported for CV_8U blob depth"
);
CV_Assert
(
param
.
mean
==
Scalar
()
&&
"Mean subtraction is not supported for CV_8U blob depth"
);
}
}
for
(
size_t
i
=
0
;
i
<
images
.
size
();
i
++
)
for
(
size_t
i
=
0
;
i
<
images
.
size
();
i
++
)
{
{
Size
imgSize
=
images
[
i
].
size
();
Size
imgSize
=
images
[
i
].
size
();
if
(
size
==
Size
())
if
(
size
==
Size
())
size
=
imgSize
;
size
=
imgSize
;
if
(
size
!=
imgSize
)
if
(
size
!=
imgSize
)
{
{
if
(
param
.
paddingmode
==
DNN_PMODE_CROP_CENTER
)
if
(
param
.
paddingmode
==
DNN_PMODE_CROP_CENTER
)
{
{
float
resizeFactor
=
std
::
max
(
size
.
width
/
(
float
)
imgSize
.
width
,
float
resizeFactor
=
std
::
max
(
size
.
width
/
(
float
)
imgSize
.
width
,
size
.
height
/
(
float
)
imgSize
.
height
);
size
.
height
/
(
float
)
imgSize
.
height
);
...
@@ -48,18 +55,18 @@ void blobFromImagesWithParams(InputArrayOfArrays images_, OutputArray blob_, con
...
@@ -48,18 +55,18 @@ void blobFromImagesWithParams(InputArrayOfArrays images_, OutputArray blob_, con
}
}
else
else
{
{
if
(
param
.
paddingmode
==
DNN_PMODE_LETTERBOX
)
if
(
param
.
paddingmode
==
DNN_PMODE_LETTERBOX
)
{
{
float
resizeFactor
=
std
::
min
(
size
.
width
/
(
float
)
imgSize
.
width
,
float
resizeFactor
=
std
::
min
(
size
.
width
/
(
float
)
imgSize
.
width
,
size
.
height
/
(
float
)
imgSize
.
height
);
size
.
height
/
(
float
)
imgSize
.
height
);
int
rh
=
int
(
imgSize
.
height
*
resizeFactor
);
int
rh
=
int
(
imgSize
.
height
*
resizeFactor
);
int
rw
=
int
(
imgSize
.
width
*
resizeFactor
);
int
rw
=
int
(
imgSize
.
width
*
resizeFactor
);
resize
(
images
[
i
],
images
[
i
],
Size
(
rw
,
rh
),
INTER_LINEAR
);
resize
(
images
[
i
],
images
[
i
],
Size
(
rw
,
rh
),
INTER_LINEAR
);
int
top
=
(
size
.
height
-
rh
)
/
2
;
int
top
=
(
size
.
height
-
rh
)
/
2
;
int
bottom
=
size
.
height
-
top
-
rh
;
int
bottom
=
size
.
height
-
top
-
rh
;
int
left
=
(
size
.
width
-
rw
)
/
2
;
int
left
=
(
size
.
width
-
rw
)
/
2
;
int
right
=
size
.
width
-
left
-
rw
;
int
right
=
size
.
width
-
left
-
rw
;
copyMakeBorder
(
images
[
i
],
images
[
i
],
top
,
bottom
,
left
,
right
,
BORDER_CONSTANT
);
copyMakeBorder
(
images
[
i
],
images
[
i
],
top
,
bottom
,
left
,
right
,
BORDER_CONSTANT
);
}
}
else
else
...
@@ -68,13 +75,13 @@ void blobFromImagesWithParams(InputArrayOfArrays images_, OutputArray blob_, con
...
@@ -68,13 +75,13 @@ void blobFromImagesWithParams(InputArrayOfArrays images_, OutputArray blob_, con
}
}
Scalar
mean
=
param
.
mean
;
Scalar
mean
=
param
.
mean
;
if
(
param
.
swapRB
)
if
(
param
.
swapRB
)
{
{
std
::
swap
(
mean
[
0
],
mean
[
2
]);
std
::
swap
(
mean
[
0
],
mean
[
2
]);
std
::
swap
(
scalefactor
[
0
],
scalefactor
[
2
]);
std
::
swap
(
scalefactor
[
0
],
scalefactor
[
2
]);
}
}
if
(
images
[
i
].
depth
()
==
CV_8U
&&
param
.
ddepth
==
CV_32F
)
if
(
images
[
i
].
depth
()
==
CV_8U
&&
param
.
ddepth
==
CV_32F
)
images
[
i
].
convertTo
(
images
[
i
],
CV_32F
);
images
[
i
].
convertTo
(
images
[
i
],
CV_32F
);
images
[
i
]
-=
mean
;
images
[
i
]
-=
mean
;
...
@@ -82,19 +89,19 @@ void blobFromImagesWithParams(InputArrayOfArrays images_, OutputArray blob_, con
...
@@ -82,19 +89,19 @@ void blobFromImagesWithParams(InputArrayOfArrays images_, OutputArray blob_, con
}
}
size_t
nimages
=
images
.
size
();
size_t
nimages
=
images
.
size
();
Mat
image0
=
images
[
0
];
Mat
image0
=
images
[
0
];
CV_Assert
(
image0
.
dims
==
2
);
CV_Assert
(
image0
.
dims
==
2
);
if
(
param
.
datalayout
==
DNN_LAYOUT_NCHW
)
if
(
param
.
datalayout
==
DNN_LAYOUT_NCHW
)
{
{
if
(
nch
==
3
||
nch
==
4
)
if
(
nch
==
3
||
nch
==
4
)
{
{
int
sz
[]
=
{
(
int
)
nimages
,
nch
,
image0
.
rows
,
image0
.
cols
};
int
sz
[]
=
{(
int
)
nimages
,
nch
,
image0
.
rows
,
image0
.
cols
};
blob_
.
create
(
4
,
sz
,
param
.
ddepth
);
blob_
.
create
(
4
,
sz
,
param
.
ddepth
);
Mat
blob
=
blob_
.
getMat
();
Mat
blob
=
blob_
.
getMat
();
Mat
ch
[
4
];
Mat
ch
[
4
];
for
(
size_t
i
=
0
;
i
<
nimages
;
i
++
)
for
(
size_t
i
=
0
;
i
<
nimages
;
i
++
)
{
{
const
Mat
&
image
=
images
[
i
];
const
Mat
&
image
=
images
[
i
];
CV_Assert
(
image
.
depth
()
==
blob_
.
depth
());
CV_Assert
(
image
.
depth
()
==
blob_
.
depth
());
...
@@ -102,9 +109,9 @@ void blobFromImagesWithParams(InputArrayOfArrays images_, OutputArray blob_, con
...
@@ -102,9 +109,9 @@ void blobFromImagesWithParams(InputArrayOfArrays images_, OutputArray blob_, con
CV_Assert
(
image
.
dims
==
2
&&
(
nch
==
3
||
nch
==
4
));
CV_Assert
(
image
.
dims
==
2
&&
(
nch
==
3
||
nch
==
4
));
CV_Assert
(
image
.
size
()
==
image0
.
size
());
CV_Assert
(
image
.
size
()
==
image0
.
size
());
for
(
int
j
=
0
;
j
<
nch
;
j
++
)
for
(
int
j
=
0
;
j
<
nch
;
j
++
)
ch
[
j
]
=
Mat
(
image
.
rows
,
image
.
cols
,
param
.
ddepth
,
blob
.
ptr
((
int
)
i
,
j
));
ch
[
j
]
=
Mat
(
image
.
rows
,
image
.
cols
,
param
.
ddepth
,
blob
.
ptr
((
int
)
i
,
j
));
if
(
param
.
swapRB
)
if
(
param
.
swapRB
)
std
::
swap
(
ch
[
0
],
ch
[
2
]);
std
::
swap
(
ch
[
0
],
ch
[
2
]);
split
(
image
,
ch
);
split
(
image
,
ch
);
}
}
...
@@ -112,11 +119,11 @@ void blobFromImagesWithParams(InputArrayOfArrays images_, OutputArray blob_, con
...
@@ -112,11 +119,11 @@ void blobFromImagesWithParams(InputArrayOfArrays images_, OutputArray blob_, con
else
else
{
{
CV_Assert
(
nch
==
1
);
CV_Assert
(
nch
==
1
);
int
sz
[]
=
{
(
int
)
nimages
,
1
,
image0
.
rows
,
image0
.
cols
};
int
sz
[]
=
{(
int
)
nimages
,
1
,
image0
.
rows
,
image0
.
cols
};
blob_
.
create
(
4
,
sz
,
param
.
ddepth
);
blob_
.
create
(
4
,
sz
,
param
.
ddepth
);
Mat
blob
=
blob_
.
getMat
();
Mat
blob
=
blob_
.
getMat
();
for
(
size_t
i
=
0
;
i
<
nimages
;
i
++
)
for
(
size_t
i
=
0
;
i
<
nimages
;
i
++
)
{
{
const
Mat
&
image
=
images
[
i
];
const
Mat
&
image
=
images
[
i
];
CV_Assert
(
image
.
depth
()
==
blob_
.
depth
());
CV_Assert
(
image
.
depth
()
==
blob_
.
depth
());
...
@@ -128,19 +135,19 @@ void blobFromImagesWithParams(InputArrayOfArrays images_, OutputArray blob_, con
...
@@ -128,19 +135,19 @@ void blobFromImagesWithParams(InputArrayOfArrays images_, OutputArray blob_, con
}
}
}
}
}
}
else
if
(
param
.
datalayout
==
DNN_LAYOUT_NHWC
)
else
if
(
param
.
datalayout
==
DNN_LAYOUT_NHWC
)
{
{
int
sz
[]
=
{
(
int
)
nimages
,
image0
.
rows
,
image0
.
cols
,
nch
};
int
sz
[]
=
{(
int
)
nimages
,
image0
.
rows
,
image0
.
cols
,
nch
};
blob_
.
create
(
4
,
sz
,
param
.
ddepth
);
blob_
.
create
(
4
,
sz
,
param
.
ddepth
);
Mat
blob
=
blob_
.
getMat
();
Mat
blob
=
blob_
.
getMat
();
int
subMatType
=
CV_MAKETYPE
(
param
.
ddepth
,
nch
);
int
subMatType
=
CV_MAKETYPE
(
param
.
ddepth
,
nch
);
for
(
size_t
i
=
0
;
i
<
nimages
;
i
++
)
for
(
size_t
i
=
0
;
i
<
nimages
;
i
++
)
{
{
const
Mat
&
image
=
images
[
i
];
const
Mat
&
image
=
images
[
i
];
CV_Assert
(
image
.
depth
()
==
blob_
.
depth
());
CV_Assert
(
image
.
depth
()
==
blob_
.
depth
());
CV_Assert
(
image
.
channels
()
==
image0
.
channels
());
CV_Assert
(
image
.
channels
()
==
image0
.
channels
());
CV_Assert
(
image
.
size
()
==
image0
.
size
());
CV_Assert
(
image
.
size
()
==
image0
.
size
());
if
(
param
.
swapRB
)
if
(
param
.
swapRB
)
{
{
Mat
tmpRB
;
Mat
tmpRB
;
cvtColor
(
image
,
tmpRB
,
COLOR_BGR2RGB
);
cvtColor
(
image
,
tmpRB
,
COLOR_BGR2RGB
);
...
@@ -151,7 +158,8 @@ void blobFromImagesWithParams(InputArrayOfArrays images_, OutputArray blob_, con
...
@@ -151,7 +158,8 @@ void blobFromImagesWithParams(InputArrayOfArrays images_, OutputArray blob_, con
}
}
}
}
else
else
CV_Error
(
Error
::
StsUnsupportedFormat
,
"Unsupported data layout in blobFromImagesWithParams function."
);
CV_Error
(
Error
::
StsUnsupportedFormat
,
"Unsupported data layout in blobFromImagesWithParams function."
);
}
}
}
}
// namespace migraphxSamples
Src/Utility/CommonUtility.h
View file @
0ed76f01
...
@@ -12,46 +12,69 @@ namespace migraphxSamples
...
@@ -12,46 +12,69 @@ namespace migraphxSamples
{
{
enum
DataLayout
enum
DataLayout
{
DNN_LAYOUT_UNKNOWN
=
0
,
DNN_LAYOUT_ND
=
1
,
//!< OpenCV data layout for 2D data.
DNN_LAYOUT_NCHW
=
2
,
//!< OpenCV data layout for 4D data.
DNN_LAYOUT_NCDHW
=
3
,
//!< OpenCV data layout for 5D data.
DNN_LAYOUT_NHWC
=
4
,
//!< Tensorflow-like data layout for 4D data.
DNN_LAYOUT_NDHWC
=
5
,
//!< Tensorflow-like data layout for 5D data.
DNN_LAYOUT_PLANAR
=
6
,
//!< Tensorflow-like data layout, it should only be used at tf or tflite model parsing.
};
enum
ImagePaddingMode
{
DNN_PMODE_NULL
=
0
,
// !< Default. Resize to required input size without extra processing.
DNN_PMODE_CROP_CENTER
=
1
,
// !< Image will be cropped after resize.
DNN_PMODE_LETTERBOX
=
2
,
// !< Resize image to the desired size while preserving the aspect
// ratio of original image.
};
struct
Image2BlobParams
{
Image2BlobParams
()
:
scalefactor
(
Scalar
::
all
(
1.0
)),
size
(
Size
()),
mean
(
Scalar
()),
swapRB
(
false
),
ddepth
(
CV_32F
),
datalayout
(
DNN_LAYOUT_NCHW
),
paddingmode
(
DNN_PMODE_NULL
)
{
{
DNN_LAYOUT_UNKNOWN
=
0
,
}
DNN_LAYOUT_ND
=
1
,
//!< OpenCV data layout for 2D data.
DNN_LAYOUT_NCHW
=
2
,
//!< OpenCV data layout for 4D data.
DNN_LAYOUT_NCDHW
=
3
,
//!< OpenCV data layout for 5D data.
DNN_LAYOUT_NHWC
=
4
,
//!< Tensorflow-like data layout for 4D data.
DNN_LAYOUT_NDHWC
=
5
,
//!< Tensorflow-like data layout for 5D data.
DNN_LAYOUT_PLANAR
=
6
,
//!< Tensorflow-like data layout, it should only be used at tf or tflite model parsing.
};
enum
ImagePaddingMode
{
DNN_PMODE_NULL
=
0
,
// !< Default. Resize to required input size without extra processing.
DNN_PMODE_CROP_CENTER
=
1
,
// !< Image will be cropped after resize.
DNN_PMODE_LETTERBOX
=
2
,
// !< Resize image to the desired size while preserving the aspect ratio of original image.
};
struct
Image2BlobParams
Image2BlobParams
(
const
Scalar
&
scalefactor_
,
const
Size
&
size_
,
const
Scalar
&
mean_
,
bool
swapRB_
,
int
ddepth_
,
DataLayout
datalayout_
,
ImagePaddingMode
mode_
)
:
scalefactor
(
scalefactor_
),
size
(
size_
),
mean
(
mean_
),
swapRB
(
swapRB_
),
ddepth
(
ddepth_
),
datalayout
(
datalayout_
),
paddingmode
(
mode_
)
{
{
Image2BlobParams
()
:
scalefactor
(
Scalar
::
all
(
1.0
)),
size
(
Size
()),
mean
(
Scalar
()),
swapRB
(
false
),
ddepth
(
CV_32F
),
}
datalayout
(
DNN_LAYOUT_NCHW
),
paddingmode
(
DNN_PMODE_NULL
)
{}
Scalar
scalefactor
;
//!< scalefactor multiplier for input image values.
Size
size
;
//!< Spatial size for output image.
Image2BlobParams
(
const
Scalar
&
scalefactor_
,
const
Size
&
size_
,
const
Scalar
&
mean_
,
bool
swapRB_
,
Scalar
mean
;
//!< Scalar with mean values which are subtracted from channels.
int
ddepth_
,
DataLayout
datalayout_
,
ImagePaddingMode
mode_
)
:
bool
swapRB
;
//!< Flag which indicates that swap first and last channels
scalefactor
(
scalefactor_
),
size
(
size_
),
mean
(
mean_
),
swapRB
(
swapRB_
),
ddepth
(
ddepth_
),
int
ddepth
;
//!< Depth of output blob. Choose CV_32F or CV_8U.
datalayout
(
datalayout_
),
paddingmode
(
mode_
)
DataLayout
{}
datalayout
;
//!< Order of output dimensions. Choose DNN_LAYOUT_NCHW or DNN_LAYOUT_NHWC.
ImagePaddingMode
paddingmode
;
//!< Image padding mode. @see ImagePaddingMode.
Scalar
scalefactor
;
//!< scalefactor multiplier for input image values.
};
Size
size
;
//!< Spatial size for output image.
Scalar
mean
;
//!< Scalar with mean values which are subtracted from channels.
void
blobFromImagesWithParams
(
InputArrayOfArrays
images_
,
bool
swapRB
;
//!< Flag which indicates that swap first and last channels
OutputArray
blob_
,
int
ddepth
;
//!< Depth of output blob. Choose CV_32F or CV_8U.
const
Image2BlobParams
&
param
);
DataLayout
datalayout
;
//!< Order of output dimensions. Choose DNN_LAYOUT_NCHW or DNN_LAYOUT_NHWC.
ImagePaddingMode
paddingmode
;
//!< Image padding mode. @see ImagePaddingMode.
}
// namespace migraphxSamples
};
void
blobFromImagesWithParams
(
InputArrayOfArrays
images_
,
OutputArray
blob_
,
const
Image2BlobParams
&
param
);
}
#endif
#endif
Src/Utility/Filesystem.cpp
View file @
0ed76f01
This diff is collapsed.
Click to expand it.
Src/Utility/Filesystem.h
View file @
0ed76f01
...
@@ -5,27 +5,27 @@
...
@@ -5,27 +5,27 @@
#include <string>
#include <string>
#include <vector>
#include <vector>
namespace
migraphxSamples
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:’\\’)
// 是否是路径分隔符(Linux:‘/’,Windows:’\\’)
bool
IsPathSeparator
(
char
c
);
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"
* pattern: 模式,比如"*.jpg","*.png","*.jpg,*.png"
* addPath:是否包含父路径
* addPath:是否包含父路径
* 注意:
* 注意:
...
@@ -36,35 +36,43 @@ bool CreateDirectories(const std::string &directoryPath);
...
@@ -36,35 +36,43 @@ bool CreateDirectories(const std::string &directoryPath);
5. 不能返回子目录名
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的时候会返回子目录路径(目录名最后有"/")
// 与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/
* 示例: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
(
const
std
::
string
&
path
);
std
::
string
GetFileName_NoExtension
(
const
std
::
string
&
path
);
std
::
string
GetFileName_NoExtension
(
const
std
::
string
&
path
);
std
::
string
GetExtension
(
const
std
::
string
&
path
);
std
::
string
GetExtension
(
const
std
::
string
&
path
);
std
::
string
GetParentPath
(
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/)
* 示例:CopyDirectories("D:/0/1/2/","E:/3/");实现把D:/0/1/2/目录拷贝到E:/3/目录中(即拷贝完成后的目录结构为E:/3/2/)
* 注意:
* 注意:
1.第一个参数的最后不能加”/”
1.第一个参数的最后不能加”/”
2.不能拷贝隐藏文件
2.不能拷贝隐藏文件
*/
*/
bool
CopyDirectories
(
std
::
string
srcPath
,
const
std
::
string
dstPath
);
bool
CopyDirectories
(
std
::
string
srcPath
,
const
std
::
string
dstPath
);
}
}
// namespace migraphxSamples
#endif
#endif
Src/Utility/SimpleLog.h
View file @
0ed76f01
...
@@ -8,7 +8,7 @@
...
@@ -8,7 +8,7 @@
#include <map>
#include <map>
#include <thread>
#include <thread>
#include <mutex>
#include <mutex>
#if
(defined WIN32 || defined _WIN32)
#if(defined WIN32 || defined _WIN32)
#include <Windows.h>
#include <Windows.h>
#else
#else
#include <sys/time.h>
#include <sys/time.h>
...
@@ -16,13 +16,13 @@
...
@@ -16,13 +16,13 @@
using
namespace
std
;
using
namespace
std
;
/** 简易日志
/** 简易日志
*
*
* 不依赖于其他第三方库,只需要包含一个头文件就可以使用。提供了4种日志级别,包括INFO,DEBUG,WARN和ERROR。
* 不依赖于其他第三方库,只需要包含一个头文件就可以使用。提供了4种日志级别,包括INFO,DEBUG,WARN和ERROR。
*
*
* 示例1:
* 示例1:
// 初始化日志,在./Log/目录下创建两个日志文件log1.log和log2.log(注意:目录./Log/需要存在,否则日志创建失败)
//
初始化日志,在./Log/目录下创建两个日志文件log1.log和log2.log(注意:目录./Log/需要存在,否则日志创建失败)
LogManager::GetInstance()->Initialize("./Log/","log1");
LogManager::GetInstance()->Initialize("./Log/","log1");
LogManager::GetInstance()->Initialize("./Log/","log2");
LogManager::GetInstance()->Initialize("./Log/","log2");
...
@@ -34,11 +34,11 @@ using namespace std;
...
@@ -34,11 +34,11 @@ using namespace std;
// 关闭日志
// 关闭日志
LogManager::GetInstance()->Close("log1");
LogManager::GetInstance()->Close("log1");
LogManager::GetInstance()->Close("log2");
LogManager::GetInstance()->Close("log2");
* 示例2:
* 示例2:
// 将日志输出到控制台
// 将日志输出到控制台
string log = "Hello World";
string log = "Hello World";
LOG_INFO(stdout, "%s\n", log.c_str());
LOG_INFO(stdout, "%s\n", log.c_str());
* 注意:
* 注意:
1. 需要C++11
1. 需要C++11
...
@@ -50,44 +50,43 @@ using namespace std;
...
@@ -50,44 +50,43 @@ using namespace std;
class
LogManager
class
LogManager
{
{
private:
private:
LogManager
(){}
LogManager
()
{}
public:
public:
~
LogManager
(){}
~
LogManager
()
{}
inline
void
Initialize
(
const
string
&
parentPath
,
const
string
&
logName
)
inline
void
Initialize
(
const
string
&
parentPath
,
const
string
&
logName
)
{
{
// 日志名为空表示输出到控制台
// 日志名为空表示输出到控制台
if
(
logName
.
size
()
==
0
)
if
(
logName
.
size
()
==
0
)
return
;
return
;
// 查找该日志文件,如果没有则创建
// 查找该日志文件,如果没有则创建
std
::
map
<
string
,
FILE
*>::
const_iterator
iter
=
logMap
.
find
(
logName
);
std
::
map
<
string
,
FILE
*>::
const_iterator
iter
=
logMap
.
find
(
logName
);
if
(
iter
==
logMap
.
end
())
if
(
iter
==
logMap
.
end
())
{
{
string
pathOfLog
=
parentPath
+
logName
+
".log"
;
string
pathOfLog
=
parentPath
+
logName
+
".log"
;
FILE
*
logFile
=
fopen
(
pathOfLog
.
c_str
(),
"a"
);
// w:覆盖原有文件,a:追加
FILE
*
logFile
=
fopen
(
pathOfLog
.
c_str
(),
"a"
);
// w:覆盖原有文件,a:追加
if
(
logFile
!=
NULL
)
if
(
logFile
!=
NULL
)
{
{
logMap
.
insert
(
std
::
make_pair
(
logName
,
logFile
));
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
);
std
::
map
<
string
,
FILE
*>::
const_iterator
iter
=
logMap
.
find
(
logName
);
if
(
iter
==
logMap
.
end
())
if
(
iter
==
logMap
.
end
())
{
{
return
NULL
;
return
NULL
;
}
}
return
(
*
iter
).
second
;
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
);
std
::
map
<
string
,
FILE
*>::
const_iterator
iter
=
logMap
.
find
(
logName
);
if
(
iter
==
logMap
.
end
())
if
(
iter
==
logMap
.
end
())
{
{
return
;
return
;
}
}
...
@@ -95,10 +94,7 @@ public:
...
@@ -95,10 +94,7 @@ public:
fclose
((
*
iter
).
second
);
fclose
((
*
iter
).
second
);
logMap
.
erase
(
iter
);
logMap
.
erase
(
iter
);
}
}
inline
std
::
mutex
&
GetLogMutex
()
inline
std
::
mutex
&
GetLogMutex
()
{
return
logMutex
;
}
{
return
logMutex
;
}
// Singleton
// Singleton
static
LogManager
*
GetInstance
()
static
LogManager
*
GetInstance
()
...
@@ -106,21 +102,22 @@ public:
...
@@ -106,21 +102,22 @@ public:
static
LogManager
logManager
;
static
LogManager
logManager
;
return
&
logManager
;
return
&
logManager
;
}
}
private:
private:
std
::
map
<
string
,
FILE
*>
logMap
;
std
::
map
<
string
,
FILE
*>
logMap
;
std
::
mutex
logMutex
;
std
::
mutex
logMutex
;
};
};
#ifdef LOG_MUTEX
#ifdef LOG_MUTEX
#define LOCK
LogManager::GetInstance()->GetLogMutex().lock()
#define LOCK
LogManager::GetInstance()->GetLogMutex().lock()
#define UNLOCK
LogManager::GetInstance()->GetLogMutex().unlock()
#define UNLOCK
LogManager::GetInstance()->GetLogMutex().unlock()
#else
#else
#define LOCK
#define LOCK
#define UNLOCK
#define UNLOCK
#endif
#endif
// log time
// log time
typedef
struct
_LogTime
typedef
struct
_LogTime
{
{
string
year
;
string
year
;
string
month
;
string
month
;
...
@@ -131,53 +128,53 @@ typedef struct _LogTime
...
@@ -131,53 +128,53 @@ typedef struct _LogTime
string
millisecond
;
// ms
string
millisecond
;
// ms
string
microsecond
;
// us
string
microsecond
;
// us
string
weekDay
;
string
weekDay
;
}
LogTime
;
}
LogTime
;
inline
LogTime
GetTime
()
inline
LogTime
GetTime
()
{
{
LogTime
currentTime
;
LogTime
currentTime
;
#if
(defined WIN32 || defined _WIN32)
#if(defined WIN32 || defined _WIN32)
SYSTEMTIME
systemTime
;
SYSTEMTIME
systemTime
;
GetLocalTime
(
&
systemTime
);
GetLocalTime
(
&
systemTime
);
char
temp
[
8
]
=
{
0
};
char
temp
[
8
]
=
{
0
};
sprintf
(
temp
,
"%04d"
,
systemTime
.
wYear
);
sprintf
(
temp
,
"%04d"
,
systemTime
.
wYear
);
currentTime
.
year
=
string
(
temp
);
currentTime
.
year
=
string
(
temp
);
sprintf
(
temp
,
"%02d"
,
systemTime
.
wMonth
);
sprintf
(
temp
,
"%02d"
,
systemTime
.
wMonth
);
currentTime
.
month
=
string
(
temp
);
currentTime
.
month
=
string
(
temp
);
sprintf
(
temp
,
"%02d"
,
systemTime
.
wDay
);
sprintf
(
temp
,
"%02d"
,
systemTime
.
wDay
);
currentTime
.
day
=
string
(
temp
);
currentTime
.
day
=
string
(
temp
);
sprintf
(
temp
,
"%02d"
,
systemTime
.
wHour
);
sprintf
(
temp
,
"%02d"
,
systemTime
.
wHour
);
currentTime
.
hour
=
string
(
temp
);
currentTime
.
hour
=
string
(
temp
);
sprintf
(
temp
,
"%02d"
,
systemTime
.
wMinute
);
sprintf
(
temp
,
"%02d"
,
systemTime
.
wMinute
);
currentTime
.
minute
=
string
(
temp
);
currentTime
.
minute
=
string
(
temp
);
sprintf
(
temp
,
"%02d"
,
systemTime
.
wSecond
);
sprintf
(
temp
,
"%02d"
,
systemTime
.
wSecond
);
currentTime
.
second
=
string
(
temp
);
currentTime
.
second
=
string
(
temp
);
sprintf
(
temp
,
"%03d"
,
systemTime
.
wMilliseconds
);
sprintf
(
temp
,
"%03d"
,
systemTime
.
wMilliseconds
);
currentTime
.
millisecond
=
string
(
temp
);
currentTime
.
millisecond
=
string
(
temp
);
sprintf
(
temp
,
"%d"
,
systemTime
.
wDayOfWeek
);
sprintf
(
temp
,
"%d"
,
systemTime
.
wDayOfWeek
);
currentTime
.
weekDay
=
string
(
temp
);
currentTime
.
weekDay
=
string
(
temp
);
#else
#else
struct
timeval
tv
;
struct
timeval
tv
;
struct
tm
*
p
;
struct
tm
*
p
;
gettimeofday
(
&
tv
,
NULL
);
gettimeofday
(
&
tv
,
NULL
);
p
=
localtime
(
&
tv
.
tv_sec
);
p
=
localtime
(
&
tv
.
tv_sec
);
char
temp
[
8
]
=
{
0
};
char
temp
[
8
]
=
{
0
};
sprintf
(
temp
,
"%04d"
,
1900
+
p
->
tm_year
);
sprintf
(
temp
,
"%04d"
,
1900
+
p
->
tm_year
);
currentTime
.
year
=
string
(
temp
);
currentTime
.
year
=
string
(
temp
);
sprintf
(
temp
,
"%02d"
,
1
+
p
->
tm_mon
);
sprintf
(
temp
,
"%02d"
,
1
+
p
->
tm_mon
);
currentTime
.
month
=
string
(
temp
);
currentTime
.
month
=
string
(
temp
);
sprintf
(
temp
,
"%02d"
,
p
->
tm_mday
);
sprintf
(
temp
,
"%02d"
,
p
->
tm_mday
);
currentTime
.
day
=
string
(
temp
);
currentTime
.
day
=
string
(
temp
);
sprintf
(
temp
,
"%02d"
,
p
->
tm_hour
);
sprintf
(
temp
,
"%02d"
,
p
->
tm_hour
);
currentTime
.
hour
=
string
(
temp
);
currentTime
.
hour
=
string
(
temp
);
sprintf
(
temp
,
"%02d"
,
p
->
tm_min
);
sprintf
(
temp
,
"%02d"
,
p
->
tm_min
);
currentTime
.
minute
=
string
(
temp
);
currentTime
.
minute
=
string
(
temp
);
sprintf
(
temp
,
"%02d"
,
p
->
tm_sec
);
sprintf
(
temp
,
"%02d"
,
p
->
tm_sec
);
currentTime
.
second
=
string
(
temp
);
currentTime
.
second
=
string
(
temp
);
sprintf
(
temp
,
"%03d"
,(
int
)(
tv
.
tv_usec
/
1000
));
sprintf
(
temp
,
"%03d"
,
(
int
)(
tv
.
tv_usec
/
1000
));
currentTime
.
millisecond
=
string
(
temp
);
currentTime
.
millisecond
=
string
(
temp
);
sprintf
(
temp
,
"%03d"
,
(
int
)(
tv
.
tv_usec
%
1000
));
sprintf
(
temp
,
"%03d"
,
(
int
)(
tv
.
tv_usec
%
1000
));
currentTime
.
microsecond
=
string
(
temp
);
currentTime
.
microsecond
=
string
(
temp
);
...
@@ -187,61 +184,83 @@ inline LogTime GetTime()
...
@@ -187,61 +184,83 @@ inline LogTime GetTime()
return
currentTime
;
return
currentTime
;
}
}
#define LOG_TIME(logFile) \
#define LOG_TIME(logFile) \
do\
do \
{\
{ \
LogTime currentTime=GetTime(); \
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()); \
fprintf(((logFile == NULL) ? stdout : logFile), \
}while (0)
"%s-%s-%s %s:%s:%s.%s\t", \
currentTime.year.c_str(), \
currentTime.month.c_str(), \
#define LOG_INFO(logFile,logInfo, ...) \
currentTime.day.c_str(), \
do\
currentTime.hour.c_str(), \
{\
currentTime.minute.c_str(), \
LOCK; \
currentTime.second.c_str(), \
LOG_TIME(logFile); \
currentTime.millisecond.c_str()); \
fprintf(((logFile == NULL) ? stdout : logFile), "INFO\t"); \
} while(0)
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__
#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 @
0ed76f01
...
@@ -10,9 +10,9 @@ int main()
...
@@ -10,9 +10,9 @@ int main()
// 创建分类器
// 创建分类器
migraphxSamples
::
Classifier
classifier
;
migraphxSamples
::
Classifier
classifier
;
migraphxSamples
::
InitializationParameterOfClassifier
initParamOfClassifier
;
migraphxSamples
::
InitializationParameterOfClassifier
initParamOfClassifier
;
initParamOfClassifier
.
configFilePath
=
CONFIG_FILE
;
initParamOfClassifier
.
configFilePath
=
CONFIG_FILE
;
migraphxSamples
::
ErrorCode
errorCode
=
classifier
.
Initialize
(
initParamOfClassifier
);
migraphxSamples
::
ErrorCode
errorCode
=
classifier
.
Initialize
(
initParamOfClassifier
);
if
(
errorCode
!=
migraphxSamples
::
SUCCESS
)
if
(
errorCode
!=
migraphxSamples
::
SUCCESS
)
{
{
LOG_ERROR
(
stdout
,
"fail to initialize ResNet50!
\n
"
);
LOG_ERROR
(
stdout
,
"fail to initialize ResNet50!
\n
"
);
exit
(
-
1
);
exit
(
-
1
);
...
@@ -20,33 +20,32 @@ int main()
...
@@ -20,33 +20,32 @@ int main()
LOG_INFO
(
stdout
,
"succeed to initialize ResNet50
\n
"
);
LOG_INFO
(
stdout
,
"succeed to initialize ResNet50
\n
"
);
// 读取测试图片
// 读取测试图片
cv
::
Mat
srcImage
=
cv
::
imread
(
"../Resource/Images/ImageNet_01.jpg"
,
1
);
cv
::
Mat
srcImage
=
cv
::
imread
(
"../Resource/Images/ImageNet_01.jpg"
,
1
);
// 设置batchsize
// 设置batchsize
int
batchsize
=
1
;
int
batchsize
=
1
;
std
::
vector
<
cv
::
Mat
>
srcImages
;
std
::
vector
<
cv
::
Mat
>
srcImages
;
for
(
int
i
=
0
;
i
<
batchsize
;
++
i
)
for
(
int
i
=
0
;
i
<
batchsize
;
++
i
)
{
{
srcImages
.
push_back
(
srcImage
);
srcImages
.
push_back
(
srcImage
);
}
}
// 推理
// 推理
std
::
vector
<
std
::
vector
<
migraphxSamples
::
ResultOfPrediction
>>
predictions
;
std
::
vector
<
std
::
vector
<
migraphxSamples
::
ResultOfPrediction
>>
predictions
;
classifier
.
Classify
(
srcImages
,
predictions
);
classifier
.
Classify
(
srcImages
,
predictions
);
// 获取推理结果
// 获取推理结果
LOG_INFO
(
stdout
,
"========== Classification Results ==========
\n
"
);
LOG_INFO
(
stdout
,
"========== Classification Results ==========
\n
"
);
for
(
int
i
=
0
;
i
<
predictions
.
size
();
++
i
)
for
(
int
i
=
0
;
i
<
predictions
.
size
();
++
i
)
{
{
// 一个batch中第i幅图像的结果
// 一个batch中第i幅图像的结果
LOG_INFO
(
stdout
,
"========== %d result ==========
\n
"
,
i
);
LOG_INFO
(
stdout
,
"========== %d result ==========
\n
"
,
i
);
std
::
vector
<
migraphxSamples
::
ResultOfPrediction
>
resultOfPredictions
=
predictions
[
i
];
std
::
vector
<
migraphxSamples
::
ResultOfPrediction
>
resultOfPredictions
=
predictions
[
i
];
for
(
int
j
=
0
;
j
<
resultOfPredictions
.
size
();
++
j
)
for
(
int
j
=
0
;
j
<
resultOfPredictions
.
size
();
++
j
)
{
{
migraphxSamples
::
ResultOfPrediction
prediction
=
resultOfPredictions
[
j
];
migraphxSamples
::
ResultOfPrediction
prediction
=
resultOfPredictions
[
j
];
LOG_INFO
(
stdout
,
"label:%d,confidence:%f
\n
"
,
prediction
.
label
,
prediction
.
confidence
);
LOG_INFO
(
stdout
,
"label:%d,confidence:%f
\n
"
,
prediction
.
label
,
prediction
.
confidence
);
}
}
}
}
return
0
;
return
0
;
...
...
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