yolov3で画像を出力して順繰りに全て保存する方法まとめ
最近よく書いているyolov3シリーズ。
同じyolov3を使っている友達に
「yoloの画像っていちいちdarknet開いてコマンド走らせてリネームしなきゃ保存できないの不便だよねえ」
って言われました。
いやいや!!!できるし!!!!
というわけでpythonで
①外部コマンドを用いて画像をyolov3の識別にかける
②画像の名前をリネームして別ファイルに保存
この2つを命令するスクリプトを書こう。必要なコマンドたちについても書き記す。
①外部コマンドを用いて画像をyolov3の識別にかける
①−⒈外部コマンド:os, subprocess
僕はosを使う派なのでosを今回のスクリプトでも使っているが、osコマンドは現代的ではなくて非推奨らしい。
現代はsubprocessが汎用的に用いられている。
ちなみにひと昔使われていた、commandsモジュールは廃止されるのでさすがに使わないことがおすすめ。
その辺の詳しいことはhttps://stackoverflow.com/questions/4813238/difference-between-subprocess-popen-and-os-systemに詳しく載っている。
まずは、lsコマンドを実行する簡単な方法
import subprocess subprocess.call("ls")
subprocessを呼び出して
subprocess.call()で実行をする。コレダケ...
そしてosを使った場合
import os os.system("ls")
osを呼び出して
os.system()で実行をする。コレダケ...
これでunixコマンドのlsと同じことが実行できる。
osやsubprocessは他にも便利な使い道があるのでそれもまたいずれ説明する。
以降はosを使ったパターンを書くが、subprocess使いたい人はos.systemをsubprocess.callに置き換えてくれればオッケー。
①−⒉ディレクトリ内の画像数を数える
yolov3を実行するにあたって、
・どの画像を認識させるのか
・認識させる画像が何枚なのか
この二つがわかる必要がある。
import os direct='home/user/darknet/non-predicted_img' #画像が入っているディレクトリの指定 info=os.listdir(direct)#ディレクトリの情報を引き出す count=1 for file in info: index=re.search('jpg',info)#jpg形式のファイルがinfo内にあるか調べる if index: count+=1#info内にjpgを発見したらカウントが増える print(count)
このように記述すれば、darknetの中のnon-predicted_imgというディレクトリの中に幾つのjpgファイルがあるかを最後にprintしてくれる。
②画像の名前をリネームして別ファイルに保存
②−⒈renameコマンドを使って画像のパスと名前を変更する
これはすごくすごく簡単
import os path1='home/user/darknet/predictions.jpg' path2='home/user/darknet/keepimg/new.jpg' os.rename(path1, path2)
#これでリネーム先のパスにnew.jpgが入った
というだけの話なのだ。
最後に①と②をまとめて手を加えた完成版がこれ
import os direct='/home/user/darknet/non-predicted_data' files=os.listdir(direct) count=1 for file in info: index=re.search('jpg',file) if index: count+=1 for i in range(1, count): os.chdir("home/user/darknet") #cd darknetを外部コマンドで実施している os.system("./darknet detect cfg/yolov3-voc.cfg yolov3.weights non-predicted_data/dog"+str(i)+".jpg") path1="home/user/darknet/predictions.jpg" path2="home/user/darknet/keepimg/new"+str(i)+".jpg" os.rename('path1', 'path2')
案外簡単にいけるものだ!では明日からのブログ祭り、いろいろ書くことを楽しみにして今日は早く寝ようzzz