Pencegahan adalah segalanya bagi kita. Perlindungan yang kompeten terhadap kebocoran data akan membantu mencegah konsekuensi negatif yang dapat menyebabkan kerugian jutaan dolar. Di dunia modern, setiap organisasi memproses dan menyimpan informasi rahasia. Jika menyangkut organisasi besar, volume informasi rahasia sangat besar. Keadaan "keamanan" komputer adalah ideal konseptual yang dicapai ketika setiap pengguna mengamati semua aturan keamanan informasi.
Saat berada di kantor, setiap karyawan dari waktu ke waktu meninggalkan komputernya, dan kemudian komputer yang dihidupkan tidak dijaga, seringkali dengan file dan folder terbuka untuk diakses, karena banyak karyawan lupa mengunci PC mereka, atau mereka tidak melakukannya dengan sengaja, dipandu oleh frasa serupa - "Saya mundur lima meter, mengapa memblokirnya!?" Sayangnya, karyawan lain yang tertarik dengan materi tersebut dapat memanfaatkan momen seperti itu.
Bagaimana Anda bisa memastikan keamanan data dalam situasi seperti itu? Salah satu caranya adalah dengan menggunakan teknologi otentikasi biometrik yang memungkinkan pengenalan pengguna dari wajah mereka.
Pengenalan wajah bukanlah konsep baru, dan saat ini ada banyak alat untuk menyelesaikan tugas ini. Jika Anda tidak terlalu ahli dalam metode dan alat untuk pengenalan wajah, maka menggunakan perpustakaan visi komputer sumber terbuka (perpustakaan visi komputer sumber terbuka) dan bahasa pemrograman Python akan menjadi solusi yang sangat baik yang akan memungkinkan Anda untuk mencapai tujuan Anda secepat mungkin.
Kami telah memutuskan perangkat lunaknya, kami membutuhkan satu perangkat keras lagi - kamera web. Bagaimana Anda menyiapkan pengenalan wajah sekarang? Pertama, Anda perlu mendeteksi wajah dalam bingkai. Salah satu metode untuk mendeteksi wajah adalah metode Viola-Jones, yang sudah dijelaskan pada tahun 2001. Karena kami lebih tertarik pada praktik, kami tidak akan membahas detail teoretis, kami hanya akan menyebutkan bahwa metode ini didasarkan pada prinsip-prinsip dasar seperti transformasi gambar menjadi representasi integral, metode jendela pemindaian, dan penggunaan fitur Haar. Anda dapat membaca deskripsi metode dan melihat informasi tentang menginstal OpenCV di situs resmi . Di bawah ini adalah kode Python yang memungkinkan kita mendeteksi wajah dari streaming video webcam:
import cv2 as cv
import numpy as np
face_cascade = 'haarcascade_frontalface_default.xml'
cam = 1
classifier = cv.CascadeClassifier(face_cascade)
video_stream = cv.VideoCapture(cam)
while True:
retval, frame = video_stream.read()
gray_frame = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
found_faces = classifier.detectMultiScale(gray_frame, 1.2, 5, minSize=(197, 197))
for x, y, w, h in found_faces:
cv.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
cv.namedWindow('Stream', cv.WINDOW_NORMAL)
cv.imshow('Stream', frame)
k = cv.waitKey(30) & 0xFF
if k == 27:
break
video_stream.release()
cv.destroyAllWindows()
Pada kode di atas, pertama-tama kita mengimpor dua modul yang diperlukan untuk bekerja: cv2 (computer vision) dan numpy (bekerja dengan matriks). Dalam variabel face_cascade, simpan jalur ke file xml dengan Haar cascades. File ini, serta lainnya, misalnya untuk deteksi mata, dapat ditemukan di halaman github.
Di variabel cam kita tuliskan nomor web camera, jika ada beberapa yang terhubung maka jumlah kamera yang terhubung secara default adalah 0. Selanjutnya dibuat objek classifier dengan menggunakan metode CascadeClassifier dan koneksi ke kamera adalah cv.VideoCapture (cam). Kemudian, dalam satu lingkaran, kita membaca gambar bingkai demi bingkai ke dalam variabel bingkai menggunakan metode read (). Pengklasifikasi memproses gambar dalam skala abu-abu, oleh karena itu, dengan menggunakan metode cvtColor, kami mengubah gambar menjadi bentuk yang diinginkan. Metode detectMultiScale mengembalikan daftar dengan parameter semua wajah yang terdeteksi, yaitu persegi panjang - koordinat puncak (x, y) dan lebar dan tinggi persegi panjang (w, h). Baris berikut bersifat opsional agar program dapat bekerja, tetapi berguna untuk debugging - metode persegi panjang menambahkan bingkai ke bingkai sumber di lokasi wajah yang terdeteksi, dan imshow - menampilkan jendela dengan aliran video.
Semuanya cukup sederhana di sini, tetapi lebih menarik lagi. Sekarang kita perlu mengenali wajahnya. Bagaimana cara melakukannya? OpenCV memuat beberapa metode pengenalan wajah, di antaranya adalah metode LBPH (Local Binary Patterns Histograms). Di sini kita akan membahas lebih detail dan memahami sedikit cara kerjanya.
Secara umum, nilai kecerahan piksel gambar dan delapan piksel lagi yang mengelilingi aslinya diambil. Ternyata tabel 3x3 dengan nilai kecerahan piksel. Kemudian 0 atau 1 ditulis ke tabel yang sama.Jika nilai kecerahan piksel terluar melebihi nilai kecerahan piksel pusat, 1 diatur, jika tidak - 0. Kemudian kode yang dihasilkan dibaca searah jarum jam dari sel kiri atas, diubah menjadi angka desimal, dan angka ini ditulis ke dalam matriks berukuran gambar pada posisi yang sesuai. Dan untuk setiap piksel.
Matriks dibagi menjadi sejumlah segmen tertentu (secara default, ini adalah kisi 8 × 8), histogram dibuat untuk setiap segmen, dan pada akhirnya, dengan menggabungkan histogram, diperoleh hasil yang mencirikan seluruh gambar. Selama pengenalan, histogram yang sama dibuat untuk gambar yang dipelajari, yang kemudian dibandingkan dengan data pelatihan.
Kami akan menggunakan metode khusus ini, tetapi pertama-tama Anda perlu melakukan langkah penting lainnya - buat basis dengan wajah. Secara umum struktur database terlihat seperti ini:
--Storage\\
--Person_1\\
--img_1.jpg
--img_2.jpg
…
--img_n.jpg
…
--Person_m\\
--img_1.jpg
--img_2.jpg
…
--img_n.jpg
Oke, kami memiliki basis dengan gambar wajah. Sekarang Anda perlu memproses basis untuk melatih atau melatih algoritme. Prosesnya bermuara pada menghasilkan daftar semua gambar dan daftar id atau tag untuk setiap orang. Kode paling sederhana untuk tindakan ini mungkin terlihat seperti ini:
storage = 'storage'
images = []
labels = []
names = {}
id = 0
for subdir in os.scandir(storage):
names[id] = subdir.name
subdir_path = os.path.join(storage, subdir.name)
for file in os.scandir(subdir_path):
if file.name.split('.')[-1].lower() not in ['png', 'bmp', 'jpeg', 'gif']:
continue
file_path = os.path.join(subdir_path, file.name)
image = cv.imread(file_path, 0)
label = id
images.append(image)
labels.append(label)
id += 1
Di sini juga, semuanya cukup sederhana. Variabel penyimpanan menyimpan jalur ke folder yang berisi folder dengan gambar wajah individu, lalu daftar gambar, daftar label, dan kamus dengan nama. Cara kerjanya: semua gambar dari folder orang tertentu ditambahkan ke daftar gambar, misalnya ada 15.Jika ini folder pertama dari penyimpanan, maka labelnya akan sama dengan 0, jadi, 0 sebanyak 15 kali ditambahkan ke daftar label, pada saat yang bersamaan Dalam kamus nama, catatan dibuat dengan kuncinya adalah label, dan nilainya adalah nama orang (nama folder dengan gambar orang tertentu). Dan untuk seluruh penyimpanan. Pada kode di atas, perhatikan baris dengan metode imread - di sini gambar dibaca dan direpresentasikan sebagai matriks kecerahan piksel, dan ditulis ke variabel gambar.
Sekarang bagian yang menyenangkan adalah melatih algoritma:
recognizer = cv.face.LBPHFaceRecognizer_create(1, 8, 8, 8, 130)
recognizer.train(images, np.array(labels))
Di baris pertama kode, kami menginisialisasi algoritme menggunakan metode LBPHFaceRecognizer_create. Masih ingat dengan deskripsi algoritma LBPH? Parameter dari fungsi yang disebutkan hanya berisi apa yang kita bicarakan: jari-jari di sepanjang perbatasan piksel yang akan diambil di sekitar yang diinginkan, jumlah piksel dari "lingkaran" yang dibentuk oleh jari-jari, jumlah segmen secara horizontal dan vertikal, dan ambang batas yang memengaruhi keputusan pengenalan orang, yaitu, semakin ketat persyaratannya, semakin rendah ambang batasnya. Selanjutnya, kami memanggil metode kereta untuk pelatihan, meneruskan daftar gambar dan label sebagai argumen. Sekarang algoritme telah menghafal wajah dari database dan akan dapat mengenalinya. Masalahnya kecil, tinggal menambahkan beberapa baris ke potongan kode pertama dalam loop (untuk x, y, w, h di found_faces): setelah mendeteksi wajah, kita perlu mengenalinya, dan jika wajah tidak dikenali,atau orang lain dikenali, lalu segera kunci komputer!
roi = gray_frame[y:y+h, x:x+w]
name, dist = recognizer.predict(roi)
cv.putText(frame, '%s - %.0f' % (names[name], dist), (x, y), cv.FONT_HERSHEY_DUPLEX, 1, (0, 255, 0), 3)
if names[name] != "Ivan Petrov":
ctypes.windll.user32.LockWorkStation()
Di baris pertama, roi (dari wilayah minat) adalah variabel tempat kami menulis fragmen gambar yang berisi wajah yang terdeteksi. Baris berikutnya langsung mengenali wajah saat memanggil metode prediksi. Metode ini mengembalikan label yang sesuai dengan wajah yang dikenali dan nilai yang mencirikan tingkat perbedaan antara wajah yang terdeteksi dan wajah yang dikenali (semakin kecil, semakin tinggi tingkat keyakinan bahwa wajah yang benar dikenali). Selanjutnya, sekali lagi untuk tujuan debugging, tambahkan teks ke frame dengan nama orang yang dikenali menggunakan metode putText. Dan akhirnya, kami memeriksa kondisi paling sederhana: jika bukan pemilik PC dikenali (di sinilah dibutuhkan kamus dengan nama), maka kunci komputer. Baris ctypes.windll.user32.LockWorkStation () bertanggung jawab untuk memblokir, seperti yang Anda lihat. Untuk membuatnya berhasilperlu mengimpor modul ctypes selain cv2 dan numpy.
Akibatnya, PC diblokir segera setelah wajah orang lain dikenali, atau pada prinsipnya tidak dikenali. Setelah membuka kunci PC, program terus berjalan. Anda juga dapat menambahkan kunci PC jika ada karyawan yang meninggalkan tempat kerjanya. Anda tidak perlu berpikir panjang untuk memahami bahwa ada cukup banyak nuansa di sini. Misalnya, bagaimana jika wajah lain dikenali di latar belakang? Dalam situasi ini, Anda dapat menyetel ukuran minimum objek yang terlihat seperti wajah, kemudian wajah di latar belakang akan diabaikan (untuk ini, ada parameter minSize dalam metode detectMultiScale). Dalam situasi lain, solusi yang baik juga dapat ditemukan jika diinginkan.
Salah satu faktor terpenting agar pemblokiran berfungsi dengan benar adalah kualitas gambar dalam database foto. Pertama, diharapkan ada banyak dari mereka untuk orang tertentu, dengan sudut dan ekspresi wajah yang berbeda. Kedua, pencahayaan membuat penyesuaiannya sendiri, jadi penting untuk mempertimbangkan hal ini dan menggunakan gambar yang diambil dalam kondisi pencahayaan berbeda. Dan ketiga, Anda harus merekam gambar dari webcam yang ada di tempat kerja karyawan; ada juga metode untuk menyimpan gambar di OpenCV. Adapun kode, kemungkinan besar akan diperluas, fungsionalitas tambahan akan ditambahkan, sehingga dapat "digabungkan" dalam fungsi, menggunakan kelas. Tidak ada batasan untuk kesempurnaan! Hal utama adalah mengingat urutan tindakan program: memproses database dengan foto, pelatihan, deteksi, pengenalan.
Pada webinar 03.09.2020 10-00 waktu Moskow, pembicara akan mempresentasikan metode praktis untuk melatih jaringan saraf guna mendeteksi objek dengan kode sumber dan teknologi yang digunakan, dan juga akan menjawab pertanyaan Anda. Anda dapat mendaftar di tautan: newtechaudit.ru/vebinar-computer-vision
