使用Fast.ai和OpenCV進行視頻面部表情和意識檢測

2020-12-04 人工智慧研究院

從實時視頻或視頻文件中檢測面部表情和意識。背後的靈感是什麼?通過網絡攝像頭看著我,但被深度學習所取代

實時視頻分類器演示

介紹

本教程的目標?使用fast.ai庫訓練面部表情分類模型,從您的網絡攝像頭或視頻文件中讀取面部表情,最後添加面部標記以跟蹤您的眼睛以確定意識!

在進行該項目時,面臨的一大挑戰是弄清楚如何使用經過訓練的分類器,使其能夠有效地用於實時視頻和視頻文件。

第一步是用卷積神經網絡訓練圖像分類模型。我使用的數據來自https://www.kaggle.com/jonathanoheix/face-expression-recognition-dataset

我使用了構建在PyTorch之上的fast.ai庫來訓練我的分類模型。使用resnet34預訓練的權重和訓練數據集對模型進行訓練,並以.pkl文件的形式導出。有關分步說明,請在我的存儲庫中查看Google colab筆記本,其中包含用於訓練模型的所有代碼:https : //github.com/jy6zheng/FacialExpressionRecognition

最大的挑戰是首先找到一個公共數據集,然後清理數據。最初,當我使用Kaggle數據集時,我只能訓練到0.328191的錯誤率,這意味著大約68%的時間它是正確的(一點也不好)。當我繪製產生最大損失的圖像時,我很快意識到大量數據被錯誤地標記了(左邊是模型的預測表達,右邊是被標記的情感)。

下排第三名的女孩顯然不開心

清除數據後,錯誤率降低了16%以上。現在,分類器的準確度約為84%,這意味著它可以正確識別84%的面部圖像。仍然有一些不正確和骯髒的數據,因此還有更多改進的空間。

如您所見,中性和悲傷的面孔最容易讓人感到困惑

在直播視頻上使用訓練好的模型

現在,是時候採用我們的分類器並將其用於實時視頻流了。首先,最好創建一個虛擬環境,以便該項目具有自己的依賴性,並且不會干擾任何其他項目。然後,下載所需的軟體包和庫。創建一個名為liveVideoFrame.py的文件(或任何您想命名的文件)並導入以下內容:

from scipy.spatial import distance as distimport numpy as npimport cv2from imutils import face_utilsfrom imutils.video import VideoStreamfrom fastai.vision import *import imutilsimport argparseimport timeimport dlib

我想要該選項將預測保存在.csv文件中並保存標記的視頻,因此我添加了參數解析功能。我還導出了訓練有素的分類模型,並將其移至我的工作目錄。

ap = argparse.ArgumentParser()ap.add_argument("--save", dest="save", action = "store_true")ap.add_argument("--no-save", dest="save", action = "store_false")ap.set_defaults(save = False)ap.add_argument("--savedata", dest="savedata", action = "store_true")ap.add_argument("--no-savedata", dest="savedata", action = "store_false")ap.set_defaults(savedata = False)args = vars(ap.parse_args())path = '/Users/joycezheng/FacialRecognitionVideo/' #change this depending on the path of your exported modellearn = load_learner(path, 'export.pkl')

現在是時候開始我們的視頻流了。我從imutils.video使用VideoStream,因為我發現它比cv2.VideoCapture的運行速度更快。注意:內置網絡攝像頭的視頻流源為0,如果您使用其他攝像頭(例如插件),則視頻流的源將不同。

Haar級聯分類器用於識別視頻幀中的正面。我們有一個名為data的數組來存儲我們的預測。timer和time_value用於在我們的數據中標記每個預測的時間,以便在.csv文件中預測增加1s。

face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml") vs = VideoStream(src=0).start()start = time.perf_counter() data = []time_value = 0if args["save"]: out = cv2.VideoWriter(path + "liveoutput.avi", cv2.VideoWriter_fourcc('M','J','P','G'), 10, (450,253))

現在,我們將實現一個while循環,該循環從視頻流中讀取每個幀:

由於圖像分類器是在灰度圖像上訓練的,因此每個幀都轉換為灰度級聯分類器用於查找框架中的人臉。我將minneighbors參數設置為5,因為我發現它在實時視頻中效果最好。對於錄製的視頻文件,我將其設置為較高的值,因為可以保證每幀中都有一張臉由於我們的分類器是在沒有太多背景的特寫臉部上訓練的,因此使用0.3的緩衝區為臉部裁剪了灰度圖像然後將文本和邊界框繪製到每個框架上並顯示然後使用out.write(frame)將每個幀保存到視頻編寫器while True: frame = vs.read() frame = imutils.resize(frame, width=450) gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) face_coord = face_cascade.detectMultiScale(gray, 1.1, 5, minSize=(30, 30)) for coords in face_coord: X, Y, w, h = coords H, W, _ = frame.shape X_1, X_2 = (max(0, X - int(w * 0.3)), min(X + int(1.3 * w), W)) Y_1, Y_2 = (max(0, Y - int(0.3 * h)), min(Y + int(1.3 * h), H)) img_cp = gray[Y_1:Y_2, X_1:X_2].copy() prediction, idx, probability = learn.predict(Image(pil2tensor(img_cp, np.float32).div_(225))) cv2.rectangle( img=frame, pt1=(X_1, Y_1), pt2=(X_2, Y_2), color=(128, 128, 0), thickness=2, ) cv2.putText(frame, str(prediction), (10, frame.shape[0] - 25), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (225, 255, 255), 2) cv2.imshow("frame", frame) if args["save"]: out.write(frame) if cv2.waitKey(1) & 0xFF == ord("q"): breakvs.stop()if args["save"]: print("done saving video") out.release()cv2.destroyAllWindows()

現在,我們有了與imutils和OpenCV一起使用的fast.ai學習模型,可以根據實時視頻預測面孔!

接下來,是時候確定面部的意識了。函數eye_aspect_ratio從眼睛的坐標計算出眼睛的縱橫比。每隻眼睛的位置和坐標可從dlib預訓練的面部界標檢測器中找到。函數data_time用於每1秒間隔將預測添加到數據數組中。

EYE_AR_THRESH = 0.20EYE_AR_CONSEC_FRAMES = 10COUNTER = 0def eye_aspect_ratio(eye): A = dist.euclidean(eye[1], eye[5]) B = dist.euclidean(eye[2], eye[4]) C = dist.euclidean(eye[0], eye[3]) ear = (A + B) / (2.0 * C) return eardef data_time(time_value, prediction, probability, ear): current_time = int(time.perf_counter()-start) if current_time != time_value: data.append([current_time, prediction, probability, ear]) time_value = current_time return time_valuepredictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")(lStart, lEnd) = face_utils.FACIAL_LANDMARKS_IDXS["left_eye"](rStart, rEnd) = face_utils.FACIAL_LANDMARKS_IDXS["right_eye"]

在循環人臉坐標的for循環中,添加以下代碼塊。使用dlib人臉界標檢測器檢測眼睛並將其繪製到框架上。當兩隻眼睛之間的平均計算出的眼睛縱橫比小於十個連續幀(您可以根據自己的喜好進行修改)的閾值時,該臉部將標記為分散注意力。

rect = dlib.rectangle(X, Y, X+w, Y+h) shape = predictor(gray, rect) shape = face_utils.shape_to_np(shape) leftEye = shape[lStart:lEnd] rightEye = shape[rStart:rEnd] leftEAR = eye_aspect_ratio(leftEye) rightEAR = eye_aspect_ratio(rightEye) ear = (leftEAR + rightEAR) / 2.0 leftEyeHull = cv2.convexHull(leftEye) rightEyeHull = cv2.convexHull(rightEye) cv2.drawContours(frame, [leftEyeHull], -1, (0, 255, 0), 1) cv2.drawContours(frame, [rightEyeHull], -1, (0, 255, 0), 1) if ear < EYE_AR_THRESH: COUNTER += 1 if COUNTER >= EYE_AR_CONSEC_FRAMES: cv2.putText(frame, "Distracted", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2) else: COUNTER = 0 cv2.putText(frame, "Eye Ratio: {:.2f}".format(ear), (250, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2) time_value = data_time(time_value, prediction, probability, ear)

最後,在代碼的底部,我們可以將數據另存為數據框,然後另存為.csv文件。

if args["savedata"]:df = pd.DataFrame(data, columns = ['Time (seconds)', 'Expression', 'Probability', 'EAR'])df.to_csv(path+'/exportlive.csv')print("data saved to exportlive.csv")

您可以通過運行以下命令在命令行中測試代碼:

python liveVideoFrameRead.py --save --savedata

與實時視頻相比,我對視頻文件使用了非常相似的方法。主要區別在於,預測會每幀數發生一次,可以使用命令行參數「 frame-step」進行修改。完整的代碼如下:就是這樣!現在,您可以從視頻文件和實時網絡攝像頭中預測面部表情。

感謝閱讀!

相關焦點

  • 使用OpenCv和Dlib進行打哈欠檢測
    打哈欠檢測與應用打哈欠檢測就是使用OpenCV和Dlib來檢測打哈欠(由於疲勞或無聊而張大嘴巴深吸氣)。可廣泛應用於自駕車、駕駛員疲勞檢測、駕駛員睡意檢測、駕駛員意識檢測等領域。安裝OpenCv和Dlib庫OpenCv的安裝如下:pip install opencv-pythonDlib的安裝如下:pip install cmakepip install dlib導入Opencv,Dlib和Numpy庫設置dat文件我們將.dat文件放置到工作目錄中,它是一個可以識別面部特徵並提供信息的模型
  • 使用Python,Keras和OpenCV進行實時面部活體檢測
    你可以在網際網路上找到的大多數面部識別算法和研究論文都受到照片攻擊。這些方法在檢測和識別來自網絡攝像頭的圖像、視頻和視頻流中的人臉方面非常有效。然而,他們不能區分活人的臉和照片上的臉。這是因為這些算法適用於2D frames。現在讓我們想像一下,我們想要實現一個面部識別開門器。
  • 使用OpenCV和Python構建自己的車輛檢測模型
    有沒有辦法優化交通,並通過不同的街道進行分配?還有很多例子就不一一列舉。應用程式是無止境的!我們人類可以很容易地在一瞬間從複雜的場景中檢測和識別出物體。然而,將這種思維過程轉化為機器的思維,需要我們學習使用計算機視覺算法進行目標檢測。因此在本文中,我們將建立一個自動車輛檢測器和計數器模型。
  • 使用OpenCV和Python構建自己的車輛檢測模型
    有沒有辦法優化交通,並通過不同的街道進行分配?還有很多例子就不一一列舉。應用程式是無止境的!我們人類可以很容易地在一瞬間從複雜的場景中檢測和識別出物體。然而,將這種思維過程轉化為機器的思維,需要我們學習使用計算機視覺算法進行目標檢測。
  • 基於TensorFlow 、OpenCV 和 Docker 的實時視頻目標檢測
    翻譯 | 於志鵬  徐普     校對 | 陶玉龍     整理 | 孔令雙在本文中,我將介紹如何在 Docker 容器中使用 Tensorflow Object-detection API 來執行實時(網絡攝像頭)和視頻的目標檢測。
  • 如何使用Python進行面部識別?
    圖源:unsplash本文將介紹圖像處理中的一些重要概念,除了具體解釋每個步驟之外,還將提供一個在Python中使用Cv2和DLib庫輕鬆進行人臉識別的項目。感興趣區域在使用圖像進行面部分析時,最重要的概念之一是定義感興趣區域(ROI),我們必須在圖像中定義一個特定的部分,在那裡篩選或執行一些操作。例如,如果我們需要篩選汽車的車牌,我們的感興趣領域只停留在車牌上,那麼街道、車身和圖片中出現的任何東西都只是輔助部分。在本例中,我們將使用opencv庫,該庫支持對圖像進行分區並幫助我們確定感興趣領域。
  • Fast.ai《程式設計師深度學習實戰課程2020》最新視頻分享
    例如,艾薩克·迪米特洛夫斯基(Isaac Dimitrovsky)告訴我們,「他在ML領域研究了好幾年,但並沒有真正理解它……[然後]去年下半年參加了fast.ai part 1的課程,覺得非常有用 」。他繼續在享有聲望的國際RA2-DREAM挑戰賽中獲得第一名競爭!他利用Fastai庫開發了一種多階段深度學習方法,用於評估風溼性關節炎的放射線圖像中的手足關節損傷。
  • 能去碼也能打碼,OpenCV實時檢測視頻流人臉並馬賽克之,視頻後期福音
    Adrian Rosebrock博士在博客中詳細的分享了技術實現方法,從介紹人臉檢測器,人臉模糊的簡單步驟,到分別用OpenCV對人臉進行高斯模糊和像素化模糊的詳細操作。 第一步:人臉檢測 在這一步可以使用任何的人臉檢測器,只要它能在圖像或視頻中生成人臉的邊界框坐標就行。
  • OpenCV無神經網絡對象檢測模型,如何進行目標的檢測與追蹤
    這裡我們將其用於運動檢測與運行追蹤上。OpenCV中執行運動檢測,跟蹤和分析的方法很多。有些比較簡單,還有一些比較複雜。但都是基於高斯混合模型的前景和背景分割技術的方式實現,我們採用基於貝葉斯(概率)的前景和背景分割技術。
  • YOLOV4視頻對象檢測,python+opencv輕鬆實現
    上期文章,我們介紹了YOLOV4對象檢測算法的模型以及基本知識,哪裡還進行了圖片的對象檢測,如何使用YOLOV4進行視頻檢測與實時視頻檢測呢?畢竟我們絕大多數的需求必然是視頻的實時對象檢測YOLOV4視頻檢測import numpy as npimport timeimport cv2import oslabelsPath = &34;LABELS = Nonewith open(labelsPath, &39;) as f: LABELS
  • 視頻後期福音!OpenCV 實時檢測視頻流人臉並打馬賽克
    Adrian Rosebrock博士在博客中詳細的分享了技術實現方法,從介紹人臉檢測器,人臉模糊的簡單步驟,到分別用OpenCV對人臉進行高斯模糊和像素化模糊的詳細操作。使用來自人臉檢測的原始(x, y)坐標(步驟二中提到的),我們可以得到模糊/匿名化的人臉,然後將其存儲到原始圖像中(如果使用OpenCV和Python,則此步驟使用NumPy數組切片)。
  • 超越地域和文化,AI識別出全人類共同的16種面部表情
    一項新的研究在這個清單上又增加了我們存在的另一個重要部分:我們的面部表情。來自加州大學伯克利分校和谷歌的研究人員使用機器學習和 YouTube 視頻,對常見的面部表情和引發表情的情境進行了比較。結果發現,無論是在巴西的生日派對上,還是在肯亞的葬禮上,還是在中國公園裡的廣場舞中,人類在類似的社會環境中都會使用相同的面部表情,比如微笑、皺眉、苦臉。
  • Nature:超越地域和文化,AI識別出全人類共同的16種面部表情
    【新智元導讀】加州大學伯克利分校和谷歌的研究人員使用機器學習和YouTube視頻,對常見的面部表情和引發表情的情境進行了比較。結果發現,人類在類似的社會環境中都會使用相同的面部表情,比如微笑、皺眉、苦臉。儘管人與人之間常有極大的差異,但我們存在的許多要素幾乎是每個人都共有的。我們都在冷天發抖,在熱天出汗,在睡覺時做夢。
  • 使用OpenCV和Python構建運動熱圖視頻
    OpenCV是一個強大的圖像和視頻處理庫,在這篇文章中,我將創建一個運動熱圖,用於檢測運動、一些物體或人的流動方向,以及在投影公共區域時對建築師的幫助。簡介:OpenCV,或(開源計算機視覺)是英特爾於1999年開發的一個庫,主要是計算機視覺和實時視頻操作
  • 深度學習框架 fast.ai 2.0 新版中文視頻、書籍放出
    基於pytorch的高階整合的深度學習框架fast.ai的最新2.0版本,在8月21日正式放出,這個版本是重寫的,聯合放出的含包含fastbook的配套書籍,在亞馬遜 kindle均有售賣,而且非常貼心的,免費版本的電子檔,也一併放出了(當然是英文版)
  • 使用Python和OpenCV檢測和標記湖面輪廓
    OpenCV是一個跨平臺的計算機視覺庫,廣泛的被應用於物體識別,機器視覺和圖像處理等領域。這篇文章裡我們將使用OpenCV探測地圖中湖面的輪廓,並標記面積最大的湖面。下面示例中圖片來至於goolge地圖截圖。
  • Python超級教程,使用Python進行檢測面部特徵
    今天,我們將學習如何使用圖像來檢測面部並提取諸如眼睛,鼻子,嘴巴等面部特徵。作為捕捉面部的預處理步驟,我們可以做很多令人難以置信的事情,例如捕捉面部用於標記照片中的人物(手動或通過機器學習),創建效果以「增強」我們的圖像(類似於Snapchat等應用中的圖像),對面部進行情感分析等等。
  • OpenCV實時檢測視頻流人臉並馬賽克之,視頻後期福音
    Adrian Rosebrock博士在博客中詳細的分享了技術實現方法,從介紹人臉檢測器,人臉模糊的簡單步驟,到分別用OpenCV對人臉進行高斯模糊和像素化模糊的詳細操作。  使用來自人臉檢測的原始(x, y)坐標(步驟二中提到的),我們可以得到模糊/匿名化的人臉,然後將其存儲到原始圖像中(如果使用OpenCV和Python,則此步驟使用NumPy數組切片)。
  • 以色列AI公司推出實時面部識別功能,可識別蒙面人臉
    以色列初創公司Corsight AI已推出了一種面部識別解決方案,該解決方案能夠快速,準確地識別人員,繞過障礙物以清除面部表情(例如面部遮蓋物和惡劣天氣)。ai識別該系統由自主人工智慧(Autonomous AI)提供,該公司稱這是世界上最先進的人工智慧系統
  • 用AI 來實現精神疾病診斷、視頻測謊?人大 ML 研究組開發了一位 AI...
    圖 3 視頻測謊深度學習模型 FFCSN不同於常見的雙流網絡模型(two-stream network),FFCSN 模型考慮將人臉檢測用於空間流來捕捉面部特徵,並在整個網絡中利用相關學習來融合時空特徵進行聯合訓練。此外,FFCSN 模型還引入了元學習(meta learning)和對抗學習(adversarial learning)來解決訓練數據量小的問題。