画像認識AI技術を活用した「つるかめ算」応用に関する検討

##  はじめに
IoT社会の進展とデジタル技術の高度化を背景に、中学受験の競争は激しさを増しており、それに伴って特殊算への学習ニーズも急増しています。特に「つるかめ算」は、面積図を使った視覚的・直感的な理解が可能な教材として再評価されており、安定的な教材供給と指導法の体系化が求められています。

一方で、「生き物の足を正確に数える職人的思考」を伝えられる熟練講師の確保は、少子高齢化の影響でますます困難となっており、現場では技術継承と人材不足が深刻な課題となっています。

そのため、教育インフラの質を保ちながら人材不足に対応する手段として、AIや機械学習の活用が期待されています。今後は、段階的な実証と評価を通じて、現場で活用可能な支援モデルの構築が求められています。










![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043781/cf0d6d81-211f-4bcf-9330-ef05e3670407.png)





##  提案手法
機械学習技術の導入にあたっては、柔軟な開発・検証が可能なPython環境（Jupyter Notebook／Google Colab）と、YOLO（You Only Look Once）による高精度な足カウント検出機能を組み合わせた画像処理AIソリューションのご提案を進めてまいります。
なお、試作段階では、つるやかめではなく、既に画像データの教師あり学習が進んでいる“人”と“猫”の識別を題材とした「ヒューマンにゃんこ算」をプロトタイプモデルとして活用することを想定しています。

「ヒューマンにゃんこ算」とは？
人の足は2本、猫の足は4本あるとき、
人と猫の合計の頭数をA、足の合計をBとしたとき、
人の数 x と猫の数 y を求める問題を考えます。


x+y=A
2×x+4×y=B

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043781/bd54c146-4375-4210-a2dd-dd08b661c270.png)




提供するYOLOベースの画像処理技術では、画像認識を通じて人と猫を自動で識別・カウントし、そこから得られたデータをもとに A（頭数）および B（足の数）を算出します。
さらに、Pythonプログラミングを活用して「自ら問いを立てる」学習体験を促進し、
学習者の主体的な気づきと理解を深めることを目的としています。

加えて、面積図による視覚的なインターフェースと、将来を見据えた線形代数を用いた数学的処理機能を融合させることで、
論理的思考のプロセスを“見える化”する、総合的な学習支援AI機械学習技術を実現しています。


※技術用語や理論については、別途参考リンクを掲載しておりますので、各自での学習を推奨します。


---

##  別途参考リンクまとめ


###  つるかめ算  
- https://www.youtube.com/watch?v=hOq23TJ47Ow  
- https://www.youtube.com/watch?v=anAxn0bqKCI  

---

###  PythonとGoogle Colab（Jupyter Notebook）  
- https://www.youtube.com/watch?v=tCMl1AWfhQQ&t=7826s  
- https://www.youtube.com/watch?v=2tm8qrjVrk8  

---

###  YOLOと機械学習  
- https://www.youtube.com/watch?v=OFMaQBV3fp4  
- https://www.youtube.com/watch?v=VwnijeiGDTQ  

---

##  例題

「人（2本足）」と「猫（4本足）」による“足の数”の合計から個体数を求める問題
「ヒューマンにゃんこ算」の実装


 **Python実行はGoogle Colab ノートブックリンクを活用ください**  
[https://colab.research.google.com/](https://colab.research.google.com/)




```Python

import numpy as np
import matplotlib.pyplot as plt

# ================================
# 入力：合計頭数と足の本数 / Input: total beings and total legs
# ================================
A = 11  # 合計頭数 / Total number of beings (humans + cats)
B = 32  # 合計足数 / Total number of legs

# ----------------------------
# 入力内容の表示 / Display input values
# ----------------------------
print("=== 入力 / Input ===")
print(f"合計の頭数 A = {A}")
print(f"合計の足の数 B = {B}")

# ----------------------------
# 連立方程式を解く / Solve simultaneous equations
# x: 人の数（2本足）/ Number of humans
# y: 猫の数（4本足）/ Number of cats
# ----------------------------
coeff_matrix = np.array([[1, 1],
                         [2, 4]])
constants = np.array([A, B])
x, y = np.linalg.solve(coeff_matrix, constants)

# ----------------------------
# 解の表示と検算 / Display solution and verification
# ----------------------------
print("\n=== 解 / Solution ===")
print(f"人の数 (x) = {x}")
print(f"猫の数 (y) = {y}")

# 検算 / Verification
check1 = x + y
check2 = 2 * x + 4 * y

print("\n=== 検算 / Verification ===")
print(f"x + y = {x} + {y} = {check1} → {'OK' if np.isclose(check1, A) else 'NG'}")
print(f"2x + 4y = 2×{x} + 4×{y} = {check2} → {'OK' if np.isclose(check2, B) else 'NG'}")

# ----------------------------
# 面積法による考え方 / Area-based reasoning
# ----------------------------
area_if_all_cats = 4 * A                     # 全員が猫だった場合の足の数 / Legs if all are cats
diff = area_if_all_cats - B                 # 差分 / Difference from actual
diff_per_being = 4 - 2                      # 猫と人の足の差 / Legs difference per being
num_humans = diff / diff_per_being          # 人の数 / Number of humans
num_cats = A - num_humans                   # 猫の数 / Number of cats

print("\n=== 面積法の結果 / Area-based reasoning result ===")
print(f"全員が猫なら足は 4×{A} = {area_if_all_cats}")
print(f"実際との差 = {area_if_all_cats} - {B} = {diff}")
print(f"差 ÷ (4-2) = {diff} ÷ {diff_per_being} = {num_humans} → 人の数")
print(f"{A} - {num_humans} = {num_cats} → 猫の数")

# ----------------------------
# グラフ描画 / Visualization
# ----------------------------
plt.figure(figsize=(8, 6))

# 猫の領域（茶色）/ Cat area (brown)
points_cat = [(0, 0), (y, 0), (y, 4), (0, 4)]
plt.fill(*zip(*points_cat), color='#8B4513', alpha=0.6, label='Cat Area (4 legs each)')

# 人の領域（肌色）/ Human area (peach)
points_human = [(y, 0), (x + y, 0), (x + y, 2), (y, 2)]
plt.fill(*zip(*points_human), color='#FFDAB9', edgecolor='black', label='Human Area (2 legs each)')

# 座標点とラベルの描画 / Draw coordinate points and labels
for point in points_cat + points_human:
    plt.scatter(*point, color='black')
    plt.text(point[0], point[1], f'({point[0]:.0f}, {point[1]:.0f})',
             fontsize=9, ha='right', va='bottom', color='black')

# 軸・タイトル・グリッド / Axes and title
plt.xlabel('Number of Beings')
plt.ylabel('Number of Legs')
plt.title('Human and Cat Area Diagram')
plt.legend()
plt.grid(True)
plt.axis('equal')
plt.show()

```

# 結果画像

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043781/cf2f43e7-75f5-4196-87e0-296b31d8c7ac.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043781/edca6dba-5ae0-4a6f-bdf7-e514a83a59c4.png)


検出結果をもとに検証を完了しました。
次から本題です。


## YOLOv5による人物・動物検出と「ヒューマンにゃんこ算」の視覚化：Pythonで学ぶ算数×機械学習AI技術

YOLOv5による物体検出の実践的スキルを習得すると同時に、算数の「面積図」を視覚的に理解することを目的としています。加えて、Pythonを使ったデータ処理と可視化の技術を体系的に学べる構成となっており、AI・算数・プログラミングを横断的に学習できる統合的な学びを実現します。









```Python

# ========================================
# STEP 1: YOLOv5 セットアップ（ファインチューニングなし）
# ========================================
!git clone https://github.com/ultralytics/yolov5.git
%cd yolov5
!pip install -r requirements.txt

# ========================================
# STEP 2: 画像アップロード / Upload image
# ========================================
from google.colab import files
print("📷 人と猫が写った画像をアップロードしてください / Upload an image with humans and cats")
uploaded = files.upload()
image_path = list(uploaded.keys())[0]

# ========================================
# STEP 3: YOLOv5xモデルを使って推論 / Load and run YOLOv5x
# ========================================
import torch

model = torch.hub.load('ultralytics/yolov5', 'yolov5x', pretrained=True)
results = model(image_path)

# 結果表示 / Show bounding boxes
results.print()
results.show()

# 結果保存＆ダウンロード / Save & download detection result
results.save(save_dir='runs/detect/exp')
import os
detected_path = os.path.join('runs/detect/exp', os.path.basename(image_path))
files.download(detected_path)

# ========================================
# STEP 4: 人と猫の数をカウント / Count humans and cats
# ========================================
labels = results.pred[0][:, -1].tolist()
class_names = model.names
human_id = [k for k, v in class_names.items() if v == 'person'][0]
cat_id = [k for k, v in class_names.items() if v == 'cat'][0]

num_humans = labels.count(human_id)
num_cats = labels.count(cat_id)

print("\n=== 検出結果 / Detected Counts ===")
print(f"🧍‍♂️ 人の数: {num_humans}")
print(f"🐱 猫の数: {num_cats}")

# ========================================
# STEP 5: 頭数Aと足数Bを計算 / Compute A and B
# ========================================
A = num_humans + num_cats
B = 2 * num_humans + 4 * num_cats

print("\n=== 入力 / Input ===")
print(f"合計の頭数 A = {A}")
print(f"合計の足の数 B = {B}")

# ========================================
# STEP 6: 連立方程式で検算 / Verification with equations
# ========================================
import numpy as np
x, y = np.linalg.solve(np.array([[1, 1], [2, 4]]), np.array([A, B]))

print("\n=== 検算による解 / Solved by equations ===")
print(f"人の数 (x) = {x}")
print(f"猫の数 (y) = {y}")
print(f"x + y = {x + y} → {'OK' if np.isclose(x + y, A) else 'NG'}")
print(f"2x + 4y = {2*x + 4*y} → {'OK' if np.isclose(2*x + 4*y, B) else 'NG'}")

# ========================================
# STEP 7: 面積法による考察 / Area-based reasoning
# ========================================
area_all_cats = 4 * A
diff = area_all_cats - B
num_humans_area = diff / 2
num_cats_area = A - num_humans_area

print("\n=== 面積法の結果 / Area-based reasoning ===")
print(f"人の数 = {num_humans_area}")
print(f"猫の数 = {num_cats_area}")

# ========================================
# STEP 8: グラフ描画とダウンロード / Plot area and download
# ========================================
import matplotlib.pyplot as plt

x = int(round(x))
y = int(round(y))

if x == 0 and y == 0:
    print(" 人も猫も検出されていません。グラフ描画をスキップします。")
else:
    plt.figure(figsize=(8, 6))

    # 猫の領域
    cat_area = [(0, 0), (y, 0), (y, 4), (0, 4)]
    plt.fill(*zip(*cat_area), color='#8B4513', alpha=0.6, label='Cat Area (4 legs each)')

    # 人の領域
    human_area = [(y, 0), (x + y, 0), (x + y, 2), (y, 2)]
    plt.fill(*zip(*human_area), color='#FFDAB9', edgecolor='black', label='Human Area (2 legs each)')

    # 点と座標
    for point in cat_area + human_area:
        plt.scatter(*point, color='black')
        plt.text(point[0], point[1], f'({int(point[0])}, {int(point[1])})',
                 fontsize=9, ha='right', va='bottom')

    # 軸と表示
    plt.xlabel('Number of Beings')
    plt.ylabel('Number of Legs')
    plt.title('Human and Cat Area Diagram')
    plt.legend()
    plt.grid(True)
    plt.xlim(-1, max(5, x + y + 2))
    plt.ylim(-1, 6)

    # 保存と表示
    plt.savefig("area_diagram.png")
    plt.show()
    files.download("area_diagram.png")
```
# 結果

使った写真
![ダウンロード.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043781/80796dab-4fbd-4b5c-ac44-37e5f973eef2.jpeg)




以下、出力結果
![ダウンロード (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043781/c03c9a25-9806-4f2e-8c8a-06a69935628f.jpeg)



![area_diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043781/0e53e20f-41c1-4b07-a500-1042dacdbe2b.png)


== 検出結果 / Detected Counts ===
🧍‍♂️ 人の数: 2
🐱 猫の数: 1

=== 入力 / Input ===
合計の頭数 A = 3
合計の足の数 B = 8

=== 検算による解 / Solved by equations ===
人の数 (x) = 2.0
猫の数 (y) = 1.0
x + y = 3.0 → OK
2x + 4y = 8.0 → OK

全員が猫だった場合の足数 = 4 × 3 = 12
猫だけだった場合との差 = 12 - 8 = 4
2足ずつ減らせば人に一致 → 差 ÷ (4 - 2) = 4 ÷ 2 = 2.0
猫の数 = 総頭数 3 - 人の数 2.0 = 1.0

=== 面積法の結果 / Area-based reasoning ===
人の数 = 2.0
猫の数 = 1.0


YOLOによる画像処理技術を活用することで、画像内の人物と猫を自動的に検出し、それぞれの数をカウントすることが可能となりました。使用したコードについては、生成AIを活用するなどして自主的に学習し、理解を深めていくことをおすすめします。

##  今後の展望
 1. ファインチューニングによる高精度な「つる」と「かめ」の画像認識
人・猫の代わりに「つる」と「かめ」を対象にYOLOv5をファインチューニング。

独自に収集・整備した「つる」と「かめ」の画像データにラベル付け（アノテーション）を施すことで、つるかめ算に特化した物体検出AIモデルの構築を目指す。

教材・教育用だけでなく、観光施設や動物園での応用も期待。


2.CMOSイメージセンサー × エッジAIによるリアルタイム処理
小型・高性能なCMOSイメージセンサーを活用し、エッジデバイス上でリアルタイムに「つる」と「かめ」の検出・分類・計数が可能に。

クラウド処理不要で、低遅延・高効率なスマート教育ツールやIoT動物観察装置などに応用。
 参考動画（CMOS・イメージセンサー技術）  
- https://www.youtube.com/watch?v=KlagPoKbOpI  
- https://www.youtube.com/watch?v=9WBp3s3_t5s  
- https://www.youtube.com/watch?v=_w9kH8-I6jk


「（ネタです。正式な予定はまだ決まっていません）」