جدول المحتويات:
- الخطوة 1: إعداد بيئتك
- الخطوة 2: الاستعلام عن NASA Search API
- الخطوة 3: الشبكة العصبية التلافيفية
- الخطوة 4: معالجة الصورة
- الخطوة 5: خياطة الصور معًا في إسقاط متساوي المستطيل
- الخطوة 6: نص بايثون الكامل
- الخطوة 7: تطبيق Electron
- الخطوة الثامنة: التنفيذ
فيديو: القبة السماوية المدعومة بالشبكة العصبية باستخدام Python و Electron و Keras: 8 خطوات
2024 مؤلف: John Day | [email protected]. آخر تعديل: 2024-01-30 07:37
في هذا الدليل ، سأوضح لك كيف كتبت مولدًا آليًا للقمبة السماوية ثلاثي الأبعاد ، باستخدام 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 = لين (البيانات) أثناء العد
الخطوة 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هاهو! القبة السماوية الخاصة بك نشطة! شكرا للقراءة:)
موصى به:
NAS (التخزين المتصل بالشبكة) باستخدام Raspberry Pi: 6 خطوات
NAS (التخزين المتصل بالشبكة) باستخدام Raspberry Pi: يعد التخزين المتصل بالشبكة أو NAS باختصار جهازًا جيدًا حقًا إذا كنت تتعامل مع عدد كبير من الملفات والبيانات. لدي الكثير من المحتوى المرتبط بعملي على محرك الأقراص الثابتة الداخلي لجهاز الكمبيوتر الخاص بي لدرجة أنه لا يترك مساحة كبيرة لبياناتي الشخصية ، لذلك
القبة السماوية الجيوديسية المغناطيسية: 7 خطوات (بالصور)
القبة السماوية الجيوديسية المغناطيسية: مرحبًا بكم جميعًا! أود أن أطلعك على عمليتي في إنشاء قبة فلكية جيوديسية مثبتة بالمغناطيس والأسلاك الحرفية! سبب استخدام هذا المغناطيس هو لسهولة إزالته في أوقات المطر أو أقل من الظروف الجوية المثالية. بهذه الطريقة
القبة السماوية / Orrery التي تعمل بتقنية البلوتوث: 13 خطوة (بالصور)
القبة السماوية / Orrery المزودة بتقنية Bluetooth: تم إنشاء هذه التعليمات لتلبية متطلبات مشروع Makecourse في جامعة جنوب فلوريدا (www.makecourse.com). لقد بدأ كمشروع لمدة فصل دراسي لـ Makecour
القبة السماوية المنشطة بالصوت: 8 خطوات (بالصور)
القبة السماوية المنشطة بالصوت: تم إنشاء هذه التعليمات لتلبية متطلبات مشروع Makecourse في جامعة جنوب فلوريدا (www.makecourse.com). تتمثل الوظيفة الأساسية للقبة السماوية في التنشيط مع
كيفية بناء القبة السماوية LED: 7 خطوات (بالصور)
كيفية بناء القبة السماوية LED: يحب الجميع النظر إلى النجوم. لسوء الحظ ، غالبًا ما تمنع أضواء المدينة والغيوم والتلوث هذا من أن يكون وقتًا متكررًا. تساعد هذه التعليمات في التقاط بعض الجمال ومعظم الرومانسية المرتبطة بالسماء ووضع