mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-11-21 10:55:51 +02:00
libavfilter/dnn: add header into native model file
Signed-off-by: Guo, Yejun <yejun.guo@intel.com> Signed-off-by: Pedro Arthur <bygrandao@gmail.com>
This commit is contained in:
parent
3b3150c45f
commit
022f50d3fe
@ -64,6 +64,10 @@ static DNNReturnType set_input_output_native(void *model, DNNInputData *input, c
|
|||||||
DNNModel *ff_dnn_load_model_native(const char *model_filename)
|
DNNModel *ff_dnn_load_model_native(const char *model_filename)
|
||||||
{
|
{
|
||||||
DNNModel *model = NULL;
|
DNNModel *model = NULL;
|
||||||
|
char header_expected[] = "FFMPEGDNNNATIVE";
|
||||||
|
char *buf;
|
||||||
|
size_t size;
|
||||||
|
int version, header_size, major_version_expected = 0;
|
||||||
ConvolutionalNetwork *network = NULL;
|
ConvolutionalNetwork *network = NULL;
|
||||||
AVIOContext *model_file_context;
|
AVIOContext *model_file_context;
|
||||||
int file_size, dnn_size, kernel_size, i;
|
int file_size, dnn_size, kernel_size, i;
|
||||||
@ -84,6 +88,41 @@ DNNModel *ff_dnn_load_model_native(const char *model_filename)
|
|||||||
}
|
}
|
||||||
file_size = avio_size(model_file_context);
|
file_size = avio_size(model_file_context);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* check file header with string and version
|
||||||
|
*/
|
||||||
|
size = sizeof(header_expected);
|
||||||
|
buf = av_malloc(size);
|
||||||
|
if (!buf) {
|
||||||
|
avio_closep(&model_file_context);
|
||||||
|
av_freep(&model);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// size - 1 to skip the ending '\0' which is not saved in file
|
||||||
|
avio_get_str(model_file_context, size - 1, buf, size);
|
||||||
|
dnn_size = size - 1;
|
||||||
|
if (strncmp(buf, header_expected, size) != 0) {
|
||||||
|
av_freep(&buf);
|
||||||
|
avio_closep(&model_file_context);
|
||||||
|
av_freep(&model);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
av_freep(&buf);
|
||||||
|
|
||||||
|
version = (int32_t)avio_rl32(model_file_context);
|
||||||
|
dnn_size += 4;
|
||||||
|
if (version != major_version_expected) {
|
||||||
|
avio_closep(&model_file_context);
|
||||||
|
av_freep(&model);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// currently no need to check minor version
|
||||||
|
version = (int32_t)avio_rl32(model_file_context);
|
||||||
|
dnn_size += 4;
|
||||||
|
header_size = dnn_size;
|
||||||
|
|
||||||
network = av_mallocz(sizeof(ConvolutionalNetwork));
|
network = av_mallocz(sizeof(ConvolutionalNetwork));
|
||||||
if (!network){
|
if (!network){
|
||||||
avio_closep(&model_file_context);
|
avio_closep(&model_file_context);
|
||||||
@ -95,8 +134,8 @@ DNNModel *ff_dnn_load_model_native(const char *model_filename)
|
|||||||
avio_seek(model_file_context, file_size - 8, SEEK_SET);
|
avio_seek(model_file_context, file_size - 8, SEEK_SET);
|
||||||
network->layers_num = (int32_t)avio_rl32(model_file_context);
|
network->layers_num = (int32_t)avio_rl32(model_file_context);
|
||||||
network->operands_num = (int32_t)avio_rl32(model_file_context);
|
network->operands_num = (int32_t)avio_rl32(model_file_context);
|
||||||
dnn_size = 8;
|
dnn_size += 8;
|
||||||
avio_seek(model_file_context, 0, SEEK_SET);
|
avio_seek(model_file_context, header_size, SEEK_SET);
|
||||||
|
|
||||||
network->layers = av_mallocz(network->layers_num * sizeof(Layer));
|
network->layers = av_mallocz(network->layers_num * sizeof(Layer));
|
||||||
if (!network->layers){
|
if (!network->layers){
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
import tensorflow as tf
|
import tensorflow as tf
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import sys, struct
|
import sys, struct
|
||||||
|
import convert_header as header
|
||||||
|
|
||||||
__all__ = ['convert_from_tensorflow']
|
__all__ = ['convert_from_tensorflow']
|
||||||
|
|
||||||
@ -229,6 +230,8 @@ class TFConverter:
|
|||||||
|
|
||||||
def dump_to_file(self):
|
def dump_to_file(self):
|
||||||
with open(self.outfile, 'wb') as f:
|
with open(self.outfile, 'wb') as f:
|
||||||
|
f.write(header.str.encode('utf-8'))
|
||||||
|
np.array([header.major, header.minor], dtype=np.uint32).tofile(f)
|
||||||
self.dump_layers_to_file(f)
|
self.dump_layers_to_file(f)
|
||||||
self.dump_operands_to_file(f)
|
self.dump_operands_to_file(f)
|
||||||
np.array([self.layer_number, len(self.name_operand_dict)], dtype=np.uint32).tofile(f)
|
np.array([self.layer_number, len(self.name_operand_dict)], dtype=np.uint32).tofile(f)
|
||||||
|
26
tools/python/convert_header.py
Normal file
26
tools/python/convert_header.py
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
# Copyright (c) 2019
|
||||||
|
#
|
||||||
|
# This file is part of FFmpeg.
|
||||||
|
#
|
||||||
|
# FFmpeg is free software; you can redistribute it and/or
|
||||||
|
# modify it under the terms of the GNU Lesser General Public
|
||||||
|
# License as published by the Free Software Foundation; either
|
||||||
|
# version 2.1 of the License, or (at your option) any later version.
|
||||||
|
#
|
||||||
|
# FFmpeg is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
# Lesser General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Lesser General Public
|
||||||
|
# License along with FFmpeg; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
# ==============================================================================
|
||||||
|
|
||||||
|
str = 'FFMPEGDNNNATIVE'
|
||||||
|
|
||||||
|
# increase major and reset minor when we have to re-convert the model file
|
||||||
|
major = 0
|
||||||
|
|
||||||
|
# increase minor when we don't have to re-convert the model file
|
||||||
|
minor = 1
|
Loading…
Reference in New Issue
Block a user