Նեյրոնային ցանցի վրա աշխատող մոլորակ ՝ օգտագործելով Python, Electron և Keras: 8 քայլ
Նեյրոնային ցանցի վրա աշխատող մոլորակ ՝ օգտագործելով Python, Electron և Keras: 8 քայլ
Anonim
Նեյրոնային ցանցի վրա աշխատող մոլորակ ՝ օգտագործելով Python, Electron և Keras
Նեյրոնային ցանցի վրա աշխատող մոլորակ ՝ օգտագործելով Python, Electron և Keras

Այս ուսանելի հոդվածում ես ձեզ ցույց կտամ, թե ինչպես եմ գրել ավտոմատ 3D մոլորակային գեներատոր ՝ օգտագործելով Python և Electron:

Վերոնշյալ տեսանյութը ցույց է տալիս ծրագրի ստեղծած պատահական մոլորակներից մեկը:

** Նշում. Այս ծրագիրը ոչ մի կերպ կատարյալ չէ, և որոշ տեղերում ոչ շատ պիթոնիկ: Նյարդային ցանցի խտրականությունը ճշգրիտ է միայն% 89% -ով, այնպես որ որոշ տարօրինակ պատկերներ այն կհայտնվեն մոլորակում **

Առանձնահատկություններ

Պլանետարիումը տիեզերքի հետ կապված պատկերների համար հարցնում է NASA- ի API- ն և օգտագործում է կոնվոլյուցիոն նյարդային ցանց `որոշելու համար, թե արդյոք պատկերը պիտանի է մշակման համար: Theրագիրը այնուհետև օգտագործում է OpenCV ՝ ֆոնը պատկերից հեռացնելու համար, և վերջապես պատկերները միասին կարված են մեկ մեծ ուղղանկյուն պատկերի մեջ: Այս պատկերը այնուհետև պահվում է, և Electron Node.js հավելվածը բացում է պատկերը և օգտագործում PhotoSphere.js փաթեթը ՝ պատկերը պլանետարիումի ոճով 3D ձևաչափով դիտելու համար:

Կախվածություններ

Python:

  • Կերաս
  • Բարձ
  • cv2
  • Չարաճճի
  • Հարցումներ
  • ուրլիբ
  • Պատահական
  • ժամանակը
  • io

Էլեկտրոն:

Ֆոտոսֆերա

Քայլ 1: Ստեղծեք ձեր միջավայրը

Էլեկտրոնի և Python- ի տեղադրում

Նախ, համոզվեք, որ ունեք node.js և npm տեղադրված (եթե ոչ, կարող եք ներբեռնել այստեղ)

Հաջորդը, դուք պետք է տեղադրեք Electron: Բացեք հրամանի տողը և մուտքագրեք հետևյալ հրամանը.

npm տեղադրել էլեկտրոն -g

Հաջորդը, ձեզ հարկավոր է պիթոն, որը կարելի է ներբեռնել այստեղ

Վիրտուալ միջավայրի ստեղծում

Բացեք հրամանի տողը, այնուհետև մուտքագրեք հետևյալ հրամանները ՝ ձեր վիրտուալ միջավայրը կարգավորելու համար.

pip տեղադրել virtualenv

virtualenv տարածք

cd տարածք

սցենարներ / ակտիվացնել

Python- ի կախվածության տեղադրում

Գործարկեք այս հրամանները հրամանի տողում ՝ ձեր Python- ի կախվածությունները տեղադրելու համար.

pip տեղադրել keras

pip տեղադրել բարձ

pip տեղադրել numpy

pip տեղադրման հարցումներ

pip տեղադրել opencv-pythonԵթե ցանկանում եք ինքներդ պատրաստել ցանցը, համոզվեք, որ ստեղծեք GPU արագացում Keras- ի համար

Քայլ 2. NASA Search API- ի հարցումը

Ակնարկ

NASA- ն ունի իսկապես շատ օգտակար API- ներ, որոնք կարող եք օգտագործել ձեր նախագծերի հետ: Այս նախագծի համար մենք կօգտագործենք որոնման API- ն, որը թույլ է տալիս որոնել NASA- ի պատկերների տվյալների շտեմարանը տիեզերքի հետ կապված պատկերների համար:

Օրենսգիրքը

Նախ, մենք պետք է սահմանենք պիթոնի գործառույթ ՝ ընդունելու փաստարկ, որը հանդես կգա որպես որոնման տերմին.

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)

Ի վերջո, մենք կվերծանենք API- ի վերադարձած հավաքածուն+JSON տողը և կորզենք որոնման տերմինին առնչվող պատկերների հղումների ցուցակ.

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'] results in results.json () ["հավաքածու"] ["իրեր"]

Ահա մենք գնում ենք: Այժմ մենք ունենք կոդի հատված, որը կարող է հարցնել NASA- ի պատկերների որոնման API- ն և վերադարձնել մեր որոնման տերմինին առնչվող պատկերների հղումների ցանկը:

Քայլ 3. Կոնվոլյուցիոն նյարդային ցանց

Ակնարկ

Նեյրոնային ցանցի խնդիրն է դասակարգել ՝ պատկերը տարածության մեջ ինչ -որ բանի՞ է, թե՞ ոչ: Դա անելու համար մենք կօգտագործենք կոնվոլացիոն նյարդային ցանց կամ CNN ՝ պատկերի վրա մի շարք մատրիցային գործողություններ կատարելու և որոշելու, թե որքանով է այն տարածություն y: Այս ամենը չեմ բացատրի, քանի որ դրա հետևում շատ տեսություններ կան, բայց եթե ցանկանում եք սովորել նյարդային ցանցերի մասին, ես առաջարկում եմ «Մեքենայական ուսուցման վարպետություն»

Օրենսգիրքը

Նախ, մենք պետք է ներմուծենք մեր կախվածությունները.

ներմուծել os

#Խնդրի լուծում գնացքի ընթացքում GPU os.environ ['CUDA_VISIBLE_DEVICES'] = '' ներմուծել tensorflow որպես tf, եթե tf.test.gpu_device_name (): print ('GPU found') else: print ("GPU not found") keras.preprocessing.image ներմուծում ImageDataGenerator keras- ից: վերամշակում է ներմուծում պատկերը keras.models ներմուծում հաջորդական keras.layers ներմուծում Conv2D, MaxPooling2D keras.layers ներմուծում Ակտիվացում, Բաց թողնում, հարթեցում, keras- ից ներմուծում հետույք, ինչպես 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 = 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 (Ակտիվացում ('relu')) model.add (MaxPooling2D (pool_size = (2, 2)))) model.add (Flatten ()) մոդել ավելացնել (Խիտ (64)) model.add (Ակտիվացում ('relu')) model.add (Dropout (0.5)) model.add (Խիտ (1)) model.add (Activation ('sigmoid')) model.compile (կորուստ = 'binary_crossentropy', optimizer = 'rmsprop', metrics = ['ճշգրտություն])

Ես պատրաստել եմ մոդելը ձեզ համար, բայց եթե ցանկանում եք մոդելը ինքներդ պատրաստել ՝ ձեր սեփական տվյալների բազայի վրա, ապա ես կցել եմ վերապատրաստման ծածկագիրը: Հակառակ դեպքում, կարող եք ներբեռնել պատրաստված մոդելի HDF5 ֆայլը: Instructables ֆայլերի սահմանափակումների պատճառով ես ստիպված եղա այն վերանվանել «.txt» ընդլայնմամբ: Այն օգտագործելու համար ֆայլը վերանվանեք «.h5» ընդլայնման և բեռնեք այն այս ծածկագրով.

model.load_weights ("model_saved.h5")

Theանցը կանխատեսելու համար, թե որքան տարածություն ունի պատկերը, մենք կսահմանենք այս գործառույթը.

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 back = 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) դիմակ: կպցնել (blck, (diam, diam)) # Blur պատկերը և կպցնել blurred եզրը ըստ դիմակի blur = back.filter (ImageFilter. GaussianBlur (RADIUS / 2)) back.paste (blur, mask = mask) back.save (" tranzition-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- ի համար. 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), գույն = (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: Ամբողջական Python սցենարը

Սա պիթոնի նյարդային ցանցի ամբողջական սցենարն է, որը պահվում է որպես net.py և ներմուծվում հիմնական սցենարի մեջ.

# գրադարանների ներմուծում

ներմուծում ") keras.preprocessing.image ներմուծում ImageDataGenerator keras- ից: մշակում ներմուծման պատկերը keras.models ներմուծում հաջորդական keras.layers- ից ներմուծում Conv2D, MaxPooling2D keras.layers- ից ներմուծում ակտիվացում, Dropout, Flatten, Dense from keras ներմուծում հետամնաց, ինչպես 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 = ': 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 (ակտիվացում) ('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 (Խիտ (64)) model.add (Ակտիվացում ('relu')) model.add (Բաց թողնում (0.5)) model.add (Խիտ (1)) model.add (Ակտիվացում ('sigmoid')) model.compile (loss = 'binary_crossentropy', optimizer = 'rmsprop', metrics = ['ճշգրտություն']) 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 import numpy as np import net def get_image_search (num, phrase): count = 0 img_arr = for arg in phrase: print (arg) print (f "Current image count: {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'] for result in 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- ի համար. #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 ետ = Image.new ('RGB', (im.size [0] + diam, im.size [1] + diam), (0, 0, 0)) back.paste (im, (RADIUS, RADIUS)) # Ստեղծել blur դիմակ դիմակ = 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)) # Blur image and paste blurred edge ըստ դիմակի 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+») ֆայլով ՝ _name_ == "_main_": search_terms = ["սուպերնովա", "մոլորակ", "գալակտիկա", "կաթնագույն ճանապարհ", "միգամածություն", "աստղեր"] #Որոնման տերմինները կարող են փոխվել այն ամենի վրա, ինչ ցանկանում եք, որ մոլորակը ներառի img_arr = get_image_search (64, որոնման տերմիններ) տպագիր («Պատկերները վերցված և զտված են նյարդային») img = stitch_beta (img_arr) տպագիր («Պատկերները կարված են») img.save ("stitched.png")

Քայլ 7: Էլեկտրոնային հավելված

Ակնարկ

Մենք կստեղծենք պարզ էլեկտրոնային ծրագիր, որը պարզապես տեղադրում և բեռնում է PhotoSphere տարրը: Main.js և package.json ֆայլերը ուղիղ էլեկտրոնային կայքից են, իսկ HTML- ը PhotoSphere կայքում ներկայացված HTML- ի մի փոքր փոփոխված տարբերակն է: Ես ներառել եմ ֆայլերը, բայց բոլորը վերանվանվել է.txt, քանի որ Instructables- ը թույլ չի տալիս այս տեսակի ֆայլերը: Ֆայլերն օգտագործելու համար դրանք վերանվանեք համապատասխան ընդլայնմամբ:

Օրենսգիրքը

main.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-փակ', () => {if (process.platform! == 'darwin') {app.quit ()}}) app.on ('activ', () => {if (BrowserWindow.getAllWindows (). երկարություն === 0) {createWindow ()}})

փաթեթ. json

{

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

index.html

Քայլ 8: Կատարում

Հավասարանկյուն պատկերի ստեղծում

Պատկերը ստեղծելու համար հրամանի տողում գործարկեք api.py սցենարը, որի վիրտուալ միջավայրն ակտիվացված է.

api.py

Սցենարների ավարտից հետո գործարկեք էլեկտրոնային ծրագիրը ՝ օգտագործելով.

npm սկիզբըՎոյա! Ձեր պլանետարիումն ակտիվ է: Շնորհակալություն կարդալու համար:)

Խորհուրդ ենք տալիս: