Obsah:

Planetárium poháňané neurónovou sieťou využívajúce Python, Electron a Keras: 8 krokov
Planetárium poháňané neurónovou sieťou využívajúce Python, Electron a Keras: 8 krokov

Video: Planetárium poháňané neurónovou sieťou využívajúce Python, Electron a Keras: 8 krokov

Video: Planetárium poháňané neurónovou sieťou využívajúce Python, Electron a Keras: 8 krokov
Video: Самые экономичные внедорожники 2022 года 2024, November
Anonim
Planetárium poháňané neurónovou sieťou využívajúce Python, Electron a Keras
Planetárium poháňané neurónovou sieťou využívajúce Python, Electron a Keras

V tomto návode vám ukážem, ako som napísal automatický generátor 3D planetária pomocou jazykov Python a Electron

Video vyššie ukazuje jedno z náhodných planetárií, ktoré program vygeneroval.

** Poznámka: Tento program nie je nijako dokonalý a na niektorých miestach ani príliš pythonický. Diskriminátor neurálnej siete je len ~ 89% presný, takže niektoré zvláštne obrázky sa dostanú do planetária **

Špecifiká

Planetárium sa pýta na API NASA na obrázky súvisiace s vesmírom a na určenie, či je obrázok vhodný na spracovanie, používa konvolučnú neurónovú sieť. Program potom pomocou OpenCV odstráni pozadie z obrázku a nakoniec sa obrázky spoja do jedného veľkého ekvirektangulárneho obrázku. Tento obrázok sa potom uloží a aplikácia Electron Node.js obrázok otvorí a pomocou balíka PhotoSphere.js si obrázok zobrazí vo formáte 3D v štýle planetária.

Závislosti

Python:

  • Keras
  • Vankúš
  • cv2
  • Numpy
  • Žiadosti
  • urllib
  • Náhodne
  • čas
  • io

Elektrón:

PhotoSphere

Krok 1: Nastavenie prostredia

Inštalácia Electron a Python

Najprv sa uistite, že máte nainštalované node.js a npm (ak nie, môžete si ich stiahnuť tu)

Ďalej musíte nainštalovať Electron. Otvorte príkazový riadok a zadajte nasledujúci príkaz:

npm nainštalovať elektrón -g

Ďalej potrebujete python, ktorý si môžete stiahnuť tu

Nastavenie virtuálneho prostredia

Otvorte príkazový riadok a potom zadajte nasledujúce príkazy na nastavenie virtuálneho prostredia:

pip install virtualenv

virtuálny priestor

cd priestor

skripty / aktivovať

Inštalácia závislostí Pythonu

Spustite tieto príkazy v príkazovom riadku a nainštalujte svoje závislosti od pythonu:

pip install keras

pip inštalovať vankúš

pip install numpy

požiadavky na inštaláciu pipu

pip install opencv-pythonAk chcete trénovať sieť sami, uistite sa, že ste pre Keras nastavili zrýchlenie GPU

Krok 2: Dotaz na API vyhľadávania NASA

Prehľad

NASA má veľa skutočne užitočných rozhraní API, ktoré môžete použiť vo svojich projektoch. Na tento projekt použijeme API na vyhľadávanie, ktoré nám umožní vyhľadať obrázky súvisiace s vesmírom v databáze snímok NASA.

Kód

Najprv musíme definovať funkciu pythonu, aby prijala argument, ktorý bude fungovať ako hľadaný výraz:

def get_image_search (fráza):

prejsť

Ďalej skonvertujeme hľadaný výraz do formátu adresy URL a potom použijeme knižnicu žiadostí na zadanie dotazu na API:

def get_image_search (fráza):

params = {"q": urllib.parse.quote (arg), "media_type": "image"} results = requests.get ("https://images-api.nasa.gov/search", params = params)

Nakoniec dekódujeme reťazec kolekcia+JSON, ktorý nám API vrátilo, a extrahujeme zoznam odkazov na obrázky súvisiace s hľadaným výrazom:

def get_image_search (fráza):

params = {"q": urllib.parse.quote (arg), "media_type": "image"} results = requests.get ("https://images-api.nasa.gov/search", params = params) data = [result ['href'] pre výsledok vo results.json () ["collection"] ["items"]

Ideme na to! Teraz máme útržok kódu, ktorý môže dotazovať API na vyhľadávanie obrázkov NASA a vracať zoznam odkazov na obrázky súvisiace s naším hľadaným výrazom.

Krok 3: Konvolučná neurónová sieť

Prehľad

Úlohou neurálnej siete je klasifikovať, či obraz je niečím vo vesmíre alebo nie. Na tento účel použijeme konvolučnú neurónovú sieť alebo CNN na vykonanie série maticových operácií s obrázkom a zistíme, aký je priestor-y. Nebudem to všetko vysvetľovať, pretože je za tým veľa teórie, ale ak sa chcete dozvedieť viac o neurónových sieťach, navrhujem „Majster strojového učenia“

Kód

Najprv musíme importovať naše závislosti:

import os

#Oprava chyby pri nástupe vlaku na GPU os.environ ['CUDA_VISIBLE_DEVICES'] = '' import tensorflow ako tf if tf.test.gpu_device_name (): print ('GPU found') else: print ("No GPU found") z keras.preprocessing.image import ImageDataGenerator z keras.preprocessing import image from keras.models import Sequential from keras.layers import Conv2D, MaxPooling2D from keras.layers import Activation, Dropout, Flatten, Dense from keras import backend as K from PIL import Image import numpy ako np

Ďalej musíme definovať náš model:

img_width, img_height = 1000, 500

train_data_dir = 'v_data/train' validation_data_dir = 'v_data/test' nb_train_samples = 203 nb_validation_samples = 203 epochs = 10 batch_size = 8 if K.image_data_format () == 'channels_first': input_shape: = (img_width, img_height, 3) model = Sequential () model.add (Conv2D (32, (2, 2), input_shape = input_shape)) model.add (Activation ('relu')) model.add (MaxPooling2D (pool_size) = (2, 2))) model.add (Conv2D (32, (2, 2))) model.add (Activation ('relu')) model.add (MaxPooling2D (pool_size = (2, 2))) model.add (Conv2D (64, (2, 2))) model.add (Activation ('relu')) model.add (MaxPooling2D (pool_size = (2, 2))) model.add (Flatten ()) model. add (Dense (64)) model.add (Activation ('relu')) model.add (Dropout (0.5)) model.add (Dense (1)) model.add (Activation ('sigmoid')) model.compile (strata = 'binary_crossentropy', optimalizátor = 'rmsprop', metriky = ['presnosť'])

Vycvičil som pre vás model, ale ak by ste chceli trénovať model sami, vo svojom vlastnom súbore údajov, potom som pripojil školiaci kód. V opačnom prípade si môžete stiahnuť súbor HDF5 natrénovaného modelu. Vzhľadom na obmedzenia súboru Instructables som ho musel premenovať s príponou „.txt“. Ak ho chcete použiť, premenujte súbor na príponu ".h5" a načítajte ho s týmto kódom:

model.load_weights ("model_saved.h5")

Aby sme pomocou siete predpovedali, aký priestorový je obrázok, definujeme túto funkciu:

def predikcia (cesta_ image):

img = image.load_img (cesta_k obrázku, cieľová_ veľkosť = (1000, 500)) img = np.expand_dims (img, os = 0) result = model.predict_classes (img) návratový výsledok [0] [0]

Krok 4: Spracovanie obrázku

Prehľad

Na spracovanie obrazu používam knižnicu OpenCV (cv2). Najprv rozmazáme okraje obrázku a potom odstránime pozadie vytvorením masky a zmenou hodnôt alfa tmavších farieb.

Kód

Toto je časť funkcie, ktorá rozmazáva okraje:

def processImage (img):

RADIUS = 20 # Otvorte obrázok im = Image.open ("pilbuffer.png") # Prilepte obrázok na biele pozadie priemer = 2 * RADIUS späť = Image.new ('RGB', (veľkosť obrázku [0] + priemer, im.size [1] + diam), (0, 0, 0)) back.paste (im, (RADIUS, RADIUS)) # Create mask blur mask mask = Image.new ('L', (im.size [0] + diam, im.size [1] + diam), 255) blck = Image.new ('L', (im.size [0] - diam, im.size [1] - diam), 0) maska. paste (blck, (diam, diam)) # Rozostrí obrázok a prilepí rozmazaný okraj podľa masky blur = back.filter (ImageFilter. GaussianBlur (RADIUS / 2)) back.paste (blur, mask = mask) back.save (" transition.png ") back.close ()

Ďalej nastavíme tmavšie farby na priehľadné a obrázok dočasne uložíme:

#Vytvorte masku a filter a vymeňte čiernu za alfa

obrázok = cv2.imread ("transition.png") hMin = 0 sMin = 0 vMin = 20 hMax = 180 sMax = 255 vMax = 255 nižší = np.array ([hMin, sMin, vMin]) horný = np.array ([hMax, sMax, vMax]) hsv = cv2.cvtColor (obrázok, cv2. COLOR_BGR2HSV) maska = cv2.inRange (hsv, dolný, horný) výstup = cv2.bitwise_and (obrázok, obrázok, maska = maska) *_, alfa = cv2.split (výstup) dst = cv2.merge ((výstup, alfa)) výstup = dst s otvoreným ("buffer.png", "w+") ako súbor: odovzdať cv2.imwrite ("buffer.png", výstup)

Krok 5: Spojenie obrazov dohromady do ekvirektangulárnej projekcie

Prehľad

Táto funkcia nasníma viacero obrázkov a spojí ich do formátu, ktorý je možné interpretovať pomocou balíka PhotoSphere.js pomocou knižnice PIL (vankúš)

Kód

Najprv musíme vytvoriť obrázok, ktorý môže slúžiť ako hostiteľ pre ostatné obrázky:

nový = Image.new ("RGBA", (8000, 4000), farba = (0, 0, 0))

Ďalej musíme iterovať radom obrázkov (u všetkých sa zmenila veľkosť na 1 000 x 500) a umiestniť ich do obrázku:

h = 0

w = 0 i = 0 pre img v img_arr: new.paste (img, (w, h), img) w += 1000 if w == 8000: h += 500 w = 0 i += 1

Teraz to zabalíme do funkcie, ktorá ako argument vezme pole obrázkov a vráti nový obrázok:

def stitch_beta (img_arr):

new = Image.new ("RGBA", (8000, 4000), color = (0, 0, 0)) h = 0 w = 0 i = 0 pre img in img_arr: new.paste (img, (w, h), img) w += 1000, ak w == 8000: h += 500 w = 0 i += 1 vrátiť nové

Krok 6: Úplný skript Pythonu

Toto je úplný skript neurónovej siete python, ktorý je uložený ako net.py a importovaný do hlavného skriptu:

# import knižníc

import os #Fix for issue during train stepn on GPU os.environ ['CUDA_VISIBLE_DEVICES'] = '' import tensorflow as tf if tf.test.gpu_device_name (): print ('GPU found') else: print ("No GPU found ") z keras.preprocessing.image import ImageDataGenerator z keras.preprocessing import image from keras.models import Sequential from keras.layers import Conv2D, MaxPooling2D from keras.layers import Activation, Dropout, Flatten, Dense from keras import backend as K from PIL import Image import numpy as np img_width, img_height = 1000, 500 train_data_dir = 'v_data/train' validation_data_dir = 'v_data/test' nb_train_samples = 203 nb_validation_samples = 203 epochs = 10 batch_size = 8 if K.image_: input_shape = (3, img_width, img_height) else: input_shape = (img_width, img_height, 3) model = Sequential () model.add (Conv2D (32, (2, 2), input_shape = input_shape)) model.add (Aktivácia ('relu')) model.add (MaxPooling2D (pool_size = (2, 2))) model.add (Conv2D (32, (2, 2))) model. add (Activation ('relu')) model.add (MaxPooling2D (pool_size = (2, 2))) model.add (Conv2D (64, (2, 2))) model.add (Activation ('relu')) model.add (MaxPooling2D (pool_size = (2, 2))) model.add (Flatten ()) model.add (Dense (64)) model.add (Activation ('relu')) model.add (Dropout (0.5)) model.add (Dense (1)) model.add (Activation ('sigmoid')) model.compile (loss = 'binary_crossentropy', optimizer = 'rmsprop', metrics = ['precision']) model.load_weights ("model_saved.h5") def predikcia (cesta_ image): img = image.load_img (cesta_obrazu, cieľová_veľkosť = (1000, 500)) img = np.expand_dims (obr., os = 0) výsledok = model.predict_classes (obr) [0] [0]

Toto je hlavný súbor pythonu, api.py:

požiadavky na import, sys, random, urllib.parse, cv2

z PIL import Image, ImageFilter z io import BytesIO import numpy as np import net def get_image_search (num, phrase): count = 0 img_arr = for arg in phrase: print (arg) print (f "Aktuálny počet obrázkov: {count } ") i = 0 parametrov = {" q ": urllib.parse.quote (arg)," media_type ":" image "} results = requests.get (" https://images-api.nasa.gov/search ", params = params) data = [result ['href'] pre výsledok in results.json () [" collection "] [" items "] print (len (data)) if num> len (data): num = len (údaje) pri počítaní = num: break print (f "\ n {count} images retreived") return img_arr def stitch_beta (img_arr): new = Image.new ("RGBA", (8000, 4000), color = (0, 0, 0)) h = 0 w = 0 i = 0 pre img v img_arr: #pbar.set_description (f "Processing image {i +1}") new.paste (img, (w, h), img) w += 1000 if w == 8000: h += 500 w = 0 i += 1 vrátiť nový proces def Obrázok (obrázok): RADIUS = 20 # Otvoriť obrázok im = Image.open ("pilbuffer.png") # Prilepiť obrázok na bielom pozadí priemer = 2 * RADIUS späť = Image.new ('RGB', (veľkosť veľkosti [0] + priemer, veľkosť veľkosti [1] + priemer), (0, 0, 0)) späť.paste (im, (RADIUS, RADIUS)) # Vytvorte masku masky rozmazania = Image.new ('L', (veľkosť veľkostí [0] + priemer, veľkosť [1] + priemer), 255) blck = Image.new ('L', (im.size [0] - diam, im.size [1] - diam), 0) mask.paste (blck, (diam, diam)) # Blur image and paste blurred edge according to mask blur = back.filter (ImageFilter. GaussianBlur (RADIUS / 2)) back.paste (blur, mask = mask) back.save ("transition.png") back.close () #Create mask and filter replace black with alpha image = cv2.imread (" tranzit ion.png ") hMin = 0 sMin = 0 vMin = 20 hMax = 180 sMax = 255 vMax = 255 nižší = np.array ([hMin, sMin, vMin]) horný = np.array ([hMax, sMax, vMax]) hsv = cv2.cvtColor (obrázok, cv2. COLOR_BGR2HSV) maska = cv2.inRange (hsv, dolný, horný) výstup = cv2.bitwise_and (obrázok, obrázok, maska = maska) *_, alfa = cv2.split (výstup) dst = cv2.merge ((výstup, alfa)) výstup = dst s otvoreným ("buffer.png", "w+") ako súbor: odovzdajte cv2.imwrite ("buffer.png", výstup) #Edge detekcia a rozmazanie, ak _name_ == "_main_": search_terms = ["supernova", "planéta", "galaxia", "mliečna dráha", "hmlovina", "hviezdy"] #Hľadané výrazy je možné zmeniť na čokoľvek, čo má planetárium obsahovať img_arr = get_image_search (64, search_terms) print ("Obrázky načítané a nervovo filtrované") img = stitch_beta (img_arr) tlač ("Obrázky spojené") img.save ("stitched.png")

Krok 7: Aplikácia Electron

Prehľad

Vytvoríme jednoduchú aplikáciu pre elektróny, ktorá len umiestni a načíta prvok PhotoSphere. Súbory main.js a package.json sú priamo z webových stránok Electron a HTML je mierne upravená verzia HTML, ktorá sa nachádza na webových stránkach PhotoSphere. Zahrnul som súbory, ale všetky som premenoval na.txt, pretože Instructables tieto typy súborov nepovoľuje. Ak chcete súbory používať, premenujte ich s príslušnou príponou.

Kód

main.js

const {aplikácia, BrowserWindow} = vyžadovať ('elektrón')

funkcia createWindow () {const win = new BrowserWindow ({šírka: 800, výška: 600, webPreferences: {nodeIntegration: true}}) win.loadFile ('index.html')} app.whenReady (). then (createWindow) app.on ('window-all-closed', () => {if (process.platform! == 'darwin') {app.quit ()}}) app.on ('activate', () => {if (BrowserWindow.getAllWindows (). length === 0) {createWindow ()}}))

package.json

{

"name": "space", "version": "0.1.0", "main": "main.js", "scripts": {"start": "elektron." }}

index.html

Krok 8: Vykonanie

Vytvorenie rovnomerného uhlového obrazu

Ak chcete vytvoriť obrázok, spustite skript api.py v príkazovom riadku s aktivovaným virtuálnym prostredím:

api.py

Po dokončení spustenia skriptov spustite elektronickú aplikáciu pomocou:

npm začiatokVoila! Vaše planetárium je aktívne! Vďaka za prečítanie:)

Odporúča: