Talaan ng mga Nilalaman:
- Hakbang 1: Pag-set up ng Iyong Kapaligiran
- Hakbang 2: Pagtatanong sa NASA Search API
- Hakbang 3: Ang Convolutional Neural Network
- Hakbang 4: Pinoproseso ang Larawan
- Hakbang 5: Pag-stitch ng Mga Larawan Magkasama sa isang Equirectangular Projection
- Hakbang 6: Ang Buong Script ng Python
- Hakbang 7: Ang Electron App
- Hakbang 8: Pagpapatupad
Video: Pinapagana ng Neural Network Planetarium Gamit ang Python, Electron, at Keras: 8 Hakbang
2024 May -akda: John Day | [email protected]. Huling binago: 2024-01-30 13:11
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
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:
Subukan ang Bare Arduino, Gamit ang Software ng Laro Gamit ang Capacitive Input at LED: 4 na Hakbang
Subukan ang Bare Arduino, Gamit ang Software ng Laro Gamit ang Capacitive Input at LED: " Push-It " Interactive na laro gamit ang isang hubad na Arduino board, walang mga panlabas na bahagi o mga kable na kinakailangan (gumagamit ng isang capacitive 'touch' input). Ipinapakita sa itaas, ipinapakita ang pagtakbo nito sa dalawang magkakaibang board. Push-Mayroon itong dalawang layunin. Upang mabilis na maipakita / v
Pinapagana ng Motion Cosplay Wings Gamit ang Circuit Playground Express - Bahagi 1: 7 Mga Hakbang (na may Mga Larawan)
Motion Activated Cosplay Wings Paggamit ng Circuit Playground Express - Bahagi 1: Ito ay bahagi ng isa sa isang bahagi ng proyekto, kung saan ipapakita ko sa iyo ang aking proseso para sa paggawa ng isang pares ng mga awtomatikong pakpak ng engkanto. Ang unang bahagi ng proyekto ay ang mekanika ng mga pakpak, at ang pangalawang bahagi ay ginagawang masusuot, at idinadagdag ang mga pakpak
Bumuo ng isang Device na Monitor ng Enerhiya Gamit ang isang Particle Electron: 5 Hakbang (na may Mga Larawan)
Bumuo ng isang Device ng Monitor ng Enerhiya Gamit ang isang Particle Electron: Sa karamihan ng mga negosyo, isinasaalang-alang namin ang Enerhiya na isang gastos sa negosyo. Lalabas ang singil sa aming mail o mga email at binabayaran namin ito bago ang petsa ng pagkansela. Sa pag-usbong ng IoT at matalinong mga aparato, ang Enerhiya ay nagsisimulang kumuha ng isang bagong lugar sa isang negosyo 'bala
Internet Clock: Ipakita ang Petsa at Oras Gamit ang isang OLED Gamit ang ESP8266 NodeMCU Sa NTP Protocol: 6 na Hakbang
Internet Clock: Display Date and Time With an OLED Gamit ang ESP8266 NodeMCU With NTP Protocol: Kumusta mga tao sa mga itinuturo na ito na magtatayo kami ng isang orasan sa internet na magkakaroon ng oras mula sa internet kaya't ang proyektong ito ay hindi mangangailangan ng anumang RTC upang tumakbo, kakailanganin lamang nito ang isang nagtatrabaho koneksyon sa internet At para sa proyektong ito kailangan mo ng isang esp8266 na magkakaroon ng
Kontrolin ang Arduino Gamit ang Smartphone Sa pamamagitan ng USB Gamit ang Blynk App: 7 Mga Hakbang (na may Mga Larawan)
Kontrolin ang Arduino Gamit ang Smartphone Sa Pamamagitan ng USB Sa Blynk App: Sa tutorial na ito, matututunan namin kung paano gamitin ang Blynk app at Arduino upang makontrol ang lampara, ang kumbinasyon ay sa pamamagitan ng USB serial port. Ang layunin ng pagtuturo na ito ay upang ipakita ang pinakasimpleng solusyon sa malayo-pagkontrol ng iyong Arduino o c