• 基于Python和命令行人脸识别项目(系列四)


    接着系列三,继续开始我们face_recognition项目.

    下面介绍本项目其他一些功能。

    案例一:让系统确定人脸(是鞠婧祎还是特朗普)

    在knowe_people文件夹中创建recognize_faces_in_pictures.py文件并写入以下代码:

    import face_recognition

    # Load the jpg files into numpy arrays
    jujingyi_image = face_recognition.load_image_file("鞠婧祎.jpg")
    telangpu_image = face_recognition.load_image_file("特朗普.jpeg")
    unknown_image = face_recognition.load_image_file("unknown.jpeg")

    # Get the face encodings for each face in each image file
    # Since there could be more than one face in each image, it returns a list of encodings.
    # But since I know each image only has one face, I only care about the first encoding in each #image, so I grab index 0.
    try:
        jujingyi_face_encoding = face_recognition.face_encodings(jujingyi_image)[0]
        telangpu_face_encoding = face_recognition.face_encodings(telangpu_image)[0]
        unknown_face_encoding = face_recognition.face_encodings(unknown_image)[0]
    except IndexError:
        print("I wasn't able to locate any faces in at least one of the images. Check the image files. Aborting...")
        quit()

    known_faces = [
        jujingyi_face_encoding,
        telangpu_face_encoding
    ]

    # results is an array of True/False telling if the unknown face matched anyone in the known_faces array
    results = face_recognition.compare_faces(known_faces, unknown_face_encoding)

    print("Is the unknown face a picture of jujingyi? {}".format(results[0]))
    print("Is the unknown face a picture of telangpu? {}".format(results[1]))
    print("Is the unknown face a new person that we've never seen before? {}".format(not True in results))

    然后我们把一张在knowe_people文件夹中放入一张以前没有的特朗普照片命名为unknown.jpeg

       然后终端切换到knowe_people目录下,输入以下命令,弹出窗口如下:

     可见终端可以确定未知图片是特朗普,终端输出如下:Is the unknown face a picture of jujingyi? False
                              Is the unknown face a picture of telangpu? True
                              Is the unknown face a new person that we've never seen before? False

    案例二:人脸识别之后在原图画上框并标注姓名

    在knowe_people文件夹中创建identify_and_draw_boxes_on_faces.py文件并写入以下代码:


    import face_recognition
    from PIL import Image, ImageDraw
    import numpy as np

    # This is an example of running face recognition on a single image
    # and drawing a box around each person that was identified.

    # Load a sample picture and learn how to recognize it.
    jujingyi_image = face_recognition.load_image_file("鞠婧祎1.jpeg")
    jujingyi_face_encoding = face_recognition.face_encodings(jujingyi_image)[0]

    # Load a second sample picture and learn how to recognize it.
    obama_image = face_recognition.load_image_file("obama.jpg")
    obama_face_encoding = face_recognition.face_encodings(obama_image)[0]

    # Create arrays of known face encodings and their names
    known_face_encodings = [
        jujingyi_face_encoding,
        obama_face_encoding
    ]
    known_face_names = [
        "鞠婧祎",
        "obama"
    ]

    # Load an image with an unknown face
    unknown_image = face_recognition.load_image_file("two_people.jpg")

    # Find all the faces and face encodings in the unknown image
    face_locations = face_recognition.face_locations(unknown_image)
    face_encodings = face_recognition.face_encodings(unknown_image, face_locations)

    # Convert the image to a PIL-format image so that we can draw on top of it with the Pillow library
    # See http://pillow.readthedocs.io/ for more about PIL/Pillow
    pil_image = Image.fromarray(unknown_image)
    # Create a Pillow ImageDraw Draw instance to draw with
    draw = ImageDraw.Draw(pil_image)

    # Loop through each face found in the unknown image
    for (top, right, bottom, left), face_encoding in zip(face_locations, face_encodings):
        # See if the face is a match for the known face(s)
        matches = face_recognition.compare_faces(known_face_encodings, face_encoding)

        name = "Unknown"

        # If a match was found in known_face_encodings, just use the first one.
        # if True in matches:
        #     first_match_index = matches.index(True)
        #     name = known_face_names[first_match_index]

        # Or instead, use the known face with the smallest distance to the new face
        face_distances = face_recognition.face_distance(known_face_encodings, face_encoding)
        best_match_index = np.argmin(face_distances)
        if matches[best_match_index]:
            name = known_face_names[best_match_index]

        # Draw a box around the face using the Pillow module
        draw.rectangle(((left, top), (right, bottom)), outline=(0, 0, 255))

        # Draw a label with a name below the face
        text_width, text_height = draw.textsize(name)
        draw.rectangle(((left, bottom - text_height - 10), (right, bottom)), fill=(0, 0, 255), outline=(0, 0, 255))
        draw.text((left + 6, bottom - text_height - 5), name, fill=(255, 255, 255, 255))


    # Remove the drawing library from memory as per the Pillow docs
    del draw

    # Display the resulting image
    pil_image.show()

    # You can also save a copy of the new image to disk if you want by uncommenting this line
    # pil_image.save("image_with_boxes.jpg")
    再在knowe_people放入一张未知图片,如图,命名为——two_people.jpg。

    然后终端切换到knowe_people目录下,输入以下命令,弹出窗口如下:

     由于右边是未知人物,在数据集中没有对应的信息(数据集中只有obama和鞠婧祎信息),输出unknown,修改代码:

    import face_recognition
    from PIL import Image, ImageDraw
    import numpy as np

    # This is an example of running face recognition on a single image
    # and drawing a box around each person that was identified.

    # Load a sample picture and learn how to recognize it.
    obama_image = face_recognition.load_image_file("obama.jpg")
    obama_face_encoding = face_recognition.face_encodings(obama_image)[0]

    # Load a second sample picture and learn how to recognize it.
    biden_image = face_recognition.load_image_file("biden.jpg")
    biden_face_encoding = face_recognition.face_encodings(biden_image)[0]

    # Create arrays of known face encodings and their names
    known_face_encodings = [
        obama_face_encoding,
        biden_face_encoding
    ]
    known_face_names = [
        "Barack Obama",
        "Joe Biden"
    ]

    # Load an image with an unknown face
    unknown_image = face_recognition.load_image_file("two_people.jpg")

    # Find all the faces and face encodings in the unknown image
    face_locations = face_recognition.face_locations(unknown_image)
    face_encodings = face_recognition.face_encodings(unknown_image, face_locations)

    # Convert the image to a PIL-format image so that we can draw on top of it with the Pillow library
    # See http://pillow.readthedocs.io/ for more about PIL/Pillow
    pil_image = Image.fromarray(unknown_image)
    # Create a Pillow ImageDraw Draw instance to draw with
    draw = ImageDraw.Draw(pil_image)

    # Loop through each face found in the unknown image
    for (top, right, bottom, left), face_encoding in zip(face_locations, face_encodings):
        # See if the face is a match for the known face(s)
        matches = face_recognition.compare_faces(known_face_encodings, face_encoding)

        name = "Unknown"

        # If a match was found in known_face_encodings, just use the first one.
        # if True in matches:
        #     first_match_index = matches.index(True)
        #     name = known_face_names[first_match_index]

        # Or instead, use the known face with the smallest distance to the new face
        face_distances = face_recognition.face_distance(known_face_encodings, face_encoding)
        best_match_index = np.argmin(face_distances)
        if matches[best_match_index]:
            name = known_face_names[best_match_index]

        # Draw a box around the face using the Pillow module
        draw.rectangle(((left, top), (right, bottom)), outline=(0, 0, 255))

        # Draw a label with a name below the face
        text_width, text_height = draw.textsize(name)
        draw.rectangle(((left, bottom - text_height - 10), (right, bottom)), fill=(0, 0, 255), outline=(0, 0, 255))
        draw.text((left + 6, bottom - text_height - 5), name, fill=(255, 255, 255, 255))


    # Remove the drawing library from memory as per the Pillow docs
    del draw

    # Display the resulting image
    pil_image.show()

    # You can also save a copy of the new image to disk if you want by uncommenting this line
    # pil_image.save("image_with_boxes.jpg")

    然后终端切换到knowe_people目录下,输入以下命令,弹出窗口如下:

     由于数据集中有未知人物拜登的信息,故能输出人名。

    案例三:在不同精度上比较两张人脸是否是同一个人

    通常情况下,我们不一定检查两张脸是否匹配(对或错),而且看看它们有多相似。您可以使用face_distance函数来实现这一点。
    该模型的训练方式是,距离为0.6或更小的面孔应该是匹配的。但如果你想更严格一点,你可以找一个较小的距离。例如,使用0.55将更加减少false,
    正面匹配有更多假阴性的风险。注意:这与“百分比匹配”并不完全相同。比例不是线性的。但是你可以假设距离较小的图像比距离较大的图像更相似。

    首先在known_people文件夹中加入带匹配的照片obama2.jpg,如图。

     在knowe_people文件夹中创建face_distance.py文件并写入以下代码:

    import face_recognition

    # Often instead of just checking if two faces match or not (True or False), it's helpful to see how similar they are.
    # You can do that by using the face_distance function.

    # The model was trained in a way that faces with a distance of 0.6 or less should be a match. But if you want to
    # be more strict, you can look for a smaller face distance. For example, using a 0.55 cutoff would reduce false
    # positive matches at the risk of more false negatives.

    # Note: This isn't exactly the same as a "percent match". The scale isn't linear. But you can assume that images with a
    # smaller distance are more similar to each other than ones with a larger distance.

    # Load some images to compare against
    known_obama_image = face_recognition.load_image_file("obama.jpg")
    known_biden_image = face_recognition.load_image_file("biden.jpg")

    # Get the face encodings for the known images
    obama_face_encoding = face_recognition.face_encodings(known_obama_image)[0]
    biden_face_encoding = face_recognition.face_encodings(known_biden_image)[0]

    known_encodings = [
        obama_face_encoding,
        biden_face_encoding
    ]

    # Load a test image and get encondings for it
    image_to_test = face_recognition.load_image_file("obama2.jpg")
    image_to_test_encoding = face_recognition.face_encodings(image_to_test)[0]

    # See how far apart the test image is from the known faces
    face_distances = face_recognition.face_distance(known_encodings, image_to_test_encoding)

    for i, face_distance in enumerate(face_distances):
        print("The test image has a distance of {:.2} from known image #{}".format(face_distance, i))
        print("- With a normal cutoff of 0.6, would the test image match the known image? {}".format(face_distance < 0.6))
        print("- With a very strict cutoff of 0.5, would the test image match the known image? {}".format(face_distance < 0.5))
        print()

    然后终端切换到knowe_people目录下,输入以下命令,弹出窗口如下:

     终端输出说明:上述测试图像(obama)与已知图像#0(obama)之间的距离为0.35,也就是说匹配可能性比较高(正常的截断为0.6),测试图像是否与已知图像匹配。在非常严格的0.5截断下,测试图像会与已知图像匹配吗?会
    测试图像到已知图像#1(biden)的距离为0.82-正常截断距离为0.6,测试图像是否与已知图像不匹配,在非常严格的0.5截断下,测试图像会与已知图像匹配吗?不会

    小结:这次主要展示了本项目三个功能,更多内容见其他系列。

    案例一:让系统确定人脸(是鞠婧祎还是特朗普)

    案例二:人脸识别之后在原图画上框并标注姓名

    案例三:在不同精度上比较两张人脸是否是同一个人

  • 相关阅读:
    hdu2328 Corporate Identity
    hdu1238 Substrings
    hdu4300 Clairewd’s message
    hdu3336 Count the string
    hdu2597 Simpsons’ Hidden Talents
    poj3080 Blue Jeans
    poj2752 Seek the Name, Seek the Fame
    poj2406 Power Strings
    hust1010 The Minimum Length
    hdu1358 Period
  • 原文地址:https://www.cnblogs.com/cy0628/p/13884460.html
Copyright © 2020-2023  润新知