Handschriftliche Zeichenerkennung in OpenCV Tutorial.
Ein Neuling, der dieses Jahr beauftragt wurde, sagte: "Ich habe Charaktere erkannt, als ich auf dem College war." Also versuche ich, ein Gefühl dafür zu bekommen.
Verwenden Sie digits.png, das in der OpenCV-Distribution enthalten ist, als Wörterbuchdaten. Leider enthielt die `` `conda install --channel https://conda.anaconda.org/menpo opencv3```-Umgebung in der Anaconda-Umgebung keine digits.png.
Dies sind die Bilddaten handgeschriebener Zahlen von 0 bis 9. Wenn Sie versuchen, OCR auf Japanisch zu erstellen, müssen Sie eine große Menge an Wörterbuchdaten erstellen, wenn Sie diese so implementieren, wie sie sind. Wenn Sie versuchen, die Variationen von Kanji wie Watanabe-san und Saito-san zu unterscheiden, wird es schwierig. Wird es geschafft?
Wikipedia hat einen Eintrag als k Nachbarschaftsmethode. Insbesondere hat Abbildung KNN. Es ist sehr einfach und leicht zu verstehen.
Das heißt, wenn gewünscht werden soll, zu bestimmen, ob eine unbekannte Probe zur Gruppe A oder Gruppe B in einem Raum einer bestimmten Koordinate gehört, wird gesagt, dass "sie zur Gruppe mit vielen bekannten klassifizierten Daten in der Nähe gehört". Es ist zu beurteilen.
Nachdem Sie das Konzept verstanden haben, ist es einfach mit Python (+ OpenCV) zu verwenden.
cells = [np.hsplit(row,100) for row in np.vsplit(gray,50)]
Was macht das? Apropos, das Bild mit der Bezeichnung digits.png hat eine Größe von 1000 x 2000, und jede Zahl wird 500 Mal in einer Größe von 20 x 20 geschrieben, sodass die Vertikale durch 100 und die Horizontale durch 50 als Array in Zellen geteilt wird. Zeigt an, dass es gespeichert ist. In Wirklichkeit kann ich es jedoch nicht verstehen oder ich kann es niemals selbst schreiben. Es kann ausreichend sein zu wissen, dass es Möglichkeiten gibt, das Array zu teilen, z. B. np.hsplit () und np.vsplit ().
Nachdem Sie dies in einem Array von numpy namens x gespeichert haben, teilen Sie 250 von jeder Zahl in einen Trainingssatz und die restlichen 250 in einen Testsatz.
x = np.array(cells)
train = x[:,:50].reshape(-1,400).astype(np.float32)
test = x[:,50:100].reshape(-1,400).astype(np.float32)
Legen Sie außerdem für jede Daten eine Bezeichnung fest.
np.arange(10)Dann 10 von 0 bis 9 Array dieses zusammenhängenden ganzzahligen Arrays([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])Wird erstellt, wiederholen Sie es 250 Mal, um es zu beschriften.
```python
k = np.arange(10)
train_labels = np.repeat(k,250)[:,np.newaxis]
test_labels = train_labels.copy()
Führen Sie schließlich KNN aus. Lassen Sie es uns mit k = 5 ausführen.
knn = cv2.KNearest()
knn.train(train,train_labels)
ret,result,neighbours,dist = knn.find_nearest(test,k=5)
In der Tat führt das Obige zu einem Fehler. Tutorial scheint falsch zu sein. Schreiben Sie die obigen drei Zeilen wie folgt um.
knn = cv2.ml.KNearest_create()
knn.train(train,cv2.ml.ROW_SAMPLE,train_labels)
ret, results, neighbours, dist = knn.findNearest(test, 5)
Werfen wir einen Blick auf die Ergebnisse des Diskriminators.
matches = results==test_labels
correct = np.count_nonzero(matches)
accuracy = correct*100.0/results.size
print(accuracy)
Das Ergebnis dieser Ausführung ist `` `91.76```. Ich habe den Eindruck, dass diese Genauigkeit durch die Unterscheidung von nur 10 Zeichen etwas gering ist.
Das ist alles für heute.
Recommended Posts