2023年12月8日金曜日

居眠り検知のAIを作ってみる。

 最近おじさん、ようやく作りたい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();

}


--------------------------

本当に簡単に作れるんですね。