基於Emgu CV+百度人臉識別,實現視頻動態 人臉抓取與識別

来源:http://www.cnblogs.com/linbin524/archive/2017/12/07/linbin524.html
-Advertisement-
Play Games

背景 目前AI 處於風口浪尖,作為 公司的CTO,也作為自己的技術專研,開始了AI之旅,在朋友圈中也咨詢 一些大牛對於AI 機器學習框架的看法,目前自己的研究方向主要開源的 AI 庫,如:Emgu CV、TensorFlow、CNTK 等等,針對 四大平臺 百度AI、阿裡ET、騰訊AI、科大訊飛AI ...


背景

目前AI 處於風口浪尖,作為 公司的CTO,也作為自己的技術專研,開始了AI之旅,在朋友圈中也咨詢 一些大牛對於AI 機器學習框架的看法,目前自己的研究方向主要開源的 AI 庫,如:Emgu CV、TensorFlow、CNTK 等等,針對 四大平臺 百度AI、阿裡ET、騰訊AI、科大訊飛AI 做結合。

PS:筆者的主打語言是C#,目前項目主導系統都是基於Net 系列下開發而成的。主要負責公司軟體系統架構設計, 鑒於朋友圈中各位技術大牛無私分享,也是鑒於自己再專研時候遇到不少坑,希望把相關研究心得發出,為大家在coding 中減少 麻煩。稍後會把自己開源框架在博客中建立系列教程,插件化模式 自動服務 (都在實際項目中使用)。

 

選擇的理由:四大平臺目前 AI 團隊算是全世界最牛的一群人,而且資金背景雄厚(AI 很燒錢!),現在四大平臺 的AI有一些已經相對成熟,依靠於人家的技術,做自己的應用,應該是中小企業 在物聯網行業前進的一個方向吧。

 

四大平臺AI入口


1、百度AI https://ai.baidu.com/customer (百度AI 產品:阿波羅無人駕駛開源平臺 )

2、騰訊AI https://ai.qq.com/hr/youtu.shtml(騰訊AI 產品:騰訊覓影)

3、訊飛AI http://startups.xfyun.cn/(訊飛:語音)

4、阿裡雲ET  https://et.aliyun.com/index(阿裡:城市大腦)

 

一、需求

1、目前我們需要通過攝像頭 精準的捕獲視頻監控中人臉(要求精度高)

2、批量捕獲人臉進行 人臉識別

3、在人臉矩形框中實時顯示人員相關信息

 

二、技術難點

1、百度人臉識別 只是需要通過Image 圖片通過開發介面發送,返回識別人物,所以前提還是要先做到人臉在視頻中動態捕捉。

2、視頻播放需要高效流暢播放,請求介面的效率是否影響視頻監控友好展示。

 

三、技術選型

1、為瞭解決 視頻中人臉動態捕捉,選用Emgu CV  是開源 框架 Open CV 的Net 版本,可以人臉精準抓取。

emgu CV 官網:http://www.emgu.com/

 

對於Emgu CV 的詳細信息,請百度。

 

2、百度人臉識別,介面完善,人臉識別精準度高,可以很好的做到人臉識別。

百度人臉識別介面文檔:http://ai.baidu.com/docs#/Face-Csharp-SDK/top

 

四、技術準備

1、到emgu cv 的官網下載 最新的emgu CV 版本,因為版本間差異較大,所以在百度搜索時候,會發現很多文章代碼是無法直接copy的。

2、安裝emgu cv 的最版本

請仔細查看 solution 文件夾,裡面有對應solution 文件,(在windowDeskTop文件夾裡面 )選擇Emgu.CV.sln打開,就可以看到Emgu.CV.Example(Emgu.CV 的Demo)。

3、我們需要將 FaceDetection(人臉精準查找Demo)和VideoSurveilance(視頻動態抓捕實現矩形框)兩個Demo 做結合

 4、到百度開發者中心註冊成為開發者,並且獲取開發者。

5、下載百度AI 開發平臺 對應的SDK(已經封裝過,可以減少開發工作量),或者直接進行Api對接。

 

五、實現

 

先上實現效果,相關個人信息如頭像、還有姓名和電話都被我處理過了。

 

 

 

1、準備好攝像頭,連接沒問題就開始敲代碼了。

 

2、在百度人臉庫建立自己的人臉素材,這個要求要精準,比較適合就是員工的工牌相片,就是一寸或者兩寸的照片那種。

詳細方法 百度提供SDK 已經有了,就不多作介紹了。其中 自定義的 Uid(用戶id,用於唯一碼)、group (人才組)、userInfo(用戶信息,作為人臉識別返回信息顯示)比較關鍵。

sdk 下載地址:http://ai.baidu.com/sdk,下載完成將如圖中 dll 引用到自己的類庫中。

 

 

 

以下方法是我簡單改造過了。

 我做了一個簡單的人臉庫添加 工具,可以進行簡單人臉庫操作

 

 

3、選擇VideoSurveilance 做改造,上代碼。

 

其中 

void ProcessFrame(object sender, EventArgs e) 方法 是關鍵,裡面就是具體操作人臉識別具體應用。

將 FaceDetection 中的相關內容copy 到VideoSurveilance 項目中,其中 haarcascade_frontalface_default.xml 用於 人臉檢測,DetectFace.cs 是具體檢測人臉方法。

 

 

 
  1 //----------------------------------------------------------------------------
  2 //  Copyright (C) 2004-2017 by EMGU Corporation. All rights reserved.       
  3 //----------------------------------------------------------------------------
  4 
  5 using System;
  6 using System.Collections.Generic;
  7 using System.ComponentModel;
  8 using System.Data;
  9 using System.Drawing;
 10 using System.Text;
 11 using System.Windows.Forms;
 12 
 13 using Emgu.CV;
 14 using Emgu.CV.Cvb;
 15 using Emgu.CV.UI;
 16 using Emgu.CV.CvEnum;
 17 using Emgu.CV.Structure;
 18 using Emgu.CV.VideoSurveillance;
 19 using FaceDetection;
 20 using Emgu.CV.Cuda;
 21 using AOP.Common;
 22 using System.Drawing.Imaging;
 23 using Baidu.Aip.API;
 24 using System.Threading;
 25 using BaiduAIAPI.Model;
 26 
 27 namespace VideoSurveilance
 28 {
 29     public partial class VideoSurveilance : Form
 30     {
 31 
 32         private static VideoCapture _cameraCapture;
 33 
 34         private static BackgroundSubtractor _fgDetector;
 35         private static Emgu.CV.Cvb.CvBlobDetector _blobDetector;
 36         private static Emgu.CV.Cvb.CvTracks _tracker;
 37 
 38         private static Queue<ImageModel> FacIdentifyQueue = new Queue<ImageModel>();
 39         public Image faceImage;
 40         Thread t1;
 41         public VideoSurveilance()
 42         {
 43             InitializeComponent();
 44             Run();
 45         }
 46 
 47         void Run()
 48         {
 49             try
 50             {
 51                 _cameraCapture = new VideoCapture();
 52             }
 53             catch (Exception e)
 54             {
 55                 MessageBox.Show(e.Message);
 56                 return;
 57             }
 58 
 59             _fgDetector = new Emgu.CV.VideoSurveillance.BackgroundSubtractorMOG2();
 60             _blobDetector = new CvBlobDetector();
 61             _tracker = new CvTracks();
 62 
 63             Application.Idle += ProcessFrame;
 64         }
 65 
 66         void ProcessFrame(object sender, EventArgs e)
 67         {
 68             Mat frame = _cameraCapture.QueryFrame();
 69             Mat smoothedFrame = new Mat();
 70             CvInvoke.GaussianBlur(frame, smoothedFrame, new Size(3, 3), 1); //filter out noises
 71                                                                             //frame._SmoothGaussian(3); 
 72 
 73             #region use the BG/FG detector to find the forground mask
 74             Mat forgroundMask = new Mat();
 75             _fgDetector.Apply(smoothedFrame, forgroundMask);
 76             #endregion
 77 
 78             CvBlobs blobs = new CvBlobs();
 79             _blobDetector.Detect(forgroundMask.ToImage<Gray, byte>(), blobs);
 80             blobs.FilterByArea(100, int.MaxValue);
 81 
 82             float scale = (frame.Width + frame.Width) / 2.0f;
 83             _tracker.Update(blobs, 0.01 * scale, 5, 5);
 84 
 85             long detectionTime;
 86 
 87             List<Rectangle> faces = new List<Rectangle>();
 88             List<Rectangle> eyes = new List<Rectangle>();
 89 
 90             IImage image = (IImage)frame;//這一步是重點
 91             faceImage = frame.Bitmap;
 92             DetectFace.Detect(image
 93              , "haarcascade_frontalface_default.xml", "haarcascade_eye.xml",
 94               faces, eyes,
 95               out detectionTime);
 96 
 97             #region 多人識別
 98            Graphics g1 = Graphics.FromImage(frame.Bitmap);
 99            List<FaceIdentifyModel> tempList = new List<FaceIdentifyModel>();
100            foreach (Rectangle face in faces)
101             {
102                Image rectImage1 = ImageHelper.CaptureImage(frame.Bitmap, face);// 自己封裝的方法,通過大圖截取矩形框的人臉圖片,返回Image 對象
103                FaceIdentifyModel MoreIdentifyInfo = FaceAPI.FaceIdentify(rectImage1, tb_Group.Text.Trim(), 1, 1);
104 MoreIdentifyInfo.rect = face; 105 tempList.Add(MoreIdentifyInfo); 106 }
107 Color color_of_pen1 = Color.Gray; 108 color_of_pen1 = Color.Yellow; 109 Pen pen1 = new Pen(color_of_pen1, 2.0f); 110 111 Font font1 = new Font("微軟雅黑", 16, GraphicsUnit.Pixel); 112 SolidBrush drawBrush1 = new SolidBrush(Color.Yellow); 113 114 115 tb_Identify.Text = tempList.ToJson(); 116 foreach (var t in tempList) 117 { 118 g1.DrawRectangle(pen1, t.rect); 119 120 if (t.result != null) 121 { 122 g1.DrawString(t.result[0].user_info.Replace(",", "\r\n"), font1, drawBrush1, new Point(t.rect.X + 20, t.rect.Y - 20)); 123 } 124 125 } 126 #endregion 127 128 imageBox1.Image = frame; 129 imageBox2.Image = forgroundMask; 130 } 131 132 133 134 private void btn_Screenshot_Click(object sender, EventArgs e) 135 { 136 if (faceImage != null) 137 { 138 System.Drawing.Image ResourceImage = faceImage; 139 string fileDir = System.Environment.CurrentDirectory + "\\Snapshot\\"; 140 FileHelper.CreateDir(fileDir); 141 string filePath = fileDir + DateTime.Now.ToString("yyyyMMddHHmmss") + ".png"; 142 ResourceImage.Save(filePath); 143 MessageBox.Show("保存成功!" + filePath); 144 } 145 146 } 147 } 148 }

 

核心代碼介紹

獲取人臉矩形框,對應的xml 文件要放在根目錄下(winform就是 在bin文件夾中)

DetectFace.Detect(image
            , "haarcascade_frontalface_default.xml", "haarcascade_eye.xml",
             faces, eyes,
             out detectionTime);

faces 就是返回的 人臉檢測內容,
foreach (Rectangle face in faces) 對它進行動態獲取人臉,在視頻中畫出來就可以了

// 調用百度人臉識別介面,該方法 SDK 已經有了,我做了一些簡單的封裝,就是把截取到的矩形頭像發送給百度去識別,這個識別是基於自己在百度建立的人臉庫
 FaceIdentifyModel MoreIdentifyInfo = FaceAPI.FaceIdentify(rectImage1, tb_Group.Text.Trim(), 1, 1);//人臉識別 一個人的識別效果比較好  

 

 

完成上述工作,人臉識別就完成了,測試過,只要人臉庫中的素材清晰,識別基本在99% 左右。

 


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

-Advertisement-
Play Games
更多相關文章
  • 問題描述 有表一 tableA tid username title 1 lily 我公司將進行xx培訓 2 angus 關於秋游的通知 3 boss 這個月不發獎金 4 vivi 新產品上市 表二 tableB tid time txt 1 0809 大家快來。。。。 2 0810 我是新來的,大 ...
  • classes12.jar,ojdbc14.jar,ojdbc5.jar和ojdbc6.jar的區別,之間的差異 在使用Oracle JDBC驅動時,有些問題你是不是通過替換不同版本的Oracle JDBC驅動來解決的?最常使用的ojdbc14.jar有多個版本,classes12.jar有多個版本 ...
  • 系統環境:WIN 10 64位 1、安裝Mysql odbc connector 插件 文章說明鏈接: https://www.cnblogs.com/santiagoMunez/p/4780301.html 插件下載鏈接: https://dev.mysql.com/downloads/conne ...
  • 一、知道原資料庫密碼。 登錄mysql # mysql -uroot -p Enter password:【輸入原來的密碼】 mysql>use mysql; mysql>update user set password=passworD("新密碼") where user='root'; mysq ...
  • 4.批量解鎖declare cursor mycur isselect b.sid,b.serial# from v$locked_object a,v$session bwhere a.session_id = b.sid group by b.sid,b.serial#; begin for c ...
  • 使用0值表示沿著每一列或行標簽\索引值向下執行方法 使用1值表示沿著每一行或者列標簽模向執行對應的方法 下圖代表在DataFrame當中axis為0和1時分別代表的含義: axis參數作用方向圖示 另外,記住,Pandas保持了Numpy對關鍵字axis的用法,用法在Numpy庫的辭彙表當中有過解釋 ...
  • 需求: 一個使用mybatis分頁插件的分頁列表, 現在要求新增一條數據或者修改一條數據後,顯示在最前端 思路: 使用sql , 先將查詢出來的數據排序, 然後使用rownum > page*size 和rownum <= (page+1)*size 條件取固定條數的數據 問題 : 執行sql時遇到 ...
  • 在MSSQL中,查看較慢語句的執行計劃,就是一個比較直觀的方式, 如果查看執行計劃呢: 1.從右到左,從上到下的順序閱讀執行計劃2.執行計劃中每個圖標代表一個運算符,總開銷為100%3.數據從右向左在兩個操作符之間流動,由一個連接箭頭表示。4.操作符之間連接箭頭的寬度是傳輸行數的圖形表示。5.同一列 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...