HoloLens (generasi ke-1) dan Azure 304: Pengenalan wajah
Catatan
Tutorial Mixed Reality Academy dirancang dengan HoloLens (generasi ke-1) dan Mixed Reality Immersive Headsets dalam pikiran. Dengan demikian, kami merasa penting untuk meninggalkan tutorial ini di tempat bagi pengembang yang masih mencari panduan dalam mengembangkan untuk perangkat tersebut. Tutorial ini tidak akan diperbarui dengan toolset atau interaksi terbaru yang digunakan untuk HoloLens 2. Mereka akan dipertahankan untuk terus bekerja pada perangkat yang didukung. Akan ada serangkaian tutorial baru yang akan diposting di masa depan yang akan menunjukkan cara mengembangkan untuk HoloLens 2. Pemberitahuan ini akan diperbarui dengan tautan ke tutorial tersebut ketika diposting.
Dalam kursus ini Anda akan mempelajari cara menambahkan kemampuan pengenalan wajah ke aplikasi realitas campuran, menggunakan Azure Cognitive Services, dengan Microsoft Face API.
Azure Face API adalah layanan Microsoft, yang menyediakan algoritma wajah paling canggih kepada pengembang, semuanya di cloud. Face API memiliki dua fungsi utama: deteksi wajah dengan atribut, dan pengenalan wajah. Ini memungkinkan pengembang untuk hanya mengatur sekumpulan grup untuk wajah, lalu, mengirim gambar kueri ke layanan nanti, untuk menentukan siapa wajah berada. Untuk informasi selengkapnya, kunjungi halaman Azure Face Recognition.
Setelah menyelesaikan kursus ini, Anda akan memiliki aplikasi HoloLens realitas campuran, yang akan dapat melakukan hal berikut:
- Gunakan Tap Gesture untuk memulai pengambilan gambar menggunakan kamera HoloLens on-board.
- Kirim gambar yang diambil ke layanan Azure Face API .
- Terima hasil algoritma Face API .
- Gunakan Antarmuka Pengguna sederhana, untuk menampilkan nama orang yang cocok.
Ini akan mengajarkan Anda cara mendapatkan hasil dari Layanan Face API ke dalam aplikasi realitas campuran berbasis Unity Anda.
Dalam aplikasi Anda, terserah Anda tentang bagaimana Anda akan mengintegrasikan hasilnya dengan desain Anda. Kursus ini dirancang untuk mengajari Anda cara mengintegrasikan Layanan Azure dengan Proyek Unity Anda. Ini adalah tugas Anda untuk menggunakan pengetahuan yang Anda peroleh dari kursus ini untuk meningkatkan aplikasi realitas campuran Anda.
Dukungan perangkat
Kursus | HoloLens | Headset imersif |
---|---|---|
MR dan Azure 304: Pengenalan wajah | ✔️ | ✔️ |
Catatan
Meskipun kursus ini terutama berfokus pada HoloLens, Anda juga dapat menerapkan apa yang Anda pelajari dalam kursus ini ke headset imersif (VR) Windows Mixed Reality. Karena headset imersif (VR) tidak memiliki kamera yang dapat diakses, Anda akan memerlukan kamera eksternal yang terhubung ke PC Anda. Saat mengikuti kursus, Anda akan melihat catatan tentang perubahan apa pun yang mungkin perlu Anda gunakan untuk mendukung headset imersif (VR).
Prasyarat
Catatan
Tutorial ini dirancang untuk pengembang yang memiliki pengalaman dasar dengan Unity dan C#. Perlu diketahui juga bahwa prasyarat dan instruksi tertulis dalam dokumen ini mewakili apa yang telah diuji dan diverifikasi pada saat penulisan (Mei 2018). Anda bebas menggunakan perangkat lunak terbaru, seperti yang tercantum dalam artikel instal alat , meskipun tidak boleh diasumsikan bahwa informasi dalam kursus ini akan sangat cocok dengan apa yang akan Anda temukan di perangkat lunak yang lebih baru daripada apa yang tercantum di bawah ini.
Kami merekomendasikan perangkat keras dan perangkat lunak berikut untuk kursus ini:
- PC pengembangan, kompatibel dengan Windows Mixed Reality untuk pengembangan headset imersif (VR)
- Pembaruan Windows 10 Fall Creators (atau yang lebih baru) dengan mode Pengembang diaktifkan
- Windows 10 SDK terbaru
- Unity 2017.4
- Visual Studio 2017
- Headset Windows Mixed Reality immersive (VR) atau Microsoft HoloLens dengan mode Pengembang diaktifkan
- Kamera yang terhubung ke PC Anda (untuk pengembangan headset imersif)
- Akses internet untuk penyiapan Azure dan pengambilan Face API
Sebelum memulai
- Untuk menghindari masalah saat membangun proyek ini, sangat disarankan agar Anda membuat proyek yang disebutkan dalam tutorial ini di folder root atau near-root (jalur folder panjang dapat menyebabkan masalah pada build-time).
- Siapkan dan uji HoloLens Anda. Jika Anda memerlukan dukungan untuk menyiapkan HoloLens Anda, pastikan untuk mengunjungi artikel penyiapan HoloLens.
- Sebaiknya lakukan Kalibrasi dan Penyetelan Sensor saat mulai mengembangkan Aplikasi HoloLens baru (terkadang dapat membantu melakukan tugas tersebut untuk setiap pengguna).
Untuk bantuan tentang Kalibrasi, silakan ikuti tautan ini ke artikel Kalibrasi HoloLens.
Untuk bantuan tentang Penyetelan Sensor, silakan ikuti tautan ini ke artikel Penyetelan Sensor HoloLens.
Bab 1 - Portal Microsoft Azure
Untuk menggunakan layanan Face API di Azure, Anda harus mengonfigurasi instans layanan agar tersedia untuk aplikasi Anda.
Pertama, masuk ke Portal Microsoft Azure.
Catatan
Jika Anda belum memiliki akun Azure, Anda harus membuatnya. Jika Anda mengikuti tutorial ini dalam situasi ruang kelas atau lab, mintalah instruktur atau salah satu proktor untuk membantu menyiapkan akun baru Anda.
Setelah Anda masuk, klik Baru di sudut kiri atas, dan cari Face API, tekan Enter.
Catatan
Kata Baru mungkin telah diganti dengan Buat sumber daya, di portal yang lebih baru.
Halaman baru akan memberikan deskripsi layanan Face API . Di kiri bawah prompt ini, pilih tombol Buat , untuk membuat asosiasi dengan layanan ini.
Setelah Anda mengklik Buat:
Masukkan nama yang Anda inginkan untuk instans layanan ini.
Pilih Langganan.
Pilih tingkat harga yang sesuai untuk Anda, jika ini pertama kalinya membuat Layanan Face API, tingkat gratis (bernama F0) harus tersedia untuk Anda.
Pilih Grup Sumber Daya atau buat yang baru. Grup sumber daya menyediakan cara untuk memantau, mengontrol akses, menyediakan, dan mengelola penagihan untuk kumpulan aset Azure. Disarankan untuk menyimpan semua layanan Azure yang terkait dengan satu proyek (misalnya seperti lab ini) di bawah grup sumber daya umum).
Jika Anda ingin membaca selengkapnya tentang Grup Sumber Daya Azure, silakan kunjungi artikel grup sumber daya.
Aplikasi UWP, Person Maker, yang Anda gunakan nanti, memerlukan penggunaan 'US Barat' untuk lokasi.
Anda juga perlu mengonfirmasi bahwa Anda telah memahami Syarat dan Ketentuan yang diterapkan pada Layanan ini.
Pilih Buat*.
Setelah mengeklik Buat,* Anda harus menunggu layanan dibuat, ini mungkin perlu waktu satu menit.
Pemberitahuan akan muncul di portal setelah instans Layanan dibuat.
Klik pemberitahuan untuk menjelajahi instans Layanan baru Anda.
Saat Anda siap, klik tombol Buka sumber daya di pemberitahuan untuk menjelajahi instans Layanan baru Anda.
Dalam tutorial ini, aplikasi Anda harus melakukan panggilan ke layanan Anda, yang dilakukan melalui menggunakan 'kunci' langganan layanan Anda. Dari halaman Mulai cepat, layanan Face API Anda, poin pertama adalah nomor 1, ke Ambil kunci Anda.
Pada halaman Layanan pilih hyperlink Kunci biru (jika pada halaman Mulai cepat), atau tautan Kunci di menu navigasi layanan (di sebelah kiri, ditandai dengan ikon 'kunci'), untuk mengungkapkan kunci Anda.
Catatan
Perhatikan salah satu kunci dan lindungi, karena Anda akan membutuhkannya nanti.
Bab 2 - Menggunakan aplikasi UWP 'Person Maker'
Pastikan untuk mengunduh Aplikasi UWP bawaan yang disebut Person Maker. Aplikasi ini bukan produk akhir untuk kursus ini, hanya alat untuk membantu Anda membuat entri Azure, yang akan diandalkan oleh proyek nanti.
Person Maker memungkinkan Anda membuat entri Azure, yang terkait dengan orang, dan sekelompok orang. Aplikasi ini akan menempatkan semua informasi yang diperlukan dalam format yang kemudian dapat digunakan oleh FaceAPI, untuk mengenali wajah orang yang telah Anda tambahkan.
[PENTING] Person Maker menggunakan beberapa pembatasan dasar, untuk membantu memastikan bahwa Anda tidak melebihi jumlah panggilan layanan per menit untuk tingkat langganan gratis. Teks hijau di bagian atas akan berubah menjadi merah dan diperbarui sebagai 'ACTIVE' saat pembatasan terjadi; jika demikian, cukup tunggu aplikasi (aplikasi akan menunggu sampai selanjutnya dapat terus mengakses layanan wajah, memperbarui sebagai 'IN-ACTIVE' ketika Anda dapat menggunakannya lagi).
Aplikasi ini menggunakan pustaka Microsoft.ProjectOxford.Face , yang akan memungkinkan Anda untuk menggunakan Face API sepenuhnya. Pustaka ini tersedia secara gratis sebagai Paket NuGet. Untuk informasi selengkapnya tentang ini, dan yang serupa, API pastikan untuk mengunjungi artikel referensi API.
Catatan
Ini hanya langkah-langkah yang diperlukan, instruksi tentang cara melakukan hal-hal ini lebih jauh ke bawah dokumen. Aplikasi Person Maker akan memungkinkan Anda untuk:
Buat Grup Orang, yang merupakan grup yang terdiri dari beberapa orang yang ingin Anda kaitkan dengannya. Dengan akun Azure Anda, Anda dapat menghosting beberapa Grup Orang.
Buat Orang, yang merupakan anggota Grup Orang. Setiap orang memiliki sejumlah gambar Wajah yang terkait dengannya.
Tetapkan gambar wajah ke Orang, untuk memungkinkan Layanan AZURE Face API Anda mengenali Seseorang dengan wajah yang sesuai.
Latih Azure Face API Service Anda.
Ketahuilah, jadi untuk melatih aplikasi ini untuk mengenali orang, Anda akan memerlukan sepuluh (10) foto close-up dari setiap orang yang ingin Anda tambahkan ke Grup Orang Anda. Aplikasi Windows 10 Cam dapat membantu Anda untuk mengambil ini. Anda harus memastikan bahwa setiap foto jelas (hindari mengaburkan, mengaburkan, atau terlalu jauh, dari subjek), memiliki foto dalam format file jpg atau png, dengan ukuran file gambar tidak lebih besar 4 MB, dan tidak kurang dari 1 KB.
Catatan
Jika Anda mengikuti tutorial ini, jangan gunakan wajah Anda sendiri untuk pelatihan, seperti ketika Anda memasang HoloLens, Anda tidak dapat melihat diri Anda sendiri. Gunakan wajah kolega atau sesama siswa.
Running Person Maker:
Buka folder PersonMaker dan klik dua kali pada solusi PersonMaker untuk membukanya dengan Visual Studio.
Setelah solusi PersonMaker terbuka, pastikan bahwa:
Konfigurasi Solusi diatur ke Debug.
Platform Solusi diatur ke x86
Platform Target adalah Komputer Lokal.
Anda mungkin juga perlu Memulihkan Paket NuGet (klik kanan Solusi dan pilih Pulihkan Paket NuGet).
Klik Komputer Lokal dan aplikasi akan dimulai. Ketahuilah, pada layar yang lebih kecil, semua konten mungkin tidak terlihat, meskipun Anda dapat menggulir lebih jauh ke bawah untuk melihatnya.
Sisipkan Kunci Autentikasi Azure, yang seharusnya Anda miliki, dari layanan Face API Anda dalam Azure.
Memasukkan:
- ID yang ingin Anda tetapkan ke Grup Orang. ID harus huruf kecil, tanpa spasi. Catat ID ini, karena akan diperlukan nanti dalam proyek Unity Anda.
- Nama yang ingin Anda tetapkan ke Grup Orang (bisa memiliki spasi).
Tekan tombol Buat Grup Orang. Pesan konfirmasi akan muncul di bawah tombol .
Catatan
Jika Anda mengalami kesalahan 'Akses Ditolak', periksa lokasi yang Anda tetapkan untuk layanan Azure Anda. Seperti yang dinyatakan di atas, aplikasi ini dirancang untuk 'US Barat'.
Penting
Anda akan melihat bahwa Anda juga dapat mengklik tombol Ambil Grup yang Diketahui: ini untuk jika Anda telah membuat grup orang, dan ingin menggunakannya, daripada membuat yang baru. Ketahuilah, jika Anda mengklik Buat Grup Orang dengan grup yang diketahui, ini juga akan mengambil grup.
Sisipkan Nama Orang yang ingin Anda buat.
Klik tombol Buat Orang .
Pesan konfirmasi akan muncul di bawah tombol .
Jika Anda ingin menghapus orang yang telah Anda buat sebelumnya, Anda bisa menulis nama ke dalam kotak teks dan menekan Hapus Orang
Pastikan Anda mengetahui lokasi sepuluh (10) foto orang yang ingin Anda tambahkan ke grup Anda.
Tekan Buat dan Buka Folder untuk membuka Windows Explorer ke folder yang terkait dengan orang tersebut. Tambahkan sepuluh (10) gambar di folder . Ini harus berformat file JPG atau PNG .
Klik Kirim ke Azure. Penghitung akan menunjukkan status pengiriman, diikuti dengan pesan ketika telah selesai.
Setelah penghitung selesai dan pesan konfirmasi telah ditampilkan klik Latih untuk melatih Layanan Anda.
Setelah proses selesai, Anda siap untuk pindah ke Unity.
Bab 3 - Menyiapkan proyek Unity
Berikut ini adalah pengaturan khas untuk mengembangkan dengan realitas campuran, dan dengan demikian, adalah templat yang baik untuk proyek lain.
Buka Unity dan klik Baru.
Anda sekarang perlu memberikan nama Proyek Unity. Sisipkan MR_FaceRecognition. Pastikan jenis proyek diatur ke 3D. Atur Lokasi ke tempat yang sesuai untuk Anda (ingat, lebih dekat ke direktori akar lebih baik). Lalu, klik Buat proyek.
Dengan Unity terbuka, ada baiknya memeriksa Editor Skrip default diatur ke Visual Studio. Buka Edit > Preferensi lalu dari jendela baru, navigasikan ke Alat Eksternal. Ubah Editor Skrip Eksternal ke Visual Studio 2017. Tutup jendela Preferensi .
Selanjutnya, buka Pengaturan Build File > dan alihkan platform ke Platform Windows Universal, dengan mengklik tombol Beralih Platform.
Buka Pengaturan Build File > dan pastikan bahwa:
Perangkat Target diatur ke HoloLens
Untuk headset imersif, atur Perangkat Target ke Perangkat Apa Pun.
Jenis Build diatur ke D3D
SDK diatur ke Terbaru diinstal
Versi Visual Studio diatur ke Terbaru diinstal
Build and Run diatur ke Komputer Lokal
Simpan adegan dan tambahkan ke build.
Lakukan ini dengan memilih Tambahkan Adegan Terbuka. Jendela penyimpanan akan muncul.
Pilih tombol Folder baru, untuk membuat folder baru, beri nama Adegan.
Buka folder Adegan yang baru dibuat, lalu di bidang Nama file: teks, ketik FaceRecScene, lalu tekan Simpan.
Pengaturan yang tersisa, di Pengaturan Build, harus dibiarkan sebagai default untuk saat ini.
Di jendela Pengaturan Build, klik tombol Pengaturan Pemutar, ini akan membuka panel terkait di ruang tempat Pemeriksa berada.
Di panel ini, beberapa pengaturan perlu diverifikasi:
Di tab Pengaturan Lainnya:
Versi Runtime Pembuatan Skrip harus Bersifat Eksperimental (Setara.NET 4.6). Mengubah ini akan memicu kebutuhan untuk memulai ulang Editor.
Scripting Backend harus .NET
Tingkat Kompatibilitas API harus .NET 4.6
Dalam tab Pengaturan Penerbitan, di bawah Kemampuan, periksa:
InternetClient
Webcam
Selanjutnya di bawah panel, di Pengaturan XR (ditemukan di bawah Pengaturan Penerbitan), centang Realitas Virtual yang Didukung, pastikan Windows Mixed Reality SDK ditambahkan.
Kembali ke Pengaturan Build, Proyek Unity C# tidak lagi berwarna abu-abu; centang kotak di samping ini.
Tutup jendela Pengaturan Build.
Simpan Adegan dan Proyek Anda (FILE > SAVE SCENE / FILE > SAVE PROJECT).
Bab 4 - Penyiapan Kamera Utama
Penting
Jika Anda ingin melewati komponen Unity Siapkan kursus ini, dan lanjutkan langsung ke dalam kode, jangan ragu untuk mengunduh .unitypackage ini, dan mengimpornya ke proyek Anda sebagai Paket Kustom. Ketahuilah bahwa paket ini juga mencakup impor Newtonsoft DLL, yang tercakup dalam Bab 5. Dengan impor ini, Anda dapat melanjutkan dari Bab 6.
Di Panel Hierarki , pilih Kamera Utama.
Setelah dipilih, Anda akan dapat melihat semua komponen Kamera Utama di Panel Inspektur.
Objek Kamera harus diberi nama Kamera Utama (perhatikan ejaan!)
Tag Kamera Utama harus diatur ke MainCamera (perhatikan ejaan!)
Pastikan Posisi Transformasi diatur ke 0, 0, 0
Atur Hapus Bendera ke Warna Solid
Atur Warna Latar Belakang Komponen Kamera ke Hitam, Alpha 0 (Kode Hex: #00000000)
Bab 5 – Impor pustaka Newtonsoft.Json
Penting
Jika Anda mengimpor '.unitypackage' di Bab terakhir, Anda dapat melewati Bab ini.
Untuk membantu Anda mendeserialisasi dan menserialisasi objek yang diterima dan dikirim ke Bot Service, Anda perlu mengunduh pustaka Newtonsoft.Json . Anda akan menemukan versi yang kompatibel yang sudah diatur dengan struktur folder Unity yang benar dalam file paket Unity ini.
Untuk mengimpor pustaka:
Unduh Paket Unity.
Klik Aset, Paket Impor, Paket Kustom.
Cari Paket Unity yang telah Anda unduh, dan klik Buka.
Pastikan semua komponen paket dicentang dan klik Impor.
Bab 6 - Buat kelas FaceAnalysis
Tujuan dari kelas FaceAnalysis adalah untuk menghosting metode yang diperlukan untuk berkomunikasi dengan Azure Face Recognition Service Anda.
- Setelah mengirim gambar pengambilan, layanan akan menganalisisnya dan mengidentifikasi wajah di dalamnya, dan menentukan apakah ada milik orang yang diketahui.
- Jika orang yang diketahui ditemukan, kelas ini akan menampilkan namanya sebagai teks UI dalam adegan.
Untuk membuat kelas FaceAnalysis :
Klik kanan di Folder Aset yang terletak di Panel Proyek, lalu klik Buat>Folder. Panggil folder Skrip.
Klik dua kali pada folder yang baru saja dibuat, untuk membukanya.
Klik kanan di dalam folder, lalu klik Buat>Skrip C#. Panggil skrip FaceAnalysis.
Klik dua kali pada skrip FaceAnalysis baru untuk membukanya dengan Visual Studio 2017.
Masukkan namespace berikut di atas kelas FaceAnalysis :
using Newtonsoft.Json; using System.Collections; using System.Collections.Generic; using System.IO; using System.Text; using UnityEngine; using UnityEngine.Networking;
Anda sekarang perlu menambahkan semua objek yang digunakan untuk deserialisasi. Objek-objek ini perlu ditambahkan di luar skrip FaceAnalysis (di bawah kurung kurawal bawah).
/// <summary> /// The Person Group object /// </summary> public class Group_RootObject { public string personGroupId { get; set; } public string name { get; set; } public object userData { get; set; } } /// <summary> /// The Person Face object /// </summary> public class Face_RootObject { public string faceId { get; set; } } /// <summary> /// Collection of faces that needs to be identified /// </summary> public class FacesToIdentify_RootObject { public string personGroupId { get; set; } public List<string> faceIds { get; set; } public int maxNumOfCandidatesReturned { get; set; } public double confidenceThreshold { get; set; } } /// <summary> /// Collection of Candidates for the face /// </summary> public class Candidate_RootObject { public string faceId { get; set; } public List<Candidate> candidates { get; set; } } public class Candidate { public string personId { get; set; } public double confidence { get; set; } } /// <summary> /// Name and Id of the identified Person /// </summary> public class IdentifiedPerson_RootObject { public string personId { get; set; } public string name { get; set; } }
Metode Start() dan Update() tidak akan digunakan, jadi hapus sekarang.
Di dalam kelas FaceAnalysis, tambahkan variabel berikut:
/// <summary> /// Allows this class to behave like a singleton /// </summary> public static FaceAnalysis Instance; /// <summary> /// The analysis result text /// </summary> private TextMesh labelText; /// <summary> /// Bytes of the image captured with camera /// </summary> internal byte[] imageBytes; /// <summary> /// Path of the image captured with camera /// </summary> internal string imagePath; /// <summary> /// Base endpoint of Face Recognition Service /// </summary> const string baseEndpoint = "https://westus.api.cognitive.microsoft.com/face/v1.0/"; /// <summary> /// Auth key of Face Recognition Service /// </summary> private const string key = "- Insert your key here -"; /// <summary> /// Id (name) of the created person group /// </summary> private const string personGroupId = "- Insert your group Id here -";
Catatan
Ganti kunci dan personGroupId dengan Kunci Layanan dan Id grup yang Anda buat sebelumnya.
Tambahkan metode Awake(), yang menginisialisasi kelas, menambahkan kelas ImageCapture ke Kamera Utama dan memanggil metode pembuatan Label:
/// <summary> /// Initialises this class /// </summary> private void Awake() { // Allows this instance to behave like a singleton Instance = this; // Add the ImageCapture Class to this Game Object gameObject.AddComponent<ImageCapture>(); // Create the text label in the scene CreateLabel(); }
Tambahkan metode CreateLabel(), yang membuat objek Label untuk menampilkan hasil analisis:
/// <summary> /// Spawns cursor for the Main Camera /// </summary> private void CreateLabel() { // Create a sphere as new cursor GameObject newLabel = new GameObject(); // Attach the label to the Main Camera newLabel.transform.parent = gameObject.transform; // Resize and position the new cursor newLabel.transform.localScale = new Vector3(0.4f, 0.4f, 0.4f); newLabel.transform.position = new Vector3(0f, 3f, 60f); // Creating the text of the Label labelText = newLabel.AddComponent<TextMesh>(); labelText.anchor = TextAnchor.MiddleCenter; labelText.alignment = TextAlignment.Center; labelText.tabSize = 4; labelText.fontSize = 50; labelText.text = "."; }
Tambahkan metode DetectFacesFromImage() dan GetImageAsByteArray(). Yang pertama akan meminta Layanan Pengenalan Wajah untuk mendeteksi kemungkinan wajah dalam gambar yang dikirimkan, sementara yang terakhir diperlukan untuk mengonversi gambar yang diambil menjadi array byte:
/// <summary> /// Detect faces from a submitted image /// </summary> internal IEnumerator DetectFacesFromImage() { WWWForm webForm = new WWWForm(); string detectFacesEndpoint = $"{baseEndpoint}detect"; // Change the image into a bytes array imageBytes = GetImageAsByteArray(imagePath); using (UnityWebRequest www = UnityWebRequest.Post(detectFacesEndpoint, webForm)) { www.SetRequestHeader("Ocp-Apim-Subscription-Key", key); www.SetRequestHeader("Content-Type", "application/octet-stream"); www.uploadHandler.contentType = "application/octet-stream"; www.uploadHandler = new UploadHandlerRaw(imageBytes); www.downloadHandler = new DownloadHandlerBuffer(); yield return www.SendWebRequest(); string jsonResponse = www.downloadHandler.text; Face_RootObject[] face_RootObject = JsonConvert.DeserializeObject<Face_RootObject[]>(jsonResponse); List<string> facesIdList = new List<string>(); // Create a list with the face Ids of faces detected in image foreach (Face_RootObject faceRO in face_RootObject) { facesIdList.Add(faceRO.faceId); Debug.Log($"Detected face - Id: {faceRO.faceId}"); } StartCoroutine(IdentifyFaces(facesIdList)); } } /// <summary> /// Returns the contents of the specified file as a byte array. /// </summary> static byte[] GetImageAsByteArray(string imageFilePath) { FileStream fileStream = new FileStream(imageFilePath, FileMode.Open, FileAccess.Read); BinaryReader binaryReader = new BinaryReader(fileStream); return binaryReader.ReadBytes((int)fileStream.Length); }
Tambahkan metode IdentifiFaces(), yang meminta Layanan Pengenalan Wajah untuk mengidentifikasi wajah yang diketahui yang sebelumnya terdeteksi dalam gambar yang dikirimkan. Permintaan akan mengembalikan id orang yang diidentifikasi tetapi bukan nama:
/// <summary> /// Identify the faces found in the image within the person group /// </summary> internal IEnumerator IdentifyFaces(List<string> listOfFacesIdToIdentify) { // Create the object hosting the faces to identify FacesToIdentify_RootObject facesToIdentify = new FacesToIdentify_RootObject(); facesToIdentify.faceIds = new List<string>(); facesToIdentify.personGroupId = personGroupId; foreach (string facesId in listOfFacesIdToIdentify) { facesToIdentify.faceIds.Add(facesId); } facesToIdentify.maxNumOfCandidatesReturned = 1; facesToIdentify.confidenceThreshold = 0.5; // Serialize to Json format string facesToIdentifyJson = JsonConvert.SerializeObject(facesToIdentify); // Change the object into a bytes array byte[] facesData = Encoding.UTF8.GetBytes(facesToIdentifyJson); WWWForm webForm = new WWWForm(); string detectFacesEndpoint = $"{baseEndpoint}identify"; using (UnityWebRequest www = UnityWebRequest.Post(detectFacesEndpoint, webForm)) { www.SetRequestHeader("Ocp-Apim-Subscription-Key", key); www.SetRequestHeader("Content-Type", "application/json"); www.uploadHandler.contentType = "application/json"; www.uploadHandler = new UploadHandlerRaw(facesData); www.downloadHandler = new DownloadHandlerBuffer(); yield return www.SendWebRequest(); string jsonResponse = www.downloadHandler.text; Debug.Log($"Get Person - jsonResponse: {jsonResponse}"); Candidate_RootObject [] candidate_RootObject = JsonConvert.DeserializeObject<Candidate_RootObject[]>(jsonResponse); // For each face to identify that ahs been submitted, display its candidate foreach (Candidate_RootObject candidateRO in candidate_RootObject) { StartCoroutine(GetPerson(candidateRO.candidates[0].personId)); // Delay the next "GetPerson" call, so all faces candidate are displayed properly yield return new WaitForSeconds(3); } } }
Tambahkan metode GetPerson(). Dengan memberikan id orang tersebut, metode ini kemudian meminta Layanan Pengenalan Wajah untuk mengembalikan nama orang yang diidentifikasi:
/// <summary> /// Provided a personId, retrieve the person name associated with it /// </summary> internal IEnumerator GetPerson(string personId) { string getGroupEndpoint = $"{baseEndpoint}persongroups/{personGroupId}/persons/{personId}?"; WWWForm webForm = new WWWForm(); using (UnityWebRequest www = UnityWebRequest.Get(getGroupEndpoint)) { www.SetRequestHeader("Ocp-Apim-Subscription-Key", key); www.downloadHandler = new DownloadHandlerBuffer(); yield return www.SendWebRequest(); string jsonResponse = www.downloadHandler.text; Debug.Log($"Get Person - jsonResponse: {jsonResponse}"); IdentifiedPerson_RootObject identifiedPerson_RootObject = JsonConvert.DeserializeObject<IdentifiedPerson_RootObject>(jsonResponse); // Display the name of the person in the UI labelText.text = identifiedPerson_RootObject.name; } }
Ingatlah untuk Menyimpan perubahan sebelum kembali ke Editor Unity.
Di Editor Unity, seret skrip FaceAnalysis dari folder Skrip di panel Proyek ke objek Kamera Utama di panel Hierarki. Komponen skrip baru akan ditambahkan ke Kamera Utama.
Bab 7 - Buat kelas ImageCapture
Tujuan dari kelas ImageCapture adalah untuk menghosting metode yang diperlukan untuk berkomunikasi dengan Azure Face Recognition Service Anda untuk menganalisis gambar yang akan Anda tangkap, mengidentifikasi wajah di dalamnya dan menentukan apakah itu milik orang yang dikenal. Jika orang yang diketahui ditemukan, kelas ini akan menampilkan namanya sebagai teks UI dalam adegan.
Untuk membuat kelas ImageCapture :
Klik kanan di dalam folder Skrip yang telah Anda buat sebelumnya, lalu klik Buat, Skrip C#. Panggil skrip ImageCapture.
Klik dua kali pada skrip ImageCapture baru untuk membukanya dengan Visual Studio 2017.
Masukkan namespace berikut di atas kelas ImageCapture:
using System.IO; using System.Linq; using UnityEngine; using UnityEngine.XR.WSA.Input; using UnityEngine.XR.WSA.WebCam;
Di dalam kelas ImageCapture, tambahkan variabel berikut:
/// <summary> /// Allows this class to behave like a singleton /// </summary> public static ImageCapture instance; /// <summary> /// Keeps track of tapCounts to name the captured images /// </summary> private int tapsCount; /// <summary> /// PhotoCapture object used to capture images on HoloLens /// </summary> private PhotoCapture photoCaptureObject = null; /// <summary> /// HoloLens class to capture user gestures /// </summary> private GestureRecognizer recognizer;
Tambahkan metode Awake() dan Start() yang diperlukan untuk menginisialisasi kelas dan memungkinkan HoloLens untuk mengambil gerakan pengguna:
/// <summary> /// Initialises this class /// </summary> private void Awake() { instance = this; } /// <summary> /// Called right after Awake /// </summary> void Start() { // Initialises user gestures capture recognizer = new GestureRecognizer(); recognizer.SetRecognizableGestures(GestureSettings.Tap); recognizer.Tapped += TapHandler; recognizer.StartCapturingGestures(); }
Tambahkan TapHandler() yang dipanggil saat pengguna melakukan gerakan Ketuk:
/// <summary> /// Respond to Tap Input. /// </summary> private void TapHandler(TappedEventArgs obj) { tapsCount++; ExecuteImageCaptureAndAnalysis(); }
Tambahkan metode ExecuteImageCaptureAndAnalysis(), yang akan memulai proses Pengambilan Gambar:
/// <summary> /// Begin process of Image Capturing and send To Azure Computer Vision service. /// </summary> private void ExecuteImageCaptureAndAnalysis() { Resolution cameraResolution = PhotoCapture.SupportedResolutions.OrderByDescending ((res) => res.width * res.height).First(); Texture2D targetTexture = new Texture2D(cameraResolution.width, cameraResolution.height); PhotoCapture.CreateAsync(false, delegate (PhotoCapture captureObject) { photoCaptureObject = captureObject; CameraParameters c = new CameraParameters(); c.hologramOpacity = 0.0f; c.cameraResolutionWidth = targetTexture.width; c.cameraResolutionHeight = targetTexture.height; c.pixelFormat = CapturePixelFormat.BGRA32; captureObject.StartPhotoModeAsync(c, delegate (PhotoCapture.PhotoCaptureResult result) { string filename = string.Format(@"CapturedImage{0}.jpg", tapsCount); string filePath = Path.Combine(Application.persistentDataPath, filename); // Set the image path on the FaceAnalysis class FaceAnalysis.Instance.imagePath = filePath; photoCaptureObject.TakePhotoAsync (filePath, PhotoCaptureFileOutputFormat.JPG, OnCapturedPhotoToDisk); }); }); }
Tambahkan handler yang dipanggil ketika proses pengambilan foto telah selesai:
/// <summary> /// Called right after the photo capture process has concluded /// </summary> void OnCapturedPhotoToDisk(PhotoCapture.PhotoCaptureResult result) { photoCaptureObject.StopPhotoModeAsync(OnStoppedPhotoMode); } /// <summary> /// Register the full execution of the Photo Capture. If successful, it will begin the Image Analysis process. /// </summary> void OnStoppedPhotoMode(PhotoCapture.PhotoCaptureResult result) { photoCaptureObject.Dispose(); photoCaptureObject = null; // Request image caputer analysis StartCoroutine(FaceAnalysis.Instance.DetectFacesFromImage()); }
Ingatlah untuk Menyimpan perubahan sebelum kembali ke Editor Unity.
Bab 8 - Membangun solusi
Untuk melakukan pengujian menyeluruh aplikasi Anda, Anda harus membongkarnya ke HoloLens Anda.
Sebelum melakukannya, pastikan bahwa:
- Semua pengaturan yang disebutkan dalam Bab 3 diatur dengan benar.
- Skrip FaceAnalysis dilampirkan ke objek Kamera Utama.
- Kunci Autentikasi dan Id Grup telah diatur dalam skrip FaceAnalysis.
Titik ini Anda siap untuk membangun Solusi. Setelah Solusi dibuat, Anda akan siap untuk menyebarkan aplikasi Anda.
Untuk memulai proses Build:
Simpan adegan saat ini dengan mengklik File, Simpan.
Buka File, Pengaturan Build, klik Tambahkan Adegan Terbuka.
Pastikan untuk mencentang Proyek Unity C#.
Tekan Build. Setelah melakukannya, Unity akan meluncurkan jendela File Explorer, tempat Anda perlu membuat lalu memilih folder untuk membangun aplikasi. Buat folder tersebut sekarang, dalam proyek Unity, dan sebut saja Aplikasi. Kemudian dengan folder Aplikasi dipilih, tekan Pilih Folder.
Unity akan mulai membangun proyek Anda, ke folder Aplikasi.
Setelah Unity selesai membangun (mungkin perlu waktu), Unity akan membuka jendela File Explorer di lokasi build Anda.
Buka folder Aplikasi Anda, lalu buka Solusi Proyek baru (seperti yang terlihat di atas, MR_FaceRecognition.sln).
Bab 9 - Menyebarkan aplikasi Anda
Untuk menyebarkan di HoloLens:
Anda akan memerlukan Alamat IP HoloLens Anda (untuk Penyebaran Jarak Jauh), dan untuk memastikan HoloLens Anda berada dalam Mode Pengembang. Untuk melakukan ini:
- Sementara mengenakan HoloLens Anda, buka Pengaturan.
- Buka Opsi Tingkat Lanjut Wi-Fi Jaringan & > Internet >
- Perhatikan alamat IPv4.
- Selanjutnya, navigasikan kembali ke Pengaturan, lalu ke Pembaruan & Keamanan > Untuk Pengembang
- Atur Mode Pengembang Aktif.
Navigasi ke build Unity baru Anda ( folder Aplikasi ) dan buka file solusi dengan Visual Studio.
Di Konfigurasi Solusi pilih Debug.
Di Platform Solusi, pilih x86, Komputer Jarak Jauh.
Buka menu Build dan klik Sebarkan Solusi, untuk memuat samping aplikasi ke HoloLens Anda.
Aplikasi Anda sekarang akan muncul dalam daftar aplikasi yang diinstal di HoloLens Anda, siap untuk diluncurkan!
Catatan
Untuk menyebarkan ke headset imersif, atur Platform Solusi ke Komputer Lokal, dan atur Konfigurasi ke Debug, dengan x86 sebagai Platform. Kemudian sebarkan ke komputer lokal, menggunakan menu Build, memilih Sebarkan Solusi.
Bab 10 - Menggunakan aplikasi
Mengenakan HoloLens, luncurkan aplikasi.
Lihat orang yang telah Anda daftarkan dengan Face API. Pastikan:
- Wajah orang tersebut tidak terlalu jauh dan terlihat jelas
- Pencahayaan lingkungan tidak terlalu gelap
Gunakan gerakan ketuk untuk mengambil gambar orang tersebut.
Tunggu hingga Aplikasi mengirim permintaan analisis dan menerima respons.
Jika orang tersebut berhasil dikenali, nama orang tersebut akan muncul sebagai teks UI.
Anda dapat mengulangi proses pengambilan menggunakan gerakan ketukan setiap beberapa detik.
Aplikasi Azure Face API Anda yang sudah selesai
Selamat, Anda membangun aplikasi realitas campuran yang memanfaatkan layanan Azure Face Recognition untuk mendeteksi wajah dalam gambar, dan mengidentifikasi wajah yang diketahui.
Latihan bonus
Latihan 1
Azure Face API cukup kuat untuk mendeteksi hingga 64 wajah dalam satu gambar. Perluas aplikasi, sehingga dapat mengenali dua atau tiga wajah, di antara banyak orang lain.
Latihan 2
Azure Face API juga dapat memberikan kembali semua jenis informasi atribut. Integrasikan ini ke dalam aplikasi. Ini bisa lebih menarik, jika dikombinasikan dengan API Emosi.