Ich bestimme manuell die Krankheit eines Baumes, aber der Anfang der Geschichte ist, ob die Arbeit aufgrund mangelnder Arbeitskräfte automatisiert werden kann. Pflanzenkrankheiten treten in verschiedenen Formen auf, aber ich habe versucht, durch maschinelles Lernen festzustellen, ob es möglich ist, einen toten Baum als Ausgangspunkt zu diagnostizieren. Da es im Bereich der Bilderkennung liegen wird, denke ich, dass es eine übliche Methode ist, Features durch Bildverarbeitung zu extrahieren und einen Klassifikator mit Logik wie SVM zu konfigurieren. Ein solches Verfahren hängt jedoch von dem Verfahren zur Merkmalsextraktion ab, und es ist wahrscheinlich, dass bei der nachfolgenden Entwicklung Probleme auftreten werden. Unter solchen Umständen entschied ich mich für Deep Learning. Es braucht jedoch viel Zeit, um von Grund auf neu zu lernen. Daher werde ich versuchen, eine Technik namens Transferlernen zu verwenden. Deep Learrning ist grob in den Teil unterteilt, in dem die Merkmale extrahiert werden, und den Teil, der klassifiziert wird. Es wird angenommen, dass die letzte vollständig verbundene Schicht unmittelbar vor dem Eintritt in den Klassifizierer die charakteristischste ist. Wenn Sie die letzte vollständig verbundene Ebene herausnehmen und in einen Klassifikator einfügen, können Sie sie zur Erkennung eines beliebigen Bildes verwenden.
ResNet Es gibt ResNet, das von Microsoft entwickelt wurde und das derzeit das Modell mit der höchsten Erkennungsrate sein soll. Die letzte vollständig verbundene Schicht von ResNet verfügt über 512 Parameter. Wenn nur der Klassifizierer unter Verwendung der 512 Parameter trainiert wird, die aus dem trainierten Bild generiert wurden, ist es nicht erforderlich, das Modell von Anfang an zu trainieren, und es ist möglich, einen Bilderkennungsmechanismus aufzubauen. Der Klassifizierer muss kein neuronales Netzwerk sein, und Klassifizierungstechniken für maschinelles Lernen wie SVM und LightGBM können verwendet werden.
Dies ist die erste Entfernung der vollständig verbundenen Schicht, aber die CNTK-Probe wird mit einer Feasture-Extraktion geliefert. Verwenden Sie es, um Features zu extrahieren. Dies ist FeatureExtraction.py in CNTK2.0-rc1 \ cntk \ Examples \ Image \ FeatureExtraction.
Verwenden Sie explizit die GPU. Fügen Sie die beiden unteren Zeilen am Anfang der Datei hinzu.
from cntk.io import MinibatchSource, ImageDeserializer, StreamDefs, StreamDef
from cntk.device import set_default_device, gpu
Außerdem scheint sich die Spezifikation des Rückgabetyps einiger Modelle gegenüber der Beta geändert zu haben.
def eval_and_write(model_file, node_name, output_file, minibatch_source, num_objects):
Innerhalb der obigen Definition
out_values = output[0,0].flatten()
Damit funktioniert es jedoch nicht Ändern Sie es unten.
out_values=np.array(output).flatten()
Fügen Sie außerdem einen Aufruf zur Geräteeinstellung hinzu, um die GPU am folgenden Speicherort zu verwenden.
if __name__ == '__main__':
set_default_device(gpu(0))
Es ist jetzt betriebsbereit. Stellen Sie danach das Lesen der Daten ein Laden Sie zunächst das Pretrained-Modell von Resnet herunter. Die Daten werden ebenfalls heruntergeladen, das Modell wird jedoch durch Ausführen des folgenden Befehls heruntergeladen.
cd .\CNTK2.0-rc1\Examples\Image\FeatureExtraction
Python install_data_and_model.py
In CNTK-2.0-rc1 \ cntk \ Examples \ Image \ DataSets \ Grocery befindet sich eine text.txt-Datei. Schreiben Sie hier eine Liste mit Dateien, um Funktionen zu extrahieren. Ändern Sie einfach den Speicherort und den Namen der Datei und los geht's. Wenn Sie die Daten in diesem Programm lesen, fügen Sie sie in den Datenkonvertierungsdatenstrom ein und ändern die Größe.
Sie müssen von ImageNets Pretrained Model zu 224x224 wechseln. Wenn die Originaldaten zu groß sind, kann das Lesen lange dauern oder es kann ein Fehler auftreten. Ich denke, es ist besser, sie im Voraus auf etwa HD-Größe (1920 x 1024) anzuordnen.
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)
Eine layerOut.txt-Datei wird generiert und 512 Funktionen für jedes Datenbild werden im CSV-Format ausgegeben. Verwelktes Etikett für jedes Datenbild Verwelkt: 1 Nicht verwelkt: 0 Erstellen Sie eine CSV-Datei, indem Sie sie der ersten Spalte von layerOut.txt hinzufügen Die Testdaten sind layerOut2.txt
Das Lernen mit SVM-Python-Code finden Sie weiter unten.
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)
Sie können auch LightGBM verwenden, das von Microsoft für den SVM-Teil entwickelt wurde. Das Lernen wird schneller, wenn die Datenmenge groß ist.
Das Originalbild scheint ein Problem zu haben, aber die Erkennungsrate liegt bei knapp 70%. Sie müssen wahrscheinlich die Originaldatenseite optimieren. Das Bild ist eine der Trainingsdaten.
Recommended Posts