Talaan ng mga Nilalaman:

Pinapagana ng Neural Network Planetarium Gamit ang Python, Electron, at Keras: 8 Hakbang
Pinapagana ng Neural Network Planetarium Gamit ang Python, Electron, at Keras: 8 Hakbang

Video: Pinapagana ng Neural Network Planetarium Gamit ang Python, Electron, at Keras: 8 Hakbang

Video: Pinapagana ng Neural Network Planetarium Gamit ang Python, Electron, at Keras: 8 Hakbang
Video: How AI Could Solve Our Renewable Energy Problem 2024, Nobyembre
Anonim
Pinapagana ng Neural Network Planetarium Gamit ang Python, Electron, at Keras
Pinapagana ng Neural Network Planetarium Gamit ang Python, Electron, at Keras

Sa itinuturo na ito, ipapakita ko sa iyo kung paano ako nagsulat ng isang awtomatikong generator ng 3D planetarium, gamit ang Python at Electron

Ipinapakita ng video sa itaas ang isa sa mga random na planetarium na nabuong programa.

** Tandaan: Ang program na ito ay hindi perpekto sa anumang paraan, at sa ilang mga lugar na hindi masyadong pythonic. Ang neural net discriminator ay ~ ~ 89% lamang na tumpak, kaya't ang ilang mga kakatwang imahe ay gagawin sa planetarium **

Mga detalye

Ang planetarium ay nagtatanong sa isang NASA API para sa mga imaheng nauugnay sa espasyo, at gumagamit ng isang convolutional neural network upang matukoy kung ang imahe ay angkop para sa pagproseso. Gumagamit ang programa ng OpenCV upang alisin ang background mula sa imahe, at sa wakas ang mga imahe ay naisahin sa isang malaking imahe na magkakaugnay. Pagkatapos ay nai-save ang imaheng ito, at isang application na Electron Node.js ang magbubukas ng imahe, at ginagamit ang package na PhotoSphere.js upang matingnan ang imahe sa isang format na istilong planetarium 3D.

Mga dependency

Sawa:

  • Keras
  • Unan
  • cv2
  • Numpy
  • Mga Kahilingan
  • urllib
  • Random
  • oras
  • io

Elektron:

PhotoSphere

Hakbang 1: Pag-set up ng Iyong Kapaligiran

Pag-install ng Electron at Python

Una, tiyaking mayroon kang naka-install na node.js at npm (kung hindi, maaari kang mag-download dito)

Susunod, kailangan mong i-install ang Electron. Buksan ang isang prompt ng utos, at ipasok ang sumusunod na utos:

nag-install ng electron -g

Susunod, kailangan mo ng sawa, na maaaring ma-download dito

Pagse-set up ng isang Virtual na Kapaligiran

Magbukas ng isang prompt ng utos, pagkatapos ay ipasok ang mga sumusunod na utos upang i-set up ang iyong virtual na kapaligiran:

pip install virtualenv

virtualenv space

puwang ng cd

script / buhayin

Pag-install ng Mga Depende sa Python

Patakbuhin ang mga utos na ito sa prompt ng utos upang mai-install ang iyong mga dependency sa python:

pip install keras

pip install unan

pip install na numpy

pip mga kahilingan sa pag-install

pip install opencv-pythonKung nais mong sanayin ang network mismo, tiyaking i-set up ang pagpabilis ng GPU para sa Keras

Hakbang 2: Pagtatanong sa NASA Search API

Pangkalahatang-ideya

Ang NASA ay may maraming talagang kapaki-pakinabang na mga API na maaari mong gamitin sa iyong mga proyekto. Para sa proyektong ito, gagamitin namin ang search API, na nagpapahintulot sa amin na maghanap ng database ng imahe ng NASA para sa mga imaheng nauugnay sa espasyo.

Ang Code

Una, kailangan naming tukuyin ang isang pagpapaandar ng sawa upang tanggapin ang isang argument na gaganap bilang termino para sa paghahanap:

def get_image_search (parirala):

pumasa

Susunod, iko-convert namin ang term ng paghahanap sa format ng URL, pagkatapos ay gagamitin ang library ng mga kahilingan upang magtanong sa API:

def get_image_search (parirala):

params = {"q": urllib.parse.quote (arg), "media_type": "image"} mga resulta = request.get ("https://images-api.nasa.gov/search", params = params)

Sa wakas, ide-decode namin ang koleksyon + string ng JSON na ibinalik sa amin ng API, at kumukuha ng isang listahan ng mga link sa mga imaheng nauugnay sa termino para sa paghahanap:

def get_image_search (parirala):

params = {"q": urllib.parse.quote (arg), "media_type": "image"} mga resulta = request.get ("https://images-api.nasa.gov/search", params = params) data = [resulta ['href'] para sa resulta sa mga resulta.json () ["koleksyon"] ["mga item"]

Ayan na! Mayroon kaming isang code snippet na maaaring magtanong sa NASA image search API, at ibalik ang isang listahan ng mga link sa mga larawang nauugnay sa aming termino para sa paghahanap.

Hakbang 3: Ang Convolutional Neural Network

Pangkalahatang-ideya

Ang gawain ng neural network ay upang uriin kung ang isang imahe ay may isang bagay sa kalawakan, o kung hindi. Upang magawa ito, gagamit kami ng isang convolutional neural network, o CNN, upang maisagawa ang isang serye ng mga operasyon ng matrix sa imahe, at matukoy kung gaano ito space-y. Hindi ko ipaliwanag ang lahat ng ito, dahil maraming teorya ang nasa likod nito, ngunit kung nais mong malaman ang tungkol sa mga neural network, iminumungkahi ko ang "Machine Learning Mastery"

Ang Code

Una, kailangan nating i-import ang aming mga dependency:

import os

#Fix para sa isyu sa panahon ng tren stepn oN GPU os.en environment ['CUDA_VISIBLE_DEVICES'] = '' i-import ang tensorflow bilang tf kung tf.test.gpu_device_name (): i-print ('Nahanap ang GPU') iba pa: i-print ("Walang nahanap na GPU") mula sa keras.preprocessing.image i-import ang ImageDataGenerator mula keras.preproseso ng pag-import ng imahe mula keras.models import Sequential mula keras.layers import Conv2D, MaxPooling2D mula keras.layers import Activation, Dropout, Flatten, Dense mula keras import backend bilang K mula sa PIL import Image i-import ang numpy bilang np

Susunod na kailangan naming tukuyin ang aming modelo:

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 = (3_phape): = (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))) modelo. magdagdag ng (Dense (64)) model.add (Activation ('relu')) model.add (Dropout (0.5)) model.add (Dense (1)) model.add (Activation ('sigmoid')) model. compile (pagkawala = 'binary_crossentropy', optimizer = 'rmsprop', sukatan = ['kawastuhan'])

Sinanay ko ang modelo para sa iyo, ngunit kung nais mong sanayin ang modelo sa iyong sarili, sa iyong sariling dataset, pagkatapos ay ikinabit ko ang code ng pagsasanay. Kung hindi man, maaari mong i-download ang file na HDF5 ng sinanay na modelo. Dahil sa mga paghihigpit ng file na Instructables, kinailangan ko itong palitan ng pangalan na may isang ".txt" na extension. Upang magamit ito, palitan ang pangalan ng file sa isang ".h5" na extension, at i-load ito sa code na ito:

model.load_weights ("model_saved.h5")

Upang magamit ang network upang hulaan kung paano ang space-y isang imahe, tutukuyin namin ang pagpapaandar na ito:

def hula (image_path):

img = image.load_img (image_path, target_size = (1000, 500)) img = np.expand_dims (img, axis = 0) resulta = model.predict_classes (img) resulta ng pagbabalik [0] [0]

Hakbang 4: Pinoproseso ang Larawan

Pangkalahatang-ideya

Para sa pagproseso ng imahe, gumagamit ako ng OpenCV (cv2) library. Una, lilinurin namin ang mga gilid ng imahe, at pagkatapos ay aalisin namin ang background sa pamamagitan ng paglikha ng isang mask at pagbabago ng mga halagang alpha ng mas madidilim na mga kulay

Ang Code

Ito ang bahagi ng pagpapaandar na lumabo sa mga gilid:

def processImage (img):

RADIUS = 20 # Magbukas ng im im ima Image.open ("pilbuffer.png") # I-paste ang imahe sa puting background diam = 2 * RADIUS pabalik = Image.new ('RGB', (im.size [0] + diam, im.size [1] + diam), (0, 0, 0)) back.paste (im, (RADIUS, RADIUS)) # Lumikha ng 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) mask. i-paste (blck, (diam, diam)) # Palabuin ang imahe at i-paste ang malabong gilid ayon sa mask blur = back.filter (ImageFilter. GaussianBlur (RADIUS / 2)) back.paste (blur, mask = mask) back.veve (" transition.png ") back.close ()

Susunod, itatakda namin ang mas madidilim na mga kulay sa transparent, at pansamantalang mai-save ang imahe:

# Lumikha ng mask at filter na palitan ang itim ng alpha

imahe = cv2.imread ("transition.png") hMin = 0 sMin = 0 vMin = 20 hMax = 180 sMax = 255 vMax = 255 mas mababa = np.array ([hMin, sMin, vMin]) itaas = np.array ([hMax, sMax, vMax]) hsv = cv2.cvtColor (imahe, cv2. COLOR_BGR2HSV) mask = cv2.inRange (hsv, ibaba, itaas) output = cv2.bitwise_and (imahe, imahe, mask = mask) * _, alpha = cv2.split (output) dst = cv2.merge ((output, alpha)) output = dst na may bukas ("buffer.png", "w +") bilang file: ipasa ang cv2.imwrite ("buffer.png", output)

Hakbang 5: Pag-stitch ng Mga Larawan Magkasama sa isang Equirectangular Projection

Pangkalahatang-ideya

Ang pagpapaandar na ito ay tumatagal ng maraming mga imahe at tahiin ang mga ito sa isang format na maaaring bigyang kahulugan ng pakete ng PhotoSphere.js, gamit ang library ng PIL (unan)

Ang Code

Una, kailangan naming lumikha ng isang imahe na maaaring kumilos bilang host para sa iba pang mga imahe:

bago = Image.new ("RGBA", (8000, 4000), kulay = (0, 0, 0))

Susunod, kailangan naming umulit sa hanay ng mga imahe (na lahat ay nabago ang laki sa 1000x500) at ilagay ang mga ito sa imahe:

h = 0

w = 0 i = 0 para sa img sa img_arr: new.paste (img, (w, h), img) w + = 1000 kung w == 8000: h + = 500 w = 0 i + = 1

Ngayon ay ibinalot lamang namin ito sa isang pagpapaandar na tumatagal ng isang hanay ng mga imahe bilang argument nito, at ibabalik ang bagong imahe:

def stitch_beta (img_arr):

bago = Image.new ("RGBA", (8000, 4000), kulay = (0, 0, 0)) h = 0 w = 0 i = 0 para sa img sa img_arr: new.paste (img, (w, h), img) w + = 1000 kung w == 8000: h + = 500 w = 0 i + = 1 bumalik nang bago

Hakbang 6: Ang Buong Script ng Python

Ito ang buong script ng neth network ng python, na na-save bilang net.py, at na-import sa pangunahing script:

# pag-import ng mga aklatan

i-import ang os #Fix para sa isyu sa panahon ng tren stepn oN GPU os.en environment ['CUDA_VISIBLE_DEVICES'] = '' i-import ang tensorflow bilang tf kung tf.test.gpu_device_name (): i-print ('Nahanap ang GPU') iba pa: i-print ("Walang nahanap na GPU ") mula keras.preprocessing.image import ImageDataGenerator mula keras.preproseso ng pag-import ng imahe mula keras.models import Sequential mula keras.layers import Conv2D, MaxPooling2D mula keras.layers import Activation, Dropout, Flatten, Dense mula sa hard import backend bilang K mula sa PIL i-import ang I-import ang imahe numpy bilang 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_data_format: input_shape = (3, img_width, img_height) iba pa: input_shape = (img_width, img_height, 3) modelo = Sequential () model.add (Conv2D (32, (2, 2), input_shape = input_shape)) model.add (Pag-activate ('relu')) model.add (MaxPooling2D (pool_size = (2, 2))) model.add (Conv2D (32, (2, 2))) modelo. idagdag ang (Pag-aktibo ('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', sukatan = ['kawastuhan']) model.load_weights ("model_saved.h5") def hula (image_path): img = image.load_img (image_path, target_size = (1000, 500)) img = np.expand_dims (img, axis = 0) resulta = model.predict_class (img) resulta ng pagbabalik [0] [0]

Ito ang pangunahing file ng sawa, api.py:

pag-import ng mga kahilingan, sys, random, urllib.parse, cv2

mula sa PIL import Image, ImageFilter mula io import BytesIO import numpy bilang np import net def get_image_search (num, parirala): count = 0 img_arr = para sa arg sa parirala: print (arg) print (f "Kasalukuyang bilang ng imahe: {count } ") i = 0 params = {" q ": urllib.parse.quote (arg)," media_type ":" image "} mga resulta = request.get (" https://images-api.nasa.gov/search ", params = params) data = [resulta ['href'] para sa resulta sa mga resulta.json () [" koleksyon "] [" mga item "] i-print (len (data)) kung num> len (data): num = len (data) habang binibilang = num: break print (f "\ n {count} mga imahe na muling nakuha") ibalik ang img_arr def stitch_beta (img_arr): bago = Image.new ("RGBA", (8000, 4000), kulay = (0, 0, 0)) h = 0 w = 0 i = 0 para sa img sa img_arr: # pbar.set_description (f "Pagproseso ng imahe {i + 1}") new.paste (img, (w, h), img) w + = 1000 kung w == 8000: h + = 500 w = 0 i + = 1 bumalik ng bagong proseso ng defImage (img): RADIUS = 20 # Magbukas ng im im ima Image.open ("pilbuffer.png") # I-paste ang imahe sa puting background diam = 2 * RADIUS back = Image.new ('RGB', (im.size [0] + diam, im.size [1] + diam), (0, 0, 0)) back.paste (im, (RADIUS, RADIUS)) # Lumikha ng 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) mask.paste (blck, (diam, diam)) # Blur image and paste blurred edge ayon sa mask blur = back.filter (ImageFilter. GaussianBlur (RADIUS / 2)) back.paste (blur, mask = mask) back.save ("transition.png") back.close () #Create mask at filter palitan ang itim ng alpha image = cv2.imread (" pagbiyahe ion.png ") hMin = 0 sMin = 0 vMin = 20 hMax = 180 sMax = 255 vMax = 255 mas mababa = np.array ([hMin, sMin, vMin]) itaas = np.array ([hMax, sMax, vMax]) hsv = cv2.cvtColor (imahe, cv2. COLOR_BGR2HSV) mask = cv2.inRange (hsv, ibaba, itaas) output = cv2.bitwise_and (imahe, imahe, mask = mask) * _, alpha = cv2.split (output) dst = cv2.merge ((output, alpha)) output = dst na may bukas ("buffer.png", "w +") bilang file: ipasa ang cv2.imwrite ("buffer.png", output) #Edge detection at blurring kung _name_ == "_main_": search_terms = ["supernova", "planet", "galaxy", "milky way", "nebula", "mga bituin"] #Ang mga termino para sa paghahanap ay maaaring mabago sa anumang nais mong isama ng planetarium img_arr = get_image_search (64, search_terms) print ("Mga imahe na nakuha at neural na sinala") img = stitch_beta (img_arr) print ("Stitched Images") img.save ("stitched.png")

Hakbang 7: Ang Electron App

Pangkalahatang-ideya

Lilikha kami ng isang simpleng electron app na posisyon lamang at naglo-load ng elemento ng PhotoSphere. Ang main.js at package.json na mga file ay tuwid mula sa website ng Electron, at ang HTML ay isang bahagyang binago na bersyon ng HTML na ibinigay sa website ng PhotoSphere. Isinama ko ang mga file, ngunit pinalitan ng pangalan ang lahat sa.txt, dahil hindi pinapayagan ng mga Instructable ang mga uri ng file na ito. Upang magamit ang mga file, palitan ang pangalan ng mga ito ng naaangkop na extension.

Ang Code

pangunahing.js

const {app, BrowserWindow} = nangangailangan ('electron')

function createWindow () {const win = new BrowserWindow ({width: 800, taas: 600, webPreferences: {nodeIntegration: true}}) win.loadFile ('index.html')} app.whenReady (). pagkatapos (createWindow) app.on ('window-all-closed', () => {if (process.platform! == 'darwin') {app.quit ()}}) app.on ('activate', () => {if (BrowserWindow.getAllWindows (). haba === 0) {createWindow ()}})

package.json

{

"name": "space", "bersyon": "0.1.0", "main": "main.js", "script": {"start": "electron." }}

index.html

Hakbang 8: Pagpapatupad

Lumilikha ng equirectangular na imahe

Upang likhain ang imahe, patakbuhin ang api.py script sa command prompt, na pinapagana ang virtual na kapaligiran:

api.py

Matapos matapos ang pagpapatupad ng mga script, patakbuhin ang electron app gamit ang:

magsimula na akoVoila! Aktibo ang iyong planetarium! Salamat sa pagbabasa:)

Inirerekumendang: