Tartalomjegyzék:

Neural Network Powered Planetarium Python, Electron és Keras használatával: 8 lépés
Neural Network Powered Planetarium Python, Electron és Keras használatával: 8 lépés

Videó: Neural Network Powered Planetarium Python, Electron és Keras használatával: 8 lépés

Videó: Neural Network Powered Planetarium Python, Electron és Keras használatával: 8 lépés
Videó: Gregory Chaitin: Complexity, Metabiology, Gödel, Cold Fusion 2024, November
Anonim
Neural Network Powered Planetarium Python, Electron és Keras használatával
Neural Network Powered Planetarium Python, Electron és Keras használatával

Ebben az utasításban megmutatom, hogyan írtam egy automatikus 3D planetáriumgenerátort, Python és Electron segítségével

A fenti videó a program egyik véletlenszerű planetáriumát mutatja.

** Megjegyzés: Ez a program semmiképpen sem tökéletes, és egyes helyeken nem túl pythonikus. A neurális háló diszkriminátor csak ~ 89% -os pontosságú, így néhány furcsa kép bekerül a planetáriumba **

Sajátosságok

A planetárium lekérdezi a NASA API-t az űrrel kapcsolatos képekhez, és konvolúciós ideghálózatot használ annak megállapítására, hogy a kép alkalmas-e a feldolgozásra. A program ezután az OpenCV segítségével távolítja el a kép hátterét, és végül a képeket egy nagy egyenlőszögű képpé varrja össze. Ezt a képet ezután elmenti, és az Electron Node.js alkalmazás megnyitja a képet, és a PhotoSphere.js csomag segítségével planetárium stílusú 3D formátumban tekintheti meg a képet.

Függőségek

Piton:

  • Keras
  • Párna
  • cv2
  • Durva
  • Kérések
  • urllib
  • Véletlen
  • idő
  • io

Elektron:

Fotoszféra

1. lépés: A környezet beállítása

Az Electron és a Python telepítése

Először győződjön meg arról, hogy telepítette a node.js és az npm programokat (ha nem, akkor letöltheti innen)

Ezután telepítenie kell az Electron szoftvert. Nyisson meg egy parancssort, és írja be a következő parancsot:

npm telepítse az elektron -g

Ezután pythonra van szüksége, amely letölthető innen

Virtuális környezet beállítása

Nyisson meg egy parancssort, majd írja be a következő parancsokat a virtuális környezet beállításához:

pip install virtualenv

virtualenv tér

cd tér

scriptek / aktiválja

Python függőségek telepítése

Futtassa ezeket a parancsokat a parancssorban a python -függőségek telepítéséhez:

pip install keras

pip szerelje párna

pip install numpy

pip telepítési kérelmek

pip telepítse az opencv-python programotHa saját maga szeretné edzeni a hálózatot, győződjön meg róla, hogy beállította a GPU gyorsítást a Keras számára

2. lépés: A NASA Search API lekérdezése

Áttekintés

A NASA -nak sok igazán hasznos API -ja van, amelyeket felhasználhat a projektekhez. Ebben a projektben a kereső API-t fogjuk használni, amely lehetővé teszi számunkra, hogy a NASA képadatbázisában keressük az űrhöz kapcsolódó képeket.

A kód

Először is meg kell határoznunk egy python függvényt, hogy elfogadjuk a keresési kifejezésként szolgáló érvet:

def get_image_search (kifejezés):

passz

Ezután átalakítjuk a keresési kifejezést URL formátumba, majd a kérések könyvtár segítségével lekérdezzük az API -t:

def get_image_search (kifejezés):

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

Végül dekódoljuk az API által visszaadott gyűjtemény+JSON karakterláncot, és kivonjuk a keresési kifejezéshez kapcsolódó képek linkjeinek listáját:

def get_image_search (kifejezés):

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

Tessék! Most van egy kódrészletünk, amely lekérdezheti a NASA képkereső API -ját, és visszaadhatja a keresési kifejezésünkkel kapcsolatos képek linkjeinek listáját.

3. lépés: A konvolúciós neurális hálózat

Áttekintés

A neurális hálózat feladata az, hogy osztályozza, hogy egy kép valamiről a térben van -e, vagy sem. Ehhez konvolúciós ideghálózatot (CNN) használunk mátrixműveletek sorozatának elvégzésére a képen, és meghatározzuk, hogy mennyire térbeli. Ezt az egészet nem fogom megmagyarázni, mert sok elmélet van mögötte, de ha szeretné megismerni a neurális hálózatokat, javaslom a "Gépi tanulás elsajátítását"

A kód

Először importálnunk kell a függőségeinket:

importál

#Fix a vonat során fellépő probléma esetén GPU os.environ ['CUDA_VISIBLE_DEVICES'] = '' importálja a tensorflow -t tf -ként, ha tf.test.gpu_device_name (): print ('GPU found') else: print ("Nem található GPU") 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, Sűrű a keras import backend -ből K -ként PIL importálásból Image importálja a numpy -t np -ként

Ezután meg kell határoznunk a modellünket:

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 (Aktiválás ('relu')) model.add (MaxPooling2D (pool_size) = (2, 2))) model.add (Conv2D (32, (2, 2))) model.add (Aktiválás ('relu')) model.add (MaxPooling2D (pool_size = (2, 2))) model.add (Conv2D (64, (2, 2)))) model.add (Aktiválás ('relu')) model.add (MaxPooling2D (pool_size = (2, 2)))) model.add (Flatten ()) modell. add (Sűrű (64)) model.add (Aktiválás ('relu')) model.add (Dropout (0.5)) model.add (Sűrű (1)) model.add (Aktiválás ('sigmoid')) model.compile (loss = 'binary_crossentropy', optimalizáló = 'rmsprop', metrics = ['pontosság'])

Kiképztem a modellt az Ön számára, de ha maga szeretné oktatni a modellt, saját adatkészletén, akkor csatoltam a képzési kódot. Ellenkező esetben letöltheti a betanított modell HDF5 fájlját. Az Instructables fájlkorlátozások miatt át kellett neveznem ".txt" kiterjesztéssel. A használatához nevezze át a fájlt ".h5" kiterjesztésre, és töltse be ezzel a kóddal:

model.load_weights ("model_saved.h5")

Annak érdekében, hogy a hálózat segítségével megjósolhassuk a kép térbeli méretét, definiáljuk ezt a függvényt:

def jósolni (image_path):

img = image.load_img (image_path, target_size = (1000, 500)) img = np.expand_dims (img, axis = 0) result = model.predict_classes (img) visszatérési eredmény [0] [0]

4. lépés: A kép feldolgozása

Áttekintés

Képfeldolgozáshoz az OpenCV (cv2) könyvtárat használom. Először elmosjuk a kép széleit, majd eltávolítjuk a hátteret egy maszk létrehozásával és a sötétebb színek alfa értékeinek megváltoztatásával

A kód

Ez a funkció az a része, amely elmossa az éleket:

def processImage (img):

RADIUS = 20 # Kép megnyitása im = Image.open ("pilbuffer.png") # Kép beillesztése fehér alapra diam = 2 * RADIUS back = Image.new ('RGB', (im.size [0] + diam, im.size [1] + diam), (0, 0, 0)) back.paste (im, (RADIUS, RADIUS)) # Blur mask mask létrehozása = 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) maszk. paste (blck, (diam, diam)) # A kép elmosása és az elmosódott szél beillesztése a maszk blur = back.filter (ImageFilter. GaussianBlur (RADIUS / 2)) back.paste (blur, mask = mask) back.save (" transit-p.webp

Ezután a sötétebb színeket átlátszóra állítjuk, és ideiglenesen elmentjük a képet:

#Hozzon létre maszkot és szűrőt, cserélje ki a feketét alfa -ra

image = cv2.imread ("átmenet.png") hMin = 0 sMin = 0 vMin = 20 hMax = 180 sMax = 255 vMax = 255 alacsonyabb = np.array ([hMin, sMin, vMin]) felső = np.array ([hMax, sMax, vMax]) hsv = cv2.cvtColor (kép, cv2. COLOR_BGR2HSV) maszk = cv2.inRange (hsv, alsó, felső) kimenet = cv2.bitwise_and (kép, kép, maszk = maszk) *_, alfa = cv2.split (output) dst = cv2.merge ((output, alpha)) output = dst with open ("buffer.png", "w+") fájlként: pass cv2.imwrite ("buffer.png", output)

5. lépés: A képek összefűzése egyenes szögletes vetítésbe

Áttekintés

Ez a funkció több képet készít, és összeilleszti azokat a PhotoSphere.js csomag által értelmezhető formátumba, a PIL (párna) könyvtár használatával

A kód

Először is létre kell hoznunk egy képet, amely a többi kép gazdagépeként működik:

new = Kép.új ("RGBA", (8000, 4000), szín = (0, 0, 0))

Ezután meg kell ismételnünk a képek tömbjét (amelyek mindegyike 1000x500 méretűre lett méretezve), és be kell helyezni őket a képbe:

h = 0

w = 0 i = 0 img esetén az img_arr: new.paste (img, (w, h), img) w += 1000, ha w == 8000: h += 500 w = 0 i += 1

Ezt most egy olyan függvénybe csomagoljuk, amely képsorozatot vesz fel érvként, és visszaadja az új képet:

def stitch_beta (img_arr):

new = Image.new ("RGBA", (8000, 4000), color = (0, 0, 0)) h = 0 w = 0 i = 0 az img_arr -ban: new.paste (img, (w, h), img) w += 1000, ha w == 8000: h += 500 w = 0 i += 1 visszatér új

6. lépés: A teljes Python -szkript

Ez a teljes python neurális hálózati szkript, amely net.py néven kerül mentésre, és importálódik a fő parancsfájlba:

# könyvtárak importálása

import os #Fix for train stepn oN GPU os.environ ['CUDA_VISIBLE_DEVICES'] = '' import tensorflow as tf if tf.test.gpu_device_name (): print ('GPU found') más: print ("Nem található GPU ") 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 képimportálás importálása számként, mint 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 = 'image' 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álás ('relu')) model.add (MaxPooling2D (pool_size = (2, 2)))) model.add (Conv2D (32, (2, 2)))) modell. add (Aktiválás ('relu')) model.add (MaxPooling2D (pool_size = (2, 2)))) model.add (Conv2D (64, (2, 2)))) model.add (Aktiválás ('relu')) model.add (MaxPooling2D (pool_size = (2, 2))) model.add (Flatten ()) model.add (Sűrű (64)) model.add (Aktiválás ('relu')) model.add (Dropout (0.5)) model.add (Sűrű (1)) model.add (Aktiválás ('sigmoid')) model.compile (loss = 'binary_crossentropy', optimizer = 'rmsprop', metrics = ['pontosság']) model.load_weights ("model_saved.h5") def előrejelzés (image_path): img = image.load_img (image_path, target_size = (1000, 500)) img = np.expand_dims (img, axis = 0) result = model.predict_classes (img) visszatérési eredmény [0] [0]

Ez a fő python fájl, api.py:

import kérések, sys, random, urllib.parse, cv2

a PIL importálásából Image } ") i = 0 paraméter = {" q ": urllib.parse.quote (arg)," media_type ":" image "} results = request.get (" https://images-api.nasa.gov/search ", params = params) data = [result ['href'] for results in results.json () [" collection "] [" items "] print (len (data)) if num> len (data): num = len (adatok) számolás közben = szám: törésnyomtatás (f "\ n {count} kép visszahívása") return img_arr def stitch_beta (img_arr): new = Image.new ("RGBA", (8000, 4000), szín = (0, 0, 0)) h = 0 w = 0 i = 0 az img_arr esetében: #pbar.set_description (f "Kép feldolgozása {i +1}") new.paste (img, (w, h), img) w += 1000 if w == 8000: h += 500 w = 0 i += 1 return new def processImage (img): RADIUS = 20 # Kép megnyitása im = Image.open ("pilbuffer.png") # Kép beillesztése fehér háttérbe = 2 * RADIUS back = Image.new ('RGB', (im.size [0] + diam, im.size [1] + diam), (0, 0, 0)) back.paste (im, (RADIUS, RADIUS)) # Blur mask mask létrehozása = 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)) # A kép elmosása és a homályos él beillesztése a maszk blur = back.filter (ImageFilter. GaussianBlur (RADIUS / 2)) back.paste (elmosódás, maszk = maszk) back.save ("transit.png") back.close () #Create maszk és szűrő fekete helyettesítése alfa image = cv2.imread (" tranzit ion.png ") hMin = 0 sMin = 0 vMin = 20 hMax = 180 sMax = 255 vMax = 255 alsó = np.tömb ([hMin, sMin, vMin]) felső = np.tömb ([hMax, sMax, vMax]) hsv = cv2.cvtColor (kép, cv2. COLOR_BGR2HSV) maszk = cv2.inRange (hsv, alsó, felső) kimenet = cv2.bitwise_and (kép, kép, maszk = maszk) *_, alpha = cv2.split (output) dst = cv2.merge ((output, alpha)) output = dst with open ("buffer.png", "w+") fájlként: pass cv2.imwrite ("buffer.png", output) #Élészlelés és elmosódás, ha _name_ == "_main_": search_terms = ["szupernóva", "bolygó", "galaxis", "tejút", "köd", "csillagok"] #A keresési kifejezések bármire módosíthatók img_arr = get_image_search (64, search_terms) print ("Képek lekérve és neurális szűréssel") img = stitch_beta (img_arr) print ("Képek összefűzve") img.save ("stitched.png")

7. lépés: Az Electron alkalmazás

Áttekintés

Létrehozunk egy egyszerű elektronikai alkalmazást, amely csak pozícionálja és betölti a PhotoSphere elemet. A main.js és a package.json fájlok közvetlenül az Electron webhelyről származnak, a HTML pedig a PhotoSphere webhelyen található HTML kissé módosított változata. Felvettem a fájlokat, de az összes nevet átneveztem.txt -re, mivel az Instructables nem engedélyezi ezeket a fájltípusokat. A fájlok használatához nevezze át őket a megfelelő kiterjesztéssel.

A kód

main.js

const {app, BrowserWindow} = megköveteli ('elektron')

function createWindow () {const win = new BrowserWindow ({szélesség: 800, magasság: 600, webPreferences: {nodeIntegration: true}}) win.loadFile ('index.html')} app.whenReady (). majd (createWindow) app.on ('window-all-closed', () => {if (process.platform! == 'darwin') {app.quit ()}}) app.on ('aktivál', () => {if (BrowserWindow.getAllWindows (). length === 0) {createWindow ()}})

package.json

{

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

index.html

8. lépés: Végrehajtás

Az egyenirányú kép létrehozása

A kép létrehozásához futtassa az api.py parancsfájlt a parancssorban, aktivált virtuális környezetével:

api.py

Miután a szkriptek végrehajtása befejeződött, futtassa az elektronikai alkalmazást a következők használatával:

npm kezdésVoálá! A planetárium aktív! Köszönöm, hogy elolvasta:)

Ajánlott: