教師あり学習で物体検出をしてみた

はじめに

「機械学習してみたいな~」と思い始めてから早3年。。。
なにもやっていなかったので、「機械学習で一つのアプリを作成し発表する」という内容の授業を受講しました。
大学院の授業は学部の授業に比べて単位を取りやすく、学んでみたいな~で受講して単位を取れるのが良いですよね。
当該講義は、流行りの画像認識やっただけでも大丈夫というスタンスで、本当にゼロからのスタートの私にとって、大変ありがたかったです。

さて、この授業で私は、物体検出(対象は「人」と「車」)を教師あり学習を用いて行ってみました。
流行りの自動運転に用いるための技術で、カメラから映像内に映し出された物体を検出し、その種類を判別するといったものです。
すごく基本的なことをしただけのアプリだったので、他の受講者の方のクオリティに圧倒されましたが、初めての機械学習を用いたアプリということで、自分では納得のいくものになりました。
今回の記事では、その簡単な流れを自分の備忘録として記録します。
*機械学習超初心者なので、表現等がたくさん間違っている思います。備忘録なので大目に見てもらえると幸いです。

今回、以下のように大きく3つのステップに分けて教師あり学習を行いました。
①Python「icrawler」のBing検索により画像データを収集
②「LabelImg」を用いて教師データを作成、データセットの格納
③「Google Colaboratory」において教師あり学習を実行
順を追って説明します。


画像データの収集

今回は教師あり学習を採用したので、機械学習どころかプログラミング初心者の私にとって、最初の関門は画像集めでした。
はじめは授業で扱われていたflickrを用いて画像集めをしてみました。
しかし、車が切れているなど良い写真が少ない!という印象を受けました。
そこでネットで良い方法はないかと模索していると、次のような記事を見つけました。
この記事を参考に、"Python「icrawler」のBing検索"を用いて画像集めをしてみました。
とても簡単に画像が集まってよかったです。
なお、集めた写真のうち、学習用100枚、評価用30枚の合計130枚を教師データとして採用しました。
実際に回したプログラムは以下の通りです。


# Bing用クローラーのモジュールをインポート
from icrawler.builtin import BingImageCrawler

# Bing用クローラーの生成
bing_crawler = BingImageCrawler(
    downloader_threads=4,           # ダウンローダーのスレッド数
    storage={'root_dir': 'person'}) # ダウンロード先のディレクトリ名

# クロール(キーワード検索による画像収集)の実行
bing_crawler.crawl(
    keyword="person",               # 検索キーワード(日本語もOK)
    max_num=150)                    # ダウンロードする画像の最大枚数

教師データの作成から格納まで

次に教師データの作成から格納までを説明したいと思います。
まず、集めた画像を「LabelImg」というアノテーションツールを用いて、画像をアノテーションすることで、教師データを作成しました。
また、教師データの所在等を示すためのyamlファイルを作成しました。
これらを下記の画像に示すとおりに格納して、データセット完了です。

#データセットのyamlファイル
train: ./data/dataset/train/images  #学習の画像のパス
val: ./data/dataset/valid/images    #検証用画像のパス

nc: 2 # クラスの数
names: [ 'person','car' ] # クラス名
データセット格納

学習の実施

データセットの格納ができたらいよいよ学習です。
今回は、物体検出の代表的なアルゴリズムの1つであるYOLOv7(特にYOLOv7x)を用いて、学習を行いました。
下記のサイトを参考に学習を行いました。
*下記サイトではエポック数を300としていますが、私は200としました。
学習の結果は以下の図の通りです。
しっかりと学習が進んでいることが分かります。
個人的な写真や動画で試してみても、精度は多少悪いですが、しっかりと物体検出を行えていることが分かりました。

学習の結果

まとめ

以上で、教師あり学習の一連の流れの説明を終わります。
個人的な備忘録なので、参考にならなくてすみません。。。

この記事が気に入ったらサポートをしてみませんか?