Cet article
Bien que ce soit également dans le titre, il s'agit d'un article sur un disque laissé par un amateur qui n'est ni un chercheur en Deep Learning ni quoi que ce soit, alors pardonnez-moi toute description erronée et lisez-le. (S'il y a quelque chose qui ne va pas, j'apprécierais que vous le signaliez dans les commentaires) De plus, comme il y a beaucoup de choses que je ne comprends pas de façon inattendue, la version pratique sera mise à jour petit à petit ...
Dans un premier temps
Tracez ce qui est écrit dans Official
Dans l'état d'origine cloné depuis git, il n'y a pas de données de caractères manuscrites à apprendre, je vais donc les déposer ci-dessous En supposant que CAFFE_ROOT est défini comme une variable d'environnement (s'il n'est pas défini, définissez la racine du référentiel caffe sur CAFFE_ROOT).
python
cd $CAFFE_ROOT
./data/mnist/get_mnist.sh
./examples/mnist/create_mnist.sh
Cela devrait, espérons-le, créer deux dossiers sous examples / mnist, mnist_test_lmdb et mnist_train_lmdb, avec une base de données à l'intérieur.
Une fois que vous avez créé la base de données, vous pouvez utiliser le réseau et le solveur inclus pour apprendre les caractères manuscrits sans rien faire de spécial. Plus précisément, il se termine par la ligne suivante. Le temps dépend de l'environnement, mais je pense que ce sera fini dans 10 minutes.
python
cd $CAFFE_ROOT
./examples/mnist/train_lenet.sh
Maintenant, si la formation est effectuée correctement, lenet_iter_10000.caffemodel et lenet_iter_5000.caffemodel seront créés sous examples / mnist. La seule différence entre 10000 et 5000 est de savoir si l'itération d'apprentissage est le 10000ème réseau ou le 5000ème réseau.
Si vous apprenez de la base de données selon le didacticiel, vous pouvez voir que le réseau a appris quelque chose, mais si vous n'utilisez pas réellement le réseau, vous ne pouvez pas dire s'il a réussi ou non. Alors, convertissons la base de données ci-dessus, qui stocke 10000 caractères, en JPEG un caractère chacun, donnons-la au réseau et voyons quel type de sortie il s'agira. Les scripts utilisés dans ce chapitre sont sur GitHub, veuillez donc les utiliser si vous le souhaitez.
Même si vous regardez la base de données, il est difficile de comprendre quel nombre est quel caractère, alors faites en sorte que les données soient stockées dans la base de données JPEG Cette fois, j'ai fait mon propre script et l'ai fait en JPEG Comme ça (python)
import scipy
import numpy as np
import lmdb
import sys
from caffe.io import caffe_pb2
def convert_to_jpeg(db_dir):
env = lmdb.open(db_dir)
datum = caffe_pb2.Datum()
with env.begin() as txn:
cursor = txn.cursor()
for key_val,ser_str in cursor:
datum.ParseFromString(ser_str)
print "\nKey val: ", key_val
print "\nLabel: ", datum.label
rows = datum.height;
cols = datum.width;
img_pre = np.fromstring(datum.data,dtype=np.uint8)
img = img_pre.reshape(rows, cols)
file_name = str(key_val) + "_" + str(datum.label) + ".jpg "
scipy.misc.toimage(img, cmin=0.0, cmax=255.0).save("data/mnist/jpg/" + file_name)
S'il s'agit d'une base de données dans mnist_test_lmdb, 10000 images jpg seront générées en procédant comme suit
python
cd $CAFFE_ROOT
python mnist_jpg_converter.py examples/mnist/mnist_test_lmdb/
Réécrivez d'abord python / classify.py fourni avec caffe pour charger le réseau Comme ça.
def main(argv):
# --Abréviation--
# Make classifier.
classifier = caffe.Classifier(args.model_def, args.pretrained_model)
# Load numpy array (.npy), directory glob (*.jpg), or image file.
args.input_file = os.path.expanduser(args.input_file)
print("Loading file: %s" % args.input_file)
grayimg = caffe.io.load_image(args.input_file, color=False)[:,:,0]
inputs = [np.reshape(grayimg, (28, 28, 1))]
print("Classifying %d inputs." % len(inputs))
# Classify.
start = time.time()
predictions = classifier.predict(inputs)
print("Done in %.2f s." % (time.time() - start))
# --Abréviation--
Après cela, utilisez ce script
python
cd $CAFFE_ROOT
python lenet_classify.py data/mnist/jpg/00000007_9.jpg result.npy
Si vous le faites, le résultat de la classification sera affiché dans result.npy.
python
python my/show_mnist_result.py result.npy
[[ 6.68664742e-03 2.82594631e-03 8.81279539e-03 1.06628540e-05
4.27712619e-01 1.90626510e-04 1.27627791e-04 9.20879841e-03
4.14795056e-02 5.02944708e-01]]
Étant donné que les éléments de la colonne sont classés dans l'ordre de 0, 1, 2, ..., 9, la probabilité pour 9 est d'environ 50%, ce qui est plus élevé que tout autre résultat de classification, de sorte que le réseau apprend correctement. Tu peux vérifier (La prochaine probabilité la plus élevée est 4, mais 9 et 4 se ressemblent, donc je pense que c'est un résultat convaincant.)
Je vous remercie pour votre travail acharné
Deep Learning with Caffe, se concentrant sur les endroits où vous pouvez facilement trébucher Classification facile des images avec Caffe
Recommended Posts