Мне надоели фильтры Instagram, дающие случайные результаты, поэтому я решил создать свой фильтр, который работает с искусственным интеллектом и дает более точные результаты, чем другие фильтры Instagram. Полный код здесь

Проект состоит из двух основных этапов. 1. Соберите данные. 2. Создайте модель и получите результаты.

Для данных я выбираю стоковые изображения и сохраняю их в папке

Я собрал только 16 изображений. Если у вас будет больше данных, вы получите более точные результаты.

Давайте создадим модель

Я думал, что в структуре проекта будет детектор лиц, и результаты будут написаны над ограничивающей рамкой лица точно так же, как фильтр в Instagram. Поэтому я выбираю «OpenCV фронтальный хааркаскад».

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

Чтобы найти похожие лица, я воспользуюсь библиотекой face_recognition. Логика системы распознавания этой библиотеки выглядит так:

Когда мы используем:

face_similarity=face_recognition.face_distance([me_encode], encodings_database[i])

Дает нам число от 0 до 1. Чем ближе к нулю, тем больше похоже. Это прекрасная функция для моего проекта. Я собираюсь сравнить все изображения базы данных с моим изображением, найти эти результаты между 0 и 1 и сохранить их в списке. В качестве последнего шага я просто найду минимальный элемент, чтобы найти человека, который больше всего похож на меня.

def similar_face_finder(faces):
    img_database=[]
    celebrety_names=[]
    def load_images_from_folder(faces):
        for filename in os.listdir(faces):
            celebrety_names.append(filename)
            img=face_recognition.load_image_file("faces/"+filename)
            if img is not None:
                img_database.append(img)
    load_images_from_folder(faces)

    encodings_database=[]
    def encodings(img_database):
        for i in range(len(img_database)):
            img_encoder=img_database[i]
            encodingss=face_recognition.face_encodings(img_encoder)[0]
            encodings_database.append(encodingss)
    encodings(img_database)

    me=face_recognition.load_image_file("current.jpg")
    me_encode=face_recognition.face_encodings(me)[0]

    similarity_data=[]
    for i in range(len(encodings_database)):
        a=face_recognition.face_distance([me_encode], encodings_database[i])
        similarity_data.append(a)

    most_similar=min(similarity_data)
    index_of_most_similar=similarity_data.index(most_similar)
    img_rgb = cv2.cvtColor(img_database[index_of_most_similar], cv2.COLOR_BGR2RGB)
    img_rgb=cv2.resize(img_rgb,(400,350))
    celebrety_names=celebrety_names[similarity_data.index(most_similar)]
    return img_rgb,celebrety_names

Да, все готово, но последнее, но не менее важное: нам нужно сделать нашу текущую фотографию для сравнения с базой данных:

return_value, image_currett = cap.read()
cv2.imwrite('current.jpg', image_currett)
my_similar_face,celebrety_name=similar_face_finder(faces)

Приведенные выше строки дают нам наше текущее изображение.

Давайте сделаем внешний вид фильтром

На первом экране будет сказано, что мы нажимаем «буква», чтобы увидеть вашу знаменитость, поэтому давайте закодируем ее:

while cap.isOpened():
    _, img = cap.read()
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    facess = face_cascade.detectMultiScale(gray, 1.1, 4)
    for (x, y, w, h) in facess:
        cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 3)
        cv2.putText(img, "Press T to see your celebrity", ((x-120)+(x-w),(y-120)+(y-h)), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0,255), 2, cv2.LINE_AA)
    cv2.imshow('YOU', img)

    if cv2.waitKey(1) & 0xFF == ord('t'):
        break

сразу после этого экрана я просто покажу знаменитость и ее имя:

while cap.isOpened():
    _, img = cap.read()
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    facess = face_cascade.detectMultiScale(gray, 1.1, 4)
    for (x, y, w, h) in facess:
        cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 3)
        cv2.putText(img, "Celebrity you look like: ", ((x-120)+(x-w),(y-120)+(y-h)), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0,255), 2, cv2.LINE_AA)
        cv2.putText(img, celebrety_name[:-3], ((x-80) + (x - w), (y-80) + (y - h)), cv2.FONT_HERSHEY_SIMPLEX,
                    1, (0, 0, 255), 2, cv2.LINE_AA)
    cv2.imshow('YOU', img)
    cv2.imshow("SIMILAR", my_similar_face)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

Наш фильтр создан и выглядит потрясающе

Если вам понравилась эта история, не забудьте подписаться.

Для моих проектов с открытым исходным кодом: https://github.com/muratali016