반응형

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



반응형

진행해본 결과물을 기록 및 공유하는 공간입니다.
잘못된 부분이나 개선점을 알려주시면 반영하겠습니다.


소스코드 복사시 하단에 있는 앵커 광고의 왼쪽 위를 클릭하여 닫은 후 해야 합니다.


문제가 생기면 포스트와 바뀐 환경이 있나 먼저 확인해보세요.
질문을 남겨주면 가능한 빨리 답변드립니다.


제가 쓴 책도 한번 검토해보세요 ^^

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기

댓글을 달아 주세요

TistoryWhaleSkin3.4">