走过路过不要错过”喵脸识别喂食减肥神器“诞生了

1,609 阅读5分钟

一起用代码吸猫!本文正在参与【喵星人征文活动】

前提背景:

看了一眼家里的喵喵日渐蛮横生长ing。。。铲屎官漏出老父亲般的微笑。。。

image.png年轻帅气的喵喵(网图)

image.png脖子消失术的口苗口苗(网图)

又看了一眼钱包君日渐消瘦干瘪ing。。。铲屎官流下了穷人的泪水

image.png

铲屎官不禁大喊一声“还有谁!!!”

0ad451d4aed434fad2725567a34357a2.gif

有的。。。。。2、3、4、5号佳丽。。。等待投食。。。

image.png 于是乎,为了让铲屎官本大人能吃上一口热饭,斥巨资买了一款“某智能宠物喂食器”,想缩减一下它们进食速度,用了好几天,果然立竿见影了,佳丽们体重暴增X2

(无图:自行脑补X2)

铲屎官不禁大喊一声“屎可忍孰不可忍,”!!!正准备手起刀落把“某智能宠物喂食器”一刀两断之时。。。一个不要999只要9块9的想法突然出现在脑袋中。

image.png

创意内容:

登登登登。。。。。登。。。不要999只要9块9的”喵脸识别喂食减肥神器“诞生了

image.png

理论上,只要把人脸识别系统连接摄像头,控制智能宠物喂食器的开关,每天设置好分量,当喂食器的猫粮吃完之后,每只猫都只能通过喵脸识别系统获得各自新的猫粮,一天每只喵最多获得2份猫粮。(bug:不排除有的喵老大在别的喵获取新猫粮之后就抢吃的)

现实中,铲屎官本人只是个铲屎官,Ubuntu是啥,python是啥一点都不懂哇,在网上只找到如何制作自己的人脸识别系统,至于怎么串联这几样神器,一概不知哇,坐等编程大佬们能实现出来啦~

制作内容:

来自网络大神的制作自己的人脸识别系统帖子 zhuanlan.zhihu.com/p/37083166

准备工作:摄像头,Ubuntu系统、python开发环境、网络环境

\

没错,就是这么简单,需要准备的东西并不多。这里你也可以用Windows系统来搭建,只要你高兴,怎么着都行。

\

安装python的依赖包\

对于python环境,你可以直接通过下载anaconda,它是一款python的集成开发环境,里面包含了大量的python依赖包。接下来会安装一些anaconda中没有的依赖包:face_recognition、OpenaCV、pymysql、wxpy

\

对于pymysql,可以这么安装:

pip install pymysql -i https://pypi.tuna.tsinghua.edu.cn/simple

对于face_recognition和OpenaCV,会比较麻烦

\

安装OpenCV

\

装一大堆内核:

#Remove any previous installations of x264

sudo apt-get remove x264 libx264-dev

#We will Install dependencies now

sudo apt-get install build-essential checkinstall cmake pkg-config yasmsudo apt-get install git gfortransudo apt-get install libjpeg8-dev libjasper-dev libpng12-dev

# If you are using Ubuntu 14.04

sudo apt-get install libtiff4-dev

# If you are using Ubuntu 16.04

sudo apt-get install libtiff5-dev

sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-dev

sudo apt-get install libxine2-dev libv4l-dev

sudo apt-get install libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev

sudo apt-get install qt5-default libgtk2.0-dev libtbb-dev

sudo apt-get install libatlas-base-devsudo apt-get install libfaac-dev libmp3lame-dev libtheora-dev

sudo apt-get install libvorbis-dev libxvidcore-dev

sudo apt-get install libopencore-amrnb-dev libopencore-amrwb-dev

sudo apt-get install x264 v4l-utils

# Optional dependencies

sudo apt-get install libprotobuf-dev protobuf-compiler

sudo apt-get install libgoogle-glog-dev libgflags-dev

sudo apt-get install libgphoto2-dev libeigen3-dev libhdf5-dev doxygen    

下载opencv包:

git clone https://github.com/opencv/opencv.git
cd opencv
git checkout 3.3.1
cd ..

下载opencv_contrib包:

git clone https://github.com/opencv/opencv_contrib.git
cd opencv_contrib
git checkout 3.3.1
cd ..

开始编译:

cd opencv 
mkdir release

cd release

cmake -DBUILD_TIFF=ON \
      -DBUILD_opencv_java=OFF \      
      -DWITH_CUDA=OFF \      
      -DWITH_OPENGL=ON \      
      -DWITH_OPENCL=ON \      
      -DWITH_IPP=ON \      
      -DWITH_TBB=ON \      
      -DWITH_EIGEN=ON \      
      -DWITH_V4L=ON \      
      -DWITH_VTK=OFF \      
      -DBUILD_TESTS=OFF \      
      -DBUILD_PERF_TESTS=OFF \      
      -DCMAKE_BUILD_TYPE=RELEASE \      
      -DCMAKE_INSTALL_PREFIX=$(python -c "import sys; print(sys.prefix)") \      
      -DPYTHON3_EXECUTABLE=$(which python) \      
      -DPYTHON3_INCLUDE_DIR=$(python -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") \      
      -DPYTHON3_PACKAGES_PATH=$(python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") \      
      ..

make -j4 
make install # not sudo, except for Raspberry Pi

#Note: on the Raspberry Pi, consider make -j2 to avoid over-temperature and under-voltage warnings (in general when compiling on Raspberry Pi, not just for OpenCV).

此时此刻,opencv已经编译完成了,在你的

/home/[user_name]/anaconda3/lib/python3.6/site-packages/

下会有一个 cv*.so 的文件,创建一个软连接到你的虚拟环境下就OK了:

cd /home/[user_name]/anaconda3/lib/python3.6/site-packages/
ln -s /home/[user_name]/anaconda3/lib/python3.6/site-packages/cv2.cpython-36m-x86_64-linux-gnu.so cv2.so

可以打开ipython来验证一下:

In [1]: import cv2

In [2]: print(cv2.__version__)
3.3.1-dev

安装face_recognition

这个比较简单,官方写了一份文档非常详细,可以下载看看:

\

media.readthedocs.org/pdf/face-re…

\

要说明的是,在看安装说明时仔细一点。安装face_recognition之前需要先安装dlib,文档上都有链接,亲测可用,非常顺畅。

\

人脸识别

\

接下来该编写一小段程序了,不过不要发慌,程序也有现成的例子,只需要根据自己的需求改一改,就可以了。python语言的优点就是阅读性很强,基本能看懂英语的都能读懂代码什么意思,所以这份代码的样例读起来也很容易,连接在这里:\

github.com/ageitgey/fa…

\

上面的注释是比较详细的,这里我挑几段简单介绍一下:

video_capture = cv2.VideoCapture(0)          ①

# Find all the faces and face encodings in the current frame of video

face_locations = face_recognition.face_locations(small_frame)   ②

face_encodings = face_recognition.face_encodings(small_frame, face_locations)     ③

第1行是将摄像头打开,开始捕捉画面;第2行是寻找画面中出现的人脸图像,第3行是提取出人脸图像中的特征。什么是特征?你可以简单把他理解为电脑为识别出人脸而定制的一套规则,符合这套规则就被认为是人脸。\

找出人脸后与预存的人脸进行对比。对比的操作实际上就是计算相似度。首先需要将预存的人脸图像进行向量化,存储为numpy.array格式。当然,为了每次启动程序时不必重复对预存的图片向量化,可以将结果进行存储,用的时候读取就行。

import os                
import face_recognition
import numpy as np       
import constants as cons
know_face_path = cons.BASE_FACES_PATH
model_path = cons.MODEL_PATH
time_now = cons.time_str

known_faces = []         
known_names = []

for index, file_name in enumerate(sorted(os.listdir(know_face_path))):  # 为了调用时顺序一致
    test_image = face_recognition.load_image_file(know_face_path + '/' + file_name)
    model = face_recognition.face_encodings(test_image)[0]
    np.savetxt(model_path + '/' + time_now + '_' + str(index) + '.model', model)

接下来,开始计算距离,排序,选出在我所设置阈值内的最小值,进行标识:

match = face_recognition.compare_faces(known_faces, face_encoding, tolerance=0.38)
dis = face_recognition.face_distance(known_faces, face_encoding)
name = "Unknown"
id = np.argmin(dis)

if match[id]:
    name = known_names[id].split('.')[0]

好了,这就是代码中的主要部分,剩下的就是一些个性化的定制了。

铲屎官:没有了没有了,找不到其他能串联整个减肥神奇的制作方法了,跪求大佬们抬抬手~

结束语

果然编程大佬们的世界就是看不懂哇,喵生很简单,管吃就好~,但是有这样的“喵脸识别喂食减肥神器”也很不错呀~这样喵喵们就能活得更健康,也不会一步都跳不起来哇。坐等哪位大佬们能有一个完整的制作思路,本铲屎官只是一个突发奇想的思路~