[화웨이는] 클라우드 기술 공유 시스템 자동 얼굴 마스크 파이썬 사람들을 착용 기반으로

프로젝트 배경

감염의 2019 새로운 코로나 바이러스 폐렴 전염병 발생, 사람들에 영향을 미치는, 전국 애도, 마스크, 알코올, 살균제 가치있는 상품입니다.

마스크를 잡아, 어떻게 할까? 다음과 같이 자동으로 마스크 시스템을 착용 파이썬을 사용하는 방법 공유에 오늘, 자신을 위로 할 수있는 기술로, 시스템의 효과는 다음과 같습니다

시스템의 원리는 검출 된 입에있어서, 상기 얼굴 립부 이러한 데이터, 위치 데이터 (48시 내지 67시 방향)에 기초하여, 기능 데이터 식별 용이를 Dlib 모듈 랜드면 (68) 키포인트 검출 라이브러리 인 크기 및 부의 방향은, 상기 PLL 모듈 마스크의 크기와 방향을 조절하여 마스크 이미지의 적절한 위치를 달성했다.

2, 페이지 디자인

: 완전 종료 시스템은 Tkinter 모듈 구현의 GUI 디자인, (여기에 거래 좋은 사진은 마스크) 마스크의 네 가지 유형에서 선택할 작업의 효과를 보여주기 위해 얼굴 마스크를 착용,로드 문자 이미지가 될 수있다, 효과는 다음을 기반으로

페이지 레이아웃 구현 코드는 다음과 같습니다 :

    def __init__(self):
        self.root = tk.Tk()
        self.root.title('基于Pyhon的人脸自动戴口罩系统')
        self.root.geometry('1200x500')
 
        self.path1_ = None
        self.path2_ = None
        self.seg_img_path = None
        self.mask = None
        self.label_Img_seg = None
 
        decoration = PIL.Image.open('./pic/bg.png').resize((1200, 500))
        render = ImageTk.PhotoImage(decoration)
        img = tk.Label(image=render)
        img.image = render
        img.place(x=0, y=0)
 
        # 原图1的展示
        tk.Button(self.root, text="打开头像", command=self.show_original1_pic).place(x=50, y=120)
        tk.Button(self.root, text="退出软件", command=quit).place(x=900, y=40)
 
        tk.Label(self.root, text="头像", font=10).place(x=280, y=120)
        self.cv_orinial1 = tk.Canvas(self.root, bg='white', width=270, height=270)
        self.cv_orinial1.create_rectangle(8, 8, 260, 260, width=1, outline='red')
        self.cv_orinial1.place(x=180, y=150)
        self.label_Img_original1 = tk.Label(self.root)
        self.label_Img_original1.place(x=180, y=150)
 
        tk.Label(self.root,text="选择口罩",font=10).place(x=600,y=120)
 
        first_pic = Image.open("./pic/Mask.png")
        first_pic = first_pic.resize((60, 60), Image.ANTIALIAS)
        first_pic = ImageTk.PhotoImage(first_pic)
        self.first = tk.Label(self.root, image=first_pic)
        self.first.place(x=600,y=160, width=60, height=60)
        self.first.bind("<Button-1>", self.mask0)
 
        second_pic = Image.open("./pic/Mask1.png")
        second_pic = second_pic.resize((60, 60), Image.ANTIALIAS)
        second_pic = ImageTk.PhotoImage(second_pic)
        self.second_pic = tk.Label(self.root, image=second_pic)
        self.second_pic.place(x=600, y=230, width=60, height=60)
        self.second_pic.bind("<Button-1>", self.mask1)
 
        third_pic = Image.open("./pic/Mask3.png")
        third_pic = third_pic.resize((60, 60), Image.ANTIALIAS)
        third_pic = ImageTk.PhotoImage(third_pic)
        self.third_pic = tk.Label(self.root, image=third_pic)
        self.third_pic.place(x=600, y=300, width=60, height=60)
        self.third_pic.bind("<Button-1>", self.mask3)
 
        forth_pic = Image.open("./pic/Mask4.png")
        forth_pic = forth_pic.resize((60, 60), Image.ANTIALIAS)
        forth_pic = ImageTk.PhotoImage(forth_pic)
        self.forth_pic = tk.Label(self.root, image=forth_pic)
        self.forth_pic.place(x=600, y=370, width=60, height=60)
        self.forth_pic.bind("<Button-1>", self.mask4)
 
        tk.Label(self.root, text="佩戴效果", font=10).place(x=920, y=120)
        self.cv_seg = tk.Canvas(self.root, bg='white', width=270, height=270)
        self.cv_seg.create_rectangle(8, 8, 260, 260, width=1, outline='red')
        self.cv_seg.place(x=820, y=150)
        self.label_Img_seg = tk.Label(self.root)
        self.label_Img_seg.place(x=820, y=150)
 
        self.root.mainloop()

캐릭터 이미지, 다음 코드와 같이 구현을로드 :

    # 原图1展示
    def show_original1_pic(self):
        self.path1_ = askopenfilename(title='选择文件')
        print(self.path1_)
        self.Img = PIL.Image.open(r'{}'.format(self.path1_))
        Img = self.Img.resize((270,270),PIL.Image.ANTIALIAS)   # 调整图片大小至256x256
        img_png_original = ImageTk.PhotoImage(Img)
        self.label_Img_original1.config(image=img_png_original)
        self.label_Img_original1.image = img_png_original  # keep a reference
        self.cv_orinial1.create_image(5, 5,anchor='nw', image=img_png_original)

다음과 같이 얼굴 마스크를 착용는 구현 코드를 보여줍니다

    # 人脸戴口罩效果展示
    def show_morpher_pic(self):
        img1 = cv2.imread(self.path1_)
        x_min, x_max, y_min, y_max, size = self.get_mouth(img1)
        adding = self.mask.resize(size)
        im = Image.fromarray(img1[:, :, ::-1])  # 切换RGB格式
        # 在合适位置添加头发图片
        im.paste(adding, (int(x_min), int(y_min)), adding)
        # im.show()
        save_path = self.path1_.split('.')[0]+'_result.jpg'
        im.save(save_path)
        Img = im.resize((270, 270), PIL.Image.ANTIALIAS)  # 调整图片大小至270x270
        img_png_seg = ImageTk.PhotoImage(Img)
        self.label_Img_seg.config(image=img_png_seg)
        self.label_Img_seg.image = img_png_seg  # keep a reference

네 개의 마스크 이미지의 도입, 구현 코드는 다음과 같습니다 :

    def mask0(self, event):
        self.mask = Image.open('pic/mask.png')
        self.show_morpher_pic()
 
    def mask1(self, event):
        self.mask = Image.open('pic/mask1.png')
        self.show_morpher_pic()
 
    def mask3(self, event):
        self.mask = Image.open('pic/mask3.png')
        self.show_morpher_pic()
 
    def mask4(self, event):
        self.mask = Image.open('pic/mask4.png')
        self.show_morpher_pic()

3, 장기 인식

페이지가 테스트 데모를 작성, 얼굴 장기 키 포인트, 우리의 직관적 인 이해의 편의를 위해 여기에 입의 위치와 크기의 분석에 대한 인식 Dlib 함수 라이브러리를 달성하기 위해 주요 수치가 표시됩니다 직면하게 될 것이다에 의존 한 후, 같은 다음 아래 :

#coding=utf-8
#图片检测 - Dlib版本
import cv2
import dlib
import time
t=time.time()
path = "./pic/im.jpg"
img = cv2.imread(path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 
#人脸分类器
detector = dlib.get_frontal_face_detector()
# 获取人脸检测器
predictor = dlib.shape_predictor(
    "./shape_predictor_68_face_landmarks.dat"
)
 
dets = detector(gray, 1)
for face in dets:
    shape = predictor(img, face)  # 寻找人脸的68个标定点
    # 遍历所有点,打印出其坐标,并圈出来
    for pt in shape.parts():
        pt_pos = (pt.x, pt.y)
        cv2.circle(img, pt_pos, 1, (0, 255, 0), 2)
    cv2.imshow("image", img)
print('所用时间为{}'.format(time.time()-t))
cv2.waitKey(0)
#cv2.destroyAllWindows()
time.sleep(5)

아래와 같이 결과 :

이 키는이 도면 시스템에 표시되지 않아도 다음과 같이 코드를 달성하기 위해, 직접 사용할 수 있습니다 :

    def get_mouth(self, img):
        img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        detector = dlib.get_frontal_face_detector()
        predictor = dlib.shape_predictor('./shape_predictor_68_face_landmarks.dat')
        faces = detector(img_gray, 0)
        for k, d in enumerate(faces):
            x = []
            y = []
            # 人脸大小的高度
            height = d.bottom() - d.top()
            # 人脸大小的宽度
            width = d.right() - d.left()
            shape = predictor(img_gray, d)
            # 48-67 为嘴唇部分
            for i in range(48, 68):
                x.append(shape.part(i).x)
                y.append(shape.part(i).y)
            # 根据人脸的大小扩大嘴唇对应口罩的区域
            y_max = (int)(max(y) + height / 3)
            y_min = (int)(min(y) - height / 3)
            x_max = (int)(max(x) + width / 3)
            x_min = (int)(min(x) - width / 3)
            size = ((x_max - x_min), (y_max - y_min))
            return x_min, x_max, y_min, y_max, size

4, 시스템을 종료

종료 시스템은 다음과 같은 라인 데모가 실현 될 수있다, 매우 간단합니다 :

    def quit(self):
        self.root.destroy()

저자 : 화웨이 구름이 특별 개발자 피드는 없는 원숭이 탈모 프로그램을 수행

 

추천

출처www.cnblogs.com/huaweicloud/p/12383667.html