สารบัญ:

ท้องฟ้าจำลองที่ขับเคลื่อนด้วยโครงข่ายประสาทเทียมโดยใช้ Python, Electron และ Keras: 8 ขั้นตอน
ท้องฟ้าจำลองที่ขับเคลื่อนด้วยโครงข่ายประสาทเทียมโดยใช้ Python, Electron และ Keras: 8 ขั้นตอน

วีดีโอ: ท้องฟ้าจำลองที่ขับเคลื่อนด้วยโครงข่ายประสาทเทียมโดยใช้ Python, Electron และ Keras: 8 ขั้นตอน

วีดีโอ: ท้องฟ้าจำลองที่ขับเคลื่อนด้วยโครงข่ายประสาทเทียมโดยใช้ Python, Electron และ Keras: 8 ขั้นตอน
วีดีโอ: Python Road Detection Features 2024, พฤศจิกายน
Anonim
ท้องฟ้าจำลองที่ขับเคลื่อนด้วยโครงข่ายประสาทเทียมโดยใช้ Python, Electron และ Keras
ท้องฟ้าจำลองที่ขับเคลื่อนด้วยโครงข่ายประสาทเทียมโดยใช้ Python, Electron และ Keras

ในคำแนะนำนี้ ฉันจะแสดงให้คุณเห็นว่าฉันเขียนเครื่องกำเนิดท้องฟ้าจำลอง 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 (ข้อมูล) ในขณะที่นับ = num: break print(f"\n{count} ภาพที่ถูกเรียกคืน") return img_arr def stitch_beta(img_arr): new = Image.new("RGBA", (8000, 4000), color=(0, 0, 0)) h = 0 w = 0 i = 0 สำหรับ img ใน img_arr: #pbar.set_description(f"กำลังประมวลผลรูปภาพ {i+1}") new.paste(img, (w, h), img) w += 1000 ถ้า w == 8000: h += 500 w = 0 i += 1 ส่งคืนกระบวนการ def ใหม่ Image (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)) # สร้างมาสก์เบลอ = 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) mask.paste(blck, (diam, diam)) # เบลอภาพและวางขอบเบลอตามมาส์กเบลอ = back.filter(ImageFilter. GaussianBlur(RADIUS / 2)) back.paste(blur, mask=mask) back.save("transition.png") back.close() #สร้างมาสก์และตัวกรองแทนที่สีดำด้วยรูปภาพอัลฟ่า = cv2.imread(" ทางผ่าน ion.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 (รูปภาพ, รูปภาพ, หน้ากาก = หน้ากาก) *_, alpha = cv2.split (เอาต์พุต) dst = cv2.merge((output, alpha)) output = dst พร้อม open("buffer.png", "w+") เป็นไฟล์: pass cv2.imwrite("buffer.png", เอาต์พุต) #Edge การตรวจจับและการเบลอหาก _name_ == "_main_": search_terms = ["ซูเปอร์โนวา", "ดาวเคราะห์", "กาแล็กซี่", "ทางช้างเผือก", "เนบิวลา", "ดวงดาว"] #คำค้นหาสามารถเปลี่ยนแปลงได้ตามต้องการ img_arr = get_image_search(64, search_terms) print("ภาพที่ดึงมาและกรองด้วยระบบประสาท") img = stitch_beta(img_arr) พิมพ์ ("การต่อภาพ") img.save ("stitched.png")

ขั้นตอนที่ 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 เริ่มโว้ว! ท้องฟ้าจำลองของคุณเปิดใช้งานอยู่! ขอบคุณที่อ่าน:)

แนะนำ: