初探機器學習之使用百度AI服務實現圖片識別與相似圖片


一、百度雲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技術文檔

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM