AI時代的網站與手機App建置與開發Part9 - 建立支援影像分類功能的MVC網站

 

·       摘要

了解ML.NET程式庫如何對使用Visual Studio建立的專案加入圖形辨識功能之後, 在這一篇文章中, 我們將要探討ASP.NET Core MVC專案如何使用ML.NET程式庫建立的圖形辨識功能功能辨識圖片的內容.

·       Controller加入新的Action函式

首先請為專案的HomeController控制器加入以下兩個名稱為ClassifyImage的函式, 其中第一個ClassifyImage函式的功用是用來生成View頁面, 第二個ClassifyImage函式的功用則是負責接收欲辨識的圖片參數, 讀取圖片的內容, 再呼叫MLModel類別的PredictAllLabels函式分類圖片的內容, 再將呼叫的結果轉換成JSON格式再傳回給呼叫者, 如下:

public IActionResult ClassifyImage()

{

    return View();

}

[HttpPost]

public JsonResult ClassifyImage(IFormFile ImageFile)

{

    byte[] ImageBytes = null;

    //利用BinaryReader類別讀取參數代表的檔案內容

    using (BinaryReader br = new BinaryReader(ImageFile.OpenReadStream()))

    {

        //將參數代表的檔案內容讀到ImageBytes陣列

        ImageBytes = br.ReadBytes((int)ImageFile.Length);

        //建立ModelInput類別變數, 並設定妥ImageSource屬性的內容值

        MLModel.ModelInput sampleData = new MLModel.ModelInput()

            {

                ImageSource = ImageBytes,

            };

        //叫用ModelInput類別的PredictAllLabel函式進行圖片分類

        var sortedScoresWithLabel = MLModel.PredictAllLabels(sampleData);

        //將圖片分類信心指數最高的結果建立成JSON格式的結果傳回給呼叫者

        return Json(new

                {

                    //將圖片分類的結果填入Label屬性

                    Label= sortedScoresWithLabel.First().Key,

                    //將圖片分類的信心指數填入Score屬性

                    Score= sortedScoresWithLabel.First().Value,

                });

    }

}

做好之後請使用滑鼠右鍵點選專案中名稱為HomeController的控制器的第一個ClassifyImage函式, 執行[新增檢視]功能, ClassifyImage函式加入名稱為ClassifyImage的檢視, 並把ClassifyImage檢視編輯成以下的樣子, 支援使用者選擇欲分類的圖片檔案:

<div class="container">

    <div class="form-group">

        <label class="form-label">Picture:</label>

        <img id="imgPreview" src="~/images/NoImage.jpg" class="form-control"

style="width:640px;height:480px" />

        <input type="file" id="file" class="form-control" />

    </div>

    <div class="form-group">

        <button id="classify" type="button" class="btn btn-primary">分類</button>

    </div>

</div>

@section Scripts

{

    <script>

        var file;

        $("#file").on("change", function () {       //預覽使用者選擇的圖片內容

            file = this.files[0];                    //取得使用者選擇的圖片

            var allowFileType = "image.*";

            if (file.type.match(allowFileType)) {  //弮斷使用者選擇的檔案是否為圖片

                var reader = new FileReader();       //建立讀取圖片內容的FileReader

                reader.onload = function (e) {      //圖片讀取完成後顯示到<img>元素

                    $("#imgPreview").attr('src', e.target.result);

                }

                reader.readAsDataURL(file);          //讀取使用者選擇的圖片

            }

            else {                            //如果使用者未選擇圖片則顯示錯誤訊息

                alert("不支援的檔案類型!");

                $('#btnAnalyze').prop('disabled', true);   //禁用分類圖片的按鍵

            }

        });

        $("#classify").on("click", function () {    //分類使用者選擇的圖片內容

            var formData = new FormData();           //建立FormData

            formData.append("ImageFile", file);   //填入使用者選擇的圖片到FormData

            $.ajax({                              //發送AJAX呼叫到ClassifyImage函式

                url: "https://localhost:7094/Home/ClassifyImage",

                type: "POST",

                processData: false,

                contentType: false,

                data: formData

            }).done(function (data, textStatus, jqXHR) { //顯示呼叫成功的結果

                alert(`內容:${data["label"]},

信心指數:${(data["score"]*100).toFixed(2)}%`);

            }).fail(function (jqXHR, textStatus, errorThrown) {//顯示呼叫失敗的結果

                alert(errorThrown);

            });

        });

    </script>

·       顯示分類圖片的結果

呼叫HomeControllerClassifyImage函式會得到以下JSON格式的結果的結果, 其中的label屬性的內容值代表圖片的分類, score屬性的內容代表對判斷結果的信心指數:

{

    "label":"Dog",

    "score":0.99694294

}

所以我們只要顯示呼叫結果中的label屬性和score屬性的內容值即可.

·       於網站的導覽列加入分類別片的超連結

請開啟專案根目錄下, [Views | Shared]資料夾中的_Layout.cshtml,

<ul class="navbar-nav flex-grow-1">

元素中加入以下的超連結:

<li class="nav-item">

    <a class="nav-link text-dark" asp-area="" asp-controller="Home"                                            asp-action="ClassifyImage">圖片分類</a>

</li>

做好之後執行ASP.NET Core MVC網站專案, 點選導覽列中剛加入的[圖片分類]連結, 選取欲分類的圖片, 按下[分類], 就會看類似圖1的結果:

1: 叫用ML.NET程式庫建立的機器學習模型分類選取的圖片的結果



留言

這個網誌中的熱門文章

AI時代的網站與手機App建置與開發Part27 - ML.NET與物件偵測

AI時代的網站與手機App建置與開發Part24 - ML.NET與圖片異常偵測

AI時代的網站與手機App建置與開發Part28 - 使用YOLO模型進行物件偵測