Sisukord:
2025 Autor: John Day | [email protected]. Viimati modifitseeritud: 2025-01-23 14:40
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
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:
USB-C toitega pingitoiteallikas: 10 sammu (piltidega)
USB-C toiteallikaga toiteallikas: pingitoiteallikas on elektroonikaga töötamisel hädavajalik tööriist, mis võimaldab määrata täpselt projekti jaoks vajaliku pinge ja piirata ka voolu, kui asjad on tõesti kasulikud. See on minu kaasaskantav USB-C toide
Kella tegemine M5stick C abil Arduino IDE abil RTC reaalajas kell M5stack M5stick-C abil: 4 sammu
Kella tegemine M5stick C abil, kasutades Arduino IDE | RTC reaalajas kell koos M5stack M5stick-C-ga: Tere, selles juhendis olevad poisid, me õpime, kuidas Arduino IDE abil kella m5stick-C arendusplaadiga teha. Nii kuvab m5stick kuupäeva, kellaaja ja amp; kuunädal ekraanil
Magnetiline geodeetiline planetaarium: 7 sammu (piltidega)
Magnetgeodeetiline planetaarium: Tere kõigile! Tahaksin teile tutvustada minu geodeetilise planetaariumi loomise protsessi magnetite ja meisterdustraadi abil! Selle magneti kasutamise põhjuseks on kerge eemaldamine vihma ajal või ideaalsetes ilmastikutingimustes. Nii saate
Bluetooth-toega planetaarium/Orrery: 13 sammu (piltidega)
Bluetooth-toega planetaarium/Orrery: see juhend on loodud Lõuna-Florida ülikooli Makecourse'i projektinõude täitmiseks (www.makecourse.com). See on minu 3-planeediline planetaarium/orrery. See algas Makecouri jaoks vaid poolaasta pikkuse projektina
Heli aktiveeritud planetaarium: 8 sammu (piltidega)
Heli aktiveeritud planetaarium: see juhend on loodud Lõuna -Florida ülikooli (www.makecourse.com) Makecourse'i projektinõude täitmiseks. See on minu heli aktiveeritud planetaarium. Planetaariumi põhifunktsioon on aktiveerida