Mundarija:

Python, Electron va Keras yordamida neyron tarmoq bilan ishlaydigan planetariy: 8 qadam
Python, Electron va Keras yordamida neyron tarmoq bilan ishlaydigan planetariy: 8 qadam

Video: Python, Electron va Keras yordamida neyron tarmoq bilan ishlaydigan planetariy: 8 qadam

Video: Python, Electron va Keras yordamida neyron tarmoq bilan ishlaydigan planetariy: 8 qadam
Video: Модель Tesla Motors Модель S / X: Нагнетание батареи на 60 кВт от мертвых, 105 кВт !!! 2024, Noyabr
Anonim
Python, Electron va Keras yordamida neyron tarmoq bilan ishlaydigan planetariy
Python, Electron va Keras yordamida neyron tarmoq bilan ishlaydigan planetariy

Bu ko'rsatmada men sizga Python va Electron yordamida avtomatik 3D planetariy generatorini qanday yozganimni ko'rsataman

Yuqoridagi videoda dastur yaratilgan tasodifiy planetariylardan biri ko'rsatilgan.

** Eslatma: Bu dastur hech qanday tarzda mukammal emas va ba'zi joylarda unchalik pythonik emas. Neyron tarmoq diskriminatori atigi ~ 89% aniq, shuning uchun ba'zi g'alati tasvirlar uni planetariyga aylantiradi **

Xususiyatlar

Planetarium NASA API-dan kosmosga tegishli tasvirlarni so'raydi va tasvirni qayta ishlash uchun mos yoki yo'qligini aniqlash uchun konvolyutsion neyron tarmoqdan foydalanadi. Keyin dastur OpenCV -dan foydalanib, tasvirdan fonni olib tashlaydi va nihoyat, tasvirlar bitta katta to'rtburchaklar tasvirga tikiladi. Keyin bu rasm saqlanadi va Electron Node.js ilovasi tasvirni ochadi va PhotoSphere.js paketidan foydalanib, planetariy uslubidagi 3D formatida tasvirni ko'radi.

Bog'liqliklar

Python:

  • Keras
  • Yostiq
  • cv2
  • Noqulay
  • Talablar
  • urllib
  • Tasodifiy
  • vaqt
  • io

Elektron:

PhotoSphere

1 -qadam: Atrof -muhitni sozlash

Electron va Python -ni o'rnatish

Birinchidan, node.js va npm o'rnatilganligiga ishonch hosil qiling (agar bo'lmasa, bu yerdan yuklab olishingiz mumkin)

Keyinchalik, Electron -ni o'rnatishingiz kerak. Buyruq satrini oching va quyidagi buyruqni kiriting:

npm elektron -g ni o'rnating

Keyin sizga python kerak, uni bu erdan yuklab olish mumkin

Virtual muhitni sozlash

Buyruq satrini oching va virtual muhitni sozlash uchun quyidagi buyruqlarni kiriting:

pip virtualenv -ni o'rnating

virtual maydon

CD maydoni

skriptlar / faollashtiring

Python qaramligini o'rnatish

Python qaramligini o'rnatish uchun buyruq satrida ushbu buyruqlarni bajaring:

pip kerasni o'rnating

yostiqni o'rnatish

pip o'rnatish numpy

pip o'rnatish so'rovlari

opencv-python-ni o'rnatishAgar siz tarmoqni o'zingiz o'rgatmoqchi bo'lsangiz, Keras uchun GPU tezlashtirishni o'rnatganingizga ishonch hosil qiling

2 -qadam: NASA Search API -ni so'rash

Sharh

NASA sizning loyihalaringizda foydalanishingiz mumkin bo'lgan juda ko'p foydali API -larga ega. Ushbu loyiha uchun biz qidiruv API-dan foydalanamiz, bu bizga NASA tasvirlar bazasini kosmosga tegishli tasvirlarni qidirishga imkon beradi.

Kodeks

Birinchidan, biz qidiruv so'zi sifatida ishlaydigan dalilni qabul qilish uchun python funktsiyasini aniqlashimiz kerak:

def get_image_search (ibora):

o'tish

Keyin, biz qidiruv so'zini URL formatiga o'tkazamiz, so'ng API -ni so'rash uchun so'rovlar kutubxonasidan foydalanamiz:

def get_image_search (ibora):

params = {"q": urllib.parse.quote (arg), "media_type": "image"} natijalar = request.get ("https://images-api.nasa.gov/search", params = parametrlar)

Nihoyat, biz API qaytargan to'plam+JSON satrini dekodlaymiz va qidiruv atamasi bilan bog'liq rasmlarga havolalar ro'yxatini chiqaramiz:

def get_image_search (ibora):

params = {"q": urllib.parse.quote (arg), "media_type": "image"} natijalar = request.get ("https://images-api.nasa.gov/search", params = parametrlar) natijalar uchun natijalar uchun ma'lumotlar = [natija ['href'].json () ["to'plam"] ["elementlar]

Biz boramiz! Endi bizda NASA tasvir qidirish API -sini so'roq qila oladigan va qidiruv so'zimizga tegishli rasmlarga havolalar ro'yxatini qaytaradigan kod parchasi bor.

3 -qadam: Konvolyutsion neyron tarmoq

Sharh

Neyron tarmog'ining vazifasi - tasvir kosmosdagi narsami yoki yo'qligini tasniflash. Buning uchun biz konvulsion neyron tarmoq yoki CNN-dan foydalanib, tasvir ustida bir qator matritsali operatsiyalarni bajaramiz va bo'shliq-y qanchalik ekanligini aniqlaymiz. Men bularning barchasini tushuntirmayman, chunki buning ortida juda ko'p nazariyalar bor, lekin agar siz neyron tarmoqlari haqida bilmoqchi bo'lsangiz, men "Mashinani o'rganish mahorati" ni taklif qilaman.

Kodeks

Birinchidan, biz qaramlikni import qilishimiz kerak:

import qilish os

#GPU os.environ poezdida muammoni hal qilish ['CUDA_VISIBLE_DEVICES'] = '' tf.test.gpu_device_name (): print ('GPU topilgan') else: print ("GPU topilmadi") keras. numpy ni np sifatida import qilish

Keyin biz modelni aniqlashimiz kerak:

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 davr = 10 batch_size = 8, agar K.image_data_format () == 'channels_first': input_shape_ (3), img_shape_ (3) = (img_width, img_height, 3) model = Sequential () model.add (Conv2D (32, (2, 2), input_shape = input_shape)) model.add (Aktivatsiya ('relu')) model.add (MaxPooling2D (pool_size) = (2, 2))) model.add (Conv2D (32, (2, 2))) model.add (Aktivatsiya ('relu')) model.add (MaxPooling2D (pool_size = (2, 2))) model.add (Conv2D (64, (2, 2))) model.add (Aktivatsiya ('relu')) model.add (MaxPooling2D (pool_size = (2, 2))) model.add (Flatten ()) modeli. modelni qo'shish (yo'qotish = 'binary_crossentropy', optimizator = 'rmsprop', o'lchovlar = ['aniqlik'])

Men siz uchun modelni o'rgatganman, lekin agar siz modelni o'zingiz, shaxsiy ma'lumotlar bazasida o'rgatmoqchi bo'lsangiz, men o'quv kodini biriktirdim. Aks holda, siz o'qitilgan modelning HDF5 faylini yuklab olishingiz mumkin. Instructables fayl cheklovlari tufayli men uni ".txt" kengaytmasi bilan qayta nomlashga majbur bo'ldim. Uni ishlatish uchun faylni ".h5" kengaytmasi deb o'zgartiring va uni ushbu kod bilan yuklang:

model.load_weights ("model_saved.h5")

Tarmoqdan tasvirning bo'sh joyini taxmin qilish uchun biz ushbu funktsiyani aniqlaymiz:

def prognozi (image_path):

img = image.load_img (image_path, target_size = (1000, 500)) img = np.expand_dims (img, o'q = 0) natija = model.predict_classes (img) qaytish natijasi [0] [0]

4 -qadam: tasvirni qayta ishlash

Sharh

Rasmni qayta ishlash uchun men OpenCV (cv2) kutubxonasidan foydalanmoqdaman. Birinchidan, biz tasvirning chetlarini xiralashtiramiz, so'ngra niqob yaratish va quyuq ranglarning alfa qiymatlarini o'zgartirish orqali fonni olib tashlaymiz.

Kodeks

Bu funktsiyaning chekkalarni xiralashtiradigan qismi:

def processImage (img):

RADIUS = 20 # Tasvirni ochish im = Image.open ("pilbuffer.png") # Rasmni oq fonga yopishtiring diam = 2 * RADIUS orqaga = Image.new ('RGB', (im.size [0] + diam, im.size [1] + diam), (0, 0, 0)) back.paste (im, (RADIUS, RADIUS)) # # Bulaniq niqobli niqob yarating = 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) niqob. joylashtirish (blck, (diam, diam)) # Tasvirni xiralashtiring va xiralashgan chetini niqobga qarab xiralashtiring = orqaga. filtr (ImageFilter. GaussianBlur (RADIUS / 2)) orqaga o'tish.png ") back.close ()

Keyin biz quyuq ranglarni shaffof qilib o'rnatamiz va tasvirni vaqtincha saqlaymiz:

#Niqob yarating va filtr qora rangni alfa bilan almashtiring

image = cv2.imread ("o'tish.png") hMin = 0 sMin = 0 vMin = 20 hMax = 180 sMax = 255 vMax = 255 past = np.array ([hMin, sMin, vMin]) yuqori = np.array ([hMax, sMax, vMax]) hsv = cv2.cvtColor (tasvir, cv2. COLOR_BGR2HSV) niqob = cv2.inRange (hsv, pastki, yuqori) chiqish = cv2.bitwise_and (rasm, rasm, niqob = niqob) *_, alfa = cv2.split (chiqish) dst = cv2.merge ((chiqish, alfa)) chiqish = dst ochiq ("buffer.png", "w+") fayl sifatida: pass cv2.imwrite ("buffer.png", chiqish))

5 -qadam: To'g'ri to'rtburchaklar proyeksiyada tasvirlarni bir -biriga tikish

Sharh

Bu funksiya bir nechta rasmlarni oladi va ularni PIL (yostiq) kutubxonasi yordamida PhotoSphere.js to'plami tomonidan talqin qilinishi mumkin bo'lgan formatga birlashtiradi.

Kodeks

Birinchidan, biz boshqa tasvirlar uchun mezbon vazifasini bajaradigan tasvirni yaratishimiz kerak:

new = Image.new ("RGBA", (8000, 4000), rang = (0, 0, 0))

Keyinchalik, biz tasvirlar qatorini (ularning o'lchamlari 1000x500 gacha) takrorlashimiz va rasmga joylashtirishimiz kerak:

h = 0

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

Endi biz buni tasvirlar majmuasini argument sifatida qabul qiladigan va yangi tasvirni qaytaradigan funktsiyaga kiritamiz:

def stitch_beta (img_arr):

new = Image.new ("RGBA", (8000, 4000), color = (0, 0, 0)) h = 0 w = 0 i = 0 img_arr img uchun: new.paste (img, (w, h)), img) w += 1000 bo'lsa w == 8000: h += 500 w = 0 i += 1 qaytish yangi

6 -qadam: To'liq Python skript

Bu net.py sifatida saqlanadigan va asosiy skriptga import qilingan to'liq python neyron tarmoq skriptidir:

# kutubxonalarni import qilish

import os #Fix, poezdda GPU os.environ ['CUDA_VISIBLE_DEVICES'] = '' tf.test.gpu_device_name (): print ('GPU topilgan') boshqa: chop etish ("GPU topilmadi ") keras.preprocessing.image -dan import ImageDataGenerator keras -dan import tasvirini keras.modellardan import qilish Keras.layerlardan ketma -ketlik Conv2D, MaxPooling2D -ni keras.layerlardan import qilish Aktivatsiya, Dropout, Flatten, Dens dan keras importining orqa qismi PIL dan. 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_size_data 'formatda bo'lsa: 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 (Faollashtirish ('relu')) model.add (MaxPooling2D (pool_size = (2, 2))) model.add (Conv2D (32, (2, 2))) model. modelni qo'shish model.add (MaxPooling2D (pool_size = (2, 2))) model.add (Flatten ()) model.add (Zich (64)) model.add (Aktivatsiya ('relu')) model.add (O'chirish)) model.add (Zich (1)) model.add (Faollashtirish ("sigmasimon")) model. kompilyatsiya (yo'qotish = 'binary_crossentropy', optimizator = 'rmsprop', o'lchovlar = ['aniqlik']) model.load_weights ("model_saved.h5") def prognozi (image_path): img = image.load_img (image_path, target_size = (1000, 500)) img = np.expand_dims (img, o'q = 0) natija = model.predict_classes (img) qaytish natijasi [0] [0]

Bu api.py asosiy python fayli:

import so'rovlari, sys, tasodifiy, urllib.parse, cv2

PIL import Rasmdan, ImageFilter io importidan BytesIO import numpy sifatida np import aniq def get_image_search: } ") i = 0 params = {" q ": urllib.parse.quote (arg)," media_type ":" image "} natijalar = request.get (" https://images-api.nasa.gov/search " ", params = params) ma'lumotlar = [natija ['href'] natijalar uchun natija.json () [" to'plam "] [" elementlar "] chop etish (len (ma'lumotlar)) agar raqam> len (ma'lumotlar): num = len (ma'lumotlar) hisoblash paytida = son: chop etish (f "\ n {count} ta rasm qaytarildi") qaytish img_arr def stitch_beta (img_arr): new = Image.new ("RGBA", (8000, 4000), color = (0, 0, 0)) img_arr -dagi img uchun h = 0 w = 0 i = 0: #pbar.set_description (f "Tasvirni qayta ishlash {i +1}") yangi.paste (img, (w, h), img) w += 1000 agar w == 8000: h += 500 w = 0 i += 1 yangi def jarayonini qaytarish Tasvir (img): RADIUS = 20 # Tasvirni ochish im = Image.open ("pilbuffer.png") # Rasmni oq fon diamiga joylashtirish = 2 * RADIUS orqaga = Image.new ('RGB', (im.size [0] + diam, im.size [1] + diam), (0, 0, 0)) back.past (im, (RADIUS), RADIUS)) # Bulaniq niqobli niqob yaratish = 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) niqob.paste (blck, (diam, diam)) # # Tasvirni xiralashtiring va niqobni xiralashtirish = orqaga qarab filtrni joylashtiring ImageFilter. GaussianBlur (RADIUS / 2)) back.paste (blur, mask = mask) back.save ("o'tish.png") back.close () #Niqob yarating va filtr qora rangni alfa image = cv2.imread ("bilan almashtiring) tranzit ion.png ") hMin = 0 sMin = 0 vMin = 20 hMax = 180 sMax = 255 vMax = 255 past = np.array ([hMin, sMin, vMin]) yuqori = np.array ([hMax, sMax, vMax]) hsv = cv2.cvtColor (rasm, cv2. COLOR_BGR2HSV) niqob = cv2.inRange (hsv, pastki, yuqori) chiqish = cv2.bitwise_and (rasm, rasm, niqob = niqob) *_, alfa = cv2.split (chiqish) dst = cv2.merge ((chiqish, alfa)) chiqish = dst fayl bilan ochiq ("buffer.png", "w+"): pass cv2.imwrite ("buffer.png", chiqish) #Chegarani aniqlash va xiralashtirish _name_ == "_main_": search_terms = ["supernova", "sayyora", "galaktika", "sutli yo'l", "tumanlik", "yulduzlar"] #Qidiruv shartlarini planetariy o'z ichiga oladigan narsaga o'zgartirish mumkin. img_arr = get_image_search (64, search_terms) chop etish ("Tasvirlar olingan va neyron filtrlangan") img = stitch_beta (img_arr) chop etish ("Tasvirlar tikilgan") img.save ("stitched.png")

7 -qadam: Electron ilovasi

Sharh

Biz PhotoSphere elementini joylashtiradigan va yuklaydigan oddiy elektron dastur yaratamiz. Main.js va package.json fayllari to'g'ridan -to'g'ri Electron veb -saytidan olingan va HTML - bu PhotoSphere veb -saytida taqdim etilgan HTMLning biroz o'zgartirilgan versiyasi. Men fayllarni qo'shdim, lekin hammasini.txt deb o'zgartirdim, chunki Instructables bu fayl turlariga ruxsat bermaydi. Fayllardan foydalanish uchun ularni tegishli kengaytma bilan qayta nomlang.

Kodeks

asosiy.js

const {app, BrowserWindow} = talab ("elektron")

createWindow () {const win = yangi BrowserWindow ({en: 800, balandlik: 600, webPreferences: {nodeIntegration: true}}) win.loadFile ('index.html')} app.whenReady () funktsiyasi, keyin (createWindow) app.on ('oyna-hammasi yopiq', () => {if (process.platform! == 'darvin') {app.quit ()}}) app.on ('faollashtirish', () => {if (BrowserWindow.getAllWindows (). length === 0) {createWindow ()}})

paket.json

{

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

index.html

8 -qadam: ijro

To'g'ri to'rtburchaklar tasvirni yaratish

Tasvirni yaratish uchun virtual muhit faollashtirilgan holda buyruq satrida api.py skriptini ishga tushiring:

api.py

Skriptlar bajarilgandan so'ng, elektron dasturni ishga tushiring:

npm boshlanishiVoila! Sizning planetariy faol! O'qiganingiz uchun tashakkur:)

Tavsiya: