Daftar Isi:

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

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

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

Dalam instruksi ini, saya akan menunjukkan kepada Anda bagaimana saya menulis generator planetarium 3D otomatis, menggunakan Python dan Electron

Video di atas menunjukkan salah satu planetarium acak yang dihasilkan program.

**Catatan: Program ini sama sekali tidak sempurna, dan di beberapa tempat tidak terlalu Pythonic. Diskriminator jaringan saraf hanya ~89% akurat, jadi beberapa gambar aneh akan berhasil masuk ke planetarium**

Spesifik

Planetarium meminta API NASA untuk gambar terkait ruang angkasa, dan menggunakan jaringan saraf convolutional untuk menentukan apakah gambar tersebut cocok untuk diproses. Program kemudian menggunakan OpenCV untuk menghapus latar belakang dari gambar, dan akhirnya gambar digabungkan menjadi satu gambar persegi panjang yang besar. Gambar ini kemudian disimpan, dan aplikasi Electron Node.js membuka gambar, dan menggunakan paket PhotoSphere.js untuk melihat gambar dalam format 3D gaya planetarium.

Ketergantungan

ular piton:

  • Keras
  • Bantal
  • cv2
  • lumpuh
  • Permintaan
  • urlib
  • Acak
  • waktu
  • io

Elektron:

FotoSphere

Langkah 1: Menyiapkan Lingkungan Anda

Memasang Elektron dan Python

Pertama, pastikan Anda telah menginstal node.js dan npm (jika belum, Anda dapat mengunduh di sini)

Selanjutnya, Anda perlu menginstal Electron. Buka prompt perintah, dan masukkan perintah berikut:

npm instal elektron -g

Selanjutnya, Anda membutuhkan python, yang dapat diunduh di sini

Menyiapkan Lingkungan Virtual

Buka prompt perintah, lalu masukkan perintah berikut untuk mengatur lingkungan virtual Anda:

pip install virtualenv

ruang virtualenv

ruang cd

skrip\aktifkan

Menginstal Ketergantungan Python

Jalankan perintah ini di command prompt untuk menginstal dependensi python Anda:

pip install keras

bantal pasang pip

pip install numpy

permintaan pemasangan pip

pip instal opencv-pythonJika Anda ingin melatih jaringan sendiri, pastikan untuk mengatur akselerasi GPU untuk Keras

Langkah 2: Meminta API Pencarian NASA

Gambaran

NASA memiliki banyak API yang sangat berguna yang dapat Anda gunakan dengan proyek Anda. Untuk proyek ini, kami akan menggunakan API pencarian, yang memungkinkan kami mencari database gambar NASA untuk gambar yang berhubungan dengan ruang angkasa.

Kode

Pertama, kita perlu mendefinisikan fungsi python untuk menerima argumen yang akan bertindak sebagai istilah pencarian:

def get_image_search(frasa):

lulus

Selanjutnya, kita akan mengonversi istilah penelusuran ke format URL, lalu menggunakan pustaka permintaan untuk mengkueri API:

def get_image_search(frasa):

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

Terakhir, kami akan mendekode string collection+JSON yang dikembalikan oleh API kepada kami, dan mengekstrak daftar tautan ke gambar yang terkait dengan istilah penelusuran:

def get_image_search(frasa):

params = {"q": urllib.parse.quote(arg), "media_type": "image"} results = request.get("https://images-api.nasa.gov/search", params=params) data = [result['href'] untuk hasil di results.json()["collection"]["items"]

Ini dia! Kami sekarang memiliki cuplikan kode yang dapat meminta API pencarian gambar NASA, dan mengembalikan daftar tautan ke gambar yang terkait dengan istilah pencarian kami.

Langkah 3: Jaringan Neural Convolutional

Gambaran

Tugas jaringan saraf adalah mengklasifikasikan apakah suatu gambar adalah sesuatu di luar angkasa, atau bukan. Untuk melakukan ini, kita akan menggunakan jaringan saraf convolutional, atau CNN, untuk melakukan serangkaian operasi matriks pada gambar, dan menentukan seberapa ruang-y itu. Saya tidak akan menjelaskan ini semua, karena ada banyak teori di baliknya, tetapi jika Anda ingin belajar tentang jaringan saraf, saya sarankan "Penguasaan Pembelajaran Mesin"

Kode

Pertama, kita perlu mengimpor dependensi kita:

impor os

#Perbaikan untuk masalah selama langkah kereta di GPU os.environ['CUDA_VISIBLE_DEVICES'] = '' import tensorflow as tf if tf.test.gpu_device_name(): print('GPU found') else: print("Tidak ditemukan GPU") dari keras.preprocessing.image impor ImageDataGenerator dari keras.preprocessing impor gambar dari keras.models impor Berurutan dari keras.layers impor Conv2D, MaxPooling2D dari keras.layers impor Aktivasi, Dropout, Flatten, Padat dari keras import backend sebagai K dari PIL impor Gambar impor numpy sebagai np

Selanjutnya kita perlu mendefinisikan model kita:

img_lebar, img_tinggi = 1000, 500

train_data_dir = 'v_data/train' validation_data_dir = 'v_data/test' nb_train_samples = 203 nb_validation_samples = 203 epoch = 10 batch_size = 8 jika K.image_data_format() == 'channels_first': input_shape = (3, img_height), img_height) = (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 (loss='binary_crossentropy', pengoptimal='rmsprop', metrics=['akurasi'])

Saya telah melatih modelnya untuk Anda, tetapi jika Anda ingin melatih model itu sendiri, pada dataset Anda sendiri, maka saya telah melampirkan kode pelatihannya. Jika tidak, Anda dapat mengunduh file HDF5 model terlatih. Karena batasan file Instructables, saya harus mengganti namanya dengan ekstensi ".txt". Untuk menggunakannya, ganti nama file menjadi ekstensi ".h5", dan muat dengan kode ini:

model.load_weights("model_saved.h5")

Untuk menggunakan jaringan untuk memprediksi seberapa besar ruang-y suatu gambar, kita akan mendefinisikan fungsi ini:

def memprediksi (jalur_gambar):

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

Langkah 4: Memproses Gambar

Gambaran

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

Kode

Ini adalah bagian dari fungsi yang mengaburkan tepi:

def prosesGambar(img):

RADIUS = 20 # Buka gambar im = Image.open("pilbuffer.png") # Tempel 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 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 gambar dan paste tepi kabur sesuai dengan mask blur = back.filter(ImageFilter. GaussianBlur(RADIUS / 2)) back.paste(blur, mask=mask) back.save(" transisi.png") kembali.tutup()

Selanjutnya, kita akan mengatur warna yang lebih gelap menjadi transparan, dan menyimpan gambar untuk sementara:

#Buat topeng dan filter ganti hitam dengan alfa

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

Langkah 5: Menyatukan Gambar Menjadi Proyeksi Segi Empat

Gambaran

Fungsi ini mengambil banyak gambar dan menggabungkannya ke dalam format yang dapat diinterpretasikan oleh paket PhotoSphere.js, menggunakan pustaka PIL (bantal)

Kode

Pertama, kita perlu membuat gambar yang dapat bertindak sebagai host untuk gambar lainnya:

baru = Gambar.baru("RGBA", (8000, 4000), warna=(0, 0, 0))

Selanjutnya, kita perlu mengulangi array gambar (yang semuanya telah diubah ukurannya menjadi 1000x500) dan menempatkannya ke dalam gambar:

h = 0

w = 0 i = 0 untuk img di 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 di img_arr: new.paste(img, (w, h), img) w += 1000 jika w == 8000: j += 500 w = 0 i += 1 kembali baru

Langkah 6: Skrip Python Lengkap

Ini adalah skrip jaringan saraf python lengkap, yang disimpan sebagai net.py, dan diimpor ke skrip utama:

# mengimpor perpustakaan

import os #Perbaiki untuk masalah selama langkah kereta di GPU os.environ['CUDA_VISIBLE_DEVICES'] = '' import tensorflow as tf if tf.test.gpu_device_name(): print('GPU found') else: print("Tidak ada GPU yang ditemukan ") dari keras.preprocessing.image import ImageDataGenerator dari keras.preprocessing mengimpor gambar dari keras.models mengimpor Berurutan dari keras.layers mengimpor Conv2D, MaxPooling2D dari keras.layers mengimpor Aktivasi, Dropout, Flatten, Padat dari keras import backend sebagai K dari PIL import Image import numpy as 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 epoch = 10 batch_size = 8 jika K.image_data_channels(): input_shape = (3, img_width, img_height) else: input_shape = (img_width, img_height, 3) model = Sequential() model.add(Conv2D(32, (2, 2), input_shape=input_shape)) model.add(Aktivasi ('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', metrics=['accuracy']) 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) mengembalikan hasil [0][0]

Ini adalah file python utama, api.py:

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

from PIL import Image, ImageFilter from io import BytesIO import numpy as np import net def get_image_search(num, phrase): count = 0 img_arr = for arg in phrase: print(arg) print(f"Current image count: {count }") i = 0 params = {"q": urllib.parse.quote(arg), "media_type": "image"} results = request.get("https://images-api.nasa.gov/search ", params=params) data = [result['href'] untuk hasil di hasil.json()["collection"]["items"] print(len(data)) if num > len(data): num = len(data) sambil menghitung = num: break print(f"\n{count} gambar diambil") return 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 di 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 kembalikan proses def baruImage(img): RADIUS = 20 # Buka gambar im = Image.open("pilbuffer.png") # Tempel gambar pada diam latar putih = 2 * RADIUS kembali = Image.new('RGB', (im.size[0] + diam, im.size[1] + diam), (0, 0, 0)) back.paste(im, (RADIUS), RADIUS)) # Buat 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 gambar dan tempel tepi buram sesuai mask blur = back.filter(ImageFilter. GaussianBlur(RADIUS / 2)) back.paste(blur, mask=mask) back.save("transition.png") back.close() #Buat mask dan filter ganti hitam dengan alpha image = cv2.imread(" transit ion.png") hMin = 0 sMin = 0 vMin = 20 hMax = 180 sMax = 255 vMax = 255 lower = np.array([hMin, sMin, vMin]) upper = np.array([hMax, sMax, vMax]) hsv = cv2.cvtColor(image, cv2. COLOR_BGR2HSV) mask = cv2.inRange(hsv, lower, upper) output = cv2.bitwise_and(image, image, mask=mask) *_, alpha = cv2.split(output) dst = cv2.merge((output, alpha)) output = dst dengan open("buffer.png", "w+") sebagai file: lulus cv2.imwrite("buffer.png", output) #Deteksi tepi dan pengaburan jika _name_ == "_main_": search_terms = ["supernova", "planet", "galaxy", "milky way", "nebula", "stars"] #Istilah pencarian dapat diubah menjadi apa pun yang Anda inginkan untuk disertakan oleh planetarium img_arr = get_image_search(64, search_terms) print("Gambar diambil dan difilter saraf") img = stitch_beta(img_arr) print("Gambar dijahit") img.save("stitched.png")

Langkah 7: Aplikasi Elektron

Gambaran

Kami akan membuat aplikasi elektron sederhana yang hanya memposisikan dan memuat elemen PhotoSphere. File main.js dan package.json langsung dari situs web Electron, dan HTML adalah versi sedikit modifikasi dari HTML yang disediakan di situs web PhotoSphere. Saya telah menyertakan file, tetapi mengganti nama semua menjadi.txt, karena Instructables tidak mengizinkan jenis file ini. Untuk menggunakan file, ganti namanya dengan ekstensi yang sesuai.

Kode

main.js

const { aplikasi, BrowserWindow } = membutuhkan('elektron')

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

package.json

{

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

index.html

Langkah 8: Eksekusi

Membuat gambar persegi panjang

Untuk membuat gambar, jalankan skrip api.py di command prompt, dengan lingkungan virtualnya diaktifkan:

api.py

Setelah skrip selesai dieksekusi, jalankan aplikasi elektron menggunakan:

npm mulaiVoila! Planetarium Anda aktif! Terima kasih sudah membaca:)

Direkomendasikan: