Përmbajtje:
2025 Autor: John Day | [email protected]. E modifikuara e fundit: 2025-01-23 15:10
Në këtë udhëzues, unë do t'ju tregoj se si kam shkruar një gjenerator automatik 3D planetarium, duke përdorur Python dhe Electron
Videoja e mësipërme tregon një nga planetariumet e rastësishëm të programit të krijuar.
** Shënim: Ky program nuk është në asnjë mënyrë i përsosur, dhe në disa vende jo shumë pitonike. Diskriminuesi nervor neto është vetëm ~ 89% i saktë, kështu që disa imazhe të çuditshme do të hyjnë në planetarium **
Specifikat
Planetariumi kërkon një API të NASA-s për imazhe të lidhura me hapësirën dhe përdor një rrjet nervor konvolucionar për të përcaktuar nëse imazhi është i përshtatshëm për përpunim. Programi pastaj përdor OpenCV për të hequr sfondin nga imazhi, dhe më në fund imazhet ngjiten së bashku në një imazh të madh drejtkëndor. Ky imazh më pas ruhet, dhe një aplikacion Electron Node.js hap imazhin dhe përdor paketën PhotoSphere.js për të parë imazhin në një format 3D të stilit planetarium.
Varësitë
Python:
- Keras
- Jastëk
- cv2
- I trazuar
- Kërkesat
- urllib
- E rastësishme
- koha
- io
Elektron:
Fotosfera
Hapi 1: Vendosja e mjedisit tuaj
Instalimi i Electron dhe Python
Së pari, sigurohuni që keni node.js dhe npm të instaluara (nëse jo, mund t'i shkarkoni këtu)
Tjetra, duhet të instaloni Electron. Hapni një linjë komande dhe futni komandën e mëposhtme:
npm instaloni elektronin -g
Tjetra, keni nevojë për python, i cili mund të shkarkohet këtu
Krijimi i një mjedisi virtual
Hapni një linjë komande, pastaj futni komandat e mëposhtme për të konfiguruar mjedisin tuaj virtual:
pip instaloni virtualenv
hapësirë virtualenv
hapësirë cd
skriptet / aktivizoni
Instalimi i varësive të Python
Drejtoni këto komanda në komandën e shpejtë për të instaluar varësitë tuaja python:
pip instaloni keras
jastëk për instalimin e pipit
pip instaloni numpy
kërkesat për instalimin e pip
pip instaloni opencv-pythonNëse dëshironi të stërvitni vetë rrjetin, sigurohuni që të vendosni përshpejtimin e GPU për Keras
Hapi 2: Pyetja e API -së së Kërkimit të NASA -s
Vështrim i përgjithshëm
NASA ka shumë API vërtet të dobishme që mund t'i përdorni me projektet tuaja. Për këtë projekt, ne do të përdorim API-në e kërkimit, e cila na lejon të kërkojmë në bazën e të dhënave të imazheve të NASA-s për imazhe të lidhura me hapësirën.
Kodi
Së pari, ne duhet të përcaktojmë një funksion python për të pranuar një argument që do të veprojë si term kërkimi:
def get_image_search (fraza):
kaloj
Tjetra, ne do ta konvertojmë termin e kërkimit në formatin URL, pastaj do të përdorim bibliotekën e kërkesave për të kërkuar API:
def get_image_search (fraza):
params = {"q": urllib.parse.quote (arg), "media_type": "image"} results = request.get ("https://images-api.nasa.gov/search", params = params)
Së fundi, ne do të deshifrojmë koleksionin+vargun JSON që API na ktheu dhe nxjerrim një listë të lidhjeve me imazhet që lidhen me termin e kërkimit:
def get_image_search (fraza):
params = {"q": urllib.parse.quote (arg), "media_type": "image"} results = request.get ("https://images-api.nasa.gov/search", params = params) të dhëna = [rezultati ['href'] për rezultatin në results.json () ["koleksion"] ["artikuj"]
Ja ku po shkojme! Tani kemi një fragment kodi që mund të kërkojë API -në e kërkimit të imazhit të NASA -s dhe të kthejë një listë të lidhjeve me imazhet që lidhen me termin tonë të kërkimit.
Hapi 3: Rrjeti Neural Konvolucionar
Vështrim i përgjithshëm
Puna e rrjetit nervor është të klasifikojë nëse një imazh është i diçkaje në hapësirë, apo nëse nuk është. Për ta bërë këtë, ne do të përdorim një rrjet nervor konvolucional, ose CNN, për të kryer një seri operacionesh matricash në imazh dhe për të përcaktuar se sa hapësirë-y është. Unë nuk do t'i shpjegoj të gjitha, sepse ka shumë teori pas saj, por nëse doni të mësoni rreth rrjeteve nervore, unë sugjeroj "Mjeshtëri të të mësuarit të makinerisë"
Kodi
Së pari, ne duhet të importojmë varësitë tona:
import os
#Fiks për çështjen gjatë hapjes së trenit në GPU os.environ ['CUDA_VISIBLE_DEVICES'] = '' importoni tensorflow si tf nëse tf.test.gpu_device_name (): print ('GPU u gjet') tjetër: print ("Nuk u gjet GPU") nga keras.preprocessing.image import ImageDataGenerator nga keras. përpunimi i imazhit të importit nga keras.models import Sequential from keras.layers import Conv2D, MaxPooling2D nga keras.layers import Activation, Dropout, Flatten, Dense from keras import backend as K from PIL import Image importoni numpy si np
Tjetra ne duhet të përcaktojmë modelin tonë:
img_width, img_height = 1000, 500
train_data_dir = 'v_data/tren' validation_data_dir = 'v_data/test' nb_train_samples = 203 nb_validation_samples = 203 epoka = 10 batch_size = 8 nëse K.image_data_format () == 'channel_first': input_shag =} = (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 (Aktivizimi ('relu')) model.add (MaxPooling2D (madhësia e pishinës = (2, 2)))) model.shto (Conv2D (64, (2, 2)))) model.shto (Aktivizimi ('relu')) model.add (MaxPooling2D (pool_size = (2, 2)))) model.add (Flatten ()) model shto (E dendur (64)) modeli.shto (Aktivizimi ('relu')) modeli.shto (Dëbimi (0.5)) modeli.shto (I dendur (1)) modeli.shto (Aktivizimi ('sigmoid')) model.compile (humbja = 'binar_crossentropy', optimizer = 'rmsprop', metrics = ['saktësia'])
Unë e kam trajnuar modelin për ju, por nëse dëshironi ta stërvitni modelin vetë, në bazën tuaj të të dhënave, atëherë unë kam bashkangjitur kodin e trajnimit. Përndryshe, mund të shkarkoni skedarin HDF5 të modelit të trajnuar. Për shkak të kufizimeve të skedarëve Instructables, më është dashur ta riemërtoj me një shtrirje ".txt". Për ta përdorur atë, riemërtoni skedarin në një shtrirje ".h5" dhe ngarkojeni me këtë kod:
model.load_weights ("model_saved.h5")
Për të përdorur rrjetin për të parashikuar se sa hapësirë-y është një imazh, ne do të përcaktojmë këtë funksion:
def parashikoj (image_path):
img = image.load_img (image_path, target_size = (1000, 500)) img = np.expand_dims (img, axis = 0) result = model.predict_classes (img) rezultati i kthimit [0] [0]
Hapi 4: Përpunimi i imazhit
Vështrim i përgjithshëm
Për përpunimin e imazhit, unë jam duke përdorur bibliotekën OpenCV (cv2). Së pari, ne do të turbullojmë skajet e figurës, dhe më pas do të heqim sfondin duke krijuar një maskë dhe duke ndryshuar vlerat alfa të ngjyrave të errëta
Kodi
Kjo është pjesa e funksionit që mjegullon skajet:
def procesImage (img):
RADIUS = 20 # Hapni një imazh im = Image.open ("pilbuffer.png") # Ngjiteni imazhin në sfond të bardhë diam = 2 * RADIUS mbrapa = Imazh. I ri ('RGB', (im.size [0] + diam, im.size [1] + diam), (0, 0, 0)) back.paste (im, (RADIUS, RADIUS)) # Krijo maskë të turbullimit 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)) # Turbulloni imazhin dhe ngjiteni buzën e paqartë sipas maskës turbullira = prapa.filtër (ImageFilter. GaussianBlur (RADIUS / 2)) prapa. pastë (turbullim, maskë = maskë) prapa.save (" tranzicion.png ") back.close ()
Tjetra, ne do t'i vendosim ngjyrat e errëta në transparente dhe do ta ruajmë imazhin përkohësisht:
#Krijoni maskë dhe filtër zëvendësoni të zezën me alfa
image = cv2.imread ("tranzicioni.png") hMin = 0 sMin = 0 vMin = 20 hMax = 180 sMax = 255 vMax = 255 më e ulët = np.array ([hMin, sMin, vMin]) sipërme = np.array ([hMax, sMax, vMax]) hsv = cv2.cvtColor (imazhi, cv2. COLOR_BGR2HSV) maskë = cv2.inRange (hsv, posht, sipër) dalje = cv2.bitwise_and (imazh, imazh, maskë = maskë) *_, alfa = cv2.split (dalje) dst = cv2.merge ((dalje, alfa)) dalje = dst me hapur ("buffer.png", "w+") si skedar: kaloni cv2.imwrite ("buffer.png", dalje)
Hapi 5: Qepja e imazheve së bashku në një projektim të barabartë
Vështrim i përgjithshëm
Ky funksion merr imazhe të shumta dhe i bashkon ato në një format që mund të interpretohet nga paketa PhotoSphere.js, duke përdorur bibliotekën PIL (jastëk)
Kodi
Së pari, ne duhet të krijojmë një imazh që mund të veprojë si host për imazhet e tjera:
i ri = Imazh. i ri ("RGBA", (8000, 4000), ngjyra = (0, 0, 0))
Tjetra, ne duhet të përsërisim përmes grupit të imazheve (që të gjitha janë ndryshuar në madhësi në 1000x500) dhe t'i vendosim ato në imazh:
h = 0
w = 0 i = 0 për img në img_arr: new.pastë (img, (w, h), img) w += 1000 nëse w == 8000: h += 500 w = 0 i += 1
Tani ne thjesht e mbyllim këtë në një funksion që merr një grup imazhesh si argument, dhe kthen imazhin e ri:
def stitch_beta (img_arr):
i ri = Imazh. i ri ("RGBA", (8000, 4000), ngjyra = (0, 0, 0)) h = 0 w = 0 i = 0 për img në img_arr: new.paste (img, (w, h), img) w += 1000 nëse w == 8000: h += 500 w = 0 i += 1 kthehet e re
Hapi 6: Shkrimi i plotë Python
Ky është skripti i plotë i rrjetit nervor python, i cili ruhet si net.py dhe importohet në skriptin kryesor:
# importimi i bibliotekave
import os #Fix për lëshimin gjatë hapjes së trenit në GPU os.environ ['CUDA_VISIBLE_DEVICES'] = '' importoni tensorflow si tf nëse tf.test.gpu_device_name (): print ('GPU u gjet') tjetër: print ("Nuk u gjet asnjë GPU ") nga keras.preprocessing.image import ImageDataGenerator nga keras. përpunimi i imazhit të importit nga keras.models import Sequential from keras.layers import Conv2D, MaxPooling2D nga keras.layers import Activation, Dropout, Flatten, Dense from keras import backend as K from PIL import Imazh import numpy si np img_width, img_height = 1000, 500 train_data_dir = 'v_data/tren' validation_data_dir = 'v_data/test' nb_train_samples = 203 nb_validation_samples = 203 epoka = 10 grumbull_formimi = = '=': input_shape = (3, img_width, img_height) tjetër: input_shape = (img_width, img_height, 3) model = Sequential () model.add (Conv2D (32, (2, 2), input_shape = input_shape)) model.add (Aktivizimi ('relu')) model.add (MaxPooling2D (pool_size = (2, 2))) model.add (Conv2D (32, (2, 2))) model. shtoni (Aktivizimi ('relu')) model.add (MaxPooling2D (pool_size = (2, 2))) model.add (Conv2D (64, (2, 2))) model.add (Aktivizimi ('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 (E dendur (1)) model.add (Aktivizimi ('sigmoid')) model.compile (humbje = 'binare_krosentropi', optimizer = 'rmsprop', metrics = ['saktësi']) model.load_weights ("model_saved.h5") def parashikoj (image_path): img = image.load_img (image_path, target_size = (1000, 500)) img = np.expand_dims (img, axis = 0) result = model.predict_classes (img) rezultati i kthimit [0] [0]
Ky është skedari kryesor python, api.py:
kërkesat e importit, sys, random, urllib.parse, cv2
nga PIL import Image, ImageFilter from io import BytesIO import numpy as np import net def get_image_search (num, fraza): count = 0 img_arr = për arg në frazën: print (arg) print (f "Numri aktual i imazhit: {count } ") i = 0 params = {" q ": urllib.parse.quote (arg)," media_type ":" image "} results = request.get (" https://images-api.nasa.gov/search ", params = params) të dhëna = [rezultati ['href'] për rezultat në results.json () [" koleksion "] [" artikuj "] print (len (të dhëna)) nëse num> len (të dhëna): num = len (të dhëna) gjatë numërimit
Hapi 7: Aplikacioni Elektron
Vështrim i përgjithshëm
Ne do të krijojmë një aplikacion të thjeshtë elektronik që thjesht pozicionon dhe ngarkon elementin PhotoSphere. Skedarët main.js dhe package.json janë drejtpërdrejt nga faqja e internetit Electron, dhe HTML është një version pak i modifikuar i HTML i ofruar në faqen e internetit të PhotoSphere. Unë i kam përfshirë skedarët, por i kam riemëruar të gjithë në.txt, pasi Instructables nuk i lejon këto lloje skedarësh. Për të përdorur skedarët, riemërtojini ato me shtesën e duhur.
Kodi
kryesore.js
const {app, BrowserWindow} = kërkoj ('elektron')
funksioni createWindow () {const win = new BrowserWindow ({gjerësia: 800, lartësia: 600, webPreferences: {nodeIntegration: true}}) win.loadFile ('index.html')} app.whenReady (). pastaj (krijoWindow) app.on ('window-all-mbyllur', () => {if (process.platform! == 'darwin') {app.quit ()}}) app.on ('activ', () => {if (BrowserWindow.getAllWindows (). gjatësia === 0) {createWindow ()}})
paketë.json
{
"name": "hapësirë", "version": "0.1.0", "main": "main.js", "scripts": {"start": "electron". }}
indeksi.html
Hapi 8: Ekzekutimi
Krijimi i imazhit drejtkëndor
Për të krijuar imazhin, ekzekutoni skriptin api.py në vijën e komandës, me mjedisin e tij virtual të aktivizuar:
api.py
Pasi skriptet të kenë përfunduar ekzekutimin, ekzekutoni aplikacionin elektron duke përdorur:
npm fillimiVoila! Planetariumi juaj është aktiv! Faleminderit per leximin:)
Recommended:
Tekst për të folur Klikoni në një UChip të mundësuar nga ARM, dhe SBC të tjera të mundësuara nga ARM: 3 hapa
Tekst për të folur Klikoni në një UChip të mundësuar nga ARMbasic, dhe SBC të tjera të mundësuara nga ARMbasic: Hyrje: Ditë e mirë. Emri im është Tod. Unë jam një profesionist i hapësirës dhe mbrojtjes që është gjithashtu një zemërgjerë në zemër. Frymëzim: Duke ardhur nga epoka e dial-up BBS, Mikrokontrolluesit 8-bit, kompjuterët personal Kaypro/Commodore/Tandy/TI-994A, kur R
Një tastierë USB dhe Bluetooth e lidhur me dorë Mundësuar nga Python: 5 hapa
Një tastierë USB dhe Bluetooth e lidhur me dorë Mundësuar nga Python: Kjo është një tastierë mekanike e lidhur me dorë. Ai mbështet USB dhe Bluetooth dhe po punon Python në mikrokontrolluesin e tastierës. Ju mund të pyesni veten se si funksionon. Ndiqni hapat për të ndërtuar një, do ta zbuloni
Monitorimi i përshpejtimit duke përdorur Raspberry Pi dhe AIS328DQTR duke përdorur Python: 6 hapa
Monitorimi i përshpejtimit duke përdorur Raspberry Pi dhe AIS328DQTR Duke përdorur Python: Përshpejtimi është i kufizuar, mendoj sipas disa ligjeve të Fizikës.- Terry Riley Një cheetah përdor përshpejtim të mahnitshëm dhe ndryshime të shpejta në shpejtësi kur ndiqni. Krijesa më e shpejtë në breg, herë pas here, përdor ritmin e saj të lartë për të kapur prenë.
Automatizimi dhe monitorimi i shtëpisë i kontrolluar nga zëri/interneti duke përdorur ESP8266 dhe Google Home Mini: 6 hapa
Automatizimi dhe monitorimi i shtëpisë i kontrolluar nga zëri/interneti duke përdorur ESP8266 dhe Google Home Mini: Hej !! Pas një pushimi të gjatë unë jam këtu pasi të gjithë duhet të bëjmë diçka të mërzitshme (punë) për të fituar. Pas të gjithë artikujve të AUTOMATITS SOM SHTPIS kam shkruar nga BLUETOOTH, IR, Local WIFI, Cloud dmth ato të vështirat, * TANI * vjen më e lehtë por më efikase
A është kjo një dorë? (Kamera Raspberry Pi + Rrjeti Neural) Pjesa 1/2: 16 hapa (me fotografi)
A është kjo një dorë? (Kamera Raspberry Pi + Neural Network) Pjesa 1/2: Disa ditë më parë, unë dëmtova dorën e djathtë në palestër. Më pas sa herë që kam përdorur miun kompjuterik, më shkaktoi shumë dhimbje për shkak të këndit të pjerrët të kyçit të dorës. Atëherë më goditi " a nuk do të ishte mirë nëse mund të shndërronim çdo sipërfaqe në një trap