Object Detectionタスクでは検出したオブジェクトを矩形で囲う際に、座標情報がいろんな形式で扱われます。
- 4点の座標情報
- 長方形以外の四角形を表現可能
- 左上、右上、右下、左下の順で x1, y1, x2, 〜, x4, y4 と並べられる
- 左上のx,y座標と右下のx,y座標
- 長方形を表現可能
- 左上、右下の順でx1, y1, x2, y2 と並べられる
- 左上のx,y座標と、x方向,y方向の長さ
- 長方形を表現可能
※この他にも長方形を表す情報と、長方形の傾きを表す情報を組み合わせる場合もありますがレアケースなので省略します。
帳票の記入箇所を推定(Text Detection)するためのモデルを組むときにいろんな論文を参考にしては座標情報の形式変換をしているので、メモとして残しておきます。
なんとなくですが、「左上のx,y座標と、x方向,y方向の長さ」形式が好きなのでこの形式(x, y, width, height)に変換するようなスクリプトを載せていきます。
4点の座標情報 → 左上のx,y座標と、x方向,y方向の長さ
Text Detectionでは4点の座標情報を取得するケースを比較的見かける気がします。任意の四角形を表現できる形式のほうが情報を多く持っているわけですが、OCRエンジンに渡すときは結局長方形で渡すので4点の情報は不要です。
x座標の最大最小、y座標の最大最小を求めてwidth, heightを計算するだけです。
※長方形で表現する都合上元には戻せないので注意。
※経験上この形式は拡張子がtxtでヘッダーがないことが多いので、ヘッダーなしで読み込む前提でコーディングしています。
def square2rect(txt_path, output_path):
df = pd.read_csv(txt_path,header=None)
df.columns = ['x1', 'y1', 'x2', 'y2', 'x3', 'y3', 'x4', 'y4']
df['x'] = df[['x1', 'x2', 'x3', 'x4']].min(axis=1)
df['y'] = df[['y1', 'y2', 'y3', 'y4']].min(axis=1)
df['width'] = df[['x1', 'x2', 'x3', 'x4']].max(axis=1) - df['x']
df['height'] = df[['y1', 'y2', 'y3', 'y4']].max(axis=1) - df['y']
df[['x', 'y', 'width', 'height']].to_csv(output_path, index=False, header=True)
左上のx,y座標と右下のx,y座標 → 左上のx,y座標と、x方向,y方向の長さ
これは単純に右下から左下の座標を引けばwidth, heightがでるだけですね。ヘッダー名が「x1, y1, x2, y2」だったり「xmin, ymin, xmax, ymax」だったりするので念の為ヘッダー名を更新してます。
def points2length(input_path, output_path):
df = pd.read_csv(input_path)
df.columns = ['x1', 'y1', 'x2', 'y2']
df['width'] = df['x2'] - df['x1']
df['height'] = df['y2'] - df['y1']
df.to_csv(output_path, index=False, header=True)
関数名が微妙。。。