PaddlePaddle を使用してオブジェクト検出タスクを実装する - Paddle Fluid v1.1 の詳細なレビュー

PaddlePaddle を使用してオブジェクト検出タスクを実装する - Paddle Fluid v1.1 の詳細なレビュー

【51CTO.comオリジナル記事】

1. はじめに

11月1日、BaiduはPaddle Fluidのバージョン1.1をリリースしました。中国を代表するディープラーニングフレームワークであるPaddlePaddleは、中国のコミュニティに非常に親しみやすく、充実した中国語コミュニティとプロジェクト指向の中国語チュートリアルを備えており、より多くの中国のユーザーがディープラーニングや機械学習関連の研究や実践をより便利に行うことができます。私個人としても、PaddlePaddle が今後も成長し、発展していくことを心から願っています。これは、国内企業がオープンソース コミュニティに対して行った非常に意義のある貢献です。 Paddle Fluid 1.1 にどのようなアップデートが行われたかを確認するために、新しくリリースされたバージョンをできるだけ早くインストールし、SSD ベースのオブジェクト検出タスクを使用して、新しいバージョンの PaddlePaddle のパフォーマンスをテストしました。

2. 物体検出とは何ですか?

画像認識は、視覚を研究する学生にとって非常に馴染みのあるタスクのはずです。当初、ディープラーニングは画像認識タスクに適用されました。たとえば、コンピューターに車の画像を与え、画像に車があるかどうかを判断させます。

[[252202]]

背景がきれいな画像の場合、これは理にかなっており、簡単です。しかし、リッチな要素を含む画像の場合、認識の難易度が大幅に上がるだけでなく、単に画像があるかどうかを判断するだけでは意味がありません。画像内のどこに車が写っているかを見つける必要があります。これにより、ターゲット検出という新しいタスクと要件が発生します。

[[252203]]

私たちの仕事は、コンピューターに画像またはビデオ フレームを与え、その中のすべてのオブジェクトの位置を見つけて、各オブジェクトの特定のカテゴリを与えることです。人間にとって、物体検出は非常に単純な作業です。しかし、コンピュータが「見る」ことができるのは、画像がエンコードされた後の数字です。画像やビデオフレーム内の人物や物体の出現など、高レベルの意味概念を解読することは困難であり、対象が画像内で出現する領域を特定することはさらに困難です。

同時に、ターゲットは画像またはビデオ フレーム内の任意の位置に現れる可能性があり、ターゲットの形状は常に変化し、画像またはビデオ フレームの背景は大きく変化するため、多くの要因により、ターゲットの検出はコンピューターにとって困難な問題となります。現在主流の手法は、FasterRCNN、YOLO、SSDです。この記事では実験にSSDを使用します。

3. パドルパドルの紹介

私が初めて PaddlePaddle のことを聞いたのは、CCF の最前線セミナーで、何人かが機械学習アルゴリズム プラットフォームについて話していたときで、友人の 1 人がこの名前を挙げたので、しばらくの間、これは機械学習アルゴリズム プラットフォームだとばかり思っていました。 2016 年に Baidu が PaddlePaddle をオープンソース化して初めて、それが「使いやすく、効率的で、柔軟性があり、スケーラブル」という主な特徴を持つ、TensorFlow に匹敵するディープラーニング フレームワークであることを知りました。ということで、簡単に言うと、PaddlePaddle は Baidu が開発したディープラーニング フレームワークです (記者会見を見た後、Baidu はこの目的のために、財務、推奨、意思決定など、非常に広範囲にわたるエコシステムを構築していることを知りましたが、著者は主に PaddlePaddle のコア フレームワークを評価するため、ここではあまり時間をかけません)。

3.1 インストール方法

著者のワークステーションは Ubuntu 16.04 システムです。PaddlePaddle は CentOS と Ubuntu の両方で pip インストールと docker インストールをサポートしており、GPU バージョンは Linux でも完全に適応できます。具体的なインストール手順を以下に説明します。

まず、cat /proc/cpuinfo | grep avx2 を使用して、Ubuntu システムが avx2 命令セットをサポートしているかどうかを確認します。システムが次の一連の情報を返した場合、システムは avx2 命令セットをサポートしており、後続のインストールを続行できます。サポートされていない場合は問題ありません。公式サイトから no_avx whl パッケージを直接ダウンロードしてインストールできます。

次に、pip を使用して、PaddlePaddle (GPU) の最新の Fluid v1.1 バージョンをインストールします。インストールの前に、pip を使用して PaddlePaddle をインストールする前に、マシンに python3.5-dev をインストールする必要があることに注意してください。ダウンロード速度は遅くなり、ダウンロードには約20分かかります。

インストールが完了したら、Python で paddle をインポートしてテストします。インポートが成功すれば、インストールは成功したことになります。

更新された Paddle Fluid v1.1 バージョンでは、MacOS のサポートも特別に最適化されています。pip 経由で直接インストールすることも、ソース コードを使用してコンパイルしてインストールすることもできます。詳細については、http://www.paddlepaddle.org/documentation/docs/zh/1.1/beginners_guide/install/Start.html を参照してください。

3.2 パドルパドル計算記述方法

フレームワークの計算記述方法は、ディープラーニング プロジェクト開発者にとって大きな関心事です。計算の記述方法は、Caffe 1.0時代の順次実行されるレイヤーのセットから、TensorFlowの変数と演算で構成される計算グラフ、そしてPaddlePaddle Fluid [1]によって提案されたモデルを持たない概念へと、一連の進化を遂げてきました。それで、PaddlePaddle は現在どのように計算を記述しているのでしょうか?

PaddlePaddle はプログラムを使用してモデルと最適化プロセスを記述します。これは、データ フローの制御プロセスとして簡単に理解できます。プログラムは、ブロック、演算子、変数で構成されます。変数と演算子は、複数のネストされたブロックに編成されます。具体的には、ニューラル ネットワークを実装する場合、必要な変数と演算子を追加してネットワークの順方向の計算を定義するだけで、逆方向の計算、メモリ管理、ブロック作成はすべてフレームワークによって完了します。 PaddlePaddle でプログラムを定義する方法は次のとおりです。

単純な線形回帰を例にとると、前向き計算ロジックを次のように定義します。

#入力データ型を定義 x = fluid.layers.data(name="x",shape=[1],dtype='float32')

#完全に接続されたネットワークを構築する y_predict = fluid.layers.fc(input=x,size=1,act=None)

計算ロジックを定義したら、次のステップは TensorFlow と同じように損失関数を定義し、データを供給し、トレーニングを開始することです。データの供給も操作の実行時に行われます。まずはデータを定義しましょう。ここで train_data は入力データ、y_true はラベルです。

トレーニングデータ = numpy.array([[1.0],[2.0],[3.0],[4.0]]).astype('float32')

y_true = numpy.array([[2.0],[4.0],[6.0],[8.0]]).astype('float32')

平均二乗誤差損失関数 (MSE) を追加すると、フレームワークは自動的に逆の計算を完了します。

コスト = fluid.layers.square_error_cost(入力 = y_predict、ラベル = y)

平均コスト = fluid.layers.mean(コスト)

定義した上記のプログラムを実行します。

CPU = fluid.core.CPUPlace()

exe = fluid.Executor(CPU) です。

exe.run(fluid.default_startup_program())

#トレーニング開始 outs = exe.run(

フィード={'x':train_data,'y':y_true},

fetch_list=[y_predict.name,avg_cost.name])

#結果のプリントアウトを観察する

出力:

[配列([[0.9010564],

[1.8021128],

[2.7031693],

[3.6042256]]、dtype=float32)、配列([9.057577]、dtype=float32)]

このように、PaddlePaddle を使って簡単な計算処理を実装しています。個人的には TensorFlow と非常に似ていると感じています。TensorFlow でモデルを実行することに慣れている友人であれば、PaddlePaddle のエコシステムに簡単に適応できるはずです。

PaddlePaddle の計算の説明の詳細については、Fluid プログラミング ガイドを参照してください: http://www.paddlepaddle.org/documentation/docs/zh/1.1/beginners_guide/programming_guide/programming_guide.html

3.3 PaddlePaddleのモデルライブラリの紹介

PaddlePaddle のコアフレームワークには、画像、音声、自然言語処理、推奨、その他多くの側面を含む、ほぼすべての主流の機械学習/ディープラーニングタスクをカバーする多くの古典的なモデルとネットワークが組み込まれています。この記事はターゲット検出に関するものなので、主に画像モデルライブラリを調査し、ここで簡単に紹介しました。

3.3.1 分類

分類タスクのモデルライブラリは最も包括的で、AlexNet、VGG、GoogleNet、ResNet、Inception、MobileNet、Dual Path Network、SE-ResNeXtなど、2012年以降の古典的な画像認識ネットワークがすべて含まれています。各ネットワークモデルは独立したpyファイルであり、このネットワークモデルのクラスが含まれています。クラス内の共通メソッドはnet()です。呼び出すときは、対応するクラスを初期化してから、.net()メソッドを呼び出して、対応するネットワークのプログラムの説明を取得します。その後は、ネットワークにデータをフィードし、損失関数、最適化方法などを定義するだけで、簡単に使用できます。分類モデルは画像タスクの基本的なタスクです。これらのモデルは、オブジェクト検出やセマンティックセグメンテーションなどのタスクで再利用されます。そのため、このようなモデルライブラリを使用すると、後続のタスクの開発が大幅に簡素化されます。モデルライブラリのこの部分の記述方法は比較的統一されています。ネットワーク構造を理解していれば、.net() メソッドを使用して呼び出すことができます。ここでは一つ一つ紹介しません。詳細については、https://github.com/PaddlePaddle/models/tree/develop/fluid/PaddleCV/image_classification/models を参照してください。

3.3.2 物体検出

ソリッドステートドライブ

シングル ショット マルチボックス ディテクター (SSD) は、シングル ステージ オブジェクト ディテクターです。 2 段階検出方法とは異なり、1 段階オブジェクト検出では領域提案を実行せず、特徴マップからオブジェクトの境界ボックスと分類確率を直接回帰します。 SSD はシングルステージ検出の考え方を採用し、異なるスケールの特徴マップ上で対応するスケールのオブジェクトを検出することでそれを改善します。下の図に示すように、SSD は 6 つのスケールで特徴マップ上のさまざまなレベルで予測を行います。各レベルは、それぞれオブジェクト カテゴリと境界ボックスのオフセットを回帰する 2 つの 3x3 畳み込みで構成されます。したがって、各カテゴリについて、6 つのレベルの SSD では、合計 38x38x4 + 19x19x6 + 10x10x6 + 5x5x6 + 3x3x4 + 1x1x4 = 8732 の検出結果が生成されます。

SSDオブジェクト検出モデル

SSD は、検出器のベース ネットワークと呼ばれる、VGG、ResNet、MobileNet などの標準的な畳み込みネットワークに簡単に接続できます。 PaddlePaddle の SSD は、Google の MobileNet をベース ネットワークとして使用します。

物体検出モデルライブラリは分類モデルライブラリとは異なります。PaddlePaddle は SSD モデルライブラリをプロジェクトの形式で提供しています。プロジェクトには次のファイルが含まれています。

このうち、train.py、reader.py、mobilenet_ssd.pyは、データの読み取り、ネットワーク構造、トレーニングパラメータなどの定義を含むネットワークトレーニングに関するファイルです。eval.pyとeval_coco_map.pyは、ネットワークの予測と評価に関するファイルです。infer.pyは、予測結果の可視化に関するファイルです。データ フォルダーは、データ セットを保存するために使用されます。これを使用する場合、トレーニング セット、テスト セット、検証セットをデータ ディレクトリに配置できます。リーダーは、読み込む画像データをデータ ディレクトリで検索します。事前トレーニング済みディレクトリには、事前トレーニング済みのモデルが保存されます。SSD を最初からトレーニングしたくない場合は、このディレクトリに事前トレーニング済みのモデルを配置して、転移学習を容易にすることができます。

4. PaddlePaddleはSSDオブジェクト検出を実装する

上記の基本事項を理解すれば、PaddlePaddle を使用していくつかのプロジェクトを簡単に開始できます。それでは、SSD ベースのターゲット検出タスクを実装してみましょう。

4.1 サーバー構成

システム: Ubuntu 16.04

GPU: NVIDIA GTX 1080*4 ビデオメモリ: 8GB

環境: Python 3.5

4.2 フレームワークの構成

パドルフルイド v1.1 GPU バージョン

4.3 データの準備

モデルの事前トレーニングには、Microsoft の COCO2017 データセットを使用します (PaddlePaddle は COCO に基づく事前トレーニング済みモデルを提供しており、直接使用できます)。COCO データセットは、Microsoft チームによって取得されたデータセットで、画像認識 + セグメンテーション + キャプション作成に使用できます。公式の説明 Web サイトは http://mscoco.org/ です。 Microsoft は、ECCV ワークショップでデータセットをより詳細に紹介する記事「Microsoft COCO: コンテキスト内の共通オブジェクト」を公開しました。 COCO はシーン理解を目的としており、91 のターゲット カテゴリと 250 万のラベルを含む、複雑なシーンから 328,000 枚の画像をキャプチャします。 COCO2017 データセット全体は 20G です。公式 Web サイトのダウンロードは非常に遅いです。中国にはダウンロードできるミラー サイトがいくつかあります。データセットはトレーニング セット、テスト セット、検証セットに分かれています。注釈と file_list は json ファイルに保存されます。

事前トレーニング データセットを取得した後、Pascal VOC データセットでモデルをさらにトレーニングし、微調整を行いました。 Pascal VOC データセットは、COCO データセットに比べて画像の数と種類がはるかに少なく、合計 20 のカテゴリと 11,540 枚のトレーニング画像があり、注釈は XML 形式のファイルに保存されます。

4.4 データの読み取り

画像形式は jpg であり、画像をトランスコードして読み取る必要があります。SSD の reader.py ファイルは、この機能を実装するのに役立ちます。組み込みのデータ読み取りでは、ジェネレーターを使用して画像をバッチごとに読み取り、トランスコードするため、メモリ使用量は非常に少なくなります。マシンのメモリが限られているため、バッチ サイズを 32 に設定しました。この場合、100,000 枚の画像の注釈を読み込むのに約 17 秒しかかからず、各バッチの読み込み + トレーニング時間はわずか約 0.3 秒です。

このリーダーのコアコードを見てみましょう:

デフリーダー():

mode == 'train' の場合、シャッフル:

np.random.shuffle(画像)

バッチアウト = []

画像内の画像の場合:

image_name = 画像['ファイル名']

イメージパス = os.path.join(settings.data_dir、イメージ名)

im = Image.open(画像パス)

im.mode == 'L'の場合:

im = im.convert('RGB')

im_width、im_height = im.size

im_id = 画像['id']

# レイアウト: category_id | xmin | ymin | xmax | ymax | iscrowd

bbox_labels = []

annIds = coco.getAnnIds(imgIds=画像['id'])

anns = coco.loadAnns(annIds)

anns の ann の場合:

bbox_sample = []

# 1から開始し、0を背景に残す

bbox_sample.append(float(ann['category_id']))

bbox = ann['bbox']

xmin、ymin、w、h = bbox

xmax = xmin + w

ymax = ymin + h

bbox_sample.append(float(xmin) / im_width)

bbox_sample.append(float(ymin) / im_height)

bbox_sample.append(float(xmax) / im_width)

bbox_sample.append(float(ymax) / im_height)

bbox_sample.append(float(ann['iscrowd']))

bbox_labels.append(bbox_sample)

im、sample_labels = preprocess(im、bbox_labels、モード、設定)

サンプルラベル = np.array(サンプルラベル)

len(sample_labels) == 0の場合: 続行

im = im.astype('float32')

ボックス = sample_labels[:, 1:5]

lbls = sample_labels[:, 0].astype('int32')

iscrowd = sample_labels[:, -1].astype('int32')

settings.ap_version に 'cocoMAP' がある場合:

batch_out.append((im、boxes、lbls、iscrowd、

[im_id、im_width、im_height]))

それ以外:

batch_out.append((im、boxes、lbls、iscrowd))

len(batch_out) == batch_sizeの場合:

バッチアウトを生成する

バッチアウト = []

ご覧のとおり、ここでのリーダーは、データをバッチごとにメモリにロードするジェネレーターです。データの読み取り中は、次の点に注意する必要があります。

1. データセットはプロジェクトのデータ ディレクトリに配置する必要があります。リーダーは、アノテーションの下の instances_train2017.json ファイルを使用して、トレーニング セットと検証セットを区別します。トレーニング セットと検証セットを区別するために、データ ディレクトリ内のフォルダーを使用する必要はありません。

2. データが要求どおりに保存されない場合は、reader.py のデータ パスを変更する必要があります。

クラス設定(オブジェクト):

デフ__init__(self,

データセット=なし、

data_dir=なし、

label_file=なし、

resize_h=300、

resize_w=300、

平均値=[127.5, 127.5, 127.5],

apply_distort=True、

apply_expand=True、

ap_version = '11ポイント'):

self._dataset = データセット

自己._ap_version = ap_version

# data_dirをデータが保存されているパスに置き換えます。self._data_dir = data_dir

データセットに「pascalvoc」がある場合:

自己._ラベルリスト = []

label_fpath = os.path.join(data_dir、label_file)

open(label_fpath) の行に対して:

self._label_list.append(line.strip())

1. 「NoneType は反復可能ではありません」というエラーが発生した場合、通常はデータ読み取りエラーが原因です。ファイル パスを慎重に確認すると、問題は解決するはずです。

2. reader.py ファイルの pascalvoc() 関数を使用して PascalVOC データセットを読み取ります。2 つのデータセットのファイル構造と注釈は若干異なります。Paddle は、直接呼び出すことができる 2 つのバージョンのデータセット読み取りメソッドを作成しました。

4.5 モデルのトレーニング

データが読み込まれたら、モデルのトレーニングを開始できます。ここでは、トレーニングに PaddlePaddle SSD モデルの train.py を直接使用します。

python -u トレイン.py

train.pyでは、すべてのハイパーパラメータにデフォルト値が設定されています。PaddlePaddleのパラメータ調整に慣れていないエンジニアは、デフォルトのパラメータをそのままトレーニングに使用できるので、非常に便利です。必要に応じて、次の表に従って対応するハイパーパラメータを変更できます。

パラメータ名

タイプ

意義

学習率

フロート

学習率

バッチサイズ

中級

バッチサイズ

epoc_num

中級

反復

GPUを使用する

ブール

GPUトレーニングを使用するかどうか

平行

ブール

マルチカードトレーニングを使用するかどうか

データセット

Str

データセット名

モデル保存ディレクトリ

Str

モデル保存パス

事前学習済みモデル

Str

事前トレーニング済みモデルパス(使用する場合)

画像の形状

Str

画像サイズを入力してください

データディレクトリ

Str

データセットパス

スクリプトを実行するときは、対応するパラメータ値を渡すだけです。例:

python -u train.py --batch_size=16 --epoc_num=1 --dataset='pascalvoc' --pretrained_model='pretrain/ssd_mobilenet_v1_coco/'

4.5.1 単一マシンのマルチカード構成

1 台のマシンで複数の GPU を構成するのは、複数のマシンと複数の GPU を構成するよりも簡単です。まず GPU0 でパラメータを初期化し、次に fluid.ParallelExecutor() を介して複数のグラフィック カードに配布する必要があります。ここで、fluid.core.get_cuda_device_count() を使用して使用可能なグラフィック カードの数を取得したり、使用するグラフィック カードの数を定義したりすることができます。

train_exe = fluid.ParallelExecutor(use_cuda=True, loss_name=loss.name,

main_program = fluid.default_main_program())

train_exe.run(fetch_list=[loss.name], feed={...})

4.5.2 パラメータ調整

PaddlePaddle の SSD モデルはユーザーに多くの自由を与え、ネットワーク構造、損失関数、最適化方法など、さまざまな角度からモデルを調整できるようにします。この記事ではMobileNetベースのSSDを使用しています。VGGベースのSSDを使用する場合は、プロジェクト内のmobilenet_ssd.pyファイルを自分で変更し、そこに定義されているMobileNetプログラムをVGGのプログラム記述に変更できます。損失関数や最適化方法を変更する必要がある場合は、train.pyのbuild_program()関数を見つけて、

fluid.unique_name.guard("train") を使用する場合:

損失 = fluid.layers.ssd_loss(locs、confs、gt_box、gt_label、box、

ボックス変数)

損失 = fluid.layers.reduce_sum(損失)

オプティマイザー = optimizer_setting(train_params)

オプティマイザ.最小化(損失)

train.py で損失関数またはオプティマイザーを変更できます。train.py で渡されるパラメータで、batch_num、epoch_num、学習率などのパラメータを直接変更できます。

4.5.3 モデルの保存

COCO データセットでモデルをトレーニングした後、fluid.io.save_persistables() メソッドを使用してモデルを保存できます。モデルを指定されたパスに保存するために、次の save_model() 関数を実装しました。

def save_model(postfix、main_prog、model_path):

model_path = os.path.join(model_save_dir、postfix)

os.path.isdir(model_path)の場合:

shutil.rmtree(モデルパス)

print('モデルを%sに保存' % (model_path))

fluid.io.save_persistables(exe、モデルパス、メインプログラム=main_prog)

4.5.4 トレーニングを続ける

トレーニング プロセスは中断されることがあります。モデルが数回のバッチごとに保存されている限り、load_vars() メソッドを使用して保存されたモデルを復元し、トレーニングを続行したり予測したりできます。記事で紹介したAPIについては、PaddlePaddleの公式サイトのチュートリアルでより体系的に学習したり閲覧したりできます。PaddlePaddleは中国語のドキュメントや使い方のチュートリアルを多数提供しており、中国のユーザーにとって非常に親切だと言えます。

fluid.io.load_vars(exe、事前トレーニング済みモデル、メインプログラム=train_prog、述語=if_exist)

4.5.5 パフォーマンスパラメータ

トレーニング速度: COCO2017 データセットでは、シングルカード トレーニングでは 1 エポックを反復するのに 3 分 33 秒かかります。シングル マシンの 4 カード トレーニングでは 1 エポックを反復するのに 1 分 02 秒かかります。

CPU/GPU 使用率: 通常のトレーニング条件下では、CPU 使用率は 40% ~ 60% で、GPU 使用率は 50% 前後で安定しています。

CPU/GPU使用率

4.6 モデル評価

PaddlePaddle の SSD モデルでは、eval.py スクリプトを使用してモデルを評価できます。11point や integration などの方法を選択して、検証セットでのモデルの mAP を計算できます。

Python eval.py --dataset='pascalvoc' --model_dir='train_pascal_model/best_model' --data_dir='data/pascalvoc' --test_list='test.txt' --ap_version='11point' --nms_threshold=0.45

このうち、model_dir はトレーニング済みモデルの保存ディレクトリ、data_dir はデータセット ディレクトリ、test_list は検証セットとして使用されるファイル リスト (txt ファイル) (これらのファイルには対応するラベル ファイルが必要です)、ap_version は mAP を計算する方法、nms_threshold は分類しきい値です。 ***Pascal VOCデータセットにおけるPaddlePaddle SSDモデルのmAPは73.32%であることがわかりました[2]

モデル

事前学習済みモデル

トレーニングデータ

テストデータ

地図

モバイルネットv1-SSD 300x300

COCO モバイルネット SSD

VOC07+12 トレインバル

VOC07テスト

73.32%

4.7 モデルの予測と可視化

4.7.1 モデル予測

モデルのトレーニングが完了したら、test_program = fluid.default_main_program().clone(for_test=True) を使用してプログラムをテスト モードに切り替え、予測するデータを Executor にフィードしてプログラムを実行し、画像分類ラベル、ターゲット ボックス スコア、xmin、ymin、xmax、ymax を計算します。具体的なプロセスは以下のとおりです。

test_program = fluid.default_main_program().clone(for_test=True)

画像 = fluid.layers.data(名前 = '画像'、形状 = image_shape、データタイプ = 'float32')

locs、confs、box、box_var = mobile_net(num_classes、image、image_shape)

nmsed_out = 流体レイヤー検出出力(

locs、confs、box、box_var、nms_threshold=args.nms_threshold)

place = fluid.CUDAPlace(0) args.use_gpu の場合、そうでない場合は fluid.CPUPlace()

exe = fluid.Executor(場所)

nmsed_out_v, = exe.run(test_program,

フィード = フィーダー.フィード([[データ]]),

fetch_list=[nmsed_out],

return_numpy=False)

nmsed_out_v = np.array(nmsed_out_v)

4.7.2 予測結果の可視化

ターゲット検出タスクでは、通常、予測結果を視覚化して、結果を知覚的に理解する必要があります。元の画像に予測ボックスを描画するプログラムを書くことができます。コアコードは次のとおりです。

def draw_bounding_box_on_image(image_path, nms_out, confs_threshold,

ラベルリスト):

画像 = Image.open(image_path)

描画 = ImageDraw.Draw(イメージ)

im_width、im_height = 画像のサイズ

nms_outのdtの場合:

dt[1] < confs_thresholdの場合:

続く

カテゴリID = dt[0]

bbox = dt[2:]

xmin、ymin、xmax、ymax = clip_bbox(dt[2:]) です。

(左、右、上、下) = (xmin * im_width、xmax * im_width、

ymin * im_height、ymax * im_height)

線を引く(

[(左、上)、(左、下)、(右、下)、(右、上)、

(左上)]

幅=4、

塗りつぶし = '赤')

image.mode == 'RGB'の場合:

描画テキスト((左, 上), label_list[int(category_id)], (255, 255, 0))

イメージ名 = イメージパス.split('/')[-1]

print("bbox が描画された画像は {} として保存されました".format(image_name))

image.save(画像名)

このようにして、予測結果を直感的に確認できます。

幸いなことに、PaddlePaddle の SSD モデルは、完全な予測プロセスの実装に役立ちます。SSD モデルの下で infer.py スクリプトを直接実行して、トレーニング済みのモデルを使用して画像を予測できます。

python infer.py --dataset='coco' --nms_threshold=0.45 --model_dir='pretrained/ssd_mobilenet_v1_coco' --image_path='./data/ pascalvoc/VOCdevkit/VOC2012/JPEGImages/2007_002216.jpg'

4.8 モデルの展開

PaddlePaddle モデルを展開するには、まず C++ 予測ライブラリをインストールしてコンパイルする必要があります。このライブラリは、http://www.paddlepaddle.org/documentation/docs/zh/1.1/user_guides/howto/inference/build_and_install_lib_cn.html からダウンロードしてインストールできます。予測ライブラリは、Paddle の予測 API を提供します。予測の展開プロセスは、おおまかに 3 つのステップに分かれています。1. PaddlePredictor を作成する。2. PaddleTensor を作成して PaddlePredictor に渡す。3. 出力 PaddleTensor を取得して結果を出力する。この部分の操作は複雑ではなく、Paddle のチュートリアルでは詳細なデプロイメント コード リファレンスも提供されています。このテンプレートを使用して、モデルのデプロイメントをすぐに完了できます (https://github.com/PaddlePaddle/Paddle/tree/develop/paddle/fluid/inference/api/demo_ci)

5. ユーザーエクスペリエンス

  • 優れた中国コミュニティのサポート

SSD を構築する過程で、セグメンテーション違反、NoneType などのいくつかの問題が発生しました。私は Paddle の GitHub で関連する問題を直接提起し、すぐに貢献者から返信を受け取りました。問題はすぐに解決されました。

  • チュートリアルの改善

PaddlePaddle の公式サイトでは、非常に詳細な中国語と英語のチュートリアルを提供しています。以前 TensorFlow を学習していたときと比べると、意味を理解するまでに長い時間かけてドキュメントを読まなければならないことがよくありました。PaddlePaddle は、中国のユーザーにとって本当にありがたい存在です。

  • TensorFlow と比較すると、全体的なアーキテクチャは簡潔かつ明確であり、理解しにくい概念はあまりありません。
  • 豊富なモデルライブラリ

CV、NLP、推奨など、さまざまなタスクで一般的に使用されるクラシックモデルが組み込まれており、AI 製品を迅速に開発および反復するために使用できます。

  • 優れたパフォーマンス、完全なエコロジー

この実験の結果から判断すると、PaddlePaddle のパフォーマンスは TensorFlow などの主流のフレームワークとそれほど変わりません。トレーニング速度、CPU/GPU 占有率などにおいて優れたパフォーマンスを発揮します。さらに、PaddlePaddle は完全なエコシステムを構築しており、非常に見通しが良いです。

6. まとめ

全体的に、PaddlePaddle は優れたフレームワークです。シンプルな設計と優れたドキュメントとコミュニティにより、始めるのは非常に簡単です。使用中に理解すべき難しい概念はありません。流動的なプログラムでネットワーク構造を定義するのは非常に便利です。以前にTensorFlowを使用したことがあるエンジニアは、比較的早くPaddlePaddleに移行できます。この実験中に、PaddlePaddle にまだいくつかの問題があることがわかりました。トレーニング プロセスが予期せず終了した場合、Paddle のトレーニング タスクは完全に終了せず、大量の CPU および GPU リソースを占有し続けます。メモリとビデオ メモリの管理をさらに改善する必要があります。しかし、実験により、通常の状況下では、PaddlePaddle の SSD モデルにおける精度、速度などのパフォーマンスは TensorFlow と同等であり、データの読み取り操作は TensorFlow よりもシンプルで明確であることも確認されました。

  1. PaddlePaddle Fluid は、2016 年に Baidu が開発したオリジナルの PaddlePaddle のリファクタリング バージョンです。特に指定がない限り、この記事で言及されている PaddlePaddle は PaddlePaddle Fluid を指します。

  2. 公式の評価結果はここに引用されています。データソース: https://github.com/PaddlePaddle/models/blob/develop/fluid/PaddleCV/object_detection/README_cn.md#%E6%A8%A1%E5%9E%8B%E8%AF%84%E4%BC%B0

[51CTO オリジナル記事、パートナーサイトに転載する場合は、元の著者とソースを 51CTO.com として明記してください]

<<:  Julia vs Python: 2019 年に機械学習でナンバー 1 になるプログラミング言語はどれでしょうか?

>>:  2019年に注目すべき5つのAIトレンド

ブログ    
ブログ    
ブログ    

推薦する

...

...

...

...

コンパクトなBEVインスタンス予測フレームワーク: PowerBEV

この記事は、Heart of Autonomous Driving の公開アカウントから許可を得て転...

人工知能は企業で実用化されつつある

AI は、従来のプロセスや従来のテクノロジーにまき散らされた魔法の精霊ではなく、ビジネスのやり方を根...

...

人間の農業の将来は主にロボットに依存することになるのでしょうか?基本的に人間の介入は必要ありません

予想外のことが起こらなければ、人類は人工知能の時代へと急速に進んでいくだろう。ウェイター、宅配便業者...

Google の社内機械学習プロジェクト「Project Ninja」の秘密を解明します。

すべての製品に人工知能を統合したい場合は、強力な機械学習チームを育成する必要があります。 Googl...

...

YOLO-NAS: 最も効率的なターゲット検出アルゴリズムの1つ

YOLO-NAS 物体検出導入YOLO (You Only Look Once) は、ディープ ニュ...

あなたは統計学者になれますか?トランスフォーマーの強力な学習メカニズム「自動アルゴリズム選択」

ChatGPT などの大規模な Transformer ベースの言語モデルには、非常に強力なコンテ...

投票の未来: AI、ブロックチェーン、生体認証

投票攻撃は止まらない2016年の米国大統領選挙は紆余曲折を経て、最終的にトランプ氏が米国大統領に選出...

...

GitHub が機械学習コードの脆弱性スキャンを無料で提供、JavaScript / TypeScript もサポート

現在、JavaScript および TypeScript リポジトリで開発およびテストが行​​われて...