Агуулгын хүснэгт:

Python, Electron, Keras ашиглан мэдрэлийн сүлжээгээр ажилладаг планетариум: 8 алхам
Python, Electron, Keras ашиглан мэдрэлийн сүлжээгээр ажилладаг планетариум: 8 алхам

Видео: Python, Electron, Keras ашиглан мэдрэлийн сүлжээгээр ажилладаг планетариум: 8 алхам

Видео: Python, Electron, Keras ашиглан мэдрэлийн сүлжээгээр ажилладаг планетариум: 8 алхам
Видео: Keras with TensorFlow Course - Python Deep Learning and Neural Networks for Beginners Tutorial 2024, Арваннэгдүгээр
Anonim
Python, Electron, Keras ашиглан мэдрэлийн сүлжээгээр ажилладаг планетариум
Python, Electron, Keras ашиглан мэдрэлийн сүлжээгээр ажилладаг планетариум

Энэхүү зааварчилгаанд би Python, Electron ашиглан автомат 3D планетарийн генератор хэрхэн бичсэнээ харуулах болно

Дээрх видеон дээр санамсаргүй гаригуудын нэгийг үүсгэсэн програмыг харуулжээ.

** Тэмдэглэл: Энэ програм нь төгс төгөлдөр биш бөгөөд зарим газарт тийм ч питоник биш юм. Мэдрэлийн сүлжээний ялгаварлан гадуурхагч нь ердөө ~ 89% үнэн зөв байдаг тул зарим сондгой зургууд түүнийг гаригийн ертөнцөд оруулах болно **

Тодорхойлолт

Планетариум нь сансар огторгуйтай холбоотой зургуудыг авахын тулд NASA API-аас асууж, зургийг боловсруулахад тохиромжтой эсэхийг тодорхойлохын тулд мэдрэлийн мэдрэлийн сүлжээг ашигладаг. Дараа нь програм нь OpenCV -ийг ашиглан зургийн арын дэвсгэрийг арилгаж, эцэст нь зургийг нэг том тэгш өнцөгт дүрс болгон оёдог. Дараа нь энэ зургийг хадгалж, Electron Node.js програм нь зургийг нээж, PhotoSphere.js багцыг ашиглан зургийг planetarium загварын 3D форматаар үзэх боломжтой.

Хараат байдал

Python:

  • Керас
  • Дэр
  • cv2
  • Бүдүүн
  • Хүсэлт
  • urllib
  • Санамсаргүй
  • цаг
  • io

Электрон:

PhotoSphere

Алхам 1: Хүрээлэн буй орчноо тохируулах

Электрон ба Python суулгах

Эхлээд node.js болон npm суулгасан эсэхээ шалгаарай (хэрэв байхгүй бол эндээс татаж авч болно)

Дараа нь та Electron -ийг суулгах хэрэгтэй. Тушаал хүлээх мөрийг нээгээд дараах тушаалыг оруулна уу.

npm электрон -g суулгана уу

Дараа нь танд эндээс татаж авах боломжтой питон хэрэгтэй болно

Виртуал орчныг тохируулах

Командын мөрийг нээгээд виртуал орчноо тохируулахын тулд дараах тушаалуудыг оруулна уу.

pip virtualenv суулгана уу

виртуал орон зай

cd зай

скрипт / идэвхжүүлэх

Python хамаарлыг суулгах

Python хамааралтай байдлаа суулгахын тулд эдгээр тушаалуудыг тушаалын мөрөнд ажиллуулна уу.

пипийг керас суулгах

pip дэр суулгах

pip суулгах numpy

pip суулгах хүсэлт

opencv-python-ийг суулгахХэрэв та сүлжээг өөрөө сургахыг хүсч байвал Keras -ийн GPU хурдатгалыг тохируулаарай

Алхам 2: NASA хайлтын API -г хайж байна

Тойм

НАСА -д төслүүддээ ашиглах боломжтой маш олон ашигтай API байдаг. Энэ төслийн хувьд бид NASA-ийн зургийн мэдээллийн сангаас сансарт хамааралтай зургийг хайх боломжийг олгодог хайлтын API-ийг ашиглах болно.

Код

Нэгдүгээрт, бид хайлтын нэр томъёо болох аргументыг хүлээн авахын тулд python функцийг тодорхойлох хэрэгтэй.

def get_image_search (хэллэг):

дамжуулах

Дараа нь бид хайлтын нэр томъёог URL формат руу хөрвүүлж, API -г асуухын тулд хүсэлтийн санг ашиглана.

def get_image_search (хэллэг):

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

Эцэст нь бид API бидэнд буцааж өгсөн цуглуулга+JSON мөрийг тайлж, хайлтын нэр томъёотой холбоотой зургуудын линкүүдийн жагсаалтыг гаргаж авах болно.

def get_image_search (хэллэг):

params = {"q": urllib.parse.quote (arg), "media_type": "image"} results = requests.get ("https://images-api.nasa.gov/search", params = params) data = [үр дүн ['href'] үр дүнгийн үр дүнг.json () ["цуглуулга"] ["зүйлс"]

Бид тийшээ явлаа! Бидэнд одоо NASA -ийн зураг хайх API -г асууж, хайлтын нэр томъёотой холбоотой зургуудын линкүүдийн жагсаалтыг буцааж өгөх кодын хэсэг байна.

Алхам 3: Хувьсгалын мэдрэлийн сүлжээ

Тойм

Мэдрэлийн сүлжээний үүрэг бол дүрс нь орон зайд ямар нэгэн зүйл байгаа эсэхийг ангилах явдал юм. Үүнийг хийхийн тулд бид мэдрэлийн мэдрэлийн сүлжээ буюу CNN-ийг ашиглан зураг дээрх матрицын хэд хэдэн үйлдлийг хийж, зай-y хэр байгааг тодорхойлох болно. Би энэ бүгдийг тайлбарлахгүй, учир нь үүний цаана маш олон онол байдаг, гэхдээ хэрэв та мэдрэлийн сүлжээний талаар мэдэхийг хүсч байвал "Машины сургалтын ур чадвар" -ыг санал болгож байна.

Код

Нэгдүгээрт, бид хамааралтай байдлаа импортлох хэрэгтэй.

импортлох os

GPU os.environ галт тэрэгний алхах үеийн асуудлыг засах #[CUDA_VISIBLE_DEVICES '] =' 'tf.test.gpu_device_name (): хэвлэх (' GPU олдсон ') өөр: хэвлэх ("GPU олдсонгүй") keras. np гэж numpy импортлох

Дараа нь бид загвараа тодорхойлох хэрэгтэй.

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), im_shape_ (3) = (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')) загвар.add (MaxPooling2D (pool_size = (2, 2))) загвар.add (Conv2D (64, (2, 2))) model.add (Идэвхжүүлэх ('relu')) загвар.add (MaxPooling2D (pool_size = (2, 2))) загвар.add (Flatten ()) загвар. add (Нягт (64)) model.add (Идэвхжүүлэх ('relu')) загвар (алдагдал = 'binary_crossentropy', оновчлогч = '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, тэнхлэг = 0) үр дүн = model.predict_classes (img) буцах үр дүн [0] [0]

Алхам 4: Зургийг боловсруулах

Тойм

Зураг боловсруулахад би OpenCV (cv2) номын санг ашиглаж байна. Нэгдүгээрт, бид зургийн ирмэгийг бүдгэрүүлж, дараа нь маск хийж, бараан өнгөний альфа утгыг өөрчлөх замаар арын дэвсгэрийг арилгах болно.

Код

Энэ бол ирмэгийг бүдгэрүүлэх функцийн хэсэг юм.

def processImage (img):

RADIUS = 20 # Зураг нээх im = Image.open ("pilbuffer.png") # Зургийг цагаан дэвсгэр дээр буулгах diam = 2 * RADIUS back = Image.new ('RGB', (im.size [0] + diam, im.size [1] + diam), (0, 0, 0)) back.paste (im, (RADIUS, RADIUS)) # # Бүдгэрүүлэх маск үүсгэх = 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)) # Зургийг бүдгэрүүлж, маскны дагуу бүдгэрсэн ирмэгийг буулгах = буцах. шүүлтүүр (ImageFilter. GaussianBlur (RADIUS / 2)) буцах. switch-p.webp

Дараа нь бид бараан өнгийг ил тод болгож, зургийг түр хадгалах болно.

#Маск, шүүлтүүр үүсгээд харыг альфаар солино

image = cv2.imread ("switch.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+") in file: pass cv2.imwrite ("buffer.png", output))

Алхам 5: Дүрсийг тэгш өнцөгт проекц болгон оёх

Тойм

Энэ функц нь олон зураг авч, тэдгээрийг PIL (дэр) номын санг ашиглан PhotoSphere.js багцаар тайлбарлаж болох формат болгон оёдог.

Код

Нэгдүгээрт, бид бусад зургуудын хост болж чадах дүрсийг бүтээх хэрэгтэй.

new = Image.new ("RGBA", (8000, 4000), өнгө = (0, 0, 0))

Дараа нь бид зургийн массивыг давтаж (бүгдийг нь 1000x500 болгон өөрчилсөн) зурган дээр байрлуулах хэрэгтэй.

h = 0

w = 0 i = 0 img_arr: new.paste (img, (w, h), img) w += 1000 бол w == 8000: h += 500 w = 0 i += 1

Одоо бид үүнийг олон тооны зургуудыг аргумент болгон авч, шинэ дүрсийг буцааж өгөх функцээр ороосон болно.

def stitch_beta (img_arr):

new = Image.new ("RGBA", (8000, 4000), color = (0, 0, 0)) h = 0 w = 0 i = 0 in img_arr: new.paste (img, (w, h), img) w += 1000 бол w == 8000: h += 500 w = 0 i += 1 шинэ буцах

Алхам 6: Бүрэн Python скрипт

Энэ бол net.py хэлбэрээр хадгалагдаж, үндсэн скриптэд импортлогдсон бүрэн python мэдрэлийн сүлжээний скрипт юм.

# номын сан импортлох

GPU os.environ -ийн галт тэрэгний алхамын үед гарах асуудлыг импортлох #засварлах ['CUDA_VISIBLE_DEVICES'] = '' tf.test.gpu_device_name (): хэвлэх ('GPU олдсон') өөр: хэвлэх ("GPU олдсонгүй ") keras.preprocessing.image -аас импортлох ImageDataGenerator keras -аас импортлох зураг keras.models импортлох keras.layers -ээс дараалсан импорт Conv2D, keras.layers -аас MaxPooling2D импортлох, идэвхжүүлэх, хаях, хавтгайруулах импорт Зургийн импорт_pg_thid = 1000, 500 train_data_dir = 'v_data/train' validation_data_dir = 'v_data/test': 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 (Идэвхжүүлэх ('relu')) model.add (MaxPooling2D (pool_size = (2, 2))) model.add (Conv2D (32, (2, 2))) загвар. add (Activation ('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 (Flatten ()) model.add (Dense (64)) model.add (Activation ('relu')) model.add (Dropout (0.5))) model.add (Нягт (1)) model.add (Идэвхжүүлэх ('sigmoid')) загвар. эмхэтгэх (loss = 'binary_crossentropy', optimizer = 'rmsprop', хэмжүүрүүд = ['нарийвчлал']) model.load_weights ("model_saved.h5") def урьдчилсан таамаглал (image_path): img = image.load_img (image_path, target_size = (1000, 500)) img = np.expand_dims (img, тэнхлэг = 0) үр дүн = model.predict_classes (img) буцах үр дүн [0] [0]

Энэ бол api.py гэсэн үндсэн python файл юм:

импортын хүсэлт, sys, санамсаргүй, urllib.parse, cv2

PIL импортоос Зураг, io импортоос авсан ImageFilter BytesIO импортыг np импортоор цэвэр def get_image_search (тоо, хэллэг): count = 0 img_arr = arg in өгүүлбэр: print (arg) print (f "Одоогийн зургийн тоо: {count) } ") i = 0 params = {" q ": urllib.parse.quote (arg)," media_type ":" image "} үр дүн = request.get (" https://images-api.nasa.gov/search ", params = params) өгөгдөл = [үр дүн ['href'] үр дүнгийн үр дүнгийн хувьд.json () [" цуглуулга "] [" зүйлс "] хэвлэх (len (өгөгдөл)) хэрэв num> len (мэдээлэл): num = len (өгөгдөл) тоолох үед = num: завсарлага хэвлэх (f "\ n {count} зураг сэргээгдсэн") буцах img_arr def stitch_beta (img_arr): new = Image.new ("RGBA", (8000, 4000), color = (0, 0, 0)) img_arr дахь img -ийн хувьд h = 0 w = 0 i = 0: #pbar.set_description (f "Зургийг боловсруулж байна {i +1}") шинэ.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 буцаж = Image.new ('RGB', (im.size [0] + diam, im.size [1] + diam), (0, 0, 0)) back.paste (im, (RADIUS), RADIUS)) # Бүдгэрүүлэх маск үүсгэх = 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)) # # Зургийг бүдгэрүүлж, маскны бүдэгрүүлэлтийн дагуу бүдгэрсэн ирмэгийг байрлуул = back.filter (ImageFilter. GaussianBlur (RADIUS / 2)) back.paste (blur, mask = mask) back.save ("o'tish.png") back.close () #Маск үүсгэх ба шүүлтүүрийг хараар сольж alpha image = 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 (зураг, дүрс, маск = маск) *_, альфа = cv2.split (гаралт) dst = cv2.merge ((гаралт, альфа)) гаралт = dst нээлттэй ("buffer.png", "w+") файл хэлбэрээр: cv2.imwrite нэвтрүүлэх ("buffer.png", гаралт) #Ирмэгийг илрүүлж, бүдгэрүүлэх _name_ == "_main_": search_terms = ["супернова", "гариг", "галактик", "сүүн зам", "мананцар", "одод"] #Хайлтын нэр томъёог планетарий оруулахыг хүссэн зүйл болгон өөрчилж болно. img_arr = get_image_search (64, search_terms) хэвлэх ("Зургийг сэргээж, мэдрэлийн аргаар шүүсэн") img = stitch_beta (img_arr) хэвлэх ("Зураг оёсон") img.save ("stitched.png")

Алхам 7: Электрон апп

Тойм

Бид PhotoSphere элементийг байрлуулж, ачаалах энгийн электрон програмыг бүтээх болно. Main.js болон package.json файлууд нь Electron вэбсайтаас шууд гардаг бөгөөд HTML нь PhotoSphere вэбсайт дээр байрлуулсан HTML -ийн бага зэрэг өөрчлөгдсөн хувилбар юм. Би файлуудыг оруулсан боловч Instructables нь эдгээр файлын төрлийг зөвшөөрдөггүй тул бүгдийг нь.txt болгон өөрчилсөн. Файлуудыг ашиглахын тулд тэдгээрийг зохих өргөтгөлөөр нэрлэнэ үү.

Код

үндсэн.js

const {апп, BrowserWindow} = шаардах ('электрон')

createWindow () {const win = new BrowserWindow ({өргөн: 800, өндөр: 600, webPreferences: {nodeIntegration: true}}) win.loadFile ('index.html')} app.whenReady () функц, дараа нь (createWindow) app.on ('цонх-бүх хаалттай', () => {if (process.platform! == 'darwin') {app.quit ()}}) app.on ('идэвхжүүлэх', () => {if (BrowserWindow.getAllWindows (). length === 0) {createWindow ()}})

багц.json

{

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

индекс.html

Алхам 8: Гүйцэтгэл

Тэгш өнцөгт дүрсийг бүтээх

Зургийг үүсгэхийн тулд api.py скриптийг командын мөрөнд ажиллуулж виртуал орчноо идэвхжүүлнэ үү.

api.py

Скриптүүд ажиллаж дууссаны дараа электрон програмыг ажиллуулна уу:

npm эхлэхВоила! Таны планетарий идэвхтэй байна! Уншсанд баярлалаа:)

Зөвлөмж болгож буй: