Neurovõrgu toitega planetaarium Python, Electron ja Keras abil: 8 sammu
Neurovõrgu toitega planetaarium Python, Electron ja Keras abil: 8 sammu
Anonim
Neuraalvõrgu toitega planetaarium Pythoni, Electroni ja Kerase abil
Neuraalvõrgu toitega planetaarium Pythoni, Electroni ja Kerase abil

Selles juhendis näitan teile, kuidas kirjutasin automaatse 3D -planetaariumigeneraatori, kasutades Pythoni ja Electronit

Ülaltoodud video näitab ühte programmi loodud juhuslikku planetaariumi.

** Märkus: see programm pole mingil juhul täiuslik ja mõnes kohas mitte eriti pütooniline. Närvivõrgu diskrimineerija on ainult ~ 89% täpne, nii et mõned veidrad pildid jõuavad planetaariumisse **

Eripära

Planetaarium küsib kosmosega seotud piltide jaoks NASA API-d ja kasutab konvolutsioonilist närvivõrku, et teha kindlaks, kas pilt sobib töötlemiseks. Seejärel kasutab programm pildilt tausta eemaldamiseks OpenCV -d ja lõpuks õmmeldakse pildid kokku üheks suureks ristkülikukujuliseks kujutiseks. Seejärel salvestatakse see pilt ja rakendus Electron Node.js avab pildi ning kasutab paketti PhotoSphere.js pildi vaatamiseks planetaariumi stiilis 3D -vormingus.

Sõltuvused

Python:

  • Keras
  • Padi
  • cv2
  • Numpy
  • Taotlused
  • urllib
  • Juhuslik
  • aega
  • io

Elektron:

PhotoSphere

Samm: keskkonna seadistamine

Electroni ja Pythoni installimine

Esiteks veenduge, et olete installinud node.js ja npm (kui ei, siis saate alla laadida siit)

Järgmisena peate installima Electroni. Avage käsuviip ja sisestage järgmine käsk:

npm installige elektron -g

Järgmisena vajate pythonit, mille saate alla laadida siit

Virtuaalse keskkonna seadistamine

Avage käsuviip ja sisestage oma virtuaalse keskkonna seadistamiseks järgmised käsud:

pip install virtualenv

virtualenv ruum

cd ruumi

skriptid / aktiveerida

Pythoni sõltuvuste installimine

Pythoni sõltuvuste installimiseks käivitage käsureal järgmised käsud:

pip install keras

pip paigaldada padi

pip install numpy

pip installimise taotlused

pip install opencv-pythonKui soovite võrku ise treenida, seadistage kindlasti Keras GPU kiirendus

2. samm: päringu esitamine NASA otsingu API -le

Ülevaade

NASA -l on palju tõeliselt kasulikke API -sid, mida saate oma projektidega kasutada. Selle projekti jaoks kasutame otsingu API-d, mis võimaldab meil otsida NASA pildiandmebaasist kosmosega seotud pilte.

Kood

Esiteks peame määratlema python -funktsiooni, et aktsepteerida otsinguterminina toimivat argumenti:

def get_image_search (fraas):

üle andma

Seejärel teisendame otsingutermini URL -vormingusse, seejärel kasutame päringuteeki API -le päringu tegemiseks:

def get_image_search (fraas):

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

Lõpuks dekodeerime kogumi+JSON -stringi, mille API meile tagastas, ja ekstraheerime otsinguterminiga seotud piltide linkide loendi:

def get_image_search (fraas):

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

Seal me läheme! Nüüd on meil koodilõik, mille abil saab päringuid teha NASA pildiotsingu API -liideselt ja tagastada meie otsinguterminiga seotud piltide linkide loendi.

3. samm: Konvolutsiooniline närvivõrk

Ülevaade

Närvivõrgu ülesanne on klassifitseerida, kas kujutis kujutab endast midagi ruumis või mitte. Selleks kasutame konvolutsioonilist närvivõrku või CNN-i, et teostada pildil rida maatriksoperatsioone ja teha kindlaks, kui avar see on. Ma ei selgita seda kõike, sest selle taga on palju teooriat, kuid kui soovite õppida tundma närvivõrke, soovitan "Masinõppe meisterlikkust"

Kood

Esiteks peame importima oma sõltuvused:

import os

#Fix probleemile rongi ajal GPN os.environ ['CUDA_VISIBLE_DEVICES'] = '' impordi tensorflow tf -na, kui tf.test.gpu_device_name (): print ('GPU leitud') else: print ("GPU -d ei leitud") 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, Tense from keras import backend as K from PIL import Image import numpy np -na

Järgmisena peame määratlema oma mudeli:

img_laius, 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_laius, img_kõrgus, 3) mudel = Järjestikune () model.add (Conv2D (32, (2, 2), input_shape = input_shape)) model.add (Aktiveerimine ('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 ()) mudel. add (tihe (64)) model.add (aktiveerimine ('relu')) model.add (väljalangemine (0.5)) model.add (tihe (1)) model.add (aktiveerimine ('sigmoid')) model.compile (loss = 'binary_crossentropy', optimeerija = 'rmsprop', mõõdikud = ['täpsus'])

Olen mudeli teie jaoks välja koolitanud, kuid kui soovite mudelit ise oma andmekogumil koolitada, siis olen lisanud koolituskoodi. Vastasel juhul saate alla laadida koolitatud mudeli HDF5 -faili. Instructablesi failipiirangute tõttu olen pidanud selle ümber nimetama laiendiga ".txt". Selle kasutamiseks nimetage fail ümber laiendiks ".h5" ja laadige see selle koodiga:

model.load_weights ("model_saved.h5")

Võrgu kasutamiseks pildi ruumi ennustamiseks määratleme selle funktsiooni:

def ennustada (pildi_tee):

img = image.load_img (pildi_tee, sihtmärgi suurus = (1000, 500)) img = np.expand_dims (img, axis = 0) result = model.predict_classes (img) tagastustulemus [0] [0]

4. samm: pildi töötlemine

Ülevaade

Piltide töötlemiseks kasutan OpenCV (cv2) raamatukogu. Esiteks hägustame pildi servad ja seejärel eemaldame tausta, luues maski ja muutes tumedamate värvide alfa väärtusi

Kood

See on selle funktsiooni osa, mis hägustab servi:

def processImage (img):

RADIUS = 20 # Ava pilt im = Image.open ("pilbuffer.png") # Kleebi pilt valgele taustale diam = 2 * RADIUS back = Image.new ('RGB', (im.size [0] + diam, im.size [1] + diam), (0, 0, 0)) back.paste (im, (RADIUS, RADIUS)) # Loo hägususmaski 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) mask. paste (blck, (diam, diam)) # Hägustage pilt ja kleepige hägune serv vastavalt maski hägususele = back.filter (ImageFilter. GaussianBlur (RADIUS / 2)) back.paste (hägusus, mask = mask) back.save (" transfer-p.webp

Seejärel seadistame tumedamad värvid läbipaistvaks ja salvestame pildi ajutiselt:

#Loo mask ja filter asenda must alfaga

image = cv2.imread ("transfer.png") hMin = 0 sMin = 0 vMin = 20 hMax = 180 sMax = 255 vMax = 255 madalam = np.array ([hMin, sMin, vMin]) ülemine = np.array ([hMax, sMax, vMax]) hsv = cv2.cvtColor (pilt, cv2. COLOR_BGR2HSV) mask = cv2.inRange (hsv, alumine, ülemine) väljund = cv2.bitwise_and (pilt, pilt, mask = mask) *_, alfa = cv2.split (output) dst = cv2.merge ((output, alpha)) output = dst with open ("buffer.png", "w+") failina: pass cv2.imwrite ("buffer.png", output)

Samm: piltide ühendamine võrdkülikukujuliseks projektsiooniks

Ülevaade

See funktsioon võtab PIL (padja) raamatukogu abil mitu pilti ja õmbleb need vormingusse, mida saab tõlgendada paketiga PhotoSphere.js

Kood

Esiteks peame looma pildi, mis võib toimida teiste piltide hostina:

uus = Pilt. uus ("RGBA", (8000, 4000), värv = (0, 0, 0))

Järgmisena peame kordama piltide massiivi (kõik on muudetud suuruseks 1000x500) ja asetama need pildile:

h = 0

w = 0 i = 0 img jaoks img_arr: new.paste (img, (w, h), img) w += 1000, kui w == 8000: h += 500 w = 0 i += 1

Nüüd mässime selle lihtsalt funktsiooni, mis võtab argumendina hulga pilte ja tagastab uue pildi:

def stitch_beta (img_arr):

new = Image.new ("RGBA", (8000, 4000), värv = (0, 0, 0)) h = 0 w = 0 i = 0 img_arr jaoks: new.paste (img, (w, h), img) w += 1000, kui w == 8000: h += 500 w = 0 i += 1 tagasta uus

Samm: täielik Pythoni skript

See on täielik Pythoni närvivõrgu skript, mis salvestatakse kui net.py ja imporditakse põhiskripti:

# raamatukogude importimine

import os #Fix rongis toimuva probleemi korral GPU os.environ ['CUDA_VISIBLE_DEVICES'] = '' impordi tensorflow kui tf, kui tf.test.gpu_device_name (): print ('GPU leitud') else: print ("GPU ei leitud ") saidilt 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 impordi kujutise import numpy kui np img_laius, 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 = 8ata 'K.image_d: 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 (Aktiveerimine ['relu']) model.add (MaxPooling2D (pool_size = (2, 2)))) model.add (Conv2D (32, (2, 2)))) mudel. add (Aktiveerimine ('relu')) model.add (MaxPooling2D (pool_size = (2, 2)))) model.add (Conv2D (64, (2, 2)))) model.add (Aktiveerimine ('relu')) model.add (MaxPooling2D (pool_size = (2, 2))) model.add (Flatten ()) model.add (Tihe (64)) model.add (Aktiveerimine ('relu')) model.add (Väljalangemine (0,5)) model.add (Tihe (1)) model.add (Aktiveerimine ('sigmoid')) model.compile (kadu = 'binaarne_krossentroopia', optimeerija = 'rmsprop', mõõdikud = ['täpsus']) model.load_weights ("model_saved.h5") def ennustada (image_path): img = image.load_img (image_path, target_size = (1000, 500)) img = np.expand_dims (img, axis = 0) result = model.predict_classes (img) tagastamise tulemus [0] [0]

See on peamine pythoni fail api.py:

imporditaotlused, sys, juhuslik, urllib.parse, cv2

PIL -i impordipildist, ImageFilter io -importist BytesIO import numpy kui np import net def get_image_search (number, fraas): count = 0 img_arr = arg jaoks fraasis: print (arg) print (f "Praeguste piltide arv: {count } ") i = 0 params = {" q ": urllib.parse.quote (arg)," media_type ":" image "} results = request.get (" https://images-api.nasa.gov/search ", params = params) data = [result ['href'] for result in results.json () [" collection "] [" items "] print (len (data)) if num> len (data): num = len (andmed) loendamise ajal = num: katkestustrükk (f "\ n {count} pilti taastatud") return img_arr def stitch_beta (img_arr): new = Image.new ("RGBA", (8000, 4000), värv = (0, 0, 0)) h = 0 w = 0 i = 0 img_arr jaoks: #pbar.set_description (f "Kujutise töötlemine {i +1}") new.paste (img, (w, h), img) w += 1000 if w == 8000: h += 500 w = 0 i += 1 tagastab uue def protsessi Pilt (img): RADIUS = 20 # Ava pilt = 2 * KIIR tagasi, RADIUS)) # Loo hägususmaski 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) mask.paste (blck, (diam, diam)) # Hägustage pilt ja kleepige hägune serv vastavalt maski blur = back.filter (ImageFilter. GaussianBlur (RADIUS / 2)) back.paste (hägusus, mask = mask) back.save ("transfer.png") back.close () #Create mask ja filter asenda must tähega alfa image = cv2.imread (" transiit ion.png ") hMin = 0 sMin = 0 vMin = 20 hMax = 180 sMax = 255 vMax = 255 madalam = np.massiiv ([hMin, sMin, vMin]) ülemine = np.massiiv ([hMax, sMax, vMax]) hsv = cv2.cvtColor (pilt, cv2. COLOR_BGR2HSV) mask = cv2.inRange (hsv, alumine, ülemine) väljund = cv2.bitwise_and (pilt, pilt, mask = mask) *_, alfa = cv2.split (väljund) dst = cv2.merge ((väljund, alfa)) väljund = dst avatud failiga ("buffer.png", "w+"): pass cv2.imwrite ("buffer.png", väljund) #Servade tuvastamine ja hägustumine, kui _name_ == "_main_": search_terms = ["supernoova", "planeet", "galaktika", "Linnutee", "udukogu", "tähed"] #Otsingutermineid saab muuta nii, nagu soovite, et planetaarium hõlmaks img_arr = get_image_search (64, search_terms) print ("Pildid on alla laaditud ja närvifiltreeritud") img = stitch_beta (img_arr) print ("Pildid õmmeldud") img.save ("stitched.png")

Samm: rakendus Electron

Ülevaade

Loome lihtsa elektronrakenduse, mis lihtsalt paigutab ja laadib PhotoSphere elemendi. Failid main.js ja package.json pärinevad otse Electroni veebisaidilt ning HTML on PhotoSphere'i veebisaidil esitatud HTML -i veidi muudetud versioon. Olen failid lisanud, kuid nimetanud kõik ümber.txt -ks, kuna Instructables ei luba neid failitüüpe. Failide kasutamiseks nimetage need ümber sobiva laiendiga.

Kood

main.js

const {app, BrowserWindow} = nõuda ('elektron')

function createWindow () {const win = new BrowserWindow ({laius: 800, kõrgus: 600, webPreferences: {nodeIntegration: true}}) win.loadFile ('index.html')} app.whenReady (). seejärel (createWindow) app.on ('window-all-closed', () => {if (process.platform! == 'darwin') {app.quit ()}}) app.on ('aktiveeri', () => {if (BrowserWindow.getAllWindows (). length === 0) {createWindow ()}})

package.json

{

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

index.html

8. samm: täitmine

Võrdkülikukujulise pildi loomine

Pildi loomiseks käivitage käsuviibal skript api.py, mille virtuaalne keskkond on aktiveeritud:

api.py

Pärast skriptide täitmist käivitage elektrooniline rakendus, kasutades järgmist.

npm algusVoila! Teie planetaarium on aktiivne! Aitäh lugemast:)

Soovitan: