ディレクトリ
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損失グラフの時間によって描かれました: