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がスマート交通建設を推進し、警察ドローンの高速任務を加速

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

ブログ    
ブログ    
ブログ    

推薦する

...

クラウド コンピューティングにおいて人工知能はどのような役割を果たすことができますか?

人工知能の台頭により、誰もがその将来に大きな期待を抱いています。クラウド コンピューティングに関する...

二次編集やUnreal Engine 5へのインポートをサポートし、Stable Diffusionは3D生成機能に進化

全体像を捉えるモデルに関して言えば、Stability AI が 2022 年にリリースした Sta...

...

AIが大学入試のエッセイを書いたら何点取れるでしょうか?

みなさんこんにちは。私はシュイです。気がつけば、またこの2日間で大学入試の時期になりました。私が大学...

今後10年間で、人工知能とロボットは雇用に7つの影響を与える

あなたは理想の仕事をしていないかもしれません。おそらく、あなたが望むほどの収入は得られていないでしょ...

IT の現状レポート: IT リーダーの 90% が、生成型 AI がまもなく主流になると考えています

7月25日、海外メディアの報道によると、セールスフォース・ドットコムが発表したIT現状報告によると、...

C++開発におけるデータ構造とアルゴリズムの分離についての簡単な説明

Windows でプログラムを書いたことがある人なら、誰でも多かれ少なかれビットマップを使ったことが...

...

自然言語処理ライブラリ - Snownlp

[[399217]]この記事はWeChatの公開アカウント「Zhibin's Python...

2020 年に最も実用的な機械学習ツールは何ですか?

ミシュランの星付き料理を作るときと同じように、整理整頓されたキッチンを持つことは重要ですが、選択肢が...

プログラマーが夜遅くにPythonでニューラルネットワークを実行し、中学生のようにデスクランプを消す

[[271670]]一度ベッドに入ったら決して起き上がりたくない人にとって、電気を消すことは寝る前の...

全人代副代表の馬化騰氏は8つの書面提案を提出し、ブロックチェーンや人工知能など17の質問に答えた。

[[221404]] 3月3日午後9時30分、全国人民代表大会の代表でテンセント会長の馬化騰氏が黒...

建設における人工知能の能力と限界

AI は、建設業界が大規模なインフラ プロジェクトを計画、実行、管理する方法に革命をもたらし、組織が...

...