Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
magicwindyyd
mindspore
提交
40dced5d
M
mindspore
项目概览
magicwindyyd
/
mindspore
与 Fork 源项目一致
Fork自
MindSpore / mindspore
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
M
mindspore
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
40dced5d
编写于
8月 19, 2020
作者:
M
mindspore-ci-bot
提交者:
Gitee
8月 19, 2020
浏览文件
操作
浏览文件
下载
差异文件
!4651 fix bug
Merge pull request !4651 from 徐安越/master
上级
b63b6bed
5a66ab15
变更
14
隐藏空白更改
内联
并排
Showing
14 changed file
with
300 addition
and
80 deletion
+300
-80
mindspore/lite/schema/model.fbs
mindspore/lite/schema/model.fbs
+1
-0
mindspore/lite/schema/ops.fbs
mindspore/lite/schema/ops.fbs
+13
-1
mindspore/lite/tools/benchmark/benchmark.cc
mindspore/lite/tools/benchmark/benchmark.cc
+18
-2
mindspore/lite/tools/converter/parser/caffe/CMakeLists.txt
mindspore/lite/tools/converter/parser/caffe/CMakeLists.txt
+2
-27
mindspore/lite/tools/converter/parser/caffe/caffe_conv_base_parser.cc
...te/tools/converter/parser/caffe/caffe_conv_base_parser.cc
+16
-29
mindspore/lite/tools/converter/parser/caffe/caffe_conv_base_parser.h
...ite/tools/converter/parser/caffe/caffe_conv_base_parser.h
+1
-3
mindspore/lite/tools/converter/parser/caffe/caffe_convolution_parser.cc
.../tools/converter/parser/caffe/caffe_convolution_parser.cc
+23
-8
mindspore/lite/tools/converter/parser/caffe/caffe_deconvolution_parser.cc
...ools/converter/parser/caffe/caffe_deconvolution_parser.cc
+26
-9
mindspore/lite/tools/converter/parser/caffe/caffe_node_parser.h
...ore/lite/tools/converter/parser/caffe/caffe_node_parser.h
+1
-0
mindspore/lite/tools/converter/parser/caffe/caffe_proposal_parser.cc
...ite/tools/converter/parser/caffe/caffe_proposal_parser.cc
+67
-0
mindspore/lite/tools/converter/parser/caffe/caffe_proposal_parser.h
...lite/tools/converter/parser/caffe/caffe_proposal_parser.h
+36
-0
mindspore/lite/tools/converter/parser/caffe/caffe_tile_parser.cc
...re/lite/tools/converter/parser/caffe/caffe_tile_parser.cc
+55
-0
mindspore/lite/tools/converter/parser/caffe/caffe_tile_parser.h
...ore/lite/tools/converter/parser/caffe/caffe_tile_parser.h
+36
-0
mindspore/lite/tools/converter/parser/tflite/tflite_tile_parser.cc
.../lite/tools/converter/parser/tflite/tflite_tile_parser.cc
+5
-1
未找到文件。
mindspore/lite/schema/model.fbs
浏览文件 @
40dced5d
...
...
@@ -194,6 +194,7 @@ union PrimitiveType {
Return,
MakeTuple,
ToFormat,
Proposal,
}
enum QuantType: int {
...
...
mindspore/lite/schema/ops.fbs
浏览文件 @
40dced5d
...
...
@@ -578,6 +578,7 @@ table ExpandDims {
table Tile {
multiples: [int];
dims: [int];
}
table Cast {
...
...
@@ -885,4 +886,15 @@ table ToFormat {
}
table Return {
}
\ No newline at end of file
}
table Proposal {
feat_stride : float;
base_size : float;
min_size : float;
ratio : [float];
scale : [float];
pre_nms_topn : int;
post_nms_topn : int;
nms_thresh : float;
}
mindspore/lite/tools/benchmark/benchmark.cc
浏览文件 @
40dced5d
...
...
@@ -98,10 +98,15 @@ int Benchmark::ReadInputFile() {
MS_ASSERT
(
cur_tensor
!=
nullptr
);
size_t
size
;
char
*
binBuf
=
ReadFile
(
_flags
->
input_data_list
[
i
].
c_str
(),
&
size
);
if
(
binBuf
==
nullptr
)
{
MS_LOG
(
ERROR
)
<<
"ReadFile return nullptr"
;
return
RET_ERROR
;
}
auto
tensorDataSize
=
cur_tensor
->
Size
();
if
(
size
!=
tensorDataSize
)
{
std
::
cerr
<<
"Input binary file size error, required: %zu, in fact: %zu"
<<
tensorDataSize
<<
size
<<
std
::
endl
;
MS_LOG
(
ERROR
)
<<
"Input binary file size error, required: %zu, in fact: %zu"
<<
tensorDataSize
<<
size
;
std
::
cerr
<<
"Input binary file size error, required: %zu, in fact: %zu"
<<
tensorDataSize
<<
size
<<
std
::
endl
;
MS_LOG
(
ERROR
)
<<
"Input binary file size error, required: "
<<
tensorDataSize
<<
", in fact: "
<<
size
;
return
RET_ERROR
;
}
auto
inputData
=
cur_tensor
->
MutableData
();
...
...
@@ -508,6 +513,17 @@ int Benchmark::Init() {
MS_LOG
(
INFO
)
<<
"WarmUpLoopCount = "
<<
this
->
_flags
->
warmUpLoopCount
;
MS_LOG
(
INFO
)
<<
"NumThreads = "
<<
this
->
_flags
->
numThreads
;
MS_LOG
(
INFO
)
<<
"calibDataPath = "
<<
this
->
_flags
->
calibDataPath
;
if
(
this
->
_flags
->
loopCount
<
1
)
{
MS_LOG
(
ERROR
)
<<
"LoopCount:"
<<
this
->
_flags
->
loopCount
<<
" must be greater than 0"
;
return
RET_ERROR
;
}
if
(
this
->
_flags
->
numThreads
<
1
)
{
MS_LOG
(
ERROR
)
<<
"numThreads:"
<<
this
->
_flags
->
numThreads
<<
" must be greater than 0"
;
return
RET_ERROR
;
}
if
(
this
->
_flags
->
cpuBindMode
==
-
1
)
{
MS_LOG
(
INFO
)
<<
"cpuBindMode = MID_CPU"
;
}
else
if
(
this
->
_flags
->
cpuBindMode
==
1
)
{
...
...
mindspore/lite/tools/converter/parser/caffe/CMakeLists.txt
浏览文件 @
40dced5d
add_library
(
caffe_parser_mid OBJECT
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe.pb.cc
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_argmax_parser.cc
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_argmax_parser.h
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_batchnorm_parser.cc
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_batchnorm_parser.h
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_concat_parser.cc
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_concat_parser.h
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_conv_base_parser.cc
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_conv_base_parser.h
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_converter.cc
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_converter.h
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_convolution_parser.cc
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_convolution_parser.h
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_crop_parser.cc
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_crop_parser.h
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_deconvolution_parser.cc
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_deconvolution_parser.h
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_eltwise_parser.cc
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_eltwise_parser.h
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_flatten_parser.cc
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_flatten_parser.h
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_innerproduct_parser.cc
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_innerproduct_parser.h
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_inspector.cc
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_inspector.h
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_model_parser.cc
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_model_parser.h
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_node_parser.cc
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_node_parser.h
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_node_parser_registry.cc
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_node_parser_registry.h
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_parse_utils.cc
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_parse_utils.h
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_pooling_parser.cc
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_pooling_parser.h
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_power_parser.cc
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_power_parser.h
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_prelu_parser.cc
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_prelu_parser.h
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_relu_parser.cc
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_relu_parser.h
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_reshape_parser.cc
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_reshape_parser.h
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_scale_parser.cc
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_scale_parser.h
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_sigmoid_parser.cc
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_sigmoid_parser.h
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_softmax_parser.cc
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_softmax_parser.h
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_inspector.cc
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_inspector.h
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_interp_parser.cc
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_interp_parser.h
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_permute_parser.cc
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_permute_parser.h
)
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_tile_parser.cc
${
CMAKE_CURRENT_SOURCE_DIR
}
/caffe_proposal_parser.cc
)
mindspore/lite/tools/converter/parser/caffe/caffe_conv_base_parser.cc
浏览文件 @
40dced5d
...
...
@@ -14,8 +14,8 @@
* limitations under the License.
*/
#include "tools/converter/parser/caffe/caffe_conv_base_parser.h"
#include <algorithm>
#include "mindspore/lite/tools/converter/parser/caffe/caffe_conv_base_parser.h"
const
uint32_t
PAD_DEFAULT_VALUE
=
0
;
const
uint32_t
STRIDE_DEFAULT_VALUE
=
1
;
...
...
@@ -35,7 +35,7 @@ STATUS CaffeConvBaseParser::ParsePads(const caffe::ConvolutionParameter &convPar
*/
if
(
convParam
.
has_pad_h
()
||
convParam
.
has_pad_w
())
{
if
(
convParam
.
pad_size
()
!=
0
)
{
// MS_LOGE("Either pad or pad_h/w should be specified; not both")
;
MS_LOG
(
ERROR
)
<<
"Either pad or pad_h/w should be specified; not both"
;
return
RET_ERROR
;
}
...
...
@@ -76,11 +76,11 @@ STATUS CaffeConvBaseParser::ParsePads(const caffe::ConvolutionParameter &convPar
STATUS
CaffeConvBaseParser
::
ParseStrides
(
const
caffe
::
ConvolutionParameter
&
convParam
,
std
::
vector
<
int64_t
>
*
stride
)
{
if
(
convParam
.
has_stride_h
()
||
convParam
.
has_stride_w
())
{
if
(
convParam
.
stride_size
()
!=
0
)
{
// MS_LOGE("Either stride or stride_h/w should be specified; not both")
;
MS_LOG
(
ERROR
)
<<
"Either stride or stride_h/w should be specified; not both"
;
return
RET_ERROR
;
}
if
(
!
convParam
.
has_stride_h
()
||
!
convParam
.
has_stride_w
())
{
// MS_LOGE("stride_h/w must appear at the same time!")
;
MS_LOG
(
ERROR
)
<<
"stride_h/w must appear at the same time!"
;
return
RET_ERROR
;
}
(
*
stride
)[
0
]
=
convParam
.
stride_h
();
...
...
@@ -120,14 +120,14 @@ STATUS CaffeConvBaseParser::ParseDilations(const caffe::ConvolutionParameter &co
STATUS
CaffeConvBaseParser
::
ParseKernels
(
const
caffe
::
ConvolutionParameter
&
convParam
,
std
::
vector
<
int64_t
>
*
kernel
)
{
if
(
convParam
.
has_kernel_h
()
||
convParam
.
has_kernel_w
())
{
if
(
convParam
.
kernel_size_size
()
!=
0
)
{
// MS_LOGE("Either kernel_size or kernel_h/w should be specified; not both.")
MS_LOG
(
ERROR
)
<<
"Either kernel_size or kernel_h/w should be specified; not both."
;
return
RET_ERROR
;
}
if
(
convParam
.
has_kernel_h
()
&&
convParam
.
has_kernel_w
())
{
(
*
kernel
)[
0
]
=
convParam
.
kernel_h
();
(
*
kernel
)[
1
]
=
convParam
.
kernel_w
();
}
else
{
// MS_LOGE("kernel_h/w must appear at the same time!")
;
MS_LOG
(
ERROR
)
<<
"kernel_h/w must appear at the same time!"
;
return
RET_ERROR
;
}
}
else
if
(
convParam
.
kernel_size_size
()
!=
0
)
{
...
...
@@ -157,40 +157,27 @@ int CaffeConvBaseParser::ParseGroup(const caffe::ConvolutionParameter &convParam
return
group
;
}
int
CaffeConvBaseParser
::
ParseChannelIn
(
const
caffe
::
LayerParameter
&
proto
,
const
int
&
group
)
{
int
res
=
0
;
auto
&
weightBlob
=
proto
.
blobs
(
0
);
if
(
weightBlob
.
has_shape
())
{
res
=
weightBlob
.
shape
().
dim
(
1
)
*
group
;
}
else
{
// get shape information from Blob parameters(caffe proto v1)
if
(
proto
.
type
()
==
"Deconvolution"
)
{
res
=
weightBlob
.
num
()
*
group
;
}
else
{
res
=
weightBlob
.
channels
()
*
group
;
}
}
return
res
;
}
int
CaffeConvBaseParser
::
ParseChannelOut
(
const
caffe
::
ConvolutionParameter
&
convParam
)
{
int
CaffeConvBaseParser
::
ParseChannelOut
(
const
caffe
::
ConvolutionParameter
&
convParam
,
int32_t
*
channelOut
)
{
MS_ASSERT
(
channelOut
!=
nullptr
);
if
(
!
convParam
.
has_num_output
())
{
// MS_LOGE("Parse num_output for failed.");
MS_LOG
(
ERROR
)
<<
"Parse num_output for failed."
;
return
RET_ERROR
;
}
return
convParam
.
num_output
();
*
channelOut
=
convParam
.
num_output
();
return
RET_OK
;
}
STATUS
CaffeConvBaseParser
::
ParseWeight
(
const
caffe
::
LayerParameter
&
weight
,
std
::
vector
<
schema
::
TensorT
*>
*
weightVec
)
{
// Layer must have Filter
if
(
weight
.
blobs_size
()
==
0
)
{
// MS_LOGE("No filter data in layer %s", weight.name().c_str()
);
MS_LOG
(
ERROR
)
<<
"No filter data in layer "
<<
weight
.
name
().
c_str
(
);
return
RET_ERROR
;
}
auto
filter
=
ConvertWeight
(
weight
.
blobs
(
0
));
if
(
filter
==
nullptr
)
{
// MS_LOGE("Convert weight for layer %s failed", weight.name().c_str())
;
MS_LOG
(
ERROR
)
<<
"Convert weight for layer "
<<
weight
.
name
().
c_str
()
<<
" failed"
;
return
RET_ERROR
;
}
weightVec
->
push_back
(
filter
);
...
...
@@ -200,13 +187,13 @@ STATUS CaffeConvBaseParser::ParseWeight(const caffe::LayerParameter &weight,
if
(
convParam
.
bias_term
()
&&
weight
.
blobs_size
()
>
1
)
{
auto
bias
=
ConvertWeight
(
weight
.
blobs
(
1
));
if
(
bias
==
nullptr
)
{
// MS_LOGE("Convert bias for layer %s failed", weight.name().c_str())
;
MS_LOG
(
ERROR
)
<<
"Convert bias for layer "
<<
weight
.
name
().
c_str
()
<<
" failed"
;
return
RET_ERROR
;
}
std
::
vector
<
int32_t
>
shape
=
bias
->
dims
;
if
(
shape
.
size
()
!=
CAFFE_CONV_BIAS_DIM_NUM
)
{
// MS_LOGE("Bias dim-num of layer %s is not supported")
;
MS_LOG
(
ERROR
)
<<
"Bias dim-num of layer "
<<
weight
.
name
().
c_str
()
<<
" is not supported"
;
return
RET_ERROR
;
}
weightVec
->
push_back
(
bias
);
...
...
mindspore/lite/tools/converter/parser/caffe/caffe_conv_base_parser.h
浏览文件 @
40dced5d
...
...
@@ -40,9 +40,7 @@ class CaffeConvBaseParser {
int
ParseGroup
(
const
caffe
::
ConvolutionParameter
&
convParam
,
const
std
::
string
&
layerType
);
int
ParseChannelOut
(
const
caffe
::
ConvolutionParameter
&
convParam
);
int
ParseChannelIn
(
const
caffe
::
LayerParameter
&
proto
,
const
int
&
group
);
int
ParseChannelOut
(
const
caffe
::
ConvolutionParameter
&
convParam
,
int32_t
*
channelOut
);
STATUS
ParseWeight
(
const
caffe
::
LayerParameter
&
weight
,
std
::
vector
<
schema
::
TensorT
*>
*
weightVec
);
};
...
...
mindspore/lite/tools/converter/parser/caffe/caffe_convolution_parser.cc
浏览文件 @
40dced5d
...
...
@@ -16,6 +16,7 @@
#include <memory>
#include "mindspore/lite/tools/converter/parser/caffe/caffe_convolution_parser.h"
#include "utils/log_adapter.h"
namespace
mindspore
{
namespace
lite
{
...
...
@@ -62,7 +63,8 @@ STATUS CaffeConvolutionParser::Parse(const caffe::LayerParameter &proto, const c
std
::
vector
<
int64_t
>
pad
(
4
,
0
);
auto
status
=
convParser
.
ParsePads
(
convParam
,
&
pad
);
if
(
status
!=
RET_OK
)
{
// MS_LOGE("ParsePads for %s failed", proto.name().c_str());
MS_LOG
(
ERROR
)
<<
"ParsePads for "
<<
proto
.
name
().
c_str
()
<<
" failed"
;
return
RET_ERROR
;
}
attr
->
padUp
=
pad
[
0
];
attr
->
padDown
=
pad
[
1
];
...
...
@@ -73,7 +75,8 @@ STATUS CaffeConvolutionParser::Parse(const caffe::LayerParameter &proto, const c
std
::
vector
<
int64_t
>
stride
(
2
,
0
);
status
=
convParser
.
ParseStrides
(
convParam
,
&
stride
);
if
(
status
!=
RET_OK
)
{
// MS_LOGE("ParseStrides for %s failed", proto.name().c_str());
MS_LOG
(
ERROR
)
<<
"ParseStrides for "
<<
proto
.
name
().
c_str
()
<<
" failed"
;
return
RET_ERROR
;
}
attr
->
strideH
=
stride
[
0
];
attr
->
strideW
=
stride
[
1
];
...
...
@@ -82,7 +85,8 @@ STATUS CaffeConvolutionParser::Parse(const caffe::LayerParameter &proto, const c
std
::
vector
<
int64_t
>
dilation
(
2
,
0
);
status
=
convParser
.
ParseDilations
(
convParam
,
&
dilation
);
if
(
status
!=
RET_OK
)
{
// MS_LOGE("ParseDilations for %s failed", proto.name().c_str());
MS_LOG
(
ERROR
)
<<
"ParseDilations for "
<<
proto
.
name
().
c_str
()
<<
" failed"
;
return
RET_ERROR
;
}
attr
->
dilateH
=
dilation
[
0
];
attr
->
dilateW
=
dilation
[
1
];
...
...
@@ -91,15 +95,26 @@ STATUS CaffeConvolutionParser::Parse(const caffe::LayerParameter &proto, const c
std
::
vector
<
int64_t
>
kernel
(
2
,
0
);
status
=
convParser
.
ParseKernels
(
convParam
,
&
kernel
);
if
(
status
!=
RET_OK
)
{
// MS_LOGE("ParseKernels for %s failed", proto.name().c_str());
MS_LOG
(
ERROR
)
<<
"ParseKernels for "
<<
proto
.
name
().
c_str
()
<<
" failed"
;
return
RET_ERROR
;
}
attr
->
kernelH
=
kernel
[
0
];
attr
->
kernelW
=
kernel
[
1
];
attr
->
hasBias
=
convParam
.
bias_term
();
attr
->
group
=
convParser
.
ParseGroup
(
convParam
,
proto
.
type
());
attr
->
channelOut
=
convParser
.
ParseChannelOut
(
convParam
);
attr
->
channelIn
=
convParser
.
ParseChannelIn
(
weight
,
attr
->
group
);
auto
ret
=
convParser
.
ParseChannelOut
(
convParam
,
&
(
attr
->
channelOut
));
if
(
ret
!=
RET_OK
)
{
MS_LOG
(
ERROR
)
<<
"conv channel out failed"
;
return
RET_ERROR
;
}
auto
&
weightBlob
=
weight
.
blobs
(
0
);
if
(
weightBlob
.
has_shape
())
{
attr
->
channelIn
=
weightBlob
.
shape
().
dim
(
1
)
*
attr
->
group
;
}
else
{
// get shape information from Blob parameters(caffe proto v1)
attr
->
channelIn
=
weightBlob
.
channels
()
*
attr
->
group
;
}
attr
->
padMode
=
schema
::
PadMode_CAFFE
;
op
->
primitive
=
std
::
make_unique
<
schema
::
PrimitiveT
>
();
op
->
primitive
->
value
.
type
=
schema
::
PrimitiveType_Conv2D
;
...
...
@@ -108,9 +123,9 @@ STATUS CaffeConvolutionParser::Parse(const caffe::LayerParameter &proto, const c
ParseGroupConvolution
(
op
,
attr
);
status
=
convParser
.
ParseWeight
(
weight
,
weightVec
);
if
(
status
!=
RET_OK
)
{
// MS_LOGE("ParseWeight for %s failed", proto.name().c_str())
;
MS_LOG
(
ERROR
)
<<
"ParseWeight for "
<<
proto
.
name
().
c_str
()
<<
" failed"
;
}
return
RET_OK
;
return
status
;
}
CaffeNodeRegistrar
g_caffeConvolutionParser
(
"Convolution"
,
new
CaffeConvolutionParser
());
...
...
mindspore/lite/tools/converter/parser/caffe/caffe_deconvolution_parser.cc
浏览文件 @
40dced5d
...
...
@@ -26,7 +26,7 @@ void CaffeDeconvolutionParser::ParseGroupDeconvolution(schema::CNodeT *op, schem
std
::
unique_ptr
<
schema
::
DeDepthwiseConv2DT
>
deDepthwiseConv2DParam
(
new
schema
::
DeDepthwiseConv2DT
());
if
(
deDepthwiseConv2DParam
==
nullptr
)
{
// MS_LOGW("new DeDepthwiseConv2DT failed")
;
MS_LOG
(
ERROR
)
<<
"new DeDepthwiseConv2DT failed"
;
return
;
}
deDepthwiseConv2DParam
->
format
=
attr
->
format
;
...
...
@@ -61,7 +61,8 @@ STATUS CaffeDeconvolutionParser::Parse(const caffe::LayerParameter &proto, const
std
::
vector
<
int64_t
>
pad
(
4
,
0
);
auto
status
=
convParser
.
ParsePads
(
convParam
,
&
pad
);
if
(
status
!=
RET_OK
)
{
// MS_LOGE("ParsePads for %s failed", proto.name().c_str());
MS_LOG
(
ERROR
)
<<
"ParsePads for "
<<
proto
.
name
().
c_str
()
<<
" failed"
;
return
RET_ERROR
;
}
attr
->
padUp
=
pad
[
0
];
attr
->
padDown
=
pad
[
1
];
...
...
@@ -72,7 +73,8 @@ STATUS CaffeDeconvolutionParser::Parse(const caffe::LayerParameter &proto, const
std
::
vector
<
int64_t
>
stride
(
2
,
0
);
status
=
convParser
.
ParseStrides
(
convParam
,
&
stride
);
if
(
status
!=
RET_OK
)
{
// MS_LOGE("ParseStrides for %s failed", proto.name().c_str());
MS_LOG
(
ERROR
)
<<
"ParseStrides for "
<<
proto
.
name
().
c_str
()
<<
" failed"
;
return
RET_ERROR
;
}
attr
->
strideH
=
stride
[
0
];
attr
->
strideW
=
stride
[
1
];
...
...
@@ -81,7 +83,8 @@ STATUS CaffeDeconvolutionParser::Parse(const caffe::LayerParameter &proto, const
std
::
vector
<
int64_t
>
dilation
(
2
,
0
);
status
=
convParser
.
ParseDilations
(
convParam
,
&
dilation
);
if
(
status
!=
RET_OK
)
{
// MS_LOGE("ParseDilations for %s failed", proto.name().c_str());
MS_LOG
(
ERROR
)
<<
"ParseDilations for "
<<
proto
.
name
().
c_str
()
<<
" failed"
;
return
RET_ERROR
;
}
attr
->
dilateH
=
dilation
[
0
];
attr
->
dilateW
=
dilation
[
1
];
...
...
@@ -90,15 +93,29 @@ STATUS CaffeDeconvolutionParser::Parse(const caffe::LayerParameter &proto, const
std
::
vector
<
int64_t
>
kernel
(
2
,
0
);
status
=
convParser
.
ParseKernels
(
convParam
,
&
kernel
);
if
(
status
!=
RET_OK
)
{
// MS_LOGE("ParseKernels for %s failed", proto.name().c_str());
MS_LOG
(
ERROR
)
<<
"ParseKernels for "
<<
proto
.
name
().
c_str
()
<<
" failed"
;
return
RET_ERROR
;
}
attr
->
kernelH
=
kernel
[
0
];
attr
->
kernelW
=
kernel
[
1
];
attr
->
hasBias
=
convParam
.
bias_term
();
attr
->
group
=
convParser
.
ParseGroup
(
convParam
,
proto
.
type
());
attr
->
channelOut
=
convParser
.
ParseChannelOut
(
convParam
);
attr
->
channelIn
=
convParser
.
ParseChannelIn
(
weight
,
attr
->
group
);
auto
ret
=
convParser
.
ParseChannelOut
(
convParam
,
&
(
attr
->
channelOut
));
if
(
ret
!=
RET_OK
)
{
MS_LOG
(
ERROR
)
<<
"deconv channel get failed"
;
return
RET_ERROR
;
}
auto
&
weightBlob
=
weight
.
blobs
(
0
);
if
(
weightBlob
.
has_shape
())
{
if
(
attr
->
group
==
1
)
attr
->
channelIn
=
weightBlob
.
shape
().
dim
(
0
)
*
attr
->
group
;
else
attr
->
channelIn
=
weightBlob
.
shape
().
dim
(
1
)
*
attr
->
group
;
}
else
{
// get shape information from Blob parameters(caffe proto v1)
attr
->
channelIn
=
weightBlob
.
num
()
*
attr
->
group
;
}
attr
->
padMode
=
schema
::
PadMode_CAFFE
;
op
->
primitive
=
std
::
make_unique
<
schema
::
PrimitiveT
>
();
op
->
primitive
->
value
.
type
=
schema
::
PrimitiveType_DeConv2D
;
...
...
@@ -106,9 +123,9 @@ STATUS CaffeDeconvolutionParser::Parse(const caffe::LayerParameter &proto, const
ParseGroupDeconvolution
(
op
,
attr
);
status
=
convParser
.
ParseWeight
(
weight
,
weightVec
);
if
(
status
!=
RET_OK
)
{
// MS_LOGE("ParseWeight for %s failed", proto.name().c_str())
;
MS_LOG
(
ERROR
)
<<
"ParseWeight for "
<<
proto
.
name
().
c_str
()
<<
" failed"
;
}
return
RET_OK
;
return
status
;
}
CaffeNodeRegistrar
g_caffeDeconvolutionParser
(
"Deconvolution"
,
new
CaffeDeconvolutionParser
());
...
...
mindspore/lite/tools/converter/parser/caffe/caffe_node_parser.h
浏览文件 @
40dced5d
...
...
@@ -24,6 +24,7 @@
#include "tools/converter/parser/caffe/caffe.pb.h"
#include "mindspore/lite/tools/converter/parser/caffe/caffe_node_parser.h"
#include "include/errorcode.h"
#include "utils/log_adapter.h"
namespace
mindspore
{
namespace
lite
{
...
...
mindspore/lite/tools/converter/parser/caffe/caffe_proposal_parser.cc
0 → 100644
浏览文件 @
40dced5d
/**
* Copyright 2020 Huawei Technologies Co., Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <memory>
#include <vector>
#include "mindspore/lite/tools/converter/parser/caffe/caffe_proposal_parser.h"
namespace
mindspore
{
namespace
lite
{
STATUS
CaffeProposalParser
::
Parse
(
const
caffe
::
LayerParameter
&
proto
,
const
caffe
::
LayerParameter
&
weight
,
schema
::
CNodeT
*
op
,
std
::
vector
<
schema
::
TensorT
*>
*
weightVec
)
{
std
::
unique_ptr
<
schema
::
ProposalT
>
attr
(
new
schema
::
ProposalT
());
const
caffe
::
ProposalParameter
proposal_param
=
proto
.
proposal_param
();
if
(
proposal_param
.
has_feat_stride
())
{
attr
->
feat_stride
=
proposal_param
.
feat_stride
();
}
if
(
proposal_param
.
has_base_size
())
{
attr
->
base_size
=
proposal_param
.
base_size
();
}
if
(
proposal_param
.
has_min_size
())
{
attr
->
min_size
=
proposal_param
.
min_size
();
}
if
(
proposal_param
.
has_pre_nms_topn
())
{
attr
->
pre_nms_topn
=
proposal_param
.
pre_nms_topn
();
}
if
(
proposal_param
.
has_post_nms_topn
())
{
attr
->
post_nms_topn
=
proposal_param
.
post_nms_topn
();
}
if
(
proposal_param
.
has_nms_thresh
())
{
attr
->
nms_thresh
=
proposal_param
.
nms_thresh
();
}
const
int
num_ratio
=
proposal_param
.
ratio_size
();
attr
->
ratio
.
resize
(
num_ratio
);
for
(
int
i
=
0
;
i
<
num_ratio
;
++
i
)
{
attr
->
ratio
[
i
]
=
proposal_param
.
ratio
(
i
);
}
const
int
num_scale
=
proposal_param
.
scale_size
();
attr
->
scale
.
resize
(
num_scale
);
for
(
int
i
=
0
;
i
<
num_scale
;
++
i
)
{
attr
->
scale
[
i
]
=
proposal_param
.
scale
(
i
);
}
op
->
primitive
=
std
::
make_unique
<
schema
::
PrimitiveT
>
();
op
->
primitive
->
value
.
value
=
attr
.
release
();
op
->
primitive
->
value
.
type
=
schema
::
PrimitiveType_Tile
;
return
RET_OK
;
}
CaffeNodeRegistrar
g_caffeProposalParser
(
"Proposal"
,
new
CaffeProposalParser
());
}
// namespace lite
}
// namespace mindspore
mindspore/lite/tools/converter/parser/caffe/caffe_proposal_parser.h
0 → 100644
浏览文件 @
40dced5d
/**
* Copyright 2020 Huawei Technologies Co., Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef LITE_CAFFE_PROPOSAL_PARSER_H
#define LITE_CAFFE_PROPOSAL_PARSER_H
#include <vector>
#include "mindspore/lite/tools/converter/parser/caffe/caffe_node_parser.h"
#include "mindspore/lite/tools/converter/parser/caffe/caffe_node_parser_registry.h"
namespace
mindspore
{
namespace
lite
{
class
CaffeProposalParser
:
public
CaffeNodeParser
{
public:
CaffeProposalParser
()
:
CaffeNodeParser
(
"proposal"
)
{}
STATUS
Parse
(
const
caffe
::
LayerParameter
&
proto
,
const
caffe
::
LayerParameter
&
weight
,
schema
::
CNodeT
*
op
,
std
::
vector
<
schema
::
TensorT
*>
*
weightVec
)
override
;
};
}
// namespace lite
}
// namespace mindspore
#endif // LITE_CAFFE_PROPOSAL_PARSER_H
mindspore/lite/tools/converter/parser/caffe/caffe_tile_parser.cc
0 → 100644
浏览文件 @
40dced5d
/**
* Copyright 2020 Huawei Technologies Co., Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <memory>
#include <vector>
#include "mindspore/lite/tools/converter/parser/caffe/caffe_tile_parser.h"
namespace
mindspore
{
namespace
lite
{
STATUS
CaffeTileParser
::
Parse
(
const
caffe
::
LayerParameter
&
proto
,
const
caffe
::
LayerParameter
&
weight
,
schema
::
CNodeT
*
op
,
std
::
vector
<
schema
::
TensorT
*>
*
weightVec
)
{
std
::
unique_ptr
<
schema
::
TileT
>
attr
(
new
schema
::
TileT
());
const
caffe
::
TileParameter
tile_param
=
proto
.
tile_param
();
std
::
vector
<
int
>
dims
;
std
::
vector
<
int
>
multiples
;
dims
.
clear
();
multiples
.
clear
();
if
(
tile_param
.
has_axis
())
{
dims
.
push_back
(
tile_param
.
axis
());
}
else
{
dims
.
push_back
(
1
);
}
if
(
tile_param
.
has_tiles
())
{
multiples
.
push_back
(
tile_param
.
tiles
());
}
else
{
multiples
.
push_back
(
1
);
}
attr
->
dims
=
dims
;
attr
->
multiples
=
multiples
;
op
->
primitive
=
std
::
make_unique
<
schema
::
PrimitiveT
>
();
op
->
primitive
->
value
.
value
=
attr
.
release
();
op
->
primitive
->
value
.
type
=
schema
::
PrimitiveType_Tile
;
return
RET_OK
;
}
CaffeNodeRegistrar
g_caffeTileParser
(
"Tile"
,
new
CaffeTileParser
());
}
// namespace lite
}
// namespace mindspore
mindspore/lite/tools/converter/parser/caffe/caffe_tile_parser.h
0 → 100644
浏览文件 @
40dced5d
/**
* Copyright 2020 Huawei Technologies Co., Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef LITE_CAFFE_TILE_PARSER_H
#define LITE_CAFFE_TILE_PARSER_H
#include <vector>
#include "mindspore/lite/tools/converter/parser/caffe/caffe_node_parser.h"
#include "mindspore/lite/tools/converter/parser/caffe/caffe_node_parser_registry.h"
namespace
mindspore
{
namespace
lite
{
class
CaffeTileParser
:
public
CaffeNodeParser
{
public:
CaffeTileParser
()
:
CaffeNodeParser
(
"tile"
)
{}
STATUS
Parse
(
const
caffe
::
LayerParameter
&
proto
,
const
caffe
::
LayerParameter
&
weight
,
schema
::
CNodeT
*
op
,
std
::
vector
<
schema
::
TensorT
*>
*
weightVec
)
override
;
};
}
// namespace lite
}
// namespace mindspore
#endif // LITE_CAFFE_TILE_PARSER_H
mindspore/lite/tools/converter/parser/tflite/tflite_tile_parser.cc
浏览文件 @
40dced5d
...
...
@@ -47,7 +47,11 @@ STATUS TfliteTileParser::Parse(const std::unique_ptr<tflite::OperatorT> &tflite_
MS_LOG
(
ERROR
)
<<
"get tile -> multiples failed"
;
return
RET_ERROR
;
}
std
::
vector
<
int
>
dims
(
attr
->
multiples
.
size
(),
0
);
for
(
int
i
=
0
;
i
<
dims
.
size
();
++
i
)
{
dims
[
i
]
=
i
;
}
attr
->
dims
=
dims
;
op
->
primitive
->
value
.
type
=
schema
::
PrimitiveType_Tile
;
op
->
primitive
->
value
.
value
=
attr
.
release
();
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录