Mundarija:
- 1 -qadam: Atrof -muhitni sozlash
- 2 -qadam: NASA Search API -ni so'rash
- 3 -qadam: Konvolyutsion neyron tarmoq
- 4 -qadam: tasvirni qayta ishlash
- 5 -qadam: To'g'ri to'rtburchaklar proyeksiyada tasvirlarni bir -biriga tikish
- 6 -qadam: To'liq Python skript
- 7 -qadam: Electron ilovasi
- 8 -qadam: ijro
Video: Python, Electron va Keras yordamida neyron tarmoq bilan ishlaydigan planetariy: 8 qadam
2024 Muallif: John Day | [email protected]. Oxirgi o'zgartirilgan: 2024-01-30 13:24
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
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:
Nutq uchun matn ARMbasic bilan ishlaydigan UChip va boshqa ARMbasic bilan ishlaydigan SBC -ni bosing: 3 qadam
Nutq uchun matn ARMbasic bilan ishlaydigan UChip va boshqa ARMbasic bilan ishlaydigan SBC -ni bosing: Kirish: Xayrli kun. Mening ismim Tod. Men aerokosmik va mudofaa sohasidagi professionalman, lekin u ham yuragida g'ayratli. Ilhom: BBS, 8-bitli mikrokontrollerlar, Kaypro/Commodore/Tandy/TI-994A shaxsiy kompyuterlari davridan kelib chiqqan holda, R
Magnit geodezik planetariy: 7 qadam (rasmlar bilan)
Magnit geodezik planetariy: Hammaga salom! Sizni magnit va ishchi simlar bilan ushlab turilgan geodezik planetariyni yaratish jarayonida sizga ko'rsatma berishni yoqtiraman! Ushbu magnitlardan foydalanishning sababi yomg'ir paytida yoki ideal ob -havo sharoitida oson olib tashlanishi. Shu tarzda siz
Bu Qo'lmi? (Raspberry Pi kamera + neyron tarmoq) 1/2 qism: 16 qadam (rasmlar bilan)
Bu Qo'lmi? (Raspberry Pi Camera + Neural Network) 1/2 qism: Bir necha kun oldin men sport zalida o'ng qo'limni shikastladim. Keyinchalik, men har safar kompyuter sichqonchasini ishlatganimda, bu bilak burchagi tufayli og'riqni keltirib chiqardi. O'shanda bu menga tegdi " agar biron bir sirtni trekka aylantirsak yaxshi bo'larmidi
Miya qutisi: Vaqt o'tishi bilan neyron hajmini kuzatish: 20 qadam
Miya qutisi: Vaqt o'tishi bilan neyronlar hajmini kuzatish: uzoq umr ko'rish chegarasiga o'tish bizdan oldin tsivilizatsiyalar ko'rmagan kasalliklarning paydo bo'lishiga olib keldi. Ular orasida Altsgeymer kasalligi 2017 yilda taxminan 5,3 million keksa amerikaliklarga ta'sir qilgan, yoki taxminan har 10da 1
Ovozli faol planetariy: 8 qadam (rasmlar bilan)
Ovozli faollashtirilgan planetariy: Bu ko'rsatma Janubiy Floridadagi universitetda (www.makecourse.com) Makecourse loyihasi talablarini bajarish uchun yaratilgan. Bu mening ovoz bilan faollashtirilgan planetariyim. Planetariyning asosiy vazifasi … bilan faollashtirishdir