20202127《Python程序设计》实验四 Python综合实践实验报告
20202127《Python程序设计》实验四 Python综合实践实验报告
课程:《Python程序设计》
班级:2021
姓名:马艺洲
学号:20202127
实验教师:王志强
实验日期:2022年5月21日
必修/选修:公选课
1.实验内容
- Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
- 在华为ECS服务器(OpenOuler系统)和物理机(Windows/Linux系统)上使用VIM、PDB、IDLE、Pycharm等工具编程实现。
2.实验要求
- 程序能运行,功能丰富。(需求提交源代码,并建议录制程序运行的视频)
- 综合实践报告,要体现实验分析、设计、实现过程、结果等信息,格式规范,逻辑清晰,结构合理。
- 在实践报告中,需要对全课进行总结,并写课程感想体会、意见和建议等。
3.实验过程及结果
- 近年来,随着计算机技术的迅速发展,人脸自动识别技术得到广泛研究与开发,人脸识别成为近30年里模式识别和图像处理中最热门的研究主题之一。人脸识别的目的是从人脸图像中抽取人的个性化特征,并以此来识别人的身份。在查阅相关资料后,我决定以实现一个简单的人脸识别工具为本次python综合实践的题目。
- 首先,我了解了实现一个简单的人脸识别系统的几个主要部分:人脸检测、
人脸规范化(技术原因,水平不够,基本没实现……)、人脸编码 和人脸识别。 - 其次,我上网了解了现有的适合我使用的一些传统机器学习的开源人脸识别数据算法库(dlib、opencv等),最终从中挑选了操作最为方便简洁(安装十分麻烦……)的face_recognition库作为工具。
-除此之外,我还根据老师在群里给到的参考资料以及在网上查阅到的相关知识,编写了一个通过MD5加密算法实现快速对文件加密的功能。
4.代码实现
- 人脸识别功能实现
# 相关库导入
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