最近おじさん、ようやく作りたいAIが作れるようになってきました。
このまえ居眠り検知をするAIを作っている会社の人のデモをみて思ったのです。
これおじさんでも作れる!
eal-Time Eye Blink Detection using Facial Landmarks
https://vision.fe.uni-lj.si/cvww2016/proceedings/papers/05.pdf
眠気を判定!目のまばたき検知をDlibとOpenCVを組み合わせて数十行で作る
https://qiita.com/mogamin/items/a65e2eaa4b27aa0a1c23
ラズパイカメラによる眠気検知とWebストリーミング
https://qiita.com/AkitoArai709/items/b8a23af4042de1aa0fdd
作ってる人たくさんいますね。
これも距離を計算するだけなのね。
おじさんもC++で作ってみました。
--------------------------
#define DLIB_JPEG_SUPPORT 1
#include <dlib_dnn.h>
#include <dlib_gui_widgets.h>
#include <dlib_clustering.h>
#include <dlib_string.h>
#include <dlib_image_io.h>
#include <dlib_image_processing_frontal_face_detector.h>
using namespace dlib;
using namespace std;
float EAR(point p1, point p2, point p3, point p4, point p5, point p6)
{
float a1=sqrt( (p6.x() - p2.x()) * (p6.x() - p2.x()) + (p6.y() - p2.y()) * (p6.y() - p2.y()));
float a2 = sqrt((p3.x() - p5.x()) * (p3.x() - p5.x()) + (p3.y() - p5.y()) * (p3.y() - p5.y()));
float a3 = sqrt((p1.x() - p4.x()) * (p1.x() - p4.x()) + (p1.y() - p4.y()) * (p1.y() - p4.y()));
return (a1 + a2) / (2 * a3);
}
// ----------------------------------------------------------------------------------------
float detectSleepiness(full_object_detection& fod)
{
point p1,p2,p3,p4,p5,p6;
float ear1, ear2;
float ret = 0;
p1=fod.part(36);
p2 = fod.part(37);
p3 = fod.part(38);
p4 = fod.part(39);
p5 = fod.part(40);
p6 = fod.part(41);
ear1 = EAR(p1, p2, p3, p4, p5, p6);
p1 = fod.part(42);
p2 = fod.part(43);
p3 = fod.part(44);
p4 = fod.part(45);
p5 = fod.part(46);
p6 = fod.part(47);
ear2 = EAR(p1, p2, p3, p4, p5, p6);
// printf("ear1=%f era2=%f \n",ear1,ear2);
ret = ear1+ear2;
return ret;
}
int main(int argc, char** argv)
{
//const char* face_image = "202304_2_1.jpg";
//const char* face_image = "kuchikomi1074_TP_V.jpg";
const char* face_image = "taihige-hiyake001.jpg";
float sleepiness;
if (argc >= 2)face_image = argv[1];
frontal_face_detector detector = get_frontal_face_detector();
shape_predictor sp;
deserialize("shape_predictor_68_face_landmarks.dat") >> sp;
array2d<rgb_pixel> img;
load_image(img, face_image);
pyramid_up(img);
std::vector<rectangle> dets = detector(img);
cout << "Number of faces detected: " << dets.size() << endl;
std::vector<full_object_detection> shapes;
for (unsigned long j = 0; j < dets.size(); ++j)
{
full_object_detection shape = sp(img, dets[j]);
cout << "number of parts: " << shape.num_parts() << endl;
shapes.push_back(shape);
}
sleepiness=detectSleepiness(shapes[0]);
printf("sleepiness=%f\n",sleepiness);
cout << "hit enter to terminate" << endl;
cin.get();
}
--------------------------
本当に簡単に作れるんですね。