JavaScript ve React ile yüz tanıma
JavaScript yüz tanıma “Yüz Algılama” ve “Yüz Tanıma” günümüzde birçok araştırmacının ve büyük, orta ve küçük ölçekli işletmelerin ilgisini çeken önemli ve sıcak konulardır. Bu yazıda “React” ve “face-api.js” kullanılarak yüz tanıma yöntemi incelenmiştir. JavaScript ve React ile yapılan yüz tanıma yazısında, muhtemelen insan gözüyle bile tanınması zor olan yüz tanıma görevini gerçekleştirmek için bir müzik grubunun üyelerinin görselleri kullanılıyor.
Devamında JavaScript ve React ile yüz tanıma konusu incelenmektedir. “face-api.js”, “TensorFlow.js” ile çalışan yüz algılama ve yüz tanıma için bir “Uygulama Programlama Arayüzü”dür (Uygulama Programlama Arayüzü) . Artık bu API kullanılarak tüm “Derin Öğrenme” işlemlerini arka uç koduna ihtiyaç duymadan tarayıcı üzerinde yapmak mümkün .
Artık herhangi bir arka uç kodu veya ortam yapılandırması olmadan, yalnızca statik bir web sunucusuna sahip olarak, React ve TensorFlow ile yüz tanımaya sahip olmak ve bunu herhangi bir cihaz veya tarayıcıda çalıştırmak mümkündür. Tabii ki, tarayıcı TensorFlow.js’yi çalıştırabilmelidir. Bu makalenin sonunda, bu React uygulamasının GitHub sayfasında nasıl dağıtılacağı öğretildi.
Daha önce bahsedildiği gibi, burada React ve ace-api.js yüz tanıma kitaplığı kullanılarak tek sayfalık bir yüz tanıma uygulamasının uygulanması yer almaktadır. Bu API, önceden eğitilmiş bir yüz tanıma sistemiyle Yüz İşaretlerini ve Yüz Hizalamasını algılar. Bu nedenle, TensorFlow’da derin bir öğrenme modeli yazmaya gerek yoktur .
Aslında, kullanıcının derin öğrenmeye veya Konvolüsyonel Sinir Ağlarına gerçekten aşina olması gerekmez . Kullanıcının bilmesi gereken tek şey JavaScript ve React’in temel kavramlarıdır. JavaScript öğrenmek için ” JavaScript Eğitimi – Kapsamlı bir Faradar blog makaleleri koleksiyonu ” makalesini okumanız önerilir . Ayrıca React’i öğrenmek için aşağıdaki içeriği okumanız önerilir.
- React : kapsamlı bir başlangıç kılavuzu
- Tepki eğitimi : Faradars dergisi makalelerinden oluşan bir koleksiyon
Bu makalede uygulanan kod çok basittir ve öğrenme konusunda endişelenmenize gerek yoktur. Ayrıca kodun farklı bölümleri hakkında gerekli açıklamalar eksiksiz olarak yapılmıştır.
Yüz tanımanın kısa bir açıklaması
JavaScript ve React ile yüz tanımanın bu bölümünde, yüz tanıma hakkında kısa açıklamalar yapılır. Bir kişinin bir devlet dairesine gittiği varsayılır. İlgili görevli, kişinin belgelerinin bir kopyasını alır. Kişinin kendisi olduğunu kanıtlamasını ister. Bu amaçla kişi, nüfus cüzdanı veya nüfus cüzdanı gibi kimlik kartını ibraz eder. Görevli, kişinin kimlik kartındaki adını ve resmini görür ve karşısında oturan kişiyle karşılaştırır. Ayrıca daha gelişmiş bir modda kimlik kartında yazan ismi sisteme girerek kimlik kartının doğru olduğundan emin oluyor ve ardından kişinin yüzünü kimlik kartındaki görüntü ile karşılaştırıyor.
Aynı şekilde yüz tanıma sisteminde de kişinin yüz bilgisi ile birlikte ismi de saklanmaktadır. Bu nedenle, kişinin başka bir görüntüsü sisteme verildiğinde, görüntüye sahip olan kişinin bilgilerinin kendi veritabanında olup olmadığını belirlemeye çalışır ve varsa kişinin adını veya tam profilini alır. Bu çalışma, Yüz Algılama Ağı tarafından yapılır. Bu projede yüz tanıma için kullanılan modelin adı Tiny Face Detector. Bu ismin alınmasının nedeni ise küçük boyutu ve mobil uyumlu olmasıdır. Bu projede kullanılan API ayrıca yüz tanıma için bir SSD mobileNet ve MTCNN kullanır; Ama şu anda tartışılmayacak.
Tıpkı bir parmak izi gibi, Yüz Tanımlayıcı da her yüz için benzersiz bir değerdir. Çeşitli görüntülerde belirli bir kişi için Yüz Tanımlayıcı çok yakın ve benzer değerlere sahiptir. Bu projede, karşılaştırma için Öklid Mesafesi kullanılmıştır. Aradaki mesafe belirlenen eşikten az ise iki görüntünün aynı kişiye ait olduğu anlaşılabilir. Mesafe ne kadar küçük olursa, güvenin o kadar yüksek olduğuna dikkat edilmelidir.
Bu materyallerden bazıları, ilgilenenlerin okuması için aşağıda sunulmuştur:
- OpenCV ve Dlib ile Python’da yüz tanıma — sıfırdan yüze
- JavaScript API ile tarayıcıda yüz tanıma — basit terimlerle
- MATLAB’da yüz tanıma sisteminin uygulanması – pratik rehber
- Chrome Yüz Tanıma API’sı — Uygulama Kılavuzu
- Flutter ile yüz tanıma — pratik bir kılavuz
- Excel kullanarak Gelişmiş Yüz Tanıma — sade bir dille
- Yüz Gülümsemesi Algılama—Uygulamalı Bir Kılavuz
Aşağıdaki makalede, yüz tanıma sistemini uygulamak için JavaScript ve React ile yüz tanıma kullanılacaktır.
JavaScript ve React ile yüz tanıma sisteminin uygulanması
JavaScript ve React ile yüz tanıma yazımızın bu bölümünde JavaScript ve React ile yüz tanıma sisteminin implementasyonu incelenmektedir. Bu programda uygulanması amaçlanan iki işlev vardır. Bu işlevlerden biri, bir giriş görüntüsünden bir yüzü tanımak için kullanılır ve diğeri, bir giriş canlı videosundan bir kişinin yüzünü tanır. Create-react-app ile başlar, react-router-dom’u kurar ve uygulamayı başlatır.
Şimdi tarayıcıyı açın ve http://localhost:3000/ adresine gidin. Kullanıcı, sayfa açıldığında React logosunu görüyorsa bu, çalışmaya devam etmek için koşulların hazır olduğu anlamına gelir. Şimdi, kullanıcı proje klasörünü istediği herhangi bir editörle açmalıdır. Çıktı, aşağıdaki ağaç yapısı gibi görünmelidir.
tepki yüz tanıma ├── BENİOKU.md ├── düğüm_modülleri ├── package.json ├── .gitignore ├── herkese açık │ ├── favicon.ico │ ├── index.html │ └── manifest.json └── kaynak ├── Uygulama.css ├── Uygulama.js ├── Uygulama.test.js ├── index.css ├── index.js ├── logosu.svg └── serviceWorker.js
Şimdi src/App.js adresine gidin ve mevcut kodu aşağıdaki kodla değiştirin.
Burada olan sadece Ana Sayfa bileşenini içe aktarmak ve açılış sayfası olarak “/” ye bir “Rota” oluşturmaktır. Bu bileşen hızlı bir şekilde oluşturulmuştur. Bu, yeni bir src/views klasörü oluşturarak ve bu klasör içinde yeni bir Home.js dosyası oluşturarak yapılır. Daha sonra aşağıdaki kodu dosyaya koyun ve dosyayı kaydedin.
Burada, “localhost:3000/photo” bağlantısı olan Fotoğraf Girişi için ve “localhost:3000/camera” bağlantısı olan Video Kamera için iki bağlantı oluşturulur. Her şey yolunda giderse, kullanıcı aşağıdakine benzer bir sayfa görmelidir.
Yüz tanıma veya Yüz API’si için JavaScript uygulama programlama arabirimi
JavaScript ve React ile yüz tanımanın bu bölümünde ve yeni bir sayfa oluşturma çalışmasına devam etmeden önce, face-api.js’nin yüklenmesi ve API kullanılarak React’e bağlanmak için API dosyasının oluşturulması gerekir. Şimdi konsola geri dönelim ve kütüphane kurulacaktır.
Kitaplık, TensorFlow.js ve model ağırlıkları dışında ihtiyaç duyduğu tüm bileşenlerle birlikte gelir. Model vızıltı kavramına aşina olmayan kullanıcılar için aşağıda açıklamalara yer verilmiştir. Modelin ağırlıkları aslında büyük bir veri seti ile eğitilmiş “sinir ağı” nın ağırlıklarıdır . Bu makalede yapılan örnek olay incelemesinde, veri kümesi aslında binlerce insan yüzü görüntüsüdür.
Halihazırda birçok kişinin modeli eğittiği göz önüne alındığında, burada ihtiyaç duyulan tek şey, kullanılacak ağırlıkları manuel olarak elde etmek ve projeye yerleştirmektir. Bu API için tüm ağırlıklar buradan [ + ] elde edilebilir.
Şimdi, tüm model ağırlıklarını içine koymak için yeni bir public/models klasörü oluşturulacak. Ardından, gerekli tüm ağırlıklar klasörden indirilir. Daha önce de bahsedildiği gibi burada Tiny Face Detector modeli kullanılmaktadır. Bu nedenle SSD MobileNet ve MTCNN modellerine gerek yoktur. Tüm ağırlıkların aşağıda gösterildiği gibi genel/modeller klasöründe olduğundan emin olun. Aksi takdirde modeller uygun ağırlıklar olmadan düzgün çalışmayacaktır.
tepki yüz tanıma ├── BENİOKU.md ├── düğüm_modülleri ├── package.json ├── .gitignore ├── herkese açık │ ├── modeller │ │ ├── face_landmark_68_tiny_model-shard1 │ │ ├── face_landmark_68_tiny_model-weights_manifest.json │ │ ├── face_recognition_model-shard1 │ │ ├── face_recognition_model-shard2 │ │ ├── face_recognition_model-weights_manifest.json │ │ ├── tiny_face_detector_model-shard1 │ │ └── tiny_face_detector_model-weights_manifest.json │ ├── favicon.ico │ ├── index.html │ └── manifest.json
Şimdi geri dönün ve API için src/api olarak yeni bir klasör ve bu klasörün içinde yeni bir face.js dosyası oluşturun. Burada yapılacak olan, modeli yüklemek ve API’yi beslemek için bir işlev oluşturmak ve tüm yüz tanımlayıcıları döndürmenin yanı sıra yüz tanıma için tanımlayıcıları karşılaştırmaktır.
Bu işlevler dışa aktarılır ve daha sonra React Components’ta kullanılır:
Buradaki bu API dosyasında iki önemli bölüm var. İlki, loadModels() fonksiyonu ile modelleri ve ağırlıkları yüklemektir. Burada sadece Face Landmark Tiny Model, Tiny Face Detector ve Face Recognition modelleri yüklenir.
Diğer kısım, görüntü balonunu girdi olarak alan ve tam yüz açıklamasını döndüren getFullFaceDescription() işlevidir. Bu işlev, görüntü balonunu API’ye “getirmek” için faceapi.fetchImage() API işlevini kullanır.
Ardından, faceapi.detectAllFaces() bu görüntüyü alır ve içindeki tüm yüzleri bulur. Ardından, withFaceLandmarks(), yüz özelliğini Float 32 Dizisi olarak 128 değerden döndürmek için withFaceDescriptors() işlevini kullanmadan önce 68 yüz işaretini eşler .
Giriş görüntüsü için 512 piksel görüntünün, video girişi için daha sonra 160 piksel kullanılacağını belirtmekte fayda var. Bu, API tarafından önerilir. Şimdi, aşağıdaki görüntü yeni src/img klasörüne kaydedilmeli ve test.jpg olarak adlandırılmalıdır. Aslında test görüntüsü olan bu görüntü, uygulamayı test etmek içindir.
Aşağıdaki metinde, yeni src/views/ImageInput.js dosyasında JavaScript ve React ile yüz tanıma oluşturulacaktır. Bu dosya, görüntü girdisine ve görüntü dosyasına giden bileşeni temsil eder.
Bu bileşen, şu anda yalnızca src/img/test.jpg test görüntüsünü görüntüler ve API modellerini tarayıcıya yüklemeye başlar, bu işlem birkaç saniye sürer. Bundan sonra görüntü, tam yüz açıklamasını alan bir API’ye beslenir. Duruma döndürülen fullDesc ileride kullanılmak üzere kaydedilebilir ve console.log’da detaylandırılabilir. Ancak bundan önce ImageInput bileşenini src/App.js dosyasına aktarmanız gerekir. Ayrıca, fotoğraf/ Bu, aşağıdaki kod parçası kullanılarak yapılabilir.
Şimdi, kullanıcı http://localhost:3000’i ziyaret edip Fotoğraf Girişi’ne tıklarsa, görüntü ekranını görmeleri gerekir. Tarayıcı konsolu işaretlenirse, bu görüntünün Tam Yüz Açıklaması aşağıdaki gibi görünmelidir.
Aşağıdaki makalede, JavaScript ve React ile yüz tanıma, yüz tanıma kutusunun çizilmesi tartışılmaktadır.
Yüz tanıma kutusu
Görülebileceği gibi, açıklama, tanımlayıcı ve algılama dahil olmak üzere bu projede ihtiyaç duyulan tüm yüz tanıma bilgilerini içerir. Tespitin içinde koordinatlar gibi kutunun bilgileri xy, üst, alt, sol, sağ, yükseklik, genişlik içerir.
face-api.js kitaplığı, gerçekten kullanışlı olan HTML tuvalini kullanarak görüntü algılama kutusunu çizme işleviyle birlikte gelir. Fakat React kullanıldığını düşünürsek, görüntü algılama kutusu neden CSS ile çizilmiyor? Artık React kullanarak kutu ve ekran tespiti yapmak mümkün.
Kullanıcının şimdi yapacağı şey, yüz kutusunu görüntünün üzerine yerleştirmek için algılama kutusu bilgisini kullanmaktır. Ayrıca uygulama ile tespit edilen her bir yüzün adı üzerinde görüntülenebiliyor. Bu, DrawBox’ın ImageInput bileşenine eklendiği yöntemdir. Ardından giriş etiketi eklenir, böylece giriş görüntüsü değiştirilebilir.
React’te CSS kullanarak, tüm resim kutularını bunun gibi bir resme yerleştirmek mümkündür. Daha fazla yüze sahip bir resim kullanılırsa, resim üzerinde daha fazla kutu görülecektir.
Yüz tanıma
Şimdi, JavaScript ve React ile yüz tanıma makalesinin bu bölümünde basit kısım geldi. Bir kişiyi tanımlamak için, görüntüden özellik vektöründen veya tanımlayıcıdan 128 değer çıkarmak için en az bir kaynak görüntüye ihtiyaç vardır. API, tanımlamaya çalıştığı her kişi için tanımlayıcılardan ve addan bir etiket çıkarmak için LabeledFaceDescriptors işlevini kullanır. Bu etiket, bireyi eşleştirmek için sorgu tanımlayıcısıyla birlikte API’yi besler. Ancak bundan önce, adların ve tanımlayıcıların bir profilini sağlamak gerekir.
Yüz profili
Şu anda, Cherprang karakteri için görsel bir referans var. Bu nedenle, tanımlayıcısı bir profil oluşturmak için kullanılabilir. Bu noktada yapmayı düşündüğümüz şey bir JSON dosyası ve src/descriptors/bnk48.json klasörü oluşturmak. Bu dosya, grup üye adlarını ve referans görüntülerinden tanımlayıcıları içerir. Aşağıda, yalnızca bir görüntü tanımlayıcısı olan ilk örnek dosya verilmektedir.
Tüm üyelerin tüm görüntüleri mevcutsa, yüz profilini tamamlamak için tanımlayıcılar eklenebilir ve tek tek adlandırılabilir. Burada, bu tam resim profilini oluşturmak için her üyenin 5 ila 10 resmi kullanılır. Bu nedenle izleyiciler bu dosyayı buradan [ + ] kolayca indirebilir ve src/descriptors/bnk48.json dosyasını değiştirebilir.
Dosya boyutu, başvuru değerlendirmesi için makul görünen tüm üyeler için yaklaşık bir megabayttır. Ancak gerçek dünyada, tüm görüntü profillerini bir veritabanında saklamanız gerekebilir, bu nedenle dosya boyutu hakkında endişelenmenize gerek yoktur. Ancak bunun yerine, görüntü tanıma işlemini gerçekleştirmek için sunucu tarafı kullanılmalıdır.
Yüz ayarlayıcı
Bir sonraki adımda, görüntü tanıma görevi için labelDescriptors ve faceMatcher oluşturmamız gerekiyor. Şimdi src/api/face.js dosyasına geri dönelim ve aşağıdaki fonksiyonu dosyaya ekleyelim.
Bu işlev, bir yüz profilini (JSON dosyası) girdi olarak alır ve her üyenin tanımlayıcısından, adı etiket olarak etiketlenmişTanımlayıcılar oluşturur. Ardından, faceMatcher etiketle oluşturulabilir ve dışa aktarılabilir (Dışa Aktar). maxDescriptorDistance’ın 0.5 olarak yapılandırılması izleyicilerin dikkatini çekmiş olabilir. Bu, referans tanımlayıcının ve sorgu tanımlayıcının anlamlı olacak kadar birbirine yakın olduğunu belirlemek için “Öklid Mesafesi” eşiğidir. API varsayılan değeri, genel amaçlar için yeterince iyi olan 0,6’dır. Ancak bu örnekte 0,5 daha doğrudur ve daha az hata içerir çünkü bu örnekte görüntüleri kullanılan kişilerin yüzleri çok benzerdir. İşlev hazır olduğuna göre, kodu bitirmek için src/views/ImageInput.js’ye döner.
Bu son kodda face.js’den createMatcher fonksiyonu alınır ve hazırlanan yüz profili ile faceMatcher oluşturulur. handleImage() fonksiyonu içinde, resimden fullDesc alındıktan sonra, tanımlayıcılar eşlenir ve her resim için en iyi eşleşme bulunur. Ardından, her bir yüz algılama kutusunun altında en iyi eşleşmeyi görüntülemek için p etiketi ve CSS kullanılır. Bunun bir görünümü aşağıdaki resimde verilmiştir.
Tam yüz profilini indiren kişiler [ + ] görseli aşağıdaki görsel ile değiştirebilir ve yüz tanıma sisteminin sonucunu görebilir.
Aşağıdaki yazıda canlı video girişinde JavaScript ile yüz tanıma ve React yüz tanıma işlemi yapılmaktadır.
Canlı video girişi
JavaScript ve React ile yüz tanıma yazımızın bu bölümünde canlı video ile yüz tanıma yöntemi öğretilmektedir. Burada canlı video, React-Webcam kullanılarak face-api.js’ye beslenir. Daha sonra gerekli kütüphane kurularak iş yapılır.
Yine yeni bir component oluşturmadan önce /src/App.js içindeki giriş videosu için bir “Route” eklememiz gerekiyor. VideoInput bileşeni yakında oluşturulacak.
Giriş video bileşeni
Şimdi yeni dosya src/views/VideoInput.js oluşturulacak. Ardından, aşağıdaki kod kopyalanır ve o dosyaya kaydedilir. Bu bileşen için tam kod aşağıdadır.
Girişin her 1500 milisaniyede bir web kamerasından alınan bir ekran görüntüsü olması dışında, tüm algılama ve tanıma mekanizmaları ImageInput bileşeniyle aynıdır. Görüntü boyutu 420 x 420 piksel olarak ayarlanmıştır, ancak daha küçük veya daha büyük boyutlu görüntüleri işleyebilir. Tabii ki, daha büyük görüntülerin kullanılmasının yüksek işlem süresine yol açtığını belirtmek gerekir. setInputDevice işlevinin içinde, cihazın 1 veya 2 (veya daha fazla) kamerası olup olmadığını kontrol eder. Yalnızca bir kamera varsa, uygulama bunun bir PC olduğunu varsayar ve ardından kameradan faceMode: user’ı kaydeder, ancak iki veya daha fazla kamera varsa bu bir akıllı telefon olabilir. Bu durumda, kamera arka ucundan faceMode: { exact: ‘environment’ } alabilirsiniz.
ImageInput bileşeninde olduğu gibi, görüntü algılama kutusunu çizmek için benzer bir işlev kullanılır. Aslında başka bir bileşen olarak hazırlanabilir. Bu nedenle, tekrar tekrar etmeye gerek yoktur. Artık uygulama hazır. Kullanıcılar, uygulamanın VideoInput modunu kendi yüzleriyle test edebilir. Ancak muhtemelen kullanıcı, modelin görüntüleriyle eğitildiği kişilerden birini bilinmeyen veya yanlışlıkla tanıyacaktır. Bunun nedeni, sistemin Öklid mesafesi 0,5’ten küçük olan tüm görüntüleri tanımaya çalışmasıdır.
Projeyi GitHub sayfasında dağıtma
JavaScript ve React ile yüz tanıma makalesinin bu bölümünde, projenin GitHub’da dağıtılma yöntemi incelenmektedir. Bu uygulama herhangi bir statik ana bilgisayarda konuşlandırılabilir. Ancak bu bölümde, bu React programını GitHub sayfalarında dağıtma yöntemi birkaç püf noktası kullanılarak öğretildi. Bu adımları gerçekleştirmek için bir GitHub hesabınızın olması gerekir. GitHub’ı olmayan kişiler, bu bölümdeki adımlara devam etmek için bir GitHub hesabı oluşturun. Öncelikle gh-pages kütüphanesinin kurulu olması gerekmektedir. Bunun için aşağıdaki kod parçacığını kullanabilirsiniz.
Ardından, src/App.js içindeki createHistory() içerisine { basename: process.env.PUBLIC_URL } aşağıdaki gibi eklememiz gerekiyor.
Artık kullanıcı GitHub sayfasına gidebilir ve uygulama adlı bir havuz oluşturabilir. Buradaki uygulamanın adı tepki-yüz tanımadır. Ardından Git URL’si, projeye daha sonra eklenebilmesi için kopyalanabilir. Ardından, package.json dosyasını açmanız ve ana sayfayı GitHub hesabı ve uygulama adıyla aşağıdaki gibi eklemeniz gerekir:
Henüz package.json dosyasını kapatmamalısınız çünkü aşağıdaki gibi scriptler altında predeploy ve deploy komutlarını komut satırına eklemeniz gerekiyor.
Artık dosyayı kaydedebilir ve terminal konsoluna geri dönebilir, ardından kodu GitHub deposuna yüklemek için git komutunu çalıştırabilir ve npm run konuşlandırmayı çalıştırabilirsiniz. Sayfa, http://YOUR_GITHUB_ACCOUNT.github.io/react-face-recognition olarak ayarlanmış bir URL ile yayınlanmalıdır.