Keras 모델( .h5)을 onnx로 변환 및 OpenCV DNN에서 사용하기Deep Learning & Machine Learning/강좌&예제 코드2023. 10. 10. 22:31
Table of Contents
반응형
Keras 모델( .h5)을 onnx로 변환한 후, OpenCV DNN에서 onnx 모델을 사용해서 추론을 해봅니다.
2022. 10. 25 최초작성
1. MNIST 데이터셋에 대한 모델을 학습시켜 h5 모델 파일로 저장합니다.
코드 출처 https://www.tensorflow.org/tutorials/quickstart/beginner?hl=ko
import tensorflow as tf mnist = tf.keras.datasets.mnist (x_train, y_train), (x_test, y_test) = mnist.load_data() x_train, x_test = x_train / 255.0, x_test / 255.0 model = tf.keras.models.Sequential([ tf.keras.layers.Flatten(input_shape=(28, 28)), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dropout(0.2), tf.keras.layers.Dense(10, activation='softmax') ]) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) model.fit(x_train, y_train, epochs=10) model.evaluate(x_test, y_test, verbose=2) # 모델을 저장합니다. model.save('mnist.h5') |
Epoch 1/10 1875/1875 [==============================] - 15s 5ms/step - loss: 0.2943 - accuracy: 0.9141 Epoch 2/10 1875/1875 [==============================] - 9s 5ms/step - loss: 0.1393 - accuracy: 0.9585 Epoch 3/10 1875/1875 [==============================] - 9s 5ms/step - loss: 0.1059 - accuracy: 0.9674 Epoch 4/10 1875/1875 [==============================] - 9s 5ms/step - loss: 0.0883 - accuracy: 0.9729 Epoch 5/10 1875/1875 [==============================] - 16s 8ms/step - loss: 0.0745 - accuracy: 0.9767 Epoch 6/10 1875/1875 [==============================] - 16s 9ms/step - loss: 0.0670 - accuracy: 0.9786 Epoch 7/10 1875/1875 [==============================] - 13s 7ms/step - loss: 0.0597 - accuracy: 0.9807 Epoch 8/10 1875/1875 [==============================] - 13s 7ms/step - loss: 0.0522 - accuracy: 0.9833 Epoch 9/10 1875/1875 [==============================] - 15s 8ms/step - loss: 0.0486 - accuracy: 0.9838 Epoch 10/10 1875/1875 [==============================] - 15s 8ms/step - loss: 0.0429 - accuracy: 0.9859 313/313 - 4s - loss: 0.0797 - accuracy: 0.9779 - 4s/epoch - 11ms/step |
2. h5 모델 파일을 onnx 모델 파일로 변환합니다.
참고 https://onnxruntime.ai/docs/tutorials/tf-get-started.html
우선 tf2onnx 패키지를 설치해야 합니다.
pip install tf2onnx
다음 코드에서 h5 모델 파일을 pb 모델 파일로 변환 한후, 다시 onnx 모델 파일로 변환합니다.
# h5 to pb import tensorflow as tf model = tf.keras.models.load_model('mnist.h5', compile=False) model.save('./model', save_format="tf") # pb to onnx import os os.system('python -m tf2onnx.convert --saved-model ./model/ --output model.onnx --opset 13') |
3. OpenCV DNN을 사용하여 onnx 모델로 추론을 해봅니다.
참고 https://jeanvitor.com/how-to-load-pytorch-models-with-opencv/
import cv2 import numpy as np import tensorflow as tf onnx_model_path = "model.onnx" net = cv2.dnn.readNetFromONNX(onnx_model_path) mnist = tf.keras.datasets.mnist (x_train, y_train), (x_test, y_test) = mnist.load_data() # 정규화를 해주면 안됩니다. # x_train, x_test = x_train / 255.0, x_test / 255.0 for index in range(5): blob = cv2.dnn.blobFromImage(x_test[index], # 추론할 입력 이미지입니다. 1.0 / 255, # 학습할때 이미지의 픽셀값을 255로 나누어 정규화 했습니다. (28, 28), # 이미지 크기입니다. (0, 0, 0), swapRB=True, # BGR 또는 RGB인지에 따라 설정합니다. 흑백에선 상관없습니다. crop=False) net.setInput(blob) preds = net.forward() biggest_pred_index = np.array(preds)[0].argmax() print ("예측 ",biggest_pred_index, ' 정답 ', y_test[index]) |
실행 결과 모델을 사용하여 예측한 값과 실제 정답이 출력됩니다.
예측 7 정답 7 예측 2 정답 2 예측 1 정답 1 예측 0 정답 0 예측 4 정답 4 |
반응형
'Deep Learning & Machine Learning > 강좌&예제 코드' 카테고리의 다른 글
미분으로 곡선의 노이즈 양 측정하는 파이썬 예제코드 (0) | 2023.10.18 |
---|---|
데이터셋을 일정비율로 분리하는 : train_test_split 예제 (0) | 2023.10.17 |
Matplotlib로 정규 분포 그려보기 (0) | 2023.10.09 |
faiss 사용법 및 예제 코드 (0) | 2023.10.07 |
multiclass classification 클래스별로 ROC curve 그리기 (4) | 2022.03.14 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
@webnautes :: 멈춤보단 천천히라도
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!