جدول المحتويات:

القبة السماوية المدعومة بالشبكة العصبية باستخدام Python و Electron و Keras: 8 خطوات
القبة السماوية المدعومة بالشبكة العصبية باستخدام Python و Electron و Keras: 8 خطوات

فيديو: القبة السماوية المدعومة بالشبكة العصبية باستخدام Python و Electron و Keras: 8 خطوات

فيديو: القبة السماوية المدعومة بالشبكة العصبية باستخدام Python و Electron و Keras: 8 خطوات
فيديو: (محاضرة 9 انظمة احداثيات القبة السماوية (نظام الافق 2024, شهر نوفمبر
Anonim
القبة السماوية المدعومة بالشبكة العصبية باستخدام Python و Electron و Keras
القبة السماوية المدعومة بالشبكة العصبية باستخدام Python و Electron و Keras

في هذا الدليل ، سأوضح لك كيف كتبت مولدًا آليًا للقمبة السماوية ثلاثي الأبعاد ، باستخدام Python و Electron

يُظهر الفيديو أعلاه إحدى القباب السماوية العشوائية التي أنشأها البرنامج.

** ملاحظة: هذا البرنامج ليس مثاليًا بأي حال من الأحوال ، وفي بعض الأماكن ليس بيثونيًا جدًا. تتميز أداة التمييز الشبكي العصبي بأنها دقيقة بنسبة 89٪ فقط ، لذا فإن بعض الصور الغريبة ستدخل القبة السماوية **

تفاصيل

تستعلم القبة السماوية عن NASA API للصور المتعلقة بالفضاء ، وتستخدم شبكة عصبية تلافيفية لتحديد ما إذا كانت الصورة مناسبة للمعالجة. ثم يستخدم البرنامج OpenCV لإزالة الخلفية من الصورة ، وفي النهاية يتم تجميع الصور معًا في صورة واحدة كبيرة متساوية المستطيل. ثم يتم حفظ هذه الصورة ، ويفتح تطبيق Electron Node.js الصورة ، ويستخدم حزمة PhotoSphere.js لعرض الصورة بتنسيق ثلاثي الأبعاد بنمط القبة السماوية.

التبعيات

بايثون:

  • كيراس
  • وسادة
  • السيرة الذاتية 2
  • نومبي
  • الطلبات
  • أورليب
  • عشوائي
  • زمن
  • io

الإلكترون:

فوتوسفير

الخطوة 1: إعداد بيئتك

تثبيت Electron و Python

أولاً ، تأكد من تثبيت node.js و npm (إذا لم يكن كذلك ، يمكنك التنزيل هنا)

بعد ذلك ، تحتاج إلى تثبيت Electron. افتح موجه الأوامر ، وأدخل الأمر التالي:

npm تثبيت الإلكترون -g

بعد ذلك ، تحتاج إلى لغة python ، والتي يمكن تنزيلها من هنا

إنشاء بيئة افتراضية

افتح موجه الأوامر ، ثم أدخل الأوامر التالية لإعداد بيئتك الافتراضية:

نقطة تثبيت virtualenv

الفضاء الافتراضي

مساحة القرص المضغوط

البرامج النصية / التنشيط

تثبيت التبعيات بيثون

قم بتشغيل هذه الأوامر في موجه الأوامر لتثبيت تبعيات Python الخاصة بك:

نقطة تثبيت keras

وسادة تثبيت نقطة

نقطة تثبيت numpy

طلبات تثبيت النقطة

نقطة تثبيت opencv-pythonإذا كنت ترغب في تدريب الشبكة بنفسك ، فتأكد من إعداد تسريع GPU لـ Keras

الخطوة 2: الاستعلام عن NASA Search API

ملخص

لدى ناسا الكثير من واجهات برمجة التطبيقات المفيدة حقًا والتي يمكنك استخدامها في مشاريعك. بالنسبة لهذا المشروع ، سنستخدم واجهة برمجة تطبيقات البحث ، والتي تسمح لنا بالبحث في قاعدة بيانات الصور التابعة لناسا عن الصور ذات الصلة بالفضاء.

الرمز

أولاً ، نحتاج إلى تعريف دالة بيثون لقبول وسيطة تعمل كمصطلح بحث:

def get_image_search (عبارة):

يمر

بعد ذلك ، سنقوم بتحويل مصطلح البحث إلى تنسيق URL ، ثم نستخدم مكتبة الطلبات للاستعلام عن واجهة برمجة التطبيقات:

def get_image_search (عبارة):

params = {"q": urllib.parse.quote (arg)، "media_type": "image"} results = calls.get ("https://images-api.nasa.gov/search"، params = params)

أخيرًا ، سنقوم بفك تشفير المجموعة + سلسلة JSON التي أعادتها واجهة برمجة التطبيقات إلينا ، واستخراج قائمة روابط للصور المتعلقة بمصطلح البحث:

def get_image_search (عبارة):

params = {"q": urllib.parse.quote (arg)، "media_type": "image"} results = calls.get ("https://images-api.nasa.gov/search"، params = params) data = [نتيجة ['href'] للنتيجة في results.json () ["collection"] ["items"]

هناك نذهب! لدينا الآن مقتطف رمز يمكنه الاستعلام عن واجهة برمجة تطبيقات بحث الصور التابعة لوكالة ناسا ، وإرجاع قائمة روابط للصور ذات الصلة بمصطلح البحث الخاص بنا.

الخطوة 3: الشبكة العصبية التلافيفية

ملخص

تتمثل مهمة الشبكة العصبية في تصنيف ما إذا كانت الصورة لشيء ما في الفضاء ، أم أنها ليست كذلك. للقيام بذلك ، سنستخدم شبكة عصبية تلافيفية ، أو CNN ، لإجراء سلسلة من عمليات المصفوفة على الصورة ، وتحديد مدى المسافة y. لن أشرح هذا كله ، لأن هناك الكثير من النظريات وراء ذلك ، ولكن إذا كنت تريد التعرف على الشبكات العصبية ، أقترح "إتقان التعلم الآلي"

الرمز

أولاً ، نحتاج إلى استيراد تبعياتنا:

استيراد نظام التشغيل

# إصلاح للمشكلة أثناء التدريب stepn oN GPU os.environ ['CUDA_VISIBLE_DEVICES'] = 'استيراد tensorflow مثل tf if tf.test.gpu_device_name (): print (' GPU found ') else: print ("لم يتم العثور على GPU") من keras.preprocessing. استيراد 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 if K. = (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 (Flaten ()) model. add (Dense (64)) model.add (Activation ('relu')) model.add (Dropout (0.5)) model.add (Dense (1)) model.add (Activation ('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، axis = 0) نتيجة = model.predict_classes (img) إرجاع نتيجة [0] [0]

الخطوة 4: معالجة الصورة

ملخص

لمعالجة الصور ، أستخدم مكتبة OpenCV (cv2). أولاً ، سنقوم بتشويش حواف الصورة ، ثم نقوم بإزالة الخلفية عن طريق إنشاء قناع وتغيير قيم ألفا للألوان الداكنة

الرمز

هذا هو جزء الوظيفة الذي يطمس الحواف:

عملية def imageImage (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) قناع. لصق (blck ، (قطر ، قطر)) # تمويه الصورة ولصق حافة غير واضحة وفقًا لطمس القناع = مرشح خلفي (ImageFilter. GaussianBlur (RADIUS / 2)) back.paste (طمس ، قناع = قناع) back.save (" transfer-p.webp

بعد ذلك ، سنضبط الألوان الداكنة على الشفافية ، ونحفظ الصورة مؤقتًا:

#Create Mask و Filter يستبدل اللون الأسود بـ alpha

image = cv2.imread ("transfer.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 (صورة ، cv2. COLOR_BGR2HSV) قناع = cv2.inRange (hsv ، سفلي ، علوي) الإخراج = cv2.bitwise_and (صورة ، صورة ، قناع = قناع) * _ ، ألفا = cv2.split (الإخراج) dst = cv2.merge ((الإخراج ، ألفا)) الإخراج = dst مع الفتح ("buffer.png"، "w +") كملف: تمرير cv2.imwrite ("buffer.png" ، الإخراج)

الخطوة 5: خياطة الصور معًا في إسقاط متساوي المستطيل

ملخص

تأخذ هذه الوظيفة صورًا متعددة وتدمجها في تنسيق يمكن تفسيره بواسطة حزمة PhotoSphere.js ، باستخدام مكتبة PIL (وسادة)

الرمز

أولاً ، نحتاج إلى إنشاء صورة يمكنها العمل كمضيف للصور الأخرى:

جديد = صورة.جديد ("RGBA" ، (8000 ، 4000) ، اللون = (0 ، 0 ، 0))

بعد ذلك ، نحتاج إلى تكرار مجموعة الصور (التي تم تغيير حجمها جميعًا إلى 1000 × 500) ووضعها في الصورة:

ح = 0

w = 0 i = 0 لـ img في img_arr: new.paste (img، (w، h)، img) w + = 1000 إذا كان w == 8000: h + = 500 w = 0 i + = 1

الآن نختتم هذا في دالة تأخذ مصفوفة من الصور كوسيط لها ، وتعيد الصورة الجديدة:

def غرزة_بيتا (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 إذا كانت w == 8000: h + = 500 w = 0 i + = 1 أعد جديدًا

الخطوة 6: نص بايثون الكامل

هذا هو البرنامج النصي الكامل لشبكة python العصبية ، والذي يتم حفظه كـ net.py ، ويتم استيراده في البرنامج النصي الرئيسي:

# استيراد مكتبات

استيراد نظام التشغيل #Fix للمشكلة أثناء التدريب stepn oN GPU os.environ ['CUDA_VISIBLE_DEVICES'] = 'استيراد tensorflow مثل tf if tf.test.gpu_device_name (): print (' GPU found ') else: print ("لم يتم العثور على GPU (استيراد الصور 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.: 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))) نموذج. 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 (Dropout (0.5))) model.add (كثيف (1)) model.add (التنشيط ('sigmoid')) model.compile (الخسارة = 'binary_crossentropy' ، المحسن = '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، axis = 0) result = model.predict_classes (img) إرجاع النتيجة [0] [0]

هذا هو ملف python الرئيسي ، api.py:

طلبات الاستيراد ، sys ، random ، urllib.parse ، cv2

من PIL import Image ، ImageFilter من io import BytesIO استيراد numpy مثل np import net def get_image_search (num ، عبارة): count = 0 img_arr = للعبارة في العبارة: print (arg) print (f "عدد الصور الحالي: {count } ") i = 0 params = {" q ": urllib.parse.quote (arg)،" media_type ":" image "} results = sources.get (" https://images-api.nasa.gov/search "، params = params) data = [نتيجة ['href'] للنتيجة في results.json () [" collection "] [" items "] print (len (data)) if num> len (data): num = لين (البيانات) أثناء العد = num: break print (f "\ n {count} images retreived") إرجاع img_arr def stitch_beta (img_arr): new = Image.new ("RGBA" ، (8000 ، 4000) ، اللون = (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 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)) # إنشاء قناع تمويه = 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 (طمس ، قناع = قناع) back.save ("transfer.png") back.close () #Create Mask والمرشح استبدل الأسود بـ alpha image = 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 (صورة ، cv2. COLOR_BGR2HSV) قناع = إخراج cv2.inRange (hsv ، سفلي ، علوي) = cv2.bitwise_and (صورة ، صورة ، قناع = قناع) * _ ، alpha = cv2.split (إخراج) dst = cv2.merge ((output، alpha)) output = dst with open ("buffer.png"، "w +") كملف: تمرير cv2.imwrite ("buffer.png"، output) #Edge _name_ == "_main_": search_terms = ["supernova"، "planet"، "galaxy"، "Milky way"، "nebula"، "stars"] # يمكن تغيير مصطلحات البحث إلى ما تريد أن تتضمنه القبة السماوية img_arr = get_image_search (64، search_terms) طباعة ("تم استرداد الصور وتصفيتها العصبية")

الخطوة 7: تطبيق Electron

ملخص

سننشئ تطبيقًا إلكترونيًا بسيطًا يقوم فقط بوضع عنصر PhotoSphere وتحميله. ملفات main.js و package.json موجودة مباشرة من موقع Electron على الويب ، و HTML هو نسخة معدلة قليلاً من HTML المتوفر على موقع PhotoSphere الإلكتروني. لقد قمت بتضمين الملفات ، لكنني قمت بإعادة تسمية الكل إلى.txt ، لأن Instructables لا تسمح بأنواع الملفات هذه. لاستخدام الملفات ، أعد تسميتها بالملحق المناسب.

الرمز

main.js

const {app، BrowserWindow} = تتطلب ('الإلكترون')

function createWindow () {const win = new BrowserWindow ({width: 800، height: 600، webPreferences: {nodeIntegration: true}}) win.loadFile ('index.html')} app.whenReady (). ثم (createWindow) app.on ('window-all-closed'، () => {if (process.platform! == 'darwin') {app.quit ()}}) app.on ('تفعيل'، () => {if (BrowserWindow.getAllWindows (). length === 0) {createWindow ()}})

package.json

{

"الاسم": "مسافة" ، "الإصدار": "0.1.0" ، "الرئيسي": "main.js" ، "البرامج النصية": {"البدء": "الإلكترون." }}

index.html

الخطوة الثامنة: التنفيذ

تكوين صورة مستطيلة الشكل

لإنشاء الصورة ، قم بتشغيل البرنامج النصي api.py في موجه الأوامر ، مع تنشيط بيئته الافتراضية:

api.py

بعد انتهاء تنفيذ البرامج النصية ، قم بتشغيل تطبيق الإلكترون باستخدام:

بدء npmهاهو! القبة السماوية الخاصة بك نشطة! شكرا للقراءة:)

موصى به: