我正在开发一个简单的nodejs控制台实用工具,它将上传图像,用于自定义视觉模型的培训。我这么做主要是因为定制视觉网络应用程序不会让你同时标记多个图像。
tl;dr:如何将图像发布到 API端点?中
我不知道如何传递我想上传的图片。文档只是将string定义为其中一个属性的类型(我猜是content)。我尝试将路径传递到本地文件,将url传递到在线文件,甚至将base64编码的图像作为字符串传递。什么都没过去。
他们得到了一个测试控制台(在链接的docs页面上有一个蓝色按钮"Open测试控制台“),但是再次.它是模糊的,不会告诉你它实际期望的是什么样的数据。
这里的代码不那么相关,但也许会有帮助.
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.发布于 2018-11-05 22:48:45
我让它使用"API测试控制台“特性,这样我可以帮助您识别问题(但对不起,我不是node.js专家,所以我将指导您使用C#代码)
API的content格式
您是对的,文档并不清楚API正在等待的内容。我进行了一些搜索,并在微软的Github存储库中找到了一个名为Cognitive-CustomVision-Windows,这里的项目。
看到的是他们使用了一个名为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 }));然后,这个字节数组被Newtonsoft.Json序列化:如果查看它们的文档(这里),就会发现String (base 64 encoded). 被转换为。那是我们的目标。
实现
正如您提到的,您尝试使用base64编码的图像,我尝试检查它。我在本地下载了我的StackOverflow个人资料照片。然后,使用以下方法,我得到了base64编码的字符串:
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);稍后,我调用了不带标记的API,以确保图像已张贴并可见:
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
{
"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和regions数组空的情况下提交内容,比如在我的测试中,然后提供API回复的内容。
https://stackoverflow.com/questions/53107620
复制相似问题