Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

get celebrity name in keras-vggface based on index in tensorflowjs #90

Open
ahmadbadpey opened this issue Feb 1, 2023 · 0 comments
Open

Comments

@ahmadbadpey
Copy link

I'm using face-api.js Javascript API to develop a web app that user uploads her/his picture and we want to detect faces in the picture.

On the other hand I used VGGface 16 model json formatted to predict that user uploaded image is similar to which celebrity.

following are my javascript codes:

const MODEL_URL = '../faceapi_models'
Promise.all([
    faceapi.nets.ssdMobilenetv1.loadFromUri(MODEL_URL),
    faceapi.nets.faceRecognitionNet.loadFromUri(MODEL_URL),
])
    .then((val) => {
        console.log('val')
    })
    .catch((err) => {
        console.log(err)
    })

let model

async function loadModel() {
    model = await tf.loadLayersModel('../web_model/vgg_model.json');
}

loadModel()
    .then((val) => {
        console.log('Model is Loaded');
    })
    .catch((err) => {
        console.log('Model Not Load : ' + err)
    })

let croppedImage = null;
const user_pic = document.getElementById('user_pic')
const preview = document.getElementById('preview')
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');

window.onload = function () {
    canvas.width = preview.width;
    canvas.height = preview.height;
    ctx.drawImage(preview, 0, 0);
};

preview.onclick = () => user_pic.click()

   
user_pic.addEventListener('change', () => {
    const reader = new FileReader()
    reader.onload = (e) => {
        const img = new Image();
        img.onload = function () {
            canvas.width = img.width;
            canvas.height = img.height;
            ctx.drawImage(img, 0, 0);
        };
        img.src = e.target.result;
    }
    reader.readAsDataURL(user_pic.files[0]);

    detectFaces(user_pic.files[0])
})


async function detectFaces(input) {
    let imgURL = URL.createObjectURL(input)
    const imgElement = new Image()
    imgElement.src = imgURL

    const results = await faceapi.detectAllFaces(imgElement)
        .then(results => {

            if (Array.isArray(results) && results.forEach) {
                results.forEach(result => {
                    // console.log(result)
                    const {x, y, width, height} = result.box;
                    const xInt = Math.floor(x);
                    const yInt = Math.floor(y);
                    const widthInt = Math.floor(width);
                    const heightInt = Math.floor(height);
    
                    const crop = ctx.getImageData(xInt, yInt, widthInt, heightInt);
                    croppedImage = new ImageData(crop.data, widthInt, heightInt);

                    const input = tf.browser.fromPixels(croppedImage);

                    const resizedImage = tf.image.resizeBilinear(input, [224, 224]);
                    const inputTensor = resizedImage.expandDims(0);

                    // Make predictions
                  model.predict(inputTensor).data()
                      .then(predictions =>{
                          const predictionsArray = Array.from(predictions)
                          const celebrityIndex = predictionsArray.indexOf(Math.max(...predictionsArray));
                          console.log(celebrityIndex)

                          /*const celebrityName = classNames[celebrityIndex] || 'Unknown';
                          console.log(celebrityName);*/
                          //Display the results
                          /*const resultDisplay = document.getElementById('result');
                          resultDisplay.innerHTML = `Most similar celebrity: ${celebrityName}`;*/

                      });

                });
            } else {
                console.error('Results is not an array or does not have a forEach function.');
            }
        });
}

All things work fine and I get index of predicted celebrity. but now I do not know how to get name of that celebrity.

in python example code we use utils.decode_predictions method like this :

predict = vggface.predict(samples)
print(predict)

output = utils.decode_predictions(predict)
print(output)

# for result in output[0]:
#     print('%s: %.3f%%' % (result[0], result[1]*100))
prediction = output[0][0][0].replace("b'", "").replace("'","")

prediction

And it return name of celebrity that have most similarity to image.

But I do not know how can I implement this in tensorflow js ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant