Isi kandungan:

Planetarium Bertenaga Rangkaian Neural Menggunakan Python, Elektron, dan Keras: 8 Langkah
Planetarium Bertenaga Rangkaian Neural Menggunakan Python, Elektron, dan Keras: 8 Langkah

Video: Planetarium Bertenaga Rangkaian Neural Menggunakan Python, Elektron, dan Keras: 8 Langkah

Video: Planetarium Bertenaga Rangkaian Neural Menggunakan Python, Elektron, dan Keras: 8 Langkah
Video: Gregory Chaitin: Kompleksitas, Metabiologi, Gödel, Cold Fusion 2024, November
Anonim
Planetarium Bertenaga Rangkaian Neural Menggunakan Python, Elektron, dan Keras
Planetarium Bertenaga Rangkaian Neural Menggunakan Python, Elektron, dan Keras

Dalam arahan ini, saya akan menunjukkan kepada anda bagaimana saya menulis penjana planetarium 3D automatik, menggunakan Python dan Electron

Video di atas menunjukkan salah satu planetarium rawak yang dihasilkan oleh program.

** Catatan: Program ini sama sekali tidak sempurna, dan di beberapa tempat tidak terlalu sintetik. Diskriminasi jaring neural hanya ~ 89% tepat, jadi beberapa gambar ganjil akan menjadikannya planetarium **

Spesifik

Planetarium meminta API NASA untuk gambar yang berkaitan dengan ruang, dan menggunakan rangkaian saraf konvolusional untuk menentukan apakah gambar itu sesuai untuk diproses. Program ini kemudian menggunakan OpenCV untuk menghilangkan latar belakang dari gambar, dan akhirnya gambar dijahit bersama menjadi satu gambar segi empat besar. Gambar ini kemudian disimpan, dan aplikasi Electron Node.js membuka gambar, dan menggunakan pakej PhotoSphere.js untuk melihat gambar dalam format 3D gaya planetarium.

Kebergantungan

Python:

  • Keras
  • Bantal
  • cv2
  • Kekenyangan
  • Permintaan
  • urib
  • Secara rawak
  • masa
  • io

Elektron:

PhotoSphere

Langkah 1: Menyiapkan Persekitaran Anda

Memasang Elektron dan Python

Pertama, pastikan anda memasang node.js dan npm (jika tidak, anda boleh memuat turun di sini)

Seterusnya, anda perlu memasang Electron. Buka command prompt, dan masukkan arahan berikut:

npm pasang elektron -g

Seterusnya, anda memerlukan python, yang boleh dimuat turun di sini

Menetapkan Persekitaran Maya

Buka command prompt, kemudian masukkan arahan berikut untuk mengatur persekitaran maya anda:

pip pasang virtualenv

ruang virtualenv

ruang cd

skrip / aktifkan

Memasang Pergantungan Python

Jalankan perintah ini di command prompt untuk memasang pergantungan python anda:

memasang paip keras

pip memasang bantal

memasang pip numpy

permintaan pemasangan pip

memasang pip opencv-pythonSekiranya anda ingin melatih rangkaian sendiri, pastikan untuk mengatur pecutan GPU untuk Keras

Langkah 2: Menanya API Carian NASA

Gambaran keseluruhan

NASA mempunyai banyak API yang sangat berguna yang boleh anda gunakan dengan projek anda. Untuk projek ini, kami akan menggunakan API carian, yang membolehkan kami mencari pangkalan data gambar NASA untuk gambar yang berkaitan dengan ruang.

Kod tersebut

Pertama, kita perlu menentukan fungsi python untuk menerima argumen yang akan bertindak sebagai istilah carian:

def get_image_search (frasa):

lulus

Seterusnya, kami akan menukar istilah carian menjadi format URL, kemudian menggunakan perpustakaan permintaan untuk meminta API:

def get_image_search (frasa):

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

Akhirnya, kami akan menyahkod koleksi + rentetan JSON yang dikembalikan oleh API kepada kami, dan mengekstrak senarai pautan ke gambar yang berkaitan dengan istilah carian:

def get_image_search (frasa):

params = {"q": urllib.parse.quote (arg), "media_type": "image"} hasil = permintaan.get ("https://images-api.nasa.gov/search", params = params) data = [hasil ['href'] untuk hasil dalam hasil.json () ["koleksi"] ["item"]

Di sana kita pergi! Kami sekarang mempunyai coretan kod yang dapat meminta API carian gambar NASA, dan mengembalikan senarai pautan ke gambar yang berkaitan dengan istilah carian kami.

Langkah 3: Rangkaian Neural Konvolusional

Gambaran keseluruhan

Tugas rangkaian saraf adalah untuk mengklasifikasikan sama ada gambar adalah sesuatu di ruang angkasa, atau tidak. Untuk melakukan ini, kita akan menggunakan rangkaian saraf konvolusional, atau CNN, untuk melakukan serangkaian operasi matriks pada gambar, dan menentukan seberapa besar ruang itu. Saya tidak akan menjelaskan semua ini, kerana terdapat banyak teori di belakangnya, tetapi jika anda ingin mengetahui tentang rangkaian saraf, saya mencadangkan "Penguasaan Pembelajaran Mesin"

Kod tersebut

Pertama, kita perlu mengimport pergantungan kita:

import os

#Fix untuk masalah semasa kereta api stepN o GPU os.environ ['CUDA_VISIBLE_DEVICES'] = '' import tensorflow as tf if tf.test.gpu_device_name (): print ('GPU found') other: print ("No GPU found") dari keras.preprocessing.image import ImageDataGenerator dari keras.preprocessing import image dari keras.models import Sequential dari keras.layers import Conv2D, MaxPooling2D dari keras.layers import Activation, Dropout, Flatten, Dense dari keras import backend sebagai K dari PIL import Image import numpy sebagai np

Seterusnya kita perlu menentukan model kita:

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 zaman = 10 batch_size = 8 if K.image_data_format () == 'channel_first': input_shight = (input_shape =) = (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))) 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 (kerugian = 'binary_crossentropy', optimizer = 'rmsprop', metrik = ['ketepatan'])

Saya telah melatih model untuk anda, tetapi jika anda ingin melatih model itu sendiri, pada set data anda sendiri, maka saya telah melampirkan kod latihan. Jika tidak, anda boleh memuat turun fail HDF5 model terlatih. Oleh kerana sekatan fail Instructables, saya terpaksa menamakannya semula dengan pelanjutan ".txt". Untuk menggunakannya, ganti nama fail menjadi pelanjutan ".h5", dan muatkan dengan kod ini:

model.load_weights ("model_saved.h5")

Untuk menggunakan rangkaian untuk meramalkan seberapa besar ruang gambar, kami akan menentukan fungsi ini:

def ramalan (image_path):

img = image.load_img (image_path, target_size = (1000, 500)) img = np.expand_dims (img, axis = 0) result = model.predict_classes (img) hasil pengembalian [0] [0]

Langkah 4: Memproses Imej

Gambaran keseluruhan

Untuk pemprosesan imej, saya menggunakan perpustakaan OpenCV (cv2). Pertama, kita akan mengaburkan tepi gambar, dan kemudian kita akan membuang latar belakang dengan membuat topeng dan mengubah nilai alpha dari warna yang lebih gelap

Kod tersebut

Ini adalah bahagian fungsi yang mengaburkan tepi:

proses defImage (img):

RADIUS = 20 # Buka gambar im = Image.open ("pilbuffer.png") # Tampal gambar pada latar belakang putih diam = 2 * RADIUS kembali = Image.new ('RGB', (im.size [0] + diam, im.size [1] + diam), (0, 0, 0)) back.paste (im, (RADIUS, RADIUS)) # Buat topeng blur 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. tampal (blck, (diam, diam)) # Blur gambar dan tampal tepi kabur mengikut mask blur = back.filter (ImageFilter. GaussianBlur (RADIUS / 2)) back.paste (blur, mask = mask) back.save (" peralihan-p.webp

Seterusnya, kami akan menetapkan warna yang lebih gelap menjadi telus, dan menyimpan gambar buat sementara waktu:

#Buat topeng dan penapis ganti hitam dengan alpha

gambar = cv2.imread ("transisi.png") hMin = 0 sMin = 0 vMin = 20 hMax = 180 sMax = 255 vMax = 255 lebih rendah = np. array ([hMin, sMin, vMin]) atas = np.array ([hMax, sMax, vMax]) hsv = cv2.cvtColor (image, cv2. COLOR_BGR2HSV) mask = cv2.inRange (hsv, lower, upper) output = cv2.bitwise_and (gambar, gambar, topeng = topeng) * _, alpha = cv2.split (output) dst = cv2.merge ((output, alpha)) output = dst dengan terbuka ("buffer.png", "w +") sebagai fail: lulus cv2.imwrite ("buffer.png", output)

Langkah 5: Menjahit Imej Bersama Menjadi Unjuran Persamaan

Gambaran keseluruhan

Fungsi ini mengambil banyak gambar dan menjahitnya ke dalam format yang dapat ditafsirkan oleh pakej PhotoSphere.js, menggunakan perpustakaan PIL (bantal)

Kod tersebut

Pertama, kita perlu membuat gambar yang boleh berfungsi sebagai hos untuk gambar lain:

baru = Image.new ("RGBA", (8000, 4000), color = (0, 0, 0))

Seterusnya, kita perlu melakukan lelaran melalui pelbagai gambar (yang semuanya telah diubah ukurannya menjadi 1000x500) dan meletakkannya ke dalam gambar:

h = 0

w = 0 i = 0 untuk img dalam img_arr: new.paste (img, (w, h), img) w + = 1000 jika w == 8000: h + = 500 w = 0 i + = 1

Sekarang kita hanya membungkus ini dalam fungsi yang mengambil array gambar sebagai argumennya, dan mengembalikan gambar baru:

def stitch_beta (img_arr):

baru = Image.new ("RGBA", (8000, 4000), color = (0, 0, 0)) h = 0 w = 0 i = 0 untuk img dalam img_arr: new.paste (img, (w, h), img) w + = 1000 jika w == 8000: h + = 500 w = 0 i + = 1 kembali baru

Langkah 6: Skrip Python Penuh

Ini adalah skrip rangkaian saraf python penuh, yang disimpan sebagai net.py, dan diimport ke skrip utama:

# mengimport perpustakaan

import os #Fix untuk masalah semasa kereta api stepn oN GPU os.environ ['CUDA_VISIBLE_DEVICES'] = '' import tensorflow as tf if tf.test.gpu_device_name (): print ('GPU found') other: print ("No GPU found ") dari keras.preprocessing.image import ImageDataGenerator dari keras.preprocessing import image dari keras.models import Sequential dari keras.layers import Conv2D, MaxPooling2D dari keras.layers import Activation, Dropout, Flatten, Dense dari keras import backend sebagai K dari PIL import Imej gambar numpy sebagai 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 zaman = 10 batch_size = 8 jika_im: input_shape = (3, img_width, img_height) other: input_shape = (img_width, img_height, 3) model = Sequential () model.add (Conv2D (32, (2, 2), input_shape = input_shape)) model.add (Pengaktifan ('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 ()) 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', metrik = ['ketepatan']) model.load_weights ("model_saved.h5") def predict (image_path): img = image.load_img (image_path, target_size = (1000, 500)) img = np.expand_dims (img, axis = 0) result = model.predict_classes (img) hasil pengembalian [0] [0]

Ini adalah fail python utama, api.py:

permintaan import, sys, random, urllib.parse, cv2

dari PIL import Image, ImageFilter dari io import BytesIO import numpy as np import net def get_image_search (num, frasa): count = 0 img_arr = untuk arg dalam frasa: print (arg) print (f "Kiraan gambar semasa: {count } ") i = 0 params = {" q ": urllib.parse.quote (arg)," media_type ":" image "} hasil = permintaan.get (" https://images-api.nasa.gov/search ", params = params) data = [hasil ['href'] untuk hasil dalam hasil.json () [" koleksi "] [" item "] cetak (len (data)) jika num> len (data): num = len (data) semasa kiraan = num: rehat cetak (f "\ n {count} gambar diambil semula") kembali img_arr def stitch_beta (img_arr): new = Image.new ("RGBA", (8000, 4000), color = (0, 0, 0)) h = 0 w = 0 i = 0 untuk img dalam img_arr: # pbar.set_description (f "Memproses gambar {i + 1}") new.paste (img, (w, h), img) w + = 1000 jika w == 8000: h + = 500 w = 0 i + = 1 mengembalikan proses def baru Imej (img): RADIUS = 20 # Buka gambar im = Image.open ("pilbuffer.png") # Tampal gambar pada diameter latar belakang putih = 2 * RADIUS kembali = Image.new ('RGB', (im.size [0] + diam, im.size [1] + diam), (0, 0, 0)) back.paste (im, (RADIUS, RADIUS)) # Buat topeng kabur kabur = 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 gambar dan tampal tepi kabur mengikut mask blur = back.filter (ImageFilter. GaussianBlur (RADIUS / 2)) back.paste (blur, mask = mask) back.save ("transisi.png") back.close () #Ciptakan topeng dan penapis ganti hitam dengan alpha image = cv2.imread (" transit ion.png ") hMin = 0 sMin = 0 vMin = 20 hMax = 180 sMax = 255 vMax = 255 lebih rendah = np. array ([hMin, sMin, vMin]) atas = np. array ([hMax, sMax, vMax] hsv = cv2.cvtColor (image, cv2. COLOR_BGR2HSV) mask = cv2.inRange (hsv, lower, upper) output = cv2.bitwise_and (gambar, gambar, topeng = topeng) * _, alpha = cv2.split (output) dst = cv2.merge ((output, alpha)) output = dst dengan open ("buffer.png", "w +") sebagai file: lulus cv2.imwrite ("buffer.png", output) #Edge detection and blurring if _name_ == "_main_": search_terms = ["supernova", "planet", "galaxy", "milky way", "nebula", "stars"] # Istilah carian boleh diubah kepada apa sahaja yang anda mahu planetarium menyertakan img_arr = get_image_search (64, search_terms) print ("Images retrieved and neural filtered") img = stitch_beta (img_arr) print ("Images dijahit") img.save ("stitched.png")

Langkah 7: Aplikasi Elektron

Gambaran keseluruhan

Kami akan membuat aplikasi elektron sederhana yang hanya meletakkan dan memuat elemen PhotoSphere. Fail main.js dan package.json terus dari laman web Electron, dan HTML adalah versi HTML yang sedikit diubah suai yang disediakan di laman web PhotoSphere. Saya telah memasukkan fail, tetapi dinamakan semula menjadi.txt, kerana Instructables tidak membenarkan jenis fail ini. Untuk menggunakan fail, namakan semula dengan pelanjutan yang sesuai.

Kod tersebut

utama.js

const {app, BrowserWindow} = memerlukan ('elektron')

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

pakej.json

{

"name": "space", "version": "0.1.0", "main": "main.js", "scripts": {"start": "electron." }}

indeks.html

Langkah 8: Pelaksanaan

Membuat gambar sama sisi

Untuk membuat gambar, jalankan skrip api.py di command prompt, dengan persekitaran maya diaktifkan:

api.py

Setelah skrip selesai dijalankan, jalankan aplikasi elektron menggunakan:

npm bermulaVoila! Planetarium anda aktif! Terima kasih untuk membaca:)

Disyorkan: