前提・実現したいこと
Microsoft FaceAPI を使用して、webページ上に表示された画像を認識したいと思っています。現在は、試験的にインターネット上にある画像を表示していますが、今後画像を表示している領域にはcanvasなどを利用して表示する予定です。
どこかのサーバーにある画像ではなく、PC上でアップロードしたり、処理をしてからFaceAPIに送信したいのですが、うまくいきません。
発生している問題・エラーメッセージ
blobに変換して画像を送信できない
Bad Request (400): Invalid image URL.
FaceAPIは application/octet-stream として送信する必要があるという情報を得たため、face.jsの57行目を application/json から application/octet-stream に変更したら、画像が小さすぎるというエラーが発生
Bad Request (400): Image size is too small.
該当のソースコード
html
1<!DOCTYPE html> 2<html> 3 4<head> 5 <title>Detect Faces Sample</title> 6 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script> 7</head> 8 9<body> 10 <script src="face.js"></script> 11 <h1>Detect Faces:</h1> 12 Enter the URL to an image that includes a face or faces, then click 13 the <strong>Analyze face</strong> button.<br><br> 14 Image to analyze: <input type="text" name="inputImage" id="inputImage" 15 value="https://upload.wikimedia.org/wikipedia/commons/c/c3/RH_Louise_Lillian_Gish.jpg" /> 16 <button onclick="processImage()">Analyze face</button><br><br> 17 <div id="wrapper" style="width:1020px; display:table;"> 18 <div id="jsonOutput" style="width:600px; display:table-cell;"> 19 Response:<br><br> 20 <textarea id="responseTextArea" class="UIInput" style="width:580px; height:400px;"></textarea> 21 </div> 22 <div id="imageDiv" style="width:420px; display:table-cell;"> 23 Source image:<br><br> 24 <img id="sourceImage" width="400" /> 25 </div> 26 </div> 27</body> 28 29</html>
js
1makeblob = function (dataURL) { 2 var BASE64_MARKER = ';base64,'; 3 if (dataURL.indexOf(BASE64_MARKER) == -1) { 4 var parts = dataURL.split(','); 5 var contentType = parts[0].split(':')[1]; 6 var raw = decodeURIComponent(parts[1]); 7 return new Blob([raw], { type: contentType }); 8 } 9 var parts = dataURL.split(BASE64_MARKER); 10 var contentType = parts[0].split(':')[1]; 11 var raw = window.atob(parts[1]); 12 var rawLength = raw.length; 13 14 var uInt8Array = new Uint8Array(rawLength); 15 16 for (var i = 0; i < rawLength; ++i) { 17 uInt8Array[i] = raw.charCodeAt(i); 18 } 19 20 return new Blob([uInt8Array], { type: contentType }); 21} 22 23function processImage() { 24 // Replace <Subscription Key> with your valid subscription key. 25 var subscriptionKey = "<Subscription Key>"; 26 27 // NOTE: You must use the same region in your REST call as you used to 28 // obtain your subscription keys. For example, if you obtained your 29 // subscription keys from westus, replace "westcentralus" in the URL 30 // below with "westus". 31 // 32 // Free trial subscription keys are generated in the westcentralus region. 33 // If you use a free trial subscription key, you shouldn't need to change 34 // this region. 35 var uriBase = 36 "https://westcentralus.api.cognitive.microsoft.com/face/v1.0/detect"; 37 38 // Request parameters. 39 var params = { 40 "returnFaceId": "true", 41 "returnFaceLandmarks": "false", 42 "returnFaceAttributes": 43 "age,gender,headPose,smile,facialHair,glasses,emotion," + 44 "hair,makeup,occlusion,accessories,blur,exposure,noise" 45 }; 46 47 // Display the image. 48 var sourceImageUrl = document.getElementById("inputImage").value; 49 document.querySelector("#sourceImage").src = sourceImageUrl; 50 51 // Perform the REST API call. 52 $.ajax({ 53 url: uriBase + "?" + $.param(params), 54 55 // Request headers. 56 beforeSend: function (xhrObj) { 57 xhrObj.setRequestHeader("Content-Type", "application/json"); 58 xhrObj.setRequestHeader("Ocp-Apim-Subscription-Key", subscriptionKey); 59 }, 60 61 processData: false, 62 type: "POST", 63 64 // Request body. 65 // data: '{"url": ' + '"' + sourceImageUrl + '"}', 66 data: makeblob(sourceImageUrl), 67 }) 68 69 .done(function (data) { 70 // Show formatted JSON on webpage. 71 $("#responseTextArea").val(JSON.stringify(data, null, 2)); 72 73 var emodata = (data[0].faceAttributes.emotion); 74 75 }) 76 .fail(function (jqXHR, textStatus, errorThrown) { 77 // Display error message. 78 var errorString = (errorThrown === "") ? 79 "Error. " : errorThrown + " (" + jqXHR.status + "): "; 80 errorString += (jqXHR.responseText === "") ? 81 "" : (jQuery.parseJSON(jqXHR.responseText).message) ? 82 jQuery.parseJSON(jqXHR.responseText).message : 83 jQuery.parseJSON(jqXHR.responseText).error.message; 84 alert(errorString); 85 }); 86};
試したこと
JavaScriptコードは、ほとんどこのサイトからコピペしたものです。
HTMLのコードは、こちらのマイクロソフトのサンプルを元にJSファイルを別ファイルで作成するようにしました。
25行目の <Subscription Key> と、36行目の https://westcentralus.api.cognitive.microsoft.com/face/v1.0/detect は適切なものに書き換えてから実行しました。
ほかのサイトや、ローカルにある画像でも試してみましたが、結果は変わりませんでした。
補足情報(FW/ツールのバージョンなど)
Windows10 Pro
Google Chrome 最新バージョン
バージョン: 77.0.3865.120(Official Build)(64 ビット)
MicrosoftAzureの無料試用版 (今日登録しました。)
参考にしたサイト
クイック スタート:REST API と JavaScript を使用して画像内の顔を検出する - Azure Cognitive Services | Microsoft Docs
FaceAPIを使った感情分析 - Qiita
JavaScript - Computer Vision APIでファイル添付でできるようにしたい|teratail
FaceApiを試す。(ローカルよりファイルをアップロードして結果を取得) - m_shige1979のささやかな抵抗と欲望の日々
Microsofrt AzureのFace APIを使って笑顔をAIに判断してもらおう - Qiita
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/28 07:52
2019/10/28 07:54