| @@ -20,10 +20,14 @@ | |||||
| #include <algorithm> | #include <algorithm> | ||||
| #include "cpu.h" | #include "cpu.h" | ||||
| #ifdef __clang__ | |||||
| #pragma clang diagnostic push | #pragma clang diagnostic push | ||||
| #pragma clang diagnostic ignored "-Woverloaded-virtual" | #pragma clang diagnostic ignored "-Woverloaded-virtual" | ||||
| #endif | |||||
| #include "layer_declaration.h" | #include "layer_declaration.h" | ||||
| #ifdef __clang__ | |||||
| #pragma clang diagnostic pop | #pragma clang diagnostic pop | ||||
| #endif | |||||
| namespace ncnn { | namespace ncnn { | ||||
| @@ -106,7 +106,7 @@ int ParamDict::load_param(FILE* fp) | |||||
| int nscan = fscanf(fp, "%d", &len); | int nscan = fscanf(fp, "%d", &len); | ||||
| if (nscan != 1) | if (nscan != 1) | ||||
| { | { | ||||
| fprintf(stderr, "ParamDict read array length fail\n"); | |||||
| fprintf(stderr, "ParamDict read array length failed\n"); | |||||
| return -1; | return -1; | ||||
| } | } | ||||
| @@ -118,7 +118,7 @@ int ParamDict::load_param(FILE* fp) | |||||
| nscan = fscanf(fp, ",%15[^,\n ]", vstr); | nscan = fscanf(fp, ",%15[^,\n ]", vstr); | ||||
| if (nscan != 1) | if (nscan != 1) | ||||
| { | { | ||||
| fprintf(stderr, "ParamDict read array element fail\n"); | |||||
| fprintf(stderr, "ParamDict read array element failed\n"); | |||||
| return -1; | return -1; | ||||
| } | } | ||||
| @@ -136,7 +136,7 @@ int ParamDict::load_param(FILE* fp) | |||||
| } | } | ||||
| if (nscan != 1) | if (nscan != 1) | ||||
| { | { | ||||
| fprintf(stderr, "ParamDict parse array element fail\n"); | |||||
| fprintf(stderr, "ParamDict parse array element failed\n"); | |||||
| return -1; | return -1; | ||||
| } | } | ||||
| } | } | ||||
| @@ -147,7 +147,7 @@ int ParamDict::load_param(FILE* fp) | |||||
| int nscan = fscanf(fp, "%15s", vstr); | int nscan = fscanf(fp, "%15s", vstr); | ||||
| if (nscan != 1) | if (nscan != 1) | ||||
| { | { | ||||
| fprintf(stderr, "ParamDict read value fail\n"); | |||||
| fprintf(stderr, "ParamDict read value failed\n"); | |||||
| return -1; | return -1; | ||||
| } | } | ||||
| @@ -159,7 +159,7 @@ int ParamDict::load_param(FILE* fp) | |||||
| nscan = sscanf(vstr, "%d", ¶ms[id].i); | nscan = sscanf(vstr, "%d", ¶ms[id].i); | ||||
| if (nscan != 1) | if (nscan != 1) | ||||
| { | { | ||||
| fprintf(stderr, "ParamDict parse value fail\n"); | |||||
| fprintf(stderr, "ParamDict parse value failed\n"); | |||||
| return -1; | return -1; | ||||
| } | } | ||||
| } | } | ||||
| @@ -218,7 +218,7 @@ int ParamDict::load_param_mem(const char*& mem) | |||||
| int nscan = mem_sscanf(mem, "%d", &len); | int nscan = mem_sscanf(mem, "%d", &len); | ||||
| if (nscan != 1) | if (nscan != 1) | ||||
| { | { | ||||
| fprintf(stderr, "ParamDict read array length fail\n"); | |||||
| fprintf(stderr, "ParamDict read array length failed\n"); | |||||
| return -1; | return -1; | ||||
| } | } | ||||
| @@ -230,7 +230,7 @@ int ParamDict::load_param_mem(const char*& mem) | |||||
| nscan = mem_sscanf(mem, ",%15[^,\n ]", vstr); | nscan = mem_sscanf(mem, ",%15[^,\n ]", vstr); | ||||
| if (nscan != 1) | if (nscan != 1) | ||||
| { | { | ||||
| fprintf(stderr, "ParamDict read array element fail\n"); | |||||
| fprintf(stderr, "ParamDict read array element failed\n"); | |||||
| return -1; | return -1; | ||||
| } | } | ||||
| @@ -248,7 +248,7 @@ int ParamDict::load_param_mem(const char*& mem) | |||||
| } | } | ||||
| if (nscan != 1) | if (nscan != 1) | ||||
| { | { | ||||
| fprintf(stderr, "ParamDict parse array element fail\n"); | |||||
| fprintf(stderr, "ParamDict parse array element failed\n"); | |||||
| return -1; | return -1; | ||||
| } | } | ||||
| } | } | ||||
| @@ -259,7 +259,7 @@ int ParamDict::load_param_mem(const char*& mem) | |||||
| int nscan = mem_sscanf(mem, "%15s", vstr); | int nscan = mem_sscanf(mem, "%15s", vstr); | ||||
| if (nscan != 1) | if (nscan != 1) | ||||
| { | { | ||||
| fprintf(stderr, "ParamDict read value fail\n"); | |||||
| fprintf(stderr, "ParamDict read value failed\n"); | |||||
| return -1; | return -1; | ||||
| } | } | ||||
| @@ -271,7 +271,7 @@ int ParamDict::load_param_mem(const char*& mem) | |||||
| nscan = sscanf(vstr, "%d", ¶ms[id].i); | nscan = sscanf(vstr, "%d", ¶ms[id].i); | ||||
| if (nscan != 1) | if (nscan != 1) | ||||
| { | { | ||||
| fprintf(stderr, "ParamDict parse value fail\n"); | |||||
| fprintf(stderr, "ParamDict parse value failed\n"); | |||||
| return -1; | return -1; | ||||
| } | } | ||||
| } | } | ||||
| @@ -300,7 +300,13 @@ int ParamDict::load_param_bin(FILE* fp) | |||||
| // binary -233(EOP) | // binary -233(EOP) | ||||
| int id = 0; | int id = 0; | ||||
| fread(&id, sizeof(int), 1, fp); | |||||
| int nread; | |||||
| nread = fread(&id, sizeof(int), 1, fp); | |||||
| if (nread != 1) | |||||
| { | |||||
| fprintf(stderr, "ParamDict read magic failed %d\n", nread); | |||||
| return -1; | |||||
| } | |||||
| while (id != -233) | while (id != -233) | ||||
| { | { | ||||
| @@ -313,21 +319,41 @@ int ParamDict::load_param_bin(FILE* fp) | |||||
| if (is_array) | if (is_array) | ||||
| { | { | ||||
| int len = 0; | int len = 0; | ||||
| fread(&len, sizeof(int), 1, fp); | |||||
| nread = fread(&len, sizeof(int), 1, fp); | |||||
| if (nread != 1) | |||||
| { | |||||
| fprintf(stderr, "ParamDict read array length failed %d\n", nread); | |||||
| return -1; | |||||
| } | |||||
| params[id].v.create(len); | params[id].v.create(len); | ||||
| float* ptr = params[id].v; | float* ptr = params[id].v; | ||||
| fread(ptr, sizeof(float), len, fp); | |||||
| nread = fread(ptr, sizeof(float), len, fp); | |||||
| if (nread != len) | |||||
| { | |||||
| fprintf(stderr, "ParamDict read array element failed %d\n", nread); | |||||
| return -1; | |||||
| } | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| fread(¶ms[id].f, sizeof(float), 1, fp); | |||||
| nread = fread(¶ms[id].f, sizeof(float), 1, fp); | |||||
| if (nread != 1) | |||||
| { | |||||
| fprintf(stderr, "ParamDict read value failed %d\n", nread); | |||||
| return -1; | |||||
| } | |||||
| } | } | ||||
| params[id].loaded = 1; | params[id].loaded = 1; | ||||
| fread(&id, sizeof(int), 1, fp); | |||||
| nread = fread(&id, sizeof(int), 1, fp); | |||||
| if (nread != 1) | |||||
| { | |||||
| fprintf(stderr, "ParamDict read EOP failed %d\n", nread); | |||||
| return -1; | |||||
| } | |||||
| } | } | ||||
| return 0; | return 0; | ||||
| @@ -297,7 +297,12 @@ static bool read_mxnet_json(const char* jsonpath, std::vector<MXNetNode>& nodes) | |||||
| char line[1024]; | char line[1024]; | ||||
| //{ | //{ | ||||
| (void)fgets(line, 1024, fp); | |||||
| char* s = fgets(line, 1024, fp); | |||||
| if (!s) | |||||
| { | |||||
| fprintf(stderr, "fgets %s failed\n", jsonpath); | |||||
| return false; | |||||
| } | |||||
| MXNetNode n; | MXNetNode n; | ||||
| @@ -522,23 +527,44 @@ static bool read_mxnet_param(const char* parampath, std::vector<MXNetParam>& par | |||||
| return false; | return false; | ||||
| } | } | ||||
| int nread; | |||||
| uint64_t header; | uint64_t header; | ||||
| uint64_t reserved; | uint64_t reserved; | ||||
| fread(&header, 1, sizeof(uint64_t), fp); | |||||
| fread(&reserved, 1, sizeof(uint64_t), fp); | |||||
| nread = fread(&header, sizeof(uint64_t), 1, fp); | |||||
| if (nread != 1) | |||||
| { | |||||
| fprintf(stderr, "read header failed %d\n", nread); | |||||
| return false; | |||||
| } | |||||
| nread = fread(&reserved, sizeof(uint64_t), 1, fp); | |||||
| if (nread != 1) | |||||
| { | |||||
| fprintf(stderr, "read reserved failed %d\n", nread); | |||||
| return false; | |||||
| } | |||||
| // NDArray vec | // NDArray vec | ||||
| // each data | // each data | ||||
| uint64_t data_count; | uint64_t data_count; | ||||
| fread(&data_count, 1, sizeof(uint64_t), fp); | |||||
| nread = fread(&data_count, sizeof(uint64_t), 1, fp); | |||||
| if (nread != 1) | |||||
| { | |||||
| fprintf(stderr, "read data_count failed %d\n", nread); | |||||
| return false; | |||||
| } | |||||
| // fprintf(stderr, "data count = %d\n", (int)data_count); | // fprintf(stderr, "data count = %d\n", (int)data_count); | ||||
| for (int i = 0; i < (int)data_count; i++) | for (int i = 0; i < (int)data_count; i++) | ||||
| { | { | ||||
| uint32_t magic;// 0xF993FAC9 | uint32_t magic;// 0xF993FAC9 | ||||
| fread(&magic, 1, sizeof(uint32_t), fp); | |||||
| nread = fread(&magic, sizeof(uint32_t), 1, fp); | |||||
| if (nread != 1) | |||||
| { | |||||
| fprintf(stderr, "read magic failed %d\n", nread); | |||||
| return false; | |||||
| } | |||||
| // shape | // shape | ||||
| uint32_t ndim; | uint32_t ndim; | ||||
| @@ -547,19 +573,44 @@ static bool read_mxnet_param(const char* parampath, std::vector<MXNetParam>& par | |||||
| if (magic == 0xF993FAC9) | if (magic == 0xF993FAC9) | ||||
| { | { | ||||
| int32_t stype; | int32_t stype; | ||||
| fread(&stype, 1, sizeof(int32_t), fp); | |||||
| nread = fread(&stype, sizeof(int32_t), 1, fp); | |||||
| if (nread != 1) | |||||
| { | |||||
| fprintf(stderr, "read stype failed %d\n", nread); | |||||
| return false; | |||||
| } | |||||
| fread(&ndim, 1, sizeof(uint32_t), fp); | |||||
| nread = fread(&ndim, sizeof(uint32_t), 1, fp); | |||||
| if (nread != 1) | |||||
| { | |||||
| fprintf(stderr, "read ndim failed %d\n", nread); | |||||
| return false; | |||||
| } | |||||
| shape.resize(ndim); | shape.resize(ndim); | ||||
| fread(&shape[0], 1, ndim * sizeof(int64_t), fp); | |||||
| nread = fread(&shape[0], ndim * sizeof(int64_t), 1, fp); | |||||
| if (nread != 1) | |||||
| { | |||||
| fprintf(stderr, "read shape failed %d\n", nread); | |||||
| return false; | |||||
| } | |||||
| } | } | ||||
| else if (magic == 0xF993FAC8) | else if (magic == 0xF993FAC8) | ||||
| { | { | ||||
| fread(&ndim, 1, sizeof(uint32_t), fp); | |||||
| nread = fread(&ndim, sizeof(uint32_t), 1, fp); | |||||
| if (nread != 1) | |||||
| { | |||||
| fprintf(stderr, "read ndim failed %d\n", nread); | |||||
| return false; | |||||
| } | |||||
| shape.resize(ndim); | shape.resize(ndim); | ||||
| fread(&shape[0], 1, ndim * sizeof(int64_t), fp); | |||||
| nread = fread(&shape[0], ndim * sizeof(int64_t), 1, fp); | |||||
| if (nread != 1) | |||||
| { | |||||
| fprintf(stderr, "read shape failed %d\n", nread); | |||||
| return false; | |||||
| } | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| @@ -569,7 +620,12 @@ static bool read_mxnet_param(const char* parampath, std::vector<MXNetParam>& par | |||||
| std::vector<uint32_t> shape32; | std::vector<uint32_t> shape32; | ||||
| shape32.resize(ndim); | shape32.resize(ndim); | ||||
| fread(&shape32[0], 1, ndim * sizeof(uint32_t), fp); | |||||
| nread = fread(&shape32[0], ndim * sizeof(uint32_t), 1, fp); | |||||
| if (nread != 1) | |||||
| { | |||||
| fprintf(stderr, "read shape failed %d\n", nread); | |||||
| return false; | |||||
| } | |||||
| for (int j=0; j<(int)ndim; j++) | for (int j=0; j<(int)ndim; j++) | ||||
| { | { | ||||
| @@ -580,11 +636,26 @@ static bool read_mxnet_param(const char* parampath, std::vector<MXNetParam>& par | |||||
| // context | // context | ||||
| int32_t dev_type; | int32_t dev_type; | ||||
| int32_t dev_id; | int32_t dev_id; | ||||
| fread(&dev_type, 1, sizeof(int32_t), fp); | |||||
| fread(&dev_id, 1, sizeof(int32_t), fp); | |||||
| nread = fread(&dev_type, sizeof(int32_t), 1, fp); | |||||
| if (nread != 1) | |||||
| { | |||||
| fprintf(stderr, "read dev_type failed %d\n", nread); | |||||
| return false; | |||||
| } | |||||
| nread = fread(&dev_id, sizeof(int32_t), 1, fp); | |||||
| if (nread != 1) | |||||
| { | |||||
| fprintf(stderr, "read dev_id failed %d\n", nread); | |||||
| return false; | |||||
| } | |||||
| int32_t type_flag; | int32_t type_flag; | ||||
| fread(&type_flag, 1, sizeof(int32_t), fp); | |||||
| nread = fread(&type_flag, sizeof(int32_t), 1, fp); | |||||
| if (nread != 1) | |||||
| { | |||||
| fprintf(stderr, "read type_flag failed %d\n", nread); | |||||
| return false; | |||||
| } | |||||
| // data | // data | ||||
| size_t len = 0; | size_t len = 0; | ||||
| @@ -596,7 +667,12 @@ static bool read_mxnet_param(const char* parampath, std::vector<MXNetParam>& par | |||||
| MXNetParam p; | MXNetParam p; | ||||
| p.data.resize(len); | p.data.resize(len); | ||||
| fread(&p.data[0], 1, len * sizeof(float), fp); | |||||
| nread = fread(&p.data[0], len * sizeof(float), 1, fp); | |||||
| if (nread != 1) | |||||
| { | |||||
| fprintf(stderr, "read MXNetParam data failed %d\n", nread); | |||||
| return false; | |||||
| } | |||||
| params.push_back(p); | params.push_back(p); | ||||
| @@ -605,19 +681,34 @@ static bool read_mxnet_param(const char* parampath, std::vector<MXNetParam>& par | |||||
| // each name | // each name | ||||
| uint64_t name_count; | uint64_t name_count; | ||||
| fread(&name_count, 1, sizeof(uint64_t), fp); | |||||
| nread = fread(&name_count, sizeof(uint64_t), 1, fp); | |||||
| if (nread != 1) | |||||
| { | |||||
| fprintf(stderr, "read name_count failed %d\n", nread); | |||||
| return false; | |||||
| } | |||||
| // fprintf(stderr, "name count = %d\n", (int)name_count); | // fprintf(stderr, "name count = %d\n", (int)name_count); | ||||
| for (int i = 0; i < (int)name_count; i++) | for (int i = 0; i < (int)name_count; i++) | ||||
| { | { | ||||
| uint64_t len; | uint64_t len; | ||||
| fread(&len, 1, sizeof(uint64_t), fp); | |||||
| nread = fread(&len, sizeof(uint64_t), 1, fp); | |||||
| if (nread != 1) | |||||
| { | |||||
| fprintf(stderr, "read name length failed %d\n", nread); | |||||
| return false; | |||||
| } | |||||
| MXNetParam& p = params[i]; | MXNetParam& p = params[i]; | ||||
| p.name.resize(len); | p.name.resize(len); | ||||
| fread((char*)p.name.data(), 1, len, fp); | |||||
| nread = fread((char*)p.name.data(), len, 1, fp); | |||||
| if (nread != 1) | |||||
| { | |||||
| fprintf(stderr, "read MXNetParam name failed %d\n", nread); | |||||
| return false; | |||||
| } | |||||
| // cut leading arg: | // cut leading arg: | ||||
| if (memcmp(p.name.c_str(), "arg:", 4) == 0) | if (memcmp(p.name.c_str(), "arg:", 4) == 0) | ||||
| @@ -2117,6 +2208,10 @@ int main(int argc, char** argv) | |||||
| { | { | ||||
| int num_outputs = n.attr("num_outputs"); | int num_outputs = n.attr("num_outputs"); | ||||
| int squeeze_axis = n.attr("squeeze_axis");// TODO | int squeeze_axis = n.attr("squeeze_axis");// TODO | ||||
| if (squeeze_axis) | |||||
| { | |||||
| fprintf(stderr, "Unsupported SliceChannel squeeze_axis !\n"); | |||||
| } | |||||
| fprintf(pp, " -23300=%d", num_outputs); | fprintf(pp, " -23300=%d", num_outputs); | ||||
| for (int j=0; j<num_outputs; j++) | for (int j=0; j<num_outputs; j++) | ||||
| @@ -94,13 +94,24 @@ static int dump_param(const char* parampath, const char* parambinpath, const cha | |||||
| fprintf(ip, "#define NCNN_INCLUDE_GUARD_%s\n", include_guard_var.c_str()); | fprintf(ip, "#define NCNN_INCLUDE_GUARD_%s\n", include_guard_var.c_str()); | ||||
| fprintf(ip, "namespace %s_id {\n", param_var.c_str()); | fprintf(ip, "namespace %s_id {\n", param_var.c_str()); | ||||
| int nscan = 0; | |||||
| int magic = 0; | int magic = 0; | ||||
| fscanf(fp, "%d", &magic); | |||||
| nscan = fscanf(fp, "%d", &magic); | |||||
| if (nscan != 1) | |||||
| { | |||||
| fprintf(stderr, "read magic failed %d\n", nscan); | |||||
| return -1; | |||||
| } | |||||
| fwrite(&magic, sizeof(int), 1, mp); | fwrite(&magic, sizeof(int), 1, mp); | ||||
| int layer_count = 0; | int layer_count = 0; | ||||
| int blob_count = 0; | int blob_count = 0; | ||||
| fscanf(fp, "%d %d", &layer_count, &blob_count); | |||||
| nscan = fscanf(fp, "%d %d", &layer_count, &blob_count); | |||||
| if (nscan != 2) | |||||
| { | |||||
| fprintf(stderr, "read layer_count and blob_count failed %d\n", nscan); | |||||
| return -1; | |||||
| } | |||||
| fwrite(&layer_count, sizeof(int), 1, mp); | fwrite(&layer_count, sizeof(int), 1, mp); | ||||
| fwrite(&blob_count, sizeof(int), 1, mp); | fwrite(&blob_count, sizeof(int), 1, mp); | ||||
| @@ -110,8 +121,6 @@ static int dump_param(const char* parampath, const char* parambinpath, const cha | |||||
| int blob_index = 0; | int blob_index = 0; | ||||
| for (int i=0; i<layer_count; i++) | for (int i=0; i<layer_count; i++) | ||||
| { | { | ||||
| int nscan = 0; | |||||
| char layer_type[33]; | char layer_type[33]; | ||||
| char layer_name[257]; | char layer_name[257]; | ||||
| int bottom_count = 0; | int bottom_count = 0; | ||||
| @@ -119,7 +128,8 @@ static int dump_param(const char* parampath, const char* parambinpath, const cha | |||||
| nscan = fscanf(fp, "%32s %256s %d %d", layer_type, layer_name, &bottom_count, &top_count); | nscan = fscanf(fp, "%32s %256s %d %d", layer_type, layer_name, &bottom_count, &top_count); | ||||
| if (nscan != 4) | if (nscan != 4) | ||||
| { | { | ||||
| continue; | |||||
| fprintf(stderr, "read layer params failed %d\n", nscan); | |||||
| return -1; | |||||
| } | } | ||||
| sanitize_name(layer_name); | sanitize_name(layer_name); | ||||
| @@ -139,7 +149,8 @@ static int dump_param(const char* parampath, const char* parambinpath, const cha | |||||
| nscan = fscanf(fp, "%256s", bottom_name); | nscan = fscanf(fp, "%256s", bottom_name); | ||||
| if (nscan != 1) | if (nscan != 1) | ||||
| { | { | ||||
| continue; | |||||
| fprintf(stderr, "read bottom_name failed %d\n", nscan); | |||||
| return -1; | |||||
| } | } | ||||
| sanitize_name(bottom_name); | sanitize_name(bottom_name); | ||||
| @@ -156,7 +167,8 @@ static int dump_param(const char* parampath, const char* parambinpath, const cha | |||||
| nscan = fscanf(fp, "%256s", blob_name); | nscan = fscanf(fp, "%256s", blob_name); | ||||
| if (nscan != 1) | if (nscan != 1) | ||||
| { | { | ||||
| continue; | |||||
| fprintf(stderr, "read blob_name failed %d\n", nscan); | |||||
| return -1; | |||||
| } | } | ||||
| sanitize_name(blob_name); | sanitize_name(blob_name); | ||||
| @@ -182,13 +194,23 @@ static int dump_param(const char* parampath, const char* parambinpath, const cha | |||||
| if (is_array) | if (is_array) | ||||
| { | { | ||||
| int len = 0; | int len = 0; | ||||
| fscanf(fp, "%d", &len); | |||||
| nscan = fscanf(fp, "%d", &len); | |||||
| if (nscan != 1) | |||||
| { | |||||
| fprintf(stderr, "read array length failed %d\n", nscan); | |||||
| return -1; | |||||
| } | |||||
| fwrite(&len, sizeof(int), 1, mp); | fwrite(&len, sizeof(int), 1, mp); | ||||
| for (int j = 0; j < len; j++) | for (int j = 0; j < len; j++) | ||||
| { | { | ||||
| char vstr[16]; | char vstr[16]; | ||||
| fscanf(fp, ",%15[^,\n ]", vstr); | |||||
| nscan = fscanf(fp, ",%15[^,\n ]", vstr); | |||||
| if (nscan != 1) | |||||
| { | |||||
| fprintf(stderr, "read array element failed %d\n", nscan); | |||||
| return -1; | |||||
| } | |||||
| bool is_float = vstr_is_float(vstr); | bool is_float = vstr_is_float(vstr); | ||||
| @@ -209,7 +231,12 @@ static int dump_param(const char* parampath, const char* parambinpath, const cha | |||||
| else | else | ||||
| { | { | ||||
| char vstr[16]; | char vstr[16]; | ||||
| fscanf(fp, "%15s", vstr); | |||||
| nscan = fscanf(fp, "%15s", vstr); | |||||
| if (nscan != 1) | |||||
| { | |||||
| fprintf(stderr, "read value failed %d\n", nscan); | |||||
| return -1; | |||||
| } | |||||
| bool is_float = vstr_is_float(vstr); | bool is_float = vstr_is_float(vstr); | ||||