【Python】画像認識で個数カウントをする方法

【Python】画像認識で個数カウントをする方法

公開: 更新:
CodeCampが提供するDX人材育成が可能なプログラミングやITが学べる公開講座



Pythonで画像認識をして個数をカウントする方法

Pythonで画像内のオブジェクトの個数をカウントするためには、OpenCVライブラリが非常に有効です。特に輪郭検出機能を使用することによって、物体の形状を特定し個数を正確にカウントできます。画像処理において基本的な手順は、まず入力画像をグレースケールに変換し、次にノイズ除去のためにブラー処理を適用した後、二値化処理によって対象物と背景を明確に区別する必要があります。

輪郭検出は画像内の物体を識別する強力な手法であり、cv2.findContours()関数を使用することによって実装できます。この関数は処理された二値画像を入力とし、検出された全ての輪郭を階層情報とともに返すため、単純に返された輪郭のリストの長さを取得することで画像内の物体数を効率的に把握できます。

画像認識においては前処理の質が結果の精度に大きく影響するため、適切なしきい値の設定と輪郭の抽出条件の調整が必要です。特に物体が互いに接触している場合や背景との区別が難しい場合には、モルフォロジー演算(膨張や収縮)を適用することによって、より正確な輪郭抽出が可能となりオブジェクトの過剰検出や検出漏れを防げます。

【サンプルコード】
import cv2
import numpy as np
import matplotlib.pyplot as plt

# 画像を読み込む
image = cv2.imread('objects.jpg')
# グレースケールに変換
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# ガウシアンブラーでノイズ除去
blur = cv2.GaussianBlur(gray, (5, 5), 0)
# 二値化
_, thresh = cv2.threshold(blur, 127, 255, cv2.THRESH_BINARY)
# 輪郭検出
contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 結果の可視化
result = image.copy()
cv2.drawContours(result, contours, -1, (0, 255, 0), 2)
object_count = len(contours)
cv2.putText(result, f'Count: {object_count}', (10, 30), 
            cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)

# 結果表示(OpenCVの色順はBGR、matplotlibはRGB)
result_rgb = cv2.cvtColor(result, cv2.COLOR_BGR2RGB)
plt.figure(figsize=(10, 8))
plt.imshow(result_rgb)
plt.title(f'検出されたオブジェクト数: {object_count}')
plt.axis('off')
plt.show()
【実行結果】
検出されたオブジェクト数: 5
[画像には5つのオブジェクトが緑色の輪郭線で囲まれ、各オブジェクトがカウントされていることが表示されます]

Python研修一覧はこちら

目的に合うPython研修を一覧形式から探したい方は、ぜひご利用ください。

Python研修を比較する

Java研修一覧はこちら

目的に合うJava研修を一覧形式から探したい方は、ぜひご利用ください。

Java研修を比較する

PHP研修一覧はこちら

目的に合うPHP研修を一覧形式から探したい方は、ぜひご利用ください。

PHP研修を比較する

新入社員研修

目的に合う新入社員研修を一覧形式から探したい方は、ぜひご利用ください。

新入社員研修を比較する

全ての研修からも探したい方はこちら

画像認識で得られる色彩情報を活用して個数をカウントする方法

色彩情報を活用したオブジェクトカウントでは、HSV色空間への変換が極めて効果的であり、RGB色空間よりも色相(Hue)、彩度(Saturation)、明度(Value)の分離によって特定の色を持つオブジェクトを正確に抽出できます。HSV色空間では色相は0〜179の範囲で表現され、赤色なら0〜10および170〜179、青色なら100〜130というように色相範囲を指定することによって、特定の色を持つオブジェクトだけを精密に抽出可能です。

マスク画像の生成は色彩ベースの物体検出における重要なステップであり、cv2.inRange()関数を使用することによって指定した色相範囲内の画素だけを含む二値マスクを作成できます。得られたマスク画像に対してモルフォロジー演算を適用することによって、ノイズを除去し連結領域を適切に分離することが可能となり、より正確なオブジェクトカウントが実現できます。

異なる色のオブジェクトをそれぞれカウントしたい場合は、各色に対応するマスクを個別に生成し、それぞれのマスクから輪郭検出を行うアプローチが有効です。このアプローチでは複数の色のオブジェクトが混在する複雑な画像においても、色ごとの個数を正確に把握でき、色分布の分析やカラーベースの選別システムなどの応用において優れた結果を提供します。

【サンプルコード】
import cv2
import numpy as np
import matplotlib.pyplot as plt

# 画像読み込み
image = cv2.imread('colored_objects.jpg')
# HSV色空間に変換
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

# 赤色の範囲定義(HSVでは赤は0付近と180付近の2箇所)
lower_red1 = np.array([0, 100, 100])
upper_red1 = np.array([10, 255, 255])
lower_red2 = np.array([160, 100, 100])
upper_red2 = np.array([179, 255, 255])

# 青色の範囲定義
lower_blue = np.array([100, 100, 100])
upper_blue = np.array([130, 255, 255])

# 各色のマスク作成
red_mask1 = cv2.inRange(hsv, lower_red1, upper_red1)
red_mask2 = cv2.inRange(hsv, lower_red2, upper_red2)
red_mask = cv2.bitwise_or(red_mask1, red_mask2)  # 赤色マスクの統合
blue_mask = cv2.inRange(hsv, lower_blue, upper_blue)

# モルフォロジー演算でノイズ除去
kernel = np.ones((5, 5), np.uint8)
red_mask = cv2.morphologyEx(red_mask, cv2.MORPH_OPEN, kernel)
blue_mask = cv2.morphologyEx(blue_mask, cv2.MORPH_OPEN, kernel)

# 輪郭検出と個数カウント
red_contours, _ = cv2.findContours(red_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
blue_contours, _ = cv2.findContours(blue_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 結果の可視化
result = image.copy()
# 赤色オブジェクトの輪郭を描画
cv2.drawContours(result, red_contours, -1, (0, 0, 255), 2)  # 赤色で描画
# 青色オブジェクトの輪郭を描画
cv2.drawContours(result, blue_contours, -1, (255, 0, 0), 2)  # 青色で描画

# カウント情報表示
red_count = len(red_contours)
blue_count = len(blue_contours)
cv2.putText(result, f'赤: {red_count}', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
cv2.putText(result, f'青: {blue_count}', (10, 70), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)

# 結果表示
result_rgb = cv2.cvtColor(result, cv2.COLOR_BGR2RGB)
plt.figure(figsize=(10, 8))
plt.imshow(result_rgb)
plt.title(f'赤色オブジェクト: {red_count}個, 青色オブジェクト: {blue_count}個')
plt.axis('off')
plt.show()
【実行結果】
赤色オブジェクト: 3個, 青色オブジェクト: 2個
[画像には赤色の輪郭線で囲まれたオブジェクトが3つ、青色の輪郭線で囲まれたオブジェクトが2つ表示されています]

機械学習で画像認識をして個数をカウントする方法

機械学習を用いた画像内のオブジェクト検出では、YOLOv5(You Only Look Once)などの最新の物体検出アルゴリズムが高い精度と処理速度を誇り、従来の画像処理技術では困難だった複雑な背景や重なり合ったオブジェクトの検出が可能になります。YOLOは単一のニューラルネットワークで画像全体を一度に処理し、複数のバウンディングボックスと各クラスの確率を同時に予測することによって、リアルタイム処理にも適した効率的な検出システムを実現しています。

機械学習モデルを使用するには適切なライブラリのインストールが必要であり、PyTorchやTensorFlowなどのディープラーニングフレームワークと事前学習済みのモデルウェイトを組み合わせて利用します。特にPyTorchベースのYOLOv5はtorch.hub.load()を使用してインストールでき、事前学習済みの重みを読み込むことによって、カスタムトレーニングなしで一般的なオブジェクト(人、車、動物など)を即座に検出できる利便性があります。

検出結果はクラス別にフィルタリングでき、各検出オブジェクトの位置(バウンディングボックス)、クラス、確信度スコアが得られます。これらの情報を活用することによって、特定のクラスに属するオブジェクトの個数を正確にカウントするだけではなく、その空間的分布や配置も分析可能であり、複雑な画像解析タスクにおいて従来の画像処理手法よりも優れた結果を提供します。

【サンプルコード】
import torch
import cv2
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
import pandas as pd

# YOLOv5モデルを読み込み
model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)

# 入力画像の読み込み
img_path = 'street_scene.jpg'
img = Image.open(img_path)

# 推論実行
results = model(img)

# 結果をパンダスDataFrameとして取得
results_df = results.pandas().xyxy[0]

# 各クラスの個数をカウント
class_counts = results_df['name'].value_counts()

# 検出結果を可視化
img_cv = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)
result_img = img_cv.copy()

# 各検出オブジェクトに枠と名前を描画
for _, row in results_df.iterrows():
    x1, y1, x2, y2 = int(row['xmin']), int(row['ymin']), int(row['xmax']), int(row['ymax'])
    conf = row['confidence']
    label = f"{row['name']} {conf:.2f}"
    
    # クラスごとに異なる色を割り当て
    color_hash = int(hash(row['name'])) % 256
    color = (color_hash, 255 - color_hash, 128)
    
    # バウンディングボックスを描画
    cv2.rectangle(result_img, (x1, y1), (x2, y2), color, 2)
    cv2.putText(result_img, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)

# カウント情報を画像に追加
y_pos = 30
for class_name, count in class_counts.items():
    color_hash = int(hash(class_name)) % 256
    color = (color_hash, 255 - color_hash, 128)
    text = f"{class_name}: {count}"
    cv2.putText(result_img, text, (10, y_pos), 
                cv2.FONT_HERSHEY_SIMPLEX, 0.7, color, 2)
    y_pos += 30

# 結果表示
result_img_rgb = cv2.cvtColor(result_img, cv2.COLOR_BGR2RGB)
plt.figure(figsize=(12, 10))
plt.imshow(result_img_rgb)
plt.title('YOLOv5によるオブジェクト検出結果')
plt.axis('off')
plt.show()

# 各クラスの検出数をテーブルで表示
print("検出されたオブジェクトのカウント:")
print(class_counts)
【実行結果】
検出されたオブジェクトのカウント:
person    8
car       6
bus       2
truck     1
Name: count, dtype: int64
[画像には検出された各オブジェクトの周りにバウンディングボックスが描画され、各クラスのカウント情報が表示されています]

※上記コンテンツの内容やソースコードはAIで確認・デバッグしておりますが、間違いやエラー、脆弱性などがある場合は、コメントよりご報告いただけますと幸いです。

ITやプログラミングに関するコラム


ITやプログラミングに関するニュース

ブログに戻る

コメントを残す

コメントは公開前に承認される必要があることにご注意ください。

企業・法人向けのIT・プログラミング・生成AI研修を探す、比較する - IT・プログラミングを知って学べるコネクトメディア CodeCampが提供するDX人材育成が可能なプログラミングやITが学べる公開講座 - IT・プログラミングを知って学べるコネクトメディア コードキャンプが提供する無料で学べるプログラミングスクール講座 - IT・プログラミングを知って学べるコネクトメディア コードキャンプDX人材育成研修 - IT・プログラミングを知って学べるコネクトメディア 3.5日の研修で、年間1,600時間の削減効果が見込まれる。東京きらぼしフィナンシャルグループのDX人材育成事例 - IT・プログラミングを知って学べるコネクトメディア 配属3ヶ月で30%の生産性向上を実現するいよぎんコンピュータサービスの新人研修に迫る - IT・プログラミングを知って学べるコネクトメディア 金融業界の業務効率化を加速するニッセイアセットマネジメントの生成AI×GAS活用研修事例 - IT・プログラミングを知って学べるコネクトメディア 【製造業のDX人材育成事例】デジタル人材の即戦力化を実現する、日本ガイシ株式会社の異動者向オンボーディング研修 - ITやプログラミングを知って学べるコネクトメディア フューチャーアーキテクト株式会社が実現した新入社員向けIT研修プログラムでタスクフォース制度が主体的な学びと成長を生み出す - IT・プログラミングを知って学べるコネクトメディア コードキャンプDX人材育成研修 - IT・プログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/【IT新入社員研修】オンラインとオフラインの最適バランスを実現したFutureOneの導入事例 - IT・プログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/【新入社員研修】柔軟なハイブリッド型Java研修で実現した新卒20名の成長と成果|サークレイス株式会社 - ITやプログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/現場により近いところにデジタルを根付かせるDX基礎講座研修|株式会社ブリヂストン - ITやプログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/業務の効率化・DX推進に向けたIT人材育成への第一歩|株式会社カナエ - ITやプログラミングを知って学べるコネクトメディア 企業・法人向けのIT・プログラミング研修 - ITやプログラミングを知って学べるコネクトメディア

新着記事

対象者別で探す

子供(小学生・中学生・高校生)向け
プログラミング教室検索する

子供(小学生・中学生・高校生)がロボットやプログラミング言語を学ぶことができるオフラインからオンラインスクールを検索、比較することが可能です。

子供(小学生・中学生・高校生)
プログラミング教室検索する

ITやプログラムなどの
最新情報を検索する

日々、新しいITやプログラミング言語の情報が流れていきますが、特定の情報を時系列でニュースやコラムを確認することができます。

ITやプログラムなどの
最新情報を検索する