grep(およびsed)を使用すると、出力をファイルに送信したときと端末で異なる結果が得られます。私のスタートアップファイルはdarknet Yolo mAPの実行からキャプチャした出力です。
CUDNN_HALF=1
net.optimized_memory = 0
mini_batch = 1, batch = 32, time_steps = 1, train = 0
Create CUDA-stream - 0
Create cudnn-handle 0
nms_kind: greedynms (1), beta = 0.600000
nms_kind: greedynms (1), beta = 0.600000
nms_kind: greedynms (1), beta = 0.600000
seen 64, trained: 96 K-images (1 Kilo-batches_64)
calculation mAP (mean average precision)...
Detection layer: 139 - type = 28
Detection layer: 150 - type = 28
Detection layer: 161 - type = 28
detections_count = 3688, unique_truth_count = 2114
rank = 0 of ranks = 3688
rank = 100 of ranks = 3688
rank = 200 of ranks = 3688
.
.
.
rank = 3400 of ranks = 3688
rank = 3500 of ranks = 3688
rank = 3600 of ranks = 3688
class_id = 0, name = car, ap = 87.89% (TP = 1414, FP = 130)
class_id = 1, name = motorcycle, ap = 90.91% (TP = 10, FP = 0)
class_id = 2, name = truck, ap = 96.37% (TP = 270, FP = 33)
class_id = 3, name = gcp, ap = 96.08% (TP = 305, FP = 13)
for conf_thresh = 0.25, precision = 0.92, recall = 0.95, F1-score = 0.93
for conf_thresh = 0.25, TP = 1999, FP = 176, FN = 115, average IoU = 83.92 %
IoU threshold = 75 %, used Area-Under-Curve for each unique Recall
mean average precision ([email protected]) = 0.902287, or 90.23 %
Set -points flag:
`-points 101` for MS COCO
`-points 11` for PascalVOC 2007 (uncomment `difficult` in voc.data)
`-points 0` (AUC) for ImageNet, PascalVOC 2010-2012, your custom dataset
複数の配列を試しましたが、class_id結果行を抽出しようとすると、同じ結果が得られます。
grep class_id results.txt > class_results.txt
これにより、ファイルに次のテキストが生成されます。
rank = 0 of ranks = 3688
rank = 100 of ranks = 3688
rank = 200 of ranks = 3688
.
.
.
rank = 3400 of ranks = 3688
rank = 3500 of ranks = 3688
rank = 3600 of ranks = 3688
class_id = 0, name = car, ap = 87.89% (TP = 1414, FP = 130)
class_id = 1, name = motorcycle, ap = 90.91% (TP = 10, FP = 0)
class_id = 2, name = truck, ap = 96.37% (TP = 270, FP = 33)
class_id = 3, name = gcp, ap = 96.08% (TP = 305, FP = 13)
その部分を無視すると、> class_results.txt
出力は正しく表示されます(または期待どおり)。
class_id = 0, name = car, ap = 87.89% (TP = 1414, FP = 130)
class_id = 1, name = motorcycle, ap = 90.91% (TP = 10, FP = 0)
class_id = 2, name = truck, ap = 96.37% (TP = 270, FP = 33)
class_id = 3, name = gcp, ap = 96.08% (TP = 305, FP = 13)
私は「ランク」を含む行を削除するためにsedを使ってみました。つまり、sed '/rank/d' class_results.txt > class_results_concise.txt
「ランク」を含む行だけでなく、クラスID = 0出力に行を保持したいです。私はsedのフォームの内部編集を試み、同じ結果を得ました。
class_idを含む行をテキストファイルに出力するには?
これはすべてUbuntu 20.04にあります。 stdoutなどについて何か誤解しているようです。あなたのソリューションに非常に感謝します。よろしくお願いします。
追加情報:ASCIIを確認した後、「rank」という単語を含む行の前にCR(ASCII 13)があり、class_idを含む行の前にLF(ASCII 10)があることがわかりました。 CRをLFに変換する方法が必要だと思いますか? ? ?
答え1
trのヒントを提供してくれた@Paul_Pedantに感謝します。
grep を実行する前にファイルをパイピングするとtr '\r' '\n'
問題が解決します。フィルタリングする出力テキストファイルの一部の場所にCRがあり、他の場所にLFがあるようです。 grepのようなプログラムはそれを別の方法で扱うようです。エド・モートン氏は、s/\r$//
自分の意見に基づいて、sed ''が一般的に良い解決策であると提案しました.
tr '\r' '\n' は入力のすべての \rs を \ns に変換しますが、\rs が入力の他の場所に現れるのは完全に有効です。そうであれば tr は入力行を分離します。行末の不要な \rs に対する正しい解決策は、単に、例えば sed 's/\r$//' を使用して行末の \rs を削除することです。