خبر و ترفند روز

خبر و ترفند های روز را اینجا بخوانید!

نحوه محو کردن چهره انسان در زمان واقعی با پایتون

دنیای بینایی کامپیوتر را کاوش کنید و با یک ویژگی امنیتی محبوب آزمایش کنید: تار شدن بخشی از یک تصویر.

به دلایل مختلفی می‌توانید از تاری چهره برای پنهان کردن چهره یک فرد، در یک ویدیو یا یک تصویر استفاده کنید. مسائل مربوط به حریم خصوصی و امنیتی غالب ترین آنها هستند. اکثر پلتفرم‌های اشتراک‌گذاری ویدیو و نرم‌افزارهای ویرایش ویدیو دارای قابلیت محو کردن چهره هستند.

شما می توانید برنامه محو کردن چهره خود را از ابتدا با استفاده از پایتون و کتابخانه های OpenCV و NumPy ایجاد کنید.

تنظیم محیط

برای ادامه این مقاله، باید با اصول پایتون آشنا باشید و درک اولیه ای از استفاده از کتابخانه NumPy داشته باشید.

هر IDE پایتونی که با آن راحت هستید را باز کنید. یک محیط مجازی ایجاد کنید که در آن کتابخانه های مورد نیاز را نصب کنید. یک فایل پایتون جدید ایجاد کنید. به ترمینال بروید و دستور زیر را برای نصب کتابخانه های مورد نیاز اجرا کنید. کتابخانه‌ها را به‌عنوان فهرستی با فاصله محدود ارسال کنید.

pip install OpenCV-python NumPy

از OpenCV برای گرفتن و پیش پردازش ورودی ویدیو و NumPy برای کار با آرایه ها استفاده خواهید کرد.

نصب کتابخانه ها در ترمینال IDE

پس از نصب کتابخانه ها، منتظر بمانید تا IDE اسکلت های پروژه را به روز کند. وقتی به‌روزرسانی کامل شد و محیط آماده شد، می‌توانید شروع به کدنویسی کنید.

کد منبع کامل در یک مخزن GitHub موجود است.

واردات کتابخانه های مورد نیاز

با وارد کردن کتابخانه های OpenCV و NumPy شروع کنید. این به شما امکان می دهد تا با هر عملکردی که آنها پشتیبانی می کنند تماس بگیرید و از آنها استفاده کنید. OpenCV-python را به عنوان cv2 وارد کنید.

import cv2
import numpy as np

ماژول های OpenCV-python از نام cv2 به عنوان قراردادی استفاده می کنند که جامعه OpenCV ایجاد کرده است. OpenCV-python یک پوشش پایتون از کتابخانه OpenCV است که به زبان C++ نوشته شده است.

مطلب مرتبط:   8 مخزن GitHub که اکنون باید ستاره دار شوید!

گرفتن ورودی شما

یک متغیر ایجاد کنید و شی VideoCapture را Initialize کنید. اگر می خواهید از دوربین اصلی رایانه خود به عنوان منبع ورودی استفاده کنید، صفر را به عنوان آرگومان عبور دهید. برای استفاده از دوربین خارجی متصل به رایانه، یکی را پاس کنید. برای انجام محو کردن چهره در یک ویدیوی از پیش ضبط شده، به جای آن از مسیر ویدیو عبور کنید. برای استفاده از دوربین راه دور، URL دوربین حاوی آدرس IP و شماره پورت آن را ارسال کنید.

cap = cv2.VideoCapture(0)

برای انجام محو کردن چهره در ورودی، به سه عملکرد نیاز دارید:

  • تابعی که ورودی را از قبل پردازش می کند.
  • عملکردی که چهره را در ورودی محو می کند.
  • یک تابع اصلی که جریان برنامه را کنترل می کند و خروجی را نمایش می دهد.

در حال پیش پردازش ورودی ویدیو

یک تابع پیش پردازش ورودی ایجاد کنید که هر فریم از ویدیوی ورودی را به عنوان ورودی خود می گیرد. کلاس CascadeClassifier را که برای تشخیص چهره استفاده می کنید، راه اندازی کنید. اندازه فریم را به 640 در 640 پیکسل تغییر دهید. برای پردازش آسان‌تر، قاب را به مقیاس خاکستری تبدیل کنید و در نهایت چهره‌های ورودی را شناسایی کرده و آنها را با مستطیل متصل کنید.

def image_preprocess(frame):
    face_detector = cv2.CascadeClassifier(cv2.data.haarcascades
        + 'haarcascade_frontalface_default.xml')

    resized_image = cv2.resize(frame, (640, 640))

    gray_image = cv2.cvtColor(resized_image,
        cv2.COLOR_BGR2GRAY)

    face_rects = face_detector.detectMultiScale(
        gray_image, 1.04, 5, minSize=(20, 20))

    return resized_image, face_rects

این تابع یک تاپل حاوی تصویر تغییر اندازه و لیستی از مستطیل ها را برمی گرداند که نمایانگر چهره های شناسایی شده است.

مطلب مرتبط:   یک CRUD REST API با نماهای کلاس محور در چارچوب Django REST بسازید

تار شدن صورت

یک تابع تاری ایجاد کنید که چهره‌های ورودی شما را محو کند. این تابع، قاب تغییر اندازه و لیست مستطیل های محدود کننده وجه ها را که توسط تابع پیش پردازش برگردانده شده اند، به عنوان ورودی می گیرد. حلقه ها روی هر مستطیل صورت. مرکز هر مستطیل و شعاع دایره تار را محاسبه می کند. با مقداردهی اولیه همه پیکسل ها به صفر، یک تصویر سیاه با ابعاد یکسان با قاب تغییر اندازه ایجاد می کند. با استفاده از شعاع محاسبه شده یک دایره سفید روی تصویر سیاه که مرکز آن در مستطیل صورت است رسم می کند. در نهایت تصویر روی دایره سفید را محو می کند.

def face_blur(resized_frame, face_rects):
    for (x, y, w, h) in face_rects:
        # Specifying the center and radius
        # of the blurring circle
        center_x = x + w // 3
        center_y = y + h // 3
        radius = h // 1

        # creating a black image having similar
        # dimensions as the frame
        mask = np.zeros((resized_frame.shape[:3]), np.uint8)

        # draw a white circle in the face region of the frame
        cv2.circle(mask, (center_x, center_y), radius,
                   (255, 255, 255), -1)

        # blurring the whole frame
        blurred_image = cv2.medianBlur(resized_frame, 99)

        # reconstructing the frame:
        # - the pixels from the blurred frame if mask > 0
        # - otherwise, take the pixels from the original frame
        resized_frame = np.where(mask > 0, blurred_image,
                                 resized_frame)

    return resized_frame

این تابع از تابع NumPy where() برای بازسازی قاب در حین محو کردن استفاده می کند.

کنترل جریان برنامه شما

یک تابع اصلی ایجاد کنید که به عنوان نقطه ورود برنامه شما عمل می کند. سپس جریان برنامه را کنترل می کند. این تابع یک حلقه بی نهایت را برای گرفتن مداوم فریم های ورودی ویدیو شروع می کند. برای خواندن یک فریم از دوربین، روش خواندن شی cap را فراخوانی کنید.

مطلب مرتبط:   نحوه اضافه کردن متا تگ در Nuxt.js

سپس این تابع فریم را به تابع پیش پردازش می دهد و مقادیر بازگشتی را به تابع دیگری، face_blur می دهد تا تصویری تار به دست آید. سپس اندازه فریم برگردانده شده توسط تابع تاری را تغییر می دهد و خروجی را نمایش می دهد.

def main():
    while True:
        success, frame = cap.read()
        resized_input, face_rects = image_preprocess(frame)
        blurred_image = face_blur(resized_input, face_rects)

        # Diplaying the blurred image
        cv2.imshow("Blurred image", cv2.resize(blurred_image, (500, 500)))

        if cv2.waitKey(1) == ord("q"):
            break

این عملکرد همچنین هنگامی که کاربر کلید q را فشار می دهد، نمایش خروجی را خاتمه می دهد.

اجرای برنامه

هنگام اجرای اسکریپت مطمئن شوید که تابع اصلی ابتدا اجرا می شود. اگر اسکریپت را به عنوان یک ماژول در برنامه دیگری وارد کنید، این شرط نادرست خواهد بود.

if __name__ == "__main__":
    main()

این به شما امکان می دهد از اسکریپت به عنوان یک ماژول استفاده کنید یا آن را به عنوان یک برنامه مستقل اجرا کنید. هنگامی که برنامه اجرا می شود، باید خروجی مشابه این را ببینید:

خروجی یک برنامه در یک IDE با صورت تار

صورت تار و غیر قابل تشخیص است.

کاربردهای تاری چهره در دنیای واقعی

برای محافظت از حریم خصوصی افراد، می‌توانید تاری چهره را در انواع مختلفی از برنامه‌ها اعمال کنید. خدمات نمای خیابان و نقشه برداری از تاری برای محو کردن چهره افراد در تصاویری که می گیرند استفاده می کنند. مجری قانون از تاری چهره برای محافظت از هویت شاهدان استفاده می کند.

بسیاری از پلتفرم‌های اشتراک‌گذاری ویدیو نیز ویژگی محو کردن چهره را برای کاربران خود ادغام کرده‌اند. مقایسه استفاده از تاری چهره در این مناطق به شما کمک می کند تا مشاهده کنید که پلتفرم های دیگر چگونه این فناوری را ادغام می کنند.