×

Sortir Foto Wajah dengan Facenet

Sortir Foto Wajah dengan Facenet

1,874 Views

Sortir Foto Wajah dengan Facenet – face detection adalah tugas computer vision yang menurut manusia adalah hal yang sangat mudah, namun bagi komputer merupakan pekerjaan yang cukup rumit bahkan dikatakan terlalu rumit. Pada library Computer vision seperti OpenCV yang cukup cepat menggunakan haarcascade classifier viola jones dan integral image. Algoritma ini cukup robust dan ringan, saya biasa menggunakan face detection ini untuk keperluan sederhana saja. Namun ketika saya uji untuk melakukan sortasi media gambar dari WA yang mencapai ribuan file ternyata akurasi cukup payah!

Sortasi Face detection

Jadi ceritanya ketika saya akan remove duplikasi gambar, butuh juga sortasi file yang bukan wajah (dibuang saja) maklum grup WA yang saya ikuti lumayan banyak dan hanya butuh 6 bulan saja file media gambar/foto sudah mencapai belasan ribu dan cara copy paste nya pun saya pakai media transfer protocol . Tentu akan sangat melelahkan ketika sortir satu-persatu. Oleh sebab itu kita butuh algoritma khusus untuk face detection. Bagi pengguna OpenCV tentu tidak asing lagi dengan haar cascade untuk melakukan face detection. Berikut kode yang kita gunakan.

import cv2
import os
import shutil
from matplotlib import pyplot as plt

# Load the cascade
face_cascade = cv2.CascadeClassifier('C:\\opencv\\sources\data\\haarcascades_cuda\\haarcascade_frontalface_default.xml')

import glob

files = glob.glob("E:\\Entertainment\\segera di sortir\\*.jpg")
for f in files:
    img = cv2.imread(f)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # Detect the faces
    faces = face_cascade.detectMultiScale(gray, 1.1, 4)
    print(f)
    plt.figure()
    if len(faces)>0:
        for (x, y, w, h) in faces:
            cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
        # Display        
        plt.imshow(img,cmap='gray')
        plt.title(os.path.basename(f))
        plt.show()
        print(f)
        src_path = f
        dst_path = "E:\\Entertainment\\result\\"+os.path.basename(f)
        shutil.move(src_path, dst_path)

folder  E:\\Entertainment\\segera di sortir\\*.jpg berisi belasan ribu file yang akan dibersihkan sehingga gambar bukan wajah akan di cut ke folder dst_path = "E:\\Entertainment\\result\\"+os.path.basename(f).Ternyata hasil face detection menggunakan OpenCV haarcascade kurang memuaskan yaitu masih banyak gambar bukan wajah dikategorikan sebagai wajah.

See also  Cara menangani dataset yang besar

Deep Machine Learning Pytorch

Solusi yang lain tentu harus menggunakan deep machine learning dengan algoritma Pretrained Pytorch face detection (MTCNN) and facial recognition (InceptionResnet) models, yup saya lebih suka menggunakan pytorch daripada tensorflow yang njlimet dan kode functionnya tidak bersih. Kode Snipet yang saya gunakan cukup simple koq yaitu

from facenet_pytorch import MTCNN
import torch
from PIL import Image, ImageDraw
from IPython import display
from matplotlib import pyplot as plt



device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
print('Running on device: {}'.format(device))

mtcnn = MTCNN(keep_all=True, device=device)


frame = Image.open("D:/face.jpg")
# Detect faces
boxes, prob = mtcnn.detect(frame)
if prob[0]!=None:
    frames_tracked = []
    # Draw faces
    frame_draw = frame.copy()
    draw = ImageDraw.Draw(frame_draw)
    for box in boxes:
        draw.rectangle(box.tolist(), outline=(255, 0, 0), width=6)
    
    # Add to frame list
    frames_tracked.append(frame_draw)    
    
    plt.figure()
    plt.imshow(frames_tracked[0])
    plt.show()
    
else:
    print('tidak ada!')

Variabel  prob berisi nilai probabilitas wajah dimulai dari 0 sampai 1

 

face detection menggunakan deep machine learning lebih bagus akurasinya, setidaknya backup data dan sortasi akan terasa lebih mudah cukup sembari nyeruput kopi dan komputer akan bekerja untuk melakukan pekerjaannya dengan baik! Apakah kalian punya pengalaman menarik untuk dibagi??

 

Sortir Foto Wajah dengan Deep Machine Learning

Berikut kode yang digunakan untuk melakukan sortir wajah, dimana akan di move file tersebut kedalam 2 folder yaitu

  • wajah
  • Bukan Wajah

Kode seperti diatas, hanya saja telah dilengkapi buat looping file, berikan saja nama sortir.py

thub.com/timesler/facenet-pytorch
from facenet_pytorch import MTCNN
import torch
from PIL import Image, ImageDraw
from IPython import display
from matplotlib import pyplot as plt
import glob
import os
import shutil


#seting folder untuk wajah dan non wajah
if os.path.exists('Wajah')==False:
    os.mkdir('Wajah')
if os.path.exists('Bukan Wajah')==False:
    os.mkdir('Bukan Wajah')


device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
print('Running on device: {}'.format(device))

mtcnn = MTCNN(keep_all=True, device=device)

files = glob.glob('PHOTOS/*.jpg') #baca semua file pada lokasi folder tersebut 
index = 1
for f in files:
    nama_file = os.path.basename(f)
    frame = Image.open(f)
    print(nama_file,index)
    # Detect faces
    boxes, prob = mtcnn.detect(frame)
    if prob[0]!=None:
        frames_tracked = []
        # Draw faces
        frame_draw = frame.copy()
        draw = ImageDraw.Draw(frame_draw)
        for box in boxes:
            draw.rectangle(box.tolist(), outline=(255, 0, 0), width=6)
        
        # Add to frame list
        frames_tracked.append(frame_draw)    
        
        # plt.figure()
        # plt.imshow(frames_tracked[0])
        # plt.show()
        
        # copy file
        shutil.copyfile(f,'Wajah/'+nama_file)
        
    else:
        print('tidak ada!')
        # plt.figure()
        # plt.imshow(frame)
        # plt.show()

        # copy file
        shutil.copyfile(f,'Bukan Wajah/'+nama_file)
    
    
    index = index+1
    os.remove(f) #hapus file yang telah dibaca

Kode diatas sangat membantu sekali buat sortir ribuan file dari media WA buat di backup dan menyimpan foto-foto kenangan. Untuk menjalan kode diatas, saya sarankan menggunakan mode CLI saja karena CPU akan sangat bekerja keras. Caranya mudah buka command prompt ketikan

Akhirnya kerjaan buat backup ribuan  file gambar dapat diatasi dengan mudah.

You May Have Missed