[PYTHON] Jusqu'à ce que vous créez un site où vous pouvez rechercher des images similaires (vidéos érotiques) du visage spécifié par Sakura VPS + django + scikit-learn

** En utilisant le VPS, Django et scikit-learn de Sakura, j'ai créé un site Web sur lequel vous pouvez rechercher des images similaires d'AV avec des actrices AV similaires à l'image du visage qui vous tient à cœur. ** **

Le nom du site est Like Navi

J'ai utilisé unity, open-GL et Objective-C parce que je développais des applications jusqu'à présent, mais j'ai enregistré l'historique de la création de services Web à partir de zéro dans le but d'étudier Python et l'apprentissage automatique et les avantages pratiques. Je vais.

Je pense que tous les points auxquels s'intègrent les débutants sont dépendants, donc je pense que cela sera utile pour les débutants.

Au fait, je n'ai pas utilisé SIFT ou CNN parce que la précision des types BOVW était faible et que la dimension devenait grande et que la quantité de calcul augmentait. Si je faisais CNN, je devais extraire des images de la vidéo, ou je sentais qu'il n'y avait pas assez d'échantillons, alors j'ai abandonné parce que c'était une mauvaise machine.

Histoire originale: Technologie de reconnaissance d'image AV et ses environs ** Merci! **

table des matières

------------ Travail local ----------------

------------ Travail côté serveur ----------------

[1] Grattage de l'image du visage d'une actrice audiovisuelle de DMM.

Je n'expose pas le code car il est normal de ne pas donner le script à utiliser pour l'exploration, J'ai utilisé python et BeautifulSoup4.

Voir Scraping with Python and Beautiful Soup et il sera résolu pendant des générations.

[2] Extraire l'image du visage et extraire l'histogramme de l'image du visage avec opencv

Il est difficile de construire opencv lui-même, mais si vous le faites localement ou sur un Mac, installez anaconda et installez-le.

pip install anaconda conda install -c https://conda.binstar.org/jjhelmus opencv

Il peut être utilisé simplement en tapant les deux commandes. Facile.

Cette zone sera utile Essayez d'extraire une image de visage d'une vidéo en utilisant Python (Anaconda) et OpenCV Effectuer la reconnaissance faciale avec OpenCV, couper et enregistrer uniquement la partie faciale [Python]

# -*- coding:utf-8 -*-
import cv2
import sys
import os
import shutil

image_path = "image.png "#Chemin d'image arbitraire

#Acquérir la quantité de caractéristiques du classificateur en cascade
face_cascade = cv2.CascadeClassifier('[yourdir]/opencv/data/haarcascades/haarcascade_frontalface_default.xml')

#Lecture de fichier
image = cv2.imread(image_path)#Chemin d'image arbitraire

#Conversion de l'échelle de gris
image_gray = cv2.cvtColor(image, cv2.cv.CV_BGR2GRAY)


#Exécution de la reconnaissance d'objets (reconnaissance faciale)
faces = cascade.detectMultiScale(image_gray, scaleFactor=1.2, minNeighbors=2, minSize=(10, 10))


#Créer un annuaire
if len(faces) > 0:
	path = os.path.splitext(image_path)
	dir_path = path[0] + '_face'
	if os.path.isdir(dir_path):
		shutil.rmtree(dir_path)
	os.mkdir(dir_path)

i = 0;
for rect in faces:
	#Découpez seulement le visage et enregistrez
	x = rect[0]
	y = rect[1]
	width = rect[2]
	height = rect[3]
	dst = image[y:y+height, x:x+width]
	new_image_path = dir_path + '/' + str(i) + path[1];
	cv2.imwrite(new_image_path, dst)#Entrez le chemin pour enregistrer l'image recadrée ici
	i += 1

Après l'extraction de l'image du visage, les caractéristiques HOG (histogrammes de dégradés orientés) sont extraites.

Référence pour les fonctionnalités HOG: Extraction des fonctionnalités HOG à partir d'images

Très simple

hog=cv2.HOGDescriptor()
img=cv2.imread('test.jpg')
res=hog.compute(img)

Dis le. Avec cela, la représentation distribuée de l'image peut être prise.

[3] Créez un modèle qui classe des images de visage données en compressant les dimensions pca et kmeans.

Cependant, le problème avec les fonctionnalités HOG est la malédiction de la dimension. Normalement, si vous essayez de calculer la similitude entre près de 300000 images et un site Web et de la renvoyer, il est impossible en termes de montant de calcul, il est donc nécessaire de regrouper (kmeans) les résultats de la compression de dimension (PCA) et de la PCA.

Tout d'abord, nous devons obtenir une représentation distribuée pour toutes les images, donc J'ai créé une classe ci-dessous pour lire les images par lots pour chaque dossier.

from PIL import Image
import os
import cv2
from sklearn.cluster import KMeans
import numpy as np
import random
import pickle
import re
import sklearn
import dill



class Imageob(object):
	def __init__(self):
		pass

	def fileread(self, filepath):
		self.path = filepath
		try:
			temp = cv2.imread(filepath)
			self.src = cv2.resize(temp,(64,64))
			self.shape = temp.shape
			
		except cv2.error as e:
			pass

	def readArray(self, array):
		self.srcGrey = array


class Images(object):
	def __init__(self):
		self.images = []

	def addImage(self, image):
		self.images.append(image)

	def readAllFiles(self, folderpath, isResize=False, height=256, width=256):

		for path in self.readAllFilePath(folderpath):
			p = path.replace(folderpath, "")
			p = p.split("/")
			m= m+1

			image = Imageob()
			image.fileread(path)

			if image.shape[0] > 50: #Supprimer les images trop petites
				pi = ProcessImage()
				image = pi.resize(image, 64, 64)
				self.addImage(image)
				n = n+1


	def readAllFilePath(self, folderpath):
		for root, dirs, files in os.walk(folderpath):
			for file in files:
				if not file.startswith(".") and file.endswith(".jpg "):
					yield os.path.join(root, file)

#Extraire les fonctionnalités HOG d'ici

images = Images()
print("Commencez à charger l'image")

images.readAllFiles("/image_path")#Spécifiez le dossier contenant l'image du visage

data = []
label = []
num = 0

for image in images.images:
	hog = cv2.HOGDescriptor((64, 64), (16, 16), (8, 8), (8, 8), 9)
	img_ = cv2.imread(image.path)
	img_ = cv2.resize(img_,(64,64))
	try:
		hist = hog.compute(img_)
		k = [] #Créez une expression de liste comme numpy.
		if hist is not None:
			for i in hist:
				k.append(i[0])
		else:
			print("hist is NONE")

		data.append(k)

	except cv2.error as e:
		pass


npdata = np.array(data) # scikit-np à utiliser avec learn.Transformez-le en format tableau

pca = sklearn.decomposition.PCA(100)
pca.fit(npdata)

X_pca= pca.transform(npdata)

a =[] #Mettez l'histogramme dans le format de liste créé ci-dessus

for x in X_pca:
   a.append(x)

kmeans_model  = KMeans(n_clusters=10, random_state=10).fit(a)
labels = kmeans_model.labels_

Vous disposez maintenant d'un modèle PCA et d'un modèle Kmeans. Si vous faites une classe merdique comme moi et créez une classe avec des éléments enfants, J'ai des problèmes avec Python pickle que je ne peux pas sérialiser. Il est recommandé de le conserver avec de l'aneth car il n'est pas lourd et il sera permanent.

Solution de contournement pour le problème que Python pickle ne peut pas sérialiser

Après cela, si vous écrivez comme suit, vous pouvez calculer la similitude COS en donnant le chemin de l'image

def cos_sim(v1, v2):
	return np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))

class Hog(object):
	def __init__(self):
		pass

	def hog(self, path):
		hog = cv2.HOGDescriptor((64, 64), (16, 16), (8, 8), (8, 8), 9)
		img = cv2.imread(path)
		img = cv2.resize(img , (64, 64))

		t = []
		try:
			hist = hog.compute(img)
			k = []
			if hist is not None:
				for i in hist:
					k.append(i[0])
			else:
				print("hist is NONE")
			t.append(k)

		except cv2.error as e:
			print('cv2_error')
		return t


Après avoir donné une image, prenez la quantité d'entités HOG, compressez les dimensions à l'aide du modèle d'analyse en composantes principales, estimez le cluster auquel il appartient à l'aide du modèle Kmeasn basé sur celui-ci et estimez la similitude avec toutes les images de ce cluster. Calculez simplement.

Les sites auxquels j'ai fait référence sont ci-dessous. (Le code source est définitivement plus propre ici.)

J'ai essayé de classer les photos de visage d'anime par sac de mots-clés

Comment utiliser KAZE Mesure de la quantité de fonctionnalités (ORB / AKAZE / KAZE / FAST / BRISK) avec OpenCV3.0.0-dev + Python2.7.6

[4] Créer un site en utilisant django

À ce stade, le reste est comme un tutoriel Je l'ai fait en regardant ici.

Introduction à Python Django

[5] Demander à Cloudworks de créer du HTML et de la conception

Pour être honnête, la conception et le balisage sont les travaux les moins appropriés, alors je les ai externalisés. Comme ça. Soit dit en passant, l'investissement n'a pas du tout été récupéré. Il n'y a aucune perspective de rétablissement.

Conception / codage de l'écran de "Like Navi !!" rempli de romance d'un homme

[6] Créez un script pour découper une image de visage à l'aide de CropperJS

Il semble que JS ne soit pas bon dans ce domaine, j'ai donc décidé de l'implémenter ici.

Cropper.js

C'était une bibliothèque qui extrait des images très pratiques sur le navigateur car les smartphones sont également optimisés tels quels. C'est écrit ici facilement

Essayez d'utiliser le plug-in jquery "Cropper" qui recadre les images

Sentiment que vous pouvez comprendre en jouant avec la démo de base.

D'ici côté serveur

[7] Créez un environnement pour les vps Sakura tels que opencv, virtualenv, mod_wsgi, scikit-learn, django, etc.

Pour être honnête, cela a pris le plus de temps.

--Ajoutez python Installez Python 2.7 sur CentOS 6.5 et utilisez-le avec Apache

En premier lieu, la version de python 2.6.6 dans CentOS 6.5 de Sakura VPS est différente de celle de mod_wsgi, et une erreur s'est produite. De plus, cela ne génère pas d'erreur django, et c'est vraiment ennuyeux car la requête ne revient pas sur un écran blanc.

--Virtualenv De ici. Ceci est essentiel car sans cela, vous ne sauriez normalement pas à quelle bibliothèque le chemin fait référence.

--OpenCV dans CENTOS6.5 (peut-être le plus difficile de tous les processus)

Voyons ce qui suit comme référence. Probablement le plus dur. #Je ne me souviens vraiment pas. Au fait, c'était un cauchemar que je ne puisse pas utiliser le serveur si j'écrasais brillamment sans sauvegarder les fichiers dépendants.

Essayez d'installer OpenCV3.0 sur AMI Notes de travail avec OpenCV3.0 et opencv_contrib dans ubuntu [Package requis lors de l'utilisation d'openCV avec CENTOS6](http://www.gimmickgeek.com/2014/10/04/centos6%E3%81%A7opencv%E3%82%92%E5%88%A9%E7 % 94% A8% E3% 81% 99% E3% 82% 8B% E6% 99% 82% E3% 81% AB% E5% BF% 85% E8% A6% 81% E3% 81% AA% E3% 83 % 91% E3% 83% 83% E3% 82% B1% E3% 83% BC% E3% 82% B8 /)

Au fait, vous pouvez apprendre l'idée de base ici. Notes d'un VPS propre (CentOS6) sur l'exécution de Django avec Apache

[8] Définissez mod_wsgi et déployez django sur Sakura VPS

Les paramètres de déploiement de django sont

[django de la construction de l'environnement de production à la version (django 1.8.7 + Apache + mod_wsgi)] (http://marrsan.hateblo.jp/entry/2015/12/03/145235)

Si vous le regardez, 99%, c'est bien.

Cependant, il était nécessaire de résoudre le problème que causent djnago et scikit-learn dans CENTOS. Je suis resté coincé ici. https://github.com/scikit-learn/scikit-learn/issues/3947

Dans le fichier wsgi.conf créé ci-dessus

LoadModule wsgi_module modules/mod_wsgi.so WSGIPythonPath /home/hoge/ENV/lib/python2.7/site-packages WSGIApplicationGroup %{GLOBAL}

Si vous le donnez comme, il sera résolu.

[9] Acquérir un domaine avec Sakura VPS et définir un hôte virtuel

Après cela, obtenez le domaine et définissez l'hôte virtuel. Voir le site ci-dessous

Essayez d'utiliser le VPS de Sakura [8] -Essayez de configurer VirtualHost

Veuillez le réécrire car il est rempli de ****** de manière appropriée.

python.conf


<VirtualHost *:80>

ServerName sokkurinavi.com
ServerAlias www.sokkurinavi.com

WSGIScriptAlias / /var/www/cgi-bin/*******************/wsgi.py

#WSGIScriptAlias /sokuri /var/www/cgi-bin/*************
#Alias /static /home/hoge/ENV/lib/python2.7/site-packages/django/contrib/admin/static

Alias /static/ /var/www/cgi-bin/******************/static/

<Directory /var/www/cgi-bin/******************/static>
WSGIApplicationGroup %{GLOBAL}
Order deny,allow
Allow from all
</Directory>

<Directory /var/www/cgi-bin/***************>
Order deny,allow
Allow from all
</Directory>

</VirtualHost>

La version complète est ce site

Comme Navi

** Une dernière chose que je veux dire, c'est que si vous créez un site érotique, je pensais que ce serait un afflux, mais je ne recommande pas les sites érotiques car c'est toujours un afflux de 1 ou 2. ** **

Recommended Posts

Jusqu'à ce que vous créez un site où vous pouvez rechercher des images similaires (vidéos érotiques) du visage spécifié par Sakura VPS + django + scikit-learn
Créez un Discord Bot qui peut rechercher et coller des images