Проблема с регистрацией позы объекта в pos enet of tenorflow. js - PullRequest
2 голосов
/ 10 января 2020

Когда я запускаю приведенный выше код, 5 раз регистрируется только объект позы последнего изображения.

Я хочу записать объект позы каждого изображения. Я использую http-сервер node.js

. В следующем коде нет ошибок, любая помощь будет оценена и спасибо заранее.

<html>

<head>
    <meta charset="UTF-8">
    <!-- Load TensorFlow.js -->
    <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs"></script>
    <!-- Load Posenet -->
    <script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/posenet"></script>
</head>

<body>
    <img id='cat' crossorigin="anonymous" />
    <button onclick="myfun()">button</button>
    <script>
        function myfun() {
            arr = ["http://127.0.0.1:8080/pic1.jpeg", "http://127.0.0.1:8080/pic2.jpeg", "http:  //127.0.0.1:8080/pic3.jpeg", "http://127.0.0.1:8080/pic4.jpeg", "http://127.0.0.1:8080/pic5.jpeg"]
            var x;
            for (x of arr) {
                document.getElementById("cat").src = x;
                var flipHorizontal = false;
                var imageElement = document.getElementById('cat');
                imageElement.crossOrigin = "Anonymous";
                posenet.load({
                    architecture: 'MobileNetV1',
                    outputStride: 16
                }).then(function(net) {
                    const pose = net.estimateSinglePose(imageElement, {
                        flipHorizontal: true
                    });
                    return pose;
                }).then(function(pose) {
                    console.log(pose);
                })
            }
        }
    </script>
</body>

</html>

Ответы [ 2 ]

1 голос
/ 10 января 2020

для l oop выполняется асинхронная операция c. К тому времени, когда оба вызова pos enet будут разрешены, для изображения будет установлен последний пункт для l oop.

Использование async ... await помешает иметь только оценку pos enet для последнего элемента l oop.

async function myfun() {
        arr = ["http://127.0.0.1:8080/pic1.jpeg", "http://127.0.0.1:8080/pic2.jpeg", "http:  //127.0.0.1:8080/pic3.jpeg", "http://127.0.0.1:8080/pic4.jpeg", "http://127.0.0.1:8080/pic5.jpeg"]
        var x;
        for (x of arr) {
            document.getElementById("cat").src = x;
            var flipHorizontal = false;
            var imageElement = document.getElementById('cat');
            imageElement.crossOrigin = "Anonymous";
            const p = new Promise((resolve, reject) => {
                imageElement.onload = _ => {
                    resolve(imageElement)
                }
            })
            const net = await posenet.load({
                architecture: 'MobileNetV1',
                outputStride: 16
            })

            const pose = await net.estimateSinglePose(await p, {
                flipHorizontal: true
            });

            console.log(pose);
        }

Кроме того, модель может быть загружена перед запуском l oop. Один экземпляр модели можно использовать для всех оценок.

0 голосов
/ 10 января 2020

Измените значение l oop с for (x of arr) { на for (var x = 0; x < arr.length; x++) { x = arr[x]; ... ... }

И оно будет работать так, как должно.

...