一、百度雲AI服務
最近在調研一些雲服務平台的AI(人工智能)服務,了解了一下阿里雲、騰訊雲和百度雲。其中,百度雲提供了圖像識別及圖像搜索,而且還細分地提供了相似圖片這項服務,比較符合我的需求,且百度雲提供了每日10000次入庫和500次檢索的免費次數,使得我可以更快地試用,且沒有任何花費。更為重要的是,百度雲提供了兼容.NET Core 2.0的C# SDK,這是更加讓我選擇試用的原因。
這里拋開BAT各個AI服務提供的算法的精准度不說,百度的AI服務的友好度還是蠻高的。廢話不多說,這里我主要試用百度AI的兩個服務:
(1)圖像識別
圖像識別服務是百度基於深度學習及大規模圖像訓練,准確識別圖片中的物體類別、位置、置信度等綜合信息。它的主要應用場合在於:圖片內容檢索及相冊分類或智能美圖這種場景。
(2)圖像搜索
圖像搜索是指以圖搜圖,在指定圖庫中搜索出相同或相似的圖片。這里我主要Focus在了試用相似圖片搜索這個子功能,即從一堆圖片里(這堆圖片是我自己建立的一個圖像庫)找到跟我指定的一張圖片最相似的一些其他圖片。
關於百度雲AI C# SDK
百度雲AI C# SDK在2018年中旬開始支持了.NET Core 2.0,我們可以通過Nuget安裝它:
接下來要做的就是,根據文檔的示例完成Demo。
二、圖片內容識別
2.1 內容識別實現
代碼很簡單,直接調用SDK提供的API即可實現圖片識別:
public class Program { private static ImageClassify aipClassifyClient; static Program() { aipClassifyClient = new ImageClassify(BaiduAipSimSettings.ApiKey, BaiduAipSimSettings.SecretKey); } public static void Main(string[] args) { var filePath = @"Images\bk.jpg"; // 圖片識別Demo ImageClassifyDemo(filePath); Console.ReadKey(); } private static void ImageClassifyDemo(string filePath) { var image = File.ReadAllBytes(filePath); try { var result = aipClassifyClient.AdvancedGeneral(image); Console.WriteLine("Api Response :"); Console.WriteLine(result); } catch (Exception ex) { Console.WriteLine(ex.Message); } } }
其中,ApiKey和SecretKey是我們在百度雲平台申請的賬號,可以在管理中心找到:
2.2 內容識別測試
(1)人物:貝克漢姆
從分析結果中看出,前三個結果是最接近的Topic。
(2)靜物:室內客廳
接下來來一個復雜一點的客廳照片,看看結果如何:
可以看到,識別結果的自我評分都不太高,我想要的是“客廳”,但是只識別出來了“裝修效果圖”,還需要多多學習。
三、獲取相似圖片
3.1 准備圖片庫
首先,我們需要准備一個圖片庫,在百度雲管理中心創建這個圖片庫,然后通過Web管理界面或者SDK上傳上去:
這里我只上傳了100多張圖片,實際中應該根據自己的業務場景上傳盡可能多的圖片。需要說的是,在上傳時可以為每個圖片添加Tags,這個Tags只能是兩個整數(API要求),也就是你本地數據庫中的一些ID,比如分類ID。另外就是,對於Brief屬性,我們一般可以傳遞一個JSON字符串進去,可以包含ID、Name以及Url,這樣當你獲取結果之后可以直接使用這個Brief屬性進行反序列化,拿到URL等信息。
3.2 獲取相似圖片實現
代碼仍然很簡單,如下:
public class Program { private static ImageSearch aipSearchClient; static Program() { aipSearchClient = new ImageSearch(BaiduAipSimSettings.ApiKey, BaiduAipSimSettings.SecretKey); } public static void Main(string[] args) { var filePath = @"Images\卧室.jpg"; // 相似圖片Demo SimilarImageDemo(filePath); Console.ReadKey(); } private static void SimilarImageDemo(string filePath) {// 檢索 var searchOptions = new Dictionary<string, object>{ {"tags", "100,1"}, {"tag_logic", "0"}, {"pn", "0"}, {"rn", "10"} }; SimilarSearchFromLib(filePath, searchOptions); } /// <summary> /// 單張圖片入庫 /// </summary> private static void ImportToLib(string filePath, Dictionary<string, object> options = null) { var image = File.ReadAllBytes(filePath); try { var result = aipSearchClient.SimilarAdd(image, options); Console.WriteLine("Api Response :"); Console.WriteLine(result); } catch (Exception ex) { Console.WriteLine(ex.Message); } } /// <summary> /// 相似圖檢索 /// </summary> private static void SimilarSearchFromLib(string filePath, Dictionary<string, object> options = null) { var image = File.ReadAllBytes(filePath); try { var response = aipSearchClient.SimilarSearch(image, options).ToObject<SearchResponse>(); var result = response.Result.Take(5); Console.WriteLine("Similarity Result :"); foreach (var item in result) { Console.WriteLine("{0}:{1}", item.Brief, item.Score); } } catch (Exception ex) { Console.WriteLine(ex.Message); } } }
直接參考API文檔示例即可。
3.3 獲取結果測試
測試圖片:簡約沙發
測試效果如下圖所示:
可以看到,它將最相似的圖片(全是沙發,當然我的圖庫里可是沙發、床、椅子、燈具啊啥的都有)都分析出來了:這里我只取了Brief屬性,實際中它應該是一個JSON字符串,反序列化后就可以得到URL去獲取真正的圖片了。
四、小結
本文是一個簡單的百度雲AI服務SDK的使用,沒有過多關注算法和其他方面,只是一個簡單的筆記說明,也希望我們.NET程序員能夠多多借助雲平台提供的AI服務實現自己的業務智能化實踐。后續我會學習學習ML.NET,來玩玩機器學習。
參考資料
百度雲,《C# SDK技術文檔》