Daftar Isi:
- Langkah 1: Menyiapkan Lingkungan Anda
- Langkah 2: Meminta API Pencarian NASA
- Langkah 3: Jaringan Neural Convolutional
- Langkah 4: Memproses Gambar
- Langkah 5: Menyatukan Gambar Menjadi Proyeksi Segi Empat
- Langkah 6: Skrip Python Lengkap
- Langkah 7: Aplikasi Elektron
- Langkah 8: Eksekusi
Video: Planetarium Bertenaga Neural Network Menggunakan Python, Elektron, dan Keras: 8 Langkah
2024 Pengarang: John Day | [email protected]. Terakhir diubah: 2024-01-30 09:54
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
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:
Text to Speech Klik pada UChip Bertenaga ARMbasic, dan SBC Bertenaga ARMbasic Lainnya: 3 Langkah
Text to Speech Klik pada UChip Bertenaga ARMbasic, dan SBC Bertenaga ARMbasic Lainnya: Intro: Selamat siang. Nama saya Tod. Saya seorang profesional kedirgantaraan dan pertahanan yang juga sedikit geek di hati.Inspirasi: Berasal dari era BBS dial-up, Mikrokontroler 8-bit, komputer pribadi Kaypro/Commodore/Tandy/TI-994A, ketika R
Cara Membuat Anemometer Sendiri Menggunakan Reed Switch, Sensor Efek Hall, dan Beberapa Memo di Nodemcu. - Bagian 1 - Perangkat Keras: 8 Langkah (dengan Gambar)
Cara Membuat Anemometer Sendiri Menggunakan Reed Switch, Sensor Efek Hall, dan Beberapa Memo di Nodemcu. - Bagian 1 - Perangkat Keras: Pengantar Sejak saya mulai mempelajari Arduino dan Budaya Pembuat, saya suka membuat perangkat yang berguna menggunakan barang bekas dan bekas seperti tutup botol, potongan PVC, kaleng minuman, dll. hidup untuk bagian apa pun atau pasangan apa pun
Apakah Itu Tangan? (Kamera Raspberry Pi + Neural Network) Bagian 1/2: 16 Langkah (dengan Gambar)
Apakah Itu Tangan? (Kamera Raspberry Pi + Neural Network) Bagian 1/2: Beberapa hari yang lalu, pergelangan tangan kanan saya cedera di gym. Setelah itu setiap kali saya menggunakan mouse komputer saya, itu menyebabkan banyak rasa sakit karena sudut pergelangan tangan yang curam. Saat itulah saya tersadar "bukankah lebih bagus jika kita bisa mengubah permukaan apa pun menjadi trackp
Jam Linear Menggunakan Arduino + DS1307 + Neopixel: Menggunakan Kembali Beberapa Perangkat Keras.: 5 Langkah
Jam Linear Menggunakan Arduino + DS1307 + Neopixel: Menggunakan Kembali Beberapa Perangkat Keras.: Dari proyek sebelumnya saya memiliki Arduino UNO dan strip LED Neopixel yang tersisa, dan ingin membuat sesuatu yang berbeda. Karena strip Neopixel memiliki 60 lampu LED, diperkirakan menggunakannya sebagai jam besar. Untuk menunjukkan Jam, digunakan segmen 5-LED merah (60 LED
Speaker Super Portabel, Super Keras, Tahan Lama, Bertenaga Baterai: 9 Langkah (dengan Gambar)
Speaker Super Portabel, Super Keras, Tahan Lama, Bertenaga Baterai: selalu ingin memiliki sistem speaker yang kuat untuk pesta kebun / rave lapangan langsung. banyak yang akan mengatakan ini adalah instruksi yang berlebihan, karena ada banyak radio gaya boombox dari masa lalu yang tersedia dengan harga murah, atau mp3 gaya ipod murah ini