画像セグメンテーションについて調査中

## Segmantation Anything 2を見てください。
https://github.com/facebookresearch/segment-anything-2
の実装が、いままでの実装の多くを無意味にしています。
まずは、segment-anything-2を見てください。
物体のtracking のタスクも、segment-anything-2が使える場合には、それで十分になってきているかもしれません。（ここまで2024年8月追記）


---------------------------------------


ライブラリを調査するためのアドバイス
・よく使われているカメラの場合には、そのカメラでの利用例が開発元あるいは第３者によって公開されていることが多い。
　それをまず調査する。
・画像認識関係の場合だと、組み込み対象のデバイスの開発元（例：NVIDIA)がさまざまなアプリケーションを提供している。
　それらに利用したいライブラリが紹介されていることがある。
・推論エンジンに提供されているmodel zooにある学習済みのモデルとアルゴリズムを調べてみよう。
　例：OpenVino
・機械学習分野のフレームワークでの状況を調査する。

## segmentation の種類
![ekECjwJ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/c312a60d-01cb-1392-3c03-a45b75b58942.jpeg)
[引用元](https://engineering.dena.com/blog/2019/08/cv-papers-19-segmentation/)

semantic segmentation
instance segmentation
panoptic segmentation


## paper with code
Paper with code のサイトでは、それぞれのタスクに対してSotAのアルゴリズムを紹介している。

- [Semantic Segmentation](https://paperswithcode.com/task/semantic-segmentation)
- [Image Segmentation](https://paperswithcode.com/task/image-segmentation)
- [Instance Segmentation](https://paperswithcode.com/task/instance-segmentation)
- [3D Semantic Segmentation](https://paperswithcode.com/task/3d-semantic-segmentation)


## 気にするポイント
- セグメンテーションの分類
例：MS COCOの80カテゴリ
例：[Cityscapes Datasetのカテゴリ](https://www.cityscapes-dataset.com/dataset-overview/)
例：走行可能範囲のセグメンテーション
あなたの実現したいセグメンテーションは何ですか。
- セグメンテーションの実行時間
- セグメンテーションの解像度
- セグメンテーションの精度
- 学習のしやすいさ


# 通常カメラでのセグメンテーション
## Yolov8
https://docs.ultralytics.com/ja/
https://github.com/ultralytics/ultralytics

Yolov8では、物体検出の他にインスタンスセグメンテーションが追加になっている。
MS-COCO の８０カテゴリの検出とインスタンスセグメンテーションとができる。


Youtube [YOLOv8 COMPLETE Tutorial | Object Detection | Segmentation | Classification](https://www.youtube.com/watch?v=75LI9MI9eEo)

![Screenshot from 2023-12-22 12-13-08-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/23454451-991a-b5a2-9975-6017e8745e14.png)

[引用元](https://www.youtube.com/watch?v=75LI9MI9eEo)

## StereoLabs ZED

#### [How to Use YOLO v8 with ZED in Python](https://www.stereolabs.com/docs/yolo/python)

ZED のカメラを使ってYolov8を動作させるためのインスール手続きとかが書かれている。 

#### StereoLabs ZED SDK [Image segmentation using yolov8 with zed 2i python](https://community.stereolabs.com/t/image-segmentation-using-yolov8-with-zed-2i-python/3565)

セグメンテーション後のマスクを取得する部分には、さらに調査が必要そうだ。

Yololv8のセグメンテーションには、ZED-SDK のbindingがある。
https://github.com/stereolabs/zed-sdk/tree/master/object%20detection/custom%20detector/python/pytorch_yolov8_seg

そのため、ZED2iのカメラがあれば、YOLOV8でのセグメンテーションを動作させることができる。


#### StereoLabs Mask R-CNN [How to Use PyTorch with ZED](https://www.stereolabs.com/docs/pytorch)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/b93ea6a6-bc90-f393-2c6b-6b57211c3a82.png)
[引用元](https://www.stereolabs.com/docs/pytorch)

なお、Mask R-CNN は、画像に存在する物体のクラス名を特定する一般物体検出と、画像内のピクセル単位でクラス分けを行うインスタンスセグメンテーションを同時に行う手法です。

#### [3D Mask R-CNN using the ZED and Pytorch](https://github.com/stereolabs/zed-pytorch/)

## NVIDIA

https://catalog.ngc.nvidia.com/orgs/nvidia/collections/imagesegmentation

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/692fcb39-9b04-7a90-9419-ce247f11a0d4.png)
[引用元](https://catalog.ngc.nvidia.com/orgs/nvidia/collections/imagesegmentation)

https://courses.nvidia.com/courses/course-v1:DLI+L-FX-04+V2/

https://developer.nvidia.com/blog/tag/image-segmentation/

## Youtube NVIDIA [Jetson AI Fundamentals - S3E6 - Semantic Segmentation](https://www.youtube.com/watch?v=AQhkMLaB_fY)

## NVIDIA [BI3D を使用したステレオ入力における近接セグメンテーション](https://developer.nvidia.com/ja-jp/blog/maximizing-deep-learning-performance-on-nvidia-jetson-orin-with-dla/)

![](https://developer-blogs.nvidia.com/ja-jp/wp-content/uploads/sites/6/2023/08/proximity-segmentation.gif)

>「私たちは、DNN の推論に TensorRT を DLA で使用しており、GPU とは異なるハードウェアの多様性を提供し、フォールト トレランスを向上させつつ、他のタスクを GPU からオフロードしています。DLA は Jetson AGX Orin で BI3D に対して約 46fps を提供し、3 つの DNN で構成され、ロボティクス アプリケーションにおいて 30ms 未満の低レイテンシを提供しています。」 と NVIDIA のロボティクス プラットフォーム ソフトウェアの副社長である Gordon Grigor は述べています。


衝突を防止するためには、フレームレートを高くする必要があります。
しかも、ハードウェアの余力を奪わない実装が必要になります。
NVIDIAのJetson AGX OrinのもつDLA(Deep Learning Accelerator) を利用することは、GPUの余力を確保することにつながります。

#### Github [BI3D](https://github.com/NVlabs/Bi3D)
> Bi3D: Stereo Depth Estimation via Binary Classifications
Abhishek Badki, Alejandro Troccoli, Kihwan Kim, Jan Kautz, Pradeep Sen, and Orazio Gallo
IEEE CVPR 2020

#### pdf [Bi3D: Stereo Depth Estimation via Binary Classifications](https://arxiv.org/pdf/2005.07274.pdf)


## Jetson Nano の利用例[Jetson nanoでPerson Part Segmentation検証](https://hacarus.com/ja/tech/20200423-person-part-segmentation/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/930cdaa7-3f22-da57-3045-bd1c739e40dc.png)
[引用元](https://hacarus.com/ja/tech/20200423-person-part-segmentation/)
HarDNet のアルゴリズムを元に再学習している。

Youtube [Real-Time Instance Segmentation Using Jetson Xavier](https://www.youtube.com/watch?v=153Zy2JB9ok)

Youtube [Semantic segmentation with Jetson Nano using RealSense camera](https://www.youtube.com/watch?v=7rZYmzXPzjs)

## NVIDIA [Semantic Segmentation with SegNet](https://github.com/dusty-nv/jetson-inference/blob/master/docs/segnet-console-2.md)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/fa312feb-910e-e5ba-0dcc-0476eaa1c2c9.png)


#### NVIDIA segnet のリアルタイムのデモ[Running the Live Camera Segmentation Demo](https://github.com/dusty-nv/jetson-inference/blob/master/docs/segnet-camera-2.md#running-the-live-camera-segmentation-demo)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/8b82d63c-1498-59f8-0d7a-8e3a7de74544.png)
[引用元](https://github.com/dusty-nv/jetson-inference/blob/master/docs/segnet-camera-2.md#running-the-live-camera-segmentation-demo)

#### github [SegNet_PyTorch](https://github.com/vinceecws/SegNet_PyTorch)
#### github [segnet](https://github.com/preddy5/segnet)
> This repo is not supported anymore

pdf [SegNet: A Deep Convolutional Encoder-Decoder Architecture for Image Segmentation](https://arxiv.org/pdf/1511.00561v2.pdf)

segnetは2015年発表の実装である。
2023年の時点で利用するには、古い実装である。そのため、出力画像の解像度も粗く、領域が染み出したりしている。



## NVIDIA [Free Space Segmentation](https://docs.nvidia.com/isaac/archive/2020.1/packages/freespace_dnn/doc/freespace_segmentation.html)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/2427a4a1-9dce-3fdb-cf7f-4737b3cb4282.png)
[引用元](https://docs.nvidia.com/isaac/archive/2020.1/packages/freespace_dnn/doc/freespace_segmentation.html)

## NVIDIA [PeopleSemSegNet Model Card](https://catalog.ngc.nvidia.com/orgs/nvidia/teams/tao/models/peoplesemsegnet)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/f5f11faa-b021-5636-850f-b48e9ebc986f.png)
[引用元](https://catalog.ngc.nvidia.com/orgs/nvidia/teams/tao/models/peoplesemsegnet)


## github [YOSO](https://github.com/hujiecpp/YOSO)
> You Only Segment Once: Towards Real-Time Panoptic Segmentation, In CVPR 2023.

![fig-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/906edf17-7f2a-5995-884a-8a6703e11e14.jpeg)

pdf [You Only Segment Once: Towards Real-Time Panoptic Segmentation](https://arxiv.org/abs/2303.14651)

V100 という"初の Tensor コア GPU"を使うと、20fps前後のフレームレートがでているとのこと。



## CVPR 2023 pdf [MSeg3D: Multi-modal 3D Semantic Segmentation for Autonomous Driving](https://openaccess.thecvf.com/content/CVPR2023/papers/Li_MSeg3D_Multi-Modal_3D_Semantic_Segmentation_for_Autonomous_Driving_CVPR_2023_paper.pdf)

github [LiDARSeg3D](https://github.com/jialeli1/lidarseg3d)

![Screenshot from 2023-12-22 21-48-57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/fc855360-0197-d202-2801-67e825c00b65.png)
[引用元](https://openaccess.thecvf.com/content/CVPR2023/papers/Li_MSeg3D_Multi-Modal_3D_Semantic_Segmentation_for_Autonomous_Driving_CVPR_2023_paper.pdf)
LiDARとカメラ画像とがあるときのmulti-modalな手法ですね。

## yolov8 にはセグメンテーションがある。
- https://docs.ultralytics.com/ja/
- https://github.com/ultralytics/ultralytics?tab=readme-ov-file

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/72dc0a16-6f7a-8332-32cd-65ccaca891e8.png)
[引用元](https://github.com/ultralytics/ultralytics?tab=readme-ov-file)

#### yolov8の解説記事
[Yolov8 の使い方](https://qiita.com/john-rocky/items/40fbb459a43e1c02459e)

[物体検出モデルYOLOv8の紹介: 動作手順や過去のバージョンとの比較](https://tech.revcomm.co.jp/yolov8-introduction)

## yolov7にもセグメンテーションがある。
#### [Yolov7でインスタンスセグメンテーション](https://qiita.com/john-rocky/items/fa12dd87d6ac1b583077)

#### [【物体検出2022】YOLOv7まとめ第7回 Instance segmentationを実装する](https://tt-tsukumochi.com/archives/3564)

#### github https://github.com/WongKinYiu/yolov7
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/f62b410e-2bc3-d6f2-a544-751b1e7c40f4.png)
[引用元](https://github.com/WongKinYiu/yolov7)

#### 関連するgithub https://github.com/laitathei/YOLOv7-Pytorch-Segmentation
#### 関連するgithub https://github.com/leandro-svg/Yolov7_Segmentation_Tensorrt
yolov7からforkした版がある。


## github [detectron2](https://github.com/facebookresearch/detectron2)
> Detectron2 is a platform for object detection, segmentation and other visual recognition tasks.

![66535560-d3422200-eace-11e9-9123-5535d469db19-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/e54b4a95-364b-b72b-66df-e1b45c35b15f.png)

画像セグメンテーションは、物体検出と共通性が高いので、別々のソフトウェアとして実装されるよりは、同一のソフトウェアとして実装される方がうれしい。その方が計算の無駄が少なくなるし、メモリの管理も楽になるはず。
（ただ、そのなっていくほど、学習データの与え方は難しくなってしまう懸念はある。）

detectron2 をTensorRT上で動作させることについての記載がある。
NVIDIAのgithub [Detectron 2 Mask R-CNN R50-FPN 3x in TensorRT](https://github.com/NVIDIA/TensorRT/tree/main/samples/python/detectron2)

#### qiita [Jetson xavierでDetectron2を用いた画像解析](https://qiita.com/blkpnk24/items/7b020ad065b2924bd685)

#### MATLAB の場合　[イメージのセグメンテーション](https://jp.mathworks.com/help/images/image-segmentation.html)
![Screenshot from 2023-12-22 11-41-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/55a7fa08-a967-ec56-4f75-d4d09c97d76b.png)
[引用元](https://jp.mathworks.com/help/images/image-segmentation.html)
これらは、深層学習を必要としないセグメンテーション手法である。


#### MATLAB の場合　[Mask R-CNN を使用したインスタンス セグメンテーションの実行](https://jp.mathworks.com/help/vision/ug/example-InstanceSegmentationUsingMaskRCNNDeepLearningExample.html)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/9e9e1fba-e886-ae1c-e87c-36a95b4114f1.png)

[引用元](https://jp.mathworks.com/help/vision/ug/example-InstanceSegmentationUsingMaskRCNNDeepLearningExample.html)

Mask R-CNN を学習させる場合の例が記載されている。


#### MATLAB の場合[深層学習を使用したセマンティック セグメンテーション](https://jp.mathworks.com/help/vision/ug/semantic-segmentation-using-deep-learning.html)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/96632cff-c3b6-28ba-4d28-b09d3181af30.png)
[引用元](https://jp.mathworks.com/help/vision/ug/semantic-segmentation-using-deep-learning.html)



#### MATLAB の場合 Yolov8
以下のやり取りを見る限り、現状では未対応(2023年時点）
[I need Yolov8 in MATLAB, what is the latest version of YOLO algorithm in MATLAB?](https://jp.mathworks.com/matlabcentral/answers/2029439-i-need-yolov8-in-matlab-what-is-the-latest-version-of-yolo-algorithm-in-matlab)


## Scikit-image のimage segmentation
- 深層学習を必要としない画像のセグメンテーションならば、scikit-image も候補になる。
- [11.1. Image Segmentation](https://scikit-image.org/docs/stable/user_guide/tutorial_segmentation.html)

scikit-image [Multi-Otsu Thresholding](https://scikit-image.org/docs/stable/auto_examples/segmentation/plot_multiotsu.html)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/81b16217-44e8-a74c-2d90-e208eb6982fd.png)
[引用元](https://scikit-image.org/docs/stable/auto_examples/segmentation/plot_multiotsu.html)

[RAG Thresholding](https://scikit-image.org/docs/stable/auto_examples/segmentation/plot_rag_mean_color.html#sphx-glr-auto-examples-segmentation-plot-rag-mean-color-py)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/1c0f45a5-2e96-9ee2-2558-b105ce84816c.png)

[引用元](https://scikit-image.org/docs/stable/auto_examples/segmentation/plot_rag_mean_color.html#sphx-glr-auto-examples-segmentation-plot-rag-mean-color-py)

深層学習を必要としない分野での画像のセグメンテーションには、scikit-image に多様な例が示されているので、それを参照してみよう。
整体組織の顕微鏡写真のセグメンテーションの事例もある。

古典的なセグメンテーションの操作の場合には、OpenCVに含まれるモルフォロジー操作の関数だけで実装できる場合もあるだろう。

- [Python と OpenCV によるグラフカット処理](https://qiita.com/KyojiOsada/items/3b54ca33242953051399)

- [OpenCVのGrabCut使ってみた](https://qiita.com/marutaku0131/items/657c32358cfad7817648)


## OpenVino
#### openvinoのmodel zoo にあるインスタンスセグメンテーション
[Instance Segmentation Python* Demo](https://github.com/openvinotoolkit/open_model_zoo/blob/master/demos/instance_segmentation_demo/python/README.md)
![instance_segmentation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/7f4ecde3-261b-7563-5b2e-b72fad9e85ca.gif)

#### OpenVinoでの画像セグメンテーションの解説記事
[image segmentation demo](https://openvino.jp/image-segmentation-python-demo/)


## Kaggle [Image Segmentation for Self-Driving Cars](https://www.kaggle.com/code/counter/image-segmentation-for-self-driving-cars)
Keras を用いた例が書かれている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/a85154f3-02f8-7768-cc51-b664191b099c.png)
[引用元](https://www.kaggle.com/code/counter/image-segmentation-for-self-driving-cars)

## github [panoptic-segmentation](https://github.com/topics/panoptic-segmentation)


## Transfomerベースの画像セグメンテーション
Hugging Face / Transformers 
[Image Segmentation](https://huggingface.co/docs/transformers/tasks/semantic_segmentation)
![segmentation-comparison-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/145c0602-c2bf-5316-9813-f55ba1b9ffc7.png)
[引用元](https://huggingface.co/docs/transformers/tasks/semantic_segmentation)

画像セグメンテーションの分野においても、Transformerベースの開発が進んでいる。
上記のHugging Face の記事を参照のこと。


## Segment Anything
qiita 解説記事 [Segment Anything](https://qiita.com/fuyu_quant/items/e27505c00e92aa2a1acd)

NVIDIA Jetson Generative AI Lab [Tutorial - SAM (Segment Anything)](https://www.jetson-ai-lab.com/vit/tutorial_sam.html)

HuggingFace [Segment Anything](https://huggingface.co/docs/transformers/main/model_doc/sam)
#### hugging face のtransformers 上の実装の利点
- 簡単に動作できるようになっているので、GPUを持っていないPCで動作させるのもとても簡単。
- HuggingFaceにはimage-segmentationに、アルゴリズム、学習対象のデータセットの組み合わせで、多数のモデルがある。
- HuggingFaceではうれしいことに、モデルでの推論が共通になっている。
- そのため、モデルの切り替えがとても楽になっている。


"nvidia/segformer-b1-finetuned-cityscapes-1024-1024"
"facebook/maskformer-swin-tiny-coco"

[Cityscapesデータセット](https://www.cityscapes-dataset.com/dataset-overview/)
[解説記事 Cityscapesデータセット](https://cvml-expertguide.net/terms/dataset/image-dataset/cityscapes/)



## [CVPR2023丨A collection of papers on Semantic Segmentation](https://medium.com/@aminerscholar_39923/cvpr2023%E4%B8%A8a-collection-of-papers-on-semantic-segmentation-44e4837e8ed5)
10 個の文献が紹介されている。

---

## jetson-inference [Semantic Segmentation with SegNet](https://github.com/dusty-nv/jetson-inference/blob/master/docs/segnet-console-2.md#segmenting-images-from-the-command-line)
![](https://raw.githubusercontent.com/dusty-nv/jetson-inference/master/docs/images/segmentation-sun.jpg)
----
[EgoHOS](https://github.com/owenzlz/EgoHOS)
Fine-Grained Egocentric Hand-Object Segmentation, ECCV 2022
- セグメンテーションであるので、ハンドのlandmarkは含まれない。
- このライブラリだけでは、1次の対象物と2次の対象物のセグメンテーションが分かるだけ。
- 1次の対象物、2次の対象物がそれぞれ何であるのかという理解は持たない。
- ![teaser.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/f1497b87-dd88-70fd-715e-0047f6de9b59.gif)


[instance_segmentation_RealSense](https://github.com/bowu1004/instance_segmentation_RealSense)