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