مقدمه
بارها شده که خواستید یک پروژه پردازش تصویر انجامبدید اما بهدلیل پیچیدگی زیادی که داره شاید خیلیاز شماها از انجام این کار صرفنظر کردید اما در این مقاله میخواهیم بااستفادهاز کتابخونه Opencv، پروژه تشخیص چهره رو انجامبدیم البته این روش هم پیچیدگیهای خاص خودش را داره اما بسیار کار را آسونتر میکنه و میشه گفت که پیچیدهترین قسمت کار نصب کتابخونه است. برای انجام یک پروژه تشخیص چهره با Opencv باید دومرحله رو مدنظر داشتهباشیم. اولین مرحله، برای انجام یک پروژه با Opencv نیازه که این کتابخونه نصبشدهباشه. فرایند نصب رو میتونید از اینجا مطالعهکنید. دومین مرحله، نوشتن کد موردنظر. سومین مرحله، آمادهسازی سختافزارهای مربوطه چهارمین مرحله، تست سختافزارمونه دقتکنید کدی که نوشتهشده به زبان پایتونه. هدف از انجام این پروژه راهاندازی مواردزیر است:
- اضافهکردن تصویر
- شناسایی تصویر
- استفادهاز موتورهای شناسایی
فقط قبلاز اینکه وارد بحث شیرین کدنویسی بشیم لازمه که دوربین RaspberryPi رو فعالسازی کنیم برای اینکار هم اینجا کلیک کنید. خب بریم که کد بنویسیم(انصافا یکیاز بهترین ساعات زندگی یه مهندس الکترونیک همینموقع است)
کدنویسی
import sys import os جهت دسترسی به دستورات لینوکس در محیط ادیتور پایتون است import numpy as np from face_recognition_system.videocamera import VideoCamera from face_recognition_system.detectors import FaceDetector import face_recognition_system.operations as op import cv2 from cv2 import __version__ اضافه کردن کتابخانه های مورد نیاز که مستلزم نصب کتابخانه پردازش تصویراست def get_images(frame, faces_coord, shape): """ Perfrom transformation on original and face images. This function draws the countour around the found face given by faces_coord and also cuts the face from the original image. Returns both images. """ if shape == "rectangle": faces_img = op.cut_face_rectangle(frame, faces_coord) frame = op.draw_face_rectangle(frame, faces_coord) faces_img = op.normalize_intensity(faces_img) faces_img = op.resize(faces_img) return (frame, faces_img) این تابع کار دریافت اطلاعات تصویر و در نهایت دریافت خود تصویر راانجام میدهد. def add_person(people_folder, shape): """ Funtion to add pictures of a person """ person_name = input('What is the name of the new person: ').lower() folder = people_folder + person_name if not os.path.exists(folder): input("I will now take 20 pictures. Press ENTER when ready.") os.mkdir(folder) video = VideoCamera() detector = FaceDetector('face_recognition_system/frontal_face.xml') counter = 1 timer = 0 cv2.namedWindow('Video Feed', cv2.WINDOW_AUTOSIZE) cv2.namedWindow('Saved Face', cv2.WINDOW_NORMAL) while counter < 21: frame = video.get_frame() face_coord = detector.detect(frame) if len(face_coord): frame, face_img = get_images(frame, face_coord, shape) # save a face every second, we start from an offset '5' because # the first frame of the camera gets very high intensity # readings. if timer % 100 == 5: cv2.imwrite(folder + '/' + str(counter) + '.jpg', face_img[0]) print ('Images Saved:' + str(counter)) counter += 1 cv2.imshow('Saved Face', face_img[0]) cv2.imshow('Video Feed', frame) cv2.waitKey(50) timer += 5 else: print ("This name already exists.") sys.exit() این تابع کاراضافه کردن تصویر راانجام میدهد و نحوه عملکردآن اینگونه است که اگر برای اولین باراین کارراانجام میدهید ایتدا یک اسم شخص و سپس 20 عکس از زوایای مختلف از شما میگیرد و در مرحله بعد عکس به صورت خودکار به ادرس فولدری که در سیستم عامل تعیین کردیم ذخیره میشود. def recognize_people(people_folder, shape): """ Start recognizing people in a live stream with your webcam """ try: people = [person for person in os.listdir(people_folder)] except: print ("Have you added at least one person to the system?") sys.exit() print ("This are the people in the Recognition System:") for person in people: print ("-" + person) این تابع کار شناسایی تصویر رااز ادرس فولدری که تصاویر را درآن ذخیره کردیم برعهده دارد. print (30 * '-') print (" POSSIBLE RECOGNIZERS TO USE") print (30 * '-') print ("1. EigenFaces") print ("2. FisherFaces") print ("3. LBPHFaces") print (30 * '-') این قسمت استفاده از موتور های شناسایی است که همگی در همین کتابخانه است و انتخاب هر کدام از موتور ها به صورت کاملا دلخواه است واینم بگم که هر کدوم کاربرد خاص خودشون رو دارند (برای این پروژه از هر کدوم استفاده کردید خیلی فرقی نداره، هدف طرز استفاده و آشنایی با این موتور ها بوده) choice = check_choice() # detecting saved imgs detector = FaceDetector('face_recognition_system/frontal_face.xml') if choice == 1: recognizer = cv2.face.createEigenFaceRecognizer()) threshold = 4000 elif choice == 2: recognizer = cv2.face.createFisherFaceRecognizer() threshold = 300 elif choice == 3: recognizer = cv2.face.createLBPHFaceRecognizer() threshold = 80 images = [] labels = [] labels_people = {} for i, person in enumerate(people): labels_people[i] = person for image in os.listdir(people_folder + person): images.append(cv2.imread(people_folder + person + '/' + image, 0)) labels.append(i) try: recognizer.train(images, np.array(labels)) except: print ("\nOpenCV Error: Do you have at least two people in the database?\n") sys.exit() video = VideoCamera() پس از اینکه موتور شناسایی را انتخاب کردیم دوربین برای شناسایی تصویر فعال میشود while True: frame = video.get_frame() faces_coord = detector.detect(frame, False) if len(faces_coord): frame, faces_img = get_images(frame, faces_coord, shape) for i, face_img in enumerate(faces_img): if __version__ == "3.1.0": collector = cv2.face.MinDistancePredictCollector() recognizer.predict(face_img, collector) conf = collector.getDist() pred = collector.getLabel() else: pred, conf = recognizer.predict(face_img) print ("Prediction: " + str(pred)) print ('Confidence: ' + str(round(conf))) print ('Threshold: ' + str(threshold)) if conf < threshold: cv2.putText(frame, labels_people[pred].capitalize(), (faces_coord[i][0], faces_coord[i][1] - 2), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 1, cv2.LINE_AA) else: cv2.putText(frame, "Unknown", (faces_coord[i][0], faces_coord[i][1]), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 1, cv2.LINE_AA) cv2.putText(frame, "ESC to exit", (5, frame.shape[0] - 5), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255, 255), 1, cv2.LINE_AA) cv2.imshow('Video', frame) if cv2.waitKey(100) & 0xFF == 27: sys.exit() در این قسمت هم فریم ویدیو مورد برسی قرار میگیرد و در نهایت پس از اتمام کار خارج میگردد def check_choice(): """ Check if choice is good """ is_valid = 0 while not is_valid: try: choice = int(input('Enter your choice [1-3] : ')) if choice in [1, 2, 3]: is_valid = 1 else: print ("'%d' is not an option.\n" % choice) except ValueError: print ("%s is not an option.\n" % str(error).split(": ")[1]) return choice این قسمت دقیقا مثل یک منو عمل میکنه که کاربر میتونه گزینه مورد نظر خودش روانتخاب کنه. if __name__ == '__main__': print (30 * '-') print (" POSSIBLE ACTIONS") print (30 * '-') print ("1. Add person to the recognizer system") print ("2. Start recognizer") print ("3. Exit") print (30 * '-') CHOICE = check_choice() PEOPLE_FOLDER = "face_recognition_system/people/" SHAPE = "rectangle" if CHOICE == 1: if not os.path.exists(PEOPLE_FOLDER): os.makedirs(PEOPLE_FOLDER) add_person(PEOPLE_FOLDER, SHAPE) elif CHOICE == 2: os.system("sudo modprobe bcm2835-v4l2") # Required for Raspi-Camera Module recognize_people(PEOPLE_FOLDER, SHAPE) elif CHOICE == 3: sys.exit() این قسمت هم رویداد های گزینه هایی رو که انتخاب کردیم اجرا میکنه
سخت افزار
حالا وقتش رسیده کدی رو که نوشتیم روی سختافزار اجراکنیم. وسایلی که نیازداریم شامل مواردزیر هستند. SBC منظور همون single board cumputerها است که شامل RaspberryPi، OrangePi و… هستند. دوربین دوربینی که با SBC موردنظرتون بتونه ارتباط برقرارکنه. بهطورمثال اگر از RaspberryPi استفاده میکنید باید دوربینی متناسب با سختافزار انتخابکنید که مشکلی ازلحاظ سختافزاری پیشنیاد(نکته بسیار پیشافتادهایه اما مهمه). تغذیه SBC موردنظر نمایشگر (میتونه PC شما بهعنوان نمایشگر استفادهشه یا اینکه یک LCD متناسب با SBC رو بهصورت مستقیم میتونید استفادهکنید.)
عملکرد پروژه
یکیاز بهترین لحظههایی که میتونه برای یک مهندس الکترونیک رقم بخوره زمانیه که پروژهاش جواببده و الانم دقیقا میخوایم ببینیم که پروژهمون جوابمیده یانه؟ اگه فرایند رو بهدرستی انجامدادهباشیم باید قاعدتا پروژه جواببده و خروجی هم باید بهشکلزیر باشه.
خستهنباشید اینم از یک پروژه پردازش تصویر که میتونه خیلیجاها کاربردی باشه و مورداستفاده قراربگیره. حالا چندتا از پروژههای کاربردی که میشه فقط با این آموزش انجامداد شامل مواردزیر میشه.
- ساخت دربازکن تصویری
- ساخت دوربین مداربسته
- ساخت دستگاه شناسایی مجرمین
- ساخت دستگاه حضوروغیاب تصویری
- ساخت دستگاه ردیابی اشخاص و…
البته اینم بگم پروژههایی که گفتیم صرفا پردازش تصویر نیست بلکه در کنارش نیازبه طراحی سختافزار و اتصالبه سرور و… داره که دقیقا باید بستهبه نوع پروژه هرکدوم که نیاز بود رو راهاندازی کنید تا به جواب مطلوب برسید. با ما همراه باشید.
منبع: سیسوگ