Lesson Progress
0% Complete

얼굴 필터 개요

많은 분들이 Snapchat의 나이 필터 또는 Instagram의 Blossom 필터와 같은 얼굴 필터를 사용하셨을 것입니다. 하지만 이 필터가 어떻게 우리의 얼굴을 인식하는지 궁금한 적이 있습니까?

화면에 표시된 필터 중에서 하나를 선택하여 얼굴에 적용하는 실습 프로젝트를 만들어 얼굴 필터가 어떻게 작동하는지 알아봅니다.

코딩하자!

코드는 매우 간단합니다. 바로 시작하겠습니다. 아래 단계를 따르세요.

  1. Pictoblox를 열고 Python(베타) 코딩 인터페이스를 선택합니다.
  2. Choose a Sprite 버튼(오른쪽 하단 모서리)을 클릭하고 환경에 Face Filter 스프라이트를 추가합니다.
  3. cross 버튼(오른쪽 상단 모서리)을 클릭하여 Tobi 스프라이트를 삭제합니다.
  4. 이제 프로젝트 파일 섹션(왼쪽)에서 Face Filters.py 파일을 선택하면 기본적으로 다음과 같이 스크립팅 영역에서 스프라이트 개체가 시작됩니다.
    sprite = Sprite('Face Filters')
  5. 이제 Face Detection 확장 및 해당 방법/기능에 액세스하기 위해 fd 라는 개체를 만듭니다.
    fd = FaceDetection()
  6. 마찬가지로 pen이라는 객체를 만듭니다. Pen 확장 및 해당 메서드/기능에 액세스할 수 있습니다.
    pen = Pen()
  7. 다음으로 다양한 얼굴 감지 기능을 사용하겠습니다-:
    1. video([1], [2]): 비디오를 켭니다. 이 함수는 두 개의 매개변수를 받습니다. 매개변수 [1]은 비디오를 켜거나 끄기 위한 것이고 매개변수 [2]는 비디오의 투명도를 위한 것입니다(0~100%).
    2. disableblox(): 경계 상자를 비활성화하려면
    3. setthreshold([1]): 임계값/신뢰도를 설정합니다. 하나의 매개변수를 받습니다. 이 매개변수는 얼굴이 감지되는 임계값/신뢰도를 0~100%로 결정합니다. 이 함수들을 우리가 만든 얼굴 검출 객체( fd )의 메서드로 사용할 수 있습니다. 스크립트에 다음 코드를 추가합니다.
      fd.video("on", 0) # to turn on video with 0% transparency 
      fd.disablebox() # to disable bounding box 
      fd.setthreshold(0.4) # to set the threshold at 0.4
  8. 이제 다음 부분에서는 코드를 계속 실행하려고 하므로 중지할 때까지 코드가 계속 실행되도록 while 루프를 사용합니다.while True:
  9. 이 루프 안에 다음 두 함수를 추가합니다.
    1. fd.analysecamera() : PictoBlox 스테이지에서 카메라의 비디오를 분석합니다.
    2. pen.clear() : 이전 코드 실행에서 펜 표시를 지웁니다.
      while True:
        fd.analysecamera()
        pen.clear()
  10. 이제 하나 이상의 얼굴이 카메라에서 감지되는지 여부를 확인합니다. if 조건을 사용합니다. 이를 위해 얼굴 감지 확장 프로그램의 count() 함수를 사용합니다. count() 함수는 스테이지에서 감지된 얼굴의 수를 반환합니다. 또한 하나 이상의 얼굴이 감지될 때 스프라이트가 아무 말도 하지 않도록 합니다. 따라서 스프라이트가 sprite.say(“”)와 같이 말할 빈 문을 추가합니다. 이렇게 하면 이전에 표시되었던 다른 문도 삭제됩니다.
    while 1:
      fd.analysecamera()
      pen.clear()
    
      if fd.count() > 0:
        sprite.say("")  
  11. 이제 for 루프를 추가하여 카메라가 감지한 모든 얼굴에 필터를 적용합니다. 이를 위해 Python에서 range(start, stop, step) 함수를 사용합니다. 여기서 다음을 선택합니다.
    1. start = 1
    2. stop = fd.count() + 1, 마지막 항목이 반복되지 않기 때문에 ‘+ 1’을 추가하는 모든 항목을 반복하고 싶습니다.
    3. step의 기본값은 1이므로 이 매개변수를 추가할 필요가 없습니다.
      while 1:
        fd.analysecamera()
        pen.clear()
      
        if fd.count() > 0:
          sprite.say("")  
          for i in range(1, fd.count()+1):
  12. 이제 x축(dx)과 y축(dy)을 따라 두 얼굴 랜드마크인 “오른쪽 눈”과 “왼쪽 눈”의 차이를 계산하는 코드를 추가합니다. 이를 위해 x축과 y축에 각각 Landmarksx([1], [2])Landmarksy([1], [2]) 함수를 사용합니다. 이 두 함수 모두에서 매개변수 [1]은 얼굴 번호를 나타내고 매개변수 [2]는 랜드마크를 나타냅니다.
    dx = float(fd.landmarksx(i, "right eye")) - float(fd.landmarksx(i, "left eye"))
    dy = float(fd.landmarksy(i, "right eye")) - float(fd.landmarksy(i, "left eye"))

    또한 이 두 함수는 모두 문자열을 반환하므로 Landmark-2에서 Landmark-1의 위치를 빼려면 float() 함수를 사용하여 float 유형으로 변환해야 합니다.

  13. 이제 dx 및 dy를 계산했으므로 이를 사용하여 수학 라이브러리의 다음 함수를 사용하여 감지된 얼굴의 기울기 각도( Angle )를 계산할 수 있습니다.
    1. math.atan2(dx, dy) – 이 함수는 기울기 각도를 ‘라디안’ 단위로 계산합니다.
    2. math.degrees() – 이 함수는 ‘라디안’에서 계산된 각도 단위를 ‘도’로 변환합니다.
      Angle = math.degrees(math.atan2(dx, dy))
  14. 이제 각 스프라이트 기능을 사용하여 Face Filters 스프라이트의 다양한 속성을 설정합니다.
    1. setx() : 스프라이트의 x 위치를 설정합니다.
    2. sety() : 스프라이트의 y 위치를 설정합니다.
    3. setsize() : 스프라이트의 크기를 설정합니다.
    4. setdirection() : 스프라이트 각도 설정
      sprite.setx(fd.x(i))
      sprite.sety(fd.y(i))
      sprite.setsize(fd.width(i))
      sprite.setdirection(Angle)

      여기서 fd.x() , fd.y()fd.width() 함수는 감지된 얼굴의 x 위치, y 위치 및 너비를 가져옵니다.

  15. 마지막으로 펜 익스텐션의 stamp() 함수를 사용하여 최종적으로 스프라이트의 기울기를 스테이지에 구현합니다. 이제 전체 if 조건(감지된 얼굴이 0개 이상인 경우)은 다음과 같습니다.
      if fd.count() > 0:
        sprite.say("")   
        for i in range(1, fd.count()+1):
          
          dx = float(fd.landmarksx(i, "right eye")) - float(fd.landmarksx(i, "left eye"))
          dy = float(fd.landmarksy(i, "right eye")) - float(fd.landmarksy(i, "left eye"))
          Angle = math.degrees(math.atan2(dx, dy))
          sprite.setx(fd.x(i))
          sprite.sety(fd.y(i))
          sprite.setsize(fd.width(i))
          sprite.setdirection(Angle)
          
          pen.stamp()
  16. 하나의 얼굴도 감지되지 않으면 스프라이트는 “No Face Detected”이라고 말해야 합니다.
      else:
        sprite.say("No Face Detected")
  17. 전체 코드는 다음과 같습니다.
    sprite = Sprite('Face Filters')
    import math
    
    fd = FaceDetection()
    
    pen = Pen()
    
    fd.video("on")
    fd.disablebox()
    fd.setthreshold(0.4)
    
    while 1:
      fd.analysecamera()
      pen.clear()
    
      if fd.count() > 0:
        sprite.say("")   
        for i in range(1, fd.count()+1):
          
          dx = float(fd.landmarksx(i, "right eye")) - float(fd.landmarksx(i, "left eye"))
          dy = float(fd.landmarksy(i, "right eye")) - float(fd.landmarksy(i, "left eye"))
          Angle = math.degrees(math.atan2(dx, dy))
          sprite.setx(fd.x(i))
          sprite.sety(fd.y(i))
          sprite.setsize(fd.width(i))
          sprite.setdirection(Angle)
          
          pen.stamp()
    

     

코드 출력

얼굴 필터

과제

다음 수업으로 넘어가기 전에 작은 과제가 기다리고 있습니다!

이 활동에서 작성한 PictoBlox 프로그램을 웹 사이트에 업로드해야 합니다. 과정을 마친 후 수료증을 받으려면 과제를 제출해야 합니다.

과제를 업로드하려면 아래 단계를 따르세요.

  1. Browse를 클릭합니다.
  2. 저장된 프로젝트 파일(.sb3)을 검색하여 선택하고 Open을 클릭합니다.
  3. Upload를 클릭하여 과제를 제출합니다.
evive Alert
허용되는 파일 유형은 PictoBlox 프로그램에서 생성된 SB3 파일입니다. 허용되는 최대 파일 크기는 5MB입니다.

행운을 빕니다!