±à¼ÍƼö: |
Face ID µÄÐËÆð´ø¶¯ÁËÒ»²¨Ã沿ʶ±ð¼¼ÊõÈȳ±¡£±¾ÎĽ«½éÉÜÈçºÎʹÓà OpenCV¡¢Python
ºÍÉî¶ÈѧϰÔÚͼÏñºÍÊÓÆµÖÐʵÏÖÃæ²¿Ê¶±ð£¬ÒÔ»ùÓÚÉî¶Èʶ±ðµÄÃæ²¿Ç¶È룬ʵʱִÐÐÇÒ´ïµ½¸ß׼ȷ¶È¡£
±¾ÎÄÀ´×ÔÓÚcsdn£¬ÓÉ»ðÁú¹ûÈí¼þAnna±à¼¡¢ÍƼö¡£ |
|
ÏëÖªµÀÔõÑùÓÃOpenCV¡¢PythonºÍÉî¶Èѧϰ½øÐÐÃæ²¿Ê¶±ðÂð£¿
ÕâÆªÎÄÕÂÊ×ÏȽ«¼òµ¥½éÉÜÏ»ùÓÚÉî¶ÈѧϰµÄÃæ²¿Ê¶±ðµÄ¹¤×÷ÔÀí£¬ÒÔ¼°¡°Éî¶È¶ÈÁ¿Ñ§Ï°¡±£¨deep metric
learning£©µÄ¸ÅÄî¡£½ÓÏÂÀ´ÎÒ»á°ïÄã°²×°ºÃÃæ²¿Ê¶±ðÐèÒªµÄ¿â¡£×îºóÎÒÃǻᷢÏÖ£¬Õâ¸öÃæ²¿Ê¶±ðµÄʵÏÖÄܹ»ÊµÊ±ÔËÐС£
 ¨„Àí½âÉî¶ÈÑ§Ï°Ãæ²¿Ê¶±ðǶÈë
ÄÇô£¬»ùÓÚÉî¶ÈѧϰµÄÃæ²¿Ê¶±ðÊÇÔõÑù¹¤×÷µÄÄØ£¿ÃØÃܾÍÊÇÒ»ÖÖ½Ð×ö¡°Éî¶È¶ÈÁ¿Ñ§Ï°¡±µÄ¼¼Êõ¡£
Èç¹ûÄãÓÐÉî¶ÈѧϰµÄ¾Ñ飬ÄãÓ¦¸ÃÖªµÀ£¬Í¨³£Çé¿öÏÂѵÁ·ºÃµÄÍøÂç»á½ÓÊÜÒ»¸öÊäÈëͼÏñ£¬²¢ÇÒ¸øÊäÈëµÄͼÏñÉú³ÉÒ»¸ö·ÖÀà»ò±êÇ©¡£
¶øÔÚÕâÀï£¬ÍøÂçÊä³öµÄ²¢²»Êǵ¥Ò»µÄ±êÇ©£¨Ò²²»ÊÇͼÏñÖеÄ×ø±ê»ò±ß½çºÐ£©£¬¶øÊÇÊä³öÒ»¸ö±íÊ¾ÌØÕ÷ÏòÁ¿µÄʵÊý¡£
¶ÔÓÚdlibÃæ²¿Ê¶±ðÍøÂçÀ´Ëµ£¬Êä³öµÄÌØÕ÷ÏòÁ¿Îª128ά£¨¼´Ò»¸öÓÉ128¸öʵÊý×é³ÉµÄÁÐ±í£©£¬ÓÃÀ´ÅжÏÃæ²¿¡£ÍøÂçµÄѵÁ·ÊÇͨ¹ýÈýÔª×é½øÐеģº
ͼ1£ºÀûÓÃÉî¶È¶ÈÁ¿Ñ§Ï°½øÐÐÃæ²¿Ê¶±ðÐèÒª¡°ÈýÔª×éѵÁ·¡±¡£ÈýÔª×é°üÀ¨ÈýÕŲ»Í¬µÄÃæ²¿Í¼Ïñ£¬ÆäÖÐÁ½ÕÅÊôÓÚͬһ¸öÈË¡£Éñ¾ÍøÂçΪÿÕÅÃæ²¿Í¼ÏñÉú³ÉÒ»¸ö128άÏòÁ¿¡£¶ÔÓÚͬһ¸öÈ˵ÄÁ½ÕÅÃæ²¿Í¼Ïñ£¬ÎÒÃǵ÷ÕûÉñ¾ÍøÂçʹµÃÊä³öÏòÁ¿µÄ¾àÀë¶ÈÁ¿¾¡¿ÉÄܽӽü¡£Í¼Æ¬À´Ô´£ºAdam
GeitgeyµÄ¡°Machine
Learning is Fun¡±²©¿Í
ÕâÀïÎÒÃÇÐèÒª¸øÍøÂçÌṩÈýÕÅͼƬ£º
ÆäÖÐÁ½ÕÅͼƬÊÇͬһ¸öÈ˵ÄÃæ²¿£»µÚÈýÕÅͼƬÊÇ´ÓÊý¾Ý¼¯ÖÐÈ¡µÃµÄËæ»úÃæ²¿Í¼Æ¬£¬²¢ÇÒ±£Ö¤ÓëÁíÍâÁ½ÕÅͼƬ²»ÊÇͬһ¸öÈË¡£ÒÔͼ1ΪÀý£¬ÕâÀïÎÒÃÇÓÃÁËÈýÕÅͼƬ£¬Ò»ÕÅÊÇChad
Smith£¬Á½ÕÅÊÇWill Ferrell¡£
ÍøÂç»á²âÊÔÕâÐ©Ãæ²¿Í¼Æ¬£¬²¢ÎªÃ¿ÕÅͼƬÉú³É128άǶÈ루embedding£¬¼´qualification£©¡£
½ÓÏÂÀ´£¬»ù±¾Ë¼Â·¾ÍÊǵ÷ÕûÉñ¾ÍøÂçµÄÈ¨ÖØ£¬Ê¹µÃÁ½ÕÅWill FerrellµÄ²âÁ¿½á¹û¾¡Á¿½Ó½ü£¬¶øChad
SmithµÄ²âÁ¿½á¹ûÔ¶Àë¡£
ÎÒÃǵÄÃæ²¿Ê¶±ðÍøÂçµÄ¼Ü¹¹»ùÓÚHeµÈÈËÔÚ¡¶Deep Residual Learning for Image
Recognition¡·£¨https://arxiv.org/abs/1512.03385£©ÖÐÌá³öµÄResNet-34£¬µ«²ãÊý½ÏÉÙ£¬¶øÇÒ¹ýÂËÆ÷µÄÊýÁ¿¼õÉÙÁËÒ»°ë¡£
ÍøÂç±¾ÉíDavis KingÔÚ´óÔ¼300ÍòÕÅͼƬÉÏѵÁ·¡£ÔÚLabeled
Faces in the Wild£¨LFW£©£¨http://vis-www.cs.umass.edu/lfw/£©Êý¾Ý¼¯ÉÏÓëÆäËû·½·¨Ïà±È£¬¸ÃÍøÂçµÄ׼ȷ¶È´ïµ½ÁË99.38%¡£
Davis King£¨dlibµÄ×÷Õߣ©ºÍAdam Geitgey£¨https://adamgeitgey.com/£¬
ÎÒÃǼ´½«Óõ½µÄface_recognitionÄ£¿éµÄ×÷Õߣ©¶¼ÓÐÎÄÕ½éÉÜÁË»ùÓÚÉî¶ÈѧϰµÄÃæ²¿Ê¶±ðµÄ¹¤×÷ÔÀí£º
High Quality Face Recognition with
Deep Metric Learning£¨Davis£©
Modern Face Recognition with Deep
Learning£¨ Adam£¬£©
Ç¿ÁÒ½¨ÒéÔĶÁÒÔÉÏÎÄÕ£¬ÒÔÉîÈëÁ˽âÉî¶ÈÑ§Ï°Ãæ²¿Ç¶ÈëµÄ¹¤×÷ÔÀí¡£
¨„°²×°Ã沿ʶ±ð¿â
ΪÁËÓÃPythonºÍOpenCVÎüÄÉÃæ²¿Ê¶±ð£¬ÎÒÃÇÐèÒª°²×°Ò»Ð©¿â£º
dlib£»
face_recognition¡£
ÓÉDavis Kingά»¤µÄdlib¿â°üº¬ÁË¡°Éî¶È¶ÈÁ¿Ñ§Ï°¡±µÄʵÏÖ£¬ÓÃÀ´ÔÚʵ¼ÊµÄʶ±ð¹ý³ÌÖй¹½¨Ã沿ǶÈë¡£
Adam Geitgey´´½¨µÄface_recognition¿âÔò·â×°ÁËdlibµÄÃæ²¿Ê¶±ð¹¦ÄÜ£¬Ê¹Ö®¸üÒ×Óá£
ÎÒ¼ÙÉèÄãµÄϵͳÉÏÒѾװºÃÁËOpenCV¡£Èç¹ûûÓÐÒ²²»Óõ£ÐÄ£¬¿ÉÒÔ¿´¿´ÎÒµÄOpenCV°²×°Ö¸ÄÏÒ»ÎÄ£¬Ñ¡ÔñÊʺÏÄãµÄϵͳµÄÖ¸Äϼ´¿É¡£
ÕâÀïÎÒÃÇÀ´°²×°dlibºÍface_recognition¿â¡£
×¢Ò⣺ÏÂÃæµÄ°²×°¹ý³ÌÐèÒªÔÚPythonÐéÄâ»·¾³ÖнøÐС£ÎÒÇ¿ÁÒÍÆ¼öʹÓÃÐéÄâ»·¾³À´¸ôÀëÏîÄ¿£¬ÕâÊÇʹÓÃPythonµÄºÃϰ¹ß¡£Èç¹ûÄã¿´ÁËÎÒµÄOpenCV°²×°Ö¸ÄÏ£¬²¢ÇÒ°²×°ÁËvirtualenvºÍvirtualenvwrapper£¬ÄÇôֻҪÔÚ°²×°dlibºÍface_recognition֮ǰִÐÐworkonÃüÁî¼´¿É¡£
°²×°Ã»ÓÐGPUÖ§³ÖµÄdlib
Èç¹ûÄãûÓÐGPU£¬¿ÉÒÔÓÃpip°²×°dlib£¨²Î¿¼ÕâÆªÖ¸ÄÏ£©¡£
$ workon # optional
$ pip install dlib |
»òÕß´ÓÔ´´úÂë½øÐбàÒ룺
workon <your
env name here> # optional
$ git clone https://github.com/davisking/dlib.git
$ cd dlib
$ mkdir build
$ cd build
$ cmake .. -DUSE_AVX_INSTRUCTIONS=1
$ cmake --build .
$ cd ..
$ python setup.py install --yes USE_AVX_INSTRUCTIONS |
°²×°ÓÐGPUÖ§³ÖµÄdlib£¨¿ÉÑ¡£©
Èç¹ûÄãÓмæÈÝCUDAµÄGPU£¬ÄÇô¿ÉÒÔ°²×°ÓÐGPUÖ§³ÖµÄdlib£¬ÕâÑùÃæ²¿Ê¶±ðÄܸü¿ì¡¢¸ü¾«È·¡£
ÎÒ½¨Òé´ÓÔ´´úÂë°²×°dlib£¬ÕâÑù¿ÉÒÔ¸ü¾«Ï¸µØ¿ØÖư²×°¹ý³Ì£º
$ workon <your
env name here> # optional
$ git clone https://github.com/davisking/dlib.git
$ cd dlib
$ mkdir build
$ cd build
$ cmake .. -DDLIB_USE_CUDA=1 -DUSE_AVX_INSTRUCTIONS=1
$ cmake --build .
$ cd ..
$ python setup.py install - -yes USE_AVX_INSTRUCTIONS
--yes DLIB_USE_CUDA |
°²×°face_recognition°ü
face_recognitionÄ£¿éÖ»Ðè¼òµ¥µØÊ¹ÓÃpipÃüÁî¼´¿É°²×°£º
$ workon <your
env name here> # optional
$ pip install face_recognition |
°²×°imutlis
ÎÒÃÇ»¹ÐèÒªimutils°üÌṩһЩ±éÀúµÄº¯Êý¡£ÔÚPythonÐéÄâ»·¾³ÖÐʹÓÃpip¼´¿É£º
$ workon <your
env name here> # optional
$ pip install imutils |
¨„Ãæ²¿Ê¶±ðÊý¾Ý¼¯

ͼ2£ºÀûÓÃPythonºÍBingͼÏñËÑË÷API×Ô¶¯´´½¨µÄÃæ²¿Ê¶±ðÊý¾Ý¼¯£¬Í¼ÖÐÏÔʾµÄÊǵçÓ°ÙªÂ޼͹«Ô°µÄÁù¸ö½ÇÉ«¡£
1993ÄêµÄ¡¶ÙªÂ޼͹«Ô°¡·ÊÇÎÒ×îϲ»¶µÄµçÓ°£¬ÎªÁ˼ÍÄî×îÐÂÉÏÓ³µÄ¡¶ÙªÂÞ¼ÍÊÀ½ç£ºÊ§ÂäÍõ¹ú¡·£¬ÎÒÃǽ«Ê¹ÓõçÓ°ÖеÄһЩ½ÇÉ«½øÐÐÃæ²¿Ê¶±ð£º
Alan Grant£¬¹ÅÉúÎïѧ¼Ò£¨22ÕÅͼÏñ£©
Clair Dearing£¬¹«Ô°¹ÜÀíÈË£¨53ÕÅͼÏñ£©
Ellie Sattler£¬¹ÅÉúÎïѧ¼Ò£¨31ÕÅͼÏñ£©
Ian Malcolm£¬Êýѧ¼Ò£¨41ÕÅͼÏñ£©
John Hammond£¬ÉÌÈË£¬ÙªÂ޼͹«Ô°ËùÓÐÕߣ¨36ÕÅͼÏñ£©
Owen Grady£¬¿ÖÁúÑо¿Ñ§Õߣ¨35ÕÅͼÏñ£©
Õâ¸öÊý¾Ý¼¯Ö»ÐèÒª30·ÖÖӾͿÉÒÔ½¨ºÃ£¬²Î¼ûÎÒµÄÎÄÕ¡¶ÔõÑù£¨¿ìËÙ£©½¨Á¢Éî¶ÈѧϰͼÏñÊý¾Ý¼¯¡·¡£
ÓÐÁËÕâ¸öÊý¾Ý¼¯£¬ÎÒÃÇ¿ÉÒÔ£º
ΪÊý¾Ý¼¯ÖеÄÿÕÅͼÏñ½¨Á¢128άǶÈ룻
ÀûÓÃÕâЩǶÈ룬´ÓͼÏñºÍÊÓÆµÖÐʶ±ðÿ¸ö½ÇÉ«µÄÃæ²¿¡£ ¨„Ãæ²¿Ê¶±ðÏîÄ¿½á¹¹
ÏîÄ¿½á¹¹¿ÉÒԲο¼ÏÂÃæµÄtreeÃüÁîµÄÊä³ö½á¹û£º
$ tree --filelimit
10 --dirsfirst
.
©À©¤©¤ dataset
©¦ ©À©¤©¤ alan_grant [22 entries]
©¦ ©À©¤©¤ claire_dearing [53 entries]
©¦ ©À©¤©¤ ellie_sattler [31 entries]
©¦ ©À©¤©¤ ian_malcolm [41 entries]
©¦ ©À©¤©¤ john_hammond [36 entries]
©¦ ©¸©¤©¤ owen_grady [35 entries]
©À©¤©¤ examples
©¦ ©À©¤©¤ example_01.png
©¦ ©À©¤©¤ example_02.png
©¦ ©¸©¤©¤ example_03.png
©À©¤©¤ output
©¦ ©¸©¤©¤ lunch_scene_output.avi
©À©¤©¤ videos
©¦ ©¸©¤©¤ lunch_scene.mp4
©À©¤©¤ search_bing_api.py
©À©¤©¤ encode_faces.py
©À©¤©¤ recognize_faces_image.py
©À©¤©¤ recognize_faces_video.py
©À©¤©¤ recognize_faces_video_file.py
©¸©¤©¤ encodings.pickle
10 directories, 11 files |
¸ÃÏîÄ¿ÓÐ4¸ö¶¥²ãĿ¼£º
dataset/£º°üº¬Áù¸ö½ÇÉ«µÄÃæ²¿Í¼Ïñ£¬ÓýÇÉ«Ãû×éÖ¯µ½¸÷¸ö×ÓĿ¼ÖУ»
examples/£º°üº¬Èý¸ö²»ÊôÓÚ¸ÃÊý¾Ý¼¯µÄ²âÊÔͼÏñ£»
output/£º´æ´¢¾¹ýÃæ²¿Ê¶±ð´¦ÀíºóµÄÊÓÆµ£¬ÉÏÃæÓÐÎÒÉú³ÉµÄÒ»¸öÊÓÆµ£¬À´×ÔÓÚÔ°æ¡¶ÙªÂ޼͹«Ô°¡·µçÓ°µÄÎç·¹³¡¾°£»
videos/£ºÊäÈëÊÓÆµ´æ·ÅÓÚ¸ÃÎļþ¼ÐÖУ¬¸ÃÎļþ¼ÐÒ²°üº¬ÁËÉÐδ¾¹ýÃæ²¿Ê¶±ðµÄ¡°Îç·¹³¡¾°¡±µÄÊÓÆµ¡£
¸ùĿ¼Ï»¹ÓÐ6¸öÎļþ£º
search_bing_api.py£ºµÚÒ»²½¾ÍÊǽ¨Á¢Êý¾Ý¼¯£¨ÎÒÒѾ°ïÄã×öºÃÁË£©¡£¹ØÓÚÀûÓÃBing
API½¨Á¢Êý¾Ý¼¯µÄ¾ßÌå·½·¨Çë²Î¿¼ÎÒÕâÆªÎÄÕ£º
encode_faces.py£º¸Ã½Å±¾ÓÃÀ´½øÐÐÃæ²¿±àÂ루128άÏòÁ¿£©£»
recognize_faces_image.py£º»ùÓÚÊý¾Ý¼¯Éú³ÉµÄ±àÂ룬¶Ôµ¥ÕÅͼƬ½øÐÐÃæ²¿Ê¶±ð£»
recognize_faces_video.py£º¶ÔÀ´×ÔÉãÏñÍ·µÄʵʱÊÓÆµÁ÷½øÐÐÃæ²¿Ê¶±ð²¢Êä³öÊÓÆµÎļþ£»
recognize_faces_video_file.py£º¶ÔÓ²ÅÌÉϱ£´æµÄÊÓÆµÎļþ½øÐÐÃæ²¿Ê¶±ð£¬²¢Êä³ö´¦ÀíºóµÄÊÓÆµÎļþ¡£±¾ÎIJ»ÔÙÌÖÂ۸ýű¾£¬ÒòΪËüµÄ»ù±¾½á¹¹ÓëÉÏÃæÊ¶±ðÊÓÆµÁ÷µÄ½Å±¾Ïàͬ£»
encodings.pickle£º¸Ã½Å±¾½«encode_faces.pyÉú³ÉµÄÃæ²¿Ê¶±ð±àÂëÐòÁл¯²¢±£´æµ½Ó²ÅÌÉÏ¡£
ÓÃsearch_bing_api.py´´½¨ºÃͼÏñÊý¾Ý¼¯Ö®ºó£¬¾Í¿ÉÒÔÔËÐÐencode_faces.pyÀ´´´½¨Ç¶ÈëÁË¡£
½ÓÏÂÀ´ÎÒÃǽ«ÔËÐÐʶ±ð½Å±¾À´½øÐÐÃæ²¿Ê¶±ð¡£
¨„ÓÃOpenCVºÍÉî¶Èѧϰ¶ÔÃæ²¿½øÐбàÂë

ͼ3£ºÀûÓÃÉî¶ÈѧϰºÍPython½øÐÐÃæ²¿Ê¶±ð¡£¶Ôÿһ¸öÃæ²¿Í¼Ïñ£¬ÓÃface_recognitionÄ£¿éµÄ·½·¨Éú³ÉÒ»¸ö128άʵÊýÌØÕ÷ÏòÁ¿¡£
ÔÚʶ±ðͼÏñºÍÊÓÆµÖеÄÃæ²¿Ö®Ç°£¬ÎÒÃÇÊ×ÏÈÐèÒªÔÚѵÁ·¼¯ÖÐʶ±ðÃæ²¿¡£Òª×¢ÒâµÄÊÇ£¬ÎÒÃDz¢²»ÊÇÔÚѵÁ·ÍøÂ硪¡ª¸ÃÍøÂçÒѾÔÚ300ÍòͼÏñµÄѵÁ·¼¯ÉÏѵÁ·¹ýÁË¡£
µ±È»ÎÒÃÇ¿ÉÒÔ´ÓÍ·¿ªÊ¼ÑµÁ·ÍøÂ磬»òÕß΢µ÷ÒÑÓÐÄ£Ð͵ÄÈ¨ÖØ£¬µ«ÄǾͳ¬³öÁËÕâ¸öÏîÄ¿µÄ·¶Î§¡£ÔÙ˵£¬ÄãÐèÒª¾ÞÁ¿µÄͼÏñ²ÅÄÜ´ÓÍ·¿ªÊ¼ÑµÁ·ÍøÂç¡£
Ïà·´£¬Ê¹ÓÃÔ¤ÏÈѵÁ·ºÃµÄÍøÂçÀ´¸øÑµÁ·¼¯ÖеÄ218ÕÅÃæ²¿Í¼Ïñ½¨Á¢128άǶÈë¸üÈÝÒ×Щ¡£
È»ºó£¬ÔÚ·ÖÀà¹ý³ÌÖУ¬Ö»ÐèÀûÓüòµ¥µÄk-NNÄ£ÐÍ£¬¼ÓÉÏͶƱ£¬¼´¿ÉÈ·¶¨×îÖÕµÄÃæ²¿·ÖÀ࣬Ҳ¿ÉÒÔʹÓÃÆäËû¾µä»úÆ÷ѧϰģÐÍ¡£
ÏÖÔÚ´ò¿ª±¾ÎÄ¡°ÏÂÔØ¡±Á´½ÓÖеÄencode_faces.pyÎļþ£¬¿´¿´ÊÇÈçºÎ¹¹½¨Ã沿ǶÈëµÄ£º
1# import
the necessary packages
2from imutils import paths
3import face_recognition
4import argparse
5import pickle
6import cv2
7import os |
Ê×ÏÈÐèÒªµ¼Èë±ØÐèµÄ°ü¡£Õâ¸ö½Å±¾ÐèÒªÊÂÏȰ²×°imutils¡¢face_recognitionºÍOpenCV¡£Çë·µ½Ç°Ãæ¡°°²×°Ã沿ʶ±ð¿â¡±Ò»½ÚÈ·±£ÄãÒѾ°²×°Á˱ØÐëµÄ¿â¡£
Ê×ÏÈÓÃargparse´¦ÀíÔËÐÐʱ´«µÝµÄÃüÁîÐвÎÊý£º
1 # construct
the argument parser and parse the arguments
2 ap = argparse.ArgumentParser()
3 ap.add_argument("-i", "--dataset",
required=True,
4 help="path to input directory of faces
+ images")
5 ap.add_argument("-e", "--encodings",
required=True,
6 help="path to serialized db of facial
encodings")
7 ap.add_argument("-d", "--detection-method",
type=str, default="cnn",
8 help="face detection model to use: either
`hog` or `cnn`")
9 args = vars(ap.parse_args()) |
Èç¹ûÄã֮ǰûÓÐÓùýPyImageSearch£¬Äã¿ÉÒÔ¶à¶Á¶ÁÎҵIJ©¿ÍÎÄÕ£¬¾ÍÃ÷°×ÉÏÃæÕâ¶Î´úÂëÁË¡£Ê×ÏÈÀûÓÃargparse·ÖÎöÃüÁîÐвÎÊý£¬ÔÚÃüÁîÐÐÉÏÖ´ÐÐPython³ÌÐòʱ£¬¿ÉÒÔÔÚÖÕ¶ËÖиø½Å±¾Ìṩ¸ñÍâµÄÐÅÏ¢¡£µÚ2-9Ðв»ÐèÒª×öÈκθ͝£¬ËüÃÇÖ»ÊÇΪÁË·ÖÎöÖÕ¶ËÉϵÄÊäÈë¡£Èç¹û²»ÊìϤÕâЩ´úÂ룬¿ÉÒÔ¶Á¶ÁÎÒÕâÆª ÎÄÕ£º
¡£
ÏÂÃæÖðÒ»Áгö²ÎÊý£º
--dataset£ºÊý¾Ý¼¯µÄ·¾¶£¨ÀûÓÃsearch_bing_api.py´´½¨µÄÊý¾Ý¼¯£©£»
--encodings£ºÃ沿±àÂ뽫±»Ð´µ½¸Ã²ÎÊýËùÖ¸µÄÎļþÖУ»
--detection-method£ºÊ×ÏÈÐèÒª¼ì²âµ½Í¼ÏñÖеÄÃæ²¿£¬²ÅÄÜ¶ÔÆä½øÐбàÂë¡£Á½ÖÖÃæ²¿¼ì²â·½·¨Îªhog»òcnn£¬Òò´Ë¸Ã²ÎÊýÖ»½ÓÊÜÕâÁ½¸öÖµ¡£
ÏÖÔÚ²ÎÊýÒѾ¶¨ÒåºÃÁË£¬ÎÒÃÇ¿ÉÒÔ»ñµÃÊý¾Ý¼¯ÎļþµÄ·¾¶ÁË£¨Í¬Ê±½øÐÐÁ½¸ö³õʼ»¯£©£º
1 # grab
the paths to the input images in our dataset
2 print("[INFO] quantifying faces...")
3 imagePaths = list(paths.list_images(args["dataset"]))
4
5 # initialize the list of known encodings and
known names
6 knownEncodings = []
7 knownNames = [] |
ÐÐ3ÓÃÊäÈëÊý¾Ý¼¯µÄ·¾¶£¬½¨Á¢ÁËÒ»¸öÁбíimagePaths¡£
ÎÒÃÇ»¹ÐèÒªÔÚÑ»·¿ªÊ¼Ö®Ç°³õʼ»¯Á½¸öÁÐ±í£¬·Ö±ðÊÇknownEncodingsºÍknownNames¡£ÕâÁ½¸öÁбí·Ö±ð°üº¬Ã沿±àÂëÊý¾ÝºÍÊý¾Ý¼¯ÖÐÏàÓ¦ÈËÎïµÄÃû×Ö£¨ÐÐ6ºÍÐÐ7£©¡£
ÏÖÔÚ¿ÉÒÔÒÀ´ÎÑ»·ÙªÂ޼͹«Ô°ÖеÄÿ¸ö½ÇÉ«ÁË£¡
1 # loop
over the image paths
2 for (i, imagePath) in enumerate(imagePaths):
3 # extract the person name from the image path
4 print("[INFO] processing image {}/{}".format(i
+ 1,
5 len(imagePaths)))
6 name = imagePath.split(os.path.sep)[-2]
7
8 # load the input image and convert it from
BGR (OpenCV ordering)
9 # to dlib ordering (RGB)
10 image = cv2.imread (imagePath)
11 rgb = cv2.cvtColor (image, cv2.COLOR_BGR2RGB) |
Õâ¶Î´úÂë»áÑ»·218´Î£¬´¦ÀíÊý¾Ý¼¯ÖеÄ218ÕÅÃæ²¿Í¼Ïñ¡£ÐÐ2ÔÚËùÓÐͼÏñ·¾¶ÖнøÐÐÑ»·¡£
½ÓÏÂÀ´£¬ÐÐ6Òª´ÓimagePathÖÐÌáÈ¡ÈËÎïµÄÃû×Ö£¨ÒòΪ×ÓĿ¼Ãû¾ÍÊÇÈËÎïÃû£©¡£
È»ºó½«imagePath´«µÝ¸øcv2.imread£¨ÐÐ10£©£¬¶ÁȡͼÏñ±£´æµ½imageÖС£
OpenCVÖеÄÑÕɫͨµÀÅÅÁÐ˳ÐòΪBGR£¬µ«dlibÒªÇóµÄ˳ÐòΪRGB¡£ÓÉÓÚface_recognitionÄ£¿éʹÓÃÁËdlib£¬Òò´ËÔÚ¼ÌÐøÏÂÒ»²½Ö®Ç°£¬ÐÐ11ת»»ÁËÑÕÉ«¿Õ¼ä£¬²¢½«×ª»»ºóµÄÐÂͼÏñ±£´æÔÚrgbÖС£
½ÓÏÂÀ´¶¨Î»Ã沿λÖò¢¼ÆËã±àÂ룺
1 # detect
the (x, y)-coordinates of the bounding boxes
2 # corresponding to each face in the input
image
3 boxes = face_recognition.face_locations(rgb,
4 model=args[" detection_method"])
5
6 # compute the facial embedding for the face
7 encodings = face_recognition.face_encodings(rgb,
boxes)
8
9 # loop over the encodings
10 for encoding in encodings:
11 # add each encoding + name to our set of
known names and
12 # encodings
13 knownEncodings.append (encoding)
14 knownNames.append (name) |
Õâ¶Î´úÂëÊÇ×îÓÐÒâ˼µÄ²¿·Ö£¡
ÿ´ÎÑ»·¶¼»á¼ì²âÒ»¸öÃæ²¿Í¼Ïñ£¨»òÕßÒ»ÕÅͼÏñÖÐÓжà¸öÃæ²¿£¬ÎÒÃǼÙÉèÕâÐ©Ãæ²¿¶¼ÊôÓÚͬһ¸öÈË£¬µ«Èç¹ûÄãʹÓÃ×Ô¼ºµÄͼÏñµÄ»°£¬Õâ¸ö¼ÙÉèÓпÉÄܲ»³ÉÁ¢£¬ËùÒÔÒ»¶¨Òª×¢Ò⣩¡£
±ÈÈ磬¼ÙÉèrgbÀïµÄͼÏñÊÇEllie SattlerµÄÁ³¡£
ÐÐ3ºÍ4²éÕÒÃæ²¿Î»Ö㬷µ»ØÒ»¸ö°üº¬ÁËÐí¶à·½¿òµÄÁÐ±í¡£ÎÒÃǸøface_recognition.face_locations·½·¨´«µÝÁËÁ½¸ö²ÎÊý£º
rgb£ºRGBͼÏñ£»
model£ºcnn»òhog£¨¸ÃÖµ°üº¬ÔÚÃüÁîÐвÎÊý×ÖµäÖУ¬¸³¸øÁËdetection_method¼ü£©¡£CNN·½·¨±È½Ï׼ȷ£¬µ«ËٶȽÏÂý£»HOG±È½Ï¿ì£¬µ«²»Ì«×¼È·¡£
È»ºó£¬ÔÚÐÐ7£¬ÎÒÃÇÒª½«Ellie SattlerµÄÃæ²¿µÄ±ß½çºÐboxesת»»³É128¸öÊý×Ö¡£Õâ¸ö²½Öè¾ÍÊǽ«Ã沿±àÂë³ÉÏòÁ¿£¬¿ÉÒÔͨ¹ýface_recognition.face_encodings·½·¨ÊµÏÖ¡£
½ÓÏÂÀ´ÖÈÐò½«Ellie SattlerµÄencodingºÍnameÌí¼Óµ½Ç¡µ±µÄÁбíÖУ¨knownEncodings»òknownNames£©¡£
È»ºó¶ÔÊý¾Ý¼¯ÖÐËùÓÐ218ÕÅͼÏñ½øÐÐÕâÒ»²½Öè¡£
ÌáÈ¡ÕâЩ±àÂëencodingsµÄÄ¿µÄ¾ÍÊÇÒªÔÚÁíÒ»¸ö½Å±¾ÖÐÀûÓÃËüÃǽøÐÐÃæ²¿Ê¶±ð¡£ÏÖÔÚÀ´¿´¿´Ôõô×ö£º
1 # dump
the facial encodings + names to disk
2 print("[INFO] serializing encodings...")
3 data = {"encodings": knownEncodings,
"names": knownNames}
4 f = open(args[" encodings"], "wb")
5 f.write(pickle.dumps(data))
6 f.close() |
ÐÐ3¹¹½¨ÁËÒ»¸ö×ֵ䣬Ëü°üº¬encodingsºÍnamesÁ½¸ö¼ü¡£
ÐÐ4-6½«Ãû×ֺͱàÂë±£´æµ½Ó²ÅÌÖУ¬¹©ÒÔºóʹÓá£
ÔõÑù²ÅÄÜÔÚÖÕ¶ËÉÏÔËÐÐencode_faces.py½Å±¾£¿
Òª´´½¨Ã沿ǶÈ룬¿ÉÒÔ´ÓÖÕ¶ËÖ´ÐÐÒÔÏÂÃüÁ
1 $ python
encode_faces.py --dataset dataset --encodings
encodings.pickle
2 [INFO] quantifying faces...
3 [INFO] processing image 1/218
4 [INFO] processing image 2/218
5 [INFO] processing image 3/218
6 ...
7 [INFO] processing image 216/218
8 [INFO] processing image 217/218
9 [INFO] processing image 218/218
10 [INFO] serializing encodings...
11 $ ls -lh encodings*
12 -rw-r--r--@ 1 adrian staff 234K May 29 13:03
encodings.pickle |
´ÓÊä³öÖпμþ£¬ËüÉú³ÉÁ˸öÃûΪencodings.pickleµÄÎļþ£¬¸ÃÎļþ°üº¬ÁËÊý¾Ý¼¯ÖÐÿ¸öÃæ²¿Í¼ÏñµÄ128Î¬Ãæ²¿Ç¶Èë¡£
ÔÚÎÒµÄTitan X GPUÉÏ£¬´¦ÀíÕû¸öÊý¾Ý¼¯»¨·ÑÁËÒ»·ÖÖÓ¶àÒ»µã£¬µ«Èç¹ûֻʹÓÃCPU£¬¾ÍÒª×öºÃµÈ´ýºÜ¾ÃµÄÐÄÀí×¼±¸¡£
ÔÚÎÒµÄMacbook ProÉÏ£¨Ã»ÓÐGPU£©£¬±àÂë218ÕÅͼÏñÐèÒª21·Ö20Ãë¡£
Èç¹ûÄãÓÐGPU²¢ÇÒ±àÒëdlibʱѡÔñÁËÖ§³ÖGPU£¬ÄÇôËÙ¶ÈÓ¦¸Ã»á¿ìµÃ¶à¡£
¨„ʶ±ðͼÏñÖеÄÃæ²¿

ͼ4£ºJohn HammondµÄÃæ²¿Ê¶±ð£¬Ê¹ÓÃÁËAdam GeitgeyµÄÉî¶ÈѧϰPythonÄ£¿éface_recognition¡£
ÏÖÔÚÒѾ¸øÊý¾Ý¼¯ÖеÄÿÕÅͼÏñ½¨ºÃÁË128Î¬Ãæ²¿Ç¶È룬ÎÒÃÇ¿ÉÒÔÓÃOpenCV¡¢PythonºÍÉî¶Èѧϰ½øÐÐÃæ²¿Ê¶±ðÁË¡£
´ò¿ªrecognize_faces_image.py£¬²åÈëÒÔÏ´úÂ루»òÕß´Ó±¾Îĵġ±ÏÂÔØ¡°²¿·ÖÏÂÔØ´úÂëºÍÏà¹ØµÄͼÏñ£©£º
1 # import
the necessary packages
2 import face_recognition
3 import argparse
4 import pickle
5 import cv2
6
7 # construct the argument parser and parse
the arguments
8 ap = argparse.ArgumentParser()
9 ap.add_argument ("-e", "--encodings",
required=True,
10 help="path to serialized db of facial
encodings")
11 ap.add_argument ("-i", "--image",
required=True,
12 help="path to input image")
13 ap.add_argument ("-d", " --detection-method",
type=str, default="cnn",
14 help="face detection model to use: either
`hog` or `cnn`")
15 args = vars(ap.parse_args()) |
Õâ¶Î´úÂëÊ×Ïȵ¼ÈëÁ˱ØÐèµÄ°ü£¨ÐÐ2-5£©¡£face_recognitionÄ£¿éÍê³ÉÖ÷Òª¹¤×÷£¬OpenCV¸ºÔð¼ÓÔØÍ¼Ïñ¡¢×ª»»Í¼Ïñ£¬²¢ÏÔʾ´¦ÀíÖ®ºóµÄͼÏñ¡£
ÐÐ8-15¸ºÔð·ÖÎöÈý¸öÃüÁîÐвÎÊý£º
--encodings£º°üº¬Ã沿±àÂëµÄpickleÎļþµÄ·¾¶£»
--image£ºÐèÒª½øÐÐÃæ²¿Ê¶±ðµÄͼÏñ£»
--detection-method£ºÕâ¸öÑ¡ÏîÓ¦¸ÃºÜÊìϤÁË¡£¿ÉÒÔ¸ù¾ÝϵͳµÄÄÜÁ¦£¬Ñ¡Ôñhog»òcnnÖ®Ò»¡£×·ÇóËٶȵϰ¾ÍÑ¡Ôñhog£¬×·Çó׼ȷ¶È¾ÍÑ¡Ôñcnn¡£
×¢Ò⣺ÔÚÊ÷Ý®ÅÉÉϱØÐëÑ¡Ôñhog£¬ÒòΪÄÚ´æÈÝÁ¿²»×ãÒÔÔËÐÐCNN·½·¨¡£
½ÓÏÂÀ´Òª¼ÓÔØ¼ÆËãºÃµÄ±àÂëºÍÃæ²¿Ãû³Æ£¬È»ºóΪÊäÈëͼÏñ¹¹½¨128Î¬Ãæ²¿±àÂ룺
1 # load
the known faces and embeddings
2 print("[INFO] loading encodings...")
3 data = pickle.loads (open(args["encodings"],
"rb").read())
4
5 # load the input image and convert it from
BGR to RGB
6 image = cv2.imread (args["image"])
7 rgb = cv2.cvtColor (image, cv2.COLOR_BGR2RGB)
8
9 # detect the (x, y) -coordinates of the bounding
boxes corresponding
10 # to each face in the input image, then compute
the facial embeddings
11 # for each face
12 print("[INFO] recognizing faces...")
13 boxes = face_recognition.face_locations(rgb,
14 model=args[" detection_method"])
15 encodings = face_recognition.face_encodings(rgb,
boxes)
16
17 # initialize the list of names for each face
detected
18 names = [] |
ÐÐ3´ÓÓ²Å̼ÓÔØpickle¹ýµÄ±àÂëºÍÃû×ÖÊý¾Ý¡£ÉÔºóÔÚʵ¼ÊµÄÃæ²¿Ê¶±ð²½ÖèÖлáÓõ½ÕâЩÊý¾Ý¡£
È»ºó£¬ÐÐ6ºÍÐÐ7¼ÓÔØÊäÈëͼÏñimage£¬²¢×ª»»ÆäÑÕɫͨµÀ˳Ðò£¨Í¬encode_faces.py½Å±¾Ò»Ñù£©£¬±£´æµ½rgbÖС£
½ÓÏÂÀ´£¬ÐÐ13-15¼ÌÐø¼ì²âÊäÈëͼÏñÖеÄËùÓÐÃæ²¿£¬²¢¼ÆËãËüÃǵÄ128άencodings£¨ÕâЩ´úÂëÒ²Ó¦¸ÃºÜÊìϤÁË£©¡£
ÏÖÔÚÓ¦¸Ã³õʼ»¯Ò»¸öÁбínames£¬ÓÃÀ´±£´æÃ¿¸ö¼ì²âµÄÃæ²¿¡£¸ÃÁÐ±í½«ÔÚÏÂÒ»²½Ìî³ä¡£
ÏÖÔÚ±éÀúÃæ²¿±àÂëencodingsÁÐ±í£º
1 # loop
over the facial embeddings
2 for encoding in encodings:
3 # attempt to match each face in the input
image to our known
4 # encodings
5 matches = face_recognition.compare_faces(data["encodings"],
6 encoding)
7 name = "Unknown" |
ÐÐ2¿ªÊ¼±éÀú¸ù¾ÝÊäÈëͼÏñ¼ÆËã³öµÄÃæ²¿±àÂë¡£
½ÓÏÂÀ´¼ûÖ¤Ãæ²¿Ê¶±ðµÄÆæ¼£°É£¡
ÔÚÐÐ5ºÍÐÐ6£¬ÎÒÃdz¢ÊÔÀûÓÃface_recognition.compare_faces½«ÊäÈëͼÏñÖеÄÿ¸öÃæ²¿£¨encoding£©¶ÔÓ¦µ½ÒÑÖªµÄ±àÂëÊý¾Ý¼¯£¨±£´æÔÚdata["encodings"]ÖУ©ÉÏ¡£
¸Ãº¯Êý»á·µ»ØÒ»¸öTrue/FalseÖµµÄÁÐ±í£¬Ã¿¸öÖµ¶ÔÓ¦ÓÚÊý¾Ý¼¯ÖеÄÒ»ÕÅͼÏñ¡£¶ÔÓÚÎÒÃǵÄÙªÂ޼͹«Ô°µÄÀý×Ó£¬Êý¾Ý¼¯ÖÐÓÐ218ÕÅͼÏñ£¬Òò´Ë·µ»ØµÄÁÐ±í½«°üº¬218¸ö²¼¶ûÖµ¡£
compare_facesº¯ÊýÄÚ²¿»á¼ÆËã´ýÅбðͼÏñµÄǶÈëºÍÊý¾Ý¼¯ÖÐËùÓÐÃæ²¿µÄǶÈëÖ®¼äµÄÅ·¼¸ÀïµÃ¾àÀë¡£
Èç¹û¾àÀëλÓÚÈÝÐí·¶Î§ÄÚ£¨ÈÝÐí·¶Î§Ô½Ð¡£¬Ã沿ʶ±ðϵͳ¾ÍÔ½Ñϸñ£©£¬Ôò·µ»ØTrue£¬±íÃ÷Ãæ²¿ÎǺϡ£·ñÔò£¬Èç¹û¾àÀë´óÓÚÈÝÐí·¶Î§£¬Ôò·µ»ØFalse±íÊ¾Ãæ²¿²»ÎǺϡ£
±¾ÖÊÉÏÎÒÃÇÓÃÁ˸ö¸ü¡±ìſᡰµÄk-NNÄ£ÐͽøÐзÖÀà¡£¾ßÌåµÄʵÏÖϸ½Ú¿ÉÒԲο¼compare_facesµÄ ʵÏÖ£¨£©¡£
×îÖÕ£¬name±äÁ¿»áµÄÖµ¾ÍÊÇÈ˵ÄÃû×Ö¡£Èç¹ûûÓÐÈκΡ±Í¶Æ±¡°£¬Ôò±£³Ö"Unknown"²»±ä£¨ÐÐ7£©¡£
¸ù¾ÝmatchesÁÐ±í£¬¿ÉÒÔ¼ÆËãÿ¸öÃû×ֵġ±Í¶Æ±¡°ÊýÄ¿£¨Óëÿ¸öÃû×Ö¹ØÁªµÄTrueÖµµÄÊýÄ¿£©£¬¼ÆÆ±Ö®ºóÑ¡Ôñ×îÊʺϵÄÈ˵ÄÃû×Ö£º
1 # check
to see if we have found a match
2 if True in matches:
3 # find the indexes of all matched faces then
initialize a
4 # dictionary to count the total number of
times each face
5 # was matched
6 matchedIdxs = [i for (i, b) in enumerate(matches)
if b]
7 counts = {}
8
9 # loop over the matched indexes and maintain
a count for
10 # each recognized face face
11 for i in matchedIdxs:
12 name = data["names"][i]
13 counts[name] = counts.get(name, 0) + 1
14
15 # determine the recognized face with the
largest number of
16 # votes (note: in the event of an unlikely
tie Python will
17 # select first entry in the dictionary)
18 name = max(counts, key=counts.get)
19
20 # update the list of names
21 names.append(name) |
Èç¹ûmatchesÖаüº¬ÈκÎTrueµÄͶƱ£¨ÐÐ2£©£¬ÔòÐèҪȷ¶¨TrueÖµÔÚmatchesÖеÄË÷ÒýλÖá£ÕâÒ»²½ÔÚÐÐ6ÖÐͨ¹ý½¨Á¢Ò»¸ö¼òµ¥µÄmatchedIdxsÁбíʵÏÖ¡£¶ÔÓÚexample_01.pngÀ´Ëµ£¬Ëü´ó¸ÅÊÇÕâ¸öÑù×Ó£º
1 (Pdb)
matchedIdxs
2 [35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45,
46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67,
68, 69, 71, 72, 73, 74, 75] |
È»ºó³õʼ»¯Ò»¸öÃûΪcountsµÄ×ֵ䣬Æä¼üΪ½ÇÉ«µÄÃû×Ö£¬ÖµÊÇͶƱµÄÊýÁ¿¡£
½ÓÏÂÀ´±éÀúmatchedIdxs£¬Í³¼ÆÃ¿¸öÏà¹ØµÄÃû×Ö£¬²¢ÔÚcountsÔö¼ÓÏàÓ¦µÄ¼ÆÊýÖµ¡£counts×Öµä¿ÉÄÜÊÇÕâ¸öÑù×Ó£¨Ian
Malcolm¸ßƱµÄÇé¿ö£©£º
1 (Pdb) counts
2 {'ian_malcolm': 40} |
»ØÒäÒ»ÏÂÎÒÃǵÄÊý¾Ý¼¯ÖÐÖ»ÓÐ41ÕÅͼƬ£¬Òò´Ë40·Ö²¢ÇÒûÓÐÈÎºÎÆäËûͶƱ¿ÉÒÔÈÏΪ·Ç³£¸ßÁË¡£
È¡³öcountsÖÐͶƱ×î¸ßµÄÃû×Ö£¬±¾ÀýÖÐΪ'ian_malcolm'¡£
Ñ»·µÄµÚ¶þ´Îµü´ú£¨ÓÉÓÚͼÏñÖÐÓÐÁ½¸öÈËÁ³£©»áÈ¡³öÏÂÃæµÄcounts£º
1 (Pdb) counts
2 {'alan_grant': 5} |
¾¡¹ÜÕâ¸öͶƱ·ÖÖµ½ÏµÍ£¬µ«ÓÉÓÚÕâÊÇ×ÖµäÖÐΨһµÄÈËÃû£¬ËùÒԺܿÉÄÜÎÒÃÇÕÒµ½ÁËAlan Grant¡£
×¢Ò⣺ÕâÀïʹÓÃÁËPythonµ÷ÊÔÆ÷PDBÀ´¼ì²écounts×ÖµäµÄÖµ¡£PDBµÄÓ÷¨³¬³öÁ˱¾Îĵķ¶Î§£¬Äã¿ÉÒÔÔÚPythonµÄÎĵµÒ³Ã棨£©ÕÒµ½ÆäÓ÷¨¡£
ÈçÏÂÃæµÄͼ5Ëùʾ£¬ÎÒÃÇÕýȷʶ±ðÁËIan MalcolmºÍAlan Grant£¬ËùÒÔÕâÒ»¶Î´úÂ빤×÷µÃ»¹²»´í¡£
ÎÒÃÇÀ´¼ÌÐøÑ»·Ã¿¸öÈ˵ı߽çºÐºÍÃû×Ö£¬È»ºó½«Ãû×Ö»ÔÚÊä³öͼÏñÉÏÒÔ¹©Õ¹Ê¾Ö®Óãº
1 # loop over the recognized
faces
2 for ((top, right, bottom, left) , name) in
zip(boxes, names):
3 # draw the predicted face name on the image
4 cv2.rectangle(image, (left, top), (right,
bottom), (0, 255, 0), 2)
5 y = top - 15 if top - 15 > 15 else top
+ 15
6 cv2.putText(image, name, (left, y), cv2.FONT_HERSHEY_SIMPLEX,
7 0.75, (0, 255, 0), 2)
8
9 # show the output image
10 cv2.imshow("Image", image)
11 cv2.waitKey(0) |
ÐÐ2¿ªÊ¼Ñ»·¼ì²âµ½µÄÃæ²¿±ß½çºÐboxesºÍÔ¤²âµÄnames¡£ÎÒÃǵ÷ÓÃÁËzip(boxes, names)ÒÔ´´½¨Ò»¸öÈÝÒ×½øÐÐÑ»·µÄ¶ÔÏó£¬Ã¿´Îµü´ú½«µÃµ½Ò»¸ö¶þÔª×飬´ÓÖпÉÒÔÌáÈ¡±ß½çºÐ×ø±êºÍÃû×Ö¡£
ÐÐ4ÀûÓñ߽çºÐ×ø±ê»Ò»¸öÂÌÉ«·½¿ò¡£
ÎÒÃÇ»¹ÀûÓÃ×ø±ê¼ÆËãÁËÈËÃûÎı¾µÄÏÔʾλÖã¨ÐÐ5£©£¬²¢½«ÈËÃûµÄÎı¾»ÔÚͼÏñÉÏ£¨ÐÐ6ºÍÐÐ7£©¡£Èç¹û±ß½çºÐλÓÚͼÏñ¶¥¶Ë£¬Ôò½«Îı¾ÒƵ½±ß½çºÐÏ·½£¨ÐÐ5£©£¬·ñÔòÎı¾¾Í±»½ØµôÁË¡£
È»ºóÏÔʾͼÏñ£¬Ö±µ½°´ÏÂÈÎÒâ¼üΪֹ£¨ÐÐ10ºÍ11£©¡£
ÔõÑùÔËÐÐÃæ²¿Ê¶±ðµÄPython½Å±¾£¿
ÔÚÖÕ¶ËÖУ¬Ê×ÏÈÓÃworkonÃüÁ֤λÓÚÕýÈ·µÄPythonÐéÄâ»·¾³ÖУ¨Èç¹ûÄãÓÃÁËÐéÄâ»·¾³µÄ»°£©¡£
È»ºóÔËÐиýű¾£¬Í¬Ê±ÖÁÉÙÌṩÁ½¸öÃüÁîÐвÎÊý¡£Èç¹ûÑ¡ÔñHoG·½Ê½£¬±ðÍüÁË´«µÝ--detection-method
hog£¨·ñÔòĬÈÏ»áʹÓÃÉî¶Èѧϰ¼ì²â·½Ê½£©¡£
¸Ï¿ìÊÔÊÔ°É£¡
´ò¿ªÖն˲¢Ö´Ðнű¾£¬ÓÃOpenCVºÍPython½øÐÐÃæ²¿Ê¶±ð£º
1 $ python recognize_faces_image.py
--encodings encodings.pickle \
2 --image examples/example_01.png
3 [INFO] loading encodings...
4 [INFO] recognizing faces... |

ͼ5£ºPython + OpenCV + Éî¶Èѧϰ·½·¨Ê¶±ð³öÁËAlan GrantºÍIan MalcomµÄÃæ²¿¡£
ÁíÒ»¸öÃæ²¿Ê¶±ðµÄÀý×Ó£º
1 $ python recognize_faces_image.py
--encodings encodings.pickle \
2 --image examples/example_02.png
3 [INFO] loading encodings...
4 [INFO] recognizing faces... |

ͼ6£ºÓÃOpenCVºÍPython½øÐÐÃæ²¿Ê¶±ð¡£
¨„ÔÚÊÓÆµÖнøÐÐÃæ²¿Ê¶±ð

ͼ7£ºÓÃPython¡¢OpenCVºÍÉî¶ÈѧϰÔÚÊÓÆµÖнøÐÐÃæ²¿Ê¶±ð¡£
ÎÒÃÇÒѾÍê³ÉÁËͼÏñÖеÄÃæ²¿Ê¶±ð£¬ÏÖÔÚÀ´ÊÔÊÔÔÚÊÓÆµÖнøÐУ¨ÊµÊ±£©Ã沿ʶ±ð¡£
¹ØÓÚÐÔÄܵÄÖØÒªÌáʾ£ºCNNÃæ²¿Ê¶±ðÆ÷Ö»ÄÜÔÚÓÐGPUµÄÇé¿öÏÂʵʱÔËÐУ¨CPUÒ²¿ÉÒÔÔËÐУ¬µ«ÊÓÆµ»á·Ç³£¿¨£¬Êµ¼ÊµÄÖ¡ËÙÂʲ»µ½0.5FPS£©¡£Èç¹ûÄãÖ»ÓÐCPU£¬Ó¦µ±¿¼ÂÇʹÓÃHoG·½Ê½£¨»òÕßÉõÖÁ²ÉÓÃOpenCVµÄHaar²ãµþ·½Ê½£¬ÒÔºó»á׫ÎÄ˵Ã÷£©£¬ÒÔ»ñµÃ½ÏºÃµÄËÙ¶È¡£
ÏÂÃæµÄ½Å±¾´ÓÇ°ÃæµÄrecognize_faces_image.py½Å±¾ÖнèÓÃÁËÐí¶à´úÂë¡£Òò´ËÎÒ½«ÂÔ¹ý֮ǰ½éÉܹýµÄ²¿·Ö£¬Ö»ËµÃ÷ÏÂÊÓÆµ²¿·Ö£¬ÒÔ±ãÓÚÀí½â¡£
ÏÂÔØºÃ´úÂëÖ®ºó£¬´ò¿ªrecognize_faces_video.py£º
1 # import the necessary
packages
2 from imutils.video import VideoStream
3 import face_recognition
4 import argparse
5 import imutils
6 import pickle
7 import time
8 import cv2
9
10 # construct the argument parser and parse
the arguments
11 ap = argparse.ArgumentParser()
12 ap.add_argument("-e", "--encodings",
required=True,
13 help="path to serialized db of facial
encodings")
14 ap.add_argument("-o", "--output",
type=str,
15 help="path to output video")
16 ap.add_argument("-y", "--display",
type=int, default=1,
17 help="whether or not to display output
frame to screen")
18 ap.add_argument("-d", "--detection-method",
type=str, default="cnn",
19 help="face detection model to use: either
`hog` or `cnn`")
20 args = vars(ap.parse_args()) |
ÐÐ2-8µ¼Èë°ü£¬È»ºóÐÐ11-20½âÎöÃüÁîÐвÎÊý¡£
ÕâÀïÓÐËĸöÃüÁîÐвÎÊý£¬ÆäÖÐÁ½¸öÊǽéÉܹýµÄ£¨--encodingsºÍ--detection-method£©¡£ÁíÍâÁ½¸ö²ÎÊýÊÇ£º
--output£ºÊÓÆµÊä³ö·¾¶£»
--display£ºÖ¸Ê¾ÊÇ·ñ½«ÊÓÆµÖ¡Êä³öµ½ÆÁÄ»µÄ±êÖ¾¡£1±íʾÏÔʾµ½ÆÁÄ»£¬0±íʾ²»ÏÔʾ¡£
È»ºó¼ÓÔØ±àÂë²¢Æô¶¯VideoStream£º
1 # load the known
faces and embeddings
2 print("[INFO] loading encodings...")
3 data = pickle.loads(open (args["encodings"],
"rb").read())
4
5 # initialize the video stream and pointer
to output video file, then
6 # allow the camera sensor to warm up
7 print("[INFO] starting video stream...")
8 vs = VideoStream(src=0).start()
9 writer = None
10 time.sleep(2.0) |
ÎÒÃÇÀûÓÃimutilsÖеÄVideoStreamÀàÀ´·ÃÎÊÉãÏñÍ·¡£ÐÐ8Æô¶¯ÊÓÆµÁ÷¡£Èç¹ûϵͳÖÐÓжà¸öÉãÏñÍ·£¨ÈçÄÚÖÃÉãÏñÍ·ºÍÍâÖÃUSBÉãÏñÍ·£©£¬¿ÉÒÔ½«src=0¸Ä³Ésrc=1µÈ¡£
ÉÔºó»á½«´¦Àí¹ýµÄÊÓÆµÐ´µ½Ó²ÅÌÖУ¬ËùÒÔÕâÀォwriter³õʼ»¯³ÉNone£¨ÐÐ9£©¡£sleepÁ½ÃëÈÃÉãÏñÍ·Ô¤ÈÈ¡£
½ÓÏÂÀ´Æô¶¯Ò»¸öwhileÑ»·£¬¿ªÊ¼×¥È¡²¢´¦ÀíÊÓÆµÖ¡£º
1 # loop over frames
from the video file stream
2 while True:
3 # grab the frame from the threaded video stream
4 frame = vs.read()
5
6 # convert the input frame from BGR to RGB
then resize it to have
7 # a width of 750px (to speedup processing)
8 rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
9 rgb = imutils.resize(frame, width=750)
10 r = frame.shape[1] / float(rgb.shape[1])
11
12 # detect the (x, y)-coordinates of the bounding
boxes
13 # corresponding to each face in the input
frame, then compute
14 # the facial embeddings for each face
15 boxes = face_recognition.face_locations(rgb,
16 model=args["detection_method"])
17 encodings = face_recognition.face_encodings(rgb,
boxes)
18 names = [] |
Ñ»·´ÓÐÐ2¿ªÊ¼£¬µÚÒ»²½¾ÍÊÇ´ÓÊÓÆµÁ÷ÖÐץȡһ¸öframe£¨ÐÐ4£©¡£
ÉÏÊö´úÂëÖÐʣϵÄÐÐ8-18»ù±¾ÉÏÓëǰһ¸ö½Å±¾Ïàͬ£¬Ö»²»¹ýÕâÀï´¦ÀíµÄÊÇÊÓÆµÖ¡£¬¶ø²»ÊǾ²Ì¬Í¼Ïñ¡£»ù±¾ÉϾÍÊǶÁÈ¡frame£¬Ô¤´¦Àí£¬¼ì²âµ½Ã沿±ß½çºÐboxes£¬È»ºó¸øÃ¿¸ö±ß½çºÐ¼ÆËãencodings¡£
½ÓÏÂÀ´±éÀúÿ¸öÕÒµ½µÄÃæ²¿µÄencodings£º
1 # loop over the facial
embeddings
2 for encoding in encodings:
3 # attempt to match each face in the input
image to our known
4 # encodings
5 matches = face_recognition.compare_faces(data["encodings"],
6 encoding)
7 name = "Unknown"
8
9 # check to see if we have found a match
10 if True in matches:
11 # find the indexes of all matched faces then
initialize a
12 # dictionary to count the total number of
times each face
13 # was matched
14 matchedIdxs = [i for (i, b) in enumerate(matches)
if b]
15 counts = {}
16
17 # loop over the matched indexes and maintain
a count for
18 # each recognized face face
19 for i in matchedIdxs:
20 name = data["names"][i]
21 counts[name] = counts.get(name, 0) + 1
22
23 # determine the recognized face with the
largest number
24 # of votes (note: in the event of an unlikely
tie Python
25 # will select first entry in the dictionary)
26 name = max(counts, key=counts.get)
27
28 # update the list of names
29 names.append(name) |
ÔÚÕâ¶Î´úÂëÖÐÒÀ´ÎÑ»·Ã¿¸öencodings£¬²¢³¢ÊÔÆ¥Åäµ½ÒÑÖªµÄÃæ²¿Êý¾ÝÉÏ¡£Èç¹ûÕÒµ½Æ¥Å䣬Ôò¼ÆËãÊý¾Ý¼¯ÖÐÿ¸öÃû×Ö»ñµÃµÄƱÊý¡£È»ºóÈ¡³öµÃƱ×î¸ßµÄÃû×Ö£¬¾ÍÊǸÃÃæ²¿¶ÔÓ¦µÄÃû×Ö¡£ÕâЩ´úÂëÓëÇ°ÃæµÄ´úÂëÍêÈ«Ïàͬ¡£
ÏÂÒ»¶Î´úÂëÑ»·ÕÒµ½µÄÃæ²¿²¢ÔÚÖÜΧ»³ö±ß½çºÐ£¬²¢ÏÔʾÈ˵ÄÃû×Ö£º
1 # loop over the recognized
faces
2 for ((top, right, bottom, left), name) in
zip(boxes, names):
3 # rescale the face coordinates
4 top = int(top * r)
5 right = int(right * r)
6 bottom = int(bottom * r)
7 left = int(left * r)
8
9 # draw the predicted face name on the image
10 cv2.rectangle(frame, (left, top), (right,
bottom),
11 (0, 255, 0), 2)
12 y = top - 15 if top - 15 > 15 else top
+ 15
13 cv2.putText(frame, name, (left, y), cv2.FONT_HERSHEY_SIMPLEX,
14 0.75, (0, 255, 0), 2) |
ÕâЩ´úÂëÒ²ÍêÈ«Ïàͬ£¬ËùÒÔÎÒÃÇÖ»¹Ø×¢ÓëʳƷÓйصĴúÂë¡£
ÎÒÃÇ»¹¿ÉÒÔ½«ÊÓÆµÖ¡Ð´µ½Ó²ÅÌÖУ¬Òò´ËÀ´¿´¿´ÊÇÔõÑùʹÓÃOpenCV½«ÊÓÆµÐ´µ½Ó²ÅÌÖеģº
1 # if the video writer
is None *AND* we are supposed to write
2 # the output video to disk initialize the
writer
3 if writer is None and args["output"]
is not None:
4 fourcc = cv2.VideoWriter_fourcc(*"MJPG")
5 writer = cv2.VideoWriter(args["output"],
fourcc, 20,
6 (frame.shape[1], frame.shape[0]), True)
7
8 # if the writer is not None, write the frame
with recognized
9 # faces t odisk
10 if writer is not None:
11 writer.write(frame) |
Èç¹ûÃüÁîÐвÎÊýÌṩÁËÊä³öÎļþ·¾¶£¨¿ÉÑ¡£©£¬¶øÎÒÃÇ»¹Ã»Óгõʼ»¯ÊÓÆµµÄwriter£¨ÐÐ3£©£¬¾ÍÒªÏȳõʼ»¯Ö®¡£
ÐÐ4³õʼ»¯ÁËVideoWriter_fourcc¡£FourCCÊÇÒ»ÖÖËÄ×Ö·û±àÂ룬ÔÚÕâÀï¾ÍÊÇMJPG
ËÄ×Ö·û±àÂë¡£
½ÓÏÂÀ´½«¶ÔÏó¡¢Êä³ö·¾¶¡¢Ã¿ÃëÖ¡ÊýµÄÄ¿±êÖµºÍÖ¡³ß´ç´«µÝ¸øVideoWriter£¨ÐÐ5ºÍ6£©¡£
×îºó£¬Èç¹ûwriter´æÔÚ£¬¾Í¼ÌÐø½«Ö¡Ð´µ½´ÅÅÌÖС£
ÏÂÃæÊÇÊÇ·ñ½«Ã沿ʶ±ðÊÓÆµÖ¡Êä³öµ½ÆÁÄ»µÄ´¦Àí£º
1 # check to see if
we are supposed to display the output frame
to
2 # the screen
3 if args["display"] > 0:
4 cv2.imshow("Frame", frame)
5 key = cv2.waitKey(1) & 0xFF
6
7 # if the `q` key was pressed, break from the
loop
8 if key == ord("q"):
9 break |
Èç¹ûÉèÖÃÁËdisplayÃüÁîÐвÎÊý£¬¾ÍÏÔʾÊÓÆµÖ¡£¨ÐÐ4£©²¢¼ì²éÍ˳ö¼ü£¨"q"£©ÊÇ·ñ±»°´Ï£¨ÐÐ5-8£©£¬Èç¹û±»°´Ï£¬ÔòbreakµôÑ»·£¨ÐÐ9£©¡£
×îºóÊÇһЩÇåÀí¹¤×÷£º
1 # do a bit of cleanup
2 cv2.destroyAllWindows()
3 vs.stop()
4
5 # check to see if the video writer point needs
to be released
6 if writer is not None:
7 writer.release() |
ÐÐ2-7ÇåÀí²¢ÊÍ·ÅÆÁÄ»¡¢ÊÓÆµÁ÷ºÍÊÓÆµwriter¡£
×¼±¸ºÃÔËÐÐÕæÕýµÄ½Å±¾ÁËÂð£¿
ΪÁËÑÝʾOpenCVºÍPythonµÄÊµÊ±Ãæ²¿Ê¶±ð£¬´ò¿ªÖÕ¶ËÈ»ºóÖ´ÐÐÏÂÃæµÄÃüÁ
1 $ python recognize_faces_video.py
--encodings encodings.pickle \
2 --output output/webcam_face_recognition_output.avi
--display 1
3 [INFO] loading encodings...
4 [INFO] starting video stream... |
ÏÂÃæÊÇÎÒÂ¼ÖÆµÄÑÝʾÊÓÆµ£¬ÓÃÀ´ÑÝÊ¾Ãæ²¿Ê¶±ðϵͳ£º
ÊÓÆµÎļþÖеÄÃæ²¿Ê¶±ð
֮ǰÔÚ¡°Ã沿ʶ±ðÏîÄ¿½á¹¹¡±Ò»½ÚÖÐ˵¹ý£¬ÏÂÔØµÄ´úÂëÖл¹ÓиöÃûΪrecognize_faces_video_file.pyµÄ½Å±¾¡£
Õâ¸ö½Å±¾Êµ¼ÊÉϺ͸ղÅʶ±ðÉãÏñÍ·µÄ½Å±¾Ïàͬ£¬Ö»²»¹ýËü½ÓÊÕÊÓÆµÎļþ×÷ΪÊäÈ룬ȻºóÉú³ÉÊä³öÊÓÆµÎļþ¡£
ÎÒ¶ÔÔ°æÙªÂ޼͹«Ô°µçÓ°ÖоµäµÄ¡°Îç·¹³¡¾°¡±×öÁËÃæ²¿Ê¶±ð£¬Ôڸó¡¾°ÖУ¬ÑÝÔ±ÃÇΧÔÚ×À×ÓÅÔ±ßÌÖÂÛËûÃǶÔÓÚ¹«Ô°µÄÏë·¨£º
1 $ python recognize_faces_video_file.py
--encodings encodings.pickle \
2 --input videos/lunch_scene.mp4 --output output/lunch_scene_output.avi
\
3 --display 0 |
ÏÂÃæÊǽá¹û£º
×¢Ò⣺±ðÍüÁËÎÒÃǵÄÄ£ÐÍÊǸù¾ÝÔ°æµçÓ°ÖеÄËĸö½ÇÉ«½øÐÐѵÁ·µÄ£ºAlan Grant¡¢Ellie Sattler¡¢Ian
MalcolmºÍJohn Hammond¡£Ä£ÐͲ¢Ã»ÓÐÕë¶ÔDonald Gennaro£¨ÂÉʦ£©½øÐÐѵÁ·£¬ËùÒÔËûµÄÃæ²¿±»±ê¼ÇΪ¡°Unknown¡±¡£Õâ¸öÐÐΪÊÇÌØÒâµÄ£¨²»ÊÇÒâÍ⣩£¬ÒÔÑÝʾÎÒÃǵÄÊÓÆµÊ¶±ðϵͳÔÚʶ±ðѵÁ·¹ýµÄÃæ²¿µÄͬʱ£¬»á°Ñ²»ÈÏʶµÄÃæ²¿±ê¼ÇΪ¡°Unknown¡±¡£
ÏÂÃæµÄÊÓÆµÖÐÎÒ´Ó¡¶ÙªÂ޼͹«Ô°¡·ºÍ¡¶ÙªÂÞ¼ÍÊÀ½ç¡·µÄÔ¤¸æÆ¬ÖнØÈ¡µÄ¼ô¼£º
¿É¼û£¬Ã沿ʶ±ðºÍOpenCV´úÂëµÄЧ¹ûºÜ²»´í£¡
¨„Ãæ²¿Ê¶±ð´úÂëÄÜÔËÐÐÔÚÊ÷Ý®ÅÉÉÏÂð£¿
´ÓijÖÖÒâÒåÉÏ£¬¿ÉÒÔ¡£²»¹ýÓÐһЩÏÞÖÆ£º
Ê÷Ý®ÅÉÄÚ´æÌ«Ð¡£¬Ã»°ì·¨ÔËÐиü׼ȷµÄ»ùÓÚCNNµÄÃæ²¿¼ì²âÆ÷£»
Òò´ËÖ»ÄÜÓÃHOG·½Ê½£»
¼´Ê¹Èç´Ë£¬HOG·½Ê½ÔÚÊ÷Ý®ÅÉÉÏҲ̫Âý£¬Ã»°ì·¨ÓÃÓÚÊµÊ±Ãæ²¿¼ì²â£»
ËùÒÔÖ»ÄÜÓÃOpenCVµÄHaar²ãµþ·½Ê½¡£
¼´Ê¹ÕâÑùÄÜÔËÐÐÆðÀ´£¬Êµ¼ÊµÄËÙÂÊÒ²Ö»ÓÐ1¡«2FPS£¬¶øÇÒ¾ÍËãÊÇÕâÖÖËÙÂÊÒ²ÐèÒªÐí¶à¼¼ÇÉ¡£
¨„×ܽá
ÔÚÕâÆªÖ¸ÄÏÖУ¬ÎÒÃÇѧϰÁËÈçºÎÀûÓÃOpenCV¡¢PythonºÍÉî¶ÈѧϰÀ´½øÐÐÃæ²¿Ê¶±ð¡£´ËÍ⣬ÎÒÃÇ»¹ÀûÓÃÁËDavis
KingµÄdlib¿âºÍAdam GeitgeyµÄface_recognitionÄ£¿é£¬ºóÕß¶ÔdlibµÄÉî¶È¶ÈÁ¿Ñ§Ï°½øÐÐÁË·â×°£¬Ê¹µÃÃæ²¿Ê¶±ð¸üÈÝÒ×Íê³É¡£
ÎÒÃÇ·¢ÏÖ£¬ÎÒÃǵÄÃæ²¿Ê¶±ðʵÏÖͬʱ¾ßÓÐÒÔÏÂÁ½¸öÌØµã£º×¼È·£¬²¢ÇÒÄÜÔÚGPUÉÏʵʱÔËÐС£
×îºó£¬Ï£ÍûÄãϲ»¶½ñÌìµÄÃæ²¿Ê¶±ðµÄÎÄÕ£¡ |