Mạng thần kinh cung cấp năng lượng cho Planetarium sử dụng Python, Electron và Keras: 8 bước
Mạng thần kinh cung cấp năng lượng cho Planetarium sử dụng Python, Electron và Keras: 8 bước
Anonim
Mạng thần kinh cung cấp năng lượng cho Planetarium sử dụng Python, Electron và Keras
Mạng thần kinh cung cấp năng lượng cho Planetarium sử dụng Python, Electron và Keras

Trong phần hướng dẫn này, tôi sẽ chỉ cho bạn cách tôi đã viết một máy tạo thiên văn 3D tự động, sử dụng Python và Electron

Đoạn video trên cho thấy một trong các cung thiên văn ngẫu nhiên mà chương trình tạo ra.

** Lưu ý: Chương trình này không phải là hoàn hảo, và ở một số nơi không quá phức tạp. Bộ phân biệt mạng thần kinh chỉ chính xác ~ 89%, vì vậy một số hình ảnh kỳ lạ sẽ lọt vào cung thiên văn **

Chi tiết cụ thể

Cung thiên văn truy vấn một API của NASA cho các hình ảnh liên quan đến không gian và sử dụng mạng nơ-ron phức hợp để xác định xem hình ảnh có phù hợp để xử lý hay không. Sau đó, chương trình sử dụng OpenCV để xóa nền khỏi hình ảnh, và cuối cùng các hình ảnh được ghép lại với nhau thành một hình ảnh hình chữ nhật lớn tương đương. Sau đó, hình ảnh này được lưu và ứng dụng Electron Node.js sẽ mở hình ảnh và sử dụng gói PhotoSphere.js để xem hình ảnh ở định dạng 3D theo phong cách cung thiên văn.

Sự phụ thuộc

Python:

  • Keras
  • Cái gối
  • cv2
  • Numpy
  • Yêu cầu
  • urllib
  • Ngẫu nhiên
  • thời gian
  • io

Điện tử:

PhotoSphere

Bước 1: Thiết lập môi trường của bạn

Cài đặt Electron và Python

Trước tiên, hãy đảm bảo rằng bạn đã cài đặt node.js và npm (nếu chưa có, bạn có thể tải xuống tại đây)

Tiếp theo, bạn cần cài đặt Electron. Mở dấu nhắc lệnh và nhập lệnh sau:

npm cài đặt electron -g

Tiếp theo, bạn cần python, có thể tải xuống tại đây

Thiết lập môi trường ảo

Mở dấu nhắc lệnh, sau đó nhập các lệnh sau để thiết lập môi trường ảo của bạn:

pip cài đặt virtualenv

không gian virtualenv

không gian cd

tập lệnh / kích hoạt

Cài đặt phụ thuộc Python

Chạy các lệnh này trong dấu nhắc lệnh để cài đặt các phụ thuộc python của bạn:

pip cài đặt keras

pip cài đặt gối

pip cài đặt numpy

yêu cầu cài đặt pip

pip cài đặt opencv-pythonNếu bạn muốn tự đào tạo mạng, hãy đảm bảo thiết lập tăng tốc GPU cho Keras

Bước 2: Truy vấn API tìm kiếm của NASA

Tổng quat

NASA có rất nhiều API thực sự hữu ích mà bạn có thể sử dụng với các dự án của mình. Đối với dự án này, chúng tôi sẽ sử dụng API tìm kiếm, cho phép chúng tôi tìm kiếm cơ sở dữ liệu hình ảnh của NASA để tìm các hình ảnh liên quan đến không gian.

Mật mã

Trước tiên, chúng ta cần xác định một hàm python để chấp nhận một đối số sẽ hoạt động như cụm từ tìm kiếm:

def get_image_search (cụm từ):

đi qua

Tiếp theo, chúng tôi sẽ chuyển đổi cụm từ tìm kiếm sang định dạng URL, sau đó sử dụng thư viện yêu cầu để truy vấn API:

def get_image_search (cụm từ):

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

Cuối cùng, chúng tôi sẽ giải mã bộ sưu tập + chuỗi JSON mà API trả lại cho chúng tôi và trích xuất danh sách các liên kết đến hình ảnh liên quan đến cụm từ tìm kiếm:

def get_image_search (cụm từ):

params = {"q": urllib.parse.quote (arg), "media_type": "image"} results = Request.get ("https://images-api.nasa.gov/search", params = params) data = [result ['href'] cho kết quả trong results.json () ["collection"] ["items"]

Chúng ta bắt đầu! Giờ đây, chúng tôi có một đoạn mã có thể truy vấn API tìm kiếm hình ảnh của NASA và trả về danh sách các liên kết đến hình ảnh liên quan đến cụm từ tìm kiếm của chúng tôi.

Bước 3: Mạng nơron hợp pháp

Tổng quat

Công việc của mạng nơ-ron là phân loại xem một hình ảnh có phải là thứ gì đó trong không gian hay không. Để làm điều này, chúng tôi sẽ sử dụng mạng nơ-ron tích chập, hay CNN, để thực hiện một loạt các phép toán ma trận trên hình ảnh và xác định xem nó là không gian-y như thế nào. Tôi sẽ không giải thích tất cả điều này, bởi vì có rất nhiều lý thuyết đằng sau nó, nhưng nếu bạn muốn tìm hiểu về mạng thần kinh, tôi đề xuất "Kỹ năng học máy"

Mật mã

Đầu tiên, chúng ta cần nhập các phụ thuộc của mình:

nhập hệ điều hành

# Khắc phục sự cố trong quá trình đào tạo oN GPU os.environ ['CUDA_VISIBLE_DEVICES'] = '' nhập tensorflow dưới dạng tf nếu tf.test.gpu_device_name (): print ('Tìm thấy GPU') else: print ("Không tìm thấy GPU") from keras.preprocessing.image import ImageDataGenerator từ keras.preprocessing import image từ keras.models import Sequential từ keras.layers import Conv2D, MaxPooling2D from keras.layers import Activation, Dropout, Flatten, Dense from keras import backend as K from PIL import Image nhập numpy dưới dạng np

Tiếp theo, chúng ta cần xác định mô hình của mình:

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 = (3, img_shape) else: (3, img_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 (Kích hoạt ('relu')) model.add (MaxPooling2D (pool_size = (2, 2)))).add (Conv2D (64, (2, 2))) model.add (Kích hoạt ('relu')) model.add (MaxPooling2D (pool_size = (2, 2))) model.add (Flatten ()) model. add (Dense (64)) model.add (Activation ('relu')) model.add (Dropout (0.5)) model.add (Dense (1)) model.add (Activation ('sigmoid')) model.compile (loss = 'binary_crossentropy', Optimizer = 'rmsprop', metrics = ['precision'])

Tôi đã đào tạo mô hình cho bạn, nhưng nếu bạn muốn tự đào tạo mô hình, trên tập dữ liệu của riêng bạn, thì tôi đã đính kèm mã đào tạo. Nếu không, bạn có thể tải xuống tệp HDF5 của mô hình được đào tạo. Do các hạn chế của tệp Guiductables, tôi đã phải đổi tên nó bằng phần mở rộng ".txt". Để sử dụng nó, hãy đổi tên tệp thành phần mở rộng ".h5" và tải nó bằng mã sau:

model.load_weights ("model_saved.h5")

Để sử dụng mạng để dự đoán không gian-y của một hình ảnh như thế nào, chúng tôi sẽ xác định hàm này:

dự đoán def (image_path):

img = image.load_img (image_path, target_size = (1000, 500)) img = np.expand_dims (img, axis = 0) result = model.posystem_classes (img) trả về kết quả [0] [0]

Bước 4: Xử lý hình ảnh

Tổng quat

Để xử lý hình ảnh, tôi đang sử dụng thư viện OpenCV (cv2). Đầu tiên, chúng tôi sẽ làm mờ các cạnh của hình ảnh, sau đó chúng tôi sẽ xóa nền bằng cách tạo mặt nạ và thay đổi các giá trị alpha của các màu tối hơn

Mật mã

Đây là một phần của hàm làm mờ các cạnh:

def processImage (img):

RADIUS = 20 # Mở hình ảnh im = Image.open ("pilbuffer.png") # Dán hình ảnh trên nền trắng diam = 2 * RADIUS back = Image.new ('RGB', (im.size [0] + diam, im.size [1] + diam), (0, 0, 0)) back.paste (im, (RADIUS, RADIUS)) # Tạo mặt nạ mờ = 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) mặt nạ. paste (blck, (diam, diam)) # Làm mờ hình ảnh và dán cạnh mờ theo mặt nạ mờ = back.filter (ImageFilter. GaussianBlur (RADIUS / 2)) back.paste (làm mờ, mặt nạ = mặt nạ) back.save (" chuyển đổi.png ") back.close ()

Tiếp theo, chúng tôi sẽ đặt màu tối hơn thành trong suốt và lưu hình ảnh tạm thời:

# Tạo mặt nạ và bộ lọc thay thế màu đen bằng alpha

image = cv2.imread ("transfer.png") hMin = 0 sMin = 0 vMin = 20 hMax = 180 sMax = 255 vMax = 255 Lower = np.array ([hMin, sMin, vMin]) upper = np.array ([hMax, sMax, vMax]) hsv = cv2.cvtColor (image, cv2. COLOR_BGR2HSV) mask = cv2.inRange (hsv, under, upper) output = cv2.bitwise_and (image, image, mask = mask) * _, alpha = cv2.split (output) dst = cv2.merge ((output, alpha)) output = dst with open ("buffer.png", "w +") as file: pass cv2.imwrite ("buffer.png", output)

Bước 5: Ghép các hình ảnh lại với nhau thành một phép chiếu hình chữ nhật tương đương

Tổng quat

Chức năng này lấy nhiều hình ảnh và ghép chúng thành một định dạng có thể được giải thích bởi gói PhotoSphere.js, sử dụng thư viện PIL (gối)

Mật mã

Đầu tiên, chúng ta cần tạo một hình ảnh có thể hoạt động như một máy chủ lưu trữ cho các hình ảnh khác:

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

Tiếp theo, chúng ta cần lặp qua mảng hình ảnh (tất cả đã được thay đổi kích thước thành 1000x500) và đặt chúng vào hình ảnh:

h = 0

w = 0 i = 0 cho img trong img_arr: new.paste (img, (w, h), img) w + = 1000 nếu w == 8000: h + = 500 w = 0 i + = 1

Bây giờ chúng ta chỉ gói gọn điều này trong một hàm lấy một mảng hình ảnh làm đối số của nó và trả về hình ảnh mới:

def stitch_beta (img_arr):

new = Image.new ("RGBA", (8000, 4000), color = (0, 0, 0)) h = 0 w = 0 i = 0 cho img trong img_arr: new.paste (img, (w, h), img) w + = 1000 nếu w == 8000: h + = 500 w = 0 i + = 1 trả về mới

Bước 6: Tập lệnh Python đầy đủ

Đây là toàn bộ tập lệnh mạng thần kinh python, được lưu dưới dạng net.py và được nhập vào tập lệnh chính:

# nhập thư viện

import os #Fix cho sự cố trong bước đào tạo oN GPU os.enosystem ['CUDA_VISIBLE_DEVICES'] = '' nhập tensorflow dưới dạng tf nếu tf.test.gpu_device_name (): print ('Tìm thấy GPU') else: print ("Không tìm thấy GPU ") từ keras.preprocessing.image import ImageDataGenerator từ keras.preprocessing import image từ keras.models import Sequential từ keras.layers import Conv2D, MaxPooling2D from keras.layers import Activation, Dropout, Flatten, Dense from keras import backend as K from PIL import Hình ảnh vô số Nhập dưới dạng 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 ': 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 (Kích hoạt ('relu')) model.add (MaxPooling2D (pool_size = (2, 2))) model.add (Conv2D (32, (2, 2)))). thêm (Kích hoạt ('relu')) model.add (MaxPooling2D (pool_size = (2, 2))) model.add (Conv2D (64, (2, 2))) model.add (Kích hoạt ('relu')) model.add (MaxPooling2D (pool_size = (2, 2))) model.add (Flatten ()) model.add (Dense (64)) model.add (Activation ('relu')) model.add (Dropout (0.5) ("model_saved.h5") dự đoán def (image_path): img = image.load_img (image_path, target_size = (1000, 500)) img = np.expand_dims (img, axis = 0) result = model.posystem_classes (img) trả về kết quả [0] [0]

Đây là tệp python chính, api.py:

yêu cầu nhập, hệ thống, ngẫu nhiên, urllib.parse, cv2

from PIL import Image, ImageFilter from io import BytesIO import numpy as np import net def get_image_search (num, cluster): count = 0 img_arr = for arg trong cụm từ: print (arg) print (f "Số lượng hình ảnh hiện tại: {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'] cho kết quả trong results.json () [" collection "] [" items "] print (len (data)) if num> len (data): num = len (data) trong khi count = num: break print (f "\ n {count} hình ảnh được truy xuất") return img_arr def stitch_beta (img_arr): new = Image.new ("RGBA", (8000, 4000), color = (0, 0, 0)) h = 0 w = 0 i = 0 cho img trong img_arr: # pbar.set_description (f "Đang xử lý hình ảnh {i + 1}") new.paste (img, (w, h), img) w + = 1000 nếu w == 8000: h + = 500 w = 0 i + = 1 return new def process Hình ảnh (img): RADIUS = 20 # Mở hình ảnh im = Image.open ("pilbuffer.png") # Dán hình ảnh trên nền trắng mờ = 2 * RADIUS back = Image.new ('RGB', (im.size [0] + diam, im.size [1] + diam), (0, 0, 0)) back.paste (im, (RADIUS, RADIUS)) # Tạo mặt nạ mờ = 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) mask.paste (blck, (diam, diam)) # Làm mờ hình ảnh và dán cạnh mờ theo mặt nạ mờ = back.filter (ImageFilter. GaussianBlur (RADIUS / 2)) back.paste (mờ, mặt nạ = mặt nạ) back.save ("chuyển đổi.png") back.close () # Tạo mặt nạ và bộ lọc thay thế màu đen bằng alpha image = cv2.imread (" quá cảnh ion.png ") hMin = 0 sMin = 0 vMin = 20 hMax = 180 sMax = 255 vMax = 255 low = np.array ([hMin, sMin, vMin]) upper = np.array ([hMax, sMax, vMax]) hsv = cv2.cvtColor (image, cv2. COLOR_BGR2HSV) mask = cv2.inRange (hsv, under, upper) output = cv2.bitwise_and (image, image, mask = mask) * _, alpha = cv2.split (output) dst = cv2.merge ((output, alpha)) output = dst with open ("buffer.png", "w +") as file: pass cv2.imwrite ("buffer.png", output) #Edge phát hiện và làm mờ nếu _name_ == "_main_": search_terms = ["siêu tân tinh", "hành tinh", "thiên hà", "dải ngân hà", "tinh vân", "sao"] # Các cụm từ tìm kiếm có thể được thay đổi thành bất kỳ điều gì bạn muốn cung thiên văn đưa vào img_arr = get_image_search (64, search_terms) print ("Hình ảnh được truy xuất và lọc thần kinh") img = stitch_beta (img_arr) print ("Hình ảnh được ghép") img.save ("Khâu.png")

Bước 7: Ứng dụng Electron

Tổng quat

Chúng tôi sẽ tạo một ứng dụng điện tử đơn giản chỉ định vị và tải phần tử PhotoSphere. Các tệp main.js và package.json là trực tiếp từ trang web Electron và HTML là phiên bản sửa đổi một chút của HTML được cung cấp trên trang web PhotoSphere. Tôi đã bao gồm các tệp, nhưng đã đổi tên tất cả thành.txt, vì Guiductables không cho phép các loại tệp này. Để sử dụng các tệp, hãy đổi tên chúng bằng phần mở rộng thích hợp.

Mật mã

main.js

const {app, BrowserWindow} = request ('electron')

function createWindow () {const win = new BrowserWindow ({width: 800, height: 600, webPreferences: {nodeIntegration: true}}) win.loadFile ('index.html')} app.whenReady (). then (createWindow) app.on ('window-all-closed', () => {if (process.platform! == 'darwin') {app.quit ()}}) app.on ('kích hoạt', () => {if (BrowserWindow.getAllWindows (). length === 0) {createWindow ()}})

package.json

{

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

index.html

Bước 8: Thực hiện

Tạo hình ảnh hình chữ nhật tương đương

Để tạo hình ảnh, hãy chạy tập lệnh api.py trong dấu nhắc lệnh, với môi trường ảo được kích hoạt:

api.py

Sau khi các tập lệnh thực thi xong, hãy chạy ứng dụng electron bằng:

npm bắt đầuThì đấy! Cung thiên văn của bạn đang hoạt động! Cảm ơn vì đã đọc:)

Đề xuất: