[PYTHON] Veröffentlichung eines Webdienstes zum Bewerten handgeschriebener Zeichen mit DeepLearning

Als Hobby habe ich persönlich einen Webdienst entwickelt, bei dem AI automatisch die Lesbarkeit von Zeichen bewertet, wenn ich sie in einem Browser handschriftlich schreibe, und ihn vor etwa zwei Wochen veröffentlicht: entspannt:

Letters-AI handgeschriebene App zur Charakterbewertung

Die Kerntechnologien sind die Bilderkennung von DeepLearning und die Preact-Front-End-Implementierung. In diesem Artikel beschreiben wir ** Serviceübersicht, technische Details und Eindrücke ** bezüglich der entwickelten Anwendung.

Serviceübersicht

Funktionseinführung

Da die Anzahl der Seiten gering und das Gewicht gering ist, ist es wahrscheinlich schneller, einen Blick auf die App bezüglich der Funktionen zu werfen. Ich werde die Funktionen jedoch anhand von Screenshots erläutern, einschließlich eines Überblicks über die verwendete Technologie.

Handschriftliche Charakterbewertung von der obersten Seite

letters_demo_01.gif

――Auf der oberen Seite wird ein Rahmen angezeigt, in den Sie Zeichen schreiben können, und Sie können Zeichen schreiben.

Anzeige der Bewertungsergebnisse der bisher geschriebenen Zeichen

letters_demo_02_2.gif

Anzeige von Highscore-Beispielen

letters_demo_03.gif

――Wenn Sie keine hohe Punktzahl erzielen können, können Sie ein Beispiel dafür anzeigen, welche Art von Zeichen Sie schreiben sollten, um eine hohe Punktzahl zu erzielen.

Entwicklungshintergrund / -zweck

Der Zweck dieser Entwicklung ist zweifach.

  1. Es würde Spaß machen, wenn es eine App gäbe, die handgeschriebene Zeichen bewertet
  2. Ich wollte eine Webanwendung erstellen, die DeepLearning anwendet

Durch die Entwicklung bin ich zufrieden, weil ich beide vorerst zufrieden gestellt habe. Ich denke, dass es keinen Dienst gibt, der die gleichen Funktionen bietet wie der diesmal entwickelte. (Nein, ich habe andere Dienste nicht so sehr untersucht ...)

Klebepunkte

Leichte Bewegung

Grundsätzlich sollte es auf Smartphones und Tablets verwendet werden, daher habe ich versucht, die anfängliche Anzeige usw. reibungslos zu gestalten. Insbesondere ergreifen wir Maßnahmen, um die Front-End-Dateien so leicht wie möglich zu gestalten.

Garantie für die Anzahl der Arten von Wertungszeichen

Das Wertungsziel besteht aus insgesamt 3175 Zeichen, einschließlich Hiragana, Katakana, Kanji, Romaji und Zahlen, die häufig auf Japanisch verwendet werden, und wir haben es so gestaltet, dass es fast die in Japan gebräuchlichen Zeichen abdeckt [^ char_types].

Wenn es sich nur um Zahlen handelt, kann es einfach mithilfe des MNIST-Datensatzes erstellt werden. Es gibt verschiedene Datensätze mit nur alphanumerischen Zeichen, aber es enthält Hiragana, Katakana, Kanji, gemischte alphanumerische Zeichen und weitere alphanumerische Zeichen. Es war mühsam, einen Datensatz mit Groß- und Kleinschreibung zu erstellen.

[^ char_types]: Die Aufteilung besteht aus 75 Hiragana-Zeichen, 71 Katakana-Zeichen, 2967 Kanji-Zeichen, 52 Romaji-Zeichen und 10 Zahlen.

Technische Details

Architekturübersicht

Letters_architecture (1).png

Technologie / Sprache / Werkzeuge verwendet

Vorderes Ende

Preact ist eine leichtgewichtige Version des React-ähnlichen Frameworks. Es ist fast so wie es ist implementiert, aber wahnsinnig leicht [^ preact_gzip]. Ich war nicht von React überwältigt, also hatte ich keine Probleme mit Preact [^ preact_api].

[^ preact_gzip]: Ungefähr 3 KB mit gzip. Erstaunlich. [^ preact_api]: Die Hook-API für funktionale Komponenten kann normalerweise in Preact verwendet werden, und es gibt auch einen Router für Preact.

Backend

Da der Teil für maschinelles Lernen Python3 + Keras verwendet, wird Python aufgrund seiner Affinität und Bequemlichkeit für das Backend ausgewählt, das die Inferenzverarbeitung in Echtzeit durchführen muss. Flask wird einfach ausgewählt, weil es leicht und benutzerfreundlich ist. Da Sie jedoch manchmal auch auf einem Anwendungsserver unter Python eine asynchrone Verarbeitung durchführen möchten, gehen Sie zu FastAPI. Ich denke auch darüber nach, es zu ersetzen. Es gibt keinen besonderen Grund, sich für Nginx, uWSGI, zu entscheiden, aber im Grunde sind Anwendungsserver wie Flask nicht für das Verhalten des Web-Frontends in Produktionsumgebungen optimiert, sodass sie für diese Anwendungen und Flask am besten geeignet sind. Ich benutze nur etwas, das eine hohe Affinität hat.

Teil des maschinellen Lernens

Sowohl das Lernen als auch das Denken verwenden das Deep-Learning-Framework Keras.

Infrastruktur wie Ausführungsumgebung

Ich verwende GCP im Allgemeinen (ich verwende keine anderen Cloud-Dienste als GCP). Der Backend-Server verwendet "Google Compute Engine", der Speicherort für Bilddateien usw. "Google Cloud Storage" und der Load Balancer "Google Cloud Load Balancing". Ich habe mir Sorgen um "Google Cloud Load Balancing" gemacht, weil es ungefähr 2700 Yen pro Monat (Stand 23. März 2020) für die Grundnutzungsgebühr kostet, aber das Zertifikat wird zufällig automatisch verwaltet. Ich war mir sicher, dass ich die Anzahl der Instanzen erhöhen konnte, wenn die Anzahl der Zugriffe zunahm, und entschied mich, sie einmal zu verwenden.

Die Bereitstellung wird im folgenden Ablauf mit dem Docker-Container als Freigabeeinheit ausgeführt.

  1. Erstellen Sie das Frontend in der Entwicklungsumgebung
  2. Erstellen Sie ein Container-Image mit vorgefertigtem und ausführbarem Code
  3. Verschieben Sie das erstellte Container-Image in eine private Container-Registrierung
  4. Erstellen Sie eine Instanzvorlage basierend auf dem Push-Container-Image
  5. Aktualisieren Sie die Instanzgruppe basierend auf der Instanzvorlage

Es gibt viele Katakana ... w Wir denken bisher nicht daran, die Trainingsdaten zu aktualisieren, daher verwenden wir ein Modell, das bereits trainiert wurde.

Andere Tools und Services, für die gesorgt wurde

Inkscape Es ist eine kostenlose Software, die fast die gleichen Funktionen wie Adobe Illustrator bietet. Wird zum Erstellen von Logos und Symbolen verwendet.

** Machen wir Fabicon favicon.ico! ** Dies ist sehr praktisch, wenn Sie Favicon-Stapel erstellen, die verschiedene Größen und Formate unterstützen.

EZGIF.COM - Animated GIF editor and GIF maker Dies ist ein praktischer Dienst zum Konvertieren des Demo-Videos der App in GIF, wenn Sie es auf Twitter auf Qiita hochladen möchten. Ich habe mehrere ähnliche Dienste ausprobiert, aber ich persönlich fand diesen Dienst aufgrund der Flexibilität der Konvertierungs- und Verarbeitungszeit am bequemsten.

Wikitionary Um eine Liste von Kanji zu erstellen, wollte ich sie nach den Noten klassifizieren, die ich in der Schule gelernt habe, also sammelte ich die Daten. Wir haben bereits Daten wie Messwerte, Gesamtzahl der Striche und Abteilungsleiter erfasst, implementieren derzeit jedoch keine Funktionen zur Anzeigeklassifizierung / -suche.

Daten zum Trainieren von Modellen für maschinelles Lernen

ETL Character Database(ETL CDB) Handschriftliche Zeichen (+ geringe Anzahl gedruckter Zeichen) Dies ist ein Datensatz mit Bilddaten. Es handelt sich um einen Datensatz, der aus etwa 3200 in Japan verwendeten Zeichentypen besteht, und es gibt 1.115.065 Bilddaten. Zeichentypen bestehen aus Hiragana, Katakana, Kanji, alphanumerischen Zeichen und Symbolen, enthalten jedoch keine Kleinbuchstaben im lateinischen Alphabet (Romaji). Darüber hinaus ist ETLCDB ein Datensatz, der unter den folgenden Punkten etwas schwierig zu handhaben ist.

Ich habe [Python-Skript zum Extrahieren von Bildern aller ETLCDB-Datensätze] erstellt und veröffentlicht (https://github.com/choo/etlcdb-image-extractor). Nehmen Sie die Rohbilddaten aus den Binärdaten des Datensatzes und speichern Sie jeden Code als Verzeichnis in PNG, damit er als Unicode-Codepunktbezeichnung behandelt werden kann. Der Datensatz kann kostenlos verwendet werden. Bitte beachten Sie jedoch, dass dort "Bitte kontaktieren Sie uns für Bedingungen für die kommerzielle Nutzung" steht.

The EMNIST Datset Dies ist ein handgeschriebener Zeichendatensatz, der vom NIST (American National Institute of Standards and Technology) bereitgestellt wird. Es gibt 814.255 Bilder für alle 62 Zeichen, einschließlich Romaji-Groß- und Kleinschreibung und Zahlen. Beachten Sie, dass MNIST, das häufig in Deep-Learning-Tutorials vorkommt, eine Teilmenge dieses Datensatzes ist. Die oben erwähnte ETL-CDB enthält viele Zeichen, aber es gibt keine Daten in niederrömischen Zeichen. Ich wollte jedoch unbedingt alle alphanumerischen Zeichen für die Bewertung einbeziehen, daher fügte ich einen Datensatz hinzu, der alle römischen Zeichen als Trainingsdaten enthielt.

Quellcode etc.

Die Basisquelle ist unter GitHub Repository verfügbar. Einige für die Ausführung der Anwendung erforderliche Dateien, z. B. trainierte Modelle, werden jedoch nicht auf GitHub abgelegt, sodass die Ausführungsumgebung nicht wie eine Entwicklungsumgebung reproduziert werden kann.

Impressionen

Was ich beim Spielen mit der App gefühlt habe

Jetzt ist es plötzlich ein nicht verwandtes Thema, aber können Sie die Bedeutung des folgenden Satzes entschlüsseln? (* Ab dem Zeitpunkt der Veröffentlichung leicht geändert)

** "Uguchi Uriki Nirikiko Yu" **

mushimegane_boy.png

sashimi_maguro_ootoro.png kani_ashi.png

Es tut mir leid, ein nutzloses Bild zu setzen, damit Sie nicht sofort die richtige Antwort sehen können: Schweiß:

Und es gibt nicht einmal einen einzigen Buchstaben für diejenigen, die denken, dass das Bild ein vollständiger Haken ist und dass es eine Katakana-Notation von "Return to Melt" ist ... Die richtige Antwort lautet wie folgt: Tatsächlich handelt es sich nur um eine Liste von Zeichen, die überhaupt keinen Satz enthalten.

卜: Wasser ** 卜 ** Ana ** "卜" ** Mund: ** Mund ** Innere Entzündung, ** Mund ** Ecke ** "Mund" ** Leistung: ** Leistung **, ** Leistung ** ** "Leistung" ** Zwei: ** zwei ** Kotamagawa, ** zwei ** Termverteilung ** "zwei" ** Engineering: ** Engineering ** Während des Prozesses ** Engineering **, Saito ** Engineering ** 's ** "Engineering" ** Abend: ** Abend **, ** Abend **, ** Abend ** Essen ** "Abend" ** (Wenn Sie eine Google-Suche kopieren und durchführen, werden Sie feststellen, dass es sich bei allen um Kanji handelt.)

Wahrscheinlich können nicht viele Leute alle Zeichen richtig erkennen. Wenn ja, stellt sich heraus, dass ** "wenn es ein korrekter Druck ist, kann jedes Zeichen von Menschen erkannt und gelesen werden" nicht wahr ist ** [^ miss_read]. Wenn Sie beispielsweise aufgefordert werden, die Angabe "Kou" vorzulesen, ist die einzige Antwort "entweder" Kou "der Konstruktion oder" E "(e) von Katakana". Ich frage mich, ob es möglich ist [^ e_font]. Mit anderen Worten, ** es kann sehr schwierig sein, durch ein einzelnes Zeichen zu unterscheiden **.

[^ miss_read]: Wenn es nicht nur eine Fehlinterpretation ist ... [^ e_font]: Abhängig von der Schriftart kann es Schriftarten / Personen geben, die zwischen Kanji und Katakana unterscheiden können.

Wenn die Frage "Können Sie die Bedeutung des nächsten Satzes entschlüsseln?" Am Anfang dieses Abschnitts ** "Was steht für jedes Zeichen in der nächsten Zeichenfolge geschrieben?" ** lautet, ist die Ansicht ebenfalls unterschiedlich. Ich denke, es gibt viele Menschen, die anders sind.

Wie oft gesagt wird, habe ich beim Lernen oder Experimentieren mit maschinellem Lernen, insbesondere tiefem Lernen, oft das starke Gefühl, dass die menschliche Wahrnehmung wahrscheinlich kontextabhängig ist. Es gibt. Diese Zeichenerkennung ist ein typisches Beispiel, und wenn wir ein Zeichen lesen, erkennen und unterscheiden wir nicht nur die Figur dieses Zeichens allein, sondern "welche Art von Zeichen ist darum herum geschrieben". Es stützt sich stark auf "Informationen, die als Kontext bezeichnet werden können", wie "welche Art von Wörtern und morphologischen Elementen verwendet werden" und "welche Art von Wörtern dort natürlich geschrieben sind" ** Sie können sehen, dass.

In der diesmal entwickelten App wird die Bilderkennung und die Bewertung ohne Verwendung von Kontextinformationen durchgeführt, sodass es einige Zeichen gibt, bei denen es schwierig ist, hohe Punktzahlen zu erzielen. Typische Beispiele sind die oben genannten 5 Zeichen, aber andere Zeichen wie 0 (Zahl Null) und O (lateinisches Alphabet O) sind schwer zu erkennen, da sie für sich selbst schwer zu erkennen sind, sodass es schwierig ist, eine hohe Punktzahl zu erzielen. Es gibt eine Reihe von.

In der Entwicklung des maschinellen Lernens arbeite ich oft, während ich darüber nachdenke, "wie Menschen erkennen", aber es ist sehr interessant, mich nur damit zu beschäftigen, und ich bin überrascht, wie gut das menschliche Gehirn ist. Oft gibt es. Ich denke auch, dass es aus dieser Perspektive viele Hinweise gibt, wie zum Beispiel "was KI im Moment kann und was nicht".

Persönlich haben Kontextinformationen, nicht nur Wörter, ein Niveau erreicht, das durch die Verarbeitung natürlicher Sprache analysiert werden kann, und ich denke, dass sich das multimodale Tiefenlernen in den nächsten Jahren erheblich entwickeln wird. Ich glaube, dass die KI nach dem Lesen des Kontexts natürlich sehr genaue Schlussfolgerungen ziehen kann. Durch diese Fortschritte glaube ich, dass die sogenannte "intelligente KI" in nicht allzu ferner Zukunft realisiert wird.

Schwierigkeiten bei der Freisetzung in der persönlichen Entwicklung

In der persönlichen Entwicklung ist es sehr schwierig zu entscheiden, wie viel Sie verdienen und freigeben sollen, im Gegensatz zu dem Fall, in dem der Liefertermin vertraglich festgelegt ist usw. wie geschäftlich. Ob Geschäft oder Hobby, wenn Sie viel Software entwickelt haben, wissen Sie, aber mitten in der Entwicklung gibt es zusätzlich zu den Fehlern, die behoben werden müssen, Verbesserungen und Funktionen, die meiner Meinung nach vorhanden sein sollten. Komm unzählige heraus. Selbst in dieser persönlichen Entwicklung wurden noch viele Funktionen hinzugefügt und Punkte sollten verbessert werden ...

Unter solchen Umständen ist es sehr schwierig zu entscheiden, "wie weit wir es veröffentlichen können". Ich denke, das Wichtigste in einer solchen Situation ist ** ein starker Wille, "es absolut zur Welt zu bringen" **.

Es scheint als Slogan in Facebook verwendet zu werden ** "Fertig ist besser als perfekt" ** "Die Software ist nie in einwandfreiem Zustand. Deshalb haben wir sie mit einem Gefühl der Geschwindigkeit veröffentlicht und sie nach und nach weiter verbessert. Es ist wichtig weiterzumachen "** Es scheint, dass der Hintergrund die Absicht ist [^ facebook]. Wie durch dieses Wort charakterisiert, ist es notwendig, beim Loslassen bis zu einem gewissen Grad aufzugeben. Andererseits wird oft gesagt, dass es lange dauert, bis ein Benutzer, der einmal abgereist ist, zurückkommt, und es ist ziemlich schwierig, Produkte von geringer Qualität leicht auf die Welt zu bringen und den Stolz als Ingenieur zu beeinträchtigen. Es ist schwierig.

Aus diesem Grund ist es auch in der persönlichen Entwicklung am besten, ein ** Veröffentlichungsdatum festzulegen (ein Veröffentlichungsdatum im Voraus festzulegen, damit dort alles veröffentlicht wird **). Ich frage mich, ob es heutzutage einen gibt. (Es kann auch andere gute Möglichkeiten geben ... Wenn Sie es wissen, möchte ich es wirklich wissen, also lassen Sie es mich bitte wissen ...!)

Ich habe mehr Gedanken und Gedanken über diese "Schwierigkeit beim Release-Timing", daher möchte ich einen separaten Artikel als Gedicht schreiben.

[^ facebook]: The Hacker Way - Facebook enthält den Originaltext. Es ist ein sehr schöner Satz.

Schließlich

In Tokio ist es aufgrund des starken Schneefalls aufgrund der Aufforderung, nicht auszugehen, schwierig, aus dem Haus zu kommen, und ich hoffe, Sie können sogar ein wenig spielen, wenn Sie möchten. Es gibt immer noch viele Unvollkommenheiten und es kann funktionell nicht ausreichend sein, aber ich hoffe es gefällt euch!

Vor kurzem habe ich angefangen, Twitter im Detail zu betreiben. Wenn Sie möchten, folgen Sie bitte Twitter-Konto m (_ _) m

Recommended Posts

Veröffentlichung eines Webdienstes zum Bewerten handgeschriebener Zeichen mit DeepLearning
Erstellen einer Webanwendung mit Flask ②
Erstellen einer Webanwendung mit Flask ①
Erstellen einer Webanwendung mit Flask ③
Erstellen einer Webanwendung mit Flask ④
Eindrücke von der Verwendung von Flask für einen Monat
Erstellen Sie einen Webdienst mit Docker + Flask
Flask-Erstellen Sie einen Webdienst mit SQLAlchemy + PostgreSQL
Erstellen Sie eine Webmap mit Python und GDAL
Tipps für eine gute Verwendung von Elastic Search
Lassen Sie uns mit SWIG ein Modul für Python erstellen