İçindekiler:

Python, Electron ve Keras Kullanan Sinir Ağı Destekli Planetaryum: 8 Adım
Python, Electron ve Keras Kullanan Sinir Ağı Destekli Planetaryum: 8 Adım

Video: Python, Electron ve Keras Kullanan Sinir Ağı Destekli Planetaryum: 8 Adım

Video: Python, Electron ve Keras Kullanan Sinir Ağı Destekli Planetaryum: 8 Adım
Video: Gregory Chaitin: Karmaşıklık, Metabiyoloji, Gödel, Soğuk Füzyon 2024, Temmuz
Anonim
Python, Electron ve Keras Kullanan Sinir Ağı Destekli Planetaryum
Python, Electron ve Keras Kullanan Sinir Ağı Destekli Planetaryum

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 = num: break print(f"\n{count} görüntü alındı") return img_arr def dikiş_beta(img_arr): yeni = Image.new("RGBA", (8000, 4000), color=(0, 0, 0)) h = 0 w = 0 i = 0 img_arr içindeki img için: #pbar.set_description(f"Görüntü işleniyor {i+1}") new.paste(img, (w, h), img) w += 1000 if w == 8000: h += 500 w = 0 i += 1 yeni def processImage(img): RADIUS = 20 # Bir resim aç im = Image.open("pilbuffer.png") # Resmi beyaz arka plan çapına yapıştır = 2 * RADIUS arka = Image.new('RGB', (im.size[0] + çap, im.size[1] + çap), (0, 0, 0) geri.paste(im, (RADIUS), RADIUS)) # Bulanıklaştırma maskesi oluştur = 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)) # Görüntüyü bulanıklaştırın ve bulanık kenarı maske bulanıklığına göre yapıştırın = back.filter(ImageFilter. GaussianBlur(RADIUS / 2)) back.paste(blur, mask=mask) back.save("transition.png") back.close() #Create mask ve filtre siyahı alpha image ile değiştirin = cv2.imread(" taşıma ion.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((output, alpha)) çıktı = dosya olarak open("buffer.png", "w+") ile dst: pass cv2.imwrite("buffer.png", çıktı) #Kenar algılama ve bulanıklaştırma eğer _name_ == "_main_": search_terms = ["süpernova", "gezegen", "galaksi", "samanyolu", "nebula", "yıldızlar"] #Arama terimleri, planetaryumun içermesini istediğiniz şekilde değiştirilebilir img_arr = get_image_search(64, search_terms) print("Görüntüler alındı ve sinirsel filtre uygulandı") img = dikiş_beta(img_arr) print("Görüntüler dikildi") img.save("stitched.png")

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: