編集履歴一覧に戻る
toshiboxのアイコン画像

toshibox が 2021年02月27日11時00分08秒 に編集

システム詳細追加

本文の変更

**1  はじめに** 私は画像処理に興味があり、またかわいいペットのような物を作ってみたいと思い、顔を認識して追従するローバー を製作しました。 **2 使用したもの** ハードウェア ・Raspberry Pi 3 Model B ・Raspberry Pi 用 カメラモジュールケース付き ・モバイルバッテリー

-

・ビュートローバー H8(ヴィストン株式会社)

+

・ビュートローバー H8マイコン搭載(ヴィストン株式会社)(以下ローバー) ・単三乾電池

![キャプションを入力できます](https://camo.elchika.com/de708ef8ba3ef3fab1b13a30e2be5dfa136d4d39/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f37616433653961372d323739372d346266312d613130612d3865643939653638646461372f34346262653062622d623961392d343530332d386132632d313030373730396561383836/) ソフトウェア ・Raspbian ・OpenCV(画像処理ライブラリ ) **3 システム概要**

-

**3-1 システムイメージ図と実際の写真**

+

**3-1 回路** 本システムでは、ローバーとRaspberry Piの2つの機構にわかれます。 ローバー とRaspberry Piをシリアル通信させるため、 以下3つを接続します。 ・ローバー : TX - Raspberry Pi : Rx ・ローバー : RX - Raspberry Pi : Tx ・ローバー : GND - Raspberry Pi : GND また、Raspberry Piには専用コネクタにカメラモジュールを接続します。 ※本稿掲載の実際の写真には、Bluetoothモジュールが載っていますが、  本システムでは使用していません。 **3-2 システムイメージ図と実際の写真**

![キャプションを入力できます](https://camo.elchika.com/8da700459b8650b1f5645a9e4f3f9996a6e5e1b3/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f37616433653961372d323739372d346266312d613130612d3865643939653638646461372f33376432353562372d656563392d343132622d613936642d363639316635306430616430/) ![キャプションを入力できます](https://camo.elchika.com/771b21b4ab1a2694ea1717ccb30734839a7eb101/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f37616433653961372d323739372d346266312d613130612d3865643939653638646461372f38333062353136392d626131312d346533382d616534382d316465656331343837623831/)

-

**3-2 動作説明**

+

**3-3 動作説明**

①顔写真から顔認識用のモデルを生成。

-

 用意するモデルを増やすと、顔識別の計算に時間がかかり、  1サイクルの処理時間が伸びてしまいます。

②カメラから画像を取得 ③顔分類器(OpenCV公開のもの)で顔を検出

-

 OpenCVの公開している分類器を使用していますが、顔を少し傾けるだけで、  顔を検出されなくなってしまいます。

④顔を検出したら、①のモデルを用いて顔認識 ⑤モデルの顔と判定された場合、その顔の座標を元にモーターの制御値を決定。  画面を縦3x横4に分割し、顔が検出された座標によって12通りの制御値を設定します。  また、検出した顔のサイズを距離と見立てて、速度をあげたり、下げたりします。  ex, 検出した顔のサイズが小さい → 顔が遠くにある → 速度アップ

-

⑥モーター制御値等のデータをH8マイコンにシリアル送信。 ⑦H8マイコンは受信したデータを元にモーター制御し、受信データをRaspberry Piへ返す。

+

⑥モーター制御値等のデータをローバーにシリアル送信。 ⑦ローバーは受信したデータを元にモーター制御し、受信データをRaspberry Piへ返す。

⑧最後に、認識結果を載せた画像を表示する。 ※プライバシー保護のため顔を塗りつぶしています。 ![【認識結果】Label:認識した物, level:認識のスコア](https://camo.elchika.com/ba6e8aec968ff32095bd42513e76f5373a9c0435/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f37616433653961372d323739372d346266312d613130612d3865643939653638646461372f36346239303833312d383330352d346633612d613235382d626637613565343365353339/)

-

**4 実際の動き**

+

**4 システム詳細** 3-3 動作説明に沿って、プログラムを説明していきます。 ⓪ライブラリ類のインポート ```python from __future__ import print_function import serial import cv2 from picamera import PiCamera from picamera.array import PiRGBArray import numpy as np import time import os import argparse from logging import getLogger, StreamHandler, DEBUG, basicConfig, NullHandler, INFO ``` ①顔写真から顔認識用のモデルを生成。 ②カメラから画像を取得 ③顔分類器(OpenCV公開のもの)で顔を検出 ④顔を検出したら、①のモデルを用いて顔認識 ⑤モデルの顔と判定された場合、その顔の座標を元にモーターの制御値を決定。  画面を縦3x横4に分割し、顔が検出された座標によって12通りの制御値を設定します。  また、検出した顔のサイズを距離と見立てて、速度をあげたり、下げたりします。  ex, 検出した顔のサイズが小さい → 顔が遠くにある → 速度アップ ⑥モーター制御値等のデータをローバーにシリアル送信。 ⑦ローバーは受信したデータを元にモーター制御し、受信データをRaspberry Piへ返す。 ⑧最後に、認識結果を載せた画像を表示する。 **5 実際の動き**

動画があります、これを見てください! https://youtu.be/9kKUzTUUt_c

-

**5 課題とおまけ**

+

**6 課題とおまけ**

課題 ・顔検出用の分類器の精度に限界があり、顔を少しでも傾けると、検出しなくなります。 ・顔のモデルは複数読み込ませることができますが、モデルが増えると、  それぞれのモデルを顔認識処理にかけるため、時間がかかり、  リアルタイム性を失ってしまします。 上記2点を解決すべく、他のライブラリ をTensorflowを使用しましたが、 これも処理に時間がかかりリアルタイム性を失いました。 顔検出精度を上げることが課題になっています。 おまけーもしも試したい人のためにー 本稿では、H8マイコンを搭載したビュートローバー でモーターを制御しています。 H8マイコンは、-127〜128までの値を設定しての左右それぞれモーター制御してます。 そのため、Raspberry Pi からH8マイコンへは、左右のモーター値に加え、ノイズ対策のためのチェックサムとデータ送信の目印0xFFの計4Byteを送信している。 ビュートローバーの代わりに市販でよく出回っているArduinoなどのモーターキットを使用する場合、上記モーター値を使用するキットに適した値に変更して、シリアル接続したら代用できます。 ソース↓ https://github.com/toshibox/Face-Trace-Rover