ラベル Deep Learning の投稿を表示しています。 すべての投稿を表示
ラベル Deep Learning の投稿を表示しています。 すべての投稿を表示

2022年5月16日月曜日

PiCar-Xでlane detection(06) 取得した道路情報から位置情報の計算

 「PiCar-Xでlane detection(02) 自動運転のための車線検出」で下図のように車線を検出することが出来ました。今回はここから車の進むべき方向を決める、道路の真ん中=道路の向きの中心を求める方法について考えてみます。


一般的にはここから左側の複数の線分(赤い領域)の平均を取って左車線、同じく右側の複数の線分(青い領域)の平均を取って右車線を求めて、その両線の中央値を計算して道路の中央を求めます。


ただ、これが意外とややっこしい(-.-;)

真ん中から左の線分を左車線、同じく右側の線分を右車線としたいところですが、例えば下の写真のように必ずしも車は常に道路の中央からPiCameraで写真を撮っているわけではなく、カーブなどでは右に左にステアリングをとっているので、道路に対して斜めからの写真も多くなります。下の図のように片方の車線が画面からはみ出しそうになることも再々です。


この場合、右側車線の上端も写真中央から左側に位置しており、真ん中で左右を分けようとすると全て左側車線と判断されてします。または、道路は上図のように「ハの字」に映っているから、右に傾いている線分を左側車線、左に傾いている線分を右側車線と考えたい所ですが、カーブなどではすべて右に傾いたり、全て左に傾いたりすることも良くあります。
とにかく左側車線と右側車線の区分をすることが出来ず、どのように左右を分けたら良いのか悩むところです。

そこで参考とした資料で行っていた左右の車線を検出することを諦めて、「PiCar-Xでlane detection(01)」では道路の中央に黄色い線を追加し、この黄色い線を追随するようプログラムに変更しました。

以下「PiCar-Xでlane detection(01)」に掲載したプログラムに沿って、今までの説明と話がダブってしまいますが、その動きを見てみたいと思います。デモ画像として「PiCar-Xでlane detection(01)」で走らせたモデルコースと同じ配色の

を使って、処理の流れを見ていきます。

1.PiCameraから画像の取り込み

「PiCar-Xでlane detection(04) PiCameraから画像の取り込み」で説明したように、imutilsのVideoStreamを使って動画撮影➡画像の切取りを行っています。

# 画像の高さ 幅を取得
Image_height, Image_width, c = image.shape

    Image_height:  480
    Image_width:  640


2.オリジナル画像から作業領域をクロップ

cropped_image = image[int(Image_height / 2):int(Image_height / 2 + 100), 0:int(Image_width)]

画像の高さは、中央から下へ幅100pix、横幅は画像の幅そのままでクロップ


3.画像をBGRからHSVへ変換

hsv_image = cv2.cvtColor(cropped_image, cv2.COLOR_BGR2HSV)


4.OpenCV – inRangeで画像を2値化

lower = np.array([20, 0, 0])
upper = np.array([40, 255, 255])
masked_image = cv2.inRange(hsv_image, lower, upper)


5.OpenCV – cannyによるエッジ検出

canny_conversion = cv2.Canny(masked_image, 50, 155)


6.region of interest(注目する領域)を設定

ROI_image = reg_of_interest(canny_conversion)

見た目は変化ありませんが、「PiCar-Xでlane detection(05) PiCameraで撮影した画像の切り取りについて」で説明したように左右を台形状にカットしています。


7.OpenCV – HoughLinesPによる直線の検出

Hough_lines = cv2.HoughLinesP(ROI_image, 2, np.pi / 180, 50, np.array([]), minLineLength=20, maxLineGap=20)

# Hough_linesをcropped_imageと同じ大きさの黒色のキャンパスに描画
lanelines_image = show_lines(cropped_image, Hough_lines)


【それに続く処理】

黄色い線の左右両端を検出しているので、この例では左右2本の線分が検出されています。ただこの例でも左側がやや短く検出されています。また撮影条件によっては線分が途中で途切れたりして2本以上の線分として検出されるケースもあります。このブログページの最初の画像がそのよい例だと思います。
これらの複数の線分から左端・右端の線分を求めます。

left_right_lines = line_select(lanelines_image, Hough_lines)

# left-right_linesをcropped_imageと同じ大きさの黒色のキャンパスに描画
line_image = show_lines_result(cropped_image, left_right_lines)


# 上のline_imageとcropped_imageとを合成
combine_image = cv2.addWeighted(cropped_image, 0.8, line_image, 1, 1)



left_right_linesの中身は、

    array([[313, 100, 307,   0], 
              [341, 100, 335,   0]])

2本の線分のデータとなっています。


プログラムでは、最終的に上のcombine_imageに左右両線の上端の数値データを付け加えた画像を保存しています。



line_select関数で、Hough変換で得られた複数の線分の一番左の線分と一番右側の線分を取得していますが、それ以外にも
●垂直な線分はmake_coordinates関数の計算でエラーとなるので、作為的に2pixをプラスしている
●線分の下端位置が30pixに満たない線分は、イレギュラーなデータとして除く
といった処理も行っています。


このleft_right_linesのデータを使って、左右両線分の上端の平均(道路の中央)を求め、この平均(道路の中央)が画面の中央値(Image_width/2)に位置するように舵を切ります。

# left_line_top
left_line_top = left_right_lines[0, 2]

# right_line_top
right_line_top = left_right_lines[1, 2]

center_line = (left_line_top + right_line_top) / 2

# image_center
image_center = Image_width / 2

# -----------------------------------------------------------------------------
# steer
steer = (center_line - image_center) / image_center * 80
sterrは、  
px.set_dir_servo_angle(steer)で使う前輪を何度回転させるかの数値で、  
steer=(center_line-image_center)/image_center×80  
の式で画面の中央から大きくズレているときは大きく、ズレが小さいときは小さく舵を切るように制御しています。
上の式の「80」は、実際に動かしながら試行錯誤で求めた(ハイパー)パラメーターで、モデル条件が変われば改めて試行錯誤で最適解を求め直す必要があります。

2022年4月23日土曜日

PiCar-Xでlane detection(04) PiCameraから画像の取り込み

 今回は、手順1番目のPiCameraから画像の取り込みについてです。

1.PiCameraから画像の取り込み

2.オリジナル画像から作業領域をクロップ

3.画像をBGRからHSVへ変換

4.OpenCV – inRangeで画像を2値化

5.OpenCV – cannyによるエッジ検出

6.region of interest(注目する領域)を設定

7.OpenCV – HoughLinesPによる直線の検出


一般的にpythonからPicameraを制御するためにはpicameraパッケージを使います。

【プログラム例】

import time
import picamera

# 写真の保存場所
CAM_DIR = "/home/pi/picar-x/Picamera/"

with picamera.PiCamera() as camera:


 while True:
   try:
     camera.resolution = (640, 480)     
     camera.start_preview()
     time.sleep(2)
     filename = time.strftime("%Y%m%d%H%M%S") + ".jpg"
     save_dir_filename = CAM_DIR + filename
     camera.capture(save_dir_filename)
   except KeyboardInterrupt:
     print("Ctrl+Cで停止しました")
     break
しかしここでは、画像・動画に関する処理機能をまとめたOpenCVライブラリと、画像処理ユーティリティーのimutilsモジュールをそれぞれインストールして使いました。

pip install opencv-contrib-python
pip install imutils

【プログラム例】
import cv2
import time
from imutils.video import VideoStream
from imutils import resize

# 写真の保存場所
CAM_DIR = "/home/pi/picar-x/Picamera/"

vs = VideoStream(src=0).start()

while True:
    try:
       # ファイルの取込
       img = vs.read()
       image = resize(img, width=640)

        
       filename = time.strftime("%Y%m%d%H%M%S") + ".jpg"
       save_dir_filename = CAM_DIR + filename
       cv2.imwrite(save_dir_filename,image)

    except KeyboardInterrupt:
      print("Ctrl+Cで停止しました")
      break

2021年12月5日日曜日

Image Classificationにおける元画像の大きさと精度(accuracy)との関係について

今までもPyTorchやfast.aiを使ってImage Classificationを行ってきました。

1つ気になったのが、trainingに使う画像が大きいと、それだけデータ量も多いのだから精度も良くなるのではと言う単純な思いです。そこで確認してみました。

テストの条件は、

・データセットはcifar-10。cifar-10はライブラリーにもありますが、ここでは一度cifar-10をpng形式の画像データに変換したものを使いました。

・fast.aiを使ってresnet18でfine-tuningする。

・DataLoaderは簡単に下記のようにしました。この設定を取敢えずnormal設定とします。
画像サイズは、元の32,64,96,128,224の7種類で検証

 dls=ImageDataLoaders.from_folder(
     path, 
     train='train',
     valid='val',
     bs = 64,
     item_tfms=Resize(160), ⇒ここでサイズを32~224に変更する
     batch_tfms=aug_transforms(),
     seed=123
)

cifar10の32pixのデータ画像



【結果】

32pixの例
epochtrain_lossvalid_lossaccuracytime
01.1776621.0656850.62360001:40
10.9391810.8558660.70190001:42
20.8141380.7357280.74920001:42
30.7176460.6443040.78090001:41
40.6269320.6063300.79260001:42
50.6031020.5930750.80050001:42
60.5150810.5544300.81100001:42
70.4881680.5541700.81190001:43
80.4398750.5499190.81670001:43
90.4493610.5468510.81690001:44




























32~224pixでtrainingした結果は次の通りでした。

Image sizenormalp設定のaccuracy
320.8169
640.8983
960.9334
1280.9435
1600.9483
2240.9483








●当初予想したように画像サイズが大きくなればaccuracyも高まることが確認されました。
ただそれもサイズが128pix以上ではほぼフラットになっています。

2019年12月4日水曜日

Ubuntu環境の構築(追記)

2018年9月25日の投稿で、Ubuntu環境の構築について書きました。
Ubuntuを使っていると、素人の私では解決できないようなエラーがよく出てくるようになったので、再インストールしました。
その際に以前の投稿の内容と食い違っていた部分があったので追記しておきます。もしかすると以前からそうであったのに気づかずわざわざややこしくしていたのかも知れませんが・・・

修正したいのは「NVIDIAドライバーとCUDAのインストール」の部分です。
いま、

  • NVIDIA Driver 440.26
  • CUDA Version 10.2

で稼働してますが、cuDNNもダウンロードページから

  • libcudnn7_7.6.5.32-1+cuda10.2_amd64.deb
  • libcudnn7-dev_7.6.5.32-1+cuda10.2_amd64.deb
  • libcudnn7-doc_7.6.5.32-1+cuda10.2_amd64.deb
のCUDA10.2用の3つのファイルをダウンロードし、端末から

sudo dpkg -i libcudnn7_7.6.5.32-1+cuda10.2_amd64.deb

以下2つのファイルも同様にインストールすればそれで終わりです。
ファイルをコピーするなどの操作なしで、正常に動いています。動いているはずです。

実はついでにパソコンのBIOSをアップデートしたのですが、UEFIセキュアブートとやらでロックが掛かっていてUbuntuのシステム関連のアップデートにチョツト躓いたのでそれに関しては改めて・・・

2019年11月10日日曜日

ディープラーニングを行うためのフレームワーク


前回の投稿からかなり日が空いてしまいました。サボっていたわけではありません。投稿はサボってしまいました。
またしばらく投稿できそうです。以前の記事も現状と合わなくなってきている部分もあるようです。

ディープラーニングを行うためのフレームワークは、

・TensorFlow
・Chainer
・PyTorch
・MXNet
・・・
など、幾つかあります。

Google Trendで見てみると、TensorFlowの人気はダントツのようですが、近年PyTorchの人気も急上昇してきています。(直近の4年間のデータ)
あまり正確とは言えませんが、トレンドは分かるでしょう。


新しい物好きで、少々あまのじゃくな私は、PyTorchを選ぶことにしました。

TensorFlowにはKeras、PyTorchにはfast.aiかな
TensorFlowなどのフレームワーク上で、より簡単にプログラムするのに便利な、Kerasという上位ライブラリーがあります。
(実際はあまり触ったことがないので実感として分かりません(^o^))

Pytorchにもfast.aiというライブラリーがあります。以前はKerasのようにtensorFlowに対応していたようですが、現在はPytorchに対応しています。

これからは、PyTorch+fast.aiで、deep learningの触りの部分だけでも行えたらとおもいます。

2018年11月25日日曜日

ソニーがGUIのNeural Network Consoleを作ってた

ソニーがGUIのNeural Network Consoleを作ってます。
みなさん既にご存知か。(*^^*)
機械学習が素人の私としたは何をしているのかチンプンカンプンな所も多いのですが、それぞれの操作の効果(レイヤーの働き)がどのようなものなのか、たちどころに実感できるので最高です。


1.定番のMNISTデータを試してみた
とりあえず下記プロジェクトで試してみました。何かの本のPythonプログラムを元に書き換えたのかな?
忘れてしまいました。
とにかくレゴのMindStormsの様にブロックを組合せることで出来上がりです。

活性化関数はTanhではなくReLUを使うべきですかね?




何も難しいことをせずともAccuracy:0.99ならマズマズですか。




2018年9月25日火曜日

初めてのUbuntuで機械学習を行える環境の構築に挑戦




会社ではWindows10を、プライベートではWindows10とMacを使っています。
最近Machine Learningが話題になっています。
一度自分でも試してみようと思いましたが、Windows環境はあまり薦められない、出来ればLinuxでの環境を薦めるとの記事が多くありました。
Machine Learningがどんなものか?、実際にプログラムを動かしてみるのが一番です。

そこで、

1.Ubuntuのインストール
2.NVIDIAドライバーとCUDAのインストール
3.TensorFlowのインストール

の手順を自分自身への備忘録として残しておきます。なにせ60歳過ぎのジジイですので・・・。


1.Ubuntuのインストール

Machine Learningの本や記事を見るとUbuntu16.04ですが、今年2018年5月にVer18.04がリリースされました。

LinuxのライブUSB作成方法は、色々と紹介さていますが、私はここのブロクを参考にして上手くいきました。



1.1▶Ubuntuのダウンロード
UbuntuをインストールするためのISOファイルは公式サイトからダウンロードします。




現在の最新版は「ubuntu-ja-18.04.1-desktop-amd64」です。

1.2▶Ubuntuのインストール用USBメディアの作成
Ubuntuをインストールするには、ISOイメージファイルを用いてインストールメディアを作成する必要があります。
私はUSBメディアを作成しました。
インストールメディアを作成するためにフリーソフトの「Rufus」を使います。
RufusはWebサイトからダウンロードします。



Rufusの設定画面の「パーティション構成」でMBR BIOSかUEFIを選ぶ箇所がありますが、最近のパソコンであれば'GPT'を選択してUEFIを選んでおいてよいと思います。
私のバソコンもかなり以前に自作したものですが、MBR BIOS(レガシーBIOS)ではありません。
ファイルシステムは'FAT32'を選択しました。
これでスタートを押すとその後いくつかのPOP画面が出てきますが、インストールメディアの出来上がりです。

1.3▶パソコンの起動ディスクの変更
パソコンにはHDDが複数搭載されていたり、DVDドライブがあったりしますが、起動したときにどのHDD、DVDドライブからシステムファイルを読み込んで立ち上がるのが、BIOSで順番が設定されています。
パソコンを起動したときに、1.2で作成したUSBインストールメディアから立ち上がるようにBIOSの設定を変更しなければなりません。
1.パソコンを起動した時に一瞬BIOS画面が表示されます。
2.BIOS画面が表示されると同時に、私のパソコンでは'Delキー'(パソコンによりF2キーであったり様々)を押す。
3.するとBIOS設定画面が現れますので、起動ドライブの順序変更セクションでUSBが順序で一番になるように変更してください。
※この作業はUSBを挿入した状態で実施してください。


1.4▶Ubuntuのインストール
1.2のRufusの設定画面の「パーティション構成」で'MBR'か'GPT'かでUSBが起動後の設定画面は異なります。
どちらにしてもUbuntuインストールを選択し、実行してください。


2.NVIDIAドライバーとCUDAのインストール
2019/12/04に追加の修正記事

HDDにUbuntuがインストール出来たので、続いてNvidiaドライバー、CUDA,ccDNNをインストールします。
ちなみに私のグラフィックボードは「GeForce GTX 760」でかなり古いものです。
こんな古いGPUで効果があるのか(*^^*)

CUDA、ccDNNのインストール方法はWebに色々と載っていますが、私はこのページを参考に上手く出来ました。


2.1▶Navidiaドライバーのインストール
必要か良く分かりませんが、下記コマンドで一発インストール出来るようです。

$ sudo ubuntu-drivers autoinstall

私の場合、これでインストールされるドライバーVerは340でした。

次の操作でNvidiaドライバーの390がインストールされるので上の操作が必要かどうか私には分かりません。

$ sudo apt install nvidia-cuda-toolkit nvidia-driver-390

これでドライバーVer: 390.48がインストールされます。

この状態でapt-get upgradeでパッケージをアップしようとしたら、保留に数件あると出ます。そのパッケージを更新すると他のパッケージが削除される時に保留になるので、保留の物をインストールするには以下のようにする。

 $ sudo apt-get dist-upgrade
  

2.2▶cuDNNのインストール
Nvidiaのホームページからメンバー登録を行ないcuDNNをダウンロード。
私がDLしたのは、cudnn-9.1-linux-x64-v7.1.tgzです。

cudnn-9.1-linux-x64-v7.1.tgzをダウンロードしたディレクトリーに移動(cd)し、

tar xzvf cudnn-8.0-linux-x64-v5.1.tgz ---①
sudo cp -a cuda/lib64/* /usr/lib/cuda/lib64/−−−②
sudo cp -a cuda/include/* /usr/lib/cuda/include/−−−③

①で解凍し、②③でファイルを指定フォルダーにコピーします。

3.anacondaのインストール
TensorFlowの導入には、pythonをanacondaでインストールすることで行ないました。
anacondaはダウンロードページから。
私がDLしたのは「Anaconda3-5.2.0-Linux-x86_64.sh」です。
詳細は以下を参考にしてください。


anacondaのインストールは、anacondaがダウンロードされたフォルダーに移動し、
ターミナルで下記コマンドを実行する。

bash Anaconda3-5.2.0-Linux-x86_64.sh

anacondaの起動はターミナルを開き

anaconda-navigator

CUDAの稼働状況を確認するためにはターミナルを開き

  watch -n1 "nvidia-smi"