สารบัญ:
- ขั้นตอนที่ 1: การตั้งค่าสภาพแวดล้อมของคุณ
- ขั้นตอนที่ 2: การสืบค้น NASA Search API
- ขั้นตอนที่ 3: โครงข่ายประสาทเทียม
- ขั้นตอนที่ 4: การประมวลผลภาพ
- ขั้นตอนที่ 5: การต่อภาพเข้าด้วยกันเป็นภาพเส้นตรง
- ขั้นตอนที่ 6: สคริปต์ Python แบบเต็ม
- ขั้นตอนที่ 7: แอปอิเล็กตรอน
- ขั้นตอนที่ 8: การดำเนินการ
วีดีโอ: ท้องฟ้าจำลองที่ขับเคลื่อนด้วยโครงข่ายประสาทเทียมโดยใช้ Python, Electron และ Keras: 8 ขั้นตอน
2024 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2024-01-30 13:03
ในคำแนะนำนี้ ฉันจะแสดงให้คุณเห็นว่าฉันเขียนเครื่องกำเนิดท้องฟ้าจำลอง 3 มิติอัตโนมัติโดยใช้ Python และ Electron ได้อย่างไร
วิดีโอด้านบนแสดงหนึ่งในท้องฟ้าจำลองแบบสุ่มที่โปรแกรมสร้างขึ้น
**หมายเหตุ: โปรแกรมนี้ไม่ได้สมบูรณ์แบบ และในบางที่ก็ไม่ได้เป็น pythonic มากนัก ตัวจำแนกโครงข่ายประสาทมีความแม่นยำเพียง ~89% ดังนั้นภาพแปลก ๆ บางภาพจะทำให้มันกลายเป็นท้องฟ้าจำลอง**
ข้อมูลจำเพาะ
ท้องฟ้าจำลองสอบถาม API ของ NASA สำหรับรูปภาพที่เกี่ยวข้องกับอวกาศ และใช้โครงข่ายประสาทเทียมเพื่อพิจารณาว่ารูปภาพนั้นเหมาะสมสำหรับการประมวลผลหรือไม่ จากนั้นโปรแกรมใช้ OpenCV เพื่อลบพื้นหลังออกจากรูปภาพ และสุดท้ายรูปภาพต่างๆ จะถูกเย็บเข้าด้วยกันเป็นรูปภาพสี่เหลี่ยมมุมฉากขนาดใหญ่รูปเดียว ภาพนี้จะถูกบันทึก และแอปพลิเคชัน Electron Node.js จะเปิดรูปภาพ และใช้แพ็คเกจ PhotoSphere.js เพื่อดูภาพในรูปแบบ 3D สไตล์ท้องฟ้าจำลอง
การพึ่งพา
หลาม:
- Keras
- หมอน
- cv2
- Numpy
- คำขอ
- urllib
- สุ่ม
- เวลา
- io
อิเล็กตรอน:
โฟโต้สเฟียร์
ขั้นตอนที่ 1: การตั้งค่าสภาพแวดล้อมของคุณ
การติดตั้งอิเล็กตรอนและ Python
ขั้นแรก ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้ง node.js และ npm แล้ว (หากไม่ใช่ คุณสามารถดาวน์โหลดได้ที่นี่)
ถัดไป คุณต้องติดตั้งอิเล็กตรอน เปิดพรอมต์คำสั่ง และป้อนคำสั่งต่อไปนี้:
npm ติดตั้งอิเล็กตรอน -g
ต่อไปคุณต้องมี python ซึ่งสามารถดาวน์โหลดได้ที่นี่
การตั้งค่าสภาพแวดล้อมเสมือน
เปิดพรอมต์คำสั่ง จากนั้นป้อนคำสั่งต่อไปนี้เพื่อตั้งค่าสภาพแวดล้อมเสมือนของคุณ:
pip ติดตั้ง virtualenv
พื้นที่เสมือนจริง
พื้นที่ซีดี
สคริปต์\เปิดใช้งาน
การติดตั้งการพึ่งพา Python
เรียกใช้คำสั่งเหล่านี้ในพรอมต์คำสั่งเพื่อติดตั้งการขึ้นต่อกันของหลาม:
pip ติดตั้ง keras
pip ติดตั้งหมอน
pip ติดตั้ง numpy
คำขอติดตั้ง pip
pip ติดตั้ง opencv-pythonหากคุณต้องการฝึกเครือข่ายด้วยตนเอง อย่าลืมตั้งค่าการเร่ง GPU สำหรับ Keras
ขั้นตอนที่ 2: การสืบค้น NASA Search API
ภาพรวม
NASA มี API ที่มีประโยชน์มากมายที่คุณสามารถใช้กับโครงการของคุณได้ สำหรับโครงการนี้ เราจะใช้ API การค้นหา ซึ่งช่วยให้เราค้นหาฐานข้อมูลภาพของ NASA สำหรับรูปภาพที่เกี่ยวข้องกับอวกาศ
รหัส
อันดับแรก เราต้องกำหนดฟังก์ชัน 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=params)
สุดท้าย เราจะถอดรหัสคอลเล็กชัน+สตริง JSON ที่ API ส่งคืนให้เรา และแยกรายการลิงก์ไปยังรูปภาพที่เกี่ยวข้องกับคำค้นหา:
def get_image_search (วลี):
params = {"q": urllib.parse.quote(arg), "media_type": "image"} ผลลัพธ์ = request.get("https://images-api.nasa.gov/search", params=params) data = [result['href'] สำหรับผลลัพธ์ results.json()["collection"]["items"]
เราจะไปที่นั่น! ตอนนี้เรามีข้อมูลโค้ดที่สามารถค้นหา API การค้นหารูปภาพของ NASA และส่งคืนรายการลิงก์ไปยังรูปภาพที่เกี่ยวข้องกับข้อความค้นหาของเรา
ขั้นตอนที่ 3: โครงข่ายประสาทเทียม
ภาพรวม
งานของโครงข่ายประสาทเทียมคือการจำแนกว่ารูปภาพเป็นของบางอย่างในอวกาศหรือไม่ ในการทำเช่นนี้ เราจะใช้โครงข่ายประสาทเทียมหรือ CNN เพื่อดำเนินการชุดของการดำเนินการเมทริกซ์บนรูปภาพ และกำหนดว่าช่องว่าง-y เป็นอย่างไร ฉันจะไม่อธิบายเรื่องนี้ทั้งหมด เพราะมีทฤษฎีมากมายอยู่เบื้องหลัง แต่ถ้าคุณต้องการเรียนรู้เกี่ยวกับโครงข่ายประสาทเทียม ฉันขอแนะนำ "Machine Learning Mastery"
รหัส
อันดับแรก เราต้องนำเข้าการพึ่งพาของเรา:
นำเข้าระบบปฏิบัติการ
#แก้ไขปัญหาระหว่างขั้นตอนรถไฟบน GPU os.environ['CUDA_VISIBLE_DEVICES'] = '' นำเข้าเทนเซอร์โฟลว์เป็น tf หาก tf.test.gpu_device_name(): พิมพ์ ('พบ GPU') อื่น: พิมพ์ ("ไม่พบ GPU") จาก keras.preprocessing.image นำเข้า ImageDataGenerator จาก keras.preprocessing อิมพอร์ตอิมเมจจาก keras.models นำเข้าตามลำดับจาก keras.layers นำเข้า Conv2D, MaxPooling2D จาก keras.layers นำเข้า Activation, Dropout, Flatten, Dense จาก keras นำเข้าแบ็กเอนด์เป็น K จากอิมเมจอิมพอร์ต PIL นำเข้า numpy เป็น np
ต่อไปเราต้องกำหนดรูปแบบของเรา:
img_width, img_height = 1,000, 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 ถ้า K.image_data_format() == 'channels_first': input_shape = (3, img_he) = (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(Activation('relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Conv2D(64, (2, 2))) model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Flatten()) รุ่น add(Dense(64)) model.add(Activation('relu')) model.add(Dropout(0.5)) model.add(Dense(1)) model.add(Activation('sigmoid')) model.คอมไพล์ (loss='binary_crossentropy', Optimizer='rmsprop', metrics=['accuracy'])
ฉันได้ฝึกแบบจำลองสำหรับคุณแล้ว แต่ถ้าคุณต้องการฝึกแบบจำลองด้วยตัวเองในชุดข้อมูลของคุณเอง ฉันได้แนบรหัสการฝึกอบรมมาด้วย มิฉะนั้น คุณสามารถดาวน์โหลดไฟล์ HDF5 ของโมเดลที่ผ่านการฝึกอบรมได้ เนื่องจากข้อ จำกัด ของไฟล์ Instructables ฉันต้องเปลี่ยนชื่อด้วยนามสกุล ".txt" หากต้องการใช้ ให้เปลี่ยนชื่อไฟล์เป็นนามสกุล ".h5" และโหลดด้วยรหัสนี้:
model.load_weights("model_saved.h5")
ในการใช้เครือข่ายเพื่อคาดการณ์ว่า space-y ของรูปภาพเป็นอย่างไร เราจะกำหนดฟังก์ชันนี้:
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)) # Create 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)) # ภาพเบลอและวางขอบเบลอตามหน้ากากเบลอ = back.filter (ImageFilter. GaussianBlur (RADIUS / 2)) back.paste (เบลอ, หน้ากาก = หน้ากาก) back.save (" Transition.png") back.close()
ต่อไป เราจะตั้งค่าสีเข้มให้โปร่งใส และบันทึกภาพไว้ชั่วคราว:
#สร้างหน้ากากและตัวกรองแทนที่สีดำด้วยอัลฟ่า
image = cv2.imread("transition.png") hMin = 0 sMin = 0 vMin = 20 hMax = 180 sMax = 255 vMax = 255 lower = np.array([hMin, sMin, vMin]) upper = np.array([hMax, sMax, vMax]) hsv = cv2.cvtColor(image, cv2. COLOR_BGR2HSV) mask = cv2.inRange (hsv, ล่าง, บน) เอาต์พุต = cv2.bitwise_and (รูปภาพ, รูปภาพ, มาสก์ = มาสก์) *_, อัลฟ่า = cv2.split(output) dst = cv2.merge((output, alpha)) output = dst พร้อม open("buffer.png", "w+") เป็นไฟล์: pass cv2.imwrite("buffer.png", เอาต์พุต)
ขั้นตอนที่ 5: การต่อภาพเข้าด้วยกันเป็นภาพเส้นตรง
ภาพรวม
ฟังก์ชันนี้นำรูปภาพหลายภาพมาเย็บต่อให้อยู่ในรูปแบบที่สามารถแปลได้โดยแพ็คเกจ PhotoSphere.js โดยใช้ไลบรารี PIL (หมอน)
รหัส
ขั้นแรก เราต้องสร้างภาพที่สามารถทำหน้าที่เป็นโฮสต์สำหรับภาพอื่นๆ:
ใหม่ = Image.new("RGBA", (8000, 4000), สี=(0, 0, 0))
ต่อไป เราต้องวนซ้ำผ่านอาร์เรย์ของรูปภาพ (ที่ปรับขนาดทั้งหมดเป็น 1000x500) แล้ววางลงในรูปภาพ:
ชั่วโมง = 0
w = 0 i = 0 สำหรับ img ใน img_arr: new.paste(img, (w, h), img) w += 1000 if 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 ใน img_arr: new.paste(img, (w, h), img) w += 1000 if w == 8000: h += 500 w = 0 i += 1 return ใหม่
ขั้นตอนที่ 6: สคริปต์ Python แบบเต็ม
นี่คือสคริปต์เครือข่ายประสาทเทียมแบบเต็ม ซึ่งบันทึกเป็น net.py และนำเข้าสู่สคริปต์หลัก:
#การนำเข้าห้องสมุด
นำเข้าระบบปฏิบัติการ #Fix สำหรับปัญหาระหว่างขั้นตอนรถไฟบน GPU os.environ['CUDA_VISIBLE_DEVICES'] = '' นำเข้าเทนเซอร์โฟลว์เป็น tf หาก tf.test.gpu_device_name(): พิมพ์ ('พบ GPU') อื่น: พิมพ์ ("ไม่พบ GPU ") จาก keras.preprocessing.image นำเข้า ImageDataGenerator จาก keras.preprocessing อิมพอร์ตอิมเมจจาก keras.models นำเข้า Sequential จาก keras.layers นำเข้า Conv2D, MaxPooling2D จาก keras.layers นำเข้า Activation, Dropout, Flatten, Dense จาก 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 at K.image_data': 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))) รุ่น add(Activation('relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Conv2D(64, (2, 2))) model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Flatten()) model.add(Dense(64)) model.add(Activation('relu')) model.add(ดรอปเอาท์(0.5)) model.add(หนาแน่น(1)) model.add(การเปิดใช้งาน('sigmoid')) model.compile(loss='binary_crossentropy', Optimizer='rmsprop', metrics=['accuracy']) model.load_weights("model_saved.h5") 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]
นี่คือไฟล์ไพ ธ อนหลัก api.py:
คำขอนำเข้า, sys, สุ่ม, urllib.parse, cv2
จากรูปภาพนำเข้า PIL, ImageFilter จาก io นำเข้า BytesIO นำเข้าจำนวนเป็น np นำเข้าสุทธิ def get_image_search(num, วลี): นับ = 0 img_arr = สำหรับ arg ในวลี: พิมพ์ (หาเรื่อง) พิมพ์ (f" จำนวนภาพปัจจุบัน: {นับ }") 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.json()["collection"]["items"] print(len(data)) if num > len(data): num = len (ข้อมูล) ในขณะที่นับ
ขั้นตอนที่ 7: แอปอิเล็กตรอน
ภาพรวม
เราจะสร้างแอปอิเล็กตรอนแบบง่ายๆ ที่เพียงแค่วางตำแหน่งและโหลดองค์ประกอบ PhotoSphere ไฟล์ main.js และ package.json มาจากเว็บไซต์ Electron โดยตรง และ HTML เป็นเวอร์ชันแก้ไขเล็กน้อยของ HTML ที่ให้ไว้ในเว็บไซต์ PhotoSphere ฉันได้รวมไฟล์ไว้แล้ว แต่เปลี่ยนชื่อทั้งหมดเป็น.txt เนื่องจาก Instructables ไม่อนุญาตประเภทไฟล์เหล่านี้ หากต้องการใช้ไฟล์ ให้เปลี่ยนชื่อไฟล์ด้วยนามสกุลที่เหมาะสม
รหัส
main.js
const { app, BrowserWindow } = ต้องการ ('อิเล็กตรอน')
ฟังก์ชัน createWindow () { const win = new BrowserWindow ({ width: 800, height: 600, webPreferences: { nodeIntegration: true } }) win.loadFile ('index.html') } app. whenReady ().then (createWindow) app.on('window-all-closed', () => { if (process.platform !== 'darwin') { app.quit() } }) app.on('activate', () => { 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 เริ่มโว้ว! ท้องฟ้าจำลองของคุณเปิดใช้งานอยู่! ขอบคุณที่อ่าน:)
แนะนำ:
ติดตาม: ศูนย์สื่อขั้นสูงพร้อม Odroid N2 และ Kodi (รองรับ 4k และ HEVC): 3 ขั้นตอน
ติดตาม: Advanced Media Center พร้อม Odroid N2 และ Kodi (รองรับ 4k และ HEVC): บทความนี้เป็นบทความต่อจากบทความก่อนหน้าของฉันที่ประสบความสำเร็จค่อนข้างมากเกี่ยวกับการสร้างศูนย์สื่ออเนกประสงค์ โดยอ้างอิงจาก Raspberry PI ที่ได้รับความนิยมมากในตอนแรก แต่ ในภายหลัง เนื่องจากไม่มีเอาต์พุตที่สอดคล้องกับ HEVC, H.265 และ HDMI 2.2 จึงมีสวิตช์
Blinds Control ด้วย ESP8266, Google Home และ Openhab Integration และ Webcontrol: 5 ขั้นตอน (พร้อมรูปภาพ)
การควบคุมมู่ลี่ด้วย ESP8266, Google Home และ Openhab Integration และ Webcontrol: ในคำแนะนำนี้ ฉันจะแสดงให้คุณเห็นว่าฉันเพิ่มระบบอัตโนมัติให้กับมู่ลี่ของฉันอย่างไร ฉันต้องการเพิ่มและลบระบบอัตโนมัติได้ ดังนั้นการติดตั้งทั้งหมดจึงเป็นแบบหนีบ ส่วนหลักคือ: สเต็ปเปอร์มอเตอร์ ตัวขับสเต็ปควบคุม bij ESP-01 เกียร์และการติดตั้ง
DIY IBeacon และ Beacon Scanner ด้วย Raspberry Pi และ HM13: 3 ขั้นตอน
DIY IBeacon และ Beacon Scanner ด้วย Raspberry Pi และ HM13: Story A beacon จะส่งสัญญาณอย่างต่อเนื่องเพื่อให้อุปกรณ์บลูทู ธ อื่น ๆ รู้ว่ามีอยู่ และฉันอยากได้บีคอนบลูทูธเพื่อติดตามกุญแจมาตลอด เพราะฉันลืมเอามันมาเหมือน 10 ครั้งในปีที่แล้ว และฉันก็เกิดขึ้น
RuuviTag และ PiZero W และ Blinkt! เทอร์โมมิเตอร์แบบ Bluetooth Beacon: 3 ขั้นตอน (พร้อมรูปภาพ)
RuuviTag และ PiZero W และ Blinkt! เครื่องวัดอุณหภูมิที่ใช้ Bluetooth Beacon: คำแนะนำนี้อธิบายวิธีการอ่านข้อมูลอุณหภูมิและความชื้นจาก RuuviTag โดยใช้ Bluetooth กับ Raspberry Pi Zero W และเพื่อแสดงค่าเป็นเลขฐานสองบน Pimoroni กะพริบตา! pHAT.หรือเรียกสั้นๆ ว่า จะสร้างสถานะอย่างไร
วิธีการสร้าง Quadcoptor (NTM 28-30S 800kV 300W และ Arducopter APM 2.6 & 6H GPS 3DR Radio และ FlySky TH9X): 25 ขั้นตอน (พร้อมรูปภาพ)
วิธีการสร้าง Quadcoptor (NTM 28-30S 800kV 300W และ Arducopter APM 2.6 & 6H GPS 3DR Radio และ FlySky TH9X): นี่คือบทแนะนำเกี่ยวกับวิธีการสร้าง Quadcopter โดยใช้มอเตอร์ NTM 28-30S 800kV 300W และ Arducopter APM 2.6 & 6H GPS & วิทยุ 3DR ฉันพยายามอธิบายแต่ละขั้นตอนด้วยรูปภาพจำนวนหนึ่ง หากคุณมีคำถามหรือความคิดเห็นใด ๆ โปรดตอบกลับ