画像ファイルに指定した物体が何個映っているのかを数える処理を自動化してみた


###参考サイト

次のウェブサイトが、一部でバズっているようです。

- [Count Number of Cars in Less Than 10 Lines of Code Using Python](https://towardsdatascience.com/count-number-of-cars-in-less-than-10-lines-of-code-using-python-40208b173554)

次の手順で、読み込んだ画像ファイルに、指定した物体が何個映っているのかを数える処理を、数行のお手軽コーディングで行えることが、話題になっていました。

####（ 作業手順 ）

- 画像ファイルに物体検出モデルを適用する
- 返り値として、検出物体ラベルとその座標位置と検出確信度を得る
- 指定した文字列のラベルが、検出物体ラベルが収められた配列リストに、何回出現したかを、カウントする

上の記事に掲載されているコードのうち、上の３つのステップが実装されている部分を抜粋し他のが、以下になります。

>```Python3:
>image = cv2.imread(file_name)
>bbox, label, conf = cv.detect_common_objects(image)
>
> （ 省略 ）
>
> print('Number of cars in the image is '+ str(label.count('car')))
```

裏側では、cvlibモジュールを使っています。

- [cvlib, A simple, high level, easy to use, open source Computer Vision library for Python.](https://www.cvlib.net/)

今回、この処理を、スクリプト・ファイルにしてみました。

###作成したスクリプト・ファイル

```Python3:image_object_count.py
import argparse   
import cv2
import matplotlib.pyplot as plt
import cvlib as cv
import datetime
from cvlib.object_detection import draw_bbox

parser = argparse.ArgumentParser(description='')  
# 読み込む画像ファイルのファイル名を、コマンドライン引数から受け取る
parser.add_argument('-file')  
# 関心対象の物体ラベル名を、コマンドライン引数から受け取る
parser.add_argument('-label')  

args = parser.parse_args() 
file_name = str(args.file)
label_name  = str(args.label)

image = cv2.imread(file_name)
bbox, label, conf = cv.detect_common_objects(image)
output_image = draw_bbox(image, bbox, label, conf)
plt.imshow(output_image)

#dt_now = datetime.datetime.now()
message = "{0}の検出数：{1}".format(label_name, str(label.count(label_name)))
print(message)

#https://www.relief.jp/docs/python-get-string-before-specific-character.html

output_file_name = "[解析済]ファイル名_{0}_{1}の検出数_{2}個.jpg".format(file_name.split('.')[0], label_name, str(label.count(label_name)))
print(output_file_name)
plt.imsave(output_file_name, output_image)

```


###動作検証の結果

__数え漏れが、多かったです。__

この辺りは、物体検出モデルの認識精度を改善することで、解決されるはず。:football:

__（ コード実行後の作業フォルダの景色 ）__

![スクリーンショット 2021-08-04 0.39.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754134/95577876-6e65-22c1-71bc-f1d3199f2fb4.png)


* __( 入力画像 ）__

__*nogizaka_46.jpg*__

![nogizaka_46.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754134/43b90539-31b0-b717-7108-6d54867efba0.jpeg)


* __( 検出対象の物体ラベル名 ）__

__*person*__

```bash:Terminal
electron@diynoMacBook-Pro image_object_count % python3 image_object_count.py -file nogizaka_46.jpg -label person
personの検出数：12
[解析済]ファイル名_nogizaka_46_personの検出数_12個.jpg
electron@diynoMacBook-Pro image_object_count %
```

* __( 出力画像 ）__

![[解析済]ファイル名_nogizaka_46_personの検出数_12個.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754134/53c7e212-de06-58f3-7337-ca36d120badc.jpeg)

###続けて、他の画像で、personの（人）数カウントをやってみる

* __( 入力画像 ）__

__*cabinet_members.jpg*__

![cabinet_members.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754134/7cac2a9b-d74e-cd34-946b-1b79f2335ea4.jpeg)


* __( 検出対象の物体ラベル名 ）__

__*person*__

```bash:Terminal
electron@diynoMacBook-Pro image_object_count % python3 image_object_count.py -file cabinet_members.jpg -label person
personの検出数：13
[解析済]ファイル名_cabinet_members_personの検出数_13個.jpg
electron@diynoMacBook-Pro image_object_count %
```

* __( 出力画像 ）__

![[解析済]ファイル名_cabinet_members_personの検出数_13個.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754134/82c197ec-8d82-6df8-bc40-36d29ca98496.jpeg)

###同じ画像で、tieの（本）数カウントをやってみる

```bash:Terminal
electron@diynoMacBook-Pro image_object_count % python3 image_object_count.py -file cabinet_members.jpg -label tie   
tieの検出数：18
[解析済]ファイル名_cabinet_members_tieの検出数_18個.jpg
electron@diynoMacBook-Pro image_object_count %
```

* __( 出力画像 ）__

![[解析済]ファイル名_cabinet_members_tieの検出数_18個.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754134/8d898f2f-5ec6-5852-33ed-7281aa8b23d3.jpeg)


###さらに他の画像で、carの（台）数カウントをやってみる

* __( 入力画像 ）__

__*test.jpg*__

![test.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754134/1503fb3d-88b2-344e-4cb9-839423045455.jpeg)

* __( 検出対象の物体ラベル名 ）__

__*car*__

```bash:Terminal
electron@diynoMacBook-Pro image_object_count % python3 image_object_count.py -file test.jpg -label car   
carの検出数：6
[解析済]ファイル名_test_carの検出数_6個.jpg
electron@diynoMacBook-Pro image_object_count %
```

* __( 出力画像 ）__

![[解析済]ファイル名_test_carの検出数_6個.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754134/3449e5f1-0ac1-2b01-b147-9bad194e68df.jpeg)

###同じ画像で、personの（人）数カウントをやってみる

* __( 入力画像 ）__

__*test.jpg*__

* __( 検出対象の物体ラベル名 ）__

__*human*__

```bash:Terminal
electron@diynoMacBook-Pro image_object_count % python3 image_object_count.py -file test.jpg -label person
personの検出数：15
[解析済]ファイル名_test_personの検出数_15個.jpg
electron@diynoMacBook-Pro image_object_count %
```

* __( 出力画像 ）__

![[解析済]ファイル名_test_personの検出数_15個.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754134/35f0c66f-3aa6-9272-0d31-408bd915e204.jpeg)


###ディレクトリの中身

```bash:Terminal
electron@diynoMacBook-Pro image_object_count %  ls
[解析済]ファイル名_cabinet_members_personの検出数_13個.jpg
[解析済]ファイル名_cabinet_members_tieの検出数_18個.jpg
[解析済]ファイル名_nogizaka_46_personの検出数_12個.jpg
[解析済]ファイル名_test_carの検出数_6個.jpg
[解析済]ファイル名_test_personの検出数_15個.jpg
cabinet_members.jpg
image_object_count.py
nogizaka_46.jpg
test.jpg
electron@diynoMacBook-Pro image_object_count % 
```

###めざせCanonの人数集計精度 ！

産業応用レベルでの物体自動カウント・ツールに使えそうな、物体検出器は、かなり優れた認識精度に到達しています。

- [Canon テクノロジートップ最先端を切り拓く技術群衆カウント技術](https://global.canon/ja/technology/count2019.html)

Canonの群集カウント技術は、以下のように一人一人の人間のサイズが小さい群集の人数を自動集計できるみたいです。

![スクリーンショット 2021-08-04 1.00.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754134/69b74ebc-8447-afdd-fa2d-15104ac26a0e.png)

また、街中の人物（監視）AIで、しばしばTVに取り上げられる中国・Sensetimeからは、次の論文が出ています。

- [Finding Tiny Faces in the Wild with Generative Adversarial Network](https://openaccess.thecvf.com/content_cvpr_2018/CameraReady/0565.pdf)

![スクリーンショット 2021-08-04 1.06.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754134/024769c7-e65d-8e6d-edb3-e0f9613d4ac3.png)