İçindekiler:
2025 Yazar: John Day | [email protected]. Son düzenleme: 2025-01-23 15:13
Bu talimatta size Python ve Electron kullanarak otomatik bir 3D planetaryum üretecini nasıl yazdığımı göstereceğim
Yukarıdaki video, programın oluşturduğu rastgele planetaryumlardan birini göstermektedir.
**Not: Bu program hiçbir şekilde mükemmel değildir ve bazı yerlerde çok pitonik değildir. Nöral net ayırıcı yalnızca ~%89 doğrudur, bu nedenle bazı garip görüntüler onu planetaryuma getirecektir**
Özellikler
Planetaryum, uzayla ilgili görüntüler için bir NASA API'sini sorgular ve görüntünün işlemeye uygun olup olmadığını belirlemek için bir evrişimsel sinir ağı kullanır. Program daha sonra görüntüden arka planı kaldırmak için OpenCV'yi kullanır ve son olarak görüntüler tek bir büyük eşkenar dörtgen görüntüde birleştirilir. Bu görüntü daha sonra kaydedilir ve bir Electron Node.js uygulaması görüntüyü açar ve görüntüyü planetaryum stili 3D formatında görüntülemek için PhotoSphere.js paketini kullanır.
bağımlılıklar
Python:
- Keras
- Yastık
- özgeçmiş2
- Dizi
- İstekler
- urllib
- Rastgele
- zaman
- io
Elektron:
Fotoğraf Küresi
1. Adım: Ortamınızı Ayarlama
Elektron ve Python Kurulumu
Öncelikle, node.js ve npm'nin kurulu olduğundan emin olun (değilse buradan indirebilirsiniz)
Ardından, Electron'u yüklemeniz gerekir. Bir komut istemi açın ve aşağıdaki komutu girin:
npm elektron -g yükleyin
Ardından, buradan indirilebilen python'a ihtiyacınız var.
Sanal Ortam Kurma
Bir komut istemi açın, ardından sanal ortamınızı kurmak için aşağıdaki komutları girin:
pip sanalenv yükleyin
sanalenv alanı
cd alanı
komut dosyaları\etkinleştir
Python Bağımlılıklarını Yükleme
Python bağımlılıklarınızı yüklemek için komut isteminde bu komutları çalıştırın:
pip kurulum keraları
pip yükleme yastığı
pip kurulum numpy
pip yükleme istekleri
pip kurulumu opencv-pythonAğı kendiniz eğitmek istiyorsanız, Keras için GPU hızlandırmayı ayarladığınızdan emin olun.
2. Adım: NASA Arama API'sini Sorgulama
genel bakış
NASA'nın projelerinizde kullanabileceğiniz çok sayıda gerçekten faydalı API'si vardır. Bu proje için, uzayla ilgili görüntüler için NASA'nın görüntü veritabanında arama yapmamızı sağlayan arama API'sini kullanacağız.
kod
İlk olarak, arama terimi olarak işlev görecek bir argümanı kabul etmek için bir python işlevi tanımlamamız gerekiyor:
def get_image_search(ifade):
geçmek
Ardından, arama terimini URL biçimine dönüştüreceğiz, ardından API'yi sorgulamak için istek kitaplığını kullanacağız:
def get_image_search(ifade):
params = {"q": urllib.parse.quote(arg), "media_type": "image"} sonuçlar = request.get("https://images-api.nasa.gov/search", params=params)
Son olarak, API'nin bize döndürdüğü koleksiyon+JSON dizesinin kodunu çözeceğiz ve arama terimiyle ilgili resimlere bağlantıların bir listesini çıkaracağız:
def get_image_search(ifade):
params = {"q": urllib.parse.quote(arg), "media_type": "image"} sonuçlar = request.get("https://images-api.nasa.gov/search", params=params) data = [result['href'] için sonuç.json()["collection"]["items"]
Oraya gidiyoruz! Artık NASA görsel arama API'sini sorgulayabilen ve arama terimimizle ilgili görsellere bağlantıların bir listesini döndürebilen bir kod parçacığımız var.
Adım 3: Evrişimsel Sinir Ağı
genel bakış
Sinir ağının işi, bir görüntünün uzayda bir şeye ait olup olmadığını veya olmadığını sınıflandırmaktır. Bunu yapmak için, görüntü üzerinde bir dizi matris işlemi gerçekleştirmek ve bunun ne kadar uzay-y olduğunu belirlemek için bir evrişimsel sinir ağı veya CNN kullanacağız. Bunların hepsini açıklamayacağım çünkü arkasında çok fazla teori var ama sinir ağları hakkında bilgi edinmek istiyorsanız "Makine Öğrenimi Ustalığı"nı öneririm.
kod
İlk olarak, bağımlılıklarımızı içe aktarmamız gerekiyor:
işletim sistemini içe aktar
#Tren sırasındaki sorun için düzeltme GPU os.environ['CUDA_VISIBLE_DEVICES'] = '' tensorflow'u tf olarak içe aktar if tf.test.gpu_device_name(): print('GPU bulundu') else: print("GPU bulunamadı") keras.preprocessing.image'den keras.preprocessing'den ImageDataGenerator'ı içe aktar keras.models'den görüntüyü içe aktar keras.layers'dan sıralı içe aktar Conv2D, keras.layers'dan MaxPooling2D içe aktar Keras'tan Aktivasyon, Bırakma, Düzleştir, Yoğun keras'tan PIL'den K olarak içe aktar Görüntü içe aktar numpy'yi np olarak içe aktar
Ardından modelimizi tanımlamamız gerekiyor:
img_width, img_height = 1000, 500
train_data_dir = 'v_data/tren' validation_data_dir = 'v_data/test' nb_train_samples = 203 nb_validation_samples = 203 dönem = 10 toplu iş_boyutu = 8 if K.image_data_format() == 'kanallar_ilk', girdi_shape = başka giriş_şekli_ = (img_width, img_height, 3) model = Sıralı() 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()) modeli. 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=['doğruluk'])
Modeli sizin için eğittim, ancak modeli kendi veri kümeniz üzerinde kendiniz eğitmek isterseniz, eğitim kodunu ekledim. Aksi takdirde, eğitilen modelin HDF5 dosyasını indirebilirsiniz. Instructables dosya kısıtlamaları nedeniyle, onu ".txt" uzantısıyla yeniden adlandırmak zorunda kaldım. Kullanmak için dosyayı ".h5" uzantısıyla yeniden adlandırın ve şu kodla yükleyin:
model.load_weights("model_saved.h5")
Bir görüntünün ne kadar uzay-y olduğunu tahmin etmek için ağı kullanmak için bu işlevi tanımlayacağız:
def tahmin(image_path):
img = image.load_img(image_path, target_size=(1000, 500)) img = np.expand_dims(img, axis=0) sonuç=model.predict_classes(img) sonucu döndür[0][0]
Adım 4: Görüntünün İşlenmesi
genel bakış
Görüntü işleme için OpenCV (cv2) kitaplığını kullanıyorum. Önce görüntünün kenarlarını bulanıklaştıracağız, ardından bir maske oluşturarak ve koyu renklerin alfa değerlerini değiştirerek arka planı kaldıracağız.
kod
Bu, işlevin kenarları bulanıklaştıran kısmıdır:
def processImage(img):
RADIUS = 20 # Bir resim aç im = Image.open("pilbuffer.png") # Resmi beyaz arka plana yapıştır diam = 2 * RADIUS back = Image.new('RGB', (im.size[0] + diam, im.size[1] + diam), (0, 0, 0)) back.paste(im, (RADIUS, RADIUS)) # Bulanıklaştırma maskesi oluştur = Image.new('L', (im.size[0] + çap, im.size[1] + çap), 255) blck = Image.new('L', (im.size[0] - çap, im.size[1] - çap), 0) maske. paste(blck, (diam, diam)) # Resmi bulanıklaştırın ve bulanık kenarı maskeye göre yapıştırın blur = back.filter(ImageFilter. GaussianBlur(RADIUS / 2)) back.paste(blur, mask=mask) back.save(" geçiş.png") back.close()
Ardından, koyu renkleri saydam olarak ayarlayacağız ve görüntüyü geçici olarak kaydedeceğiz:
#Maske ve filtre oluştur siyahı alfa ile değiştir
image = cv2.imread("transition.png") hMin = 0 sMin = 0 vMin = 20 hMax = 180 sMax = 255 vMax = 255 alt=np.array([hMin, sMin, vMin]) üst = np.array([hMax, sMax, vMax]) hsv = cv2.cvtColor(image, cv2. COLOR_BGR2HSV) mask = cv2.inRange(hsv, alt, üst) çıktı = cv2.bitwise_and(image, image, mask=mask) *_, alpha = cv2.split(çıktı) dst = cv2.merge((çıktı, alfa)) çıktı = dst dosya olarak open("buffer.png", "w+") ile: pass cv2.imwrite("buffer.png", çıktı)
Adım 5: Görüntüleri Eşkenar Dörtgen Bir Projeksiyonda Birleştirme
genel bakış
Bu işlev, birden fazla görüntü alır ve bunları PIL (yastık) kitaplığını kullanarak PhotoSphere.js paketi tarafından yorumlanabilecek bir biçimde birleştirir.
kod
İlk olarak, diğer görüntüler için ana bilgisayar görevi görebilecek bir görüntü oluşturmamız gerekiyor:
yeni = Image.new("RGBA", (8000, 4000), renk=(0, 0, 0))
Ardından, (hepsi 1000x500 olarak yeniden boyutlandırılmış) görüntü dizisini yinelememiz ve bunları görüntüye yerleştirmemiz gerekiyor:
h = 0
w = 0 i = 0 img_arr'de img için: new.paste(img, (w, h), img) w += 1000 w == 8000: h += 500 w = 0 i += 1
Şimdi bunu, argümanı olarak bir dizi görüntüyü alan ve yeni görüntüyü döndüren bir fonksiyonda tamamlıyoruz:
def dikiş_beta(img_arr):
new = Image.new("RGBA", (8000, 4000), color=(0, 0, 0))) h = 0 w = 0 i = 0 img_arr'da img için: new.paste(img, (w, h), img) w += 1000 w == 8000 ise: h += 500 w = 0 i += 1 yeni dön
6. Adım: Tam Python Komut Dosyası
Bu, net.py olarak kaydedilen ve ana komut dosyasına aktarılan tam python sinir ağı komut dosyasıdır:
# kitaplıkları içe aktarma
import os #Tren sırasında sorun için düzeltme GPU'da adım os.environ['CUDA_VISIBLE_DEVICES'] = '' tensorflow'u tf olarak içe aktar if tf.test.gpu_device_name(): print('GPU bulundu') else: print("GPU bulunamadı ") keras.preprocessing.image'den içe aktar keras.preprocessing'den ImageDataGenerator'ı içe aktar keras.models'den görüntüyü içe aktar içe aktar Keras.layers'dan sıralı içe aktar Conv2D, keras'tan MaxPooling2D'yi içe aktar Keras'tan içe aktar Aktivasyon, Bırakma, Düzleştir, Yoğun keras'tan PIL'den K olarak içe aktar İmaj numpy'yi np olarak içe aktar 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 = 8 ' ' ': input_shape = (3, img_width, img_height) başka: input_shape = (img_width, img_height, 3) model = Sequential() model.add(Conv2D(32, (2, 2), input_shape=input_shape)) model.add(Etkinleştirme) ('relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Conv2D(32, (2, 2))) modeli. 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=['doğruluk']) model.load_weights("model_saved.h5") def tahmin(image_path): img = image.load_img(image_path, target_size=(1000, 500)) img = np.expand_dims(img, axis=0) sonuç=model.predict_classes(img) sonuç döndür [0][0]
Bu ana python dosyasıdır, api.py:
içe aktarma istekleri, sys, rastgele, urllib.parse, cv2
PIL'den import Image, ImageFilter from io import BytesIO import numpy as np import net def get_image_search(sayı, ifade): count = 0 img_arr = for arg in ifade: print(arg) print(f"Mevcut resim sayısı: {count }") i = 0 paragraf = {"q": urllib.parse.quote(arg), "media_type": "image"} sonuçlar = request.get("https://images-api.nasa.gov/search ", params=params) data = [result['href'] için sonuç.json()["collection"]["items"] print(len(data)) if num > len(data): num = len(veri) sayarken
7. Adım: Elektron Uygulaması
genel bakış
PhotoSphere öğesini konumlandıran ve yükleyen basit bir elektron uygulaması oluşturacağız. main.js ve package.json dosyaları doğrudan Electron web sitesindendir ve HTML, PhotoSphere web sitesinde sağlanan HTML'nin biraz değiştirilmiş bir sürümüdür. Dosyaları ekledim, ancak Instructables bu dosya türlerine izin vermediğinden tümünü.txt olarak yeniden adlandırdım. Dosyaları kullanmak için uygun uzantıyla yeniden adlandırın.
kod
ana.js
const {app, BrowserWindow } = require('elektron')
function createWindow () { const win = new BrowserWindow({ genişlik: 800, yükseklik: 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() } })
paket.json
{
"name": "boşluk", "sürüm": "0.1.0", "ana": "main.js", "komut dosyaları": { "başlangıç": "elektron." } }
index.html
8. Adım: Yürütme
Eşkenar dörtgen görüntü oluşturma
Görüntüyü oluşturmak için, sanal ortamı etkin durumdayken komut isteminde api.py betiğini çalıştırın:
api.py
Komut dosyalarının yürütülmesi tamamlandıktan sonra elektron uygulamasını aşağıdakileri kullanarak çalıştırın:
npm başlangıçİşte! Planetaryum aktif! okuduğunuz için teşekkürler:)
Önerilen:
Manyetik Jeodezik Planetaryum: 7 Adım (Resimlerle)
Manyetik Jeodezik Planetaryum: Herkese merhaba! Mıknatıslar ve işçilik telleriyle tutturulmuş jeodezik bir planetaryum yaratma sürecimde size yol göstermek istiyorum! Bu mıknatısların kullanılmasının nedeni, yağmurlu veya ideal hava koşullarından daha az olan zamanlarda kolayca çıkarılabilmesi içindir. Bu şekilde y
Bluetooth Özellikli Planetaryum/Orrery: 13 Adım (Resimlerle)
Bluetooth Etkin Planetaryum/Orrery: Bu talimat, Güney Florida Üniversitesi'ndeki (www.makecourse.com) Makecourse'un proje gereksinimini yerine getirmek için oluşturuldu. Bu benim 3 gezegenli planetaryum/orrery'm. Makecour için sadece sömestrlik bir proje olarak başladı
Bu bir El mi? (Raspberry Pi Kamera + Sinir Ağı) Kısım 1/2: 16 Adım (Resimli)
Bu bir El mi? (Raspberry Pi Kamera + Sinir Ağı) Bölüm 1/2: Birkaç gün önce spor salonunda sağ bileğimi incittim. Daha sonra bilgisayar faremi her kullandığımda, dik bilek açısı nedeniyle çok fazla acıya neden oldu. İşte o zaman bana çarptı "herhangi bir yüzeyi trackp'e dönüştürebilsek harika olmaz mıydı
Ses Aktif Planetaryum: 8 Adım (Resimlerle)
Sesle Etkinleştirilen Planetaryum: Bu talimat, Güney Florida Üniversitesi'ndeki (www.makecourse.com) Makecourse'un proje gereksinimini yerine getirmek için oluşturuldu. Bu benim sesle etkinleştirilen planetaryum. Planetaryumun temel işlevi,
Arduino Sinir Ağı Robotu: 21 Adım (Resimlerle)
Arduino Sinir Ağı Robotu: Bu talimat, kendi Arduino sinir ağı robotunuzu tam olarak nasıl prototipleyeceğinizi, tasarlayacağınızı, birleştireceğinizi ve programlayacağınızı gösteren Make YouTube Kanalı için yaptığım 3 Bölümlük bir seriye dayanmaktadır. Tüm seriyi izledikten sonra, bir bahis almalısınız