Mündəricat:
2025 Müəllif: John Day | [email protected]. Son dəyişdirildi: 2025-01-23 12:54
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
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ə:
Python istifadə edərək Raspberry Pi və AIS328DQTR istifadə edərək sürətlənməni izləyin: 6 addım
Python istifadə edərək Raspberry Pi və AIS328DQTR istifadə edərək Sürətləndirməni izləyin: Sürətləndirmə sonsuzdur, düşünürəm ki, Fizikanın bəzi qanunlarına görə. Sahilə çıxan ən sürətli məxluq, bir anda ən yüksək sürətindən istifadə edərək ovunu tutur
Neopixel Ws2812 M5stick-C ilə Göy qurşağı LED Glow - Arduino IDE -dən istifadə edərək M5stack M5stick C -dən istifadə edərək Neopixel Ws2812 -də Göy qurşağının Çalışması: 5 addım
Neopixel Ws2812 M5stick-C ilə Göy qurşağı LED Glow | Arduino IDE istifadə edərək M5stack M5stick C istifadə edərək Neopixel Ws2812 üzərində Göy qurşağı çalıştırın: Salam uşaqlar bu təlimatlarda Arduino IDE ilə m5stack m5stick-C inkişaf lövhəsi ilə neopixel ws2812 LED və ya led şerit və ya led matris və ya led üzük istifadə etməyi öyrənəcəyik. onunla bir göy qurşağı nümunəsi
HT12D HT12E istifadə edərək RF 433MHZ Radio İdarəetmə - 433mhz ilə HT12E və HT12D istifadə edərək Rf Uzaqdan İdarəetmə edilməsi: 5 addım
HT12D HT12E istifadə edərək RF 433MHZ Radio İdarəetmə | HT12E və HT12D -dən 433mhz istifadə edərək Rf Uzaqdan İdarəetmə edilməsi: Bu təlimatda sizə HT12E kodlu 433mhz ötürücü qəbuledici modulu istifadə edərək RADIO uzaqdan idarə etməyi göstərəcəyəm. HT12D kod deşifratoru IC. Bu təlimatda çox ucuz komponentləri istifadə edərək məlumat göndərə və ala bilərsiniz: HT
Bu Əl mi? (Raspberry Pi Kamera + Sinir Şəbəkəsi) Part 1/2: 16 Addım (Şəkillərlə)
Bu Əl mi? (Raspberry Pi Kamera + Sinir Şəbəkəsi) 1/2 hissə: Bir neçə gün əvvəl idman salonunda sağ əlimi zədələdim. Daha sonra hər dəfə kompüter siçanını istifadə etdiyim zaman bilək bucağının dik olması səbəbindən çox ağrılara səbəb oldu. O zaman mənə vurdu " hər hansı bir səthi bir trekə çevirə bilsək əla olmazdı
Arduino Sinir Şəbəkəsi Robotu: 21 Adım (Şəkillərlə birlikdə)
Arduino Sinir Şəbəkəsi Robotu: Bu təlimat, öz YouTube Arduino neyron şəbəkə robotunuzun prototipini, dizaynını, montajını və proqramını tam olaraq göstərən YouTube Kanalı üçün hazırladığım 3 hissədən ibarət bir seriyaya əsaslanır. Tam seriyanı izlədikdən sonra bette olmalısınız