Мазмұны:
- 1 -қадам: Қоршаған ортаны реттеу
- 2 -қадам: NASA Search API сұрау
- 3 -қадам: Конволюциялық нейрондық желі
- 4 -қадам: суретті өңдеу
- 5 -қадам: Кескіндерді тікбұрышты проекцияға біріктіру
- 6 -қадам: Толық Python сценарийі
- 7 -қадам: Electron қосымшасы
- 8 -қадам: Орындау
Бейне: Python, Electron және Keras қолданатын нейрондық желіден тұратын планетарий: 8 қадам
2024 Автор: John Day | [email protected]. Соңғы өзгертілген: 2024-01-30 10:23
Бұл нұсқаулықта мен сізге 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 (деректер) санау кезінде
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 басталуыВоила! Сіздің планетарий белсенді! Оқығаныңыз үшін рахмет:)
Ұсынылған:
Өзіңіздің фотоэлектрлік желіден тыс жүйесін жасаңыз: 4 қадам (суреттермен)
Өзіңіздің фотоэлектрлік желіден тыс жүйеңізді жасаңыз: Бұл жобада мен сізге 100 ватт күн панелін, 12В 100Ач батареяны, күн зарядтауды реттегішті, инверторды және көптеген қосымша компоненттерді гаражымның ішіндегі электр сымдарын қайта құру мен қалай құру керектігін көрсетемін. фотоэлектрлік желіден тыс
3 бөліктен тұратын жеңіл, арзан және сенімді сенсор сенсоры: 3 қадам
Тек 3 бөліктен тұратын жеңіл, арзан және сенімді сенсор: саусағыңызбен электронды құрылғылардың барлық түрлерін басқару өте пайдалы болуы мүмкін. Бұл нұсқаулықта мен сізге мінсіз сенсорлық сенсорды қалай құруға болатынын көрсетемін. Сізге стандартты транзистор және екі қажет
UChip-пластикалық бөтелкеден және CD-ROM ойнатқышынан тұратын RC қайығы!: 4 қадам
UChip-пластикалық бөтелкелер мен CD-ROM ойнатқышы жоқ RC қайығы!: Мен дронды радионы қозғалтқыштарға/серверлерге қосатын аппараттық және бағдарламалық қамтамасыз етулерді енгізгеннен кейін, келесі қадам-бұл ауыр жұмысты тиімді пайдалану және жеке меншікті автокөлік құрастыру. ойыншық, бұл … қайық! Мен инженер -механик болмағандықтан, мен жеңіл жолды таңдадым
Бұл Қол ма? (Raspberry Pi камерасы + нейрондық желі) 1/2 бөлім: 16 қадам (суреттермен)
Бұл Қол ма? (Raspberry Pi камерасы + нейрондық желі) 1/2 бөлім: Бірнеше күн бұрын мен жаттығу залында оң қолымнан жарақат алдым. Содан кейін мен компьютерлік тінтуірді қолданған сайын, бұл білектің тік бұрышынан қатты ауырсынуды тудырды. Дәл сол кезде бұл маған тиді " егер біз кез келген бетті трекпке айналдырсақ, жақсы болмас па еді
Флеш ойындарын желіде немесе желіден тыс жүктеп алыңыз және ойнаңыз: 5 қадам
Флеш ойындарын желіде немесе желіден тыс жүктеу және ойнау: Бұл нұсқаулықта мен сізге флеш ойындарын жүктеуді үйретемін. Саяхатта ойнау үшін керемет, егер сіз Wi-Fi ала алмасаңыз