通过Rest API训练Microsoft Custom Vision模型

时间:2018-11-01 18:54:36

标签: node.js api machine-learning computer-vision microsoft-custom-vision

我正在使用一个简单的nodejs控制台实用程序,该实用程序将上传图像以训练Custom Vision模型。我这样做主要是因为customvision Web应用程序不允许您一次标记多个图像。

tl; dr:如何将图像发布到CreateImagesFromFiles API端点中?

我不知道如何传递要上传的图像。 documentation只是将string定义为其中一个属性的类型(我猜是content)。我尝试将路径传递到本地文件,将URL传递到在线文件,甚至将base64编码的图像作为字符串传递。什么都没过去。

他们有一个测试控制台(链接的docs页面上有一个蓝色按钮“ Open API testing console”),但又一次……它含糊不清,不会告诉您它实际上期望什么样的数据。

此处的代码无关紧要,但也许有帮助...

const options = {
    host: 'southcentralus.api.cognitive.microsoft.com',
    path: `/customvision/v2.0/Training/projects/${projectId}/images/files`,
    method: 'POST',
    headers: {
        'Training-Key': trainingKey,
        'Content-Type': 'application/json'
    }
};

const data = {
    images: [
        {
            name: 'xxx',
            contents: 'iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAEklEQVR42mP8z8AARKiAkQaCAFxlCfyG/gCwAAAAAElFTkSuQmCC',
            tagIds: [],
            regions: []
        }
    ],
    tagIds: []
}

const req = http.request(options, res => {
  ...
})
req.write(JSON.stringify(data));
req.end();

响应:

BODY: { "statusCode": 404, "message": "Resource not found" }
No more data in response.

1 个答案:

答案 0 :(得分:3)

我使用“ API测试控制台”功能使其正常运行,因此可以帮助您确定问题(但很抱歉,我不是node.js的专家,因此我将为您提供{{1} }代码)

API的C#格式

是的,文档尚不清楚API正在等待的内容。我进行了搜索,并在Microsoft的Github存储库中找到了一个名为contenthere的项目。

所看到的是他们使用了一个名为Cognitive-CustomVision-Windows的类,其签名为visible here

ImageFileCreateEntry

所以我猜想它正在使用public ImageFileCreateEntry(string name = default(string), byte[] contents = default(byte[]), IList<System.Guid> tagIds = default(IList<System.Guid>))

您还可以在他们的示例中看到他们如何使用此“批处理”模式:

byte[]

然后,此字节数组将以// Or uploaded in a single batch var imageFiles = japaneseCherryImages.Select(img => new ImageFileCreateEntry(Path.GetFileName(img), File.ReadAllBytes(img))).ToList(); trainingApi.CreateImagesFromFiles(project.Id, new ImageFileCreateBatch(imageFiles, new List<Guid>() { japaneseCherryTag.Id })); 进行序列化:如果查看他们的文档(here),它会说 Newtonsoft.Json转换为byte[] 。那是我们的目标。

实施

正如您提到的,您尝试使用base64编码的图像时,我尝试对其进行检查。我拍摄了我在本地下载的StackOverflow个人资料图片。然后使用以下代码,我得到了base64编码的字符串:

String (base 64 encoded)

稍后,我调用了不带标签的API,以确保图像已发布并可见:

Image img = Image.FromFile(@"\\Mac\Home\Downloads\Picto.jpg");
byte[] arr;
using (MemoryStream ms = new MemoryStream())
{
    img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
    arr = ms.ToArray();
}

var content = Convert.ToBase64String(arr);

收到的回复:POST https://southcentralus.api.cognitive.microsoft.com/customvision/v2.2/Training/projects/MY_PROJECT_ID/images/files HTTP/1.1 Host: southcentralus.api.cognitive.microsoft.com Training-Key: MY_OWN_TRAINING_KEY Content-Type: application/json { "images": [ { "name": "imageSentByApi", "contents": "/9j/4AAQSkZJRgA...TOO LONG FOR STACK OVERFLOW...", "tagIds": [], "regions": [] } ], "tagIds": [] }

200 OK

我的图像在Custom Vision门户中!

image in custom vision

调试代码

为了进行调试,您应该首先尝试像在测试中一样使用{ "isBatchSuccessful": true, "images": [{ "sourceUrl": "imageSentByApi", "status": "OK", "image": { "id": "GENERATED_ID_OF_IMAGE", "created": "2018-11-05T22:33:31.6513607", "width": 328, "height": 328, "resizedImageUri": "https://irisscuprodstore.blob.core.windows.net/...", "thumbnailUri": "https://irisscuprodstore.blob.core.windows.net/...", "originalImageUri": "https://irisscuprodstore.blob.core.windows.net/..." } }] } tagIds空数组再次提交内容,然后提供API答复的内容