(七)使用Docker进行人脸识别

339 篇文章 1 订阅
104 篇文章 7 订阅

目录

介绍

创建容器镜像

配置容器

运行容器

下一步


在这里,我们简要介绍Docker容器,然后解释为什么它对我们的人脸识别系统有用。然后我们展示了如何安装Tensorflow图像和附加软件(KerasMTCNN)。接下来我们修改人脸识别的Python代码,用于在Docker容器上启动,并通过视频演示识别。

介绍

人脸识别是人工智能(AI)的一个领域,现代深度学习(DL)方法在过去十年中取得了巨大成功。最好的人脸识别系统可以以与人类相同的精度识别图像和视频中的人物,甚至更好。

我们关于这个主题的系列文章分为两个部分:

  • 人脸检测,客户端应用程序检测图像或视频源中的人脸,对齐检测到的人脸图片,并将它们提交给服务器。
  • 人脸识别(这部分),服务器端应用程序进行人脸识别。

我们假设您熟悉DNNPythonKerasTensorFlow

上一篇文章中,我们专注于开发和测试人脸识别算法以及人脸检测模块。在本文中,我们将向您展示如何为我们的人脸识别系统创建和使用Docker容器

Docker容器技术在开发和部署基于AI的软件时非常有用。通常,基于AI的现代应用程序需要一些预安装的软件,例如DNN框架(在我们的例子中,是带有TensorFlow后端的Keras)。应用程序还可以依赖于DNN模型和相应的库(用于我们的面部检测器的MTCNN)。此外,由于我们要为服务器端应用程序开发一个Web API,我们需要在我们的PC上安装一个合适的框架。容器化我们的服务器软件将帮助我们开发、配置、测试和部署应用程序。

创建容器镜像

让我们从为容器创建镜像开始。我们将使用Docker Desktop软件来管理镜像和容器。我们可以从头开始为应用程序创建镜像,但基于现有AI容器之一创建镜像会更快、更容易。最适合我们的是预装了最新版TensorFlow框架的TensorFlow容器

首先,我们必须将镜像下载到我们的PC

docker pull tensorflow/tensorflow:latest-gpu-jupyter

下载镜像后,我们可以在Docker DesktopImages选项卡上看到它。单击运行按钮运行容器。

配置容器

下一步是配置用于启动我们的人脸识别服务器的容器。在容器/应用程序选项卡上,运行容器的终端窗口。使用以下命令安装Keras框架和MTCNN库:

# pip install keras
# pip install mtcnn

成功安装日志如下图所示。

请注意,最新的Python OpenCV框架与MTCNN库一起安装。为了完整起见,我们只需要添加libGL库:

# apt install libgl1-mesa-glx

我们将为Web API使用Flask微框架。我们需要使用简单的pip命令将这个框架与jsonpickle包一起安装。

# pip install Flask
# pip install jsonpickle

现在容器已配置为运行人脸识别应用程序。在运行它之前,我们需要稍微修改上一篇文章中开发的Python代码,以便在没有UI的情况下启动应用程序。这是视频识别器类的修改代码:

class VideoFR:    
    def __init__(self, detector, rec, f_db):
        self.detector = detector
        self.rec = rec
        self.f_db = f_db
    
    def process(self, video, align=False, save_path=None):
        detection_num = 0;
        rec_num = 0
        capture = cv2.VideoCapture(video)
        img = None

        frame_count = 0
        dt = 0
        if align:
            fa = Face_Align_Mouth(160)
            
        # Capture all frames
        while(True):    
            (ret, frame) = capture.read()
            if frame is None:
                break
            frame_count = frame_count+1
            
            faces = self.detector.detect(frame)
            f_count = len(faces)
            detection_num += f_count
            
            names = None
            if (f_count>0) and (not (self.f_db is None)):
                t1 = time.time()
                names = [None]*f_count
                for (i, face) in enumerate(faces):
                    if align:
                        (f_cropped, f_img) = fa.align(frame, face)
                    else:
                        (f_cropped, f_img) = self.detector.extract(frame, face)
                    if (not (f_img is None)) and (not f_img.size==0):
                        embds = self.rec.embeddings(f_img)
                        data = self.rec.recognize(embds, self.f_db)
                        if not (data is None):
                            rec_num += 1
                            (name, dist, p_photo) = data
                            conf = 1.0 - dist
                            names[i] = (name, conf)
                            print("Recognized: "+name+" "+str(conf))
                            if not (save_path is None):
                                percent = int(conf*100)
                                ps = ("%03d" % rec_num)+"_"+name+"_"+("%03d" % percent)+".png"
                                ps = os.path.join(save_path, ps)
                                cv2.imwrite(ps, f_img)
                        
                t2 = time.time()
                dt = dt + (t2-t1)
                    
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break

        if dt>0:
            fps = detection_num/dt
        else:
            fps = 0
        
        return (detection_num, rec_num, fps)

在类的process方法中,我们删除了使用OpenCV窗口显示帧的代码。我们还添加了一个save_path参数,用于指定在何处保存已识别人脸的结果图像。

我们还必须修改用于在容器中创建和运行视频识别器的代码:

if __name__ == "__main__":
    v_file = str(sys.argv[1])
    
    m_file = r"/home/pi_fr/net/facenet_keras.h5"
    rec = FaceNetRec(m_file, 0.5)
    print("Recognizer loaded.")
    print(rec.get_model().inputs)
    print(rec.get_model().outputs)
    
    save_path = r"/home/pi_fr/rec"
    db_path = r"/home/pi_fr/db"
    f_db = FaceDB()
    f_db.load(db_path, rec)
    db_f_count = len(f_db.get_data())
    print("Face DB loaded: "+str(db_f_count))
    d = MTCNN_Detector(50, 0.95)
    
    vr = VideoFR(d, rec, f_db)

    (f_count, rec_count, fps) = vr.process(v_file, True, save_path)

    print("Face detections: "+str(f_count))
    print("Face recognitions: "+str(rec_count))
    print("FPS: "+str(fps))

在代码中,我们将视频文件的路径指定为第一个命令行参数。所有其他路径(FaceNet模型、人脸数据库和用于保存结果图像的文件夹)都直接在代码中指定。因此,我们必须预先配置我们的文件系统并将所需的数据复制到容器中。这可以通过docker cp命令完成。

运行容器

现在我们可以使用以下命令从终端运行我们的Python代码:

# python /home/pi_fr/pi_fr_facenet.run_align_dock.lnx.py /home/pi_fr/video/5_1.mp4

终端中的输出将显示识别过程的进度。该过程将识别出的数据保存到指定的文件夹中,我们可以使用ls命令浏览该文件夹。

您可以使用该docker cp命令将数据复制到主机。这是一些由此产生的人脸图像。

现在我们的AI容器已经完全配置好了。我们可以在容器环境中运行我们的识别服务器并测试其性能。我们还可以改进识别算法并开发其他基于人工智能的软件。我们甚至可以使用该平台来创建、训练和测试新的DNN模型(基于KerasTensorFlow后端)。

很棒的是,我们可以轻松地与其他开发人员共享我们的容器。我们只需要将容器保存为Docker镜像并将其推送到存储库。您可以使用以下命令:

c:\>docker commit -m "Face Recognition image" -a "Sergey Gladkiy" beff27f9a185 sergeylgladkiy/fr:v1
 
c:\>docker push sergeylgladkiy/fr:v1

推送镜像可能需要一些时间,因为它很大(大约6.3 GB)。发布的镜像可供其他Docker用户下载。他们可以按如下方式下载我们的镜像:

docker pull sergeylgladkiy/fr:v1

下一步

接下来的文章中​​​​​​​,我们将包裹脸部识别模型在一个简单的Web API中,在Raspberry Pi上创建的一个客户端应用程序,并运行客户机-服务器系统。

https://www.codeproject.com/Articles/5305699/Using-Docker-for-Facial-Identification

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值