
Мазмуну:
2025 Автор: John Day | [email protected]. Акыркы өзгөртүү: 2025-01-23 14:51

Бул көрсөтмөдө мен Python жана Electron аркылуу автоматтык 3D планетарий генераторун кантип жазганымды көрсөтөм
Жогорудагы видео программаны түзгөн туш келди планетарийлердин бирин көрсөтөт.
** Эскертүү: Бул программа эч кандай идеалдуу эмес жана кээ бир жерлерде анча питоникалык эмес. Нейрон таза дискриминатор ~ 89% так, андыктан кээ бир кызык сүрөттөр аны планетарийге киргизет **
Өзгөчөлүктөр
Планетарий космоско байланыштуу сүрөттөр үчүн NASA API сурайт жана сүрөттү иштетүүгө ылайыктуу экендигин аныктоо үчүн конволюциялык нейрон тармагын колдонот. Андан кийин программа OpenCVди колдонуп, сүрөттөн фонду алып салат жана акыры сүрөттөр бир чоң төрт бурчтуу сүрөткө бириктирилет. Бул сүрөт кийин сакталат жана Electron Node.js тиркемеси сүрөттү ачат жана планетарий стилиндеги 3D форматында сүрөттү көрүү үчүн PhotoSphere.js пакетин колдонот.
Көз карандылыктар
Python:
- Keras
- Жаздык
- cv2
- Напси
- Сурамдар
- urllib
- Random
- убакыт
- io
Электрон:
PhotoSphere
1 -кадам: Сиздин чөйрөнү орнотуу
Electron жана Python орнотуу
Биринчиден, сизде node.js жана npm орнотулганын текшериңиз (эгер жок болсо, бул жерден жүктөп алсаңыз болот)
Андан кийин, сиз Electron орнотушуңуз керек. Командалык кеңешти ачыңыз жана төмөнкү буйрукту киргизиңиз:
npm электрон -g орнотуу
Андан кийин, бул жерде жүктөп алса болот python керек
Виртуалдык чөйрөнү орнотуу
Виртуалдык чөйрөңүздү орнотуу үчүн буйрук көрсөтмөсүн ачыңыз, андан кийин төмөнкү буйруктарды киргизиңиз:
pip virtualenv орнотуу
virtualenv мейкиндиги
CD боштук
scripts / activate
Python көз карандылыктарын орнотуу
Python көз карандылыгыңызды орнотуу үчүн бул буйруктарды буйрук сабында иштетиңиз:
пип керас орнотуу
жаздык орнотуу
pip орнотуу numpy
пип орнотуу сурамдары
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"} натыйжалар = request.get ("https://images-api.nasa.gov/search", params = параметтер)
Акыр -аягы, биз API бизге кайтарып берген+JSON сабынын кодун чечебиз жана издөө терминине байланыштуу сүрөттөргө шилтемелердин тизмесин чыгарабыз:
def get_image_search (сөз айкашы):
params = {"q": urllib.parse.quote (arg), "media_type": "image"} натыйжалар = request.get ("https://images-api.nasa.gov/search", params = параметтер) data = [натыйжа ['href'] жыйынтыкка жетүү үчүн.json () ["коллекция"] ["пункттар"]
Мына биз барабыз! Азыр бизде NASAнын сүрөт издөө APIсине суроо салып, издөө терминибизге байланыштуу сүрөттөргө шилтемелердин тизмесин кайтара ала турган коддун үзүндүсү бар.
3 -кадам: Конволюциялык нейрон тармагы
Обзор
Нейрон тармагынын милдети - бул космостогу бир нерсенин сүрөтүн же жок экенин классификациялоо. Бул үчүн, биз конвульсивдүү нейрон тармагын же CNNди колдонуп, сүрөттөгү бир катар матрицалык операцияларды аткарабыз жана мейкиндиктин кандай экенин аныктайбыз. Мен мунун баарын түшүндүрбөйм, анткени анын артында көп теория бар, бирок эгер сиз нейрон тармактары жөнүндө билгиңиз келсе, мен "Machine Learning Mastery" сунуштайм.
Кодекс
Биринчиден, биз көз карандылыгыбызды импорттошубуз керек:
импорт os
GPU os.environ поездиндеги кадамдардагы көйгөйдү чечүү ['CUDA_VISIBLE_DEVICES'] = '' tf.test.gpu_device_name (): басып чыгаруу ('GPU табылды') башка: басып чыгаруу ("GPU табылган жок") keras.preprocessing.image импорттоо keras.preprocessing импорттук сүрөт keras.models импорттоо keras.layers келген Conv2D, MaxPooling2D keras.layers импорттоо Activation, Dropout, Flatten, Dens PAS импорттук сүрөтүнөн K катары np катары numpy импорттоо
Андан кийин биз моделибизди аныкташыбыз керек:
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_ (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 (Activation ('relu')) model.add (MaxPooling2D (pool_size = (2, 2))) model.add (Flatten ()) модель. кошуу (Тыгыз (64)) model.add (Активация ('relu')) model.add (Окууну таштоо (0.5)) model.add (Тыгыз (1)) model.add (Активизация ('sigmoid')) model.compile (жоготуу = '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 back = Image.new ('RGB', (im.size [0] + диам, im.size [1] + диаметри), (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)) # Сүрөттү бүдөмүктөтүү жана маскага ылайык бүдөмүк четин чаптоо blur = back.filter (ImageFilter. GaussianBlur (RADIUS / 2)) back.paste (blur, mask = mask) back.save (" өткөөл-p.webp
Андан кийин, кара түстөрдү тунук кылып коюп, сүрөттү убактылуу сактайбыз:
#Маска түзүңүз жана чыпканы кара түстү альфа менен алмаштырыңыз
image = cv2.imread ("o'tish.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 -кадам: Бирдей Тик бурчтуу проекцияга сүрөттөрдү бириктирүү
Обзор
Бул функция бир нече сүрөттөрдү алат жана аларды PIL (жаздык) китепканасын колдонуп, PhotoSphere.js пакети менен чечмелене турган форматка тигет.
Кодекс
Биринчиден, биз башка сүрөттөр үчүн хосттун ролун аткара турган сүрөттү түзүүбүз керек:
жаңы = Image.new ("RGBA", (8000, 4000), түс = (0, 0, 0))
Андан кийин, биз сүрөттөрдүн массивин кайталашыбыз керек (бардыгы 1000x500 өлчөмүнө өзгөртүлгөн) жана аларды сүрөттө жайгаштыруу керек:
h = 0
img_arr ичиндеги img үчүн w = 0 i = 0: 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 if w == 8000: h += 500 w = 0 i += 1 new return
6 -кадам: Толук Python Script
Бул net.py катары сакталган жана негизги скриптке импорттолгон python нейрон тармагынын толук скрипти:
# китепканаларды импорттоо
импорт os #Fix поезд баскычында GPU os.environ ['CUDA_VISIBLE_DEVICES'] = '' tf.test.gpu_device_name (): басып чыгаруу ('GPU табылган') башка: басып чыгаруу ("GPU табылган жок) ") keras.preprocessing.image импорттоо keras.preprocessing keras.models импорттук сүрөт keras.layers импорттоо Sequential kerv.layers Conv2D, MaxPooling2D keras.layers импорттоо Activation, Dropout, Flatten, Dens from keras import backend from 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 if K.imatf (=) if format: input_shape = (3, img_width, img_height) башка: 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 (Dense (64)) model.add (Activation ('relu')) model.add (Dropout (0.5))) model.add (Тыгыз (1)) model.add (Активация ('sigmoid')) model.compile (loss = 'binary_crossentropy', optimizer = 'rmsprop', ченемдер = ['тактык']) 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]
Бул башкы python файлы, api.py:
импорттук сурамдар, sys, random, urllib.parse, cv2
PIL импорттоо Сүрөтүнөн, ImageFilter io импортунан BytesIO импорт numpy катары np импорт таза def get_image_search (сан, фраза): count = 0 img_arr = аргумент менен айтканда: print (arg) print (f "Учурдагы сүрөттөрдүн саны: {count } ") i = 0 params = {" q ": urllib.parse.quote (arg)," media_type ":" image "} натыйжалары = request.get (" https://images-api.nasa.gov/search ", params = params) data = [result ['href'] results in result.json () [" collection "] [" items "] print (len (data)) if if> len (data): num = len (маалыматтар) санап жатканда
7 -кадам: Electron App
Обзор
Биз жөн эле PhotoSphere элементин жайгаштырган жана жүктөгөн жөнөкөй электрондук колдонмону түзөбүз. Main.js жана package.json файлдары түз эле Electron веб -сайтынан, ал эми HTML PhotoSphere веб -сайтында берилген HTMLдин бир аз өзгөртүлгөн версиясы. Мен файлдарды коштум, бирок бардыгын.txt деп өзгөрттүм, анткени Instructables бул файл түрлөрүнө жол бербейт. Файлдарды колдонуу үчүн, алардын атын тиешелүү кеңейтүү менен алмаштырыңыз.
Кодекс
main.js
const {колдонмо, BrowserWindow} = талап кылуу ("электрон")
createWindow () {const win = new BrowserWindow ({туурасы: 800, бийиктиги: 600, webPreferences: {nodeIntegration: true}}) win.loadFile ('index.html')} app.whenReady (). анан (createWindow) app.on ('терезе бардыгы жабык', () => {эгер (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 башталышыVoila! Сиздин планетарий активдүү! Окуу үчүн рахмат:)
Сунушталууда:
Батарея менен иштеген офис. Күн системасы Чыгыш/Батыш Күн панелдери жана шамал турбинасы менен: 11 кадам (Сүрөттөр менен)

Батарея менен иштеген офис. Күн системасы Чыгыш/Батыш Күн панелдери жана шамал турбинасы менен которулат: Долбоор: 200 чарчы фут офис батарея менен иштеши керек. Офис ошондой эле бул система үчүн зарыл болгон бардык контроллерлерди, батареяларды жана компоненттерди камтышы керек. Күн жана шамал энергиясы батареяларды заряддайт. Кичине гана көйгөй бар
Батарея менен иштеген сарайдын эшиги жана кулпу сенсору, Күн, ESP8266, ESP-Now, MQTT: 4 кадам (сүрөттөр менен)

Батарея менен иштеген сарайдын эшиги жана кулпу сенсору, Күн, ESP8266, ESP-Азыр, MQTT: Бул Нускамада мен сизге велосипед сарайынын эшигин жана кулпусунун абалын көзөмөлдөө үчүн батарея менен иштеген сенсорду кантип көрсөткөнүмдү көрсөтөм. Менде электр энергиясы жок, ошондуктан батарейка менен иштейм. Батарея кичинекей күн панели менен заряддалат
Жарык жана коопсуздукту көзөмөлдөө үчүн сенсор станциялары тармагы: 5 кадам (сүрөттөр менен)

Жарыктандыруу жана коопсуздукту көзөмөлдөө үчүн сенсор станциялары тармагы: Бул сенсордук станциялардын тармагы мастер/кул режиминде конфигурацияланган, сиз үйүңүздө жарыктандырууну жана коопсуздукту көзөмөлдөй аласыз. Бул сенсор станциялары (бул долбоордо Node01, Node02) yo га туташкан башкы станцияга (Node00) туташкан
An Arduino WiFi тармагы (сенсорлор жана аткаруучулар) - түстүн сенсору: 4 кадам

An Arduino WiFi тармагы (Сенсорлор жана Активаторлор) - Түстүн сенсору: Сизде канча жолу сенден алысыраак сенсор же иштегич бар? Wi-Fi тармагы аркылуу туташкан ар кандай кул түзмөктөрдү башкаруу үчүн компьютериңиздин жанындагы бир эле башкы түзмөктү колдонуу канчалык ыңгайлуу болмок? Бул долбоордо
Мээ кутуча: убакыттын өтүшү менен нейрон көлөмүн көзөмөлдөө: 20 кадам

Мээ кутуча: Убакыттын өтүшү менен нейрон көлөмүн көзөмөлдөө: Адамдын узак жашоосунун чегине карай жылышы бизден мурун цивилизация көрбөгөн оорулардын пайда болушуна алып келди. Алардын арасында Альцгеймер 2017 -жылы болжол менен 5.3 миллион жашаган улгайган америкалыктарга же болжол менен 10 -жылы 1