Sadržaj:

Planetarij s neuronskom mrežom koji koristi Python, Electron i Keras: 8 koraka
Planetarij s neuronskom mrežom koji koristi Python, Electron i Keras: 8 koraka

Video: Planetarij s neuronskom mrežom koji koristi Python, Electron i Keras: 8 koraka

Video: Planetarij s neuronskom mrežom koji koristi Python, Electron i Keras: 8 koraka
Video: Convolutional Neural Networks: Computer vision game changers with PyTorch 2024, Studeni
Anonim
Planetarij s neuronskom mrežom koji koristi Python, Electron i Keras
Planetarij s neuronskom mrežom koji koristi Python, Electron i Keras

U ovom uputstvu pokazat ću vam kako sam napisao automatski 3D planetarijski generator, koristeći Python i Electron

Gornji video prikazuje jedan od nasumičnih planetarija koje je program generirao.

** Napomena: Ovaj program ni na koji način nije savršen, a na nekim mjestima i nije baš piton. Diskriminator neuronske mreže je samo ~ 89% točan, pa će neke čudne slike ući u planetarij **

Specifičnosti

Planetarij traži NASA-in API za slike povezane sa svemirom i koristi konvolucijsku neuronsku mrežu kako bi utvrdio je li slika prikladna za obradu. Program tada koristi OpenCV za uklanjanje pozadine sa slike, a na kraju se slike spajaju u jednu veliku ravnopravnu sliku. Ova se slika tada sprema, a aplikacija Electron Node.js otvara sliku i koristi paket PhotoSphere.js za prikaz slike u 3D formatu u stilu planetarijuma.

Ovisnosti

Piton:

  • Keras
  • Jastuk
  • cv2
  • Numpy
  • Zahtjevi
  • urllib
  • Slučajno
  • vrijeme
  • io

Elektron:

Fotosfera

Korak 1: Postavljanje vašeg okruženja

Instaliranje Electrona i Pythona

Prvo provjerite imate li instalirane node.js i npm (ako nisu, možete ih preuzeti ovdje)

Zatim morate instalirati Electron. Otvorite naredbeni redak i unesite sljedeću naredbu:

npm instalirati elektron -g

Zatim vam je potreban python koji možete preuzeti ovdje

Postavljanje virtualnog okruženja

Otvorite naredbeni redak, a zatim unesite sljedeće naredbe za postavljanje virtualnog okruženja:

pip install virtualenv

virtualenv prostor

cd prostor

skripte / aktivirati

Instaliranje ovisnosti o Pythonu

Pokrenite ove naredbe u naredbenom retku da biste instalirali svoje ovisnosti o pythonu:

pip install keras

pip install jastuk

pip install numpy

pip zahtjevi za instalaciju

pip instalirajte opencv-pythonAko želite sami trenirati mrežu, svakako postavite ubrzanje GPU -a za Keras

Korak 2: Upit NASA API -ju za pretraživanje

Pregled

NASA ima mnogo zaista korisnih API -ja koje možete koristiti sa svojim projektima. Za ovaj projekt koristit ćemo API za pretraživanje koji nam omogućuje pretraživanje NASA-ine baze podataka sa slikama koje se odnose na svemir.

Kod

Prvo moramo definirati python funkciju kako bismo prihvatili argument koji će djelovati kao pojam za pretraživanje:

def get_image_search (izraz):

proći

Zatim ćemo pretvoriti pojam za pretraživanje u format URL -a, a zatim koristiti biblioteku zahtjeva za postavljanje upita API -ju:

def get_image_search (izraz):

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

Na kraju ćemo dekodirati zbirku+JSON niz koji nam je API vratio i izdvojit ćemo popis veza do slika povezanih s pojmom za pretraživanje:

def get_image_search (izraz):

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

Idemo tamo! Sada imamo isječak koda koji može upitati NASA -in API za pretraživanje slika i vratiti popis veza do slika povezanih s našim pojmom za pretraživanje.

Korak 3: Konvolucijska neuronska mreža

Pregled

Posao neuronske mreže je klasificirati je li slika nečega u svemiru ili nije. Da bismo to učinili, upotrijebit ćemo konvolucijsku neuronsku mrežu ili CNN za izvođenje niza matričnih operacija na slici i utvrditi koliko je to prostor-y. Neću ovo sve objašnjavati, jer iza toga stoji puno teorije, ali ako želite naučiti o neuronskim mrežama, predlažem "Master Learning Mastery"

Kod

Prvo moramo uvesti naše ovisnosti:

uvoz os

#Ispravite problem tijekom koraka vlaka na GPU os.environ ['CUDA_VISIBLE_DEVICES'] = '' uvezite tensorflow kao tf ako je tf.test.gpu_device_name (): print ('GPU found') else: print ("Nema GPU -a pronađeno") from keras.preprocessing.image import ImageDataGenerator from 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 uvoz numpy kao np

Zatim moramo definirati naš 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 epohe = 10 batch_size = 8 if K.image_data_format () == 'channels_first': input_shape_id_heth, = (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 (gubitak = 'binary_crossentropy', optimizer = 'rmsprop', metrika = ['točnost'])

Obrazovao sam model za vas, ali ako želite sami istrenirati model, na vlastitom skupu podataka, priložio sam kôd za obuku. U protivnom možete preuzeti datoteku HDF5 obučenog modela. Zbog ograničenja datoteka Instructables morao sam je preimenovati s nastavkom ".txt". Da biste je koristili, preimenujte datoteku u ekstenziju ".h5" i učitajte je ovim kodom:

model.load_weights ("model_saved.h5")

Za korištenje mreže za predviđanje prostora-y slike, definirat ćemo ovu funkciju:

def predvidjeti (image_path):

img = image.load_img (image_path, target_size = (1000, 500)) img = np.expand_dims (img, axis = 0) result = model.predict_classes (img) povratni rezultat [0] [0]

Korak 4: Obrada slike

Pregled

Za obradu slika koristim biblioteku OpenCV (cv2). Prvo ćemo zamagliti rubove slike, a zatim ćemo ukloniti pozadinu stvaranjem maske i promjenom alfa vrijednosti tamnijih boja

Kod

Ovo je dio funkcije koji zamagljuje rubove:

def processImage (img):

RADIUS = 20 # Otvorite sliku im = Image.open ("pilbuffer.png") # Zalijepite sliku na bijelu pozadinu diam = 2 * RADIUS natrag = Image.new ('RGB', (im.size [0] + diam, im.size [1] + diam), (0, 0, 0)) back.paste (im, (RADIUS, RADIUS)) # Izradi masku maske za zamućivanje = Image.new ('L', (im.size [0] + prečnik, im.size [1] + prečnik), 255) blck = Image.new ('L', (im.size [0] - prečnik, im.size [1] - prečnik), 0) maska. paste (blck, (diam, diam)) # Zamagljivanje slike i lijepljenje zamućenog ruba prema maski blur = back.filter (ImageFilter. GaussianBlur (RADIUS / 2)) back.paste (blur, mask = mask) back.save (" transition-p.webp

Zatim ćemo tamnije boje postaviti na prozirne i sliku privremeno spremiti:

#Stvorite masku i filtar, zamijenite crnu s alfa

image = cv2.imread ("transition.png") hMin = 0 sMin = 0 vMin = 20 hMax = 180 sMax = 255 vMax = 255 donji = np.mat ([hMin, sMin, vMin]) gornji = np.mara ([hMax, sMax, vMax]) hsv = cv2.cvtColor (image, cv2. COLOR_BGR2HSV) mask = cv2.inRange (hsv, donji, gornji) output = cv2.bitwise_and (slika, slika, maska = maska) *_, alfa = cv2.split (izlaz) dst = cv2.merge ((izlaz, alfa)) izlaz = dst s otvorenim ("buffer.png", "w+") kao datoteka: proći cv2.imwrite ("buffer.png", izlaz)

Korak 5: Spajanje slika u jednaku pravokutnu projekciju

Pregled

Ova funkcija uzima više slika i spaja ih u format koji se može protumačiti paketom PhotoSphere.js, koristeći knjižnicu PIL (jastuk)

Kod

Prvo moramo stvoriti sliku koja može djelovati kao domaćin za ostale slike:

new = Image.new ("RGBA", (8000, 4000), color = (0, 0, 0))

Zatim moramo ponoviti niz slika (koje su sve promijenjene na 1000x500) i postaviti ih u sliku:

h = 0

w = 0 i = 0 za img u img_arr: new.paste (img, (w, h), img) w += 1000 ako je w == 8000: h += 500 w = 0 i += 1

Sada ovo samo umotavamo u funkciju koja kao argument uzima niz slika i vraća novu sliku:

def stitch_beta (img_arr):

new = Image.new ("RGBA", (8000, 4000), color = (0, 0, 0)) h = 0 w = 0 i = 0 za img u img_arr: new.paste (img, (w, h), img) w += 1000 ako je w == 8000: h += 500 w = 0 i += 1 vrati novo

Korak 6: Potpuna skripta Python

Ovo je potpuna skripta neuronske mreže python, koja se sprema kao net.py i uvozi u glavnu skriptu:

# uvoz knjižnica

import os #Fix za problem tijekom koraka vlaka na GPU os.environ ['CUDA_VISIBLE_DEVICES'] = '' uvoz tensorflow kao tf ako je tf.test.gpu_device_name (): print ('GPU pronađen') else: print ("GPU nije pronađen ") iz keras.preprocessing.image import ImageDataGenerator iz keras.preprocess uvoz slike iz keras.models import Sequential iz keras.layers uvoz Conv2D, MaxPooling2D iz keras.layers uvoz Activation, Dropout, Flatten, Dense from keras import backend kao K iz PIL -a uvoz slike uvoz numpy kao 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 epohe = 10 batch_size = 8 if ': 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 (Aktivacija ('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 (Gusti (64)) model.add (Activation ('relu')) model.add (Ispadanje (0.5)) model.add (Dense (1)) model.add (Activation ('sigmoid')) model.compile (loss = 'binary_crossentropy', optimizer = 'rmsprop', metrics = ['točnost']) model.load_weights ("model_saved.h5") def predvidjeti (put_slike): img = slika.učitavanje_imga (put_slike, ciljna_ veličina = (1000, 500)) img = np.expand_dims (img, os = 0) rezultat = model.predict_classes (img) povratni rezultat [0] [0]

Ovo je glavna python datoteka, api.py:

zahtjevi za uvoz, sys, random, urllib.parse, cv2

iz PIL import slike, ImageFilter iz io importa BytesIO import numpy kao np import net def get_image_search (broj, izraz): count = 0 img_arr = za arg u frazi: print (arg) print (f "Broj trenutnih slika: {count } ") i = 0 params = {" q ": urllib.parse.quote (arg)," media_type ":" image "} results = requests.get (" https://images-api.nasa.gov/search ", params = params) data = [result ['href'] za rezultat u results.json () [" collection "] [" items "] print (len (data)) if num> len (data): num = len (podaci) dok se broji = num: break print (f "\ n {count} slika vraćeno") return img_arr def stitch_beta (img_arr): new = Image.new ("RGBA", (8000, 4000), color = (0, 0, 0)) h = 0 w = 0 i = 0 za img u img_arr: #pbar.set_description (f "Obrada slike {i +1}") new.paste (img, (w, h), img) w += 1000 ako w == 8000: h += 500 w = 0 i += 1 vrati novi def processImage (img): RADIUS = 20 # Otvori sliku im = Image.open ("pilbuffer.png") # Zalijepi sliku na bijelu pozadinu diam = 2 * RADIUS natrag = Image.new ('RGB', (im.size [0] + diam, im.size [1] + diam), (0, 0, 0)) back.paste (im, (RADIUS, RADIUS)) # Izradi masku maske za zamućivanje = Image.new ('L', (im.size [0] + prečnik, im.size [1] + prečnik), 255) blck = Image.new ('L', (im. ImageFilter. GaussianBlur (RADIUS / 2)) back.paste (blur, mask = mask) back.save ("transition.png") back.close () #Napravite masku i filtar zamijenite crnu s alfa slikom = cv2.imread (" tranzit ion.png ") hMin = 0 sMin = 0 vMin = 20 hMax = 180 sMax = 255 vMax = 255 donji = np.mat ([hMin, sMin, vMin]) gornji = np.mat ([hMax, sMax, vMax]) hsv = cv2.cvtColor (image, cv2. COLOR_BGR2HSV) mask = cv2.inRange (hsv, donji, gornji) output = cv2.bitwise_and (image, image, mask = mask) *_, alpha = cv2.split (output) dst = cv2.merge ((izlaz, alfa)) izlaz = dst s otvorenim ("buffer.png", "w+") kao datoteka: proći cv2.imwrite ("buffer.png", izlaz) #Otkrivanje rubova i zamućenje ako _name_ == "_main_": search_terms = ["supernova", "planet", "galaksija", "mliječni put", "maglina", "zvijezde"] #Pojmovi za pretraživanje mogu se promijeniti u sve što želite da planetarij uključi img_arr = get_image_search (64, search_terms) print ("Slike su preuzete i neuronski filtrirane") img = stitch_beta (img_arr) print ("Images stitched") img.save ("stitched.png")

Korak 7: Aplikacija Electron

Pregled

Izradit ćemo jednostavnu elektroničku aplikaciju koja samo pozicionira i učitava element PhotoSphere. Datoteke main.js i package.json izravno su s web stranice Electron, a HTML je malo izmijenjena verzija HTML -a na web mjestu PhotoSphere. Uključio sam datoteke, ali sam sve preimenovao u.txt jer Instructables ne dopušta ove vrste datoteka. Da biste koristili datoteke, preimenujte ih s odgovarajućim nastavkom.

Kod

main.js

const {app, BrowserWindow} = zahtijeva ('elektron')

funkcija createWindow () {const win = new BrowserWindow ({širina: 800, visina: 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 ('aktiviraj', () => {if (BrowserWindow.getAllWindows (). length === 0) {createWindow ()}})

paket.json

{

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

index.html

Korak 8: Izvršenje

Stvaranje jednakopravougaone slike

Da biste stvorili sliku, pokrenite api.py skriptu u naredbenom retku s aktiviranim virtualnim okruženjem:

api.py

Nakon što se skripte završe s izvršavanjem, pokrenite elektronsku aplikaciju koristeći:

npm početakVoila! Vaš planetarij je aktivan! Hvala na čitanju:)

Preporučeni: