Python, Electron жана Keras колдонулган нейрон тармагы менен иштеген планетарий: 8 кадам
Python, Electron жана Keras колдонулган нейрон тармагы менен иштеген планетарий: 8 кадам
Anonim
Нейрон тармагы Python, Electron жана Keras менен иштеген планетарий
Нейрон тармагы Python, Electron жана Keras менен иштеген планетарий

Бул көрсөтмөдө мен Python жана Electron аркылуу автоматтык 3D планетарий генераторун кантип жазганымды көрсөтөм

Жогорудагы видео программаны түзгөн туш келди планетарийлердин бирин көрсөтөт.

** Эскертүү: Бул программа эч кандай идеалдуу эмес жана кээ бир жерлерде анча питоникалык эмес. Нейрон таза дискриминатор ~ 89% так, андыктан кээ бир кызык сүрөттөр аны планетарийге киргизет **

Өзгөчөлүктөр

Планетарий космоско байланыштуу сүрөттөр үчүн NASA API сурайт жана сүрөттү иштетүүгө ылайыктуу экендигин аныктоо үчүн конволюциялык нейрон тармагын колдонот. Андан кийин программа OpenCVди колдонуп, сүрөттөн фонду алып салат жана акыры сүрөттөр бир чоң төрт бурчтуу сүрөткө бириктирилет. Бул сүрөт кийин сакталат жана Electron Node.js тиркемеси сүрөттү ачат жана планетарий стилиндеги 3D форматында сүрөттү көрүү үчүн PhotoSphere.js пакетин колдонот.

Көз карандылыктар

Python:

  • Keras
  • Жаздык
  • cv2
  • Напси
  • Сурамдар
  • urllib
  • Random
  • убакыт
  • io

Электрон:

PhotoSphere

1 -кадам: Сиздин чөйрөнү орнотуу

Electron жана Python орнотуу

Биринчиден, сизде node.js жана npm орнотулганын текшериңиз (эгер жок болсо, бул жерден жүктөп алсаңыз болот)

Андан кийин, сиз Electron орнотушуңуз керек. Командалык кеңешти ачыңыз жана төмөнкү буйрукту киргизиңиз:

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

Андан кийин, бул жерде жүктөп алса болот python керек

Виртуалдык чөйрөнү орнотуу

Виртуалдык чөйрөңүздү орнотуу үчүн буйрук көрсөтмөсүн ачыңыз, андан кийин төмөнкү буйруктарды киргизиңиз:

pip virtualenv орнотуу

virtualenv мейкиндиги

CD боштук

scripts / activate

Python көз карандылыктарын орнотуу

Python көз карандылыгыңызды орнотуу үчүн бул буйруктарды буйрук сабында иштетиңиз:

пип керас орнотуу

жаздык орнотуу

pip орнотуу numpy

пип орнотуу сурамдары

opencv-python орнотууЭгерде сиз тармакты өзүңүз үйрөткүңүз келсе, Keras үчүн GPU ылдамдатуусун орнотууну унутпаңыз

2 -кадам: NASA Search APIге суроо

Обзор

NASAда чындыгында көптөгөн пайдалуу APIлер бар, аларды сиз долбоорлоруңуз менен колдоно аласыз. Бул долбоор үчүн биз космоско байланыштуу сүрөттөр үчүн NASAнын сүрөт базасын издөөгө мүмкүндүк берген издөө API колдонобуз.

Кодекс

Биринчиден, биз издөө термининин милдетин аткара турган аргументти кабыл алуу үчүн python функциясын аныкташыбыз керек:

def get_image_search (сөз айкашы):

өтүү

Андан кийин, биз издөө терминин URL форматына айландырабыз, андан кийин APIлерди суроо үчүн китепкананы колдонобуз:

def get_image_search (сөз айкашы):

params = {"q": urllib.parse.quote (arg), "media_type": "image"} натыйжалар = request.get ("https://images-api.nasa.gov/search", params = параметтер)

Акыр -аягы, биз API бизге кайтарып берген+JSON сабынын кодун чечебиз жана издөө терминине байланыштуу сүрөттөргө шилтемелердин тизмесин чыгарабыз:

def get_image_search (сөз айкашы):

params = {"q": urllib.parse.quote (arg), "media_type": "image"} натыйжалар = request.get ("https://images-api.nasa.gov/search", params = параметтер) data = [натыйжа ['href'] жыйынтыкка жетүү үчүн.json () ["коллекция"] ["пункттар"]

Мына биз барабыз! Азыр бизде NASAнын сүрөт издөө APIсине суроо салып, издөө терминибизге байланыштуу сүрөттөргө шилтемелердин тизмесин кайтара ала турган коддун үзүндүсү бар.

3 -кадам: Конволюциялык нейрон тармагы

Обзор

Нейрон тармагынын милдети - бул космостогу бир нерсенин сүрөтүн же жок экенин классификациялоо. Бул үчүн, биз конвульсивдүү нейрон тармагын же CNNди колдонуп, сүрөттөгү бир катар матрицалык операцияларды аткарабыз жана мейкиндиктин кандай экенин аныктайбыз. Мен мунун баарын түшүндүрбөйм, анткени анын артында көп теория бар, бирок эгер сиз нейрон тармактары жөнүндө билгиңиз келсе, мен "Machine Learning Mastery" сунуштайм.

Кодекс

Биринчиден, биз көз карандылыгыбызды импорттошубуз керек:

импорт os

GPU os.environ поездиндеги кадамдардагы көйгөйдү чечүү ['CUDA_VISIBLE_DEVICES'] = '' tf.test.gpu_device_name (): басып чыгаруу ('GPU табылды') башка: басып чыгаруу ("GPU табылган жок") keras.preprocessing.image импорттоо keras.preprocessing импорттук сүрөт keras.models импорттоо keras.layers келген Conv2D, MaxPooling2D keras.layers импорттоо Activation, Dropout, Flatten, Dens PAS импорттук сүрөтүнөн K катары 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) = (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))) модель.add (Conv2D (64, (2, 2))) model.add (Activation ('relu')) model.add (MaxPooling2D (pool_size = (2, 2))) model.add (Flatten ()) модель. кошуу (Тыгыз (64)) model.add (Активация ('relu')) model.add (Окууну таштоо (0.5)) model.add (Тыгыз (1)) model.add (Активизация ('sigmoid')) model.compile (жоготуу = '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] + диам, im.size [1] + диаметри), (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)) # Сүрөттү бүдөмүктөтүү жана маскага ылайык бүдөмүк четин чаптоо blur = back.filter (ImageFilter. GaussianBlur (RADIUS / 2)) back.paste (blur, mask = mask) back.save (" өткөөл-p.webp

Андан кийин, кара түстөрдү тунук кылып коюп, сүрөттү убактылуу сактайбыз:

#Маска түзүңүз жана чыпканы кара түстү альфа менен алмаштырыңыз

image = cv2.imread ("o'tish.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 -кадам: Бирдей Тик бурчтуу проекцияга сүрөттөрдү бириктирүү

Обзор

Бул функция бир нече сүрөттөрдү алат жана аларды PIL (жаздык) китепканасын колдонуп, PhotoSphere.js пакети менен чечмелене турган форматка тигет.

Кодекс

Биринчиден, биз башка сүрөттөр үчүн хосттун ролун аткара турган сүрөттү түзүүбүз керек:

жаңы = Image.new ("RGBA", (8000, 4000), түс = (0, 0, 0))

Андан кийин, биз сүрөттөрдүн массивин кайталашыбыз керек (бардыгы 1000x500 өлчөмүнө өзгөртүлгөн) жана аларды сүрөттө жайгаштыруу керек:

h = 0

img_arr ичиндеги img үчүн w = 0 i = 0: 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 img_arr ичиндеги img үчүн: new.paste (img, (w, h), img) w += 1000 if w == 8000: h += 500 w = 0 i += 1 new return

6 -кадам: Толук Python Script

Бул net.py катары сакталган жана негизги скриптке импорттолгон python нейрон тармагынын толук скрипти:

# китепканаларды импорттоо

импорт os #Fix поезд баскычында GPU os.environ ['CUDA_VISIBLE_DEVICES'] = '' tf.test.gpu_device_name (): басып чыгаруу ('GPU табылган') башка: басып чыгаруу ("GPU табылган жок) ") keras.preprocessing.image импорттоо keras.preprocessing keras.models импорттук сүрөт keras.layers импорттоо Sequential kerv.layers Conv2D, MaxPooling2D keras.layers импорттоо Activation, Dropout, Flatten, Dens from keras import backend from PIL импорт Сүрөт импорту 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 if K.imatf (=) if format: 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))) модель. кошуу (Жандандыруу ('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')) model.compile (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]

Бул башкы python файлы, api.py:

импорттук сурамдар, sys, random, urllib.parse, cv2

PIL импорттоо Сүрөтүнөн, ImageFilter io импортунан BytesIO импорт numpy катары np импорт таза def get_image_search (сан, фраза): count = 0 img_arr = аргумент менен айтканда: 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) data = [result ['href'] results in result.json () [" collection "] [" items "] print (len (data)) if if> len (data): num = len (маалыматтар) санап жатканда = num: үзгүлтүксүз басып чыгаруу (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 үчүн: #pbar.set_description (f "Сүрөт иштетилүүдө {i +1}") жаңы.паста (img, (w, h), img) w += 1000 эгер w == 8000: h += 500 w = 0 i += 1 new def процессине кайтуу Сүрөт (img): RADIUS = 20 # Сүрөттү ачуу im = Image.open ("pilbuffer.png") # Сүрөттү ак фондук диаметке чаптоо = 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] + диам, im.size [1] + диам), 255) blck = Image.new ('L', (im.size [0] - диаметри, im.size [1] - диам), 0) маска.паста (blck, (diam, diam)) # Сүрөттү бүдөмүктөтүү жана маска blur = артка чыпкалоо боюнча бүдөмүк четин чаптоо (ImageFilter. GaussianBlur (RADIUS / 2)) back.paste (blur, mask = mask) back.save ("o'tish.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 ((output, alpha)) output = dst with open ("buffer.png", "w+") as file: pass cv2.imwrite ("buffer.png", output) #Edge Detection and blurring if _name_ == "_main_": search_terms = ["супернова", "планета", "галактика", "саманчынын жолу", "тумандуулук", "жылдыздар"] #Издөө терминдерин планетарийге кошууну каалаган нерсеге өзгөртүүгө болот. img_arr = get_image_search (64, search_terms) басып чыгаруу ("Сүрөттөр алынды жана нейрон чыпкаланган") img = stitch_beta (img_arr) басып чыгаруу ("Сүрөттөр тигилген") img.save ("stitched.png")

7 -кадам: Electron App

Обзор

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

Кодекс

main.js

const {колдонмо, BrowserWindow} = талап кылуу ("электрон")

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

package.json

{

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

index.html

8 -кадам: Аткаруу

Тең тик бурчтуу сүрөттү түзүү

Сүрөттү түзүү үчүн, api.py скриптин командалык сапта иштетип, анын виртуалдык чөйрөсү иштетилген:

api.py

Скрипттер аткарылып бүткөндөн кийин, электрондук колдонмону иштетүү:

npm башталышыVoila! Сиздин планетарий активдүү! Окуу үчүн рахмат:)

Сунушталууда: