Мазмұны:

Python, Electron және Keras қолданатын нейрондық желіден тұратын планетарий: 8 қадам
Python, Electron және Keras қолданатын нейрондық желіден тұратын планетарий: 8 қадам

Бейне: Python, Electron және Keras қолданатын нейрондық желіден тұратын планетарий: 8 қадам

Бейне: Python, Electron және Keras қолданатын нейрондық желіден тұратын планетарий: 8 қадам
Бейне: Самооборона для всех / Aigerim Abilkadirova/ Айгерим Абилкадирова/ самооборона для девушек 2024, Қараша
Anonim
Python, Electron және Keras қолданатын нейрондық желіден тұратын планетарий
Python, Electron және Keras қолданатын нейрондық желіден тұратын планетарий

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

Жоғарыдағы бейнеде бағдарлама кездейсоқ планетарийлердің бірі көрсетілген.

** Ескерту: Бұл бағдарлама мінсіз емес, ал кейбір жерлерде питоникалық емес. Нейрондық таза дискриминатор ~ 89% дәл, сондықтан кейбір тақ суреттер оны планетарийге айналдырады **

Ерекшеліктер

Планетарий ғарышқа байланысты суреттер үшін NASA API сұрайды және кескіннің өңдеуге жарамдылығын анықтау үшін конвульсиялы нейрондық желіні қолданады. Содан кейін бағдарлама кескіннен фонды жою үшін OpenCV пайдаланады, соңында суреттер бір үлкен төртбұрышты кескінге біріктіріледі. Содан кейін бұл сурет сақталады және Electron Node.js қосымшасы кескінді ашады және PhotoSphere.js пакетін пайдаланып, планетарий стиліндегі 3D форматында суретті қарайды.

Тәуелділіктер

Python:

  • Керас
  • Жастық
  • cv2
  • Мылжың
  • Сұраулар
  • urllib
  • Кездейсоқ
  • уақыт
  • io

Электрон:

PhotoSphere

1 -қадам: Қоршаған ортаны реттеу

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

Алдымен node.js және npm орнатылғанына көз жеткізіңіз (егер жоқ болса, мына жерден жүктеуге болады)

Содан кейін сізге Electron орнату қажет. Пәрмен жолын ашып, келесі пәрменді енгізіңіз:

npm электронды -g орнатыңыз

Содан кейін сізге python қажет, оны мына жерден жүктеуге болады

Виртуалды ортаны орнату

Пәрмен жолын ашыңыз, содан кейін виртуалды ортаны орнату үшін келесі пәрмендерді енгізіңіз:

pip virtualalv орнатыңыз

виртуалды кеңістік

CD кеңістігі

сценарийлер / белсендіру

Python тәуелділіктерін орнату

Python тәуелділігін орнату үшін пәрмен жолында осы пәрмендерді іске қосыңыз:

pip керас орнатыңыз

жастықшаны орнатыңыз

pip орнату numpy

pip орнату сұраулары

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»} нәтижелер = сұраулар.get («https://images-api.nasa.gov/search», парамдар = парамерлер)

Ақырында, біз API қайтарған коллекция+JSON жолын декодтап, іздеу терминіне қатысты суреттерге сілтемелер тізімін шығарамыз:

def get_image_search (фраза):

params = {«q»: urllib.parse.quote (arg), «media_type»: «image»} нәтижелер = сұраулар.get («https://images-api.nasa.gov/search», парамдар = парамерлер) data = [нәтиже ['href'] нәтижеге жету үшін.json () [«жинақ»] [«элементтер»]

Мінекей! Бізде NASA кескін іздеу API -ін сұрай алатын және іздеу терминіне қатысты суреттерге сілтемелер тізімін қайтаратын код үзіндісі бар.

3 -қадам: Конволюциялық нейрондық желі

Шолу

Нейрондық желінің міндеті - бұл суреттің кеңістіктегі нәрсе ме, жоқ па екенін жіктеу. Мұны істеу үшін біз конвульсиялық нейрондық желіні немесе CNN-ді қолданып, суретке матрицалық операциялар сериясын орындаймыз және оның кеңістік-у екенін анықтаймыз. Мен мұның бәрін түсіндірмеймін, өйткені оның артында көптеген теория бар, бірақ егер сіз нейрондық желілер туралы білгіңіз келсе, мен «Машиналық оқыту шеберлігін» ұсынамын.

Кодекс

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

импорттау os

#GPU os.environ пойызының жүру кезіндегі ақауды түзету ['CUDA_VISIBLE_DEVICES'] = '' tf.test.gpu_device_name (): tf.test.gpu_device_name (): print ('GPU found') else: print («GPU табылмады») keras.preprocessing.image импортынан ImageDataGenerator keras -тен импорттау кескінін keras.models -тен импорттау keras.layers -тен дәйекті Conv2D, MaxPooling2D -ден keras.layers -тен импорттау, тастау, тегістеу, тығыздық керас импорттаудың артқы жағынан 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 дәуір = 10 batch_size = 8, егер 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')) 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 (белсендіру ('sigmoid')) модель.құрастыру (шығын = '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 артқа = Image.new ('RGB', (im.size [0] + диаметри, im.size [1] + diam), (0, 0, 0)) back.paste (im, (RADIUS, RADIUS)) # # Бұлыңғыр маска маскасын жасау = Image.new ('L', (өлшемі [0] + diam, im.size [1] + diam), 255) blck = Image.new ('L', (im.size [0] - diam, im. size [1] - diam), 0) маска. қою (blck, (diam, diam)) # Кескінді бұлдырату және маскаға сәйкес бұлыңғыр жиекті қою blur = артқа өткел-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+») with file: pass cv2.imwrite («buffer.png», output))

5 -қадам: Кескіндерді тікбұрышты проекцияға біріктіру

Шолу

Бұл функция бірнеше суретті қабылдайды және оларды PIL (жастық) кітапханасын қолдана отырып, PhotoSphere.js бумасымен түсіндіруге болатын форматқа біріктіреді.

Кодекс

Біріншіден, біз басқа суреттерге хост бола алатын суретті жасауымыз керек:

new = Image.new («RGBA», (8000, 4000), түс = (0, 0, 0))

Әрі қарай, біз суреттер жиынын қайталауымыз керек (барлығы 1000х500 өлшеміне өзгертілген) және оларды суретке орналастыру керек:

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 img_arr ішіндегі img үшін: new.paste (img, (w, h), img) w += 1000 егер w == 8000 болса: h += 500 w = 0 i += 1 жаңа қайтару

6 -қадам: Толық Python сценарийі

Бұл net.py ретінде сақталатын және негізгі сценарийге импортталатын толық python нейрондық желі сценарийі:

# кітапханаларды импорттау

импорт os #Fix пойыз жүрісінде GPU os.environ ['CUDA_VISIBLE_DEVICES'] = '' tf.test.gpu_device_name (): tf түрінде tensorflow импорттау: шығару ('GPU табылды') басқа: басып шығару («GPU табылмады «) keras.preprocessing.image импортынан keras.pod өңдеу имиджін keras.models импорттау keras.layers жүйесінен Conv2D, MaxPooling2D keras.layers импорттау активтендіру, тастау, тегістеу, тығыздық керас импорттың артқы жағынан 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 = егер K.imat_statse = 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))) үлгісі. модульді қосу model.add (MaxPooling2D (pool_size = (2, 2))) model.add (Тегістеу ()) model.)) model.add (Тығыз (1)) model.add (Белсендіру ('sigmoid')) модель.компиляция (loss = 'binary_crossentropy', оптимизатор = 'rmsprop', көрсеткіштер = ['дәлдік']) model.load_weights («model_saved.h5») болжамды болжау (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, random, urllib.parse, cv2

PIL импорттау кескіннен, ImageFilter io импортынан BytesIO импорт numpy ретінде np импорт net def_mage_search: } «) i = 0 params = {» q «: urllib.parse.quote (arg),» media_type «:» image «} нәтижелері = сұраулар.get (» https://images-api.nasa.gov/search «, params = params) деректер = [нәтиже ['href'] нәтижеге жету үшін = len (деректер) санау кезінде = num: үзілісті басып шығару (f «\ n {count} кескін кері қайтарылды») қайтару img_arr def stitch_beta (img_arr): new = Image.new («RGBA», (8000, 4000), түс = (0, 0, 0)) img_arr ішіндегі img үшін h = 0 w = 0 i = 0: #pbar.set_description (f «Суретті өңдеу {i +1}») жаңа.паста (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) маска.паста (blck, (diam, diam)) # # Кескінді бұлдыратыңыз және масканың бұлыңғырлығына сәйкес артқы жағына қойыңыз. 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 ((шығыс, альфа)) шығару = dst файлмен ашық («buffer.png», «w+»): pass 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 -қадам: Electron қосымшасы

Шолу

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

Кодекс

main.js

const {app, 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 ()}})

package.json

{

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

index.html

8 -қадам: Орындау

Тік төртбұрышты кескін құру

Кескінді жасау үшін, виртуалды ортасы қосылған пәрмен жолында api.py сценарийін іске қосыңыз:

api.py

Сценарийлер аяқталғаннан кейін электронды қосымшаны іске қосыңыз:

npm басталуыВоила! Сіздің планетарий белсенді! Оқығаныңыз үшін рахмет:)

Ұсынылған: