序文
前の記事では、Googleのオープンイメージv4にデータセットをダウンロードし、それをyolo形式で保存して、ここに書き込む方法を説明しました。ラベルに問題がないことを確認するために、yolo_markを使用して再度クリーニングできます。ここでは、自分でデータを収集する必要がある場合があります。ここでは、Raspberry Piと広角カメラを使用して、自動収集タスクを実行します。できれば、データをクロールしてオンラインに戻すこともできます。ここではgithubで小さなツールを使用しましたが、効果は悪くありません。
ツール
- ラズベリーパイ
- USBカメラ
- yolo_mark
- tensorflow_label_tool
Raspberry Pi自動収集スクリプト
Raspberry Piは広角カメラを追加します。より大きなシーンが必要なため、200万ピクセルの170度(水平143度)の広角カメラを選択しましたが、最終的な写真で多くの損失が発生しました。詳細。Raspberry Piにopencvをインストールし、USBカメラを接続し、次のプログラムを実行して画像を自動的に収集します。画像は現在のフォルダーに配置され、現在のシステム時刻に基づいて名前が付けられます。収集していないときは、カメラを取り外してプログラムを終了します。
import cv2
import datetime
cap = cv2.VideoCapture(0)
width = 1920
height = 1080
cap.set(cv2.CAP_PROP_FRAME_WIDTH,width)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT,height)
i = 1
while(cap.isOpened()):
cv2.waitKey(5)
i = i + 1
ret, frame = cap.read()
now_time = datetime.datetime.now()
time_str = datetime.datetime.strftime(now_time,'%Y-%m-%d-%H:%M:%S')
if frame is None:
continue
elif i > 15:
i = 1
cv2.imwrite(time_str+'.jpg' ,frame)
cv2.imshow('cap',cv2.resize(frame,(480,270)))
cap.release()
cv2.destroyAllWindows()
tensorflow_label_toolツール画像のダウンロード
tensorflow_label_toolは、Windowsで実行されるアプリです。ダウンロードを選択し、キーワード、ダウンロード数、ファイル名、ズームの幅と高さを入力します(値が0の場合はズームなし、デフォルトは300x300です。つまり、元の形状を変更せずに画像が黒の背景に塗りつぶされるか、圧縮されます。 300x300)結果はダウンロードディレクトリに配置されます。
tensorflowのツールはクロッピングを実装します
ランダムクロッピングはテンソルフローのデータ拡張手法であり、入力画像とクロップしたいサイズで特定の出力を得ることができます。各クロップは1つの画像しか取得しないため、複数のループを使用して複数のクロップされた画像を取得します。大きなループを実行するたびに変数を解放しますが、入力画像が増えるにつれて、メモリが不足し、解決されません。解決策を知っている友人がこれを見る機会があれば、私にもアドバイスをいただければ幸いです。ミラーリングや色の変更など、他にも多くのデータ拡張方法があります。さらに、ここでトリミングするもう1つの目的は、各画像のターゲットの密度を減らすことです。これは、マーキングに便利です。
import tensorflow as tf
import cv2
import os
import glob
import gc
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
if __name__ == "__main__":
WSI_MASK_PATH = 'G:\Yolo_mark-master'
paths = glob.glob(os.path.join(WSI_MASK_PATH, '*.jpg'))
paths.sort()
for path in paths:
img = cv2.imread(path)
filename = os.path.basename(path)
for cnt in range(4):
crop_img = tf.random_crop(img,[550,550,3])
sess = tf.InteractiveSession()
cv2.imwrite("crop/" + str(cnt)+ "_"+ filename,crop_img.eval())
img2 = cv2.imread("crop/" + str(cnt) + "_" + filename)
cut_img = cv2.resize(img2,(608,608),interpolation = cv2.INTER_CUBIC)
cv2.imwrite("cut/" + str(cnt) + "_" + filename,cut_img)
sess.close()
del crop_img,img2,cut_img,sess
gc.collect()
cv2.waitKey(100)
del filename,img,cnt,path
gc.collect()
cv2.waitKey(100)
yolo_markのマーキングとクリーニング
ここで使用するyolo_markガジェットはマーキング用で、windowsとlinuxをサポートしており、実行可能ファイルをコンパイルして生成した後で使用できます。コンパイルする前に、obj.namesファイルを特定の順序で変更して、タスク要件に適合させます。マークしたいデータをimgフォルダーに入れ、yolo_mark.cmdをダブルクリックしてyolo_markを開き、マークを付けます。キーボードで「h」と入力すると、いくつかの操作コマンドが表示されます。たとえば、「c」は現在の画像のすべての注釈を消去し、「r」は選択したターゲットの注釈を消去します。画像に注釈を付けると、それに応じて注釈付きテキストファイルが生成され、train.txtファイルにパスが追加されます。
yolo_markでクリーニング
マークされたデータにエラーがある可能性があります。yolo_markを使用して再度クリーニングできます。ちなみに、すべてのパスがtrain.txtに追加され、両方を実行できます。
参考資料
https://blog.csdn.net/wulala789/article/details/80588424
https://blog.csdn.net/sinat_29957455/article/details/80629098