大家好,这里是小白三岁,三岁做梦都没有想到,能够踏上AI技术路,用上AI还完成了一个理想丰满现实骨感的项目,项目漏洞极多,希望大佬们帮忙改进,谢谢大家~~
项目简介
三岁通过AI技术对导入的照片进行AI识别,查看是否戴口罩,如果没有就采用人脸关键点检测,在对应的位置上加上“口罩”,里面涉及了百度飞桨的两款AI识别接口(点击查看具体的内容)
项目不足
因为小编三岁,技术不行对图片处理包括.jpg和.png格式的图处理不好,导致了照片底黑,过大,还希望有大佬帮忙改进提供自己的版本!在这里谢谢大家啦,如果有其他的想法可以自行修改添加自己的版本。
项目说明
项目思路
- 项目先对导入照片文件进行读取,获得照片的绝对路径
- 建立连接根据照片路径 对路径下的图片进行口罩识别
- 对于返回内容(未带口罩的:‘NO MASK’)进行下一步
- 对未带口罩的进行关键点识别
- 获得相应的关键点
- 根据关键点添加“口罩”
- 继续进行判定直到全部判定结束
代码详解
- 有关库的导入及使用(该处以飞桨AI studio平台代码使用方法为准,如有问题欢迎私聊)
下载有关模块:
#运行模块加载 #口罩识别 !hub install pyramidbox_lite_mobile_mask==1.1.0 #关键点检测 !hub install face_landmark_localization==1.0.2 #抠图 !hub isntall deeplabv3p_xception65_humanseg #关键点识别 !hub install face_landmark_localization==1.0.2 # hub run face_landmark_localization --input_path "/PATH/TO/IMAGE" #下载第三方包 !pip install matplotlib
- 导入有关第三方库:
import paddlehub as hub import cv2 import os import matplotlib.pyplot as plt import matplotlib.image as mpimg import paddlehub as hub import numpy as np import math from PIL import Image import importlib
- 创建照片地址读取函数:
def photo_path_read(path, add): for root, dirs, files in os.walk(path): for file in files: a = os.path.splitext(file) add.append(f'{root}/{a[0]}{a[1]}') # print(add) return add
- 创建口罩识别函数:
def Masks_to_identify(photo_path): module = hub.Module(name="pyramidbox_lite_mobile_mask") !hub run pyramidbox_lite_mobile_mask --input_path f"{pothot_path}" test_img_path = f"{photo_path}" # set input dict input_dict = {"data": [cv2.imread(test_img_path)]} results = module.face_detection(data=input_dict) print(results) return results ''' 可以采用以下代码对图片识别情况进行查看 !hub run pyramidbox_lite_mobile_mask --input_path 'photo/Baidu_001.jpg(图片地址)' ''' # test_img_path = f"{photo_path}" # img = mpimg.imread(test_img_path) # # 展示待预测图片 # plt.figure(figsize=(10,10)) # plt.imshow(img) # plt.axis('off') # plt.show() # # 预测结果展示 # test_img_path = f"detection_result/{photo_path}" # img = mpimg.imread(test_img_path) # # 展示预测结果图片 # plt.figure(figsize=(10,10)) # plt.imshow(img) # plt.axis('off') # plt.show()
- 关键点识别及添加“口罩”函数:
def Masks_to_add(path): print('开始添加') src_img = cv2.imread(f'{path}') module = hub.Module(name="face_landmark_localization") result = module.keypoint_detection(images=[src_img]) # print(result) # print(type(result)) box_m = [] box_0 = result[0]['data'][0][0] box_1 = result[0]['data'][0][11]#)( box_m.append(int(box_0[0])) box_m.append(int(box_0[1])) box_m.append(int(box_1[0]+30)) box_m.append(int(box_1[1]+30)) print(box_0,box_1,box_m) base_img = Image.open(f'{path}') #加载需要P上去的图片 tmp_img = Image.open('001.jpg') #以下添加标注均为个人尝试(无关紧要) # has_alpha = tmp_ing.mode == 'RGBA' # tmp_ing.putalptha()[-1] # tmp.img = tmp_img.convert('RGBA') #这里可以选择一块区域或者整张图片 tmp_img = tmp_img.resize((100,100)) #或者使用整张图片 region = tmp_img print('正在判定大小') region = region.resize((int(box_m[2] - box_m[0]), int(box_m[3] - box_m[1]))) print(region) base_img.paste(region, box_m) print(base_img) base_img.show() # 查看合成的图片 print(base_img) # print(f'new_{path[6:]}') base_img.save(f'new_{path[6:]}') #保存图片 print('生成成功')
- 主函数
if __name__ =='__main__': add = [] photo_path = 'photo' path_listes = photo_path_read(photo_path, add) # print(add) for path_list in path_listes: # print(path_list) masks_data = Masks_to_identify(path_list) # print(masks_data[0]['data']['label']) try: if masks_data[0]['data']['label'] == 'NO MASK': print(path_list) Masks_to_add(path_list) except: continue
解析
其他的没有什么需要解析的就是一个关键点检测:
以上是关键点检测的结果,需要添加口罩只需要2到12位置上添加就可以了,至于图片处理不是非常完善,这里就不展示成果了,怕倒大家胃口。
成果思考及总结
这是一个创新赛,第一是有创新思想,第二要技术,小编技术有限,这一点在完成项目时真的深有体会,百度(度娘)都翻遍了,大佬都问了,情况不同帮不了你,还是必须要不断提高自己,不管这次的成绩如何结果如何无所谓了,关键的是这一次的过程,这一次过程中的学习,真的很多,包括百度飞桨小白逆袭大神课程也一样,学到的非常多。
感谢大家支持,这一次的锻炼真的为接下来的学习具有一定的指导作用,希望接下来再接再力,继续努力。谢谢大家~~~~~~