我们正在尝试使用 SDK 在 CustomVision 上创建一个项目。我们正在使用以下库:
import { TrainingAPIClient } from "@azure/cognitiveservices-customvision-training"; import { PredictionAPIClient } from "@azure/cognitiveservices-customvision-prediction"; import { ApiKeyCredentials } from "@azure/ms-rest-js";
以下是版本:
"@azure/cognitiveservices-customvision-prediction": "^5.1.2", "@azure/cognitiveservices-customvision-training": "^5.2.0", "@azure/ms-rest-azure-js": "^2.1.0",
不幸的是,无论我做什么,我都会收到此错误:
TypeError: Expected signal to be an instanceof AbortSignal
我们尝试切换到“@azure/ms-rest-azure-js”;这没有帮助。
我们尝试传递 AbortSignal 但效果不佳。
这些库的当前版本不支持 core-auth 等现代库,因此我们无法使用它。
还有其他想法吗?
错误
Expected signal to be an instance of AbortSignal
通常在以下格式使用 abort-controller
时发生:
const controller = new AbortController();
doAsyncWork({ abortSignal: controller.signal });
controller.abort();
为避免冲突,请安装
AbortSignal
库(或删除包含该库的代码部分)。AbortSignal
.
npm install @azure/abort-controller
npm install abort-controller
通过参考doc,我执行了以下代码,用于创建项目、添加标签、上传图像、训练模型以及使用 Azure Custom Vision 发布迭代。
const util = require('util');
const fs = require('fs');
const TrainingApi = require("@azure/cognitiveservices-customvision-training");
const PredictionApi = require("@azure/cognitiveservices-customvision-prediction");
const msRest = require("@azure/ms-rest-js");
const trainingKey = "VISION_TRAINING_KEY";
const trainingEndpoint = "VISION_TRAINING_ENDPOINT";
const VISIONKey = "VISION_PREDICTION_KEY";
const predictionResourceId ="VISION_PREDICTION_RESOURCE_ID";
const predictionEndpoint = "VISION_PREDICTION_ENDPOINT";
const publishIterationName = "classifyModel";
const setTimeoutPromise = util.promisify(setTimeout);
(async () => {
console.log("Creating project...");
const credentials = new msRest.ApiKeyCredentials({ inHeader: { "Training-key": trainingKey } });
const trainer = new TrainingApi.TrainingAPIClient(credentials, trainingEndpoint);
const sampleProject = await trainer.createProject("Sample Project");
console.log("Adding tags...");
const hemlockTag = await trainer.createTag(sampleProject.id, "Hemlock");
const cherryTag = await trainer.createTag(sampleProject.id, "Japanese Cherry");
console.log("Adding images...");
const sampleDataRoot = "Images";
let fileUploadPromises = [];
const hemlockDir = `${sampleDataRoot}/Hemlock`;
const hemlockFiles = fs.readdirSync(hemlockDir);
hemlockFiles.forEach(file => {
fileUploadPromises.push(trainer.createImagesFromData(sampleProject.id, fs.readFileSync(`${hemlockDir}/${file}`), { tagIds: [hemlockTag.id] }));
});
const cherryDir = `${sampleDataRoot}/Japanese_Cherry`;
const japaneseCherryFiles = fs.readdirSync(cherryDir);
japaneseCherryFiles.forEach(file => {
fileUploadPromises.push(trainer.createImagesFromData(sampleProject.id, fs.readFileSync(`${cherryDir}/${file}`), { tagIds: [cherryTag.id] }));
});
await Promise.all(fileUploadPromises);
console.log("Training...");
let trainingIteration = await trainer.trainProject(sampleProject.id);
console.log("Training started...");
while (trainingIteration.status == "Training") {
console.log("Training status: " + trainingIteration.status);
await setTimeoutPromise(1000, null);
trainingIteration = await trainer.getIteration(sampleProject.id, trainingIteration.id);
}
console.log("Training status: " + trainingIteration.status);
await trainer.publishIteration(sampleProject.id, trainingIteration.id, publishIterationName, predictionResourceId);
const predictor_credentials = new msRest.ApiKeyCredentials({ inHeader: { "Prediction-key": VISIONKey } });
const predictor = new PredictionApi.PredictionAPIClient(predictor_credentials, predictionEndpoint);
const testFile = fs.readFileSync(`${sampleDataRoot}/Test/test_image.jpg`);
const results = await predictor.classifyImage(sampleProject.id, publishIterationName, testFile);
console.log("Results:");
results.predictions.forEach(predictedResult => {
console.log(`\t ${predictedResult.tagName}: ${(predictedResult.probability * 100.0).toFixed(2)}%`);
});
})();