Orodha ya maudhui:

Sayansi ya Mtandao ya Neural Inayotumia Sayansi ya Chatu, Elektroni, na Kera: Hatua 8
Sayansi ya Mtandao ya Neural Inayotumia Sayansi ya Chatu, Elektroni, na Kera: Hatua 8

Video: Sayansi ya Mtandao ya Neural Inayotumia Sayansi ya Chatu, Elektroni, na Kera: Hatua 8

Video: Sayansi ya Mtandao ya Neural Inayotumia Sayansi ya Chatu, Elektroni, na Kera: Hatua 8
Video: UKIONA DALILI HIZI 9 WIKI 2 BAADA YA KUJAMIIANA KAPIME UKIMWI HARAKA HUENDA UMEAMBUKIZWA 2024, Julai
Anonim
Mtandao wa Neural Planethi Inayotumia Python, Electron, na Keras
Mtandao wa Neural Planethi Inayotumia Python, Electron, na Keras

Katika hii inayoweza kufundishwa, nitakuonyesha jinsi nilivyoandika jenereta ya sayari ya 3D moja kwa moja, nikitumia Python na Electron

Video hapo juu inaonyesha moja ya sayari za nasibu ambazo programu ilitengenezwa.

** Kumbuka: Mpango huu sio kamili kabisa, na katika sehemu zingine sio Pythonic sana. Kibaguzi wa wavu wa neva ni sawa tu ~ 89%, kwa hivyo picha zingine zisizo za kawaida zitaifanya iwe kwenye sayari **

Maalum

Jumba la sayari linauliza NASA API ya picha zinazohusiana na nafasi, na hutumia mtandao wa neva wa kushawishi kuamua ikiwa picha inafaa kusindika. Programu hiyo hutumia OpenCV kuondoa mandharinyuma kutoka kwenye picha, na mwishowe picha zimeunganishwa pamoja kuwa picha moja kubwa ya usawa. Picha hii inahifadhiwa, na programu ya Electron Node.js inafungua picha, na hutumia kifurushi cha PhotoSphere.js kutazama picha hiyo katika muundo wa muundo wa sayari ya 3D.

Utegemezi

Chatu:

  • Keras
  • Mto
  • cv2
  • Numpy
  • Maombi
  • mkojo
  • Bila mpangilio
  • wakati
  • io

Elektroni:

PichaSphere

Hatua ya 1: Kuweka Mazingira Yako

Kufunga Electron na Python

Kwanza, hakikisha una node.js na npm imewekwa (ikiwa sio, unaweza kupakua hapa)

Ifuatayo, unahitaji kufunga Elektroni. Fungua kidokezo cha amri, na weka amri ifuatayo:

npm kufunga elektroni -g

Ifuatayo, unahitaji chatu, ambayo inaweza kupakuliwa hapa

Kuanzisha Mazingira Halisi

Fungua kidokezo cha amri, kisha ingiza amri zifuatazo ili kuweka mazingira yako halisi:

bomba funga fadhila

nafasi ya wema

nafasi ya cd

hati / uanzishe

Kufunga Utegemezi wa Chatu

Endesha amri hizi kwa haraka ya amri kusanikisha utegemezi wako wa chatu:

bomba kufunga keras

bomba kufunga mto

bomba kufunga numpy

maombi ya kusanikisha bomba

bomba kufunga opencv-chatuIkiwa unataka kufundisha mtandao mwenyewe, hakikisha kusanidi kuongeza kasi kwa GPU kwa Keras

Hatua ya 2: Kusoma API ya Utafutaji wa NASA

Maelezo ya jumla

NASA ina APIs nyingi muhimu ambazo unaweza kutumia na miradi yako. Kwa mradi huu, tutatumia API ya utaftaji, ambayo inatuwezesha kutafuta hifadhidata ya picha ya NASA kwa picha zinazohusiana na nafasi.

Kanuni

Kwanza, tunahitaji kufafanua kazi ya chatu kukubali hoja ambayo itatumika kama neno la utaftaji:

def kupata_image_search (kifungu):

kupita

Ifuatayo, tutabadilisha neno la utaftaji kuwa fomati ya URL, kisha tumia maktaba ya maombi kuuliza API:

def kupata_image_search (kifungu):

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

Mwishowe, tutamua mkusanyiko + kamba ya JSON ambayo API ilirudi kwetu, na tutaondoa orodha ya viungo vya picha zinazohusiana na neno la utaftaji:

def kupata_image_search (kifungu):

params = {"q": urllib.parse.quote (arg), "media_type": "image"} results = requests.get ("https://images-api.nasa.gov/search", params = vifungu) data = [matokeo ['href'] kwa matokeo ya matokeo.json () ["mkusanyiko"] ["vitu"]

Huko tunakwenda! Sasa tuna kijisehemu cha nambari ambacho kinaweza kuuliza API ya utaftaji wa picha ya NASA, na kurudisha orodha ya viungo kwa picha zinazohusiana na neno letu la utaftaji.

Hatua ya 3: Mtandao wa Mabadiliko ya Neural

Maelezo ya jumla

Kazi ya mtandao wa neva ni kuainisha ikiwa picha ni ya kitu angani, au ikiwa sio. Ili kufanya hivyo, tutatumia mtandao wa neva wa kushawishi, au CNN, kufanya safu ya shughuli za tumbo kwenye picha, na kuamua jinsi nafasi-ilivyo. Sitaelezea haya yote, kwa sababu kuna nadharia nyingi nyuma yake, lakini ikiwa unataka kujifunza juu ya mitandao ya neva, ninashauri "Ustadi wa Kujifunza Mashine"

Kanuni

Kwanza, tunahitaji kuagiza utegemezi wetu:

kuagiza os

# Rekebisha toleo wakati wa gari moshi la GPU os.environ ['CUDA_VISIBLE_DEVICES'] = "kuagiza tensorflow kama tf ikiwa tf.test.gpu_device_name (): chapa ('GPU imepatikana') mwingine: chapisha (" Hakuna GPU iliyopatikana ") kutoka kwa keras.preprocessing.image kuagiza ImageDataGenerator kutoka keras.kutengeneza picha ya kuagiza kutoka keras.models kuagiza Sequential from keras.layers import Conv2D, MaxPooling2D from keras.layers import Activation, Dropout, Flatten, Dense from keras kuagiza backend as K from PIL kuagiza Image kuagiza numpy kama np

Ifuatayo tunahitaji kufafanua mfano wetu:

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 = = (img_width, img_height, 3) mfano = Sequential () model.add (Conv2D (32, (2, 2), input_shape = input_shape)) model.add (Activation ('relu')) model.add (MaxPooling2D (pool_size) = (2, 2))) mfano.. kuongeza (Conv2D (64, (2, 2))) mfano. ongeza (Dense (64)) model.add (Activation ('relu')) model.add (Dropout (0.5)) model.add (Dense (1)) model.add (Activation ('sigmoid')) model.compile (hasara = 'binary_crossentropy', optimizer = 'rmsprop', metrics = ['usahihi'])

Nimekufundisha mfano huo, lakini ikiwa ungependa kufundisha mfano huo mwenyewe, kwenye hifadhidata yako mwenyewe, basi nimeambatanisha nambari ya mafunzo. Vinginevyo, unaweza kupakua faili ya HDF5 ya mfano. Kwa sababu ya vizuizi vya faili za Maagizo, imenilazimu kuipatia jina jipya na kiendelezi cha ".txt". Ili kuitumia, badilisha faili kwa kiendelezi cha ".h5", na upakie na nambari hii:

modeli.zip_weights ("model_saved.h5")

Kutumia mtandao kutabiri jinsi nafasi-y picha ilivyo, tutafafanua kazi hii:

tabiri (picha_path):

img = image.load_img (image_path, target_size = (1000, 500)) img = np.expand_dims (img, mhimili = 0) matokeo = model.predict_class (img) matokeo ya kurudi [0] [0]

Hatua ya 4: Kusindika Picha

Maelezo ya jumla

Kwa usindikaji wa picha, ninatumia maktaba ya OpenCV (cv2). Kwanza, tutaficha kando ya picha, na kisha tutaondoa usuli kwa kuunda kinyago na kubadilisha maadili ya alpha ya rangi nyeusi

Kanuni

Hii ndio sehemu ya kazi inayoficha kingo:

mchakato wa defImage (img):

RADIUS = 20 # Fungua picha im = Image.open ("pilbuffer.png") # Bandika picha kwenye background nyeupe diam = 2 * RADIUS back = Image.new ('RGB', (im.size [0] + diam, im.size [1] + diam), (0, 0, 0)) back.paste (im, (RADIUS, RADIUS)) # Unda mask mask 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) kinyago. weka (blck, (diam, diam)) # Blur picha na ubandike makali yaliyofifia kulingana na mask blur = back.filter (ImageFilter. GaussianBlur (RADIUS / 2)) back.paste (blur, mask = mask) back.save (" kipindi cha mpito.png ") nyuma. karibu ()

Ifuatayo, tutaweka rangi nyeusi kuwa wazi, na tutahifadhi picha hiyo kwa muda:

#Tengeneza mask na kichungi ubadilishe nyeusi na alpha

picha = cv2.imread ("transition.png") hMin = 0 sMin = 0 vMin = 20 hMax = 180 sMax = 255 vMax = 255 chini = np.array ([hMin, sMin, vMin]) juu = np.array ([hMax, sMax, vMax]) hsv = cv2.cvtColor (picha, cv2. COLOR_BGR2HSV) mask = cv2.inRange (hsv, chini, juu) pato = cv2.bitwise_and (picha, picha, mask = mask) * _, alpha = cv2.split (pato) dst = cv2.merge ((pato, alpha)) pato = dst na open ("buffer.png", "w +") kama faili: pitisha cv2.imwrite ("buffer.png", pato)

Hatua ya 5: Kushona Picha Pamoja Katika Makadirio ya Mlinganyo

Maelezo ya jumla

Kazi hii inachukua picha nyingi na kuziunganisha katika muundo ambao unaweza kutafsiriwa na kifurushi cha PhotoSphere.js, ukitumia maktaba ya PIL (mto)

Kanuni

Kwanza, tunahitaji kuunda picha ambayo inaweza kuwa mwenyeji wa picha zingine:

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

Ifuatayo, tunahitaji kupunguza idadi ya picha (ambazo zote zimebadilishwa kuwa 1000x500) na kuziweka kwenye picha:

h = 0

w = 0 i = 0 kwa img katika img_arr: mpya.bandika (img, (w, h), img) w + = 1000 ikiwa w == 8000: h + = 500 w = 0 i + = 1

Sasa tunaifunga hii kwa kazi ambayo inachukua safu ya picha kama hoja yake, na inarudisha picha mpya:

def kushona_beta (img_arr):

mpya = Image.new ("RGBA", (8000, 4000), color = (0, 0, 0)) h = 0 w = 0 i = 0 kwa img katika img_arr: new.paste (img, (w, h), img) w + = 1000 ikiwa w == 8000: h + = 500 w = 0 i + = 1 kurudi mpya

Hatua ya 6: Hati kamili ya Python

Huu ndio hati kamili ya mtandao wa python ya neva, ambayo imehifadhiwa kama net.py, na kuletwa kwenye hati kuu:

# kuagiza maktaba

kuagiza os #Fix kwa toleo wakati wa hatua ya treni ON GPU os.environ ['CUDA_VISIBLE_DEVICES'] = "kuagiza tensorflow kama tf ikiwa tf.test.gpu_device_name (): chapisha ('GPU imepatikana') mwingine: chapisha (" Hakuna GPU iliyopatikana) ") kutoka kwa keras.preprocessing.image kuagiza ImageDataGenerator kutoka keras.kutengeneza picha ya kuagiza kutoka keras.models kuagiza Sequential kutoka keras.layers kuagiza Conv2D, MaxPooling2D kutoka keras.layers kuagiza Activation, Dropout, Flatten, Dense from keras import backend as K from PIL kuagiza kuagiza picha numpy kama 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) mwingine: 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))) mfano. ongeza (Activation ('relu')) model.add (MaxPooling2D (pool_size = (2, 2))) model.add (Conv2D (64, (2, 2))) model.add (Activation ('relu')) modeli. model) "model_saved.h5") kutabiri (image_path): img = image.load_img (image_path, target_size = (1000, 500)) img = np. [0] [0]

Hii ndio faili kuu ya chatu, api.py:

kuagiza maombi, sys, nasibu, urllib.parse, cv2

kutoka PIL kuagiza Picha, ImageFilter kutoka io kuagiza BytesIO kuagiza numpy kama np kuagiza net def get_image_search (num, phrase): count = 0 img_arr = kwa arg katika kifungu: chapa (arg) chapa (f "Hesabu ya sasa ya picha: {hesabu } ") i = 0 params = {" q ": urllib.parse.quote (arg)," media_type ":" image "} results = requests.get (" https://images-api.nasa.gov/search ", params = params) data = [matokeo ['href'] ya matokeo ya matokeo.json () [" mkusanyiko "] [" vitu "] chapa (len (data)) ikiwa num> len (data): num = len (data) wakati hesabu = num: kuvunja uchapishaji (f "\ n {count} picha zimerudishwa") rudisha img_arr def stitch_beta (img_arr): new = Image.new ("RGBA", (8000, 4000), color = (0, 0, 0) h = 0 w = 0 i = 0 kwa img katika img_arr: # pbar.set_description (f "Picha ya kusindika {i + 1}") mpya.bandika (img, (w, h), img) w + = 1000 ikiwa w == 8000: h + = 500 w = 0 i + = 1 rudisha mchakato mpya wa ufafanuziImage (img): RADIUS = 20 # Fungua picha im = Image.open ("pilbuffer.png") # Bandika picha kwenye kipenyo cha rangi nyeupe = 2 * RADIUS nyuma = Image.new ('RGB', (im.size [0] + diam, im.size [1] + diam), (0, 0, 0)) back.paste (im, (RADIUS, RADIUS)) # Unda mask mask 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.bandika (blck, (diam, diam)) # Blur picha na kuweka makali yaliyofifia kulingana na mask blur = back.filter (ImageFilter. GaussianBlur (RADIUS / 2)) back.paste (blur, mask = mask) back.save ("transition.png") back.close () #Tengeneza mask na kichungi ubadilishe weusi na picha ya alpha = cv2.imread (" usafiri ion. hsv = cv2.cvtColor (picha, cv2. COLOR_BGR2HSV) mask = cv2.inRange (hsv, chini, juu) pato = cv2.bitwise_and (picha, picha, mask = mask) * _, alpha = cv2.split (pato) dst = cv2.merge ((pato, alpha)) pato = dst na wazi ("buffer.png", "w +") kama faili: pitisha cv2.imwrite ("buffer.png", pato) #Edge kugundua na kufifia ikiwa _name_ == "_main_": search_terms = ["supernova", "sayari", "galaxy", "milky way", "nebula", "nyota"] #Maswali ya utaftaji yanaweza kubadilishwa kuwa chochote unachotaka ujumuishaji wa sayari ujumuishe img_arr = pata_michoro_ya utafutaji (64, search_terms) chapisha ("Picha zilizochukuliwa na kuchujwa kwa neva") img = stitch_beta (img_arr) chapa ("Picha zilizoshonwa") img.save ("stitched.png")

Hatua ya 7: Programu ya Electron

Maelezo ya jumla

Tutaunda programu rahisi ya elektroni ambayo inasimama na kubeba kipengee cha PhotoSphere. Faili kuu.js na package.json ni moja kwa moja kutoka kwa wavuti ya Electron, na HTML ni toleo lililobadilishwa kidogo la HTML iliyotolewa kwenye wavuti ya PhotoSphere. Nimejumuisha faili, lakini nikabadilisha yote kuwa.txt, kwani Maagizo hayaruhusu aina hizi za faili. Ili kutumia faili hizo, zipe jina jipya na kiendelezi kinachofaa.

Kanuni

kuu

const {app, BrowserWindow} = zinahitaji ('elektroni')

kazi createWindow () {const win = new BrowserWindow ({width: 800, height: 600, webPreferences: {nodeIntegration: true}}) win.loadFile ('index.html')} app.whenReady (). kisha (createWindow) programu.on ('windows-all-closed', () => {if (process.platform! == 'darwin') {app.quit ()}}) app.on ('activate', () => {if (BrowserWindow.getAllWindows (). length === 0) {createWindow ()}})

kifurushi.json

{

"jina": "nafasi", "toleo": "0.1.0", "kuu": "main.js", "maandishi": {"anza": "elektroni." }}

index.html

Hatua ya 8: Utekelezaji

Kuunda picha sawa

Ili kuunda picha, tumia hati ya api.py katika haraka ya amri, na mazingira yake halisi yameamilishwa:

api.py

Baada ya maandishi kumaliza kutekeleza, tumia programu ya elektroni ukitumia:

npm kuanzaVoila! Sayansi yako ya sayari inafanya kazi! Asante kwa kusoma:)

Ilipendekeza: