Სარჩევი:

ნერვული ქსელი პლანეტარიუმის გამოყენებით პითონის, ელექტრონისა და კერასის გამოყენებით: 8 ნაბიჯი
ნერვული ქსელი პლანეტარიუმის გამოყენებით პითონის, ელექტრონისა და კერასის გამოყენებით: 8 ნაბიჯი

ვიდეო: ნერვული ქსელი პლანეტარიუმის გამოყენებით პითონის, ელექტრონისა და კერასის გამოყენებით: 8 ნაბიჯი

ვიდეო: ნერვული ქსელი პლანეტარიუმის გამოყენებით პითონის, ელექტრონისა და კერასის გამოყენებით: 8 ნაბიჯი
ვიდეო: ბიოლოგია, X კლასი - ნერვული სისტემის ტიპები #ტელესკოლა 2024, ივლისი
Anonim
პლანეტარიუმის ნერვული ქსელი პითონის, ელექტრონისა და კერასის გამოყენებით
პლანეტარიუმის ნერვული ქსელი პითონის, ელექტრონისა და კერასის გამოყენებით

ამ სასწავლო ინსტრუქციაში მე გაჩვენებთ თუ როგორ დავწერე ავტომატური 3D პლანეტარიუმის გენერატორი პითონისა და ელექტრონის გამოყენებით

ზემოთ მოყვანილი ვიდეო აჩვენებს პროგრამის გენერირებულ ერთ – ერთ შემთხვევით პლანეტარიუმს.

** შენიშვნა: ეს პროგრამა არანაირად არ არის სრულყოფილი და ზოგან არც თუ ისე პითონური. ნერვული ქსელის დისკრიმინატორი არის მხოლოდ ~ 89% ზუსტი, ამიტომ ზოგიერთი უცნაური სურათი შეაღწევს პლანეტარიუმში **

სპეციფიკა

პლანეტარიუმი იკითხავს NASA API- ს კოსმოსთან დაკავშირებული სურათებისთვის და იყენებს კონვულსიურ ნერვულ ქსელს იმის დასადგენად, არის თუ არა სურათი შესაფერისი დამუშავებისთვის. პროგრამა შემდეგ იყენებს OpenCV- ს, რომ ამოიღოს ფონი გამოსახულებიდან და საბოლოოდ გამოსახულებები გაერთიანდეს ერთ დიდ ტოლკუთხა გამოსახულებაზე. ეს სურათი შემდეგ ინახება და Electron Node.js პროგრამა ხსნის სურათს და იყენებს PhotoSphere.js პაკეტს სურათის სანახავად პლანეტარიუმის სტილის 3D ფორმატში.

დამოკიდებულებები

პითონი:

  • კერასი
  • Ბალიში
  • cv2
  • ამობურცული
  • მოთხოვნები
  • ულილიბი
  • შემთხვევითი
  • დრო
  • io

ელექტრონი:

ფოტოსფერო

ნაბიჯი 1: შექმენით თქვენი გარემო

ელექტრონის და პითონის დაყენება

პირველი, დარწმუნდით, რომ გაქვთ node.js და npm დაინსტალირებული (თუ არა, შეგიძლიათ გადმოწეროთ აქ)

შემდეგი, თქვენ უნდა დააინსტალიროთ Electron. გახსენით ბრძანების სტრიქონი და შეიყვანეთ შემდეგი ბრძანება:

npm დააინსტალირეთ ელექტრონი -g

შემდეგი, თქვენ გჭირდებათ პითონი, რომლის გადმოწერა შეგიძლიათ აქ

ვირტუალური გარემოს შექმნა

გახსენით ბრძანების სტრიქონი, შემდეგ შეიყვანეთ შემდეგი ბრძანებები თქვენი ვირტუალური გარემოს შესაქმნელად:

pip დააინსტალირეთ virtualenv

ვირტუალური სივრცე

cd სივრცე

სკრიპტები / გააქტიურება

პითონის დამოკიდებულებების დაყენება

გაუშვით ეს ბრძანებები ბრძანების სტრიქონში, რომ დააინსტალიროთ თქვენი პითონის დამოკიდებულებები:

pip დააინსტალირეთ კერასი

პიპის დაყენების ბალიში

pip დააინსტალირეთ numpy

პიპის დაყენების მოთხოვნები

pip დააინსტალირეთ opencv-pythonთუ გსურთ თავად გაწვრთნათ ქსელი, დარწმუნდით, რომ დააინსტალირეთ GPU აჩქარება კერასისთვის

ნაბიჯი 2: NASA Search API– ს გამოკითხვა

მიმოხილვა

NASA– ს აქვს ბევრი მართლაც სასარგებლო API, რომელიც შეგიძლიათ გამოიყენოთ თქვენს პროექტებთან ერთად. ამ პროექტისთვის ჩვენ გამოვიყენებთ საძიებო API- ს, რომელიც საშუალებას გვაძლევს ნასას სურათების მონაცემთა ბაზაში ვეძებოთ სივრცეში დაკავშირებული სურათები.

Კოდი

პირველ რიგში, ჩვენ უნდა განვსაზღვროთ პითონის ფუნქცია, რომ მივიღოთ არგუმენტი, რომელიც იმოქმედებს როგორც საძიებო ტერმინი:

def get_image_search (ფრაზა):

ჩაბარება

შემდეგი, ჩვენ გადავაქცევთ საძიებო ტერმინს URL ფორმატში, შემდეგ გამოვიყენებთ მოთხოვნების ბიბლიოთეკას API– ს გამოსაძიებლად:

def get_image_search (ფრაზა):

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

დაბოლოს, ჩვენ გავშიფრავთ კოლექცია+JSON სტრიქონი, რომელიც API– მ დაგვიბრუნა და ამოვიღებთ საძიებო ტერმინთან დაკავშირებული სურათების ბმულების ჩამონათვალს:

def get_image_search (ფრაზა):

params = {"q": urllib.parse.quote (arg), "media_type": "image"} results = request.get ("https://images-api.nasa.gov/search", params = params) data = [result ['href'] result for results.json () ["კოლექცია"] ["ერთეულები"]

იქ მივდივართ! ჩვენ ახლა გვაქვს კოდის ფრაგმენტი, რომელსაც შეუძლია ნასას სურათების ძებნის API მოთხოვნა და დაუბრუნოს ჩვენს საძიებო ტერმინთან დაკავშირებული სურათების ბმულების სია.

ნაბიჯი 3: კონვოლუციური ნერვული ქსელი

მიმოხილვა

ნერვული ქსელის ამოცანაა კლასიფიცირება, არის თუ არა გამოსახულება სივრცეში რაიმე, თუ არა ის. ამისათვის ჩვენ გამოვიყენებთ კონვოლუციურ ნერვულ ქსელს, ანუ CNN, სურათზე მატრიცული ოპერაციების სერიის შესასრულებლად და იმის დასადგენად, თუ რამდენად სივრცეა ის. ამ ყველაფერს არ ავხსნი, რადგან მის უკან ბევრი თეორიაა, მაგრამ თუ გსურს გაეცნო ნერვულ ქსელებს, მე გირჩევ "მანქანათმცოდნეობის ოსტატობას"

Კოდი

პირველ რიგში, ჩვენ უნდა შემოვიტანოთ ჩვენი დამოკიდებულებები:

იმპორტი os

#დაფიქსირება მატარებლის გადადგმის დროს GPU os.environ ['CUDA_VISIBLE_DEVICES'] = '' tensorflow- ის იმპორტი, როგორც tf, თუ tf.test.gpu_device_name (): print ('GPU found') სხვა: ბეჭდვა ("GPU არ მოიძებნა") keras.preprocessing.image იმპორტი ImageDataGenerator კერასიდან. დამუშავება იმპორტის სურათი keras.models იმპორტი Sequential from keras.layers იმპორტი Conv2D, MaxPooling2D keras.layers იმპორტი გააქტიურება, გამოტოვება, გაბრტყელება, მკვრივი კერასიდან იმპორტის უკანა ნაწილი, როგორც K PIL იმპორტის სურათი იმპორტირებული numpy როგორც 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 = 8 if K.image_data_format () == 'channel_first': input_shape =}, = (img_width, img_height, 3) model = Sequential () 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 (აქტივაცია ('relu')) model.add (MaxPooling2D (pool_size = (2, 2)))) მოდელი. დამატება (Conv2D (64, (2, 2)))) model.add (აქტივაცია ('relu')) model.add (MaxPooling2D (pool_size = (2, 2)))) model.add (გაბრტყელება ()) მოდელი დამატება (მკვრივი (64)) model.add (აქტივაცია ('relu')) model.add (Dropout (0.5)) model.add (მკვრივი (1)) model.add (აქტივაცია ('სიგმოიდი')) model.compile (დაკარგვა = 'ორობითი_კროსენტროპია', ოპტიმიზატორი = 'rmsprop', მეტრიკა = ['სიზუსტე'])

მე მოვამზადე მოდელი თქვენთვის, მაგრამ თუ გსურთ მოდელის მომზადება საკუთარ თავზე, თქვენს მონაცემთა ნაკრებზე, მაშინ მე დავამატე სასწავლო კოდი. წინააღმდეგ შემთხვევაში, შეგიძლიათ ჩამოტვირთოთ გაწვრთნილი მოდელის HDF5 ფაილი. Instructables ფაილის შეზღუდვების გამო, მე მომიწია მისი გადარქმევა ".txt" გაფართოებით. მისი გამოსაყენებლად, გადაარქვით ფაილს გაფართოება ".h5" და ჩატვირთეთ იგი ამ კოდით:

model.load_weights ("model_saved.h5")

იმისათვის, რომ გამოვიყენოთ ქსელი იმის პროგნოზირებისთვის, თუ რამდენად არის სივრცე გამოსახულება, ჩვენ განვსაზღვრავთ ამ ფუნქციას:

def პროგნოზირება (image_path):

img = image.load_img (image_path, target_size = (1000, 500)) img = np.expand_dims (img, axis = 0) result = model.predict_classes (img) დაბრუნების შედეგი [0] [0]

ნაბიჯი 4: სურათის დამუშავება

მიმოხილვა

სურათის დამუშავებისთვის მე ვიყენებ OpenCV (cv2) ბიბლიოთეკას. პირველ რიგში, ჩვენ გავაფუჭებთ სურათის კიდეებს, შემდეგ კი ჩვენ ამოვიღებთ ფონს ნიღბის შექმნით და მუქი ფერის ალფა მნიშვნელობების შეცვლით.

Კოდი

ეს არის ფუნქციის ის ნაწილი, რომელიც ანათებს კიდეებს:

def processImage (img):

RADIUS = 20 # გახსენით სურათი im = Image.open ("pilbuffer.png") # ჩასვით სურათი თეთრ ფონზე diam = 2 * RADIUS უკან = სურათი. ახალი ('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) ნიღაბი. პასტა (blck, (diam, diam)) # სურათის დაბინდვა და ჩასვით ბუნდოვანი ზღვარი ნიღბის მიხედვით blur = back.filter (ImageFilter. GaussianBlur (RADIUS / 2)) back.paste (blur, mask = mask) back.save (" გარდამავალი.-p.webp

შემდეგი, ჩვენ დავაყენებთ მუქ ფერს გამჭვირვალედ და სურათის დროებით შენახვას:

#შექმენით ნიღაბი და გაფილტრეთ შეცვალეთ შავი ალფა

image = cv2.imread ("transfer.png") hMin = 0 sMin = 0 vMin = 20 hMax = 180 sMax = 255 vMax = 255 ქვედა = np.array ([hMin, sMin, vMin]) ზედა = np.array ([hMax, sMax, vMax]) hsv = cv2.cvtColor (სურათი, cv2. COLOR_BGR2HSV) ნიღაბი = cv2.inRange (hsv, ქვედა, ზედა) გამომავალი = cv2.bitwise_and (სურათი, სურათი, ნიღაბი = ნიღაბი) *_, ალფა = cv2.split (output) dst = cv2.merge ((output, alpha)) output = dst with open ("buffer.png", "w+") as file: pass cv2.imwrite ("buffer.png", output)

ნაბიჯი 5: სურათების შეკრება თანაბარკუთხა პროექციაში

მიმოხილვა

ეს ფუნქცია იღებს მრავალ სურათს და აყალიბებს მათ ფორმატში, რომლის ინტერპრეტაციაც შესაძლებელია PhotoSphere.js პაკეტით, PIL (ბალიშის) ბიბლიოთეკის გამოყენებით

Კოდი

უპირველეს ყოვლისა, ჩვენ უნდა შევქმნათ სურათი, რომელსაც შეუძლია შეასრულოს მასპინძლობა სხვა სურათებისთვის:

ახალი = სურათი. ახალი ("RGBA", (8000, 4000), ფერი = (0, 0, 0))

შემდეგი, ჩვენ უნდა განმეორდეს სურათების მასივის საშუალებით (ყველა ზომა შეცვლილია 1000x500– მდე) და მოვათავსოთ ისინი სურათში:

h = 0

w = 0 i = 0 img_arr– ში img_arr: new.paste (img, (w, h), img) w += 1000 თუ w == 8000: h += 500 w = 0 i += 1

ახლა ჩვენ უბრალოდ ვამთავრებთ ამ ფუნქციას, რომელიც იღებს სურათების მასივს, როგორც არგუმენტს და აბრუნებს ახალ სურათს:

def stitch_beta (img_arr):

ახალი = სურათი. ახალი ("RGBA", (8000, 4000), ფერი = (0, 0, 0)) h = 0 w = 0 i = 0 img_arr img_arr: new.paste (img, (w, h), img) w += 1000 თუ w == 8000: h += 500 w = 0 i += 1 დაბრუნება ახალი

ნაბიჯი 6: სრული პითონის სკრიპტი

ეს არის პითონის ნერვული ქსელის სრული სკრიპტი, რომელიც ინახება როგორც net.py და იმპორტირებულია მთავარ სკრიპტში:

# ბიბლიოთეკების იმპორტი

იმპორტის ოპერაციული სისტემა #დაფიქსირება მატარებლის გადადგმისას GPU os.environ ['CUDA_VISIBLE_DEVICES'] = '' იმპორტი tensorflow, როგორც tf, თუ tf.test.gpu_device_name (): print ('GPU found') სხვა: print ("GPU არ მოიძებნა ") keras.preprocessing.image იმპორტი ImageDataGenerator keras- დან. keras- დან იმპორტის სურათის დამუშავება. მოდელების იმპორტი მიმდევრობა keras.layers იმპორტი Conv2D, MaxPooling2D keras.layers იმპორტი აქტივაცია, Dropout, Flatten, Dense from keras import backend as K from PIL იმპორტის სურათი იმპორტის numpy როგორც 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 = 8 = 'K': input_shape = (3, img_width, img_height) სხვა: input_shape = (img_width, img_height, 3) model = Sequential () 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))) მოდელი. დამატება (გააქტიურება ('relu')) model.add (MaxPooling2D (pool_size = (2, 2))) model.add (Conv2D (64, (2, 2))) model.add (აქტივაცია ('relu')) model.add (MaxPooling2D (pool_size = (2, 2))) model.add (გაბრტყელება ()) model.add (მკვრივი (64)) model.add (გააქტიურება ('relu')) model.add (Dropout (0.5)) model.add (მკვრივი (1)) model.add (აქტივაცია ('სიგმოიდი')) model.compile (დაკარგვა = 'ორობითი_კროსენტროპია', ოპტიმიზატორი = 'rmsprop', მეტრიკა = ['სიზუსტე']) model.load_weights ("model_saved.h5") def predict (image_path): img = image.load_img (image_path, target_size = (1000, 500)) img = np.expand_dims (img, axis = 0) result = model.predict_classes (img) დაბრუნების შედეგი [0] [0]

ეს არის მთავარი პითონის ფაილი, api.py:

იმპორტის მოთხოვნები, sys, random, urllib.parse, cv2

PIL იმპორტის სურათიდან, ImageFilter io იმპორტი BytesIO იმპორტის numpy როგორც np იმპორტი წმინდა def_game_search (num, ფრაზა): count = 0 img_arr = for arg in ფრაზა: print (arg) print (f "მიმდინარე სურათის რაოდენობა: {count } ") i = 0 params = {" q ": urllib.parse.quote (arg)," media_type ":" image "} results = request.get (" https://images-api.nasa.gov/search ", params = params) data = [result ['href'] result for results.json () [" collection "] [" items "] print (len (data)) if num> len (data): num = ლენ (მონაცემები) დათვლისას = num: break print (f "\ n {count} images retreived") return img_arr def stitch_beta (img_arr): new = Image.new ("RGBA", (8000, 4000), color = (0, 0, 0)) h = 0 w = 0 i = 0 img_arr img_arr– ში: #pbar.set_description (f "სურათის დამუშავება {i +1}") new.paste (img, (w, h), img) w += 1000 თუ w == 8000: h += 500 w = 0 i += 1 ახალი def პროცესის დაბრუნება სურათი (img): RADIUS = 20 # გახსენით სურათი im = Image.open ("pilbuffer.png") # ჩასვით გამოსახულება თეთრ ფონურ დიამეტრზე = 2 * RADIUS უკან = სურათი. ახალი ('RGB', (im.size [0] + diam, im.size [1] + diam), (0, 0, 0)) back.paste (im, (RADIUS, რადიო)) # შექმენით დაბინდვის ნიღბის ნიღაბი = სურათი. ახალი ('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)) # დაბინდეთ სურათი და ჩასვით დაბინდული ზღვარი ნიღბის მიხედვით blur = back.filter (ImageFilter. GaussianBlur (RADIUS / 2)) back.paste (blur, mask = mask) back.save ("transfer.png") back.close () #შექმენით ნიღაბი და ფილტრი შეცვალეთ შავი ალფა გამოსახულებით = cv2.imread (" ტრანზიტი ion.png ") hMin = 0 sMin = 0 vMin = 20 hMax = 180 sMax = 255 vMax = 255 ქვედა = np.array ([hMin, sMin, vMin]) ზედა = np.array ([hMax, sMax, vMax]) hsv = cv2.cvtColor (სურათი, cv2. COLOR_BGR2HSV) ნიღაბი = cv2.inRange (hsv, ქვედა, ზედა) გამომავალი = cv2.bitwise_and (სურათი, სურათი, ნიღაბი = ნიღაბი) *_, alpha = cv2.split (გამომავალი) dst = cv2.merge ((გამომავალი, ალფა)) გამომავალი = dst ღია ("buffer.png", "w+") როგორც ფაილი: გაიაროს cv2.imwrite ("buffer.png", გამომავალი) #კიდეების გამოვლენა და დაბინდვა თუ _name_ == "_ ძირითადი_": search_terms = ["სუპერნოვა", "პლანეტა", "გალაქტიკა", "ირმის ნახტომი", "ნისლეული", "ვარსკვლავები"] #საძიებო ტერმინები შეიძლება შეიცვალოს ყველაფრის მიხედვით, რაც გსურთ რომ პლანეტარიუმმა მოიცვას img_arr = მიიღე_ სურათის_ ძებნა (64, საძიებო ვადები) ბეჭდვა ("სურათები ამოღებულია და ნერვული გაფილტრული") img = stitch_beta (img_arr) ბეჭდვა ("სურათები შეკერილია") img.save ("stitched.png")

ნაბიჯი 7: ელექტრონული აპლიკაცია

მიმოხილვა

ჩვენ შევქმნით მარტივ ელექტრონულ აპლიკაციას, რომელიც უბრალოდ პოზიციონირებს და იტვირთება PhotoSphere ელემენტს. Main.js და package.json ფაილები პირდაპირ არის ელექტრონის ვებგვერდიდან და HTML არის HTML– ის ოდნავ შეცვლილი ვერსია, რომელიც მოცემულია PhotoSphere ვებსაიტზე. მე ჩავრთე ფაილები, მაგრამ დავარქვი ყველა.txt, რადგან Instructables არ იძლევა ამ ტიპის ფაილებს. ფაილების გამოსაყენებლად გადაარქვით სახელი შესაბამისი გაფართოებით.

Კოდი

მთავარი. js

const {app, BrowserWindow} = მოითხოვს ('ელექტრონი')

function createWindow () {const win = new BrowserWindow ({სიგანე: 800, სიმაღლე: 600, webPreferences: {nodeIntegration: true}}) win.loadFile ('index.html')} app.whenReady (). შემდეგ (createWindow) app.on ('window-all -losed', () => {if (process.platform! == 'darwin') {app.quit ()}}) app.on ('გააქტიურება', () => {if (BrowserWindow.getAllWindows (). სიგრძე === 0) {createWindow ()}})

პაკეტი. ჯონსონი

{

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

index.html

ნაბიჯი 8: აღსრულება

ტოლგვერდა გამოსახულების შექმნა

სურათის შესაქმნელად, გაუშვით api.py სკრიპტი ბრძანების სტრიქონში, მისი ვირტუალური გარემო გააქტიურებულია:

api.py

სკრიპტების შესრულების დასრულების შემდეგ გაუშვით ელექტრონული აპლიკაცია:

npm დაწყებავოილა! თქვენი პლანეტარიუმი აქტიურია! Მადლობა წაკითხვისთვის:)

გირჩევთ: