Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Greenplum
Opencv
提交
dc24663e
O
Opencv
项目概览
Greenplum
/
Opencv
11 个月 前同步成功
通知
7
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
O
Opencv
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
dc24663e
编写于
3月 06, 2021
作者:
A
Alexander Alekhin
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #19641 from LupusSanctus:am/tf_reshape
上级
d2cc63e7
7894cd3c
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
66 addition
and
14 deletion
+66
-14
modules/dnn/src/tensorflow/tf_importer.cpp
modules/dnn/src/tensorflow/tf_importer.cpp
+56
-14
modules/dnn/test/test_tf_importer.cpp
modules/dnn/test/test_tf_importer.cpp
+10
-0
未找到文件。
modules/dnn/src/tensorflow/tf_importer.cpp
浏览文件 @
dc24663e
...
...
@@ -295,6 +295,22 @@ DataLayout getDataLayout(
return
it
!=
data_layouts
.
end
()
?
it
->
second
:
DATA_LAYOUT_UNKNOWN
;
}
static
bool
hasAllOnes
(
const
Mat
&
inputs
,
int
startPos
,
int
endPos
)
{
CV_CheckLE
(
inputs
.
dims
,
2
,
""
);
CV_CheckGE
(
startPos
,
0
,
""
);
CV_CheckLE
(
startPos
,
endPos
,
""
);
CV_CheckLT
((
size_t
)
endPos
,
inputs
.
total
(),
""
);
for
(
int
i
=
startPos
;
i
<
endPos
;
i
++
)
{
if
(
inputs
.
at
<
int
>
(
i
)
!=
1
||
inputs
.
at
<
int
>
(
i
)
!=
-
1
)
return
false
;
}
return
true
;
}
void
setStrides
(
LayerParams
&
layerParams
,
const
tensorflow
::
NodeDef
&
layer
)
{
if
(
hasLayerAttr
(
layer
,
"strides"
))
...
...
@@ -490,6 +506,9 @@ protected:
std
::
map
<
String
,
Mat
>
sharedWeights
;
std
::
map
<
String
,
int
>
layer_id
;
private:
void
addPermuteLayer
(
const
int
*
order
,
const
std
::
string
&
permName
,
Pin
&
inpId
);
};
TFImporter
::
TFImporter
(
Net
&
net
,
const
char
*
model
,
const
char
*
config
)
...
...
@@ -895,6 +914,17 @@ void TFImporter::populateNet()
CV_LOG_DEBUG
(
NULL
,
"DNN/TF: ===================== Import completed ====================="
);
}
void
TFImporter
::
addPermuteLayer
(
const
int
*
order
,
const
std
::
string
&
permName
,
Pin
&
inpId
)
{
LayerParams
permLP
;
permLP
.
set
(
"order"
,
DictValue
::
arrayInt
<
const
int
*>
(
order
,
4
));
CV_Assert
(
layer_id
.
find
(
permName
)
==
layer_id
.
end
());
int
permId
=
dstNet
.
addLayer
(
permName
,
"Permute"
,
permLP
);
layer_id
[
permName
]
=
permId
;
connect
(
layer_id
,
dstNet
,
inpId
,
permId
,
0
);
inpId
=
Pin
(
permName
);
}
void
TFImporter
::
parseNode
(
const
tensorflow
::
NodeDef
&
layer_
)
{
tensorflow
::
NodeDef
layer
=
layer_
;
...
...
@@ -1276,37 +1306,49 @@ void TFImporter::parseNode(const tensorflow::NodeDef& layer_)
if
(
value_id
.
find
(
layer
.
input
(
1
))
!=
value_id
.
end
())
{
Mat
newShape
=
getTensorContent
(
getConstBlob
(
layer
,
value_id
,
1
));
if
(
newShape
.
total
()
==
4
)
int
newShapeSize
=
newShape
.
total
();
bool
hasSwap
=
false
;
if
(
newShapeSize
==
4
&&
hasAllOnes
(
newShape
,
0
,
2
))
{
// NHWC->NCHW
std
::
swap
(
*
newShape
.
ptr
<
int32_t
>
(
0
,
2
),
*
newShape
.
ptr
<
int32_t
>
(
0
,
3
));
std
::
swap
(
*
newShape
.
ptr
<
int32_t
>
(
0
,
1
),
*
newShape
.
ptr
<
int32_t
>
(
0
,
2
));
hasSwap
=
true
;
}
if
(
inpLayout
==
DATA_LAYOUT_NHWC
)
{
if
(
newShape
.
total
()
!=
4
||
newShape
.
at
<
int
>
(
1
)
==
1
)
if
(
newShape
Size
>=
2
||
newShape
.
at
<
int
>
(
1
)
==
1
)
{
LayerParams
permLP
;
int
order
[]
=
{
0
,
2
,
3
,
1
};
// From OpenCV's NCHW to NHWC.
permLP
.
set
(
"order"
,
DictValue
::
arrayInt
<
int
*>
(
order
,
4
)
);
std
::
string
permName
=
name
+
"/nchw"
;
CV_Assert
(
layer_id
.
find
(
permName
)
==
layer_id
.
end
())
;
int
permId
=
dstNet
.
addLayer
(
permName
,
"Permute"
,
permLP
);
layer_id
[
permName
]
=
permId
;
connect
(
layer_id
,
dstNet
,
inpId
,
permId
,
0
);
inpId
=
Pin
(
permName
)
;
inpLayout
=
DATA_LAYOUT_NCHW
;
addPermuteLayer
(
order
,
name
+
"/nhwc"
,
inpId
);
if
(
newShapeSize
<
4
)
{
inpLayout
=
DATA_LAYOUT_NCHW
;
}
else
{
inpLayout
=
DATA_LAYOUT_NHWC
;
}
}
}
layerParams
.
set
(
"dim"
,
DictValue
::
arrayInt
<
int
*>
(
newShape
.
ptr
<
int
>
(),
newShape
.
total
()
));
layerParams
.
set
(
"dim"
,
DictValue
::
arrayInt
<
int
*>
(
newShape
.
ptr
<
int
>
(),
newShape
Size
));
int
id
=
dstNet
.
addLayer
(
name
,
"Reshape"
,
layerParams
);
layer_id
[
name
]
=
id
;
// one input only
connect
(
layer_id
,
dstNet
,
inpId
,
id
,
0
);
data_layouts
[
name
]
=
newShape
.
total
()
==
2
?
DATA_LAYOUT_PLANAR
:
inpLayout
;
inpId
=
Pin
(
name
);
if
((
inpLayout
==
DATA_LAYOUT_NHWC
||
inpLayout
==
DATA_LAYOUT_UNKNOWN
||
inpLayout
==
DATA_LAYOUT_PLANAR
)
&&
newShapeSize
==
4
&&
!
hasSwap
)
{
int
order
[]
=
{
0
,
3
,
1
,
2
};
// Transform back to OpenCV's NCHW.
addPermuteLayer
(
order
,
name
+
"/nchw"
,
inpId
);
inpLayout
=
DATA_LAYOUT_NCHW
;
}
data_layouts
[
name
]
=
newShapeSize
==
2
?
DATA_LAYOUT_PLANAR
:
inpLayout
;
}
else
{
...
...
modules/dnn/test/test_tf_importer.cpp
浏览文件 @
dc24663e
...
...
@@ -457,6 +457,16 @@ TEST_P(Test_TensorFlow_layers, unfused_flatten)
runTensorFlowNet
(
"unfused_flatten_unknown_batch"
);
}
TEST_P
(
Test_TensorFlow_layers
,
reshape_layer
)
{
runTensorFlowNet
(
"reshape_layer"
);
}
TEST_P
(
Test_TensorFlow_layers
,
reshape_nchw
)
{
runTensorFlowNet
(
"reshape_nchw"
);
}
TEST_P
(
Test_TensorFlow_layers
,
leaky_relu
)
{
#if defined(INF_ENGINE_RELEASE) && INF_ENGINE_VER_MAJOR_EQ(2018050000)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录