Isi kandungan:
- Langkah 1: Menyiapkan Persekitaran Anda
- Langkah 2: Menanya API Carian NASA
- Langkah 3: Rangkaian Neural Konvolusional
- Langkah 4: Memproses Imej
- Langkah 5: Menjahit Imej Bersama Menjadi Unjuran Persamaan
- Langkah 6: Skrip Python Penuh
- Langkah 7: Aplikasi Elektron
- Langkah 8: Pelaksanaan
Video: Planetarium Bertenaga Rangkaian Neural Menggunakan Python, Elektron, dan Keras: 8 Langkah
2024 Pengarang: John Day | [email protected]. Diubah suai terakhir: 2024-01-30 11:08
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
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:
Penghantaran Data NBIoT Cara Menggunakan Perisai Berasaskan Modem BC95G - UDP UDP dan Isyarat Status Rangkaian: 4 Langkah
Penghantaran Data NBIoT Cara Menggunakan Perisai Berasaskan Modem BC95G - UDP UDP dan Isyarat Status Rangkaian: Mengenai projek ini: Uji kemampuan rangkaian NB IoT dan penghantaran data UDP mentah menggunakan xyz-mIoT oleh perisai itbrainpower.net dilengkapi dengan modem Quectel BC95G. Masa yang diperlukan: 10-15 minit. Kesukaran: pertengahan.Remarque: kemahiran menyolder diperlukan
Memantau Pecutan Menggunakan Raspberry Pi dan AIS328DQTR Menggunakan Python: 6 Langkah
Memantau Pecutan Menggunakan Raspberry Pi dan AIS328DQTR Menggunakan Python: Pecutan adalah terhad, saya rasa menurut beberapa undang-undang Fizik.- Terry Riley A cheetah menggunakan percepatan yang luar biasa dan perubahan kecepatan yang cepat ketika mengejar. Makhluk tercepat di darat sekali-sekala menggunakan langkah teratas untuk menangkap mangsa
Adakah Itu Tangan? (Kamera Raspberry Pi + Rangkaian Neural) Bahagian 1/2: 16 Langkah (dengan Gambar)
Adakah Itu Tangan? (Kamera Raspberry Pi + Rangkaian Neural) Bahagian 1/2: Beberapa hari yang lalu, saya mencederakan pergelangan tangan kanan saya di gim. Selepas itu setiap kali saya menggunakan tetikus komputer, ia menyebabkan banyak kesakitan kerana sudut pergelangan tangan yang curam. Ketika itulah saya memukul " bukankah lebih baik jika kita dapat menukar permukaan ke trek
Robot Rangkaian Neural Arduino: 21 Langkah (dengan Gambar)
Arduino Neural Network Robot: Instruksional ini didasarkan pada siri 3 Bahagian yang saya buat untuk Saluran YouTube Make yang menunjukkan kepada anda bagaimana cara membuat prototaip, reka bentuk, pemasangan, dan program, robot rangkaian saraf Arduino anda sendiri. Setelah menonton siri penuh, anda semestinya mempunyai pertaruhan
Membaiki Masalah Perisian Keras Komputer Asas (Kegagalan Cakera sistem dan PSU Pecah dan Fail Hilang / rosak): 4 Langkah
Membaiki Masalah Perisian Keras Komputer Asas (Kegagalan Cakera sistem dan PSU Pecah dan Fail yang Hilang / rosak): PANDUAN INI TIDAK AKAN SELESAI, SAYA AKAN MENAMBAH MAKLUMAT LANJUT KETIKA SAYA MENDAPAT Peluang. Sekiranya anda memerlukan pertolongan untuk memperbaiki komputer atau jika anda mempunyai sebarang pertanyaan untuk menghantar mesej kepada saya " Dalam arahan ini, saya akan memberitahu anda bagaimana membaiki asas