《Python程序设计》实验四 Python综合实践实验报告

《Python程序设计》实验四 Python综合实践实验报告

1.实验内容

  • Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
  • 在华为ECS服务器(OpenOuler系统)和物理机(Windows/Linux系统)上使用VIM、PDB、IDLE、Pycharm等工具编程实现。

2.实验要求

  1. 程序能运行,功能丰富。(需求提交源代码,并建议录制程序运行的视频)
  2. 综合实践报告,要体现实验分析、设计、实现过程、结果等信息,格式规范,逻辑清晰,结构合理。
  3. 在实践报告中,需要对全课进行总结,并写课程感想体会、意见和建议等。

3.实验过程及结果

  • 近年来,随着计算机技术的迅速发展,人脸自动识别技术得到广泛研究与开发,人脸识别成为近30年里模式识别和图像处理中最热门的研究主题之一。人脸识别的目的是从人脸图像中抽取人的个性化特征,并以此来识别人的身份。在查阅相关资料后,我决定以实现一个简单的人脸识别工具为本次python综合实践的题目。
  • 首先,我了解了实现一个简单的人脸识别系统的几个主要部分:人脸检测、人脸规范化(技术原因,水平不够,基本没实现……)、人脸编码 和人脸识别。
  • 其次,我上网了解了现有的适合我使用的一些传统机器学习的开源人脸识别数据算法库(dlib、opencv等),最终从中挑选了操作最为方便简洁(安装十分麻烦……)的face_recognition库作为工具。
    -除此之外,我还根据老师在群里给到的参考资料以及在网上查阅到的相关知识,编写了一个通过MD5加密算法实现快速对文件加密的功能。

4.代码实现

  1. 人脸识别功能实现
# 相关库导入
import face_recognition
import cv2
import os

# 限制只读取文件格式'.png'或'.jpg'或'.jpeg'的图片
from cv2 import namedWindow

unknow_people_list = [i for i in os.listdir('unknow_people') if
                      (i.endswith('.jpg')) or (i.endswith('.png')) or (i.endswith('.jpeg'))]
know_people_list = [i for i in os.listdir('know_people') if
                    (i.endswith('.jpg')) or (i.endswith('.png')) or (i.endswith('.jpeg'))]


def face_select():
    # 定义flag
    flag = 0
    for unknow_people in unknow_people_list:
        # 读取待识别图片
        unknow = face_recognition.load_image_file('unknow_people/' + unknow_people)
        # 将待识别图片转化为特征向量
        unknow_encode = face_recognition.face_encodings(unknow)[0]
        for know_people in know_people_list:
            # 读取计算机已经认识的图片
            know = face_recognition.load_image_file('know_people/' + know_people)
            # 获得面部位置
            face_location1 = face_recognition.face_locations(know)
            face_location2 = face_recognition.face_locations(unknow)
            # 提取面部关键点
            face_landmarks_list1 = face_recognition.face_landmarks(know)
            face_landmarks_list2 = face_recognition.face_landmarks(unknow)
            # 图片转化为特征向量
            know_encode = face_recognition.face_encodings(know)[0]
            # 两张图片进行比较的结果
            res = face_recognition.compare_faces([know_encode], unknow_encode, tolerance=0.5)
            if res[0]:
                flag = 1
                break
            else:
                flag = 0
        if flag == 1:
            print(f'{know_people.split(".")[0]}匹配成功!')
        else:
            print(f'匹配失败')
        if res == [True]:
            name = "PASS"
        else:
            name = "NO"
        # 绘制人脸特征点
        for face_landmarks in face_landmarks_list1:
            for facial_feature in face_landmarks.keys():
                for pt_pos in face_landmarks[facial_feature]:
                    cv2.circle(know, pt_pos, 1, (192, 192, 192), 2)
        for face_landmarks in face_landmarks_list2:
            for facial_feature in face_landmarks.keys():
                for pt_pos in face_landmarks[facial_feature]:
                    cv2.circle(unknow, pt_pos, 1, (192, 192, 192), 2)
        #  脸部区域绘图
        for (x1, y1, w1, h1) in face_location1:
            img1 = cv2.rectangle(know, (y1, w1), (h1, x1), (255, 0, 0), 2)  # 脸部框图绘制
            cv2.putText(know, name, (y1 - 10, w1 - 10), cv2.FONT_HERSHEY_COMPLEX, 0.8, (0, 255, 0), 2)
        frame1 = cv2.cvtColor(know, cv2.COLOR_BGR2RGB)

        for (x1, y1, w1, h1) in face_location2:
            img2 = cv2.rectangle(unknow, (y1, w1), (h1, x1), (255, 0, 0), 2)
            cv2.putText(unknow, name, (y1 - 10, w1 - 10), cv2.FONT_HERSHEY_COMPLEX, 0.8, (0, 255, 0), 2)
        frame2 = cv2.cvtColor(unknow, cv2.COLOR_BGR2RGB)

        #  结果显示
        namedWindow("1", 0)
        cv2.imshow("1", frame1)
        namedWindow("2", 0)
        cv2.imshow("2", frame2)
        if flag == 1:
            cv2.waitKey(0)
        else:
            cv2.waitKey(1)


if __name__ == '__main__':
    face_select()

2.MD5算法文件加密功能的实现

import os
import hashlib
import time


def mine():
    DATA_1 = "C:/Users/Admin/Desktop/人脸识别/unknow_people"
    str = "10"

    PassWord_1 = input('请输入要加密或解密的密码:')
    # 判断是否填写
    if PassWord_1 == '':
        print('密码不得为空,请重新输入!!!')
        time.sleep(2)
        os.system('cls')
        mine()
    else:
        pass

    def iterbrowse(path):
        for home, dirs, files in os.walk(path):
            for filename in files:
                yield os.path.join(home, filename)

    for fullname in iterbrowse(DATA_1):
        NAME = fullname
        NAME = NAME.replace("\\", "/")  # 替换

        def get_FileSize(filePath):
            fsize = os.path.getsize(filePath)
            fsize = fsize / float(1024 * 1024)
            size = "%.0f" % fsize
            if int(size) >= int(str):
                print('[-!-]: ', NAME, '\t- - - - 内存过大!!!')
                pass
            else:
                # 写入的文件
                if NAME.split(".")[-1][-10:] == 'DATAAES-AI':  # 检测是否是已经加密后的文件,用于检测后缀的DATAAES-AI
                    # 解密
                    F = NAME.split(os.path.sep)[0].replace("DATAAES-AI", "")  # 去除DATAAES-AI
                    print(f'[-.·J·.-]: ', NAME, '\t- - - - 解密成功!!!')
                else:
                    # 加密
                    F = NAME.split(os.path.sep)[0] + "DATAAES-AI"
                    print(f'[+·J·+]: ', NAME, '\t+ + + + 加密成功!!!')

                a = open(NAME, "rb")  # 读取文件
                b = open(F, "wb")  # 写入文件

                # 使用MD5进行加密(双层加密)
                hl = hashlib.md5()
                hl.update(PassWord_1.encode(encoding='utf-8'))
                password_list = hl.hexdigest()
                # 使用MD5进行加密(双层加密)
                hl.update(password_list.encode(encoding='utf-8'))
                password_list2 = hl.hexdigest()
                password_data = password_list + password_list2

                # 加密
                def Encryption_and_decryption():
                    count = 0  # 索引
                    for now in a:
                        for nowByte in now:
                            newByte = nowByte ^ ord(password_data[count % len(password_data)])  # 循环遍历出密码的ord值,单个循环
                            count += 1
                            b.write(bytes([newByte]))  # 转换

                Encryption_and_decryption()

                a.close()
                b.close()
                os.remove(f'{NAME}')

        get_FileSize(NAME)
    print('操作完成!!!')
    print('正在返回!!!')
    time.sleep(2)
    os.system('cls')
    mine()

mine()

5.运行结果

在unknow文件夹录入人脸识别照片数据库

由于照片数据库保管着大量照片信息,不应该让用户轻易查看或修改,我们可以通过加密来避免这些问题。
(解密与加密同理,使用同一密钥)

在这里插入图片描述
加密效果如图所示

在这里插入图片描述
接下来是人脸识别功能运行结果

对于待识别的图像,主要实现了对人脸特征向量的编码,对识别点的标识,对图片中人脸部分的框图标识,以及文字提示最终比较结果(比对成功为PASS,比对失败为NO)*

PASS
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

NO
在这里插入图片描述在这里插入图片描述
华为云服务器实现

!!!得买Ubuntu的服务器才好用,一开始买的openEuler属实不好用,好多指令操作都很复杂,许多python库的安装都需要进行许多额外的操作。

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

6.问题及解决过程

  • 问题1:人脸识别库face_recognition库的安装。
  • 解决方案:一开始选用这个人脸识别库的时候,就是看中了他的说明文档较为细致,操作较为方便,但万万没想到他的安装竟然这么麻烦……(包括后续更换Ubuntu服务器也是因为他)在安装本库前,需要安装cmake,boost,dlib等库,并且需要安装visual stdio c++编译环境。
  • 问题2:人脸识别结果出错。
  • 解决方案:调整了face_recognition.compare_faces方法中的参数——容忍度,从0.6调到0.5。(数值越小,对比较的结果越为严格)
  • 问题3:在云服务器上安装python库报错。
  • 解决方案:查询各种各样的网络资料,依次慢慢解决。除此之外,感谢2系python群里各位同学的交流,也为我解决问题提供了不少的帮助和思路。
  • 问题4:xming运行报错。
  • 解决方案:这个就是查阅资料,慢慢试了一个下午才调出来……(一杯茶,一包烟, 一个bug改一天)

7.课程总结与感想

  • 首先是关于这次综合实践,本次实践活动让我收获颇丰,通过编写一个完整的项目,我们将所学的知识综合运用起来,将平时上课时候所学的知识系统地运用了一遍。运用华为云服务器实现python代码的运行,也让我对linux系统的工作原理有了更深入的了解。但我认为本次实践活动给我留下最为重要的启示,就是做实验的时候遇到困难应及时交流与沟通,在以后的实验过程中,还是要更加注重交流经验,在与同学和老师的交流中不断进步。
  • 关于课程,回顾本学期的python课程,从上第一节课时,如何正确安装能够运行python的pycharm和idle。再到后来测评python技能树,用python进行网络爬虫的编写,最后还编写了一个较为完整的人脸识别系统。短短一个学期,完成了以前c语言编写很难实现的许多功能,感觉还是非常有成就感的一件事。在13周的学习中,学习了数列的应用,字符串,正则表达式,函数文件及目录操作,数据库,网络爬虫等知识,因为已经是大二的学生了,相较于大一的大部分同学,还是多少有一些程序 编写方面的熟练度优势的,再加上先前选修过的java课程,也对面向对象的编程有所了解,听起课来还是比较能够接受的。
  • 最后是我对本门课程的一些小小建议:1.希望老师在讲的同时或者是课下把代码发到群里,有一些程序打字慢了点,或者走了一会儿神 ,再接着根据自己的理解去敲,还是容易有一些问题的。2.希望老师能考虑一下电教三。实验课801太难抢了,6点之后去就只能上楼了,只看着屏幕做实验总感觉有点怪怪的。(虽然后几节课已经全是网课了吧)3.希望老师能够继续分享一些python知识在群里,确实给了我很多的启发,我在浏览的过程中激发了对人脸识别继续深入下去的兴趣,希望能在后续的暑假中,有时间继续研究基于人工智能深度学习、神经网络方面的进一步改进的人脸识别。

7.参考资料

(真的太多啦,写几个还没有关掉的吧)
https://www.linuxidc.com/Linux/2017-01/139241.htm
https://blog.csdn.net/Nothing_227/article/details/107670329
https://blog.csdn.net/xd782292778/article/details/50372688?utm_source=itdadao&utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_title~default-1-50372688-blog-50372688.pc_relevant_default&spm=1001.2101.3001.4242.2&utm_relevant_index=4

  • 7
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验三:Python程序设计基础 实验目的: 1.掌握Python程序的基本结构。 2.理解Python程序的执行过程。 3.学会使用Python基本的数据类型和控制结构。 4.学会定义和调用函数。 实验环境: Python 3.7以上版本,Jupyter Notebook 实验任务: 任务一:Python程序基本结构 1. Python程序的基本结构是什么? 2. 请用Python代码输出“Hello World!”。 任务二:Python程序的执行过程 1. Python程序的执行过程是什么? 2. Python程序中的语句是按照什么顺序执行的? 任务三:Python基本数据类型和控制结构 1. Python中基本的数据类型有哪些? 2. Python中的控制结构有哪些? 3. 请用Python代码实现以下功能: (1)定义一个列表,包含数字1到10。 (2)输出列表中的所有元素。 (3)输出列表中的第一个和最后一个元素。 (4)输出列表中的第2到第5个元素。 (5)将列表中的元素按照从大到小的顺序排列并输出。 任务Python函数的定义和调用 1. Python中如何定义函数? 2. Python中如何调用函数? 3. 请用Python代码实现以下功能: (1)定义一个函数,计算任意两个数的和。 (2)调用该函数,计算2和3的和并输出结果。 (3)定义一个函数,计算任意两个数的积。 (4)调用该函数,计算4和5的积并输出结果。 (5)定义一个函数,将任意一个字符串反转并输出。 (6)调用该函数,将字符串“abcdefg”反转并输出结果。 实验报告: 请按照实验任务提交实验报告,将代码和运行结果截图并附在报告中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值