Kali ini kita akan mencoba untuk membuat emoji tangan secara real time, yang biasanya digunakan pada aplikasi chat. Disini kita akan memanfaatkan gesture tangan yang akan kita capture nantinya kemudian diaplikasikan menggunakan emoji tangan. Previewnya seperti dibawah ini.
Baik sebelum kita bahas silahkan download dulu file-filenya DISINI. Saya mencoba menggunakan python versi 3.5 dimana menggunakan NVIDIA GPU 920MX untuk merunning model. Alur yang kita gunakan pada percobaan kali ini yaitu :
- Membuat Dataset hand gesture untuk masing – masing emoji
- Mengubah gambar menjadi matriks – matriks pixel
- Training data menggunakan model CNN
- Menggunakan model untuk hand expression
1. Membuat Dataset Hand Gesture
Dataset yang akan kita gunakan adalah hand gesture yang akan kita capture menggunakan sebuah program yang akan kita buat. Sebelum itu anda juga bisa melihat post sebelumnya tentang Finger Gesture Menggunakan Opencv. Kita bisa mengatur banyak capture yang ingin di ambil, pada percobaan kali ini menggunakan gambar yang akan dicapture sebanyak 1200 gambar dan 11 gesture. Kemudian juga kita menggunakan ukuran gambar 50x50, ini tergantung anda bisa menggantinya sesuka anda tetapi, nantinya akan berimbas terhadap proses training. Semakin besar atau banyak pixel gambar yang digunakan maka proses training juga akan semakin lama. Gambar yang dihasilkan nantinya memiliki skala keabuan grayscale.
Untuk membuat dataset ini anda cukup merunning file BuatGest.py dengan cara python BuatGest.py . Setelah itu masukkan nomor gesture yang sesuai dengan emoji yang akan dibuatkan datasetnya. Setelah terbuka frame Capture, sesuaikan hand gesture dengan emoji kemudian tekan tombol c pada keyboard untuk mulai mengcapture gesture. Usahakan tangan tidak bergerak dan sesuaikan gesture dengan emoji agar mendapatkan hasil yang lebih baik saat proses training. Lakukan hal yang sama untuk gesture yang lainnya, Untuk lebih jelasnya liat gambar dibawah ini.
2. Mengubah Gambar Menjadi Matriks
Dari dataset yang telah kita buat akan kita bentuk kedalam matriks dimana akan disimpan kedalam file csv. Tujuan membuat matriks pixel ini karena nantinya untuk melakukan training model itu menggunakan pembacaan perpixel untuk pengenalan gambarnya. sehingga untuk membuat gambar dapat terbaca maka perlu diconvert kedaalam bentuk pixel - pixel yang disimpan dalam csv. Karena gambar yang digunakan mempunyai ukuran pixel 50x50, sehingga nantinya akan terdapat 2501 kolom dan juga akan ada 13200 row karena ada 1200 gambar tiap gesture. Kolom pertama merupakan label atau jenis gesture kemudian kolom selanjutnya merupakan pixel-pixel perhatikan gambar dibawah ini.
Untuk kebanyakn citra digital 8 bit, maka sistem greyscale diukur berdasarkan skala intensitas kecerahan, yang bernilai 0-255. 0 adalah hitam pekat dan 255 adalah yang terputih. pada gambar diatas juga dapat dilihat terdapat gambar dengan intensitas 0 dan juga 255.
Kemudian untuk mengconvert kedalam matriks anda perlu merunning BuatCSV.py dengan perintah python BuatCSV.py . Tunggu sesaat setelah itu akan ada file train_gest.csv di direktori yang digunakan.
3. Training Data
Oke kita masuk kedalam proses training, dimana disini kita menggunakan model Convolution Neural Networks (CNN). Kita disini juga menggunakan keras dan backend tensorflow. CNN merupakan salah satu metode untuk klassifikasi gambar yang sangat baik. CNN pernah di cobakan pada ajang imagenet 2012 dan memiliki hasil tingkat akurasi yang lebih baik daripada algoritma lainnya. CNN ini dibagi menjadi 2 part yang pertama yaitu feature extraction dan Fully connected layer (MLP). Didalam feature extraction terdapat prosess convolution dan pooling layer dimana disitu juga terdapat fungsi activasi. Kemudian pada MLP ini merupakan neural network yang digunakan untuk melakukan prediksi dari hasil inputan pada feature extraction, perhatikan gambar dibawah ini.
Kenapa disini kita menggunakan keras? keras merupakan salah satu neural networks API yang bisa berjalan diatas tensorflow, CNTK, dll. Keras lebih simple daripada menggunakan langsung tensorflow untuk merunning model. Dari segi code, keras lebih mudah dipahami.
Kode dibawah ini merupakan struktur model yang akan kita gunakan untuk percobaan kali ini. Pada keras terdapat dua model yaitu Squential dan Functional API. Keras Functional API adalah cara untuk menentukan model yang kompleks, seperti model multi-output, grafik asiklik langsung, atau model dengan lapisan bersama sedangkan Model Sekuential adalah tumpukan lapisan linear. Dsini kita akan menggunakan model squential dimana model ini lebih simple dan mudah.
Pada line 4 ini merupakan layer convolution dimana banyak filter yang digunakan yaitu 32 dengan ukuran 5x5 dan fungsi aktifasi relu.Kita menggunakan relu karena dari beberapa penelitian relu memberikan kecepatan pada proses training. Kemudian line 5 adalah Layer pooling menggunakan max pooling layer dengan size 2x2 dan stride 2x2. Pooling layer mempunya dua jenis yaitu max pooling dan average pooling. Pada max pooling dari ukuran layer diambil nilai tertinggi atau maksimum sedangkan pada average pooling mengambil nilai rata - rata dari ukuran layer, lihat gambar dibawah ini.
Kemudian line 6-7, sama seperti line 4-5 perbedaannya yaitu ukuran filter yang lebih besar dan juga penggunakan aktivasi sigmoid. Dari hasil Proses feature extraction kita akan mendapatkan hasil feature map dimana berisi informasi yang didapat dari proses convolution.
Selanjutnya kita akan masuk ketahapan fully connected layer(line 8-11), pada line 11 kita menggunakan softmax dimana berfungsi untuk melakukan klasifikasi dari hasil layer sebelumnya. Softmax memberikan hasil yang lebih intuitif dan juga memiliki interpretasi probabilistik yang lebih baik dibanding algoritma klasifikasi lainya. Pada line 13 kita juga menggunakan loss function yaitu categorical_crossentropy dan optimizer adam. Adam memiliki beberapa kelebihan yaitu mudah digunakan, menggunakan memori sedikit, dan efisiensi secara komputasi.
Kemudian selanjutnya yaitu pengaturan data train dan data test yang akan digunakan. Untuk data train sendiri kita akan menggunakan 90% dari data atau sekitar 12000 gambar dan test sendiri 1201 gambar. Alasan disini kita menggunakan 90% untuk asumsi bahwa pembelajaran yang semakin banyak akan membuat hasil dari pembelajaran itu juga semakin baik. Walaupun tidak selamanya begitu, kita harus mencoba melakukan perbandingan dengan persentase yang lainnya.
Setelah proses training nantinya akan didapatkan sebuah model hasil dari training tersebut. Model ini nantinya akan digunakan untuk memprediksi hasil hand expression yang kita masukkan. Untuk proses training cukup dengan merunning file dengan cara Python TrainHandExp.py.
4. Hand Expression
Setelah pembuatan model selanjutnya kita akan mencoba melakukan prediksi atau hand expression secara realtime. Dalam proses ini nantinya gambar input yang masuk melalui webcam akan diproses seperti data yang digunakan untuk prediksi yaitu pengaturan ukuran gambar dan reshape image. Untuk merunning codenya cukup dengan perintah python Hand_Exp.py maka akan didapat hasil berikut ini.
Jika ada yang mau didiskusikan langsung saja di komentar atau di menu Forum untuk kita bahas sama sama. Jika ada kesalahan mohon maaf kami juga sedang dalam proses pembelajaran terimakasih
Hand Expression Menggunakan Convolution Neural Networks
Reviewed by Jimmy Pujoseno
on
July 18, 2018
Rating:
Bisa bagi kontak yg dpt dihubungin. Saya mau belajar tentang metode CNN untuk kebutuhan skripsi. Terima kasih
ReplyDeletebisa menghubungi kontak yang ada di jasa olah data kak terimakasih
DeletePermisi ka, mau nanya, kira kira kalau untuk mendeteksi kebasahan tangan pake kamera bisa ngg yaa? jadi rencananya aku mau pake lampu disamping kamera, nah pantulan lampu dari tangan yang basah jadi input ke kameranya, biasanya kan kalau tangan basah terus kena cahaya, itu pantulannya lebih terang ke kameranya, nah tingkat banyaknya pantulan cahaya itu bakal jadi input untuk proses selanjutnya.. kira kira bisa direalisasikan ga ya ka? mohon bantuannya hehe :)
ReplyDelete