OCRテキスト認識アシスタント

【ディープラーニングOCRシリーズ・4】リカレントニューラルネットワークとシーケンスモデリング

OCRにおけるRNN、LSTM、GRUの応用について詳しく学びましょう。 シーケンスモデリングの原理、勾配問題の解、双方向RNNの利点の詳細な分析。

## はじめに リカレントニューラルネットワーク(RNN)は、深層学習におけるニューラルネットワークアーキテクチャで、シーケンスデータの処理を専門としています。 OCRタスクにおいて、テキスト認識は本質的にシーケンス間の変換問題であり、画像の特徴の列をテキスト文字の列に変換します。 この記事では、RNNの仕組み、主なバリエーション、OCRにおける具体的な応用について掘り下げ、読者に包括的な理論的基盤と実践的な指針を提供します。 ## RNN基礎 ### 従来のニューラルネットワークの限界 従来のフィードフォワードニューラルネットワークは、配列データの処理に根本的な限界があります。 これらのネットワークは入力データが独立かつ均様分布であると仮定し、シーケンス内の要素間の時間的依存関係を捉えることができません。 **フィードフォワードネットワークの問題**: - 入力および出力長の固定:可変長のシーケンスは扱えません - 記憶力の欠如:歴史的情報を利用できない - パラメータ共有の難しさ:同じパターンを異なる場所で繰り返し学習する必要があります - 位置感度:入力の順序を変えると、全く異なる出力が出ることがあります これらの制限は特にOCRタスクで顕著です。 テキストシーケンスは文脈に大きく依存し、前の文字の認識結果が後続の文字の確率を判断するのに役立つことが多いです。 例えば、英語の単語「the」を識別する際、「th」がすでに認識されている場合、次の文字は「e」である可能性が高いです。 ### RNNの核心的な考え方 RNNはループ結合を導入することで配列モデリングの問題を解決します。 核心的な考え方は、ネットワークに「メモリ」機構を追加し、過去の瞬間からの情報を保存・利用できるようにすることです。 **RNNの数学的表現**: モーメントtにおけるRNNの隠れ状態h_t現在の入力x_tと前回モーメントh_{t-1}の隠れ状態によって決まります。 h_t = f(W_hh * h_{t-1} + W_xh * x_t + b_h) その中には以下の通りです: - W_hh は隠れた状態から隠れた状態への重み行列です - W_xh は隠れ状態に入力された重み行列です - b_h はバイアスベクトルです - f は活性化関数(通常は tanh または ReLU) 出力y_tは現在の隠れ状態から計算されます: y_t = W_hy * h_t + b_y **RNNの利点**: - パラメータ共有:すべてのタイムステップで同じ重みを共有する - 可変長シーケンス処理:任意の長さの入力シーケンスを扱えます - 記憶能力:隠れた状態はネットワークの「記憶」として機能します - 柔軟な入力・出力:1対1、1対多、多対1、多対多モードなどに対応しています ### RNNの拡大ビュー RNNの仕組みをよりよく理解するために、時間的次元で拡張することができます。 拡張されたRNNはディープフィードフォワードネットワークのように見えますが、すべてのタイムステップは同じパラメータを共有しています。 **時間の展開の重要性**: - 情報の流れが分かりやすい:時間ステップ間で情報がどのように伝達されるかを明確に確認できます - 勾配計算:勾配は時間逆伝播(BPTT)アルゴリズムによって計算されます - 並列化の考慮:RNNは本質的に逐次的ですが、特定の操作は並列化可能です **展開過程の数学的記述**: 長さ T の列に対して、RNN は次のように展開します。 h_1 = f(W_xh * x_1 + b_h) h_2 = f(W_hh * h_1 + W_xh * x_2 + b_h) h_3 = f(W_hh * h_2 + W_xh * x_3 + b_h) ... h_T = f(W_hh * h_{T-1} + W_xh * x_T + b_h) この展開されたフォームは、情報が時間ステップ間でどのように伝達され、パラメータがすべての時間ステップ間でどのように共有されているかを明確に示しています。 ## 勾配消失と爆発問題 ### 問題の根本 RNNの訓練には、時間経過による逆伝播(BPTT)アルゴリズムを使用します。 アルゴリズムは各タイムステップパラメータの損失関数の勾配を計算する必要があります。 **勾配計算のための連鎖法則**: 列が長い場合、勾配は複数の時間ステップにわたって逆伝播する必要があります。 連鎖法則によれば、勾配は重み行列の複数乗算を含む。 ∂L/∂W = Σ_t (∂L/∂y_t) * (∂y_t/∂h_t) * (∂h_t/∂W) ここで∂h_t/∂Wは、瞬間tからモーメント1までのすべての中間状態の積を含みます。 **勾配消失の数学的解析**: 時間ステップ間の勾配の伝播を考えます: ∂h_t/∂h_{t-1} = diag(f_prime(W_hh * h_{t-1} + W_xh * x_t + b_h)) * W_hh 列長が T の場合、勾配にはそのような積項 T-1 個が含まれます。 W_hhの最大固有値が1未満の場合、連続行列の乗算は勾配指数関数的減衰を引き起こします。 **勾配爆発の数学的解析**: 逆に、W_hhの最大固有値が1を超えると、勾配は指数関数的に増加します。 ||∂h_t/∂h_1|| ≈ ||W_hh||^{t-1} これにより、不安定なトレーニングや過剰なパラメータ更新が発生します。 ### 解決策の詳細な説明 グラデーションクリッピング: 勾配クリッピングは勾配爆発を解決する最も直接的な方法です。 勾配ノルムが設定された閾値を超えると、勾配は閾値サイズにスケールされます。 この方法はシンプルで効果的ですが、しきい値の慎重な選択が必要です。 閾値が小さすぎると学習能力が制限され、閾値が大きすぎると勾配爆発を効果的に防げません。 **重み初期化戦略**: 適切な重さの初期化は勾配の問題を緩和できます: - ザビエル初期化:重み分散は1/nで、nは入力次元 - He初期化:重み分散は2/nで、ReLU活性化関数に適しています - 直交初期化:重み行列を直交行列として初期化します **活性化機能の選択**: 異なる活性化関数は勾配伝搬に異なる影響を与えます: - タン:出力範囲[-1,1]、勾配最大値1 - ReLU:勾配消失を緩和できますが、神経細胞の死を引き起こす可能性があります - リーキーReLU:ReLUの神経細胞死の問題を解決します **建築的改良**: 最も根本的な解決策はRNNアーキテクチャの改良であり、これがLSTMやGRUの登場につながりました。 これらのアーキテクチャは、ゲーティング機構や専門的な情報フロー設計を通じて勾配に対応しています。 ## LSTM:長短期記憶ネットワーク ### LSTMのデザイン動機 LSTM(Long Short-Term Memory)は、1997年にHochreiterとSchmidhuberによって提案されたRNNの変種であり、勾配消失や長距離依存学習障害の問題を解決するために特別に設計されました。 **LSTMの中核的な革新**: - セル状態:情報の「ハイウェイ」として機能し、情報が時間ステップ間で直接流れることを可能にします - ゲート機構:情報の流入、保持、出力を正確に制御する - 解離記憶メカニズム:短期記憶(隠れた状態)と長期記憶(細胞状態)を区別する **LSTMが勾配問題を解決する方法**: LSTMは乗算ではなく加法演算でセル状態を更新し、勾配がより早い時間ステップへ流れやすくなります。 細胞状態の更新された式: C_t = f_t ⊙ C_{t-1} + i_t ⊙ C_tilde_t ここでは要素レベルの加算が用いられ、従来のRNNの連続行列乗算を回避しています。 ### LSTMアーキテクチャの詳細な説明 LSTMは3つのゲートユニットとセル状態を含みます: **1. ゲートを忘れよう**: 忘却の門はセル状態からどの情報を捨てるかを決定します: f_t = σ(W_f · [h_{t-1}, x_t] + b_f) オブリビオンゲートの出力は0から1の間で、0は「完全に忘れ去られた」、1は「完全に保持」されます。 このゲートにより、LSTMは重要でない歴史的情報を選択的に忘れることができます。 **2. 入力ゲート**: 入力ゲートはセル状態に保存される新しい情報を決定します: i_t = σ(W_i · [h_{t-1}, x_t] + b_i) C_tilde_t = tanh(W_C · [h_{t-1}, x_t] + b_C) 入力ゲートは2つの部分から成り立っています。シグモイド層はどの値を更新するかを決定し、tanh層は候補値ベクトルを作成します。 **3. セルの状態更新**: 忘却ゲートと入力ゲートの出力を組み合わせてセル状態を更新します: C_t = f_t ⊙ C_{t-1} + i_t ⊙ C_tilde_t この式はLSTMの核心であり、要素レベルの乗算・加算操作による情報の選択的保持と更新です。 **4. 出力ゲート**: 出力ゲートはセルのどの部分を出力するかを決定します: o_t = σ(W_o · [h_{t-1}, x_t] + b_o) h_t = o_t ⊙ tanh(C_t) 出力ゲートはセルの状態のどの部分が現在の出力に影響を与えるかを制御します。 ### LSTMのバリエーション **のぞき穴 LSTM**: 標準的なLSTMを基に、ピープホールLSTMはゲートユニットにセル状態を表示させます: f_t = σ(W_f · [C_{t-1}, h_{t-1}, x_t] + b_f) i_t = σ(W_i · [C_{t-1}, h_{t-1}, x_t] + b_i) o_t = σ(W_o · [C_t, h_{t-1}, x_t] + b_o) **連結LSTM**: 忘却ゲートと入力ゲートを組み合わせて、忘れられた情報量が入力された情報量と等しいことを確認します。 f_t = σ(W_f · [h_{t-1}, x_t] + b_f) i_t = 1 - f_t この設計により、パラメータの数を減らしつつ、LSTMのコア機能を維持しています。 ## GRU:ゲートループユニット ### GRUの簡易設計 GRU(Gated Recurrent Unit)は、2014年にChoらによって提案されたLSTMの簡略版です。 GRUはLSTMの3つのゲートを2つのゲートに簡素化し、セルラー状態と隠れた状態を統合します。 **GRUのデザイン哲学**: - 構造の簡素化:ドアの数を減らし、計算の複雑さを軽減します - パフォーマンス維持:LSTMと同等の性能を維持しつつ簡素化 - 実装が容易:構造が簡潔であるため、実装や試運転が容易になります ### GRUのゲート機構 **1. リセットゲート**: r_t = σ(W_r · [h_{t-1}, x_t] + b_r) リセットゲートは新しい入力と前のメモリをどのように結合するかを決定します。 リセットゲートが0に近づくと、モデルは以前の隠れた状態を無視します。 **2. アップデート ゲート**: z_t = σ(W_z · [h_{t-1}, x_t] + b_z) アップデートゲートは、過去の情報の残留量と追加する新しい情報の量を決定します。 これは忘却ゲートと入力の両方を制御し、LSTMにおける忘却ゲートと入力ゲートの組み合わせに似ています。 **3. 候補者の隠れた状態**: h_tilde_t = tanh(W_h · [r_t ⊙ h_{t-1}, x_t] + b_h) 候補隠れた状態はリセットゲートを使って前の隠れた状態の影響を制御します。 **4. 最終隠れた状態**: h_t = (1 - z_t) ⊙ h_{t-1} + z_t ⊙ h_tilde_t 最終的な隠れ状態は、前の隠れ状態と候補隠れ状態の重み付き平均です。 ### GRUとLSTMの詳細な比較 **パラメータ数の比較**: - LSTM:4つの重み行列(ゲート、入力ゲート、候補値、出力ゲート) - GRU:3つの重み行列(リセットゲート、更新ゲート、候補値) - GRUのパラメータ数はLSTMの約75%です **計算複雑性比較**: - LSTM:4ゲート出力の計算とセルの状態更新が必要 - GRU:2つのゲートの出力と隠れた状態更新を計算するだけです - GRUは通常LSTMより20〜30%高速です **パフォーマンス比較**: - ほとんどのタスクで、GRUとLSTMは同等の性能を発揮します - LSTMは一部の長系列タスクにおいてGRUよりやや優れている場合があります - 計算資源が限られている場合にはGRUがより良い選択肢です ## 双方向RNNs ### 双方向処理の必要性 多くのシーケンスモデリングタスクでは、現在の瞬間の出力は過去だけでなく未来の情報にも依存します。 これは特にOCRタスクで重要であり、文字認識は単語や文全体の文脈を考慮する必要があることが多いです。 **一方通行RNNの限界**: - 歴史的情報のみが使用可能で、将来の文脈は得られません - 特定のタスク、特にグローバルな情報を必要とするタスクでの性能が制限されること - 曖昧なキャラクターの認識が限られている **双方向処理の利点**: - 完全な文脈情報:過去と未来の両方の情報を活用する - より良い曖昧さ解消:文脈情報を用いた曖昧さ解消 - 認識精度の向上:ほとんどの配列注釈タスクでより良いパフォーマンスを発揮 ### 双方向LSTMアーキテクチャ 双方向LSTMは2つのLSTM層で構成されています。 - フォワードLSTM:左から右へプロセスシーケンス - 逆方向LSTM:右から左へのプロセスシーケンス **数学的表現**: h_forward_t = LSTM_forward(x_t, h_forward_{t-1}) h_backward_t = LSTM_backward(x_t, h_backward_{t+1}) h_t = [h_forward_t; h_backward_t] # 隠れた状態を前後に縫い合わせる **トレーニングプロセス**: 1. 順方向LSTMはシーケンスを通常の順序で処理します 2. 逆方向LSTMは列を逆順に処理します 3. 各タイムステップで、隠れ状態を両方向につなげる 4. スプライス状態を予測に用いる **利点と欠点**: 福利厚生: - 完全な文脈情報 - 性能向上 - 対称性の処理 欠点: - 計算の複雑さを2倍にする - リアルタイム処理不可(フルシーケンスが必要) - メモリ要件の増加 ## OCRにおけるシーケンスモデリングの応用 ### テキストライン認識の詳細な説明 OCRシステムにおいて、テキストライン認識はシーケンスモデリングの典型的な応用例です。 このプロセスは、画像の特徴の連続を文字の連続に変換することを含みます。 **問題モデリング**: - 入力:画像特徴列 X = {x_1, x_2, ..., x_T} - 出力:文字列 Y = {y_1, y_2, ..., y_S} - チャレンジ:入力列長Tと出力列長Sがしばしば等しくない場合 **CRNNアーキテクチャのテキストライン認識への応用**: CRNN(畳み込み反復ニューラルネットワーク)はOCRで最も成功したアーキテクチャの一つです。 1. **CNN特徴抽出層**: - 畳み込みニューラルネットワークを用いて画像特徴を抽出する - 2D画像の特徴を1Dの特徴列に変換 - タイミング情報の連続性を維持する 2. **RNNシーケンスモデリング層**: - 双方向LSTMを用いた特徴列のモデル化 - 文字間の文脈依存関係の捕捉 - 各時間ステップに対する文字確率分布の出力 3. **CTCアライメントレイヤー**: - 入力/出力のシーケンス長の不一致に対応する - キャラクターレベルのアライメント寸法は不要 - 端から端までのトレーニング **特徴抽出をシーケンスに変換**: CNNによって抽出された特徴マップは、RNNが処理可能な配列形式に変換する必要があります。 - 特徴マップを列に分割し、各列をタイムステップとして扱う - 空間情報の年代順を維持する - 特徴列の長さが画像の幅に比例していることを確実にする ### OCRにおける注意メカニズムの応用 従来のRNNは長い配列を扱う際に情報のボトルネックを抱えています。 注意メカニズムの導入により、シーケンスモデリングの能力はさらに強化されます。 **注意メカニズムの原理**: 注意メカニズムにより、モデルは各出力を生成する際に入力シーケンスの異なる部分に注目できます。 - 固定長エンコードベクトルの情報ボトルネックを解決 - モデルの意思決定の説明可能性を提供する - 長距離配列の処理改善 **OCRにおける特定の応用**: 1. **キャラクターレベルの注意* - 各文字を特定する際に関連する画像領域に焦点を当てること - 注意の重みをその場で調整する - 複雑な背景に対する堅牢性の向上 2. **単語レベルの注意喚起**: - 語彙レベルでの文脈情報を考慮する - 言語モデルの知識を活用する - 全語認識の精度を向上させる 3. **マルチスケールの注意**: - 異なる解像度での注意メカニズムの適用 - 異なるサイズのテキストを扱う - スケール変化への適応力を向上させる **注意メカニズムの数学的表現**: エンコーダ出力列 H = {h_1, h_2, ..., h_T} およびデコーダ状態 s_t: e_{t,i} = a(s_t, h_i) # 注意スコア α_{t,i} = softmax(e_{t,i}) # 注意 重さ c_t = Σ_i α_{t,i} * h_i # コンテキストベクトル ## トレーニング戦略と最適化 ### シーケンス間トレーニング戦略 **教師の強制**: 訓練段階では、実際のターゲットシーケンスをデコーダの入力として使用します。 - 長所:高速トレーニング速度、安定した収束性 - デメリット:トレーニングおよび推論フェーズの不整合性があり、エラーの蓄積につながる **予定されたサンプリング**: 教師による強制から、トレーニング中にモデル自身の予測を活用する段階へ徐々に移行していきます。 - 初期段階で実数ラベルを使用し、後半段階で予測モデルを行う - 訓練や推論の違いを減らす - モデルの堅牢性を向上させる **カリキュラム学習**: 単純なサンプルから始め、徐々にサンプルの複雑さを上げていきます。 - 短文から長文へ:まず短いテキストを並べ、その後長いテキストを順番に進める - 鮮明からぼやけた画像へ:画像の複雑さを徐々に増やす - シンプルから複雑なフォント:印刷物から手書きまで ### 正則化技術 **RNNにおけるドロップアウトの応用**: RNNでのドロップアウト適用には特別な注意が必要です: - ループ接続にドロップアウトを適用しないでください - ドロップアウトは入力層と出力層に適用可能です - 変分ドロップアウト:すべての時間ステップで同じドロップアウトマスクを使用する **体重減少**: L2正則化は過学習を防ぐ: 損失 = クロスエントロピー + λ * ||W||² ここでλは正則化係数であり、検証集合によって最適化する必要があります。 **グラデーションクロッピング**: 勾配爆発を防ぐ効果的な方法です。 勾配ノルムが閾値を超える場合は、勾配方向を変えないように比例してスケールします。 **早期停止**: パフォーマンスの検証を監視し、パフォーマンスが改善しなくなったらトレーニングを停止します: - 過学習防止 - 計算資源の節約 - 最適モデルの選択 ### ハイパーパラメータチューニング **学習率のスケジューリング**: - 初期学習率:通常0.001〜0.01に設定されます - 学習率減衰:指数関数的減衰またはラダー減衰 - 適応学習率:Adam、RMSpropなどのオプティマイザーを使用 **バッチサイズの選択**: - 小規模バッチ:汎化性能が向上するが、訓練時間が長い - 高ボリューム:トレーニングは速いが一般化に影響を与える可能性がある - 通常、16〜128のバッチサイズが選ばれます **シーケンス長処理**: - 固定長:シーケンスを固定長に切り詰めまたは塗りつぶす - 動的長:可変長シーケンスを処理するためにパディングとマスキングを用いる - 袋詰め戦略:同長の配列をグループ化する ## パフォーマンス評価と分析 ### 指標を評価する **キャラクターレベルの正確さ**: Accuracy_char = (正しく認識された文字数) / (総文字数) これは最も基本的な評価指標であり、モデルの文字認識能力を直接反映しています。 **シリアルレベルの精度**: Accuracy_seq = (正しく認識された配列数) / (配列の総数) この指標はより厳密で、完全に正しい順序のみが正しいとみなされます。 **編集距離(レーベンシュタイン距離)**: 予測級数と真級数の差を測定します: - 挿入、除去、交換作業の最小回数 - 標準化された編集距離:編集距離÷シーケンス長 - BLEUスコア:機械翻訳でよく使われ、OCR評価にも利用できます ### エラー分析 **一般的なエラータイプ**: 1. **キャラクターの混乱**:類似したキャラクターの誤認 - 数字の0と文字のOです - 数字1と文字lです - 文字のMとN 2. **シーケンスエラー**:文字の順序に誤りが生じる - キャラクターの位置が逆になっています - 文字の重複または省略 3. **長さ誤差**:配列長の予測誤差 - 長すぎる:存在しない文字が挿入されている - 短すぎる:存在するキャラクターが欠けている **分析方法**: 1. **混乱マトリックス**:文字レベルの誤りパターンを分析 2. **注意の可視化**:モデルの懸念を理解する 3. **勾配解析**:勾配流の確認 4. **活性化解析**:ネットワークの層を超えた活性化パターンを観察する ### モデル診断 **過適合検出**: - トレーニング損失は減少し続け、検証損失は増加しています - 訓練精度が検証精度よりもはるかに高い - 解決策:規則性を高め、モデルの複雑さを低減する **アンダーフィット検出**: - トレーニングと検証の両方の損失が高い - モデルがトレーニングセット上でうまく機能しない - 解決策:モデルの複雑さを増やし、学習率を調整する **勾配問題の診断**: - 勾配損失:勾配値が小さすぎて学習が遅い - 勾配爆発:過度な勾配値は不安定な訓練を引き起こします - 解決策:LSTM/GRU、勾配クロッピングを用いる ## 実世界の応用事例 ### 手書き文字認識システム **応用シナリオ**: - 手書きノートのデジタル化:紙のメモを電子文書に変換 - フォーム自動入力:手書きフォーム内容を自動的に認識します - 歴史文書識別:古代書籍および歴史文書のデジタル化 **技術的特徴**: - 文字の大きなバリエーション:手書きテキストは高いパーソナライズ性を持っています - 連続ペン処理:文字間の接続を処理する必要があります - 文脈重要性:認識向上のために言語モデルを活用する **システムアーキテクチャ**: 1. **前処理モジュール**: - 画像のノイズ除去と強調 - 傾き補正 - テキスト行分割 2. **特徴抽出モジュール**: - CNNが視覚的特徴を抽出する - マルチスケール特徴融合 - 特徴シリアライゼーション 3. **シーケンスモデリングモジュール**: - 双方向LSTMモデリング - 注意メカニズム - 文脈符号化 4. **デコーディングモジュール**: - CTCデコードまたは注意デコード - 言語モデルの後処理 - 信頼評価 ### 印刷文書認識システム **応用シナリオ**: - 文書デジタル化:紙の文書を編集可能な形式に変換すること - 請求書認識:請求書、領収書、その他の請求書を自動的に処理します - 標識認識:道路標識、店舗看板などを識別 **技術的特徴**: - レギュラーフォント:手書きテキストよりもレギュラーフォント - タイポグラフィルール:レイアウト情報の活用が可能です - 高精度要件:商用用途では厳格な精度要件があります **最適化戦略**: 1. **マルチフォントトレーニング**:複数のフォントからのトレーニングデータを利用 2. **データ強化**:回転、拡大、ノイズ追加 3. **後処理最適化**:スペルチェック、文法修正 4. **信頼評価**:認識結果の信頼性スコアを提供します ### シーンテキスト認識システム **応用シナリオ**: - ストリートビューテキスト認識:Googleストリートビューでのテキスト認識 - 製品ラベル認識:スーパーマーケット製品の自動識別 - 交通標識認識:インテリジェント交通システムの応用 **技術的な課題**: - 複雑な背景:テキストが複雑な自然シーンに埋め込まれています - 重度変形:透視変形、曲げ変形 - リアルタイム要件:モバイルアプリはレスポンシブである必要があります **解決策**: 1. **ロバスト特徴抽出**:より深いCNNネットワークを使用 2. **マルチスケール処理**:異なるサイズのテキストを扱う 3. **幾何学的補正**:幾何学的変形を自動で補正します 4. **モデル圧縮**:モバイル向けにモデルを最適化する ## 概要 リカレントニューラルネットワークはOCRにおけるシーケンスモデリングの強力なツールを提供します。 基本的なRNNから改良されたLSTMやGRU、双方向処理や注意メカニズムに至るまで、これらの技術の発展によりOCRシステムの性能は大幅に向上しました。 **主なポイント**: - RNNはループ結合によるシーケンスモデリングを実装しますが、勾配消失の問題があります - LSTMとGRUは、ゲーティング機構を通じて長距離依存学習問題を解決します - 双方向RNNは完全な文脈情報を活用できる - 注意メカニズムはシーケンスモデリングの能力をさらに強化します - 適切な訓練戦略と正則化技術はモデルのパフォーマンスに不可欠です **今後の開発方向**: - トランスフォーマーアーキテクチャとの統合 - 配列モデリングのより効率的なアプローチ - エンドツーエンドのマルチモーダル学習 - リアルタイムと精度のバランス 技術が進化し続ける中で、配列モデリング技術も進化し続けています。 RNNおよびその変種がOCR分野で蓄積した経験と技術は、より高度なシーケンスモデリング手法の理解と設計の確かな基盤を築きました。
OCRアシスタントQQオンラインカスタマーサービス
QQカスタマーサービス(365833440)
OCRアシスタントQQユーザーコミュニケーショングループ
QQグループ(100029010)
OCRアシスタントはメールでカスタマーサービスに連絡してください
郵便受け:net10010@qq.com

コメントやご提案ありがとうございます!