Sadržaj:
- Korak 1: Postavljanje vašeg okruženja
- Korak 2: Upit NASA API -ju za pretraživanje
- Korak 3: Konvolucijska neuronska mreža
- Korak 4: Obrada slike
- Korak 5: Spajanje slika u jednaku pravokutnu projekciju
- Korak 6: Potpuna skripta Python
- Korak 7: Aplikacija Electron
- Korak 8: Izvršenje
Video: Planetarij s neuronskom mrežom koji koristi Python, Electron i Keras: 8 koraka
2024 Autor: John Day | [email protected]. Zadnja promjena: 2024-01-30 09:33
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
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:
Testirajte Bare Arduino, sa softverom za igre koji koristi kapacitivni ulaz i LED: 4 koraka
Testirajte Bare Arduino, sa softverom za igre koji koristi kapacitivni ulaz i LED: " Push-It " Interaktivna igra koja koristi golu Arduino ploču, nisu potrebni vanjski dijelovi ili ožičenje (koristi kapacitivni ulaz na dodir). Gore prikazano, pokazuje da radi na dvije različite ploče. Pritisnite-Ima dvije svrhe. Za brzo demonstriranje/v
Pametni sustav parkiranja temeljen na IoT -u koji koristi NodeMCU ESP8266: 5 koraka
Sustav pametnog parkiranja temeljen na IoT -u koji koristi NodeMCU ESP8266: Danas je pronalaženje parkirališta u prometnim područjima vrlo teško i ne postoji sustav za dobivanje pojedinosti o dostupnosti parkiranja na mreži. Zamislite da možete dobiti informacije o dostupnosti parkirnih mjesta na svom telefonu, a nemate lutanje da provjerite
Biometrijski glasački stroj na temelju otisaka prstiju koji koristi Arduino: 4 koraka (sa slikama)
Biometrijski glasački stroj temeljen na otiscima prstiju koji koristi Arduino: Svi smo svjesni postojećeg elektroničkog glasačkog stroja u kojem korisnik mora pritisnuti gumb za glasovanje. No ti su strojevi od početka kritizirani zbog kaljenja. Stoga vlada planira uvesti sustav otisaka prstiju
NAIN 1.0 - osnovni humanoidni robot koji koristi Arduino: 6 koraka
NAIN 1.0 - osnovni humanoidni robot koji koristi Arduino: Nain 1.0 će u osnovi imati 5 odvojivih modula - 1) Arm - kojima se može upravljati putem servo upravljača. 2) Kotači - kojima se može upravljati istosmjernim motorima. 3) Noga - Nain će se moći kretati između kotača ili nogu radi kretanja. 4) Glava i
USB spinner sličan Atariju koji koristi Arduino Leonardo: 4 koraka
USB spinner sličan Atariju koji koristi Arduino Leonardo: Ovo je jednostavan projekt. Spinner kontroler koji se može koristiti sa bilo kojim emulatorom koji koristi miš. Zapravo, možete reći da to nije ništa drugo nego miš sa samo vodoravnim kretanjem