XML
XML تنسيق نصي يضع وسومًا مخصصة متداخلة في بنية شجرية للبيانات المنظمة. يتناول هذا النص صياغته ومخططاته وتعليقات PASCAL VOC ومقارنته بـ JSON وYAML.
XML (لغة الترميز القابلة للامتداد) تنسيق نصي للبيانات المنظّمة، تتداخل فيه الوسوم المخصصة لتشكّل شجرة، مثل عنصر <size> يحتوي على <width> و<height>. ونشر اتحاد شبكة الويب العالمية XML 1.0 توصيةً في فبراير 1998، بوصفه مجموعة فرعية مبسطة من SGML (لغة الترميز العامة القياسية) لتبادل المستندات والبيانات عبر الويب. ولا يتضمن XML وسومًا محددة مسبقًا، بخلاف HTML: إذ يحدد كل تطبيق وسومه الخاصة للدلالة على بياناته، ولهذا بُنيت عليه تنسيقات ملفات كثيرة، من رسومات SVG وخلاصات RSS إلى مستندات Microsoft Office. وفي تعلم الآلة والرؤية الحاسوبية، يظهر XML في الغالب في ملفات التعليقات التوضيحية، وملفات النماذج، وأنظمة الرعاية الصحية والمؤسسات التي توفر بيانات التدريب.
صياغة XML والتحقق من صحته#
يحتوي مستند XML على عنصر جذر واحد بالضبط. ويمكن للعناصر أن تضم نصًا وعناصر فرعية وسمات مكتوبة داخل وسم الفتح، كما في <box label="car" xtl="10">، وتفصل المساحات الاسمية المعلنة باستخدام xmlns بين الوسوم المنتمية إلى مفردات مختلفة. ويكون المستند حسن التكوين إذا اتبع قواعد الصياغة، فأُغلقت جميع الوسوم، وتداخلت العناصر على نحو صحيح، ووُضعت قيم السمات بين علامتي اقتباس، ويجب على المحللات التوقف عند أول خطأ في سلامة التكوين. ويكون المستند صالحًا أيضًا عندما يطابق مخططًا، يُكتب بتعريف نوع المستند (DTD) أو بمخطط XML (XSD)، يسرد العناصر المسموح بها وترتيبها وأنواع بياناتها. وتحدد تعبيرات XPath، مثل size/width، العقد من الشجرة، وتحول أوراق أنماط XSLT مفردات XML من صيغة إلى أخرى.
XML في الرؤية الحاسوبية وتعلم الآلة#
جعل تحدي PASCAL VOC، الذي أُقيم بين عامي 2005 و2012، من XML تنسيق التعليقات التوضيحية التقليدي لـاكتشاف الكائنات. فلكل صورة ملف XML واحد يتضمن اسم الملف وحجمه، وعنصر <object> لكل كائن، يحتوي على اسم الفئة والعلامتين truncated وdifficult، وعنصر <bndbox> الذي تحدد زواياه بالبكسل xmin وymin وxmax وymax مربع الإحاطة. وتحفظ أداة التعليقات التوضيحية LabelImg هذا التنسيق افتراضيًا، لذا لا تزال كثير من مجموعات البيانات توزّع به، وتحتاج إلى تحويله أثناء المعالجة المسبقة للبيانات. ويخزن تصدير CVAT for images 1.1 من CVAT كل التعليقات التوضيحية لمهمة واحدة في ملف XML واحد، مع كتابة المربعات كسمات مثل xtl وytl وxbr وybr.
يصف XML النماذج والسجلات أيضًا. يخزن التمثيل الوسيط لـIntel OpenVINO طبقات الشبكة وروابطها في ملف .xml، وأوزانها في ملف .bin مطابق، كما تُوزّع كواشف الوجوه المدرّبة مسبقًا باستخدام Haar cascade في OpenCV بصيغة XML. ويمكن تبادل سجلات HL7 FHIR الصحية، التي تقرنها مشاريع الذكاء الاصطناعي السريري بالصور من أجل تحليل الصور الطبية، بصيغة XML أو JSON، كما أن ملفات Word وExcel أرشيفات ZIP لأجزاء XML تقرؤها أنظمة الذكاء الاصطناعي.
يحلّل هذا المثال تعليقًا توضيحيًا بتنسيق VOC باستخدام ElementTree المضمّن في Python، ويحوّل كل مربع إلى إحداثيات المركز والعرض والارتفاع المُطبَّعة وفق تنسيق تسميات YOLO:
import xml.etree.ElementTree as ET
# A PASCAL VOC annotation: one XML file per image, one <object> per box
voc = """
<annotation>
<filename>000017.jpg</filename>
<size><width>480</width><height>364</height><depth>3</depth></size>
<object><name>person</name><difficult>0</difficult>
<bndbox><xmin>185</xmin><ymin>62</ymin><xmax>279</xmax><ymax>199</ymax></bndbox></object>
<object><name>horse</name><difficult>0</difficult>
<bndbox><xmin>90</xmin><ymin>78</ymin><xmax>403</xmax><ymax>336</ymax></bndbox></object>
</annotation>
"""
root = ET.fromstring(voc)
w, h = int(root.find("size/width").text), int(root.find("size/height").text)
# Convert corner pixels to YOLO's normalized center x, center y, width, height
for obj in root.iter("object"):
box = obj.find("bndbox")
x1, y1, x2, y2 = (float(box.find(k).text) for k in ("xmin", "ymin", "xmax", "ymax"))
cx, cy = ((x1 + x2) / 2 - 1) / w, ((y1 + y2) / 2 - 1) / h # VOC pixel indices start at 1
print(obj.find("name").text, f"{cx:.3f} {cy:.3f} {(x2 - x1) / w:.3f} {(y2 - y1) / h:.3f}")يطبع المثال person 0.481 0.356 0.196 0.376 وhorse 0.511 0.566 0.652 0.709: المربعين نفسيهما معبّرًا عنهما بكسور من حجم الصورة، وجاهزين للكتابة في أسطر التسميات بعد فهارس الفئات. ويتولى ملف مجموعة بيانات Ultralytics VOC.yaml هذا التحويل تلقائيًا عند الاستخدام الأول؛ إذ ينزّل VOC 2007 و2012، ويحلل كل تعليق توضيحي بصيغة XML باستخدام ElementTree، ويتخطى الكائنات الموسومة بـ difficult، ويكتب تسميات YOLO .txt لـ16,551 صورة تدريب و4,952 صورة تحقق.
XML مقارنةً بـJSON وYAML#
- JSON: كائنات ومصفوفات وسلاسل وأرقام وقيم منطقية بصياغة أبسط من XML، مع تحويل مباشر إلى قواميس Python وكائنات JavaScript. وتستخدمه واجهات الويب وتعليقات مجموعة بيانات COCO.
- YAML: يستخدم المسافات البادئة بدلًا من وسوم الإغلاق، ويدعم التعليقات، ويقبل منذ YAML 1.2 أي مستند JSON، ما يجعله شائعًا لملفات الإعدادات التي تُحرر يدويًا، مثل ملفات مجموعات بيانات YOLO وملفات النماذج.
- XML: أكثر إسهابًا، ويتميز بالمخططات والمساحات الاسمية والسمات والمحتوى المختلط، أي النص المصحوب بترميز مضمن، ما يجعله مناسبًا للمستندات والهيئات المعنية بالمعايير التي تحتاج إلى تحقق صارم.
تحليل XML غير الموثوق به#
تتيح ميزة الكيانات في XML للمستند تعريف نص قابل لإعادة الاستخدام، ويستغل المهاجمون هذه الميزة. ففي هجوم «مليار ضحكة»، تشير نحو عشرة تعريفات متداخلة للكيانات، يكرر كل منها الإشارة إلى التعريف السابق عشر مرات، إلى توسعة ملف لا يتجاوز بضع مئات من البايتات إلى غيغابايتات من النص. ويعرّف هجوم الكيانات الخارجية في XML (XXE) كيانًا يشير إلى ملف محلي أو عنوان URL داخلي، بحيث يقرأ المحلل الضعيف الأسرار إلى داخل المستند أو يرسل طلبات من داخل الشبكة. ولا توسّع xml.etree.ElementTree في Python الكيانات الخارجية، وتُصدر خطأ تحليل عند مصادفة أحدها، كما أن محلل Expat يقاوم هجوم مليار ضحكة بدءًا من الإصدار 2.4.1. وتمضي حزمة defusedxml إلى أبعد من ذلك، إذ تُصدر EntitiesForbidden عند أي تصريح بكيان، داخليًا كان أم خارجيًا.










