지난 포스트 '[딥러닝] Keras 모델을 TensorFlow.js로 가져오기'에서 이어진다.
이번에는 웹캠을 연결해서 가져온 모델을 사용해보려고 한다.
성공을 기원하며 시작~!
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@2.0.0/dist/tf.min.js"></script>
<script type="text/javascript" src="https://unpkg.com/webcam-easy/dist/webcam-easy.min.js"></script>
<script type="module">
const webcamElement = document.getElementById('webcam');
const canvasElement = document.getElementById('canvas');
const snapBtn = document.getElementById("btn-capture");
const predictBtn = document.getElementById("btn-predict");
const webcam = new Webcam(webcamElement, 'user', canvasElement);
webcam.start()
.then(result =>{
console.log("webcam started");
})
.catch(err => {
console.log(err);
});
snapBtn.onclick = async () => {
// const base_model = VGG16(weights='imagenet', include_top=False, input_shape=(224,224,3))
const picture = webcam.snap()
const model = await tf.loadLayersModel('./tfjsmodel/model.json')
let myFaceImage = tf.browser.fromPixels(webcamElement)
myFaceImage = tf.image.resizeBilinear(myFaceImage, [244,244])
myFaceImage = tf.expandDims(myFaceImage, 0)
x_features = base_model.predict(myFaceImage)
const prediction = model.predict(x_features)//.strides.findIndex(ele => ele==1)
const predictionArray = prediction.dataSync()
console.log("prediction", prediction)
const maxValue = predictionArray.indexOf(Math.max(...predictionArray))
}
</script>
처음에는 그냥 .html 파일을 눌러서(로컬) 열었었다. 하지만 CORS policy error가 나타났다.
해결방법
로컬에서 CORS policy 관련 에러가 발생하는 이유
npm install http-server -g
npx http-server
아래 사진과 같은 오류가 났는데 이는 입력값의 형태가 맞지 않아서 오류일 것이라고 예상했다.
따라서 기존 test 코드에서와 동일하게 vgg16을 거치고 형태를 동일하게 해줘야한다고 생각했다.
참고
https://stackoverflow.com/questions/55295671/uncaught-in-promise-error-provided-weight-data-has-no-target-variable-block1
https://github.com/tensorflow/tfjs/issues/755
https://blogmepost.com/47547/Uncaught-promise-provided-weight-variable-block1_conv1_2#gsc.tab=0
VGG16의 import가 필요한 상황
두번째 오류에서 연결되는 VGG16의 import 오류
import keras
import tensorflowjs as TFJS
vgg16 = keras.applications.vgg16.VGG16()
TFJS.converters.save_keras_model(vgg16, "test_tensorflowjs/tfjsmodel/vgg16")
Python 환경에서는 성공했지만 TensorFlow.js로 돌아오니 여전히 같은 오류가 났다.
Error: Provided weight data has no target variable: