忍者ブログ

設備のマニアどっとこむ

設備、電子工作、DIYのブログ!

08/12

Sun

2018

OpenCV で分類器を作成する (ラズパイ、一部Win10)

OpenCVも多少慣れてきたので、次のステップに移ろうと思って分類器作成に取り組んだものの、お盆休みにがっつりハマってしまった。

日本語、英語ともにググればかなり参考文献が出てくるから大丈夫と思っていたが、甘かった…


分類器は、画像処理をやるにあたり、判別するために使用するxmlファイルで、かなりサンプルがなければ難しいらしい。1000枚近く画像ファイルをもっているのは娘の写真くらいなので娘の顔を判別するファイルを作ることにした。

まずは画像にワクをつくるところから




objectmakerというフリーソフトで写真をワクで囲むと表をテキストで出力するというとても便利なソフトです。100枚くらいならいいのですが、1000枚やると病んできます笑

↓このサイトを参考にしました
http://d.hatena.ne.jp/takmin/20100930/1285848450


↓解像度が大きい画像の場合は一気に縮小するソフトも使います。
https://www.vector.co.jp/download/file/win95/art/fh690609.html


これで学習させる正常画像とそのリストができました。


続いてまったく関係ないNG画像も集め、テキストでリストも作ります。

ここまでWin10で作成しUSBメモリーでラズパイに移しました。

ラズパイで動かす場合、画像の格納場所などフォルダ体系に注意が必要です。



自分はhomeのpiにOpenCVをインストールし保存していますが、/home/pi/Build/binのなかの
OpenCV~関係のファイルをコピーして新規に作成したフォルダにもっていきます。


新規フォルダーーー正常画像フォルダーー判別したい画像
       |
       |
       --NG画像フォルダーー関係のない画像
       |
       |
       --正常画像リスト.txtかdat(objectmakerで作成)
       |
       |
       --NG画像リスト.txt
       |   
       |
       --分類器フォルダーーtraincascadeでxmlが作成される
       |
       |
       --/home/pi/Build/bin/opencv関係ファイル
       | 
       |
       --vecファイル createsample実施時に作成される。

まずは正常画像リストを確認します。objectmakeで作成しても最初の何行目かは消した方がエラーが出にくいと思われます。正常画像フォルダ/ファイル名 ワクの数 座標というテキストになっているはずです。パスを確認して下さい。

取り急ぎ学習データであるvecファイルを作るには判別したい画像、正常画像リスト、/home/pi/Build/bin/opencv関係ファイルがあればOKです。

まずはコマンドプロンプトで移動 
cd 新規フォルダ

続いてreatesampleのコマンドです。

opencv_createsample -info 正常画像リスト.txt  -vec vecファイル名.vec -num 正常画像数
-bg NG画像リスト.txt  -show -w24 -h24

-w24 -h24はvecファイルの大きさです。分類器ファイルを作成する際に合わせる必要があります。 -show をつけるとサンプル画像が表示されます。ワクで切り抜かれた画像が出てくれば成功です。ちなみに失敗するとvecファイルがえらい軽くなります。
学習結果で-imgがnullになっていますが -infoでリストと紐づいて実行しているので気にしなくてOKです。

続いてxmlファイルを作成していくのですがその前にNG画像リストのチェックです。
Windowsで改行するとエラーが出てきます。

Image reader can not be created.....

自分はとりあえずリストを1行だけにして確認しました。(改行が原因だとエラーが出ない)
テキストをラズパイで作り直したら復旧しました。

あとは勇気をだして下記コマンドを入力


opencv_traincascade -data 分類器フォルダ名 -vec vecファイル名.vec -bg NG画像リスト.txt 
-numPos 正常画像数×0.9ぐらい -numNeg NG画像数 -mode all  -w24 -h24

NG画像数はそのまま数を入力すればいいのですが、正常画像はそのまま入れると


Bad argument (Can not get new positive sample. The most possible reason is insufficient count of samples in given vec-file.)








こんなエラーが出てきます。正常の画像に0.9くらいかけた数にしておけば解消する(はず)です。


成功すると下記の様な表示がしばらく繰り返されたら成功です。

ーーーーーーーーーーーーーーーーーーーーーー
|                           |                            |                    |
|      FA                 |    HR                   |     N            |
|                           |                            |                    |
|                           |                            |                    |
|                           |                            |                    |

 
完了すると分類器フォルダにcascade.xmlという分類器が作成されるのでこの記事あるコードの分類器パスを変更すればOKです。(赤字の部分)
 cascade_path = "haarcascade_frontalface_alt.xml"

分類器が作成されても精度?が悪すぎるとカメラ画像が呼び出せなかったり、フリーズしたりするのでその場合はcreatesampleからやり直したり、NGファイルを増やしたりといろいろ試してください。

とりあえず相当苦労しましたが、娘を判別することができたので感無量でした。
いろいろな文献ありますが、微妙に古い記事だとOpenCVのバージョンが違ったりして参考にならなかったりします。今回はver3.1.0にて動作させています。あまり内容は理解していませんが(オイ)、参考になればまたOpenCV関連の記事を書いていこうと思います。









拍手[0回]

PR

07/21

Sat

2018

raspberry pi×Open CVで庭に来る猫対策

マンション一階に住んでいるのだが、庭に猫がときどき入ってくる時がある。 通りすぎるくらいならいいのだが、奥さんが育てているコケを荒らしたり、糞をしたり結構やりたい放題。

こんな猫よけグッズはあるのだが全然効果なし。(慣れちゃったのか?)

近くを通ると耳がキーンってする


退治するまではいかないまでも、どの時間帯にに来るのかぐらいは調べてみることにした。
といってもずっと見ているわけにはいかないのでラズパイでOpenCVを動かして、反応した時だけ写真をとってみます。

まずはこの記事など見てもらってラズパイにOpenCVインストール済みということで… 

インストールがうまくできたらこのようなコードを書きます。
# -*- coding: utf-8 -*-
import sys
import cv2  
import time
if _name_ == '_main_':
    try:
      
        cascade_path = "/home/pi/opencv-3.1.0/data/haarcascades/cascade.xml"
        cascade = cv2.CascadeClassifier(cascade_path)
        capture = cv2.VideoCapture(0)
        if capture.isOpened() is False:
            raise IOError("VideoCapture could not open.")
       
        while True:
           
            ret, image = capture.read()
            if ret == False:
                continue
           
            facerect = cascade.detectMultiScale(image, scaleFactor=1.2, minNeighbors=2, minSize=(10, 10))
           
            color = (255, 255, 255)     
            for rect in facerect:
                cv2.rectangle(image, tuple(rect[0:2]),tuple(rect[0:2] + rect[2:4]), color, thickness=2)
                
                time.sleep(1)
                
                cv2.imwrite("img.png", image);
                break
            
            cv2.imshow("FaceDetection", image)
            #wait[ms]
            cv2.waitKey(1)
    except KeyboardInterrupt  :         
        print("\nCtl+C")
    except Exception as e:
        print(str(e))                   
    finally:
        capture.release()              
        cv2.destroyAllWindows()         
        for i in range (1,5):
            cv2.waitKey(10)             
        print("\nexit program")         
    

ここで顔認識と違うのは画像処理を行う判別ファイルが違います。
猫用なんてあるの? って思うかもしれませんが、ここにあります。
保存したら、パスを入れ替えてください。
 cascade_path = "/home/pi/opencv-3.1.0/data/haarcascades/cascade.xml"

あとは猫を認識したときに画像を保存します。ファイル名は適当です。
cv2.imwrite("img.png", image);
                
これでとりあえず、猫を画像検索したタブレットでテスト


に、認識してる気がする…

ホントは電磁弁とかと連動させて水でもかけたいとこだけどかわいそうなのでやめときます…

とりあえずリフォーム終わったら仕掛けてみます!!








拍手[0回]

07/14

Sat

2018

仮想通貨マイニングでラズパイ3Bと3B+を比較する

先日ラズパイ3B+を購入したのでなんとか3Bとの性能の差を定量的に比較したいと日々もがいていました。

今回思いついたのがマイニング。仮想通貨を採掘してみて、3Bと3B+で性能の差が出るはずと思ってやってみました。

掘るのはモナコイン、このサイトを参考にしてやってみました。 ※意外と簡単です。

sudo apt -y install git


git clone https://github.com/tpruvot/cpuminer-multi.git


sudo apt install automake g++ libcurl4-nss-dev libjansson-dev libssl-dev


cd cpuminer-multi/


./build.sh


確認ためのコマンドを打ちます
 ls -l cpuminer
-rwxr-xr-x 1 pi pi 1231124 10月 19 00:49 cpuminerみたいなものが出ればビルドできています

次にマイニングプールに登録します
今回はvip poolに登録しました。
メールアドレスさえあれば登録できます。






登録できたら続いてワークを作成します

ここでのワークの名前とパスワードをメモっておきます。

続いてラズパイに戻って、
cd cpuminer-multi/
ここのディレクトリの状態で下記のコマンドを打ちます。メモしたワーカー名、パスワードを入れて下さい。
./cpuminer -a lyra2rev2 -o stratum+tcp://vippool.net:8888 -u アカウント名.ワーカー名 -p ワーカーのパスワード


うまくいけばワーカーが動作し、採掘能力が表示されます。
ちなみに3B+が上で3Bが下です。 若干3B+のほうが上回っていますが、時々逆転します。
3B+のほうが性能がいいと… 言えるのか… うーん。

ワーカーが動きましたがこのままでは採掘されたモナコインを使えません。
ウォレットを登録する必要があります。

いろいろありますがアプリではもにゃがおススメかと
受け取りのところからこのようなアドレスをコピーしてください。
MTyM9sGMbcJv5MkDSPXSAiepEaDxDmtKpe

それをvippoolで設定すれば自動で受け取ることができます。
アカウントの編集から払い先アドレスを設定します。

これでOK。 
最低0.5モナコインでウォレットで受け取れます。
が… ラズパイ3B+、3Bを丸一日マイニングさせた結果…


0.000293モナコイン!!!
1コインが240円程度なので0.07円ですね、1円いきません。
生活できませんね笑

今回、性能の比較ははっきりしませんでしたが、3B+を買って3Bを持て余している人はマイニングをさせとくのいいかもしれません。ただ…まったく稼げませんが…







拍手[1回]

07/07

Sat

2018

raspberry piで自走式監視カメラ

Raspberry pi 3B+を買って初めての作品。カメラをリモートデスクトップで見ながらサーボモーターで動かしてみた。



3Dプリンターで作成した土台にサーボモーター2台とカメラ、ラズパイにモバイルバッテリーを搭載してます。

↑これが土台 

サーボモーターは360°タイプを使用、ラズパイの17ピンと18ピンと接続した。



メラアプリとしてはguvcviewを使用しました。※インストールその他はこの記事参照おねがいします

画像のタイムラグはありますが 3B+になって動きがきびきびした気がします。


左側のボタンはtkinterで作成しました。
↓こんな感じです。
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
from tkinter import *
tk = Tk()
gp_out = 17
gp_out2 = 18
GPIO.setup(gp_out, GPIO.OUT)
GPIO.setup(gp_out2, GPIO.OUT)
servo = GPIO.PWM(gp_out, 50)
servo2 = GPIO.PWM(gp_out2, 50)
servo.start(0.0)
servo2.start(0.0)
    
def hello():
    servo.ChangeDutyCycle(1.5)
    servo2.ChangeDutyCycle(1.5)
        
def hello2():
  servo.ChangeDutyCycle(12.5)
    servo2.ChangeDutyCycle(12.5)
      
def hello3():
    servo.stop(0.0)
    servo2.stop(0.0)
    servo.start(0.0)
    servo2.start(0.0)
    
def hello4():
    servo2.ChangeDutyCycle(12.5)
    servo.ChangeDutyCycle(1.5)
     
def hello5():
    servo2.ChangeDutyCycle(1.5)
    servo.ChangeDutyCycle(12.5)
       
btn =Button(tk, text="←", command=hello)
btn.pack()
btn =Button(tk, text="→", command=hello2)
btn.pack()
btn =Button(tk, text="■", command=hello3)
btn.pack()
btn =Button(tk, text="↑", command=hello4)
btn.pack()
btn =Button(tk, text="↓", command=hello5)
btn.pack()

ボタンで前後、左右のサーボモーターを動かします。
リモートデスクトップでやるとほとんどラジコンですね・・。
androidタブレットでもXrdpを入れると動かすことができます。

まだまだ3B+が”買い”ですとは言えませんが、今後も性能の違いを確かめていきたいと思います!!





拍手[0回]

07/01

Sun

2018

raspberry pi 3B+ を買ってみた話




ついに噂のraspberry pi3 B+を手に入れた。




技適問題があったので購入をためらっていたが通ったそうなので思いきって買ってみた。



↑ケースに貼られている技適マーク

見た目には素子のレイアウトが少し変わったかな?という印象。ラズパイ3B用のケースも問題なく使い回せるのでサイズは変わらないみたい。


電源まわりも3Bと同じものでOK



POEが追加されたり通信がギガビット対応だったりと変更点はいろいろあるが使い勝手としてはCPUが1.2→1.4MHzになったのが大きいと思う。

↓ここまま行くと愛用のASUSノートPCスペックを越されてしまう気がする。(1.8Ghzしかない涙)





今まで3B使っていたマイクロSDカードを使用しようと思ったがさすがにそれは無理だったのでラズビアンをここでダウンロードしてインストールし直した。フォーマットするのが嫌ならば3B+用に買うのもおススメ。


気持ちサクサク動く気がするが、一番実感できたのがリモートデスクトップでgucviewやopenCVを動かすと3Bでは固まってしまっていたが3B+ではちゃんと動いた事でした。




これで動画見ながらからサーボモーターの制御とかいろいろ出来そうな気がします。その他はいまのところ使ってみた感じは変わらず。用途によっては3Bで全然問題ないかも。


↑買ったのはコレ









拍手[0回]

翻訳(Translate)

AD

シェアしてね

プロフィール

HN:
アルティメット雅史
性別:
男性
自己紹介:
製油所、データセンター、化学工場を渡り歩いた設備のマニア
最近はarduino,Raspberry piyear等の電子工作にハマる。
取得資格は電験3種、消防設備士甲4、2級ボイラー技士、危険物乙4、電工2種、技術士補(電気・電子)、エネ電、フォークリフトほか

カウンター

お問い合わせ

忍者アクセスランキング

Copyright © 設備のマニアどっとこむ : All rights reserved

TemplateDesign by KARMA7

忍者ブログ [PR]