[PYTHON] Nehmen Sie Ihr Ringfit-Abenteuer mit OCR auf

Dieser Artikel ist der 6. Tag des Aratana-Adventskalenders. 68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3135303435352f65373962613531662d303136332d323436622d616437622d3939386638663434326437322e706e67.png

Habt ihr ein Ring Fit Abenteuer? Ich möchte es vermasseln, aber es geht in weniger als 30 Minuten runter. Am Ende des Spiels wird aufgezeichnet, wie viel Bewegung ich diesmal machen konnte, aber ich werde dort ein Foto mit meinem Smartphone machen. (Eine Person, die neu bei Switch ist und nicht wusste, dass eine Bildschirmaufnahme möglich ist.) ↓ Dies ist der eine rfa.jpg

Ich weiß es vielleicht nicht, weil ich ein Anfänger von Switch bin, aber es scheint, dass ich den Datensatz nicht exportieren konnte. Ich wollte wissen, wie viel ich tun konnte, also werde ich dieses Mal versuchen, mit OCR aufzunehmen, die vom Foto transkribiert wird.

Vorbereitung

brew install tesseract
pip install pyocr

Trainieren

Verwenden Sie pyocr, um das Open-Source-OCR-Tool Tesseract zu verpacken. Laden Sie vorerst das Bild und wenden Sie OCR an.

from PIL import Image

import pyocr
import pyocr.builders


image = Image.open("image_path")

tools = pyocr.get_available_tools()

tool = self.tools[0]

result_ocr = self.tool.image_to_string(
    image,
    lang="jpn",
    builder=pyocr.builders.TextBuilder(tesseract_layout=6))

print(result_ocr.splitlines())
Die heutigen Bewegungen

Link Consqueeze_

Hocken
-Kampagnenschub
Tony Touchest

-Pose des Stuhls

Bauchdrücken

_ /② Team ② Zeiten

⑥ 0 mal(eom
③ ⑧ mal(③⑧4)
③ ① mal G 4
② ② mal(② ② Ursache)

⑤ mal ⑤ vier

-② Ursache ② Zeiten

Dashing

Jinging

Pfirsichzeitalter
Gehen

Ringsteuerungstaste nach unten drücken

m ⑤ Par

Bedrucken Sie die Malfläche

⑥⑤⑦m(⑥⑤zm)

-M(④⑤⑧m

⑨⑨m(gom)
_②m(②m)
⑯ Herbst ⑯ Gong

-⑤(⑥ Gong

Schlucht 0




Es ist schrecklich! Es ist schrecklich, aber vorerst ist OCR selbst ein Erfolg, also ...

Ich mache mir Sorgen um den Abstand zwischen den Buchstaben, das nächste Mal werde ich diesen Abstand verwalten. In Tesseract scheint es eine Option zu geben, mit der Sie die Lücken ausfüllen können. -c preserve_interword_spaces=1

Ich habe eine Beschreibung gefunden, die die Option aus der Quelle von pyocr angibt, also werde ich sie verwenden.

builder = pyocr.builders.TextBuilder(tesseract_layout=6)
builder.tesseract_configs.append('-c')
builder.tesseract_configs.append('preserve_interword_spaces=1')
Gesamtergebnis der heutigen Übung

Linkcon verknallt_

Hocken
-Bapanzai Push
Tony zur Brust

-Chair Pose

Schieben Sie Ihren Bauch

_ /② Gruppe ② mal

⑥ 0 mal(eom
③ ⑧ mal(③⑧4)
③ ① mal G4
②② mal(② ② Ursache)

⑤ mal ⑤ vier

-② Ursache ② mal

Strich

Joggen

Heben Sie den Pfirsich an
Gehen

Ringcon nach unten drücken halten

m ⑤ par

圓 Bildschirm

⑥⑤⑦m(⑥⑤zm)

-M(④⑤⑧m

⑨⑨m(gom)
_②m(②m)
⑯Autumn ⑯Gong

--- ⑤(⑥ Gong

Schlucht 0 Mit Seil schließen

 

Zwischen den Zeichen stehen keine Leerzeichen.

Ich bin besorgt über die Genauigkeit der OCR selbst. Fügen wir vorerst die Vorverarbeitung hinzu. Ich habe übrigens von splitline () zu split () gewechselt, weil es keinen zusätzlichen Platz gab.

im_blur = cv2.GaussianBlur(image, (5, 5), 0)
_, image = cv2.threshold(im_blur, 0, 255, cv2.THRESH_OTSU)

Ich habe Rauschunterdrückung und Otsu-Binarisierungsverarbeitung mit einem Gaußschen Filter hinzugefügt.

Der erste ist vor split () und der zweite ist nach split ().


Der heutige Gesamtergebniskomfort`Den Bildschirm graben
.. Ringregler ⑦②-mal eingeschoben(⑦ ② 4)・ Dash ⑥ ⑤ ⑦ m(⑥⑤⑦m)
“Squat ⑥ 0 mal(⑥ol)・ Joggen ④③⑧m(④③⑧m)
`Bansazai Push ③⑧ mal(③ ⑧ 吏)   *Pfirsich Akage ⑨⑨m(⑨⑨m)
Nee to Chest ③ ① mal(Group ① ich Gruppe)・ Gehen ②m(②m)
・ Stuhlhaltung ②② mal(② ② 4)・ Ringcon gedrückt halten keepAutumn ⑯)
⑤ mal in den Bauch drücken(⑤ Vier).. Ringcon Pull Keep ⑥ Herbst(⑥ Du)
・ Drücken Sie den Ringregler ② mal nach unten(② mal)
_Der Wert in Klammern ist der kumulative Wert ab Spielbeginn [`.. <schließen
‥*Leh Talk Shisho Kopu-Trauergespräch e

['Das heutige Gesamtergebnis', 'Trost', 'Yasu', '`', 'Den Bildschirm graben', '。', 'Ringsteuerung drücken', '⑦② mal(⑦ ② 4)',
'・', 'Strich', '⑥⑤⑦m(⑥⑤⑦m)', '“', 'Hocken', '⑥ 0 mal(⑥ol)', '・', 'Joggen', '④③⑧m(④③⑧m)',
'`', 'Bansazai Push', '③ ⑧ mal(③ ⑧ 吏)', '*', 'Peach Akege', '⑨⑨m(⑨⑨m)', 'Ja', 'Knie an Brust'
, '③ ① mal(Group ① ich Gruppe)', '・', 'Gehen', '②m(②m)', '・', 'Stuhlhaltung', '②② mal(② ② 4)', '・', 'Ring
Drücken Sie den Computer weiter nach unten', '⑯ Herbst ⑯ Rolle)', 'Shu', 'Bauchdrücken', '⑤ mal(⑤ Vier)', '。', 'Ringcon zieht Schlüssel
Pub', '⑥ Herbst(⑥ Du)', '・', 'Drücken Sie den Ringregler nach unten', '② mal(② mal)', '_', 'Die Zahlen in Klammern sind die Ansammlung vom Beginn des Spiels an
Es ist der Gesamtpreis', '〔`。〈', 'schließen', '‥*', 'Leh spricht Shisho Kopu', '- -', '- -', '・ Trauergespräch e']

Sie können jetzt die Art und Anzahl der Übungen sehen, indem Sie sich den Putt ansehen. Es scheint, dass 1 wie ① in den Spezifikationen von tesseract ist, also dachte ich, ich würde den Mapping-Prozess in das Programm schreiben, aber es gab eine Funktion, die verwendet werden könnte, also habe ich versucht, sie zu verwenden.

unicodedata.normalize()

Nehmen Sie danach die Übung und die Anzahl der Male heraus.

target_list = [
            "Hocken", "Drücken Sie den Ringregler", "Strich", "Joggen", "Banzai Push", "Heben Sie den Pfirsich an",
            "Knie an Brust", "Gehen", "Stuhlhaltung", "Ringcon nach unten drücken halten", "Bauchdrücken",
            "Ringcon ziehen halten", "Drücken Sie den Ringregler nach unten"
        ]

result = []
for target in target_list:
    s = []
    for j, line in enumerate(texts):
        s.append(
            difflib.SequenceMatcher(a=target, b=line).ratio())

    result.append(texts[s.index(max(s)) + 1].split('(')[0])


Folgendes habe ich jedes Mal hinzugefügt, wenn ich es am Ende ausgeführt habe.


{
    "0": {
        "Hocken": "60 mal",
        "Drücken Sie den Ringregler": "72 mal",
        "Strich": "657m",
        "Joggen": "438m",
        "Banzai Push": "38 mal",
        "Heben Sie den Pfirsich an": "99m",
        "Knie an Brust": "31 mal",
        "Gehen": "2m",
        "Stuhlhaltung": "22 mal",
        "Ringcon nach unten drücken halten": "16 Fall 16 Rollen)",
        "Bauchdrücken": "5 mal",
        "Ringcon ziehen halten": "6 Herbst",
        "Drücken Sie den Ringregler nach unten": "Zweimal"
    },
    "1": {
        "Hocken": "60 mal",
        "Drücken Sie den Ringregler": "72 mal",
        "Strich": "657m",
        "Joggen": "438m",
        "Banzai Push": "38 mal",
        "Heben Sie den Pfirsich an": "99m",
        "Knie an Brust": "31 mal",
        "Gehen": "2m",
        "Stuhlhaltung": "22 mal",
        "Ringcon nach unten drücken halten": "16 Fall 16 Rollen)",
        "Bauchdrücken": "5 mal",
        "Ringcon ziehen halten": "6 Herbst",
        "Drücken Sie den Ringregler nach unten": "Zweimal"
    }
}

Da es mit demselben Bild ausgeführt wurde, wurde es beide Male gleich oft aufgenommen, aber ich konnte es hinzufügen. "Ringcon Push Down Keep": "16 Herbst 16 Rollen)", " Es gibt einige Teile, die ich nicht sauber bekommen oder die "Zeiten" nicht erkennen konnte, aber ich bin damit zufrieden.

Zusammenfassung

Dieses Mal befand sich der OCR-Teil vollständig auf dem Pyocr (Tesseract), daher habe ich nicht darüber nachgedacht, wie die oben genannten "Zeiten" als "Herbst" verbessert werden können, aber beim nächsten Mal werde ich die Erkennungsgenauigkeit verbessern. Ich möchte es probieren.

Aber was soll ich tun, wenn ich ocr zum ersten Mal versuche und es eine seltsame Lücke gibt ...? Wenn Sie nicht vorverarbeiten, wird sich die Genauigkeit nicht verbessern ...? Es war lustig und lehrreich, jedes Mal, wenn ich gegen eine Wand stieß, darüber nachzudenken, wie ich damit umgehen sollte.

Ich möchte ein paar weitere Funktionen wie CSV-Ausgabe und Gesamtwertausgabe hinzufügen.

Recommended Posts

Nehmen Sie Ihr Ringfit-Abenteuer mit OCR auf
Die Geschichte, ein Ring-Fit-Abenteuer kaufen zu wollen
Hinter dem Ringfit Adventure Ankunftsbot, um Wiederverkäufer auszurotten