1. 程式人生 > >C# 利用百度AI進行人臉識別/搜尋

C# 利用百度AI進行人臉識別/搜尋

人臉識別,聽上去好像很牛批,不過我們能做的也就是呼叫一下人家的API而已,記錄一下我呼叫百度人臉識別API的過程。

首先登陸百度雲管理後臺,建立一個人臉識別應用

右側選單開啟人臉庫,新建一個組,在組裡建立一個使用者,併為這個使用者上傳圖片(人臉照),這個分組跟照片是之後進行人臉搜尋的基礎。這裡解釋一下什麼是人臉搜尋,這個意思是選擇一張圖片然後從組中匹配人臉並返回匹配度最高的值,可以用作驗證該圖片的人臉是否存在組中。

然後我們就可以開始寫程式碼了,下載開發SDK,推薦在NuGet中搜索 Baidu.AI,直接安裝就行了,具體是在vs的工具-NuGet包管理器-解決包管理器的NuGet程式包,搜尋baidu即可。

建立一個winform工程,按照下圖進行佈局

現在寫幾個方法用來呼叫百度API,下面的三個值可以在你建立的應用處找到

        /// <summary>
        /// 人臉識別API引數初始化
        /// </summary>
        /// <returns></returns>
        private Baidu.Aip.Face.Face GetFacaClient()
        {
                // 設定APPID/AK/SK
            string APP_ID = "你的APP_ID";
            string API_KEY = "你的API_KEY";
            string SECRET_KEY = "你的SECRET_KEY";

            Face client = new Baidu.Aip.Face.Face(API_KEY, SECRET_KEY);
            client.Timeout = 60000;  // 修改超時時間

            return client;
        }

然後寫一個圖片轉Base64的方法,因為百度以Base64表示一張圖片,下面的“image”會在按鈕的點選事件傳進去。

        /// <summary>
        /// 圖片轉換為Base64
        /// </summary>
        /// <param name="image"></param>
        /// <returns></returns>
        private string ImgToBase64String(string image)
        {
            try
            {
                Bitmap bmp = new Bitmap(image, true);
                MemoryStream ms = new MemoryStream();
                bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                byte[] arr = new byte[ms.Length];
                ms.Position = 0;
                ms.Read(arr, 0, (int)ms.Length);
                ms.Close();

                return Convert.ToBase64String(arr);
            }
            catch (Exception ex)
            {
                return null;
            }
        }

最後就是呼叫API的方法

        /// <summary>
        /// 人臉搜尋,從人臉庫中查詢是否有合適的人像
        /// </summary>
        /// <param name="ImageBase">圖片Base64值</param>
        /// <returns></returns>
        public Newtonsoft.Json.Linq.JObject SearchDemo(string ImageBase)
        {
            string image = ImageBase;
            string imageType = "BASE64";
            string groupIdList = "test";//你的應用名字

            Face client = GetFacaClient();

            // 呼叫人臉搜尋,可能會丟擲網路等異常,請使用try/catch捕獲
            var result = client.Search(image, imageType, groupIdList);

            return result;
        }

然後給兩個按鈕加上點選事件

選擇圖片按鈕

        /// <summary>
        /// 選擇照片
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                //PictureBox控制元件顯示圖片
                pictureBox.Load(openFileDialog.FileName);
            }
        }

檢查按鈕

        /// <summary>
        /// 檢查按鈕點選事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            string ImageBase = ImgToBase64String(openFileDialog.FileName.ToString());
            var msg = SearchDemo(ImageBase);

            group_id.Text = "所在組:" + msg["result"]["user_list"][0].Value<string>("group_id");
            user_id.Text = "使用者id:" + msg["result"]["user_list"][0].Value<string>("user_id");
            score.Text = "匹配度:" + msg["result"]["user_list"][0].Value<string>("score");
        }

記得將圖片框的SizeMode選為StretchImage,要不然圖片可能會顯示不全,可以在窗體的初始事件中加入

pictureBox.SizeMode = PictureBoxSizeMode.StretchImage;

或者在設計窗體選擇SizeMode。

現在DEMO已經做好了,我們可以試一下效果。

選擇圖片,然後點選檢查,然後右邊就會顯示資料。我這裡匹配度達到了93,因為人臉庫中存在這個人的另一張圖片。下面選擇另一個人的圖片,這個人的其他圖片不存在人臉庫中。

因為人臉庫中就只有一個人的id,所以返回了跟上一張圖同樣的使用者id,不過匹配度就很低了,低於80我們就可以認為這個人不在人臉庫中,這樣就達到了人臉搜尋功能。