بار ها شده که خواستید یک پروژه پردازش تصویر انجام بدید اما بدلیل پیچیدگی زیادی که داره شاید خیلی از شما ها از انجام این کار صرف نظر کردید اما در این مقاله میخواهیم با استفاده از کتابخونه Opencv، پروژه تشخیص چهره رو انجام بدیم البته این روش هم پیچیدگیهای خاص خودش را داره اما بسیار کار را آسونتر میکنه و میشه گفت که پیچیده ترین قسمت کار نصب کتابخونه است.
شاید برای شما مفید باشد: آموزش رزبری پای از 0 تا 100 از مقدماتی تا پیشرفته
برای انجام یک پروژه تشخیص چهره با Opencv باید دو مرحله رو مدنظر داشته باشیم.
اولین مرحله، برای انجام یک پروژه با Opencv نیازه که این کتابخونه نصب شده باشه. فرایند نصب رو میتونید از اینجا مطالعه کنید.
دومین مرحله، نوشتن کد موردنظر.
سومین مرحله، آماده سازی سخت افزار های مربوطه
چهارمین مرحله، تست سخت افزارمونه
دقت کنید کدی که نوشته شده به زبان پایتونه.
هدف از انجام این پروژه راه اندازی موارد زیر است.
- اضافه کردن تصویر
- شناسایی تصویر
- استفاده از موتورهای شناسایی
فقط قبل از اینکه وارد بحث شیرین کدنویسی بشیم لازمه که دوربین RaspberryPi رو فعال سازی کنیم برای اینکار هم اینجا کلیک کنید.
خب بریم که کد بنویسیم (انصافا یکی از بهترین ساعات زندگی یه مهندس الکترونیک همین موقع است)
کدنویسی
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 | 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() این قسمت هم رویداد های گزینه هایی رو که انتخاب کردیم اجرا میکنه |
سخت افزار
حالا وقتش رسیده کدی رو که نوشتیم روی سخت افزار اجرا کنیم.
وسایلی که نیاز داریم شامل موارد زیر هستند.
منظور همون single board cumputer ها است که شامل RaspberryPi، OrangePi و … هستند.
دوربین
دوربینی که با SBC موردنظرتون بتونه ارتباط برقرار کنه.
به طور مثال اگر از RaspberryPi استفاده میکنید باید دوربینی متناسب با سخت افزار انتخاب کنید که مشکلی از لحاظ سخت افزاری پیش نیاد ( نکته بسیار پیش افتاده ایه اما مهمه).
تغذیه SBC موردنظر
نمایشگر (میتونه PC شما به عنوان نمایشگر استفاده شه یا اینکه یک LCD متناسب با SBC رو به صورت مستقیم میتونید استفاده کنید.)
عملکرد پروژه
یکی از بهترین لحظههایی که میتونه برای یک مهندس الکترونیک رقم بخوره زمانیه که پروژه اش جواب بده و الانم دقیقا میخوایم ببینیم که پروژهمون جواب میده یا نه؟
اگه فرایند رو به درستی انجام داده باشیم باید قاعدتا پروژه جواب بده و خروجی هم باید به شکل زیر باشه.
خسته نباشید اینم از یک پروژه پردازش تصویر که میتونه خیلی جاها کاربردی باشه و مورد استفاده قرار بگیره.
حالا چندتا از پروژه های کاربردی که میشه فقط با این آموزش انجام داد شامل موارد زیر میشه.
- ساخت درباز کن تصویری
- ساخت دوربین مداربسته
- ساخت دستگاه شناسایی مجرمین
- ساخت دستگاه حضور و غیاب تصویری
- ساخت دستگاه ردیابی اشخاص و …
البته اینم بگم پروژه هایی که گفتیم صرفا پردازش تصویر نیست بلکه در کنارش نیاز به طراحی سخت افزار و اتصال به سرور و … داره که دقیقا باید بسته به نوع پروژه هر کدوم که نیاز بود رو راه اندازی کنید تا به جواب مطلوب برسید.
با سیسوگ همراه باشید.
سلام ببخشید ماژول face_recognition_system رو با چه اسمی توی cmd نصب کنم
سلام فکر میکنم لینک زیر بتونه کمکتون کنه
سلام برای اینکه حضور وغیاب ثبت بشه باید به یک لب تاب وصل باشه یا کدی برای ارسال داده هست؟
لطفا بیشتر راهنمایی کنید.متشکرم
سلام غالبا یک سیستم عامل سبک مثل لینوکس روی سخت افزار نصب میکنید و برای همه این روالها کد مناسب میزنید
سلام وقت بخیر .قطعات مورد نیاز برای پروژه حضوروغیاب تصویری چی هست؟
سلام
احتمالا یه برد رزبری پای + یک دوربین (میتونه وبکم هم باشه) و شاید اگه بخواید چیزی رو نمایش بدید یه lcd 🙂
برای شروع خوبه ولی امنیت و دقت این پروژه ساده در عمل چقدر هست؟؟ ایا میشه واقعا باهاش در باز کن تصویری ساخت؟
سلام دوست عزیز
حرف شما درسته کاملا برای شروع مناسب است اما صرفا برای شروع نیست بلکه شما با رعایت یک سری آپشن های دیگر قادر خواهید بود که این کار را انجام دهید. و بسیار قدرتمند هم عمل میکند.
در سری های بعدی این آموزش، قدرت این کتابخانه را به همراه تلفیقی از کتابخانه های دیگر خواهید دید که با چه دقت و سرعتی عمل خواهد کرد.
موفق باشید.
مثل همیشه عالی خداقوت
ممنون دوست عزیز ان شالله در آموزش های بعدی پروژه های کاربردی که تلفیقی از هوش مصنوعی است را آموزش خواهیم داد.