我正在使用一个简单的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.
答案 0 :(得分:3)
我使用“ API测试控制台”功能使其正常运行,因此可以帮助您确定问题(但很抱歉,我不是node.js
的专家,因此我将为您提供{{1} }代码)
C#
格式是的,文档尚不清楚API正在等待的内容。我进行了搜索,并在Microsoft的Github存储库中找到了一个名为content
,here的项目。
所看到的是他们使用了一个名为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门户中!
为了进行调试,您应该首先尝试像在测试中一样使用{
"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答复的内容