5行のコードで画像セグメンテーションを素早く実装し、コードを1行ずつ詳細に説明し、画像の処理方法を手取り足取り教えてくれます。

5行のコードで画像セグメンテーションを素早く実装し、コードを1行ずつ詳細に説明し、画像の処理方法を手取り足取り教えてくれます。

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載しています。転載の際は出典元にご連絡ください。

コンピュータビジョンの基礎としての画像セグメンテーションは、画像理解の重要な部分であり、画像処理における難しさの 1 つです。

では、画像をエレガントかつ適切に分割するにはどうすればよいでしょうか?

わずか 5 行のコードで数分で実装できるライブラリ、 PixelLibをご覧ください。

もちろん、このような有用なプロジェクトにはオープンソースが必須です。

画像セグメンテーションを使用する理由は何ですか?

コンピューター ビジョンの研究者は、画像セグメンテーションの問題に頻繁に遭遇しますが、それでも、初心者の便宜のために、その「詳細な説明」を行う必要があります。

各画像はピクセル値のセットで構成されていることは誰もが知っています。簡単に言えば、画像セグメンテーションはピクセルレベルで画像を分類するタスクです。

画像セグメンテーションで使用される「独自のトリック」のいくつかにより、いくつかの重要なコンピューター ビジョン タスクを処理できるようになります。主に2つのカテゴリーに分かれています:

  • セマンティックセグメンテーション: 画像内の各ピクセルにカテゴリラベルを割り当て、異なる色で表します。
  • インスタンスセグメンテーション: 各ピクセルのラベル付けは必要なく、対象オブジェクトのエッジ輪郭を見つけるだけです。

重要なシーンで頻繁に登場します。

  • 自律走行車の視覚システムは、道路の状況を効果的に理解できます。
  • 医療画像のセグメンテーションは、医師が診断テストを行うのに役立ちます。
  • 衛星画像解析等

したがって、画像セグメンテーション技術の応用は依然として非常に重要です。

次に、早速本題に入り、この魔法のような使いやすいライブラリ、PixelLib について学習してみましょう。

PixelLibのクイックインストール

PixelLib は、画像のセグメンテーションを非常に簡単にするライブラリです。セマンティック セグメンテーションとインスタンス セグメンテーションは、わずか 5 行のコードで実現できます。

いつものように、まずはインストール環境の紹介をさせていただきます。

TensorFlow、Pillow、OpenCV-Python、scikit-image、PixelLib の最新バージョンをインストールします。

  1. pip3 テンソルフローをインストール
  2. pip3 インストール枕
  3. pip3 opencv-python をインストール
  4. pip3 scikit-image をインストールする
  5. pip3 ピクセルライブラリをインストール

PixelLibはセマンティックセグメンテーションを実装します

セマンティック セグメンテーション タスクを実行する場合、PixelLib は Deeplabv3+ フレームワークと pascalvoc で事前トレーニングされた Xception モデルを使用します。

pascalvoc で事前トレーニングされた Xception モデルを使用してセマンティック セグメンテーションを実行します。

  1. ピクセルライブラリをインポートする
  2. Pixellib.semantic から semantic_segmentationをインポートします
  3. セグメントイメージ = セマンティックセグメンテーション()
  4. segment_image.load_pascalvoc_model(“deeplabv3_xception_tf_dim_ordering_tf_kernels.h5”)
  5. segment_image.segmentAsPascalvoc("画像へのパス", 出力画像名 = "出力画像へのパス")

コードの各行を見てみましょう。

  1. ピクセルライブラリをインポートする
  2. Pixellib.semantic から semantic_segmentationをインポートします
  3. #セマンティックセグメンテーションクラスのインスタンスを作成しました
  4. セグメントイメージ = セマンティックセグメンテーション()

セマンティックセグメンテーションを実行するために使用されるクラスがpixellibからインポートされ、クラスのインスタンスが作成されます。

  1. segment_image.load_pascalvoc_model(“deeplabv3_xception_tf_dim_ordering_tf_kernels.h5”)

関数を呼び出して、pascal voc でトレーニングされた xception モデルをロードします (xception モデルは、記事の最後にあるリンクからダウンロードできます)。

  1. segment_image.segmentAsPascalvoc("画像へのパス", 出力画像名 = "出力画像へのパス")

これは画像をセグメント化するコード行です。この関数には 2 つのパラメータが含まれます。

  • path_to_image: 画像がセグメント化されるパス。
  • path_to_output_image: 出力イメージを保存するパス。イメージは現在の作業ディレクトリに保存されます。

次に、写真を見て何が起こっているのか見てみましょう

画像ファイルの名前は、下の図に示すように、sample1.jpg です。

実行コードは次のとおりです。

  1. ピクセルライブラリをインポートする
  2. Pixellib.semantic から semantic_segmentationをインポートします
  3. セグメントイメージ = セマンティックセグメンテーション()
  4. セグメントイメージをロードするpascalvoc_model("deeplabv3_xception_tf_dim_ordering_tf_kernels.h5")
  5. segment_image.segmentAsPascalvoc("sample1.jpg", output_image_name = "image_new.jpg")

コードを実行すると、保存された画像内のすべてのオブジェクトがセグメント化されていることがわかります。

コードを少し変更して、対象オブジェクトのセグメンテーションオーバーレイを含む画像を取得することもできます。

  1. segment_image.segmentAsPascalvoc("sample1.jpg", output_image_name = "image_new.jpg", overlay = True)

セグメント化されたオーバーレイを含む画像を生成するために、追加のパラメータが追加され、True に設定されます。

以下のコードを変更することで、セグメンテーションを実行するために必要な推論時間を確認できます。

  1. ピクセルライブラリをインポートする
  2. Pixellib.semantic から semantic_segmentationをインポートします
  3. インポート時間
  4. セグメントイメージ = セマンティックセグメンテーション()
  5. segment_image.load_pascalvoc_model("pascal.h5")
  6. 開始 = 時間.時間()
  7. segment_image.segmentAsPascalvoc("sample1.jpg", output_image_name="image_new.jpg")
  8. 終了 = 時間.時間()
  9. print(f"推論時間: {end-start:.2f}秒")

出力は次のようになります。

  1. 推論時間: 8.19

ご覧のとおり、画像に対するセマンティックセグメンテーションの実行にはわずか 8.19 秒しかかかりませんでした。

この Xception モデルは、20 個の一般的なオブジェクト カテゴリを含む PascalVOC データセットを使用してトレーニングされます。

オブジェクトとそれに対応するカラーマップを以下に示します。

PixelLibはインスタンスセグメンテーションを実装する

セマンティックセグメンテーションの結果は良さそうに見えますが、画像セグメンテーションの特定のタスクには理想的ではない可能性があります。

セマンティック セグメンテーションでは、同じカテゴリのオブジェクトに同じカラーマップが割り当てられるため、セマンティック セグメンテーションでは特に十分な画像情報が提供されない可能性があります。

このようにして、インスタンス セグメンテーションが誕生しました。同じカテゴリのオブジェクトには異なるカラーマップが割り当てられます。

PixelLib がインスタンスのセグメンテーションを実行するときは、Mask RCNN フレームワークに基づいています。コードは次のとおりです。

  1. ピクセルライブラリをインポートする
  2. Pixellib.instanceからinstance_segmentationをインポート
  3. セグメントイメージ = インスタンスセグメンテーション()
  4. セグメントイメージ.load_model(“mask_rcnn_coco.h5”)
  5. segment_image.segmentImage("画像へのパス", output_image_name = "出力画像パス")

もう一度、まずコードの各行を分解してみましょう。

  1. ピクセルライブラリをインポートする
  2. Pixellib.instanceからinstance_segmentationをインポートします
  3. セグメントイメージ = インスタンスセグメンテーション()

インスタンス分割を実行するためのクラスがインポートされ、クラスのインスタンスが作成されます。

  1. セグメントイメージ.load_model(“mask_rcnn_coco.h5”)

これは、インスタンスのセグメンテーションを実行するために Mask RCNN モデルをロードするコードです (Mask RCNN モデルは、記事の最後にあるリンクからダウンロードできます)。

  1. segment_image.segmentImage("画像へのパス", output_image_name = "出力画像パス")

これは画像に対してインスタンスのセグメンテーションを実行するコードであり、次の 2 つのパラメータが必要です。

  • path_to_image: モデルが予測する画像へのパス。
  • output_image_name: セグメンテーション結果が保存されるパス。現在の作業ディレクトリに保存されます。

上の写真は実戦2ラウンド目の様子です!

画像ファイルの名前は、下の図に示すように、sample2.jpg です。

実行コードは次のとおりです。

  1. ピクセルライブラリをインポートする
  2. Pixellib.instanceからinstance_segmentationをインポート
  3. セグメントイメージ = インスタンスセグメンテーション()
  4. セグメントイメージ.load_model(“mask_rcnn_coco.h5”)
  5. segment_image.segmentImage("sample2.jpg", output_image_name = "image_new.jpg")

上の画像はディレクトリに保存された画像です。これで、セマンティック セグメンテーションとインスタンス セグメンテーションの明らかな違いがわかります。インスタンス セグメンテーションでは、同じカテゴリのすべてのオブジェクトに異なるカラーマップが割り当てられます。

境界ボックスを使用してセグメンテーションを実装する場合は、コードを少し変更します。

  1. segment_image.segmentImage("sample2.jpg", output_image_name = "image_new.jpg", show_bboxes = True)

この方法では、セグメンテーション マスクと境界ボックスを含む保存された画像が得られます。

同様に、コードを通じてインスタンス セグメンテーションの推論時間を照会することもできます。

  1. ピクセルライブラリをインポートする
  2. Pixellib.instanceからinstance_segmentationをインポートします
  3. インポート時間
  4. セグメントイメージ = インスタンスセグメンテーション()
  5. セグメントイメージ.load_model(“mask_rcnn_coco.h5”)
  6. 開始 = 時間.時間()
  7. segment_image.segmentImage(“former.jpg”, output_image_name= “image_new.jpg”)
  8. 終了 = time.time()
  9. print(f"推論時間: {end-start:.2f}秒")

出力は次のようになります。

  1. 推論時間: 12.55

ご覧のとおり、画像のインスタンスのセグメンテーションを実行するには 12.55 秒かかります。

最後に、プロジェクトとモデルのダウンロード アドレスを示します。ぜひ試してみてください。

ポータル

PixelLib プロジェクト アドレス:
https://github.com/ayoolaolafenwa/PixelLib

xception モデルのダウンロード アドレス:
https://github.com/bonlime/keras-deeplab-v3-plus/releases/download/1.1/deeplabv3_xception_tf_dim_ordering_tf_kernels.h5

Mask RCNN モデルをダウンロードします:
https://github.com/matterport/Mask_RCNN/releases/download/v2.0/mask_rcnn_coco.h5

<<:  AIがスマート交通建設を推進し、警察ドローンの高速任務を加速

>>:  機械学習アルゴリズムのコレクション: ベイズ学習からディープラーニングまで、それぞれの長所と短所

ブログ    
ブログ    
ブログ    
ブログ    
ブログ    

推薦する

機械学習のための数学をどのように学ぶのでしょうか?

機械学習では数学が非常に重要です。アルゴリズムにおけるモデルコードの理解と、エンジニアリングにおける...

...

会話型AIが顧客体験を向上させる方法

[[380661]] [51CTO.com クイック翻訳] 会話型 AI により、アプリケーションは...

人事戦略と人材開発の形成における AI の役割

AI の力を活用することで、人事チームは複雑な課題に対処し、効率性を向上させ、前向きな職場環境を育む...

GPT-4により、ロボットはペンを回したりクルミを転がしたりすることを学習した。

学習に関しては、GPT-4 は優れた生徒です。大量の人間のデータを消化することで、さまざまな知識を習...

...

...

人工知能でカスタマーサービスエージェントを強化する方法

今日、ほぼすべての分野やビジネスが何らかの変革を遂げており、多くの企業がデジタル技術の波の推進力を受...

AIは実は人々の思考や視野を制限している

[[252987]] AIは徐々に成熟し、さまざまな産業に導入され、人々の生活を微妙に変えています。...

この戦略は不安定なGANを安定させるのに役立ちます

敵対的生成ネットワーク (GAN) は、非常に幅広い応用が期待できる非常に強力なタイプのニューラル ...

YOLOv5の魔法:手話を学び、聴覚障害者を支援する

コンピュータービジョンはアメリカ手話を学習して聴覚障害者を助けることができるでしょうか?データサイエ...

...

NvidiaはAIを使用してGPU演算回路を設計します。これは最先端のEDAよりも25%小さく、より高速で効率的です。

膨大な数の演算回路を搭載した NVIDIA GPU により、AI、高性能コンピューティング、コンピュ...

これは陰謀論ですか? AIさん、どう思いますか?

[[385257]]ビッグデータダイジェスト制作出典: iflscience編集:赤道のパンダボデ...