Skip to content

Commit 3d2f33b

Browse files
authored
BuildGraph for GoogleNet, DenseNet, ResNet, Yolo. Add MatMul_Layer, SoftMax_Layer, Reshape_Layer, BatchNormalization_Layer. Modificates for FCLayer, Flatten, Pooling, Convolution. Add universal accuracy check (#212)
1 parent be0c90f commit 3d2f33b

47 files changed

Lines changed: 7367 additions & 793 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/ci.yml

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ jobs:
2929
- uses: actions/checkout@v4
3030
with:
3131
submodules: true
32+
- name: Set binary paths
33+
id: set_binaries
34+
run: |
35+
echo "ACC_BINARY=build/bin/ACC" >> $GITHUB_OUTPUT
3236
- name: Setup ccache
3337
uses: hendrikmuhs/ccache-action@v1.2
3438
with:
@@ -59,7 +63,7 @@ jobs:
5963
with:
6064
name: mnist-${{ matrix.build_type }}${{ matrix.stats && '-stats' || '' }}
6165
path: |
62-
build/bin/ACC_MNIST*
66+
${{ steps.set_binaries.outputs.ACC_BINARY }}
6367
build/bin/opencv_libs/*
6468
build/setenv.sh
6569
- name: Test
@@ -227,7 +231,10 @@ jobs:
227231
- uses: actions/checkout@v4
228232
with:
229233
fetch-depth: 0
230-
234+
- name: Set binary path
235+
id: set_eval_binary
236+
run: |
237+
echo "EVAL_BINARY=build/bin/ACC" >> $GITHUB_OUTPUT
231238
- name: Install system dependencies
232239
run: |
233240
sudo apt-get update
@@ -274,7 +281,7 @@ jobs:
274281

275282
- name: Prepare environment
276283
run: |
277-
chmod +x build/bin/ACC_MNIST*
284+
chmod +x "${{ steps.set_eval_binary.outputs.EVAL_BINARY }}"
278285
279286
export LD_LIBRARY_PATH=$PWD/build/bin/opencv_libs:/usr/lib/x86_64-linux-gnu
280287
echo "Final LD_LIBRARY_PATH: $LD_LIBRARY_PATH"
@@ -290,12 +297,12 @@ jobs:
290297
export LD_LIBRARY_PATH=$PWD/build/bin/opencv_libs:/usr/lib/x86_64-linux-gnu
291298
echo "LD_LIBRARY_PATH: $LD_LIBRARY_PATH"
292299
293-
LD_DEBUG=files ./build/bin/ACC_MNIST* 2> ld_debug.log
300+
LD_DEBUG=files "${{ steps.set_eval_binary.outputs.EVAL_BINARY }}" --model alexnet_mnist 2> ld_debug.log
294301
echo "### Library loading debug ###"
295302
grep -i "opencv_imgcodecs" ld_debug.log
296303

297-
./build/bin/ACC_MNIST* > accuracy.txt
298-
echo "Accuracy: $(cat accuracy.txt)"
304+
"${{ steps.set_eval_binary.outputs.EVAL_BINARY }}" > accuracy.txt
305+
echo "Accuracy: $(cat accuracy.txt)"
299306

300307
- name: Update README (master only)
301308
if: github.ref == 'refs/heads/master'

app/Converters/parser_onnx.py

Lines changed: 79 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,17 @@
55
from onnx import helper, numpy_helper
66
from ultralytics import YOLO
77

8+
89
def convert_pt_to_onnx(pt_model_path, onnx_model_path=None):
910
if onnx_model_path is None:
1011
onnx_model_path = pt_model_path.replace('.pt', '.onnx')
1112

1213
model = YOLO(pt_model_path)
13-
model.export(format="onnx", dynamic=False, simplify=True)
14+
model.export(format="onnx", dynamic=False, simplify=False)
1415

1516
return onnx_model_path
1617

18+
1719
def onnx_to_json(model_path, output_json_path):
1820
if model_path.endswith('.pt'):
1921
model_path = convert_pt_to_onnx(model_path)
@@ -31,12 +33,40 @@ def onnx_to_json(model_path, output_json_path):
3133
}
3234

3335
layer_info = []
36+
37+
input_info = {}
38+
for input in model.graph.input:
39+
if input.name in initializers_dict:
40+
continue
41+
42+
shape = []
43+
for dim in input.type.tensor_type.shape.dim:
44+
if dim.HasField('dim_value'):
45+
# 0 означает динамическую размерность в ONNX
46+
shape.append(dim.dim_value if dim.dim_value != 0 else -1)
47+
elif dim.HasField('dim_param'):
48+
# Обрабатываем именованные параметры размерностей
49+
shape.append(-1) # или можно сохранить как строку: dim.dim_param
50+
else:
51+
shape.append(-1) # неизвестная размерность
52+
53+
input_info = {
54+
"name": input.name,
55+
"shape": shape,
56+
"data_type": input.type.tensor_type.elem_type
57+
}
58+
break
59+
3460
input_layer = {
3561
"index": 0,
36-
"name": "input_1",
62+
"name": input_info.get("name", "input_1"),
3763
"type": "InputLayer",
3864
"weights": [],
39-
"attributes": {}
65+
"bias": [],
66+
"attributes": {
67+
"shape": input_info.get("shape", []),
68+
"data_type": input_info.get("data_type", 1)
69+
}
4070
}
4171
layer_info.append(input_layer)
4272

@@ -45,9 +75,14 @@ def onnx_to_json(model_path, output_json_path):
4575
"index": len(layer_info),
4676
"name": node.name.replace('/', '_'),
4777
"type": node.op_type,
48-
"attributes": {}
78+
"attributes": {},
79+
"inputs": []
4980
}
5081

82+
for input_name in node.input:
83+
if input_name not in initializers_dict:
84+
layer_data["inputs"].append(input_name.replace('/', '_'))
85+
5186
for attr in node.attribute:
5287
attr_value = helper.get_attribute_value(attr)
5388
if isinstance(attr_value, TensorProto):
@@ -67,29 +102,44 @@ def onnx_to_json(model_path, output_json_path):
67102
elif attr.name == "strides":
68103
layer_data["strides"] = attr_value
69104

70-
node_init = []
71-
for input_name in node.input:
72-
if input_name in initializers_dict:
73-
node_init.append(initializers_dict[input_name])
74-
75-
if len(node_init) == 1:
76-
init = node_init[0]
77-
if len(init["dims"]) == 0 or (len(init["dims"]) == 1 and init["dims"][0] == 1):
78-
layer_data["value"] = init["values"] if len(init["dims"]) == 0 else init["values"][0]
79-
else:
80-
layer_data["weights"] = init["values"]
81-
elif len(node_init) > 1:
82-
weights = []
83-
for init in node_init[:-1]:
84-
if len(init["dims"]) > 0:
85-
weights.extend(init["values"]) if isinstance(init["values"][0], list) else weights.append(
86-
init["values"])
87-
88-
if weights:
89-
layer_data["weights"] = weights
90-
91-
if len(node_init[-1]["dims"]) == 1:
92-
layer_data["bias"] = node_init[-1]["values"]
105+
if node.op_type == "BatchNormalization":
106+
bn_params = []
107+
for input_name in node.input:
108+
if input_name in initializers_dict:
109+
bn_params.append(initializers_dict[input_name])
110+
111+
if len(bn_params) >= 4:
112+
layer_data["scale"] = bn_params[0]["values"]
113+
layer_data["bias"] = bn_params[1]["values"]
114+
layer_data["mean"] = bn_params[2]["values"]
115+
layer_data["var"] = bn_params[3]["values"]
116+
117+
layer_data["weights"] = []
118+
119+
else:
120+
node_init = []
121+
for input_name in node.input:
122+
if input_name in initializers_dict:
123+
node_init.append(initializers_dict[input_name])
124+
125+
if len(node_init) == 1:
126+
init = node_init[0]
127+
if len(init["dims"]) == 0 or (len(init["dims"]) == 1 and init["dims"][0] == 1):
128+
layer_data["value"] = init["values"] if len(init["dims"]) == 0 else init["values"][0]
129+
else:
130+
layer_data["weights"] = init["values"]
131+
elif len(node_init) > 1:
132+
weights = []
133+
for init in node_init[:-1]:
134+
if len(init["dims"]) > 0:
135+
weights.extend(init["values"]) if isinstance(init["values"][0], list) else weights.append(
136+
init["values"])
137+
138+
if weights:
139+
layer_data["weights"] = weights
140+
141+
if len(node_init[-1]["dims"]) == 1:
142+
layer_data["bias"] = node_init[-1]["values"]
93143

94144
layer_info.append(layer_data)
95145

@@ -116,7 +166,7 @@ def default(self, obj):
116166

117167
BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
118168

119-
MODEL_PATH = os.path.join(BASE_DIR, 'docs\\models', 'yolo11x-cls.pt')
120-
MODEL_DATA_PATH = os.path.join(BASE_DIR, 'docs\\jsons', 'yolo11x-cls_onnx_model.json')
169+
MODEL_PATH = os.path.join(BASE_DIR, 'docs\\models', 'resnest101e_Opset16.onnx')
170+
MODEL_DATA_PATH = os.path.join(BASE_DIR, 'docs\\jsons', 'resnest101e_Opset16_onnx_model.json')
121171

122172
onnx_to_json(MODEL_PATH, MODEL_DATA_PATH)

app/Graph/CMakeLists.txt

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ target_include_directories(BuildGraph PUBLIC ${CMAKE_SOURCE_DIR}/3rdparty/Json/i
1818
add_executable(Graph_Build graph_build.cpp)
1919
target_link_libraries(Graph_Build BuildGraph)
2020

21-
add_executable(ACC_MNIST acc_check_mnist.cpp)
22-
target_link_libraries(ACC_MNIST BuildGraph)
21+
add_executable(ACC acc_check.cpp)
22+
target_link_libraries(ACC BuildGraph)
2323

2424
if (NOT CMAKE_BUILD_TYPE)
2525
set(CMAKE_BUILD_TYPE "Debug")
@@ -33,24 +33,41 @@ if (WIN32)
3333
endif()
3434

3535
if (WIN32)
36-
add_custom_command(TARGET ACC_MNIST POST_BUILD
36+
if ("${CMAKE_BUILD_TYPE}" STREQUAL "DEBUG")
37+
set(CMAKE_BUILD_TYPE "Debug")
38+
endif()
39+
if ("${CMAKE_BUILD_TYPE}" STREQUAL "RELEASE")
40+
set(CMAKE_BUILD_TYPE "Release")
41+
endif()
42+
add_custom_command(TARGET ACC POST_BUILD
3743
COMMAND ${CMAKE_COMMAND} -E copy_directory
3844
"${OPENCV_BUILD_DIR}/bin/."
3945
"${CMAKE_BINARY_DIR}/bin/")
4046
endif()
4147

4248
file(DOWNLOAD
4349
"https://raw.githubusercontent.com/DeepTrackAI/MNIST_dataset/main/mnist/test/1_000008.png"
44-
"${CMAKE_SOURCE_DIR}/docs/input/test1.png"
50+
"${CMAKE_SOURCE_DIR}/docs/input/28/test1.png"
4551
SHOW_PROGRESS
4652
STATUS status_code
4753
LOG log_file
4854
)
4955

50-
add_definitions(-DIMAGE1_PATH="${CMAKE_SOURCE_DIR}/docs/input/")
56+
file(DOWNLOAD
57+
"blob:https://ru.pinterest.com/63b88674-b4a6-4ef3-85b2-ab57ef7bb8e7"
58+
"${CMAKE_SOURCE_DIR}/docs/input/Imagenet_test/tench.png"
59+
SHOW_PROGRESS
60+
STATUS status_code
61+
LOG log_file
62+
)
63+
64+
add_definitions(-DIMAGE28_PATH="${CMAKE_SOURCE_DIR}/docs/input/28/")
65+
add_definitions(-DIMAGENET_ACC="${CMAKE_SOURCE_DIR}/docs/ImageNet/test/")
66+
add_definitions(-DIMAGENET_PATH="${CMAKE_SOURCE_DIR}/docs/input/Imagenet_test/")
5167
add_definitions(-DMODEL_PATH_H5="${CMAKE_SOURCE_DIR}/docs/jsons/model_data_alexnet_1.json")
5268
add_definitions(-DMODEL_PATH_GOOGLENET_ONNX="${CMAKE_SOURCE_DIR}/docs/jsons/googlenet_onnx_model.json")
5369
add_definitions(-DMODEL_PATH_DENSENET_ONNX="${CMAKE_SOURCE_DIR}/docs/jsons/densenet121_Opset16_onnx_model.json")
5470
add_definitions(-DMODEL_PATH_RESNET_ONNX="${CMAKE_SOURCE_DIR}/docs/jsons/resnest101e_Opset16_onnx_model.json")
5571
add_definitions(-DMODEL_PATH_YOLO11NET_ONNX="${CMAKE_SOURCE_DIR}/docs/jsons/yolo11x-cls_onnx_model.json")
72+
add_definitions(-DIMAGENET_LABELS="${CMAKE_SOURCE_DIR}/docs/imagenet1000_clsidx_to_labels.json")
5673
add_definitions(-DMNIST_PATH="${CMAKE_SOURCE_DIR}/docs/mnist/mnist/test")

0 commit comments

Comments
 (0)