Ошибка поиска неисправности "Предоставлены неверные метаданные" - PullRequest
0 голосов
/ 02 мая 2020

Я следовал этому руководству, чтобы научиться использовать тензор потока. js модель mobil enet в node.js: ссылка

Теперь я пытаюсь использовать свой собственный тензор потока js модель обучена на обучаемой машине с использованием пакета @ teachablemachine / image: ссылка

Вот мой код:

const tf = require('@tensorflow/tfjs');
const tfnode = require('@tensorflow/tfjs-node');
const tmImage = require('@teachablemachine/image');
const fs = require('fs');
const path = require('path');
const FileAPI = require('file-api'), 
File = FileAPI.File;
global.FileReader = FileAPI.FileReader;
global.Response = require('response');

const uploadModel =  "model.json"
const uploadModelPath = path.join(process.cwd(), uploadModel);
const uploadModelFile = new File({ 
    name: "model.json",
    type: "application/json",
    path: uploadModelPath
});

const uploadWeights = "weights.bin"
const uploadWeightsPath = path.join(process.cwd(), uploadWeights);  
const uploadWeightsFile = new File({
    name: "weights.bin", 
    path: uploadWeightsPath
});

const uploadMetadata = "metadata.json"
const uploadMetadataPath = path.join(process.cwd(), uploadMetadata);
const uploadMetadataFile = new File({
    name: "metadata.json",
    type: "application/json",
    path: uploadMetadataPath
});

const readImage = path => {
    const imageBuffer = fs.readFileSync(path);
    const tfimage = tfnode.node.decodeImage(imageBuffer);
    return tfimage;
}

const imageClassification = async path => {
    const image = readImage(path);
    const model = await tmImage.loadFromFiles(uploadModelFile,uploadWeightsFile,uploadMetadataFile);
    //const model = await tmImage.load('https://teachablemachine.withgoogle.com/models/25uN0DSdd/model.json','https://teachablemachine.withgoogle.com/models/25uN0DSdd/metadata.json');
    const predictions = await model.predict(image);
    console.log('Classification Results:', predictions);
}

if (process.argv.length !== 3) throw new Error('Incorrect arguments: node classify.js <IMAGE_FILE>');

imageClassification(process.argv[2]);

Когда я запускаю его, я получаю ошибка:

> (node:94924) UnhandledPromiseRejectionWarning: Error: Invalid Metadata provided
    at C:\Users\Awesome\Google Drive\Source\Programming\JS\Testing\node_modules\@teachablemachine\image\dist\custom-mobilenet.js:163:27

Что приводит меня к:

var processMetadata = function (metadata) { return __awaiter(void 0, void 0, void 0, function () {
    var metadataJSON, metadataResponse;
    return __generator(this, function (_a) {
        switch (_a.label) {
            case 0:
                if (!(typeof metadata === 'string')) return [3 /*break*/, 3];
                return [4 /*yield*/, fetch(metadata)];
            case 1:
                metadataResponse = _a.sent();
                return [4 /*yield*/, metadataResponse.json()];
            case 2:
                metadataJSON = _a.sent();
                return [3 /*break*/, 4];
            case 3:
                if (isMetadata(metadata)) {
                    metadataJSON = metadata;
                }
                else {
                    throw new Error('Invalid Metadata provided');
                }
                _a.label = 4;
            case 4: return [2 /*return*/, fillMetadata(metadataJSON)];
        }
    });
}); };

полный файл здесь: ссылка

Таким образом, я вижу случай 0-2 не запускаются, и для случая 3 файл метаданных не передает функцию isMetadata:

var isMetadata = function (c) {
    return !!c && Array.isArray(c.labels);
};

, которая, как мне кажется, проверяет, что файл не является неопределенным и имеет массив меток.

Куда go оттуда я не уверен, потому что я не понимаю остальную часть кода в этом файле. Я собираюсь попробовать альтернативный подход, но я подумал, что я мог бы опубликовать это, если кто-то с большим опытом может ясно увидеть проблему и хочет помочь научить меня чему-то, или направить меня в правильном направлении, или просто сказать мне, что на моем уровне опыта это не правильное использование моего времени.

Спасибо за чтение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...