自転車乗り入れ禁止区域に平然と自転車に乗って入ってくる人たちがいる。これをなんとか減らしたい、という理由で自転車に乗っている人を画像認識で見つけて警告を発するという仕組みをつくろうと思う。カウンターチームが停滞しているのでその間の勉強も兼ねて。
少し考えてみて難しそうだなと思ったのが、押している自転車や止まっている自転車に対しては警告が不要なので、「自転車に乗っている人」を見つけるモデルを作成しないといけないこと。できると思うが、いまはどうやって実現するのか見えていない。まず勉強。
- 「自転車に乗っている人」を検出するモデルをつくる
- カメラで画像を読み取り、フレーム中に「自転車に乗っている人」がいるかどうか判断
- いたら画像を保存し、音声を発する
- 音声発生中+一定時間(5秒くらい)は検出モデルはスリープにする
がんばるぞ。
仮サービス名はマナリ(Mannery)
まずはトレーニング・検証用の画像を集める
今回は「歩行者」、「自転車」、「自転車に乗っている人」を見分けるモデルを作成する。対象はそれぞれのフォルダに入れる。ファイル構成はこう。
(ファイル構成イメージ挿入予定)
画像収集
#!/usr/bin/python
# -*- coding: UTF8-*-
from icrawler.builtin import BingImageCrawler
crawler = BingImageCrawler(storage={'root_dir': 'img/riders'})
crawler.crawl(keyword='キーワード', max_num=800)
画像選別
その後、自転車を押している人、自転車のみのものとか、すべて削除する(手作業)
画像編集
選別した画像から、対象物を切り抜き(手作業)
トレーニング
まずはローカルでテスト
Anaconda Navigatorを起動する
ターミナルで仮想環境を起動する(今回使用する仮想環境名がtf2)
activate tf2
トレーニング
以前受けたAI学習講座で入手したトレーニングプログラムを使う。鍛えるベースのモデルは”imagenet”
from tensorflow.keras.preprocessing import image
import numpy as np
import os
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import *
#from tensorflow.keras.layers.core import *
from tensorflow.keras import optimizers
import tensorflow.keras.callbacks
from tensorflow.keras.callbacks import TensorBoard
from tensorflow.keras.optimizers import SGD
from tensorflow.keras.models import Model
from tensorflow.keras.applications.vgg16 import VGG16
from keras.utils import to_categorical
os.environ['KMP_DUPLICATE_LIB_OK']='TRUE'
#データセットの情報
train_num = 100 #トレーニングデータの数
val_num = 34 #バリデーションデータの数
train_batchsize = 20
val_batchsize = val_num #テスト画像を全部。メモリに乗らなければ小分けもOK
classes = ['rider', 'walker']
class_num = len(classes)
##データセットの読み込み
#まずデータかさ増し
train_datagen = image.ImageDataGenerator(rescale=1./255.,
width_shift_range = 0.2,
height_shift_range = 0.2,
# zoom_range = 0.2,
horizontal_flip = False)
train_generator = train_datagen.flow_from_directory(
'train_data',
target_size=(32, 32),color_mode='rgb',
batch_size=train_batchsize,
shuffle=True,
classes = classes,
class_mode='categorical')
val_datagen = image.ImageDataGenerator(rescale = 1./255.)
validation_generator = val_datagen.flow_from_directory(
'val_data',
target_size=(32, 32),color_mode='rgb',
batch_size=val_batchsize,
shuffle=False,
classes = classes,
class_mode='categorical')
#VGG16 Model
vgg16_model = VGG16(weights="imagenet", include_top=False, input_tensor=Input(shape=(32,32,3)))
top_model = Sequential()
top_model.add(Flatten(input_shape=vgg16_model.output_shape[1:]))
top_model.add(Dense(1024, activation="relu"))
top_model.add(Dense(1024, activation="relu"))
top_model.add(Dense(class_num, activation="softmax"))
model = Model(vgg16_model.input, top_model(vgg16_model.output))
model.compile(loss="categorical_crossentropy", optimizer=SGD(lr=1e-4, momentum=0.9),metrics=['accuracy'])
# ベースとなるモデルを読み込み
# model.load_weights('vgg16_digitalnum_weight.hdf5')
#グラフ保存
tb_cb = TensorBoard(log_dir='logs')
##学習
model.fit_generator(
generator=train_generator,
steps_per_epoch=train_num//train_batchsize,
validation_data=validation_generator,
validation_steps=val_num//val_batchsize,
epochs=150,
callbacks=[tb_cb])
model.save_weights('vgg16_detect_rider.hdf5')
上はTFOD APIを使ってないのでプログラムとの接続がよくわからない。pyimagesearchを参考にしてみる。
object_detectionが見つからないエラーの解決
From tensorflow/models/research/
export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim
トレーニング(画像集め後から仕切り直し)
pyimagesearchのAWSを使うやり方がうまくいかず、手元のJetson Xavier NXもトレーニングプログラムを動かす環境が設定できず、Google Colabでリトライ中。
参考:TensorFlow 2 Object Detection API With Google Colab
集めた画像を連番にしようと思ったが、macは数が多いと名前の一括変更ができないことが判明。NameChangerというアプリを使う。
labelimgショートカット
a: previous image
d: next image
w: create rectangle
ctrl + s: save
create virtual environment
mkvirtuakenv envname -p python3
tensorflow2.3.0
finally installed
sudo pip3 install --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v$JP_VERSION tensorflow==$TF_VERSION+nv$NV_VERSION
モデルは動くようになったものの、モデルの鍛え方が悪かったらしく、自転車も人も自転車乗りもすべて検出してしまう。やはりある程度の分類は必要っぽい。人、自転車、自転車乗りの3種類で分類して再度鍛え直さないと。
3種類で分類するも、出来上がったモデルがまともに検出してくれない代物だった。Google Colabはメモリの制約があり、バッチ数を増やすとエラーで止まる。バッチ数を増やさないと精度があがらない。有料プランだとメモリを増大できるが、日本からは有料プランが使えない。Google Colabはダメなのか。
どうもうまく行かない!NVIDIAのインストラクションに立ち戻ってはじめから勉強しよう。
【Jetson Xavier NX レビュー(3)】学習モデル作成編 コードを書かずにマスクの装着を判定するAIを自作してみた
Original reference
https://github.com/dusty-nv/jetson-inference/blob/master/docs/pytorch-collect.md