XML
XML là định dạng văn bản lồng các thẻ tùy chỉnh thành cây dữ liệu có cấu trúc. Bài viết trình bày cú pháp, schema, chú thích PASCAL VOC và so sánh với JSON và YAML.
XML (Ngôn ngữ đánh dấu mở rộng) là định dạng văn bản dành cho dữ liệu có cấu trúc, trong đó các thẻ tùy chỉnh lồng vào nhau tạo thành cây, chẳng hạn một phần tử <size> chứa <width> và <height>. World Wide Web Consortium công bố XML 1.0 dưới dạng Khuyến nghị vào tháng 2 năm 1998, như một tập con đơn giản hóa của SGML (Ngôn ngữ đánh dấu tổng quát chuẩn) để trao đổi tài liệu và dữ liệu trên web. XML không có thẻ được định nghĩa sẵn, khác với HTML: mỗi ứng dụng tự định nghĩa thẻ để thể hiện ý nghĩa dữ liệu, vì vậy nhiều định dạng tệp được xây dựng trên XML, từ đồ họa SVG, nguồn tin RSS đến tài liệu Microsoft Office. Trong machine learning và thị giác máy tính, XML chủ yếu xuất hiện trong tệp gán nhãn, tệp model và các hệ thống y tế, doanh nghiệp cung cấp dữ liệu huấn luyện.
Cú pháp và xác thực XML#
Tài liệu XML có chính xác một phần tử gốc. Phần tử có thể chứa văn bản, phần tử con và thuộc tính được viết bên trong thẻ mở, như trong <box label="car" xtl="10">; các namespace được khai báo bằng xmlns giúp phân biệt thẻ thuộc những bộ từ vựng khác nhau. Tài liệu tuân theo quy tắc cú pháp, trong đó mọi thẻ đều được đóng, các phần tử được lồng đúng cách và giá trị thuộc tính được đặt trong dấu ngoặc kép, được gọi là well-formed; parser phải dừng khi gặp lỗi well-formedness đầu tiên. Tài liệu cũng hợp lệ khi khớp với schema, được viết dưới dạng Định nghĩa kiểu tài liệu (DTD) hoặc Lược đồ XML (XSD), liệt kê các phần tử được phép, thứ tự của chúng và kiểu dữ liệu. Các biểu thức XPath như size/width chọn node trong cây, còn stylesheet XSLT chuyển đổi bộ từ vựng XML này sang bộ khác.
XML trong thị giác máy tính và machine learning#
Cuộc thi PASCAL VOC, được tổ chức từ năm 2005 đến 2012, đưa XML trở thành định dạng gán nhãn kinh điển cho phát hiện đối tượng. Mỗi ảnh có một tệp XML chứa tên và kích thước tệp, cùng một phần tử <object> cho mỗi đối tượng; phần tử này lưu tên lớp, các cờ truncated và difficult, cùng một phần tử <bndbox> có các góc pixel xmin, ymin, xmax và ymax xác định bounding box. Công cụ gán nhãn LabelImg mặc định lưu theo định dạng này, nên nhiều dataset vẫn sử dụng định dạng đó và cần chuyển đổi trong quá trình tiền xử lý dữ liệu. Bản xuất CVAT for images 1.1 từ CVAT lưu mọi gán nhãn của một tác vụ trong một tệp XML duy nhất, với các box được ghi bằng những thuộc tính như xtl, ytl, xbr và ybr.
XML cũng mô tả model và bản ghi. Biểu diễn Trung gian OpenVINO của Intel lưu các lớp và kết nối của mạng trong tệp .xml, còn trọng số nằm trong tệp .bin tương ứng; các detector khuôn mặt Haar cascade pretrained của OpenCV cũng được phân phối dưới dạng XML. Hồ sơ y tế HL7 FHIR, được các dự án AI lâm sàng ghép với ảnh để phân tích ảnh y tế, có thể trao đổi dưới dạng XML hoặc JSON; các tệp Word và Excel là kho lưu trữ ZIP gồm các phần XML mà hệ thống AI đọc.
Ví dụ này phân tích cú pháp một gán nhãn VOC bằng ElementTree tích hợp sẵn trong Python rồi chuyển từng box thành tâm, chiều rộng và chiều cao đã chuẩn hóa theo định dạng nhãn 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}")Lệnh in ra person 0.481 0.356 0.196 0.376 và horse 0.511 0.566 0.652 0.709: hai box tương tự được biểu diễn dưới dạng tỷ lệ so với kích thước ảnh, sẵn sàng ghi thành các dòng nhãn sau chỉ số lớp. Tệp dataset VOC.yaml của Ultralytics tự động thực hiện chuyển đổi này trong lần sử dụng đầu tiên: tải VOC 2007 và 2012, phân tích mọi gán nhãn XML bằng ElementTree, bỏ qua các đối tượng được đánh dấu difficult và ghi nhãn .txt của YOLO cho 16,551 ảnh huấn luyện và 4,952 ảnh validation.
XML so với JSON và YAML#
- JSON: Đối tượng, mảng, chuỗi, số và giá trị boolean với cú pháp gọn hơn XML, ánh xạ trực tiếp sang dictionary Python và object JavaScript. API web và chú thích của bộ dữ liệu COCO sử dụng định dạng này.
- YAML: Dùng thụt lề thay cho thẻ đóng, hỗ trợ comment và có cú pháp chấp nhận mọi tài liệu JSON kể từ YAML 1.2; nhờ vậy, YAML phổ biến cho các tệp cấu hình được chỉnh sửa thủ công, chẳng hạn tệp dataset và model YOLO.
- XML: Dài dòng hơn, có schema, namespace, thuộc tính và nội dung hỗn hợp—tức văn bản có markup nội tuyến—phù hợp với tài liệu và các tổ chức tiêu chuẩn cần xác thực nghiêm ngặt.
Phân tích cú pháp XML không đáng tin cậy#
Tính năng entity của XML cho phép tài liệu định nghĩa văn bản có thể tái sử dụng, nhưng kẻ tấn công có thể lợi dụng tính năng này. Trong cuộc tấn công "billion laughs", khoảng mười định nghĩa entity lồng nhau, mỗi định nghĩa tham chiếu đến định nghĩa trước đó mười lần, có thể mở rộng tệp vài trăm byte thành hàng gigabyte văn bản. Tấn công thực thể bên ngoài XML (XXE) khai báo một entity trỏ đến tệp cục bộ hoặc URL nội bộ, khiến parser dễ bị tấn công đọc bí mật vào tài liệu hoặc gửi yêu cầu từ bên trong mạng. xml.etree.ElementTree của Python không mở rộng entity bên ngoài và phát sinh lỗi phân tích cú pháp khi gặp entity như vậy; parser Expat của thư viện này chống được cuộc tấn công billion laughs kể từ phiên bản 2.4.1. Gói defusedxml còn tăng cường bảo vệ bằng cách phát sinh EntitiesForbidden với mọi khai báo entity, dù là nội bộ hay bên ngoài.










