Forumda bir şeyler paylaşmayalı uzun zaman oldu. Bugün de girmişken daha önceden yaptığım bir projeyi sizlerle paylaşmak istedim. Projeyi yaparken kurguladığım olay Instagram hesabımdan takip ettiğim kişileri gerçekten takip edebilir miyim? Sorusuyla ortaya çıktı.
Algoritma genel olarak şu şekilde:

Bunu yapmak için elimizde arkadaşlarımızın yüzünün net bir şekilde görülebildiği fotoğrafları ve Herkese açık mobese kameraları gerekiyor. Aynı zamanda görüntüde yüzü eşleştirebilmek için face_recognition kütüphanesine ihtiyacınız var.
Başlayalım
1. Adım gerekli kütüphanelerin kurulması
Terminal kullanıyorsanız pip komutu ile gerekli kütüphaneleri indirebilirsiniz. Eğer Anaconda,vscode vb. yazılımlar kullanıyorsanız kendi paket yöneticileri ile veya yine terminal yardımıyla kütüphaneleri indirebilirsiniz.
Kod:
pip install beautifulsoup4
pip install opencv-python
pip install face_recognition
pip install selenium
pip install requests
pip install numpy
2.adım main.py adında bir dosya oluşturalım. İçerisine aşağıda belirttiğim kodları yazalım.
Kod:
import photocollect #daha sonrasında photocollect.py adında bir dosya oluşturacağız onu çağırmak için.
import usernames #daha sonrasında usernames adında bir dosya oluşturacağız onu çağırmak için.
import argparse # terminalden girilen kullanıcı adını yakalamak için
import time
##kullanıcı adını yakala
uname = argparse.ArgumentParser()
uname.add_argument("-u", "--username", required=True,help="User Name")
args = vars(uname.parse_args())
uname = args["username"]
##
##usernames dosyasında getfollowing fonksiyonuna uname değişkenini gönder.
print("Collecting Following usernames")
usernames.getfollowing(uname)
print("Collected Successfull")
##
## toplanan kullanıcı adlarını photocollect.py dosyasında main fonksiyonuna gönder(resimleri indirmek için)
file = open("userlist.txt","r")
for i in file:
print(i.split("\n")[0])
print("Collecting Photos")
photocollect.main(i.split("\n")[0])
print("Collected Successfull")
print("Saved File : " + i.split("\n")[0] + ".jpg")
time.sleep(0.1)
file.close()
##
3.adım photocollect.py adında bir dosya oluşturalım. İçerisine aşağıdaki kodları yazalım.
Kod:
import urllib.request ## url ye istek atmak için
import requests
import re
import sys
from bs4 import BeautifulSoup # url den gelen veriyi işlemek için
## kullanıcı adının profiline git ve resimleri indir
def download(username):
url = "https://www.instagram.com/{}/?__a=1".format(username)
r = requests.get(url)
if r.ok:
data = r.json()
## return data['graphql']['user']['profile_pic_url_hd']
## resimleri kaydet
def main(username):
file_url = download(username)
fname = username + ".jpg"
r = requests.get(file_url, stream=True)
if r.ok:
with open("photos/" + fname, 'wb') as f:
f.write(r.content)
##
4.adım Ardından usernames.py adında bir dosya oluşturalım içerisine aşağıdaki kodları yazalım.
Kod:
from selenium import webdriver ## gramho üzerinden kullanıcıları toplamak için burada request kullanmamamızın sebebi sayfada sürekli olarak aşağıya inmeniz gerekiyor request kütüphanesiyle bu işlemi yapmak biraz zor.
import time
def getfollowing(username):
browser = webdriver.Firefox() #firefoxu aç
browser.get("https://gramho.com/following/" + username) #takip ettiğin kullanıcıları görmek için gramho sitesine git
time.sleep(3)
for scroll in range(0,15):
browser.execute_script("window.scrollTo(0,******** .body.scrollHeight)") # 3 saniyede bir ekranı kaydır.
time.sleep(0.3)
userlist = open("userlist.txt", "w") #userlist.txt adında bir dosya oluştur.
kullanicilar = browser.find_elements_by_css_selector("span[class$='username']") # takip ettiğin kullanıcıları topla
for kullanici in kullanicilar: # bütün kullanıcıları for döngüsüne al
userlist.write(kullanici.text.replace("@", "") + "\n") # başlarında bulunan @ işaretini sil ve userlist.txt e kaydet
print(kullanici.text.replace("@", "")) @ekrana yazdır
5.adım ardından son olarak görüntü işleme kodlarımızı yazacağımız facecomp.py adında bir dosya oluşturuyoruz.
Kod:
import face_recognition #face_recognition kütüphanemizi import ediyoruz
import cv2 # opencv
import numpy as np
import os
file = open("userlist.txt","r") #userlisti aç
video_capture = cv2.VideoCapture(0) # burası önemli buraya mobese kameranızın urlsini yazmanız gerekiyor. benim hazırlamış olduğum hazır mobese urllerine buradan ulaşabilirsiniz: https://raw.githubusercontent.com/en...ster/mobese.py
## verilerimizin yazılacağı 2 adet liste oluşturuyoruz
known_face_names = []
known_face_encodings = []
##
## kullanıcılarda insan yüzü arama ve varsa insan yüzünü encode edip face_recognitiona yazdırma (bunu anlamlandırabilmek için face_recognition kütüphanesine hakim olmanız gerekebilir.)
for i in file:
username = i.split("\n")[0]
try:
image = face_recognition.load_image_file("photos/" + username+ ".jpg")
face_********s = face_recognition.face_********s(image)
except:
print("Böyle bir fotoğraf yok")
if(len(face_********s) == 0):
print(username + " Bu fotoğrafta herhangi biri yok. Siliniyor...")
os.remove("photos/" + username + ".jpg")
else:
encoding = face_recognition.face_encodings(image)[0]
known_face_encodings.append(encoding)
known_face_names.append(username)
print(username+ " işlendi!")
##
face_********s = []
face_encodings = []
face_names = []
process_this_frame = True
##görüntüyü işlemeye başla
while True:
ret, frame = video_capture.read()
small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)
rgb_small_frame = small_frame[:, :, ::-1]
if process_this_frame:
face_********s = face_recognition.face_********s(rgb_small_frame)
face_encodings = face_recognition.face_encodings(rgb_small_frame, face_********s)
face_names = []
for face_encoding in face_encodings:
matches = face_recognition.compare_faces(known_face_encoding s, face_encoding)
name = "Unknown"
face_distances = face_recognition.face_distance(known_face_encoding s, face_encoding)
best_match_index = np.argmin(face_distances)
if matches[best_match_index]:
name = known_face_names[best_match_index]
face_names.append(name)
process_this_frame = not process_this_frame
for (top, right, bottom, left), name in zip(face_********s, face_names):
top *= 4
right *= 4
bottom *= 4
left *= 4
cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)
cv2.rectangle(frame, (left, bottom - 35), (right, bottom), (0, 0, 255), cv2.FILLED)
font = cv2.FONT_HERSHEY_DUPLEX
cv2.putText(frame, name, (left + 6, bottom - 6), font, 1.0, (255, 255, 255), 1)
cv2.imshow('Video', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
video_capture.release()
cv2.destroyAllWindows()
##
Umarım sizlere biraz ilham verebilmişimdir. Kodlara github üzerinden erişmek isterseniz veya çalışan bir demo videosu izlemek isterseniz: Github adresinden erişebilirsiniz