[PYTHON] Détermination des maladies des arbres par reconnaissance d'image à l'aide de CNTK et SVM

Aperçu

Je détermine manuellement la maladie d'un arbre, mais le début de l'histoire est de savoir si le travail peut être automatisé en raison du manque de main-d'œuvre. Les maladies des plantes apparaissent sous diverses formes, mais j'ai essayé de déterminer par apprentissage automatique s'il était possible de diagnostiquer les arbres morts comme point de départ. Puisqu'il s'agit du domaine de la reconnaissance d'image, je pense que c'est une méthode générale pour extraire des caractéristiques par traitement d'image et configurer un classificateur avec une logique comme SVM. Cependant, une telle méthode dépend de la méthode d'extraction des caractéristiques, et il est probable que des problèmes se produiront lors du développement ultérieur. Dans de telles circonstances, j'ai décidé d'utiliser le Deep Learning. Cependant, il faut beaucoup de temps pour apprendre à partir de zéro. Par conséquent, je vais essayer d'utiliser une technique appelée apprentissage par transfert. L'apprentissage en profondeur est divisé en gros entre la partie où les caractéristiques sont extraites et la partie qui est classée. On pense que la dernière couche entièrement connectée juste avant d'entrer dans le classificateur est la plus caractéristique. Si vous retirez la couche finale entièrement connectée et la placez dans un classificateur, vous pouvez l'utiliser pour la reconnaissance de n'importe quelle image. neuro.png

ResNet Il y a ResNet développé par Microsoft, qui est considéré comme le modèle avec le taux de reconnaissance le plus élevé actuellement. La dernière couche entièrement connectée de ResNet a 512 paramètres. Si seul le classificateur est formé à l'aide des 512 paramètres générés à partir de l'image entraînée, il n'est pas nécessaire de former le modèle depuis le début, et il est possible de construire un mécanisme de reconnaissance d'image. Le classifieur n'a pas besoin d'être un réseau neuronal et peut utiliser des techniques de classification d'apprentissage automatique telles que SVM et LightGBM. neuro2.png

Politique de traitement

  1. Extrayez la dernière couche entièrement connectée du modèle ResNet
  2. Apprenez le classificateur à partir des caractéristiques et des étiquettes extraites

Il s'agit de la première suppression de la couche entièrement connectée, mais l'échantillon CNTK est livré avec une extraction Feasture. Utilisez-le pour extraire des fonctionnalités. Il s'agit de FeatureExtraction.py dans CNTK2.0-rc1 \ cntk \ Examples \ Image \ FeatureExtraction.

Prêt à bouger

Utilisez explicitement le GPU. Ajoutez les deux dernières lignes au début du fichier.

from cntk.io import MinibatchSource, ImageDeserializer, StreamDefs, StreamDef
from cntk.device import set_default_device, gpu

De plus, il semble que la spécification du type de retour de certains modèles ait changé depuis la version bêta.

def eval_and_write(model_file, node_name, output_file, minibatch_source, num_objects):

Dans la définition ci-dessus out_values = output[0,0].flatten()

Cependant, cela ne fonctionne pas avec cela, donc Modifiez-le ci-dessous.

out_values=np.array(output).flatten()

Ajoutez également un appel de paramètre de périphérique pour utiliser le GPU à l'emplacement suivant.

if __name__ == '__main__':
    set_default_device(gpu(0))

Il est désormais opérationnel. Après cela, définissez la lecture des données Tout d'abord, téléchargez le modèle Pretrained de Resnet. Les données seront également téléchargées, mais le modèle sera téléchargé en exécutant la commande suivante.

cd .\CNTK2.0-rc1\Examples\Image\FeatureExtraction
Python install_data_and_model.py

Il existe un fichier text.txt dans CNTK-2.0-rc1 \ cntk \ Examples \ Image \ DataSets \ Grocery, et écrivez une liste de fichiers pour extraire des fonctionnalités ici. Changez simplement l'emplacement et le nom du fichier et vous êtes prêt à partir. Lorsque vous lisez les données de ce programme, vous les placez dans le flux de conversion de données et vous les redimensionnez.

Vous devez passer du modèle pré-formé d'ImageNet à 224x224. Si les données d'origine sont trop volumineuses, la lecture peut prendre beaucoup de temps ou une erreur peut survenir, je pense donc qu'il est préférable de les préparer à l'avance à environ la taille HD (1920 x 1024).

def create_mb_source(map_file, image_width, image_height, num_channels, num_classes, randomize=True):
   transforms = [xforms.scale(width=image_width, height=image_height, channels=num_channels, interpolations='linear')]
   return MinibatchSource(ImageDeserializer(map_file, StreamDefs(
           features =StreamDef(field='image', transforms=transforms),
           labels   =StreamDef(field='label', shape=num_classes))),
           randomize=randomize)

Processus d'apprentissage

Un fichier layerOut.txt est généré et 512 entités pour chaque image de données sont générées au format CSV. Étiquette flétrie pour chaque image de données Flétri: 1 Non flétri: 0 Créez un fichier CSV en l'ajoutant à la première colonne de layerOut.txt Les données de test sont au format layerOut2.txt

L'apprentissage avec le code SVM Python est ci-dessous.

from sklearn import svm
import numpy as np

d_tmp = np.loadtxt('layerOut.txt', delimiter=',')
train_data = [x[1:] for x in d_tmp]
label = [int(x[0]) for x in d_tmp]

d_tmp_t = np.loadtxt('layerOut2.txt', delimiter=',')
test_data =[x[1:] for x in d_tmp_t]

treehelth =svm.LinearSVC(C=1.0)
treehelth.fit(train_data, label)
prediction = treehelth.predict(test_data)
print(prediction)

Vous pouvez également utiliser LightGBM développé par Microsoft pour la partie SVM. L'apprentissage sera plus rapide si la quantité de données est importante.

L'image d'origine semble avoir un problème, mais le taux de reconnaissance est légèrement inférieur à 70%. Vous devez probablement régler le côté des données d'origine. L'image est l'une des données d'entraînement.

Recommended Posts

Détermination des maladies des arbres par reconnaissance d'image à l'aide de CNTK et SVM
Reconnaissance d'image à l'aide de chevaux et de cerfs CNN
Apprentissage automatique: reconnaissance d'image de MNIST à l'aide de PCA et de Gaussian Native Bayes
Détection d'image de visage similaire utilisant la reconnaissance faciale et le clustering PCA et K-means
Détermination du système d'exploitation par Makefile en utilisant Python
Construction et bases de l'environnement de reconnaissance d'image
Reconnaissance d'image des fruits avec VGG16
Python: principes de base de la reconnaissance d'image à l'aide de CNN
Estimation de catégorie à l'aide de l'API de reconnaissance d'image de docomo
Python: Application de la reconnaissance d'image à l'aide de CNN
Modèle de reconnaissance d'image utilisant l'apprentissage profond en 2016
Inférence d'image de visage à l'aide de Flask et TensorFlow
L'analyse d'image a été facile à l'aide des données et de l'API fournies par Microsoft COCO