前言
opencv 3.3正式發布後,對深度學習(dnn模組)提供了更好的支援,dnn模組目前支援caffe、tensorflow、torch、pytorch等深度學習框架。
另外,新版本中使用預訓練深度學習模型的api同時相容c++和python,讓系列操作變得非常簡便
當然,我們不能、也不該用opencv訓練深度學習模型,但這個新版本讓我們能把用深度學習框架訓練好了的模型拿來,高效地用在opencv之中。
在很久很久以前,用opencv2.4x跟opencv3.0進行人臉檢測的時候,都是基於haar級聯,但是我測試過haar級聯,明顯不太準,而且速度慢。但是現在2023年啦,深度學習的快速發展,使人臉檢測 越來越精準,在opencv4發布以來,官方支援的人臉檢測方法已經轉換為支援深度學習的快準狠的方法了,就連haar級聯訓練的工具都在opencv4中除名了,其實已經有了支援深度學習的人臉檢測演算法,並且準確率和速度都比haar好,那再學haar級聯無疑是浪費時間和精力了,要學會跟著時代的步伐嘛,所以與時俱進很重要的。
注意:本文不涉及任何原理,只講具體的應用。
res10_300x300_ssd_iter_140000_fp16.caffemodeltensorflow模型:deploy.prototxt
opencv_face_detector_uint8.pbpb檔案的能夠儲存tensorflow計算圖中的操作節點以及對應的各張量,方便我們日後直接呼叫之前已經訓練好的計算圖。opencv_face_detector.pbtxt
其中tensorflow的模型opencv官方對它進行了量化處理,大小只有2mb左右,非常適合在各種場景下使用。
提取碼:vjxu
二、演示**
1.讀入模型檔案
string modeldesc =
"d:/vc projects/dnn_face_detection-model/opencv_face_detector.pbtxt"
;string modelbinary =
"d:/vc projects/dnn_face_detection-model/opencv_face_detector_uint8.pb"
;
2.初始化網路,讀入權重和網路結構,呼叫cv::dnn對應的後端設定函式
dnn::net net =
readnetfromtensorflow
(modelbinary, modeldesc)
;net.
setpreferablebackend
(dnn_backend_opencv)
;net.
setpreferabletarget
(dnn_target_cpu)
;
這樣子程式再執行dnn計算時,用cpu執行。
當然也可以用gpu加速:
// when using opencv 4 and data > 20191022, the cuda is support
net.
setpreferabletarget
(cv::dnn::dnn_target_cuda)
;net.
setpreferablebackend
(cv::dnn::dnn_backend_cuda)
;
3.對輸入資料進行調整。
mat inputblob =
blobfromimage
(frame, inscalefactor,
size
(inwidth, inheight)
, meanval,
false
,false
);
4.輸入、輸出
net.
setinput
(inputblob,
"data");
//detection返回值標籤、置信度、目標位置的4個座標資訊[xmin ymin xmax ymax]
mat detection = net.
forward
("detection_out"
);
完整**:
#include
#include
using
namespace cv;
using
namespace cv::dnn;
#include
#include
using
namespace std;
const size_t inwidth =
300;
const size_t inheight =
300;
const
double inscalefactor =
1.0;
//為了減去平均值(mean):為了消除同一場景下不同光照的,對我們最終的分類或者神經網路的影響,我們常常對的r、g、b通道的畫素求乙個平均值,然後將每個畫素值減去我們的平均值,這樣就可以得到畫素之間的相對值,就可以排除光照的影響。
const scalar meanval
(104.0
,177.0
,123.0);
const
float confidencethreshold =
0.7;
void
face_detect_dnn()
;void
mtcnn_demo()
;int
main
(int argc,
char
** ar**)
void
face_detect_dnn()
//開啟攝像頭
//videocapture capture("d:/images/video/boogie_up.mp4");
videocapture capture(0
);if(
!capture.
isopened()
) mat frame;
int count =0;
while
(capture.
read
(frame))}
float fps =
gettickfrequency()
/(gettickcount()
- start)
; ss.
str("")
; ss <<
"fps:"
<< fps <<
";inference time: "
<< time <<
" ms"
;puttext
(frame, ss.
str(),
point(20
,20),
0,0.75
,scalar(0
,0,255),
2,8)
;imshow
("dnn_face_detect"
, frame);if
(waitkey(1
)>=0)
break;}
printf
("total face: %d\n"
, count)
;}
人臉識別之人臉檢測
人臉識別分為人臉檢測 人臉預處理 蒐集和學習人臉以及人臉識別四個部分,此部分將人臉檢測。本文基於opencv進行的。在opencv中常用的人臉檢測器有基於lbp的特徵檢測 基於haar的特徵檢測,兩者的區別 前者比後者快好幾倍且不需要許可協議,但很多haar檢測器需要許可協議。基於haar的臉部檢測...
OpenCV人臉檢測 眼睛檢測之在人臉以外找眼睛
今天在學習opencv人臉檢測時,發現眼睛檢測是在人臉以外尋找眼睛的,源 如下 import cv2 def detect face cascade cv2.cascadeclassifier cascades haarcascade frontalface default.xml eye casc...
人臉檢測2
下面的 是講具體如何訓練 當時我想研究車牌識別的,用此方法對車牌進行訓練沒有成功,呵呵。下面是成功的例子,注意是 opencv中的traincascade.exe不是 另外那個 opencv traincascade.exe data data vec a.vec bg e lch train im...