Përmbajtje:

Planetariumi i mundësuar nga Rrjeti Neural duke përdorur Python, Electron dhe Keras: 8 hapa
Planetariumi i mundësuar nga Rrjeti Neural duke përdorur Python, Electron dhe Keras: 8 hapa

Video: Planetariumi i mundësuar nga Rrjeti Neural duke përdorur Python, Electron dhe Keras: 8 hapa

Video: Planetariumi i mundësuar nga Rrjeti Neural duke përdorur Python, Electron dhe Keras: 8 hapa
Video: Lidhja e fuqishme 4 planeti në Peshorja | Tetor - Nëntor 2023 | Astrologjia Vedike 2024, Korrik
Anonim
Planetariumi i mundësuar nga Rrjeti Neural duke përdorur Python, Electron dhe Keras
Planetariumi i mundësuar nga Rrjeti Neural duke përdorur Python, Electron dhe Keras

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 = num: print print (f "\ n {numëroni} imazhe të marra") kthehen img_arr def stitch_beta (img_arr): new = Image.new ("RGBA", (8000, 4000), color = (0, 0, 0)) h = 0 w = 0 i = 0 për img në img_arr: #pbar.set_description (f "Përpunimi i imazhit {i +1}") new.paste (img, (w, h), img) w += 1000 nëse w == 8000: h += 500 w = 0 i += 1 kthen një proces të ri defImage (img): RADIUS = 20 # Hap një imazh im = Image.open ("pilbuffer.png") # Ngjit një imazh në diametrin e bardhë të sfondit = 2 * RADIUS mbrapa = Imazh. I ri ('RGB', (im.size [0] + diam, im.size [1] + diam), (0, 0, 0)) prapa. Paste (im, (RADIUS, RADIUS)) # Krijo maskë të maskës së turbullt = Imazh. I ri ('L', (im.size [0] + diam, im.size [1] + diam), 255) blck = Image.new ('L', (im.size [0] - diam, im.size [1] - diam), 0) mask.pastë (blck, (diam, diam)) # Mjegulloni imazhin dhe ngjiteni skajin e paqartë sipas turbullimit të maskës = back.filter (ImageFilter. GaussianBlur (RADIUS / 2)) back.paste (turbullim, maskë = maskë) back.save ("tranzicioni.png") back.close () #Krijo maskë dhe filtri zëvendëson të zezën me imazhin alfa = cv2.imread (" tranzit ion.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 ((dalja, alfa)) dalja = dst me hapur ("buffer.png", "w+") si skedar: kaloni cv2.imwrite ("buffer.png", output) #Edge detection and blurring if _name_ == "_main_": search_terms = ["supernova", "planet", "galaktikë", "rruga e qumështit", "mjegullnajë", "yje"] #Termat e kërkimit mund të ndryshohen në çfarëdo që dëshironi të përfshijë planetariumi img_arr = merrni_image_search (64, terma kërkimi) print ("Imazhet e marra dhe të filtruara neurale") img = stitch_beta (img_arr) print ("Imazhet e qepura") img.save ("stitched.png")

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: