Mündəricat:

Python, Electron və Keras istifadə edərək Sinir Şəbəkəsi ilə Güclü Planetarium: 8 Addım
Python, Electron və Keras istifadə edərək Sinir Şəbəkəsi ilə Güclü Planetarium: 8 Addım

Video: Python, Electron və Keras istifadə edərək Sinir Şəbəkəsi ilə Güclü Planetarium: 8 Addım

Video: Python, Electron və Keras istifadə edərək Sinir Şəbəkəsi ilə Güclü Planetarium: 8 Addım
Video: Как сделать легкую цементную стяжку в старом доме. ПЕРЕДЕЛКА ХРУЩЕВКИ ОТ А до Я #12 2024, Iyul
Anonim
Python, Electron və Keras istifadə edərək Sinir Şəbəkəsi Güclü Planetarium
Python, Electron və Keras istifadə edərək Sinir Şəbəkəsi Güclü Planetarium

Bu təlimat kitabında sizə Python və Electrondan istifadə edərək avtomatik olaraq 3D planetariyum generatorunu necə yazdığımı göstərəcəyəm

Yuxarıdakı video proqramın yaratdığı təsadüfi planetariyalardan birini göstərir.

** Qeyd: Bu proqram heç bir şəkildə mükəmməl deyil və bəzi yerlərdə çox pythonic deyil. Sinir şəbəkəsi fərqləndiricisi yalnız ~ 89% dəqiqdir, buna görə bəzi qəribə şəkillər planetariyuma daxil olacaq **

Xüsusiyyətlər

Planetarium, kosmosla əlaqəli görüntülər üçün bir NASA API sorğusu göndərir və görüntünün işlənməyə uyğun olub olmadığını müəyyən etmək üçün konvulsion sinir şəbəkəsindən istifadə edir. Proqram, görüntünün arxa planını silmək üçün OpenCV istifadə edir və nəhayət, şəkillər bir böyük bərabər düzbucaqlı şəklə birləşdirilir. Bu görüntü daha sonra saxlanılır və bir Electron Node.js tətbiqi görüntüyü açır və PhotoSphere.js paketindən istifadə edərək görüntüyə planetar stil 3D formatında baxmaq imkanı verir.

Asılılıqlar

Python:

  • Keras
  • Yastıq
  • cv2
  • Çılğın
  • İstək
  • urllib
  • Təsadüfi
  • vaxt
  • io

Elektron:

PhotoSphere

Addım 1: Ətrafınızı qurun

Electron və Python quraşdırılması

Əvvəlcə node.js və npm yüklü olduğundan əmin olun (yoxsa buradan yükləyə bilərsiniz)

Sonra, Electron qurmalısınız. Əmr əmrini açın və aşağıdakı əmri daxil edin:

npm elektron -g qurun

Sonra buradan yükləyə biləcəyiniz pythona ehtiyacınız var

Virtual mühitin qurulması

Bir əmr istəyi açın, sonra virtual mühitinizi qurmaq üçün aşağıdakı əmrləri daxil edin:

pip virtualenv quraşdırın

virtual məkan

cd boşluğu

scripts / activate

Python asılılıqlarının quraşdırılması

Python asılılıqlarınızı qurmaq üçün əmr satırında bu əmrləri işlədin:

pip keras quraşdırın

yastığı quraşdırın

pip qurmaq numpy

pip quraşdırma tələbləri

opencv-python quraşdırınŞəbəkəni özünüz öyrətmək istəyirsinizsə, Keras üçün GPU sürətləndirməsini qurduğunuzdan əmin olun

Addım 2: NASA Axtarış API -nin sorğusu

Baxış

NASA, layihələrinizdə istifadə edə biləcəyiniz çox faydalı API -lərə malikdir. Bu layihə üçün kosmosla əlaqəli şəkillər üçün NASA-nın görüntü verilənlər bazasını axtarmağa imkan verən axtarış API-dən istifadə edəcəyik.

Kod

Birincisi, axtarış sözü kimi çıxış edəcək bir arqumenti qəbul etmək üçün bir python funksiyası təyin etməliyik:

def get_image_search (ifadə):

keçmək

Sonra, axtarış müddətini URL formatına çevirəcəyik, sonra API -ni sorğu etmək üçün sorğu kitabxanasından istifadə edəcəyik:

def get_image_search (ifadə):

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

Nəhayət, API -nin bizə qaytardığı kolleksiya+JSON simini deşifrə edəcəyik və axtarış termininə aid şəkillərə bağlantılar siyahısını çıxaracağıq:

def get_image_search (ifadə):

params = {"q": urllib.parse.quote (arg), "media_type": "image"} nəticələr = request.get ("https://images-api.nasa.gov/search", params = params) data = [nəticə ['href'] nəticə ilə nəticələnir.json () ["toplama"] ["maddələr"]

İşdə gedirik! İndi NASA görüntü axtarış API'sini sorğu edə bilən və axtarış terminimizlə əlaqəli şəkillərə bağlantıların siyahısını qaytara biləcək bir kod parçasına sahibik.

Addım 3: Konvolutional Sinir Şəbəkəsi

Baxış

Sinir şəbəkəsinin işi, görüntünün kosmosdakı bir şeyə aid olub -olmadığını təsnif etməkdir. Bunu etmək üçün, görüntü üzərində bir sıra matris əməliyyatları yerinə yetirmək üçün konvulsion bir neyron şəbəkəsi və ya CNN istifadə edəcəyik. Hamısını izah etməyəcəyəm, çünki bunun arxasında çoxlu nəzəriyyə var, amma neyron şəbəkələri haqqında öyrənmək istəyirsinizsə, "Maşın Öyrənmə Ustalığı" nı təklif edirəm.

Kod

Birincisi, asılılıqlarımızı idxal etməliyik:

id id

#GPU os.environ -da qatar addımında problem həll edildi ['CUDA_VISIBLE_DEVICES'] = '' tf.test.gpu_device_name (): print ('GPU found') else: print ("GPU tapılmadı") olduqda tensorflowu tf olaraq idxal edin keras.preprocessing.image idxalından ImageDataGenerator keras.preprocessing idxal görüntüsü keras.models idxal keras.layersdən ardıcıl Conv2D, keras.layersdən MaxPooling2D idxal Aktivləşdirmə, Boşaltma, Düzləşdirmək, Keras idxal arxa tərəfdən K kimi PIL idxal Image np kimi numpy idxal edin

Sonra modelimizi müəyyənləşdirməliyik:

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 = 10 batch_size = 8 if K.image_data_format () == 'channels_first': input_shape_ (3) = (img_width, img_height, 3) model = Ardıcıl () model.add (Conv2D (32, (2, 2), input_shape = input_shape)) model.add (Aktivasiya ('relu')) model.add (MaxPooling2D (pool_size) = (2, 2))) model.add (Conv2D (32, (2, 2))) model.add (Aktivasiya ('relu')) model.add (MaxPooling2D (pool_size = (2, 2))) model.add (Conv2D (64, (2, 2))) model.add (Aktivasiya ('relu')) model.add (MaxPooling2D (pool_size = (2, 2))) model.add (Flatten ()) modeli. əlavə et (Yoğun (64)) model.add (Aktivləşdirmə ('relu')) model.add (Bırakma (0.5)) model.add (Yoğun (1)) model.add (Aktivasiya ('sigmoid')) model.compile (zərər = 'binary_crossentropy', optimizer = 'rmsprop', ölçülər = ['dəqiqlik'])

Mən sizin üçün modeli öyrətdim, ancaq modeli özünüz, öz məlumat bazanızda öyrətmək istəyirsinizsə, təlim kodunu əlavə etdim. Əks təqdirdə, təlim keçmiş modelin HDF5 faylını yükləyə bilərsiniz. Instructables fayl məhdudiyyətləri səbəbiylə ".txt" uzantısı ilə adını dəyişmək məcburiyyətində qaldım. İstifadə etmək üçün faylı ".h5" uzantısına dəyişin və bu kodla yükləyin:

model.load_weights ("model_saved.h5")

Bir görüntünün nə qədər uzay olduğunu təxmin etmək üçün şəbəkədən istifadə etmək üçün bu funksiyanı təyin edəcəyik:

def proqnozu (image_path):

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

Addım 4: Şəklin işlənməsi

Baxış

Şəkil emalı üçün OpenCV (cv2) kitabxanasından istifadə edirəm. Əvvəlcə görüntünün kənarlarını ləkələyəcəyik, sonra isə maska yaradaraq və daha qaranlıq rənglərin alfa dəyərlərini dəyişdirərək arxa planı çıxaracağıq.

Kod

İşin kənarlarını bulandıran hissəsidir:

def prosesi Təsvir (img):

RADIUS = 20 # Şəkil açın im = Image.open ("pilbuffer.png") # Şəkli ağ fonda yapışdırın diam = 2 * RADIUS geri = Image.new ('RGB', (im.size [0] + diam, im.size [1] + diam), (0, 0, 0)) back.paste (im, (RADIUS, RADIUS)) # # 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) maska. yapışdır (blck, (diam, diam)) # Təsviri blur edin və maskanı bulanıq kənarına yapışdırın = geri.filter (ImageFilter. GaussianBlur (RADIUS / 2)) geri.paste (blur, mask = mask) back.save (" keçid-p.webp

Sonra qaranlıq rəngləri şəffaf olaraq təyin edəcəyik və görüntünü müvəqqəti olaraq saxlayacağıq:

#Maska yaradın və filtri qara ilə alfa əvəz edin

image = cv2.imread ("keçid.png") hMin = 0 sMin = 0 vMin = 20 hMax = 180 sMax = 255 vMax = 255 aşağı = np.array ([hMin, sMin, vMin]) yuxarı = np.array ([hMax, sMax, vMax]) hsv = cv2.cvtColor (görüntü, cv2. COLOR_BGR2HSV) maska = cv2.inRange (hsv, aşağı, yuxarı) çıxış = cv2.bitwise_and (şəkil, görüntü, maska = maska) *_, alfa = cv2.split (output) dst = cv2.merge ((output, alpha)) output = dst with open ("buffer.png", "w+") as a file: pass cv2.imwrite ("buffer.png", output))

Addım 5: Şəkilləri bərabər bərabər bir proyeksiyaya birləşdirin

Baxış

Bu funksiya birdən çox şəkil çəkir və onları PIL (yastıq) kitabxanasından istifadə edərək PhotoSphere.js paketi tərəfindən şərh oluna biləcək bir formata tikir.

Kod

Birincisi, digər şəkillərin sahibi kimi çıxış edə biləcək bir görüntü yaratmalıyıq:

yeni = Image.new ("RGBA", (8000, 4000), rəng = (0, 0, 0))

Daha sonra, şəkillərin hamısını təkrarlamaq lazımdır (hamısı 1000x500 ölçüsündədir) və onları görüntüyə yerləşdirməliyik:

h = 0

img_arr: new.paste (img, (w, h), img) w = = 8000 olarsa w += 1000: h += 500 w = 0 i += 1

İndi bunu bir sıra şəkilləri arqument olaraq qəbul edən və yeni görüntünü qaytaran bir funksiyaya bağlayırıq:

def stitch_beta (img_arr):

new = Image.new ("RGBA", (8000, 4000), color = (0, 0, 0)) h = 0 w = 0 i = 0 img_arr img üçün: new.paste (img, (w, h), img) w += 1000 əgər w == 8000 olarsa: h += 500 w = 0 i += 1 yeni qayıdır

Addım 6: Tam Python Script

Bu, net.py olaraq saxlanılan və əsas skriptə daxil edilən tam python sinir şəbəkəsi skriptidir:

# kitabxana idxal edir

import os #Fix qatar mərhələsində GPU os.environ ['CUDA_VISIBLE_DEVICES'] = '' tf.test.gpu_device_name (): print ('GPU tapıldı') başqa: print ("GPU tapılmadı ") keras.preprocessing.image idxalından ImageDataGenerator keras.preprocessing import keras.models idxal keras.layersdən ardıcıl Conv2D, MaxPooling2D keras.layers idxal Aktivləşdirmə, Dropout, Flatten, Keras idxal arxa tərəfdən PIL -dən K kimi import Image 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 epochs = 10 batch_sizedata '8 = əgər Kim: input_shape = (3, img_width, img_height) başqa: input_shape = (img_width, img_height, 3) model = Ardıcıl () model.add (Conv2D (32, (2, 2), input_shape = input_shape)) model.add (Aktivləşdirmə) ('relu')) model.add (MaxPooling2D (pool_size = (2, 2))) model.add (Conv2D (32, (2, 2))) modeli. (Aktivləşdirmə ('relu')) model.add (MaxPooling2D (pool_size = (2, 2))) model.add (Conv2D (64, (2, 2))) model.add (Aktivasiya ('relu')) model.add (MaxPooling2D (pool_size = (2, 2))) model.add (Flatten ()) model.add (Yoğun (64)) model.add (Aktivasiya ('relu')) model.add (Bırakma (0.5))) model.add (Yoğun (1)) model.add (Aktivləşdirmə ('sigmoid')) model.compile (zərər = 'binary_crossentropy', optimizer = 'rmsprop', ölçülər = ['dəqiqlik']) model.load_weights ("model_saved.h5") def proqnozu (image_path): img = image.load_img (image_path, target_size = (1000, 500)) img = np.expand_dims (img, ox = 0) result = model.predict_classes (img) return result [0] [0]

Bu api.py əsas python faylıdır:

idxal istəkləri, sys, təsadüfi, urllib.parse, cv2

PIL idxalından Şəkil, io idxalından ImageFilter BytesIO np idxal kimi sayısız id get_image_search (sayı, ifadə): count = 0 img_arr = ifadədə arg üçün: print (arg) print (f "Cari görüntü sayı: {count) } ") i = 0 params = {" q ": urllib.parse.quote (arg)," media_type ":" image "} nəticələr = request.get (" https://images-api.nasa.gov/search ", params = params) data = [result ['href'] nəticə ilə nəticələnir. json () [" toplama "] [" maddələr "] çap edin (len (data)) əgər num> len (data): num = len (data) sayarkən = sayı: fasilə çapı (f "\ n {count} images retreived") return img_arr def stitch_beta (img_arr): new = Image.new ("RGBA", (8000, 4000), color = (0, 0, 0)) img_arr -da img üçün h = 0 w = 0 i = 0: #pbar.set_description (f "Şəkil işlənir {i +1}") yeni.paste (img, (w, h), img) w += 1000 əgər w == 8000: h += 500 w = 0 i += 1 yeni def prosesini geri qaytar Şəkil (img): RADIUS = 20 # Bir şəkil açın im = Image.open ("pilbuffer.png") # Şəkli ağ fon diamına yapışdırın = 2 * RADIUS geri = Image.new ('RGB', (im.size [0] + diam, im. Size [1] + diam), (0, 0, 0)) geri.paste (im, (RADIUS, RADIUS)) # Bulanıklıq maskası maskası yaradın = 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) maska.paste (blck, (diam, diam)) # Şəkili bulandır və maskanı blur = arxaya uyğun olaraq bulanıq kənarı yapışdır. ImageFilter. GaussianBlur (RADIUS / 2)) back.paste (blur, mask = mask) back.save ("o'tish.png") back.close () #Maska yaradın və filtri qara ilə əvəz edin alfa image = cv2.imread (" tranzit ion.png ") hMin = 0 sMin = 0 vMin = 20 hMax = 180 sMax = 255 vMax = 255 aşağı = np.array ([hMin, sMin, vMin]) yuxarı = np.array ([hMax, sMax, vMax]) hsv = cv2.cvtColor (şəkil, cv2. COLOR_BGR2HSV) maska = cv2.inRange (hsv, aşağı, yuxarı) çıxış = cv2.bitwise_and (şəkil, görüntü, maska = maska) *_, alfa = cv2.split (çıxış) dst = cv2.merge ((çıxış, alfa)) çıxış = dst fayl olaraq açıq ("buffer.png", "w+") ilə: cv2.imwrite keçin ("buffer.png", çıxış) #Kənarın aşkarlanması və bulanması _name_ == "_main_": search_terms = ["supernova", "planet", "galaxy", "samanyolu", "bulutsu", "ulduzlar"] #Axtarış terminləri planetariumun daxil etməsini istədiyinizə dəyişdirilə bilər. img_arr = get_image_search (64, search_terms) çap ("Şəkillər alındı və sinir süzüldü") img = stitch_beta (img_arr) çap ("Şəkillər tikildi") img.save ("stitched.png")

Addım 7: Elektron Tətbiqi

Baxış

PhotoSphere elementini yerləşdirən və yükləyən sadə bir elektron tətbiq yaradacağıq. Main.js və package.json faylları birbaşa Electron veb saytından götürülmüşdür və HTML, PhotoSphere saytında verilən HTML -nin bir qədər dəyişdirilmiş versiyasıdır. Faylları daxil etdim, amma hamısının adını.txt olaraq dəyişdirdim, çünki Instructables bu fayl növlərinə icazə vermir. Faylları istifadə etmək üçün onları müvafiq uzantı ilə yenidən adlandırın.

Kod

əsas.js

const {app, BrowserWindow} = tələb ('elektron')

createWindow () {const win = yeni BrowserWindow ({en: 800, hündürlük: 600, webPreferences: {nodeIntegration: true}}) win.loadFile ('index.html')} app.whenReady (). sonra (createWindow) app.on ('pəncərə hamısı qapalı', () => {əgər (proses.platform! == 'darvin') {app.quit ()}}) app.on ('aktivləşdir', () => {if (BrowserWindow.getAllWindows (). length === 0) {createWindow ()}})

paket.json

{

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

index.html

Addım 8: İcra

Düzbucaqlı şəkil yaratmaq

Təsvir yaratmaq üçün virtual mühitini aktivləşdirərək əmr satırında api.py skriptini işə salın:

api.py

Skriptlər icra edildikdən sonra elektron tətbiqini işlədin:

npm başlanğıcıVoila! Planetarium aktivdir! Oxuduğunuz üçün təşəkkürlər:)

Tövsiyə: