Tartalomjegyzék:
- 1. lépés: A környezet beállítása
- 2. lépés: A NASA Search API lekérdezése
- 3. lépés: A konvolúciós neurális hálózat
- 4. lépés: A kép feldolgozása
- 5. lépés: A képek összefűzése egyenes szögletes vetítésbe
- 6. lépés: A teljes Python -szkript
- 7. lépés: Az Electron alkalmazás
- 8. lépés: Végrehajtás
Videó: Neural Network Powered Planetarium Python, Electron és Keras használatával: 8 lépés
2024 Szerző: John Day | [email protected]. Utoljára módosítva: 2024-01-30 09:40
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
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:
A gyorsulás felügyelete a Raspberry Pi és az AIS328DQTR használatával Python használatával: 6 lépés
A gyorsulás nyomon követése a Raspberry Pi és az AIS328DQTR használatával Python használatával: A gyorsulás véges, azt hiszem, a fizika egyes törvényei szerint.- Terry Riley A gepárd elképesztő gyorsulást és gyors sebességváltozásokat használ üldözés közben. A leggyorsabb lény a parton időnként kihasználja csúcssebességét a zsákmány elkapására. Az
Neopixel Ws2812 Rainbow LED izzás M5stick-C - Szivárvány futtatása a Neopixel Ws2812 készüléken az M5stack M5stick C használatával Arduino IDE használatával: 5 lépés
Neopixel Ws2812 Rainbow LED izzás M5stick-C | Szivárvány futása a Neopixel Ws2812-en az M5stack M5stick C használatával Arduino IDE használatával: Sziasztok, srácok, ebben az oktatási útmutatóban megtanuljuk, hogyan kell használni a neopixel ws2812 LED-eket, vagy led szalagot vagy led mátrixot vagy led gyűrűt m5stack m5stick-C fejlesztőtáblával Arduino IDE-vel, és elkészítjük szivárványos mintát vele
RF 433MHZ rádióvezérlés HT12D HT12E használatával - Rf távirányító készítése HT12E és HT12D használatával 433 MHz -en: 5 lépés
RF 433MHZ rádióvezérlés HT12D HT12E használatával | Rf távirányító létrehozása HT12E és HT12D használatával 433 MHz -en: Ebben az oktatóanyagban megmutatom, hogyan készítsünk RADIO távirányítót a 433 MHz -es adó vevőmodul használatával HT12E kódolással & HT12D dekódoló IC. Ebben az utasításban nagyon olcsó komponenseket küldhet és fogadhat, mint például: HT
Vezeték nélküli távirányító 2,4 GHz -es NRF24L01 modul használatával Arduino - Nrf24l01 4 csatorna / 6 csatornás adó vevő négykópás - Rc Helikopter - Rc sík az Arduino használatával: 5 lépés (képekkel)
Vezeték nélküli távirányító 2,4 GHz -es NRF24L01 modul használatával Arduino | Nrf24l01 4 csatorna / 6 csatornás adó vevő négykópás | Rc Helikopter | Rc sík Arduino használatával: Rc autó működtetése | Quadcopter | Drone | RC sík | RC csónak, mindig szükségünk van vevőre és adóra, tegyük fel, hogy az RC QUADCOPTER esetében szükségünk van egy 6 csatornás adóra és vevőre, és az ilyen típusú TX és RX túl költséges, ezért készítünk egyet
Mágneses Geodéziai Planetárium: 7 lépés (képekkel)
Mágneses Geodéziai Planetárium: Üdv mindenkinek! Szeretném végigvezetni Önt egy geodéziai planetárium létrehozásának folyamatán, amelyet mágnesekkel és dróttal készítenek! Ennek a mágnesnek az oka az egyszerű eltávolítás esőben vagy az ideális időjárási körülmények között. Így te