質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

YOLO

YOLOとは、画像検出および認識用ニューラルネットワークです。CベースのDarknetというフレームワークを用いて、画像や動画からオブジェクトを検出。リアルタイムでそれが何になるのかを認識し、分類することができます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

568閲覧

pythonである文字列以下の行をCSV形式で保存したい

good_island

総合スコア16

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

YOLO

YOLOとは、画像検出および認識用ニューラルネットワークです。CベースのDarknetというフレームワークを用いて、画像や動画からオブジェクトを検出。リアルタイムでそれが何になるのかを認識し、分類することができます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/01/19 10:12

編集2020/01/19 10:15

前提・実現したいこと

YOLOv3、COCOデータセットを用いて、動画を検知させました。

動画の各フレームにおいて、どのオブジェクトが何個検知されたかを知るため、
下のようなテキストデータ*の中から、Objects:以下の行を抜き出し、

"""
bird: 30% (left_x: 877 top_y: 426 width: 157 height: 81)
bird: 27% (left_x: 874 top_y: 435 width: 158 height: 94)

-> bird,30,877,426,157,81,bird,874,435,158,94

"""

のようにCSV形式で書き換えることを実現したいです。

pythonで行おうと考えておりますが、まず何から検索すればいいかもわからず、
よろしければ、有効な関数やメソッド等、アドバイスをいただければ幸いです。

何卒、よろしくお願いいたします。

*テキストデータ

txt

1Demo 2net.optimized_memory = 0 3batch = 1, time_steps = 1, train = 0 4 5 seen 64 6video file: E:/videos/hoge.mp4 7Video stream: 1280 x 960 8Objects: 9 10 11FPS:0.0 12 13 cvWriteFrame 14Objects: 15 16bird: 30% (left_x: 877 top_y: 426 width: 157 height: 81) 17bird: 27% (left_x: 874 top_y: 435 width: 158 height: 94) 18 19FPS:44.7 20 21 cvWriteFrame 22Objects: 23 24bird: 30% (left_x: 877 top_y: 425 width: 153 height: 86) 25 26FPS:45.1 27 28 cvWriteFrame 29Objects: 30 31... 32 33

補足情報

Python 2.7.17

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

正規表現を使って値を必要な抜き出すした後に、pandasを使って CSVに書き出すとよいのではないでしょうか

Python

1import pandas as pd 2import re 3from pprint import pprint 4 5# ファイル読み込み 6with open('data.txt') as f: 7 text = f.read() 8 9# 正規表現を使ってデータを抜き出す 10pattern = r'^bird:\s*(\d*).*left_x:\s*(\d*).*top_y:\s*(\d*).*width:\s*(\d*).*height:\s*(\d*).*$' 11pat = re.compile(pattern, flags=re.MULTILINE) 12data = [] 13for match in pat.finditer(text): 14 data.append({'bird':int(match.group(1)), 15 'left_x':int(match.group(2)), 16 'top_y':int(match.group(3)), 17 'width':int(match.group(4)), 18 'height':int(match.group(5))}) 19pprint(data) 20#[{'bird': 30, 'height': 81, 'left_x': 877, 'top_y': 426, 'width': 157}, 21# {'bird': 27, 'height': 94, 'left_x': 874, 'top_y': 435, 'width': 158}, 22# {'bird': 30, 'height': 86, 'left_x': 877, 'top_y': 425, 'width': 153}] 23 24# DataFrame化 25df = pd.DataFrame(data) 26print(df) 27# bird left_x top_y width height 28#0 30 877 426 157 81 29#1 27 874 435 158 94 30#2 30 877 425 153 86 31 32# csvに書き出す 33df.to_csv('output.csv')

【追加】
frame number 集計部を追加したサンプル

Python

1import pandas as pd 2import re 3from pprint import pprint 4 5# ファイル読み込み 6with open('data.txt') as f: 7 text = f.read() 8 9# 正規表現を使ってデータを抜き出す 10pattern = r'^bird:\s*(\d*).*left_x:\s*(\d*).*top_y:\s*(\d*).*width:\s*(\d*).*height:\s*(\d*).*$' 11pat = re.compile(pattern, flags=re.MULTILINE) 12data = [] 13for match in pat.finditer(text): 14 data.append({'bird':int(match.group(1)), 15 'left_x':int(match.group(2)), 16 'top_y':int(match.group(3)), 17 'width':int(match.group(4)), 18 'height':int(match.group(5))}) 19pprint(data) 20#[{'bird': 30, 'height': 81, 'left_x': 877, 'top_y': 426, 'width': 157}, 21# {'bird': 27, 'height': 94, 'left_x': 874, 'top_y': 435, 'width': 158}, 22# {'bird': 30, 'height': 86, 'left_x': 877, 'top_y': 425, 'width': 153}] 23 24# DataFrame化 25df = pd.DataFrame(data) 26print(df) 27# bird left_x top_y width height 28#0 30 877 426 157 81 29#1 27 874 435 158 94 30#2 30 877 425 153 86 31 32# 以下を追加 33# 再度ループを回してObjects:行をカウント 34count = 0 35frame_number = [] 36for line in text.split(): 37 if line.startswith('Objects:'): 38 count = count + 1 39 if line.startswith('bird:'): 40 frame_number.append(count) 41df['frame_number'] = frame_number 42 43print(df) 44# bird left_x top_y width height frame_number 45#0 30 877 426 157 81 2 46#1 27 874 435 158 94 2 47#2 30 877 425 153 86 3 48 49# csvに書き出す 50df.to_csv('output.csv')

投稿2020/01/20 09:50

編集2020/01/21 16:40
magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

good_island

2020/01/21 03:18

magichan さま 大変詳しくご回答いただきありがとうございます。 データの整理にはPandasが有効であるということ、 またreモジュールの使い方や、このケースでの正規表現の方法について、 大変勉強になりました。 誠にありがとうございました。 欲を言えば、 読み込み行までに出てきた「Objects:」という文字列の回数を、 新たな列「frame_number」としてdataに加えたいのですが、 何か有効な手段はございますでしょうか。 質問ばかりで大変恐縮ですが、 よろしければご指導いただけますと幸いです。 何卒よろしくお願いいたします。
magichan

2020/01/21 16:41

であれば別途ループを回して Objects: を集計したほうが良いでしょうね 一応サンプル追加しました
good_island

2020/01/22 04:31

magichan さま 早速ご回答いただきありがとうございます。 別途ループで集計してから列を付け足せばよかったのですね、 サンプルまで追加いただき、誠にありがとうございます。 頭ではやりたいことがわかっていてもなかなか実現ができなかったのですが、 いただいたコードをみるとすごくシンプルにまとまっていて、 このように考えたらいいのかと、大変勉強になりました。 まさに自分のやりたいことが実現されました。 何から何まで、本当にありがとうございました。
guest

0

直截的に作ってみました。スマートではありません。

python

1input_str = [ 2 "bird: 30% (left_x: 877 top_y: 426 width: 157 height: 81)", 3 "bird: 27% (left_x: 874 top_y: 435 width: 158 height: 94)" 4] 5output_str = [] 6for line in input_str: 7 splitted = line.split() 8 output_str.append(splitted[0][:-1]) 9 output_str.append(int(splitted[1][:-1])) 10 output_str.append(int(splitted[3])) 11 output_str.append(int(splitted[5])) 12 output_str.append(int(splitted[7])) 13 output_str.append(int(splitted[9][:-1])) 14print(output_str) 15#結果 16#['bird', 30, 877, 426, 157, 81, 'bird', 27, 874, 435, 158, 94]

投稿2020/01/19 10:44

ikapy

総合スコア1167

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

good_island

2020/01/20 05:45

ikapy さま 早速ご回答をいただき、ありがとうございます。 split, appendメソッドの使い方について、大変勉強になりました。 これを参考に、 ・"Objects:"以下の行のみを対象とする ・文字列にもう一度"Objects:"が見えたら、output_strを改行する ・上と同じ処理を繰り返し、最終行まで終わったら保存する のような処理を加えていこうと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問