Dans la précédente (3e), Dessin d'un "front de type carte météo" par apprentissage automatique basé sur les données météorologiques (3) J'ai posté une histoire sur la suppression des éléments de première ligne de la «carte météorologique de rupture» pour créer une image d'enseignant.
Dans cette histoire, la version en noir et blanc de la "carte météo flash" qui avait été accumulée dans le passé a été utilisée parce que la période pendant laquelle la version couleur de la "carte météo flash" pour découper les éléments de la ligne de front était courte (bien que ce soit une affaire tout à fait personnelle) J'ai essayé de le coloriser.
Récemment, j'ai entendu parler de photographies et de films en noir et blanc colorisés par apprentissage automatique. Dans le passé, les images pendant la guerre, qui n'avaient aucun sens de la réalité, sont extrêmement réalistes, et j'ai l'impression qu'elles se rapprochent avec un sens de la même époque.
La colorisation cette fois n'a rien à voir avec une telle histoire, seulement la situation de l'algorithme d'extraction des éléments avant.
Dans la version noir et blanc de la carte météo, bien sûr, le front, les lignes de longitude et de latitude, les lignes de carte et les lignes isobares sont toutes les mêmes noires. Par conséquent, je ne pouvais pas penser à un bon moyen de couper uniquement la ligne de front à partir de là, et il est devenu nécessaire de la coloriser.
Je veux dire, ce que j'ai vraiment fait, c'est de dire dans l'ordre chronologique
(1) En tant qu'image de sortie, nous avons d'abord créé un réseau de neurones qui apprend la carte météorologique de rupture elle-même en tant qu'image de l'enseignant sans couper l'élément avant. La ligne de front n'a pas été bien apprise. (2) Lorsque je pensais réduire l'objectif d'apprentissage à la ligne de front et réfléchir à la façon d'extraire les éléments de la ligne de front, j'ai remarqué l'existence de la version couleur "carte météo flash". (3) J'ai téléchargé la version couleur disponible de "Breaking News Weather Map" et j'ai pu extraire l'image de première ligne en fonction de la couleur. (4) Lorsque je me suis entraîné avec une image d'enseignant avec uniquement la ligne de front, j'ai trouvé que cela fonctionnerait dans une certaine mesure, j'ai donc décidé d'augmenter le nombre d'exemples de cartes météorologiques. À ce stade, la version couleur n'était disponible que pendant environ six mois. (5) Étant donné que le réseau de neurones que je faisais à cette époque génère une image à partir d'une image, il est peut-être possible de convertir une carte météo en noir et blanc en une carte météo en couleur? J'ai pensé.
C'était ça. Puisque le réseau de neurones de l'image a commencé à se déplacer de l'image dans une certaine mesure, je me suis demandé s'il pouvait être appliqué.
En conséquence, cela a mieux fonctionné que ce à quoi je m'attendais.
Nous avons pu augmenter le nombre d'images d'enseignants, qui n'était qu'environ six mois, à plus de deux ans à la fois. En obtenant deux séries de printemps, d'été, d'automne et d'hiver, la variation des images des enseignants s'est accrue.
Mac mini(2018) Processeur Intel Core i7 6 cœurs à 3,2 GHz Mémoire DDR4 de 32 Go à 2667 MHz
OS macOS Catalina python3.7 Keras 2.0
Nous utilisons.
Le réseau que je créais a une structure assez simple. Avec une structure séquentielle, une image en échelle de gris à 1 canal est convertie en une image couleur à 3 canaux en extrayant des caractéristiques avec Conv2D, en la passant à travers un CNN à 4 étages dans la couche inférieure, puis en la renvoyant avec Conv2D Transpose.
L'image d'entrée est de 256x256, mais j'ai réduit les foulées de Conv2D quatre fois, l'ai fait 16x16, puis j'ai passé Conv2D quatre fois de plus. Après cela, il est restauré à sa taille d'origine par Conv2D Transpose.
Puisque l'apprentissage utilise «mean_squared_error», c'est un apprentissage qui l'amène à l'image de l'enseignant en tant que valeur de pixel.
network.py
# parameter settings
num_hidden1 = 32
num_hidden2 = 64
num_hidden3 = 128
num_hidden4 = 64
num_hidden5 = 32
num_hidden6 = 32
######### start of network definition
NN_1 = Sequential()
#--- encode start
NN_1.add(Conv2D(num_hidden1, data_format='channels_first', kernel_size=(3,3), strides=(2,2), activation='relu', input_shape=(in_ch, i_dmlat, i_dmlon), padding='same'))
NN_1.add(Conv2D(num_hidden1, data_format='channels_first', kernel_size=(3,3), activation='relu', input_shape=(in_ch, i_dmlat, i_dmlon), padding='same'))
NN_1.add(Conv2D(num_hidden1, data_format='channels_first', kernel_size=(3,3), strides=(2,2), activation='relu', input_shape=(in_ch, i_dmlat, i_dmlon), padding='same'))
NN_1.add(Conv2D(num_hidden2, data_format='channels_first', kernel_size=(3,3), strides=(2,2), activation='relu', padding='same'))
NN_1.add(Conv2D(num_hidden2, data_format='channels_first', kernel_size=(3,3), activation='relu', padding='same'))
NN_1.add(Conv2D(num_hidden2, data_format='channels_first', kernel_size=(3,3), strides=(2,2), activation='relu', padding='same'))
#--- encode out
NN_1.add(Conv2D(num_hidden3, data_format='channels_first', kernel_size=(3,3), activation='relu', padding='same'))
NN_1.add(Conv2D(num_hidden3, data_format='channels_first', kernel_size=(3,3), activation='relu', padding='same'))
NN_1.add(Conv2D(num_hidden3, data_format='channels_first', kernel_size=(3,3), activation='relu', padding='same'))
NN_1.add(Conv2D(num_hidden3, data_format='channels_first', kernel_size=(3,3), activation='relu', padding='same'))
#--- decode start
NN_1.add(Conv2DTranspose(num_hidden4, data_format='channels_first', kernel_size=(3,3), strides=(2,2), activation='relu', padding='same'))
NN_1.add(Conv2DTranspose(num_hidden4, data_format='channels_first', kernel_size=(3,3), strides=(2,2), activation='relu', padding='same'))
NN_1.add(Conv2DTranspose(num_hidden5, data_format='channels_first', kernel_size=(3,3), strides=(2,2), activation='relu', padding='same'))
NN_1.add(Conv2DTranspose(num_hidden5, data_format='channels_first', kernel_size=(3,3), strides=(2,2), activation='relu', padding='same'))
NN_1.add(Conv2D(num_hidden5, data_format='channels_first', kernel_size=(3,3), activation='relu', padding='same'))
NN_1.add(Conv2D(num_hidden6, data_format='channels_first', kernel_size=(3,3), activation='relu', padding='same'))
#--- back to 3 channel
NN_1.add(Conv2D(3, data_format='channels_first', kernel_size=(3,3), activation='relu', padding='same'))
####### end of network definition
# compile network
NN_1.compile(optimizer='adam', loss='mean_squared_error' , metrics=['accuracy'])
# do training
NN_1.fit(np_i_data_train_tr, np_t_data_train_tr, epochs=num_itter , callbacks=cbks, batch_size=8 , validation_split=0.2 )
# Save model and weights
json_string = NN_1.to_json()
open(os.path.join(paramfiledir, 'cnnSPAStoColSPAS2_011_model.json'),'w').write(json_string)
NN_1.save_weights(os.path.join(paramfiledir, 'cnnSPAStoColSPAS2_011_weight.hdf5'))
L'image d'entrée est, par exemple, (carte météo flash 2018/9/30 21 UTC).
L'image de l'enseignant de sortie est comme ça.
Sur les six mois de données, j'ai essayé d'utiliser la valeur de deux mois pour l'évaluation, et j'ai formé la version noir et blanc et la version couleur en utilisant environ quatre mois (plus de 700 feuilles parce qu'il y a six feuilles par jour).
Les données d'apprentissage convergeront vers une telle image relativement rapidement. Les cartes, les lignes de longitude / latitude et les dates seront surapprises en peu de temps.
En utilisant le réseau appris, j'ai essayé de coloriser la carte météo en noir et blanc. La droite est la carte météo originale en noir et blanc et la gauche la carte météo colorisée. Je pense que le but de la découpe de l'élément de première ligne en fonction de la couleur est une colorisation suffisante.
Bien qu'il s'agisse d'une histoire détaillée, la case avec la date et l'heure en haut à gauche est également le résultat de l'apprentissage et de la prédiction sous forme d'image. Les chiffres (pression, vitesse de déplacement) qui apparaissent sur la carte météo semblent être directement prédits. «Juillet 2017» est seulement prédit comme «janvier 2018» comme cancer. Étant donné que les données utilisées pour l'apprentissage datent de 2018 et n'incluent pas le mois de juillet, "Je ne peux pas prédire ce qui ne figure pas dans l'entrée" J'ai envie de dire.
La même chose a été convertie en Heisei comme arme pour la chaîne de caractères du décret de la génération. Il semble que l'apprentissage était tel que le poids était nul et que seul le biais subsistait, de sorte que quoi qu'il arrive, ce serait Heisei.
J'ai essayé de faire des bêtises à la main (rires). Ceci est ma création.
J'ai aussi essayé de le dessiner pour les enfants.
Il semble que j'ai une journée plus longue pour écrire à la main le symbole de la première ligne.
Cette fois, j'ai résumé l'histoire de la coloration de la carte météo en noir et blanc. En conséquence, le nombre d'images découpées avant a augmenté de manière significative, et la précision de l'apprentissage du dessin pour l'objectif final des "fronts de type carte météorologique" s'est améliorée.
La prochaine fois, comme dernière tranche, j'essaierai de dessiner un "front de type carte météo" par apprentissage automatique basé sur le réseau neuronal de dessin de première ligne [(5) Machine learning Automatic Front Detection in Weather Data](https: // qiita) Je publierai sur .com / m-taque / items / 2788f623365418db4078). À partir du 2020.2.9, la limite mensuelle de la capacité d'affichage d'images sur le site de Qiita a été atteinte, et le tour final sera reporté à mars.
Recommended Posts