[PYTHON] Bis Sie eine Site erstellen, auf der Sie nach ähnlichen Bildern (erotischen Videos) des von Sakura VPS + django + scikit-learn angegebenen Gesichts suchen können

** Mit Sakuras VPS, Django und Scikit-Learn habe ich eine Website erstellt, auf der Sie nach ähnlichen AV-Bildern mit AV-Schauspielerinnen suchen können, die dem von Ihnen gewünschten Gesichtsbild ähneln. ** ** **

Der Site-Name lautet Like Navi

Ich habe Unity, Open-GL und Objective-C verwendet, weil ich bisher Apps entwickelt habe, aber ich habe auch die Geschichte der Erstellung von Webdiensten von Grund auf aufgezeichnet, um Python und maschinelles Lernen sowie praktische Vorteile zu untersuchen. Ich werde.

Ich denke, dass alle Punkte, in die Anfänger passen, süchtig sind, also denke ich, dass es für Anfänger hilfreich sein wird.

Übrigens habe ich weder SIFT noch CNN verwendet, weil die Genauigkeit von BOVW-ähnlichen Typen gering war und die Dimension groß wurde und der Rechenaufwand zunahm. Wenn ich CNN machte, musste ich Bilder aus dem Video extrahieren oder ich hatte das Gefühl, dass es nicht genug Samples gab und ich gab auf, weil es eine schlechte Maschine war.

Originalgeschichte: AV-Bilderkennungstechnologie und ihre Umgebung ** Vielen Dank! **

Inhaltsverzeichnis

------------ Lokale Arbeit ----------------

------------ Serverseitige Arbeit ----------------

[1] Scraping des Gesichtsbildes einer AV-Schauspielerin von DMM.

Ich mache den Code nicht verfügbar, weil es normal ist, das Skript nicht zum Crawlen zu verwenden. Ich habe Python und BeautifulSoup4 verwendet.

Siehe Scraping mit Python und Beautiful Soup und es wird für Generationen gelöst.

[2] Gesichtsbild extrahieren und Gesichtsbildhistogramm mit opencv extrahieren

Es ist schwierig, opencv selbst zu erstellen. Wenn Sie dies jedoch lokal oder auf einem Mac tun, installieren Sie anaconda und installieren Sie es.

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

Es kann nur durch Eingabe der beiden Befehle verwendet werden. Einfach.

Dieser Bereich wird hilfreich sein Versuchen Sie, mit Python (Anaconda) und OpenCV ein Gesichtsbild aus einem Video zu extrahieren Gesichtserkennung mit OpenCV durchführen, nur den Gesichtsteil [Python] zuschneiden und speichern

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

image_path = "image.png "#Beliebiger Bildpfad

#Ermitteln Sie die Merkmalsmenge des Kaskadenklassifikators
face_cascade = cv2.CascadeClassifier('[yourdir]/opencv/data/haarcascades/haarcascade_frontalface_default.xml')

#Datei lesen
image = cv2.imread(image_path)#Beliebiger Bildpfad

#Graustufenumwandlung
image_gray = cv2.cvtColor(image, cv2.cv.CV_BGR2GRAY)


#Ausführung der Objekterkennung (Gesichtserkennung)
faces = cascade.detectMultiScale(image_gray, scaleFactor=1.2, minNeighbors=2, minSize=(10, 10))


#Ein Verzeichnis erstellen
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:
	#Schneiden Sie nur das Gesicht aus und speichern Sie
	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)#Geben Sie hier den Pfad zum Speichern des zugeschnittenen Bildes ein
	i += 1

Nach dem Extrahieren des Gesichtsbildes werden die HOG-Merkmale (Histogramme orientierter Verläufe) extrahiert.

Referenz für HOG-Funktionen: Extraktion von HOG-Funktionen aus Bildern

Sehr einfach

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

Sag nur. Damit kann die verteilte Darstellung des Bildes aufgenommen werden.

[3] Erstellen Sie ein Modell, das bestimmte Gesichtsbilder durch Komprimieren der Abmessungen von pca und kmeans klassifiziert.

Das Problem bei HOG-Funktionen ist jedoch der Fluch der Dimension. Wenn Sie versuchen, die Ähnlichkeit zwischen fast 300.000 Bildern und einer Website zu berechnen und zurückzugeben, ist dies normalerweise nicht möglich. Daher müssen die Ergebnisse der Dimensionskomprimierung (PCA) und der PCA geclustert (km) werden.

Zuerst müssen wir eine verteilte Darstellung für alle Bilder erhalten, also Ich habe unten eine Klasse erstellt, um Bilder für jeden Ordner stapelweise zu lesen.

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: #Löschen Sie zu kleine Bilder
				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)

#Extrahieren Sie hier die HOG-Funktionen

images = Images()
print("Laden Sie das Bild")

images.readAllFiles("/image_path")#Geben Sie den Ordner an, der das Gesichtsbild enthält

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 = [] #Machen Sie einen Listenausdruck wie 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 zur Verwendung mit lernen.Machen Sie es in Array-Format

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

X_pca= pca.transform(npdata)

a =[] #Legen Sie das Histogramm in das oben erstellte Listenformat

for x in X_pca:
   a.append(x)

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

Jetzt haben Sie ein PCA-Modell und ein Kmeans-Modell. Wenn Sie eine beschissene Klasse wie ich machen und eine Klasse mit untergeordneten Elementen machen, Ich habe Probleme mit Python Pickle, die ich nicht serialisieren kann. Es wird empfohlen, es mit Dill aufzubewahren, da es nicht schwer ist und dauerhaft ist.

Problemumgehung für Python-Pickle nicht serialisiert

Wenn Sie danach wie folgt schreiben, können Sie die COS-Ähnlichkeit berechnen, indem Sie den Bildpfad angeben

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


Nachdem Sie ein Bild erstellt haben, nehmen Sie die HOG-Feature-Menge, komprimieren Sie die Dimensionen mithilfe des Hauptkomponentenanalysemodells, schätzen Sie den Cluster, zu dem es gehört, mithilfe des Kmeasn-Modells und schätzen Sie die Ähnlichkeit mit allen Bildern in diesem Cluster. Einfach berechnen.

Die Websites, auf die ich verwiesen habe, sind unten aufgeführt. (Der Quellcode ist hier definitiv sauberer.)

Ich habe versucht, Anime-Gesichtsfotos nach Bag of Keywords zu klassifizieren

Wie benutzt man KAZE? Messung der Merkmalsmenge (ORB / AKAZE / KAZE / FAST / BRISK) mit OpenCV3.0.0-dev + Python2.7.6

[4] Erstelle eine Site mit Django

An diesem Punkt ist der Rest wie ein Tutorial Ich habe es geschafft, indem ich hier gesucht habe.

Einführung in Python Django

[5] Lassen Sie Cloudworks HTML erstellen und entwerfen

Um ehrlich zu sein, sind Design und Markup die am wenigsten geeignete Arbeit, deshalb habe ich sie ausgelagert. So was. Die Investition hat sich übrigens überhaupt nicht erholt. Es besteht keine Aussicht auf Erholung.

Design / Codierung des Bildschirms von "Like Navi !!" voller Romantik eines Mannes

[6] Erstellen Sie mit CropperJS ein Skript zum Ausschneiden eines Gesichtsbilds

Es scheint, dass JS nicht gut darin ist, also habe ich beschlossen, es hier zu implementieren.

Cropper.js

Es war eine Bibliothek, die sehr praktische Bilder im Browser extrahiert, da Smartphones auch so optimiert sind, wie sie sind. Es ist hier leicht geschrieben

Verwenden Sie das JQuery-Plug-In "Cropper", mit dem Bilder zugeschnitten werden

Das Gefühl, dass Sie verstehen können, wenn Sie mit der Basis-Demo spielen.

Von hier auf der Serverseite

[7] Erstellen Sie eine Umgebung für Sakura vps wie opencv, virtualenv, mod_wsgi, scikit-learn, django usw.

Um ehrlich zu sein, hat dies am längsten gedauert.

Erstens ist Python 2.6.6 in CentOS 6.5 von Sakura VPS enthalten, und die Version unterscheidet sich von mod_wsgi, und es ist ein Fehler aufgetreten. Darüber hinaus wird kein Django-Fehler ausgegeben, und es ist wirklich ärgerlich, da die Anforderung nicht auf einem weißen Bildschirm angezeigt wird.

--Virtualenv Von hier. Dies ist wichtig, da Sie ohne sie normalerweise nicht wissen würden, auf welche Bibliothek sich der Pfad bezieht.

--OpenCV in CENTOS6.5 (vielleicht das schwierigste in allen Prozessen)

Sehen wir uns das Folgende als Referenz an. Wahrscheinlich das Schwierigste. #Ich erinnere mich ehrlich gesagt nicht. Übrigens war es ein Albtraum, dass ich den Server nicht benutzen konnte, wenn ich hell überschrieb, ohne die abhängigen Dateien zu sichern.

Versuchen Sie, OpenCV3.0 auf AMI zu installieren Arbeitsnotiz mit OpenCV3.0 und opencv_contrib in Ubuntu [Paket erforderlich, wenn openCV mit CENTOS6 verwendet wird](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 /)

Übrigens können Sie hier die Grundidee lernen. Hinweise von einem sauberen VPS (CentOS6) zum Ausführen von Django mit Apache

[8] Setze mod_wsgi und setze Django für Sakura VPS bereit

Django-Bereitstellungseinstellungen

[Django von der Erstellung der Produktionsumgebung bis zur Veröffentlichung (Django 1.8.7 + Apache + mod_wsgi)] (http://marrsan.hateblo.jp/entry/2015/12/03/145235)

Wenn Sie es betrachten, sind 99% in Ordnung.

Es war jedoch notwendig, das Problem zu lösen, das Djnago und Scikit-Learn in CENTOS verursachen. Ich bin hier festgefahren. https://github.com/scikit-learn/scikit-learn/issues/3947

In der oben erstellten Datei wsgi.conf

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

Wenn Sie es als geben, wird es gelöst.

[9] Erwerben Sie eine Domain mit Sakura VPS und legen Sie einen virtuellen Host fest

Holen Sie sich danach die Domain und legen Sie den virtuellen Host fest. Siehe die Seite unten

Versuchen Sie es mit Sakuras VPS [8] - Versuchen Sie, VirtualHost einzustellen

Bitte schreiben Sie es neu, da es entsprechend mit ****** gefüllt ist.

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>

Die fertige Version ist diese Seite

Wie Navi

** Eine letzte Sache, die ich sagen möchte, ist, dass wenn Sie eine erotische Site erstellen, ich dachte, es wäre ein Zufluss, aber ich empfehle keine erotischen Sites, da es immer Zufluss 1 oder 2 ist. ** ** **

Recommended Posts

Bis Sie eine Site erstellen, auf der Sie nach ähnlichen Bildern (erotischen Videos) des von Sakura VPS + django + scikit-learn angegebenen Gesichts suchen können
Erstellen Sie einen Discord Bot, der Bilder suchen und einfügen kann