DeepFace:人脸识别库 DeepFace 简单认知

news2024/11/16 8:50:20

写在前面


  • 工作中遇到,简单整理
  • 博文内容为 deepface 的简单介绍
  • 理解不足小伙伴帮忙指正

对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》


人脸识别基本原理:

人脸检测:人脸检测是指在图像或视频中自动检测出人脸的位置,并将其框出来的过程。该技术通常使用分类器或神经网络模型来检测面部特征、形状、颜色等,从而确定人脸的位置。

人脸识别:人脸识别是指在已经检测到人脸的基础上,通过对其特征进行比较和匹配,将其与先前存储的一组人脸数据集中的个体进行识别和辨认的过程。这种技术通常使用各种算法(如 PCA、LBP、CNN 等)来提取人脸特征,并使用相似性计算方法来比较和匹配人脸。

DeepFace

DeepFace 是 Python 上最轻量级的人脸识别和面部属性分析库。开源的 DeepFace 库包括所有用于人脸识别的前沿 AI 模型,并自动处理后台面部识别的所有程序。

安装很方便,更过内容小伙伴可以参考项目文档,https://github.com/serengil/deepface

# pip install deepface==0.0.79

在识别时,需要下载对应模型的权重文件,有些是特征点获取的模型,需要科学上网,如果无法下载,可以到有网的机器下载,项目中的 单元测试中有一些测试脚本,执行的时候会下载,

支持的功能:

  • 人脸检测:人脸检测是指通过图片或者视频帧,通过检测算法,确定人脸的位置坐标
rst = DeepFace.extract_faces(
            img_path=image,
            target_size=(224, 224),
            detector_backend="mtcnn",
            enforce_detection=True,
            align=True,
            grayscale=False)
  • 人脸验证:人脸验证的任务是指将一张脸与另一张人脸进行比较,以验证它是否匹配。因此,人脸验证通常用于将候选人的面部与另一个候选人的面部进行比较。这可用于确认物理人脸是否与身份证件中的人脸匹配。
verification = DeepFace.verify(img1_path = "img1.jpg", img2_path = "img2.jpg")
  • 人脸识别:任务是指在图像数据库中查找人脸。执行人脸识别需要多次运行人脸验证。
recognition = DeepFace.find(img_path = "img.jpg", db_path = “C:/facial_db")
  • 面部属性分析:人脸属性分析的任务是指描述人脸图像的视觉属性。因此,面部属性分析用于提取年龄、性别分类、情绪分析或种族/民族预测等属性。
analysis = DeepFace.analyze(img_path = "img.jpg", actions = ["age", "gender", "emotion", "race"]) print(analysis)
  • 实时人脸分析:此功能包括使用网络摄像头的实时视频源测试人脸识别和面部属性分析。
DeepFace.stream(db_path = “C:/facial_db”)

人脸检测器

人脸检测和对齐是面部识别管道非常重要的阶段。谷歌表示,仅面部对齐就可以将面部识别准确率提高0.76%。这里的检测即指这图片中找到人脸的位置,对齐即把人脸通过类似透视变换的操作一样。 deepface 支持的检测器如下:

  • OpenCV: 与其他人脸检测器相比,OpenCV 是最轻量级的人脸检测器。流行的图像处理工具使用不基于深度学习技术的 haar-cascade 算法。这就是为什么它很快,但它的性能相对较低。为了使 OpenCV 正常工作,需要正面图像。此外,它的眼睛检测性能一般。这会导致对齐问题。请注意,DeepFace 中的默认检测器是 OpenCV。 使用 OpenCV 进行人脸检测
  • Dlib: 该检测器在后台使用 hog 算法。因此,与 OpenCV 类似,它不是基于深度学习的。尽管如此,它的检测和对齐分数相对较高。
  • SSD: SSD 代表 单次检测器;它是一种流行的基于深度学习的检测器。SSD 的性能可与 OpenCV 相媲美。但是,SSD 不支持面部特征点,并且依赖于 OpenCV 的眼睛检测模块来对齐。尽管其检测性能很高,但对准分数仅为平均水平。
  • MTCNN: MTCNN 这是一个基于深度学习的人脸检测器,它带有面部特征点。这就是为什么 MTCNN 的检测和对齐得分都很高的原因。但是,它比 OpenCV,SSD 和 Dlib 慢。 MTCNN 是一种多任务级联卷积神经网络的人脸检测算法,能够同时实现人脸检测、关键点定位和人脸对齐等功能。其对于大尺寸人脸的检测效果较好,并且相对于 RetinaFace 的模型规模较小。
  • RetinaFace: RetinaFace 被公认为最先进的基于深度学习的人脸检测模型。它在野外的表现具有挑战性。但是,它需要很高的计算能力。这就是为什么与其他人脸检测器相比,RetinaFace 是速度最慢的人脸检测器。RetinaFace 是一种基于卷积神经网络的人脸检测算法,具有高精度的特点。其在 WIDER FACE 和 COCO 数据集上的表现比 MTCNN 更好,尤其是对于小尺寸人脸的检测效果更佳
detectors = ["opencv", "ssd", "mtcnn", "dlib", "retinaface"]

应该使用哪种人脸检测器? 需要根据实际情况分析

  • 如果 高置信度,考虑使用 RetinaFace 或 MTCNN
  • 如果希望高速,清洗一部分没有人脸的照片,那么,可以使用 OpenCV 或 SSD

人脸识别模型

人脸识别模型,即通过对人脸库的数据进行特征提取,然后提取需要识别的图片的特征,两者通过计算生成一个相似度值,这个值的指定阈值内,即确定为同一个人。

  1. VGG-Face: VGG 代表 视觉几何组。VGG 神经网络(VGGNet)是基于深度卷积神经网络最常用的图像识别模型类型之一。VGG 人脸识别模型在流行的野外标记人脸 (LFW) 数据集上实现了 97.78% 的准确率。
  2. Facenet: 该模型由谷歌的研究人员开发。FaceNet 被认为是通过深度学习进行人脸检测和识别的最先进的模型。 FaceNet 的主要优点是其高效率和高性能,据报道,它在 LFW 数据集上达到了99.63%的准确率。
  3. OpenFace :这个人脸识别模型是由卡内基梅隆大学的研究人员建立的。因此,OpenFace 在很大程度上受到 FaceNet 项目的启发,但这更轻量级,其许可证类型更灵活,OpenFace 在 LFW 数据集上实现了93.80%的准确率。
  4. DeepFace: 这种人脸识别模型是由 Facebook 的研究人员开发的。Facebook DeepFace 算法是在属于 4000 万张面孔的标记数据集上进行训练的,这是发布时最大的面部数据集。该方法基于具有九层的深度神经网络。 Facebook 模型在 LFW 数据集基准测试上实现了97.35%(+/- 0.25%)的准确率。
  5. DeepID: DeepID 人脸验证算法基于深度学习进行人脸识别。它是首批使用卷积神经网络并在人脸识别任务上实现优于人类性能的模型之一。Deep-ID 是由香港中文大学的研究人员引入的。 基于 DeepID 人脸识别的系统是第一批在这项任务中超越人类表现的系统。例如,DeepID2 在野外标记面孔(LFW)数据集上实现了99.15%
  6. Dlib: Dlib 人脸识别模型将自己命名为“世界上最简单的 python 面部识别 API”。 Dlib 的人脸识别工具将人脸图像映射到 128 维矢量空间,其中同一个人的图像彼此靠近,而不同人的图像相距甚远。因此,dlib 通过将人脸映射到 128d 空间,然后检查它们的欧几里得距离是否足够小来执行人脸识别。 dlib 模型的距离阈值为 0.6,在标准 LFW 人脸识别基准上实现了 99.38% 的准确率。
  7. ArcFace: 这是模型组合中的最新型号。它的联合设计师是伦敦帝国理工学院和 InsightFace 的研究人员。ArcFace 模型在 LFW 数据集上的准确度达到 99.40%
  8. SFace: 是一种人脸识别的预训练模型,它是基于深度神经网络的人脸识别模型。SFace 模型是由中国科学院自动化研究所的研究人员开发的,它在多个人脸识别竞赛中表现出色。SFace 模型采用了一种名为“中心损失”的训练方法,可以使得模型在人脸识别任务中更加准确。
models=["VGG-Face", "Facenet", "Facenet512", "OpenFace", "DeepFace", "DeepID", "ArcFace", "Dlib","SFace"]

经过测试发现,Deepface 中,使用默认阈值,ArcFace,和 SFace 的识别度要好于其他的模型。当然,对应的阈值可以通过修改源码的方式调整,这里我们已 cosine 为例

对应的文件位置为:Python\Python310\site-packages\deepface\commons\distance.py,注释代码为默认的原来阈值

......
def findThreshold(model_name, distance_metric):

    base_threshold = {"cosine": 0.40, "euclidean": 0.55, "euclidean_l2": 0.75}

    thresholds = {
        "VGG-Face": {"cosine": 0.40, "euclidean": 0.60, "euclidean_l2": 0.86},
        "Facenet": {"cosine": 0.40, "euclidean": 10, "euclidean_l2": 0.80},
        "Facenet512": {"cosine": 0.30, "euclidean": 23.56, "euclidean_l2": 1.04},
      # "ArcFace": {"cosine": 0.68, "euclidean": 4.15, "euclidean_l2": 1.13},
        "ArcFace": {"cosine": 0.45, "euclidean": 4.15, "euclidean_l2": 1.13},
        "Dlib": {"cosine": 0.07, "euclidean": 0.6, "euclidean_l2": 0.4},
        # "SFace": {"cosine": 0.593, "euclidean": 10.734, "euclidean_l2": 1.055},
        "SFace": {"cosine": 0.60, "euclidean": 10.734, "euclidean_l2": 1.055},
        "OpenFace": {"cosine": 0.10, "euclidean": 0.55, "euclidean_l2": 0.55},
        "DeepFace": {"cosine": 0.23, "euclidean": 64, "euclidean_l2": 0.64},
        "DeepID": {"cosine": 0.015, "euclidean": 45, "euclidean_l2": 0.17},
    }

    threshold = thresholds.get(model_name, base_threshold).get(distance_metric, 0.4)

    return threshold
    .......

实际分析

在实际测试中发现,deepface 对 GPU 的利用很低,只是使用了显存,在同等情况下,还不如 CPU 并行跑的快。

实际使用中,如果采集的照片质量太低,考虑对识别数据进行清洗,然后在和人脸库比对,比如,检测人脸大小过滤,头部姿态过滤,置信度过滤等方式,同时可以调整阈值,这里需要说明的是,deepface 的 余弦相似度,和其他的人脸识别模型相反的,在取值时,用 1 减了,所以 deepface 的余弦值时越小越好,而且其他的人脸识别是越大越好。

可以做源码的这个位置看到

.......
def findCosineDistance(source_representation, test_representation):
    a = np.matmul(np.transpose(source_representation), test_representation)
    b = np.sum(np.multiply(source_representation, source_representation))
    c = np.sum(np.multiply(test_representation, test_representation))
    return 1 - (a / (np.sqrt(b) * np.sqrt(c)))
........

简单调用

from deepface import DeepFace

# 人脸识别
models=["VGG-Face", "Facenet", "Facenet512", "OpenFace", "DeepFace", "DeepID", "ArcFace", "Dlib"]
# 人脸检测
detectors = ["opencv", "ssd", "mtcnn", "dlib", "retinaface"]
# 教室人脸识别
verification = DeepFace.verify(img1_path = "hg1.png", img2_path = "hg2.png",model_name=models[6],detector_backend = detectors[4] )
print(verification)

这里之前测试,所以做了一个,deepface 环境镜像 ,涉及 deepface API 环境, deepface 部分 models(*.h5) 权重文件和检测器,环境有问题小伙伴可以直接用

docker pull liruilong/deepface_and_deepface_models

方法参数介绍

verify 方法

"""
    @Time    :   2023/06/13 00:34:17
    @Author  :   liruilonger@gmail.com
    @Version :   1.0
    @Desc    :   人脸验证:用于验证图像对是否为同一人或不同人,验证函数将面部图像表示为向量,然后计算这些向量之间的相似度。
                  同一人图像的向量应具有更高的相似度(或更小的距离)比不同人的向量。

                 Args:
                   + img1_path (str): 第一张图像的路径
                   + img2_path (str): 第二张图像的路径
                   + model_name (str): 要使用的人脸识别模型的名称(默认为“VGG-Face”)
                   + detector_backend (str): 要使用的人脸检测后端(默认为“opencv”)
                   + distance_metric (str): 用于比较面部嵌入的距离度量(默认为“cosine”)
                   + enforce_detection (bool): 是否在图像中未检测到人脸时引发异常(默认为True)
                   + align (bool): 是否在生成嵌入之前执行面部对齐(默认为True)
                   + normalization (str): 用于预处理图像的归一化技术(默认为“base”)
                 Returns:
                   + verified(核实):True
                   + distance(距离):0.4439834803806296
                   + threshold(阈值):0.593
                   + model:SFace
                   + detector_backend:mtcnn
                   + similarity_metric(相似性指标):cosine
                   + facial_areas(人脸位置):{'img1': {'x': 0, 'y': 0, 'w': 200, 'h': 255}, 'img2': {'x': 2, 'y': 13, 'w': 194, 'h': 231}}
                   + time:1.95
                   void
    """

    dfs = DeepFace.verify(
        img1_path="W:\\python_code\\deepface\\temp\\cf\\cf_6dd3a0638cf4f4006aa1f455cac65577d.jpg.png",
        img2_path ="W:\\python_code\\deepface\\temp\\cf\\cf_8a96787835b5d4677a56ad6db0c610958.jpg.png",
        model_name="SFace",
        detector_backend="mtcnn",
        enforce_detection=False)

find 方法

    """
        @Time    :   2023/05/21 02:35:51
        @Author  :   liruilonger@gmail.com
        @Version :   1.0
        @Desc    :   DeepFace.find方法是DeepFace库中的一个方法,用于在人脸数据库中查找与给定人脸最相似的人脸。
                     Args:
                        - img_path:要查找的人脸图像路径、numpy数组(BGR)或base64编码的图像。
                        - db_path:人脸数据库路径。您应该在此文件夹中存储一些.jpg文件。
                        - model_name:人脸识别模型的名称,例如VGG-Face、Facenet、Facenet512、OpenFace、DeepFace、DeepID、Dlib、ArcFace、SFace。
                        - distance_metric:距离度量方法可以是cosine、euclidean或euclideanl2。
                        - enforce_detection 参数是一个布尔值,指定如果无法检测到人脸,则该函数是否应引发异常。如果不想得到异常并仍要运行该函数,则将其设置为False。这对于低分辨率图像可能很方便。
                        - detector_backend 参数指定要使用的人脸检测器后端,可以是opencv、retinaface、mtcnn、ssd、dlib或mediapipe。
                        - align 参数是一个布尔值,指定是否应对人脸进行对齐。
                        - normalization 参数指定要使用的归一化方法,可以是base VGGFace Facenet raw 等
                        - silent参数是一个布尔值,用于禁用一些日志记录和进度条。
                     Returns:
                       df: 返回一个满足指定阈值的 的一个 pandas 对象
        """
    dfs = DeepFace.find(
        img_path="huge_1.jpg",
        db_path="W:\python_code\db",
        model_name="DeepID",
        distance_metric="cosine",
        enforce_detection=True,
        detector_backend="retinaface",
        align=False,
        normalization="ArcFace",
        silent=False,
    )

extract_faces 方法

    """
    @Time    :   2023/05/20 03:50:07
    @Author  :   liruilonger@gmail.com
    @Version :   1.0
    @Desc    :   extract_faces 用于对图像进行特征分析,提取头像坐标,
                    在实际使用中,如果对精度有要求,可以通过 `confidence` 来对提取的人脸进行过滤,
                 Args:
                 extract_faces方法接受以下参数:
                    - img_path:要从中提取人脸的图像路径、numpy数组(BGR)或base64编码的图像。
                    - target_size:人脸图像的最终形状。将添加黑色像素以调整图像大小。
                    - detector_backend:人脸检测后端可以是 retinaface、mtcnn、opencv、ssd或dlib。
                    - enforce_detection:如果在提供的图像中无法检测到人脸,则该函数会引发异常。如果不想得到异常并仍要运行该函数,则将其设置为False。
                    - align:根据眼睛位置对齐。
                    - grayscale:以RGB或灰度提取人脸。

                 Returns:
                   返回一个包含人脸图像、人脸区域和置信度的字典列表。其中,
                   - face 键对应的值是提取的人脸图像
                   - facial_area 键对应的值是人脸在原始图像中的位置和大小
                   - confidence 键对应的值是人脸检测的置信度

    """
    rst = DeepFace.extract_faces(
            img_path=image,
            target_size=(224, 224),
            detector_backend="mtcnn",
            enforce_detection=True,
            align=True,
            grayscale=False)

analyze 方法

    """
    @Time    :   2023/05/31 01:44:27
    @Author  :   liruilonger@gmail.com
    @Version :   1.0
    @Desc    :   analyze 方法是 DeepFace 库中的一个函数,用于分析人脸属性,包括年龄、性别、情绪和种族。
                 在后台,分析函数构建卷积神经网络模型,以对输入图像中的人脸进行年龄、性别、情绪和种族分类。
                 Args:
                   - img_path:图像路径、numpy 数组(BGR)或 base64 编码的图像。如果源图像中有多个人脸,则结果将是出现在图像中的人脸数量大小的列表。
                   - actions: 参数是一个元组,其中默认值为 ('age', 'gender', 'emotion', 'race'),您可以删除其中的一些属性。
                   - enforce_detection :参数默认为 True,如果未检测到人脸,则函数会抛出异常。如果您不想得到异常,则可以将其设置为 False。这对于低分辨率图像可能很方便。
                   - detector_backend: 参数指定要使用的人脸检测器的后端,例如 OpenCV、RetinaFace、MTCNN 等。
                   - align: 参数是一个布尔值,表示是否根据眼睛位置进行对齐。
                   - silent :参数是一个布尔值,表示是否禁用(某些)日志消息。
                 Returns:
                    - "region":表示人脸在图像中的位置和大小。
                    - "age":表示人脸的年龄。
                    - "dominant_gender":表示人脸的主要性别。
                    - "gender":表示人脸的性别及其置信度。
                    - "dominant_emotion":表示人脸的主要情绪。
                    - "emotion":表示人脸的情绪及其置信度。
                    - "dominant_race":表示人脸的主要种族。
                    - "race":表示人脸的种族及其置信度。
    """
    dfs = DeepFace.analyze("database\yz_W.jpg",detector_backend="retinaface")

不同识别模型测试的简单统计:

识别流程:

  1. 通过 检测模型 retinaface 模型获取所有的人脸: 选择原因:小尺寸人脸的检测效果更佳,对人脸进行切片
  2. 过滤置信度大于 0.99 的人脸,这里的置信度即为人脸可信度,由 retinaface 给出,同时对切片大小过滤,太小的直接舍弃
  3. 通过 opencv 和 Dlib 获取特征点和头部姿态,这里实际上又进行了一次检测,使用 Dlib 库 检测,过滤头部姿态欧拉角小于 15 度的数据
  4. 过滤出的数据通过 DeepFace.find 方法进行人脸库比对,这里对人脸又进行了一次检测,使用检测模型 mtcnn,使用识别模型为下面的变量

相同人脸库数据,相同识别数据集,不同识别模型统计:

模型名称识别结果数识别陌生人识别总人数识别错误识别成功识别成功率
VGG-Face
Facenet4302671631184527%
Facenet512432311121576452%
OpenFace4343431300%
DeepFace4302671631253823%
Dlib4281732551748131%
ArcFace4302551756211365%
SFace4323468677991%

测试发现,当前的数据集,SFace 相对来说要好一点,整体上还是达不到期望。 主要是图片质量问题,当前检测识别属于小目标检测识别,如果是打卡或者门禁其他的大目标正脸识别,是OK的。

博文部分内容参考

© 文中涉及参考链接内容版权归原作者所有,如有侵权请告知,这是一个开源项目,如果你认可它,不要吝啬星星哦 😃


https://viso.ai/computer-vision/deepface/

https://github.com/serengil/deepface


在这里插入图片描述

© 2018-2023 liruilonger@gmail.com, All rights reserved. 保持署名-非商用-相同方式共享(CC BY-NC-SA 4.0)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/655590.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HarmonyOS学习路之开发篇—Java UI框架(使用工具自动生成JS FA调用PA代码)

JS FA(Feature Ability)调用PA (Particle Ability)是使用基于JS扩展的类Web开发范式的方舟开发框架所提供的一种跨语言能力调用的机制,用于建立JS能力与Java能力之间传递方法调用、处理数据返回以及订阅事件上报的通道…

代码审计——目录遍历详解

为方便您的阅读,可点击下方蓝色字体,进行跳转↓↓↓ 01 漏洞描述02 审计要点03 漏洞特征04 漏洞案例05 修复方案 01 漏洞描述 目录遍历,即利用路径回溯符“../”跳出程序本身的限制目录实现下载任意文件。 例如Web应用源码目录、Web应用配置…

FastDeploy部署参考

一、FastDeploy的gitee地址 https://gitee.com/leiqing1/FastDeploy/blob/release/0.3.0/docs/cn/faq/use_sdk_on_windows.md#21-%E4%B8%8B%E8%BD%BD%E9%A2%84%E7%BC%96%E8%AF%91%E5%BA%93%E6%88%96%E8%80%85%E4%BB%8E%E6%BA%90%E7%A0%81%E7%BC%96%E8%AF%91%E6%9C%80%E6%96%B0%…

When viruses are good for you 病毒,有时对人体是有益的 | 经济学人20230506版社论双语精翻

本篇来自《经济学人》(The Economist)2023年5月6日社论(Leaders)精选:《病毒,有时对人体是有益的》(When viruses are good for you)。 Bacteriophages 噬菌体 When viruses are goo…

onlyoffice变量提取,处理各种办公文档

onlyoffice变量提取,处理各种办公文档 使用 ONLYOFFICE Docs 在 HumHub 中处理各种办公文档。 带有 HumHub 连接器的 ONLYOFFICE Docs 企业版允许您在灵活的开源社交网络工具包 HumHub 中实时协作查看和编辑办公文档(Word、Excel 或 PowerPoint)。它包括 ONLYOFFICE Docs&#…

代码审计——SQL注入详解

为方便您的阅读,可点击下方蓝色字体,进行跳转↓↓↓ 01 漏洞描述02 审计要点03 漏洞特征04 漏洞案例05 修复方案 01 漏洞描述 当应用程序将用户输入的内容,拼接到SQL语句中,一起提交给数据库执行时,就会产生SQL注入威…

代码随想录训练营Day60|84. 柱状图中最大的矩形

84. 柱状图中最大的矩形 class Solution {public int largestRectangleArea(int[] heights) {int res0;// 数组扩容,在头和尾各加入一个元素int [] newHeights new int[heights.length 2];newHeights[0] 0;newHeights[newHeights.length - 1] 0;for (int index…

Docker desktop 怎么切换docker源

点击setting,点击docker Engine 进行编辑 {"registry-mirrors":["https://registry.docker-cn.com","http://hub-mirror.c.163.com","https://4jup2u41.mirror.aliyuncs.com","https://docker.mirrors.ustc.edu.cn&q…

校园预付费管理系统与水电计量设备仪表的实际应用 安科瑞 许敏

摘要:论文设计了适用于学生公寓的自助式预付费控电控水管理系统,采用多种智能功能,可以监测和显示漏电现象,通过短路、跳线、零线接地等方式防范和记录用户的偷电行为,通过报警和拉闸防止事故的发生。该系统采用先进的…

霍夫变换原理

文章目录 霍夫变换原理当点都在y轴上时,用ykxb形式是无法求出参数空间中的交点,也就是累计都一样。所以就用极坐标来表示参数空间。公式求证过程 霍夫变换原理 当点都在y轴上时,用ykxb形式是无法求出参数空间中的交点,也就是累计都…

linux服务器安装nodejs

注意: 本文针对的是有linux操作基础, 会使用vim的基本操作的同学。故有些很基础的东西没有赘述,如果是纯小白的同学,看起来可能会感觉缺失一些东西。 1.nodejs官网下载自己需要的版本的node node版本选择下载地址 我使用的是14.…

图像边缘检测原理

文章目录 图像边缘检测原理1:2:3:基本边缘检测算子 图像边缘检测原理 1: 图像的边缘指的是图像中像素灰度值突然发生变化的区域,如果将图像的每一行像素和每一列像素都描述成一个关于灰度值的函数,那么图像的边缘对应在灰度值函数中是函数值突然变大的…

Autoware 安装(踩坑指南)

Autoware 安装(踩坑指南) 【Autoware】2小时安装Autoware1.13(保姆级教程) Autoware入门学习(二)——Ubuntu18.04下的源码安装和配置 上面的两篇博客安装都异常顺利,甚至没有一点报错&#xff0…

AMEYA360代理线:艾睿红外热成像仪数据机房监测应用

数据信息时代,数据机房是企业重要的区域。近日某购物平台发生的数据机房宕机事故,引发关注。机房设备温度异常,使得系统崩溃,经济损失超亿元。红外热成像仪作为一种非接触式、精准度高、可视化的温度测量工具,为数据机…

【MyBatis 神级框架】从入门到进阶

🎉🎉🎉点进来你就是我的人了博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔🤺🤺🤺 目录 1. 什么是 MyBatis 1.1 为什么要学MaBatis&am…

TikTok正测试AI聊天机器人Tako

该功能可以“从根本上改变应用程序中的搜索和导航” 原文链接:TikTok tests AI chatbot called Tako – The Verge TikTok正在测试一个名为Tako的AI聊天机器人,根据与The Verge共享的功能截图,它可以根据人们的问题推荐视频。 如果TikTok最…

总结:公有云产品之CDN

一、介绍 由于公司经常提供CDN相关概念,本文特地总结下。 二、产品说明 百度云的内容分发网络CDN是一款基于互联网的分布式服务平台,可以加速网络上的内容分发和传输,提高网络的稳定性和访问速度。 CDN主要通过将网站的静态和动态资源缓存…

读书笔记-《ON JAVA 中文版》-摘要17[第十七章 文件]

文章目录 第十七章 文件1. 文件和目录路径1.1 选取路径部分片段1.2 路径分析1.3 Paths的增减修改 2. 目录3. 文件系统4. 路径监听5. 文件查找6. 文件读写7. 本章小结 第十七章 文件 在丑陋的 Java I/O 编程方式诞生多年以后,Java终于简化了文件读写的基本操作。 在 …

手机APP测试流程规范模板

一、流程图 二、测试周期 9.25-10.5 1、测试资源 测试任务开始前,检查各项测试资源。 1.1、产品功能需求文档 1)产品原型图 2)产品效果图 3)行为统计分析定义文档 4)测试设备(Android4.1-Android4.…

OWASP 之跨站脚本xss基础技能

OWASP 之跨站脚本xss基础技能 一.XSS概述二.漏洞危害三.XSS漏洞绕过方法1.手工测试XSS步骤2.常见xss3.绕过方法 四.xss防御方法a.CSP内容安全策略b.HttpOnlyc.输入输出检查d.使用防御函数 五.pikachu靶场1.反射型XSS(get)2.反射型XSS(post&am…