Microsoft AI - Custom Vision in C#

来源:https://www.cnblogs.com/shaomeng/archive/2018/03/26/8640070.html
-Advertisement-
Play Games

概述 前面一篇 Microsoft AI - Custom Vision 中,我們介紹了 Azure 認知服務中的自定義影像服務:Custom Vision,也介紹瞭如果通過這個線上服務,可視化的完成項目創建、數據集上傳和標註、模型訓練、模型評估和測試。我們也提到,除了可以使用可視化線上操作的方式, ...


概述

前面一篇 Microsoft AI - Custom Vision 中,我們介紹了 Azure 認知服務中的自定義影像服務:Custom Vision,也介紹瞭如果通過這個線上服務,可視化的完成項目創建、數據集上傳和標註、模型訓練、模型評估和測試。我們也提到,除了可以使用可視化線上操作的方式,Custom Vision 也提供了 SDK 來完成整個機器學習過程,兩種語言供選擇:C# 和 Python,今天我們針對 C# 版本來做一次實際開發操作。

開發過程

準備工作

C# Custom Vision SDK 在 GitHub 開源:Microsoft/Cognitive-CustomVision-Windows,這個 SDK 主要分為兩部分:Prediction 和 Training,如果不想下載 SourceCode 自己去編譯,也可以直接在 VS 中通過 Package Management 安裝這兩部分的 Nuget package:

  • Microsoft.Cognitive.CustomVision.Prediction  Install-Package Microsoft.Cognitive.CustomVision.Prediction -Version 1.2.0
  • Microsoft.Cognitive.CustomVision.Training     Install-Package Microsoft.Cognitive.CustomVision.Training -Version 1.2.0

      

實際開發

接下來我們創建一個 WPF 工程來實際操作整個 Custom Vision SDK 使用過程:

1. 通過 Nuget Package Management 的安裝方式,安裝 Prediction 和 Training 兩個包,地址如上面準備工作中所示;來看一下包里的 namespace 組成:

除此之外,還需要安裝 Microsoft.Rest.ClientRuntime 的 Nuget,因為 Custom Vision SDK 依賴於它,地址:Install-Package Microsoft.Rest.ClientRuntime -Version 2.3.11

2. Nuget 包安裝完成後,在代碼中引入以下 Namespace:

using Microsoft.Cognitive.CustomVision.Training;
using Microsoft.Cognitive.CustomVision.Prediction;
using Microsoft.Cognitive.CustomVision.Training.Models;

3. 創建一個 Custom Vision Project:

其中 ApiKey 需要替換為開發者在 CustomVision.ai 網站獲取的 Training Key;另外 CreateProject 創建時,名字是必填的,描述和域都是選填的;域的類型是 GUID,我翻看了 SDK Doc 和源代碼,沒有發現對域的 GUID 取值的任何描述,後來在 CustomVision.ai 通過網頁調試方法找到了 Domains 欄位對應的 GUID,在這裡也分享給大家;來看一下代碼實現和實現的結果吧:

TrainingApi trainingApi = new TrainingApi() { ApiKey = "replace with your api key" };
Project demoProject = trainingApi.CreateProject(
    "CsharpDemoProject01", 
    "It's description of our demo project.", 
    new System.Guid("0732100f-1a38-4e49-a514-c9b44c697ab5"));
項目類型 GUID
 General    ee85a74c-405e-4adc-bb47-ffa8ca0c9f31
 Food    c151d5b5-dd07-472a-acc8-15d29dea8518
 Landmarks   ca455789-012d-4b50-9fec-5bb63841c793
 Retail     b30a91ae-e3c1-4f73-a81e-c270bff27c39
 Adult    45badf75-3591-4f26-a705-45678d3e9f5f
 General(compact)  0732100f-1a38-4e49-a514-c9b44c697ab5
 Landmarks(compact)  b5cfd229-2ac7-4b2b-8d0a-2b0661344894
 Retail(compact)  6b4faeda-8396-481b-9f8b-177b9fa3097f

 

 

 

 

 

 

 

 

  

4.  給項目的訓練數據集添加標簽:

示例中我們添加了兩個標簽 airplane 和 alarmclock

// create two tags in our demo project
var airplaneTag = trainingApi.CreateTag(demoProject.Id, "airplane");
var alarmclockTag = trainingApi.CreateTag(demoProject.Id, "alarmclock");

5. 上傳圖片數據集到項目中:

我們在項目 Assets 文件夾存放了兩個分類,每個分類各五張圖片,示例代碼如下:

string[] images = new string[] { "001.jpg", "002.jpg", "003.jpg", "004.jpg", "005.jpg"};
foreach (var image in images)
{
    var storageFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri(string.Format("ms-appx:///Assets/airplane/{0}", image), UriKind.RelativeOrAbsolute));
    using (var stream = await storageFile.OpenAsync(Windows.Storage.FileAccessMode.Read))
    {
        trainingApi.CreateImagesFromData(demoProject.Id, stream.AsStream(), new List<string>() { airplaneTag.Id.ToString() });
    }
}

foreach (var image in images)
{
    var storageFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri(string.Format("ms-appx:///Assets/alarmclock/{0}", image), UriKind.RelativeOrAbsolute));
    using (var stream = await storageFile.OpenAsync(Windows.Storage.FileAccessMode.Read))
    {
        trainingApi.CreateImagesFromData(demoProject.Id, stream.AsStream(), new List<string>() { alarmclockTag.Id.ToString() });
    }
}

驗證一下我們添加的標簽和數據集

6. 數據集準備完畢,開始訓練模型

var iteration = trainingApi.TrainProject(demoProject.Id);
while (iteration.Status == "Training")
{
    iteration = trainingApi.GetIteration(demoProject.Id, iteration.Id);
}
iteration.IsDefault = true;
trainingApi.UpdateIteration(demoProject.Id, iteration.Id, iteration);

訓練完成後,我們看看訓練結果

7. 模型訓練完畢,開始做模型驗證

ApiKey 替換為你在 Custom Vision 對應的 Prediction Key,我們使用了一張 airplane 的圖片作為測試輸入,看看代碼和結果:

PredictionEndpoint endpoint = new PredictionEndpoint() { ApiKey = "replace with your prediction key" };
var testFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri(string.Format("ms-appx:///Assets/airplane.jpg", ""), UriKind.RelativeOrAbsolute));
using (var testStream = await testFile.OpenAsync(Windows.Storage.FileAccessMode.Read))
{
    var result = endpoint.PredictImage(demoProject.Id, testStream.AsStream());
}

可以看到,airplane 的概率為 0.98,alarmclock 為 0.01;這個結果符合我們對模型的預期。

 

總結

到這裡就完成了 Custom Vision C# 的實現過程,因為只是簡單 Demo 演示,所以訓練數據集只取了 10 張圖片,只是簡單的把代碼的實現過程講解了一下。大家如果感興趣,可以結合這個基本過程,把上傳標簽和圖片的過程做的更加易交互,比如選取文件夾批量上傳和管理等;模型訓練的過程也可以再細化,通過代碼返回結果監控訓練的結果;模型測試也可以把測試結果更直觀的反映出來,或者批量處理測試數據,更豐富的展示和管理測試結果,評估數據模型。

非常歡迎大家和我交流 Custom Vision 和 Azure 認知服務相關的技術問題,謝謝大家!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 由於前端資源緊缺,我的後端系統遲遲等不來它的前端,沒辦法只好自己來寫了。從html,js入門學起,然後照著vue.js的官方教程寫了幾個實例,從github上clone了一個不錯的vue.js模版,填充了一個星期。雖然界面有些醜,但是總算是走通了全部的業務,期間被跨域,跳轉,cookie等問題折磨得 ...
  • 一.dom4j的簡介 dom4j是一個Java的XML API,是jdom的升級品,用來讀寫XML文件的。dom4j是一個十分優秀的JavaXML API,具有性能優異、功能強大和極其易使用的特點,它的性能超過sun公司官方的dom技術,同時它也是一個開放源代碼的軟體,可以在SourceForge上 ...
  • 本文實例講述了jQuery實現購物車計算價格功能的簡易方法,做的比較簡單,現分享給大家供大家參考。具體如下: 目的: 1 <%@ page language="java" contentType="text/html; charset=utf-8" 2 pageEncoding="utf-8"%> ...
  • L1-013. 計算階乘和 時間限制 400 ms 記憶體限制 65536 kB 代碼長度限制 8000 B 判題程式 Standard 作者 陳越 時間限制 400 ms 時間限制 400 ms 記憶體限制 65536 kB 記憶體限制 65536 kB 代碼長度限制 8000 B 代碼長度限制 800 ...
  • 1 學習計劃 1、定區關聯客戶 n 完善CRM服務中的客戶查詢方法 n 在BOS項目中配置代理對象遠程調用crm服務 n 調整定區關聯客戶頁面 n 實現定區關聯客戶 2、查看定區中包含的分區 n 頁面調整 n 服務端實現 3、查看定區關聯的客戶列表數據 n 頁面調整 n 服務端通過代理對象遠程調用C ...
  • package com.ij34; import us.codecraft.webmagic.Site; import us.codecraft.webmagic.Page; import us.codecraft.webmagic.Spider; import us.codecraft.webma... ...
  • 轉載自 https://blog.csdn.net/u012609509/article/details/70230204 Python中的幾種矩陣乘法 1. 同線性代數中矩陣乘法的定義: np.dot() np.dot(A, B):對於二維矩陣,計算真正意義上的矩陣乘積,同線性代數中矩陣乘法的定義 ...
  • Python 和 JavaScript一樣即是面向過程語言,也是面向對象語言,動態語言。大多數面向對象語言里,Class是必不可少的。面向對象有三大特性:封裝, 繼承,多態。在Python中Class到底是怎樣的呢? 1、Class組成 2、Class getter, setter 3、Class繼 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...