Sortir Foto Wajah dengan Facenet
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.
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
python sortir.py
Akhirnya kerjaan buat backup ribuan file gambar dapat diatasi dengan mudah.