YOLOトレーニングテストの可視化

ディレクトリ

STEP1生産データ収集
STEP2トレーニングモデル
STEP3テスト
STEP4視覚的なトレーニングログ
ます。https:ジョセフRedmon、前に書かれた環境の構造が記事を参照することができ、特定のによって提案されたフレームワークを学習ダークネットの深さはCとCUDAで書かれたオープンソースのニューラルネットワークのフレームワークです。 //blog.csdn.net/stjuliet/article/details/87731998
成功構築するための基本的な環境、あなたはトレーニングを使用して、独自のを作ることができYOLOモデルを所有してデータセット。

良好なデータセットのラベル使用のテキストで表示さからします。https://blog.csdn.net/maweifei/article/details/81137563

STEP1生産データの収集

図1に示すように、
(1)https://blog.csdn.net/stjuliet/article/details/89339814に従って
調製されたデータセット1、(1)(2)は、2つのステップでデータの良い独自のセットを調製し、
その後、次のコードを使用TXT形式としてマークされたXMLファイル形式の変換:
インポートxml.etree.ElementTree aSにET
インポートピクルス
インポートOS
GETCWDインポートLISTDIR OSから、
インポートはos.path参加から

クラス= [「人」、「前」、「側面」、「バック」]# ここでは、あなたの名前は、すべてのカテゴリである
myRoot = r'E:\ここでTensorflow_Codes'#は、プロジェクトのルートディレクトリである
XMLRootは= myRoot + R '\注釈'
txtRoot = R&LT myroot + '\ラベル'
imageRoot = R&LT myroot + '\ JPEGImages'

DEF getFile_name(FILE_DIR):
L = []
os.walkのルートのために、DIRS、ファイル(FILE_DIR):
プリント(ファイル)
のファイル内のファイルのための:
os.path.splitext(ファイル)であれば、[1] ==」.JPG 「:
L.append(os.path.splitext(ファイル)[0])#L.append(os.path.join(ルートファイル))
戻りL

:DEF(サイズボックス)に変換
DW = 1 /サイズ[0]
DH = 1 /サイズ[1]
X =(ボックス[0] +ボックス[1])/ 2.0
、Y =(ボックス[2] +箱[3])/ 2.0
W =ボックス[1] -ボックス[0]
H =ボックス[3] -ボックス[2]
X = X * DW
* DW W W =
Y = Y * DHの
H = H * DHの
リターン( X、Y、W、H)

デフconvert_annotation(image_idは):
in_file =オープン(XMLRootは+ '\%s.xml' %(image_idは))

out_file = open(txtRoot + '\\%s.txt' % (image_id), 'w')  # 生成txt格式文件
tree = ET.parse(in_file)
root = tree.getroot()
size = root.find('size')
w = int(size.find('width').text)
h = int(size.find('height').text)

for obj in root.iter('object'):
    cls = obj.find('name').text
    if cls not in classes:
        continue
    cls_id = classes.index(cls)
    xmlbox = obj.find('bndbox')
    b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),
         float(xmlbox.find('ymax').text))
    bb = convert((w, h), b)
    out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')

#image_ids_train =オープン( 'D:/darknet-master/scripts/VOCdevkit/voc/list.txt')。。。(読み取り)ストリップ()スプリット( ''、 '')#リスト格式只有000000 000001
image_ids_train = getFile_name (imageRoot)

image_ids_val =オープン( '/ホーム/ ***** /ダークネット/スクリプト/ VOCdevkit / VOC /リスト')。(読み)。ストリップ()。スプリット()

list_file_train =オープン(myRoot + R '\ ImageSets \メイン\ train.txt'、 'W')
#list_file_val =オープン( 'boat_val.txt'、 'W')

用image_ids_trainでimage_idは:
list_file_train.write(imageRoot + '\%s.jpg \ n -で' %(image_idは))
convert_annotation(image_idは)
list_file_train.close()#は自分の状況に応じて決定する、唯一のトレーニングセットを生成します

image_ids_valでimage_idはのために:

list_file_val.write( '/ホーム/ ***** /ダークネット/ boat_detect /画像/%s.jpg \ n' は%(image_idは))

convert_annotation(image_idは)

list_file_val.close()

(2)変換が成功した、ダークネットマスター\ビルド\ダークネット\ x64の\データ\ フォルダには、フォーマットTXTマークされ、元のトレーニングデータと画像データを格納するために使用するフォルダOBJ、作成
、2
ダークネットマスター\ビルドで\ダークネット\ x64の\データ\ train.txt新しいフォルダパス原トレーニング画像に格納されている(絶対および相対パスをすることができる)、ステップ1のコードの最後の部分はまた、train.txtに自動的に含まれコード(実行前に新しいtrain.txtファイルの下の最初のmyRoot \ imageSets \メイン\する必要があります):

3、
ダークネットマスター\ビルド\ダークネット\ x64の新しいYOLO-obj.cfgファイルの下のフォルダを(直接yolov3.cfgコピーすることができ、その後、YOLO-obj.cfgの名前を変更):
YOLO検索、三回、それぞれの合計が登場次のように変更YOLOブロック:
フィルタ=(。+クラス5)3 *は、そのカテゴリに応じて算出される。
クラスは、その数のセットに従って分類
メモリが少ない4Gに推薦を超える場合、ランダム1デフォルト0

4、
ダークネットマスター\ビルド\ダークネット\ x64の\データ\ 新しいobj.namesファイルフォルダ、独自のクラスのデータ・セットを記述します。

5、
ダークネットマスター\ビルド\ダークネットx64のデータ\ 新しいobj.dataファイルの下のフォルダには、カテゴリの数、トレーニングデータセットファイルのパス、ファイルのカテゴリラベル、\ \パス保存訓練モデルを記述します。

6、修正ダークネット・マスター・ディレクトリの下のMakefileファイル:

STEP2トレーニングモデル

。1、
勝利+ R&LT開操作端末入力CMD、ダークネットマスター\ビルド\ダークネット\ x64のディレクトリに切り替え、トレーニングを開始するためのコマンドを入力:
TEEは、トレーニングLinuxシステムでログファイル(最初に出力するためのコマンドでありますダークネットマスター\ビルド\ダークネット\ x64の最初のフォルダの可視化)が、Windowsシステムでは、このコマンドを作成していない仕事、それは余分なコンフィギュレーションコマンドを参加させる必要がある:
リンクします。https://pan.baidu.com/ S / 1R3bZCEqXGHNDNggs9m93Rw抽出コード:ef8t
アーカイブをダウンロードした後、解凍は、UnxUtilsをコピー\ CにUSR \ローカル\ WBIフォルダtee.exeファイル:\ WINDOWS \ System32には、することができます。

電車のデータ検出器darknet.exe / obj.dataヨロ-obj.cfg 2>&1 |。TEE可視化/ train_yolov3.log
。1
2、
訓練開始後、損失曲線の変化を観察するために、最後に生成された重みがあるファイルダークネットマスター\ビルド\ダークネット\ x64の\バックアップディレクトリの下。

STEP3テスト

選択されたサンプルより少ない(30枚)、反復1000の数、約5の最終的な損失、非常に一般的な予測として。
----------------

STEP4視覚的なトレーニング日記

この文書による訓練プロセスにおける第三工程トレーニング出力ログファイルtrain_yolov3.logは、さらに、モデル解析のためにIOU曲線を損失曲線を描くことができます。

次のようにコードは次のとおりです。

Pd等の輸入パンダ
のPLTとして輸入matplotlib.pyplot
輸入OS

ここg_log_path =「train_yolov3.log」#は、あなたのトレーニングのログファイル名を変更します

extract_log DEF(LOG_FILE、new_log_file、key_word):
'' '
:PARAM LOG_FILE:ログファイル
:PARAM new_log_file:選択した情報の使用可能なログ・ファイルを
:PARAM key_word:キーワードに応じたログ情報を抽出し
、リターン::
' ''
オープンで(LOG_FILE Fと、 "R")
オープン(new_log_file、 "W")train_log ASとの
ラインのためのFで:
#マルチGPU同期ログを削除
:行に"の同期が" IF
続行
#のNaNログ除去
ラインにおけるIF "はNaNを" :
続行
IFラインでkey_word:
train_log.write(ライン)
f.close()
train_log.close()

デフdrawAvgLoss(loss_log_path):
'' '
:PARAM loss_log_path:提取到的損失日志信息文件
:リターン:画ロス曲线图
'''
するline_cnt = 0
のカウントのために、列挙(オープン(loss_log_path、 『のrU』))で行:
line_cntを+ = 1つの
結果= pd.read_csv(loss_log_path、のskipRows = [範囲で、ITER NUMため、ITER NUM(line_cntを)IF((、ITER NUM <500))]、
error_bad_lines = Falseを、
名前=「損失」、「平均」、「速度」、 『秒』、 『画像』])
結果[ 『平均』] =結果[ 『平均』]。str.split(」「).str.get(1)
結果[ 『平均』] = pd.to_numeric(結果[「平均」])

fig = plt.figure(1, figsize=(6, 4))
ax = fig.add_subplot(1, 1, 1)
ax.plot(result["avg"].values, label="Avg Loss", color="#ff7043")
ax.legend(loc="best")
ax.set_title("Avg Loss Curve")
ax.set_xlabel("Batches")
ax.set_ylabel("Avg Loss")

デフdrawIOU(iou_log_path):
'' '
のparam iou_log_path:提取到的IOU日志信息文件
:リターン:画IOU曲线图
'''
するline_cnt = 0
のカウント、ライン列挙中のため(オープン(iou_log_path、 『のrU』)):
line_cntを+ = 1
結果= pd.read_csv(iou_log_path、のskipRows = [xについてのxの範囲内(line_cntを)の場合(X%39 = 0 |!(X <5000))]、
error_bad_lines = Falseの、
名前= [「地域の平均IOU」、 『クラス』、 『のObj』、 『いいえのObj』、 『平均リコール』、 『カウント』])
結果[ 『地域平均IOU』] =結果[ 『地域平均IOU』は] str.split(。」: 「).str.get(1)

result["Region Avg IOU"] = pd.to_numeric(result["Region Avg IOU"])

result_iou = result["Region Avg IOU"].values
# 平滑iou曲线
for i in range(len(result_iou) - 1):
    iou = result_iou[i]
    iou_next = result_iou[i + 1]
    if abs(iou - iou_next) > 0.2:
        result_iou[i] = (iou + iou_next) / 2

fig = plt.figure(2, figsize=(6, 4))
ax = fig.add_subplot(1, 1, 1)
ax.plot(result_iou, label="Region Avg IOU", color="#ff7043")
ax.legend(loc="best")
ax.set_title("Avg IOU Curve")
ax.set_xlabel("Batches")
ax.set_ylabel("Avg IOU")

もし名前 ==「メイン」:
loss_log_path =「train_log_loss.txt」
iou_log_path =「train_log_iou.txt」
:os.path.exists(g_log_path)がFalseの場合
、出口(-1)
os.path.exists(loss_log_path)がFalseの場合:
extract_log(g_log_path、loss_log_path、「画像」)
os.path.exists(iou_log_path)が偽である場合:
extract_log(g_log_path、iou_log_path、「IOU」)
drawAvgLoss(loss_log_path)
drawIOU(iou_log_path)
plt.show()
---- ------------

研修モデル訓練されたログのグラフとIOU損失グラフの時間によって描かれました:

公開された41元の記事 ウォン称賛7 ビュー3696

おすすめ

転載: blog.csdn.net/weixin_43091087/article/details/103135007