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! **
------------ Travail local ----------------
------------ Travail côté serveur ----------------
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.
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.
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
À ce stade, le reste est comme un tutoriel Je l'ai fait en regardant ici.
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
Il semble que JS ne soit pas bon dans ce domaine, j'ai donc décidé de l'implémenter ici.
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.
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
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.
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
** 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. ** **