JSON
JSONは、API、アノテーション、モデル出力に使われる、オブジェクト、配列、値を表すテキスト形式です。構文規則、MLでの用途、JSON Lines、コードについて解説します。
JavaScript Object Notationの略称であるJSONは、構造化データの保存や交換に使う軽量なテキスト形式です。Douglas Crockfordが2000年代初頭に仕様を定め、JavaScriptのオブジェクトリテラル構文を基にしており、現在はIETF RFC 8259およびECMA-404として標準化されています。JSONは言語に依存せず、人が読みやすく、ほぼすべてのプログラミング言語の標準ライブラリで解析できるため、Web APIのデフォルト形式になっています。機械学習(ML)では、推論エンジンから予測結果を受け取り、データセットのアノテーションを保存し、実験のメタデータを記録し、大規模言語モデル(LLM)の構造化出力を定義します。
JSON構文#
JSONドキュメントは、2種類のコンテナと4種類の値で構成されます。
- オブジェクト: 波括弧で囲まれたキーと値の順不同の集合です。例:
{"name": "bus", "confidence": 0.94}。キーは二重引用符で囲んだ文字列である必要があります。 - 配列: 角括弧で囲まれた順序付きリストです。例:
[48.5, 398.0, 245.3, 902.1]。 - 値: 文字列、数値、リテラル
true、false、null、またはネストされたオブジェクトと配列です。
この形式には厳格なルールがあります。コメント、末尾のカンマ、シングルクォートで囲まれた文字列、および値NaNとInfinityは使用できません。ただし、Pythonのjsonモジュールは、allow_nan=Falseが設定されていない限り、デフォルトでNaNを書き込み、厳格なパーサーが拒否するファイルを生成します。RFC 8259はまた、数値を確実に交換できるのはIEEE 754倍精度の範囲内に限られると警告しています。そのため、一部のデータベースIDのように2⁵³ − 1を超える整数は、文字列として送信されることがよくあります。
機械学習ワークフローにおけるJSON#
セキュリティシステムのカメラがフレームを物体検出サービスに送信すると、通常、モデルサービング層はJSONで応答します。検出された物体ごとに1つのレコードがあり、クラス、信頼度スコア、バウンディングボックスの座標が含まれます。結果は、ダッシュボード、モバイルアプリ、MongoDBなどのドキュメントデータベースですぐに利用できます。
アノテーション形式でもJSONが使用されます。COCOデータセットでは、各データセット分割のすべてのラベルを1つのJSONファイルに保存し、そのJSONファイルに含まれる主な3つのリストは、ファイル名とサイズを含むimages、クラスIDと名前を含むcategories、および各エントリーがIDで画像とカテゴリを参照し、左上隅を原点とするピクセル単位のボックスを[x, y, width, height]として保存するannotationsです。一方、YOLO形式では画像ごとに正規化された中心座標を記録したテキストファイルを1つ使用し、2つの形式間の変換はデータアノテーションパイプラインで一般的な手順ですが、カスタムデータセットクラスを使ってCOCO JSONからYOLOを直接学習することもできます。
JSON Lines(NDJSONとも呼ばれます)は、1行ごとに完全なJSONオブジェクトを1つ記述します。ファイル全体を解析せずに追記、ストリーミング、分割できるため、学習ログ、予測ストリーム、LLMのファインチューニングに使う指示データセットに適しています。LLMでは、JSON Schemaによってアプリケーションが期待する正確なフィールドを記述し、構造化出力と関数呼び出しによって、モデルがそれに適合するJSONを生成するよう制約します。GeoJSONはRFC 7946として標準化されており、この形式を地理的特徴に適用します。これにより、衛星画像解析で検出結果を地図上に配置できます。
予測結果をJSONに変換する#
Ultralytics YOLOのResultsオブジェクトは、to_json()を使って予測結果をシリアライズします。検出ごとに1つのレコードを書き出し、クラス名、クラスID、信頼度、ボックスの角x1、y1、x2、y2に加えて、インスタンスセグメンテーションモデルとポーズ推定モデルではマスクまたはキーポイントの座標を記録します。次の例では、サンプル画像にYOLO26を適用し、Pythonの標準ライブラリでJSONを再度解析します。
import json
from ultralytics import YOLO
# 事前学習済みYOLO26検出モデルを読み込み、推論を実行します
model = YOLO("yolo26n.pt")
results = model("https://ultralytics.com/images/bus.jpg")
result = results[0]
# すべての検出結果をJSON文字列にシリアライズします(normalize=Trueにすると、ボックスが0~1の範囲にスケーリングされます)
json_string = result.to_json()
# 任意のJSONパーサーで読み戻せます。ここではPythonの辞書のリストに読み込みます
detections = json.loads(json_string)
print(json.dumps(detections[0], indent=2))出力されたレコードは、キーname、class、confidenceを持つJSONオブジェクトです。ネストされたboxオブジェクトには、ピクセル単位の角の座標が格納されています。
JSONと関連形式の比較#
- YAML: コメントとインデントによるネストに対応した、より読みやすい形式です。学習設定やデータセット定義でよく使われます。YAML 1.2はJSONのスーパーセットとして設計されているため、ほとんどのJSONドキュメントは有効なYAMLでもあります。
- XML: タグベースの形式で、Pascal VOCのアノテーションに使われます。JSONより冗長ですが、属性、名前空間、スキーマに対応しています。
- CSV: 表形式のデータをコンパクトに表現できますが、オブジェクトやリストをネストできない形式です。
- バイナリ形式: Protocol BuffersとMessagePackはJSONよりサイズが小さく、解析も高速ですが、人間には読み取れません。ONNXモデルファイルはProtocol Buffersメッセージとして保存されます。










