فهرست مطالب:

Planetarium شبکه عصبی با استفاده از Python ، Electron و Keras: 8 مرحله
Planetarium شبکه عصبی با استفاده از Python ، Electron و Keras: 8 مرحله

تصویری: Planetarium شبکه عصبی با استفاده از Python ، Electron و Keras: 8 مرحله

تصویری: Planetarium شبکه عصبی با استفاده از Python ، Electron و Keras: 8 مرحله
تصویری: چگونه یوتیوبر شویم؟ در سال 2023 2024, نوامبر
Anonim
افلاک نما با استفاده از شبکه عصبی با استفاده از پایتون ، الکترون و کراس
افلاک نما با استفاده از شبکه عصبی با استفاده از پایتون ، الکترون و کراس

در این مقاله آموزشی ، من به شما نشان می دهم که چگونه با استفاده از پایتون و الکترون یک ژنراتور سه بعدی افقی خودکار نوشتم

ویدئوی بالا یکی از سیاره های تصادفی برنامه را نشان می دهد.

** توجه: این برنامه به هیچ وجه بی نقص نیست و در برخی نقاط نه خیلی پیتونیک. تشخیص شبکه عصبی فقط٪ 89 accurate دقیق است ، بنابراین برخی از تصاویر عجیب و غریب به سیاره زمین می رسد **

مشخصات

این افلاک از API ناسا برای تصاویر مربوط به فضا درخواست می کند و از یک شبکه عصبی متحرک برای تعیین اینکه آیا این تصویر برای پردازش مناسب است یا خیر ، استفاده می کند. سپس برنامه از OpenCV برای حذف پس زمینه از تصویر استفاده می کند و در نهایت تصاویر به هم متصل می شوند و به یک تصویر بزرگ مستطیلی تبدیل می شوند. سپس این تصویر ذخیره می شود و یک برنامه Electron Node.js تصویر را باز می کند و از بسته PhotoSphere.js برای مشاهده تصویر در قالب سه بعدی به سبک سیاره نما استفاده می کند.

وابستگی ها

پایتون:

  • کراس
  • بالش
  • cv2
  • آشفته
  • درخواست ها
  • urllib
  • تصادفی
  • زمان
  • io

الکترون:

PhotoSphere

مرحله 1: تنظیم محیط خود

نصب Electron و Python

ابتدا ، مطمئن شوید که node.js و npm را نصب کرده اید (در غیر این صورت ، می توانید از اینجا بارگیری کنید)

در مرحله بعد ، شما باید Electron را نصب کنید. خط فرمان را باز کرده و دستور زیر را وارد کنید:

npm electron -g را نصب کنید

در مرحله بعد ، شما به پایتون نیاز دارید که می توانید آن را در اینجا بارگیری کنید

راه اندازی محیط مجازی

خط فرمان را باز کنید ، سپس دستورات زیر را برای تنظیم محیط مجازی خود وارد کنید:

pip نصب virtualenv

فضای virtualenv

فضای سی دی

scripts / activate

نصب وابستگی های پایتون

برای نصب وابستگی های پایتون ، این دستورات را در خط فرمان اجرا کنید:

pip instal keras

بالش نصب پیپ

pip install numpy

درخواست های نصب pip

pip نصب opencv-pythonاگر می خواهید خودتان شبکه را آموزش دهید ، مطمئن شوید که شتاب GPU را برای Keras تنظیم کرده اید

مرحله 2: پرس و جو از API جستجو ناسا

بررسی اجمالی

ناسا دارای API های کاربردی بسیار مفیدی است که می توانید در پروژه های خود از آنها استفاده کنید. برای این پروژه ، ما از API جستجو استفاده می کنیم که به ما امکان می دهد پایگاه داده تصاویر ناسا را برای تصاویر مربوط به فضا جستجو کنیم.

کد

ابتدا ، ما باید یک تابع پایتون را برای پذیرفتن آرگومانی که به عنوان عبارت جستجو عمل می کند ، تعریف کنیم:

def get_image_search (عبارت):

عبور

در مرحله بعد ، ما عبارت جستجو را به قالب URL تبدیل می کنیم ، سپس از کتابخانه درخواستها برای پرسیدن API استفاده می کنیم:

def get_image_search (عبارت):

params = {"q": urllib.parse.quote (arg)، "media_type": "image"} results = 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"} results = request.get ("https://images-api.nasa.gov/search"، params = params) data = [result ['href'] for result in results.json () ["collection"] ["items"]

ما میرویم آنجا! ما در حال حاضر یک قطعه کد داریم که می تواند API جستجوی تصویر ناسا را جستجو کند و لیستی از پیوندها را به تصاویر مربوط به عبارت جستجوی ما بازگرداند.

مرحله 3: شبکه عصبی تحول

بررسی اجمالی

وظیفه شبکه عصبی این است که طبقه بندی کند که آیا تصویری از چیزی در فضا است یا نه. برای انجام این کار ، ما از یک شبکه عصبی کانولوشنال یا CNN برای انجام یک سری عملیات ماتریسی روی تصویر و تعیین میزان فضا y استفاده خواهیم کرد. من همه اینها را توضیح نخواهم داد ، زیرا نظریه های زیادی پشت آن وجود دارد ، اما اگر می خواهید در مورد شبکه های عصبی اطلاعات کسب کنید ، "مهارت یادگیری ماشین" را پیشنهاد می کنم.

کد

اول ، ما باید وابستگی های خود را وارد کنیم:

وارد کردن سیستم عامل

#رفع مشکل در حین حرکت قطار در GPU os.environ ['CUDA_VISIBLE_DEVICES'] = "" وارد tensorflow به صورت tf اگر tf.test.gpu_device_name (): print ("GPU found") دیگری: چاپ ("GPU پیدا نشد") از keras.preprocessing.image واردات ImageDataGenerator از keras.proproining پردازش تصویر واردات از keras.models import Sequential from keras.layers import Conv2D ، MaxPooling2D from keras.layers import activation ، Dropout ، Flatten ، Dense from keras import backkend as K from PIL import image وارد کردن 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 K.image_data_format () == 'channel_first': input_shape =}، = (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 ()) مدل add (Dense (64)) model.add (Activation ('relu')) model.add (Dropout (0.5)) model.add (Dense (1)) model.add (Activation ('sigmoid')) model.compile (ضرر = 'binary_crossentropy' ، optimizer = 'rmsprop' ، metrics = ['دقت'])

من مدل را برای شما آموزش داده ام ، اما اگر می خواهید مدل را خودتان ، بر اساس مجموعه داده خود آموزش دهید ، کد آموزشی را ضمیمه کرده ام. در غیر این صورت ، می توانید فایل 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، 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)) # ایجاد ماسک blur 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) mask. paste (blck، (diam، diam)) # تصویر را تار کنید و لبه تار را با توجه به mask blur = back.filter (ImageFilter. GaussianBlur (RADIUS / 2)) back.paste (blur، mask = mask) back.save (" tranzition-p.webp

در مرحله بعد ، رنگهای تیره را روی شفاف قرار می دهیم و تصویر را موقتاً ذخیره می کنیم:

#ماسک ایجاد کنید و فیلتر را با آلفا جایگزین رنگ سیاه کنید

image = cv2.imread ("transfer.png") hMin = 0 sMin = 0 vMin = 20 hMax = 180 sMax = 255 vMax = 255 lower = np.array ([hMin، sMin، vMin]) above = np.array ([hMax، sMax، vMax]) hsv = cv2.cvtColor (image، cv2. COLOR_BGR2HSV) mask = cv2.inRange (hsv، bottom، above) output = cv2.bitwise_and (تصویر ، تصویر ، mask = mask) *_ ، alpha = 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 تفسیر شود.

کد

اول ، ما باید تصویری ایجاد کنیم که بتواند به عنوان میزبان سایر تصاویر عمل کند:

new = Image.new ("RGBA" ، (8000 ، 4000) ، رنگ = (0 ، 0 ، 0))

در مرحله بعد ، ما باید از طریق آرایه تصاویر (که همه آنها در 1000x500 تغییر اندازه داده اند) تکرار کرده و آنها را در تصویر قرار دهیم:

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

اکنون ما فقط این را در یک تابع که آرایه ای از تصاویر را به عنوان آرگومان خود گرفته و تصویر جدید را برمی گرداند ، جمع بندی می کنیم:

def stitch_beta (img_arr):

new = Image.new ("RGBA"، (8000، 4000)، color = (0، 0، 0)) h = 0 w = 0 i = 0 for img in img_arr: new.paste (img، (w، h) ، img) w += 1000 اگر w == 8000: h += 500 w = 0 i += 1 بازگشت جدید

مرحله 6: اسکریپت کامل پایتون

این اسکریپت شبکه عصبی پایتون کامل است که به صورت net.py ذخیره شده و به اسکریپت اصلی وارد می شود:

# وارد کردن کتابخانه ها

import os #رفع مشکل در هنگام حرکت قطار در GPU os.environ ['CUDA_VISIBLE_DEVICES'] = "وارد کردن tensorflow به عنوان tf if tf.test.gpu_device_name (): print (" GPU found ") دیگر: چاپ (" GPU یافت نشد ") از keras.preprocessing.image واردات ImageDataGenerator از keras. پردازش تصویر واردات از keras.models واردات پی در پی از keras.layers واردات Conv2D ، MaxPooling2D از keras.layers واردات فعال سازی ، Dropout ، Flatten ، Dense از keras واردات پسوند به صورت K از PIL import image import numpy as 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': 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 (فعال سازی ('relu')) model.add (MaxPooling2D (pool_size = (2 ، 2))) model.add (مسطح ()) model.add (متراکم (64)) model.add (فعال سازی ('relu')) model.add (خروج (0.5))) model.add (متراکم (1)) model.add (فعال سازی ('sigmoid')) model.compile (loss = 'binary_crossentropy'، optimizer = 'rmsprop'، metrics = ['دقت']) model.load_weights ("model_saved.h5") def pred (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 ، random ، urllib.parse ، cv2

از PIL import Image، ImageFilter from io import BytesIO import numpy as np import net def get_image_search (num، phrase): count = 0 img_arr = برای arg در عبارت: print (arg) print (f "تعداد تصویر فعلی: {count } ") i = 0 params = {" q ": urllib.parse.quote (arg)،" media_type ":" image "} results = request.get (" https://images-api.nasa.gov/search "، params = params) data = [result ['href'] for result in results.json () [" collection "] [" items "] print (len (data)) if num> len (data): num = len (داده) هنگام شمارش = num: break print (f "\ n {count} images retreived") return img_arr def stitch_beta (img_arr): new = Image.new ("RGBA"، (8000، 4000)، color = (0، 0، 0)) h = 0 w = 0 i = 0 for img in img_arr: #pbar.set_description (f "پردازش تصویر {i +1}") new.paste (img، (w، h)، img) w += 1000 if w == 8000: h += 500 w = 0 i += 1 بازگشت فرایند def جدید Image (img): RADIUS = 20 # بازکردن تصویر im = Image.open ("pilbuffer.png") # جایگذاری تصویر بر روی پس زمینه سفید = 2 * RADIUS back = Image.new ('RGB'، (im.size [0] + diam، im.size [1] + diam)، (0، 0، 0)) back.paste (im، (RADIUS ، RADIUS)) # ایجاد ماسک blur 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) mask.paste (blck، (diam، diam)) # تصویر را تار کرده و لبه تار را با توجه به mask blur = back.filter (ImageFilter. GaussianBlur (RADIUS / 2)) back.paste (blur، mask = mask) back.save ("transfer.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]) above = 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 ((خروجی ، آلفا)) خروجی = dst با باز کردن ("buffer.png" ، "w+") به عنوان فایل: گذر cv2.imwrite ("buffer.png" ، خروجی) #تشخیص لبه و تار شدن اگر _name_ == "_main_": search_terms = ["ابرنواختر" ، "سیاره" ، "کهکشان" ، "راه شیری" ، "سحابی" ، "ستارگان"] #عبارات جستجو را می توان به هر چیزی که می خواهید سیاره زمین شامل شود تغییر داد img_arr = get_image_search (64 ، search_terms) چاپ ("تصاویر بازیابی شده و عصبی فیلتر شده اند") img = stitch_beta (img_arr) print ("Images stitched") img.save ("stitched.png")

مرحله 7: برنامه الکترون

بررسی اجمالی

ما یک برنامه الکترون ساده ایجاد می کنیم که فقط عنصر PhotoSphere را موقعیت دهی و بارگذاری می کند. فایلهای main.js و package.json مستقیماً از وب سایت Electron هستند و HTML نسخه کمی اصلاح شده HTML است که در وب سایت PhotoSphere ارائه شده است. من فایلها را وارد کرده ام ، اما همه آنها را به.txt تغییر نام دادم ، زیرا Instructables این نوع فایلها را مجاز نمی داند. برای استفاده از فایل ها ، نام آنها را با پسوند مناسب تغییر دهید.

کد

main.js

const {app، BrowserWindow} = نیاز ('electron')

function createWindow () {const win = new BrowserWindow ({عرض: 800 ، ارتفاع: 600 ، webPreferences: {nodeIntegration: true}}) win.loadFile ('index.html')} app.whenReady (). سپس (createWindow) app.on ('window-all -losed'، () => {if (process.platform! == 'darwin') {app.quit ()}}) app.on ('activ'، () => {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وویلا! افلاک نما شما فعال است! ممنون که خواندید:)

توصیه شده: