Obsah:
- Krok 1: Nastavenie prostredia
- Krok 2: Dotaz na API vyhľadávania NASA
- Krok 3: Konvolučná neurónová sieť
- Krok 4: Spracovanie obrázku
- Krok 5: Spojenie obrazov dohromady do ekvirektangulárnej projekcie
- Krok 6: Úplný skript Pythonu
- Krok 7: Aplikácia Electron
- Krok 8: Vykonanie
Video: Planetárium poháňané neurónovou sieťou využívajúce Python, Electron a Keras: 8 krokov
2024 Autor: John Day | [email protected]. Naposledy zmenené: 2024-01-30 11:57
V tomto návode vám ukážem, ako som napísal automatický generátor 3D planetária pomocou jazykov Python a Electron
Video vyššie ukazuje jedno z náhodných planetárií, ktoré program vygeneroval.
** Poznámka: Tento program nie je nijako dokonalý a na niektorých miestach ani príliš pythonický. Diskriminátor neurálnej siete je len ~ 89% presný, takže niektoré zvláštne obrázky sa dostanú do planetária **
Špecifiká
Planetárium sa pýta na API NASA na obrázky súvisiace s vesmírom a na určenie, či je obrázok vhodný na spracovanie, používa konvolučnú neurónovú sieť. Program potom pomocou OpenCV odstráni pozadie z obrázku a nakoniec sa obrázky spoja do jedného veľkého ekvirektangulárneho obrázku. Tento obrázok sa potom uloží a aplikácia Electron Node.js obrázok otvorí a pomocou balíka PhotoSphere.js si obrázok zobrazí vo formáte 3D v štýle planetária.
Závislosti
Python:
- Keras
- Vankúš
- cv2
- Numpy
- Žiadosti
- urllib
- Náhodne
- čas
- io
Elektrón:
PhotoSphere
Krok 1: Nastavenie prostredia
Inštalácia Electron a Python
Najprv sa uistite, že máte nainštalované node.js a npm (ak nie, môžete si ich stiahnuť tu)
Ďalej musíte nainštalovať Electron. Otvorte príkazový riadok a zadajte nasledujúci príkaz:
npm nainštalovať elektrón -g
Ďalej potrebujete python, ktorý si môžete stiahnuť tu
Nastavenie virtuálneho prostredia
Otvorte príkazový riadok a potom zadajte nasledujúce príkazy na nastavenie virtuálneho prostredia:
pip install virtualenv
virtuálny priestor
cd priestor
skripty / aktivovať
Inštalácia závislostí Pythonu
Spustite tieto príkazy v príkazovom riadku a nainštalujte svoje závislosti od pythonu:
pip install keras
pip inštalovať vankúš
pip install numpy
požiadavky na inštaláciu pipu
pip install opencv-pythonAk chcete trénovať sieť sami, uistite sa, že ste pre Keras nastavili zrýchlenie GPU
Krok 2: Dotaz na API vyhľadávania NASA
Prehľad
NASA má veľa skutočne užitočných rozhraní API, ktoré môžete použiť vo svojich projektoch. Na tento projekt použijeme API na vyhľadávanie, ktoré nám umožní vyhľadať obrázky súvisiace s vesmírom v databáze snímok NASA.
Kód
Najprv musíme definovať funkciu pythonu, aby prijala argument, ktorý bude fungovať ako hľadaný výraz:
def get_image_search (fráza):
prejsť
Ďalej skonvertujeme hľadaný výraz do formátu adresy URL a potom použijeme knižnicu žiadostí na zadanie dotazu na API:
def get_image_search (fráza):
params = {"q": urllib.parse.quote (arg), "media_type": "image"} results = requests.get ("https://images-api.nasa.gov/search", params = params)
Nakoniec dekódujeme reťazec kolekcia+JSON, ktorý nám API vrátilo, a extrahujeme zoznam odkazov na obrázky súvisiace s hľadaným výrazom:
def get_image_search (fráza):
params = {"q": urllib.parse.quote (arg), "media_type": "image"} results = requests.get ("https://images-api.nasa.gov/search", params = params) data = [result ['href'] pre výsledok vo results.json () ["collection"] ["items"]
Ideme na to! Teraz máme útržok kódu, ktorý môže dotazovať API na vyhľadávanie obrázkov NASA a vracať zoznam odkazov na obrázky súvisiace s naším hľadaným výrazom.
Krok 3: Konvolučná neurónová sieť
Prehľad
Úlohou neurálnej siete je klasifikovať, či obraz je niečím vo vesmíre alebo nie. Na tento účel použijeme konvolučnú neurónovú sieť alebo CNN na vykonanie série maticových operácií s obrázkom a zistíme, aký je priestor-y. Nebudem to všetko vysvetľovať, pretože je za tým veľa teórie, ale ak sa chcete dozvedieť viac o neurónových sieťach, navrhujem „Majster strojového učenia“
Kód
Najprv musíme importovať naše závislosti:
import os
#Oprava chyby pri nástupe vlaku na GPU os.environ ['CUDA_VISIBLE_DEVICES'] = '' import tensorflow ako tf if tf.test.gpu_device_name (): print ('GPU found') else: print ("No GPU found") z keras.preprocessing.image import ImageDataGenerator z 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 import numpy ako np
Ďalej musíme definovať náš 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 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 (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 (strata = 'binary_crossentropy', optimalizátor = 'rmsprop', metriky = ['presnosť'])
Vycvičil som pre vás model, ale ak by ste chceli trénovať model sami, vo svojom vlastnom súbore údajov, potom som pripojil školiaci kód. V opačnom prípade si môžete stiahnuť súbor HDF5 natrénovaného modelu. Vzhľadom na obmedzenia súboru Instructables som ho musel premenovať s príponou „.txt“. Ak ho chcete použiť, premenujte súbor na príponu ".h5" a načítajte ho s týmto kódom:
model.load_weights ("model_saved.h5")
Aby sme pomocou siete predpovedali, aký priestorový je obrázok, definujeme túto funkciu:
def predikcia (cesta_ image):
img = image.load_img (cesta_k obrázku, cieľová_ veľkosť = (1000, 500)) img = np.expand_dims (img, os = 0) result = model.predict_classes (img) návratový výsledok [0] [0]
Krok 4: Spracovanie obrázku
Prehľad
Na spracovanie obrazu používam knižnicu OpenCV (cv2). Najprv rozmazáme okraje obrázku a potom odstránime pozadie vytvorením masky a zmenou hodnôt alfa tmavších farieb.
Kód
Toto je časť funkcie, ktorá rozmazáva okraje:
def processImage (img):
RADIUS = 20 # Otvorte obrázok im = Image.open ("pilbuffer.png") # Prilepte obrázok na biele pozadie priemer = 2 * RADIUS späť = Image.new ('RGB', (veľkosť obrázku [0] + priemer, im.size [1] + diam), (0, 0, 0)) back.paste (im, (RADIUS, RADIUS)) # Create mask blur mask 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) maska. paste (blck, (diam, diam)) # Rozostrí obrázok a prilepí rozmazaný okraj podľa masky blur = back.filter (ImageFilter. GaussianBlur (RADIUS / 2)) back.paste (blur, mask = mask) back.save (" transition.png ") back.close ()
Ďalej nastavíme tmavšie farby na priehľadné a obrázok dočasne uložíme:
#Vytvorte masku a filter a vymeňte čiernu za alfa
obrázok = cv2.imread ("transition.png") hMin = 0 sMin = 0 vMin = 20 hMax = 180 sMax = 255 vMax = 255 nižší = np.array ([hMin, sMin, vMin]) horný = np.array ([hMax, sMax, vMax]) hsv = cv2.cvtColor (obrázok, cv2. COLOR_BGR2HSV) maska = cv2.inRange (hsv, dolný, horný) výstup = cv2.bitwise_and (obrázok, obrázok, maska = maska) *_, alfa = cv2.split (výstup) dst = cv2.merge ((výstup, alfa)) výstup = dst s otvoreným ("buffer.png", "w+") ako súbor: odovzdať cv2.imwrite ("buffer.png", výstup)
Krok 5: Spojenie obrazov dohromady do ekvirektangulárnej projekcie
Prehľad
Táto funkcia nasníma viacero obrázkov a spojí ich do formátu, ktorý je možné interpretovať pomocou balíka PhotoSphere.js pomocou knižnice PIL (vankúš)
Kód
Najprv musíme vytvoriť obrázok, ktorý môže slúžiť ako hostiteľ pre ostatné obrázky:
nový = Image.new ("RGBA", (8000, 4000), farba = (0, 0, 0))
Ďalej musíme iterovať radom obrázkov (u všetkých sa zmenila veľkosť na 1 000 x 500) a umiestniť ich do obrázku:
h = 0
w = 0 i = 0 pre img v img_arr: new.paste (img, (w, h), img) w += 1000 if w == 8000: h += 500 w = 0 i += 1
Teraz to zabalíme do funkcie, ktorá ako argument vezme pole obrázkov a vráti nový obrázok:
def stitch_beta (img_arr):
new = Image.new ("RGBA", (8000, 4000), color = (0, 0, 0)) h = 0 w = 0 i = 0 pre img in img_arr: new.paste (img, (w, h), img) w += 1000, ak w == 8000: h += 500 w = 0 i += 1 vrátiť nové
Krok 6: Úplný skript Pythonu
Toto je úplný skript neurónovej siete python, ktorý je uložený ako net.py a importovaný do hlavného skriptu:
# import knižníc
import os #Fix for issue during train stepn on GPU os.environ ['CUDA_VISIBLE_DEVICES'] = '' import tensorflow as tf if tf.test.gpu_device_name (): print ('GPU found') else: print ("No GPU found ") z keras.preprocessing.image import ImageDataGenerator z 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 import numpy as 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 if K.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ácia ('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 (loss = 'binary_crossentropy', optimizer = 'rmsprop', metrics = ['precision']) model.load_weights ("model_saved.h5") def predikcia (cesta_ image): img = image.load_img (cesta_obrazu, cieľová_veľkosť = (1000, 500)) img = np.expand_dims (obr., os = 0) výsledok = model.predict_classes (obr) [0] [0]
Toto je hlavný súbor pythonu, api.py:
požiadavky na import, sys, random, urllib.parse, cv2
z PIL import Image, ImageFilter z io import BytesIO import numpy as np import net def get_image_search (num, phrase): count = 0 img_arr = for arg in phrase: print (arg) print (f "Aktuálny počet obrázkov: {count } ") i = 0 parametrov = {" q ": urllib.parse.quote (arg)," media_type ":" image "} results = requests.get (" https://images-api.nasa.gov/search ", params = params) data = [result ['href'] pre výsledok in results.json () [" collection "] [" items "] print (len (data)) if num> len (data): num = len (údaje) pri počítaní
Krok 7: Aplikácia Electron
Prehľad
Vytvoríme jednoduchú aplikáciu pre elektróny, ktorá len umiestni a načíta prvok PhotoSphere. Súbory main.js a package.json sú priamo z webových stránok Electron a HTML je mierne upravená verzia HTML, ktorá sa nachádza na webových stránkach PhotoSphere. Zahrnul som súbory, ale všetky som premenoval na.txt, pretože Instructables tieto typy súborov nepovoľuje. Ak chcete súbory používať, premenujte ich s príslušnou príponou.
Kód
main.js
const {aplikácia, BrowserWindow} = vyžadovať ('elektrón')
funkcia createWindow () {const win = new BrowserWindow ({šírka: 800, výška: 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 ('activate', () => {if (BrowserWindow.getAllWindows (). length === 0) {createWindow ()}}))
package.json
{
"name": "space", "version": "0.1.0", "main": "main.js", "scripts": {"start": "elektron." }}
index.html
Krok 8: Vykonanie
Vytvorenie rovnomerného uhlového obrazu
Ak chcete vytvoriť obrázok, spustite skript api.py v príkazovom riadku s aktivovaným virtuálnym prostredím:
api.py
Po dokončení spustenia skriptov spustite elektronickú aplikáciu pomocou:
npm začiatokVoila! Vaše planetárium je aktívne! Vďaka za prečítanie:)
Odporúča:
Pohybom aktivované cosplay krídla využívajúce expresné obvodové ihrisko - časť 1: 7 krokov (s obrázkami)
Pohybom ovládané cosplay krídla pomocou Circuit Playground Express - 1. časť: Toto je prvá časť dvojdielneho projektu, v ktorom vám ukážem môj postup na výrobu páru automatizovaných rozprávkových krídel. Prvá časť projektu je mechanika krídel a v druhej časti je nosenie a pridanie krídel
Digitálne hodiny využívajúce Arduino a LED bodový maticový displej: 6 krokov
Digitálne hodiny využívajúce Arduino a LED bodový maticový displej: V dnešnej dobe výrobcovia, vývojári uprednostňujú Arduino kvôli rýchlemu vývoju prototypov projektov. Arduino je elektronická platforma s otvoreným zdrojovým kódom založená na ľahko použiteľnom hardvéri a softvéri. Arduino má veľmi dobrú komunitu používateľov. V tomto projekte
Bezdrôtové diaľkové ovládanie pomocou 2,4 GHz modulu NRF24L01 s Arduino - Nrf24l01 4 -kanálový / 6 -kanálový vysielač pre Quadcopter - RC helikoptéra - RC lietadlo využívajúce Arduino: 5 krokov (s obrázkami)
Bezdrôtové diaľkové ovládanie pomocou 2,4 GHz modulu NRF24L01 s Arduino | Nrf24l01 4 -kanálový / 6 -kanálový vysielač pre Quadcopter | RC helikoptéra | RC lietadlo využívajúce Arduino: Na ovládanie RC auta | Kvadrokoptéra | Dron | RC lietadlo | RC čln, vždy potrebujeme prijímač a vysielač, predpokladajme, že pre RC QUADCOPTER potrebujeme 6 -kanálový vysielač a prijímač a tento typ TX a RX je príliš nákladný, takže si ho vyrobíme na
Žabky využívajúce diskrétne tranzistory: 7 krokov
Žabky využívajúce diskrétne tranzistory: Ahoj všetci, teraz žijeme vo svete digitálu. Čo je to však digitál? Je ďaleko od analógu? Videl som veľa ľudí, ktorí sa domnievajú, že digitálna elektronika sa líši od analógovej a analógová je zbytočná. Tak tu
IOT s mobilnou sieťou s ESP32: 23 krokov
IOT s mobilnou sieťou s ESP32: Dnes budeme diskutovať o GPRS modeme alebo skôr o ESP32 a jeho použití v mobilnej telefónnej sieti. To je niečo, čo funguje veľmi dobre. Pomocou protokolu MQTT potom odošleme údaje na ovládací panel Ubidots. V tejto zostave použite