
Բովանդակություն:
2025 Հեղինակ: John Day | [email protected]. Վերջին փոփոխված: 2025-01-23 14:48

Այս ուսանելի հոդվածում ես ձեզ ցույց կտամ, թե ինչպես եմ գրել ավտոմատ 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 = լեն (տվյալներ) հաշվման ընթացքում
Քայլ 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 սկիզբըՎոյա! Ձեր պլանետարիումն ակտիվ է: Շնորհակալություն կարդալու համար:)
Խորհուրդ ենք տալիս:
Երկու գնացքներով աշխատող երկաթուղային ավտոմատ մոդելի դասավորություն (V2.0) - Arduino- ի հիման վրա. 15 քայլ (նկարներով)

Երկու գնացքով աշխատող երկաթգծի ավտոմատ մոդելային դասավորություն (V2.0) | Arduino- ի հիման վրա. Arduino միկրոկառավարիչների միջոցով մոդելի դասավորության ավտոմատացումը միկրոկոնտրոլերների միաձուլման, ծրագրավորման և երկաթգծի մոդելավորման մեկ հոբբիի հիանալի միջոց է: Կան մի շարք նախագծեր, որոնք վերաբերում են մոդելային երկաթուղու վրա ինքնավար գնացք վարելուն
NBIoT տվյալների փոխանցում Ինչպես օգտագործել BC95G մոդեմի վրա հիմնված վահան - UDP թեստ և ցանցի կարգավիճակի ազդանշան. 4 քայլ

NBIoT տվյալների փոխանցում Ինչպես օգտագործել BC95G մոդեմի վրա հիմնված վահան - UDP թեստ և ցանցի կարգավիճակի ազդանշան. Այս նախագծերի մասին. Փորձարկեք NB IoT ցանցի հնարավորությունները և UDP տվյալների հումքի փոխանցումը xyz -mIoT- ի միջոցով itbrainpower.net վահանի միջոցով, որը հագեցած է Quectel BC95G մոդեմով: Պահանջվող ժամանակ. 10-15 րոպե. Դժվարություն `միջանկյալ: Հայտնաբերում` կպցնելու հմտությունները պարտադիր են
Մագնիսական գեոդեզիական մոլորակ. 7 քայլ (նկարներով)

Մագնիսական գեոդեզիական մոլորակ. Բարև բոլորին: Ինձ դուր է գալիս քայլել ձեզ գեոդեզիական մոլորակ ստեղծելու իմ գործընթացի միջոցով `մագնիսներով և մետաղալարեր պատրաստելով: Այս մագնիսների օգտագործման պատճառն անձրևի ժամանակ կամ ավելի քիչ, քան իդեալական եղանակային պայմանների հեռացումն է: Այս կերպ դուք
Bluetooth- միացված մոլորակ/Orrery: 13 քայլ (նկարներով)

Bluetooth- ով ապահովված պլանետարիում/Օրերրի. Այս հրահանգը ստեղծվել է Հարավային Ֆլորիդայի համալսարանի Makecourse- ի նախագծի պահանջի կատարման համար (www.makecourse.com): Սա իմ 3 մոլորակ մոլորակն է: Այն սկսվեց որպես կիսամյակային ծրագիր Makecour- ի համար
Ձայնի ակտիվացված մոլորակ. 8 քայլ (նկարներով)

Sound Activated Planetarium. Այս հրահանգը ստեղծվել է Հարավային Ֆլորիդայի համալսարանում (www.makecourse.com) Makecourse- ի նախագծի պահանջի կատարման համար: Սա իմ ձայնային ակտիվացված մոլորակն է: Պլանետարիումի հիմնական գործառույթն է ակտիվացնել