星空つづり

星空・天体写真などの記録を綴るブログ

<< August 2020 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 >>

2020.06.23 Tuesday

Python:OpenCVによる画像パターン認識のための機械学習に便利な支援ツールを作ってみた

昨今、PythonでAIを勉強している人は多いと思います。

ネットや関連雑誌・書籍では、OpenCVを使った画像認識させるってところが入り口になっていることが多いですよね。

 

静止画でもWEBカメラの動画映像からでも簡単に認識させることができるのは大変面白いですが、認識のために必要なのが学習済みのカスケード分類器(xmlファイル)。

顔認識を代表として学習済みのカスケード分類器はネット上で手に入れることが出来ますが、独自のオブジェクトを認識させるためには、自前でオブジェクトの画像をたくさん学習させ、分類器を作成する必要があります。

 

このページでは、途中の作業で必要な poslist , neglist ファイルの作成支援を行うツールを配布しています。

まずは、OpenCVを使ったパターン認識の機械学習をさせるための流れを確認しておきましょう。

 

▼学習環境を作る

・必要な実行ファイルやフォルダを準備する

※ここでは説明しませんので他のサイトを参考に

(参考サイト)

【Python版OpenCV入門】使い方とサンプル集

OpenCVの勉強(分類器を作成してみる)

openCVで人物特定の分類器を自作

OpenCV 物体検出、分類器作成と検出テスト その2

 

▼オブジェクトが写っている写真、写っていない写真をそれぞれ集める

・精度を上げるためには数百枚〜数千枚必要です。ネット画像などを収集します

・一枚の画像から歪み、回転などを加えて複数枚作成できる opencv_createsamples.exe を活用する方法もある

 

▼オブジェクトが写っている写真からPositive-list (Poslist.txt)を作成する

・オブジェクトのみをトリミングした写真を用意するか、写真から領域選択をしてその座標をPoslistに記録します

※このページでは、各画像をロードしてPoslist作成時の領域選択を行い、Poslistファイルに座標記録する支援ツールを配布しています

 

▼オブジェクトが写っていない写真からNegative-list (Neglist.txt)を作成する

・画像は何でもOK

・Neglist.txtは画像リストとしてフルパスでのファイル名一覧を準備する

※このページでは、フォルダ内のファイルから一発でフルパスのファイル名一覧(Neglist.txt)を作成する支援ツールを配布しています

 

▼カスケード分類器の作成

※ここでは説明しませんので他のサイトを参考に

 

▼できあがった分類器(xmlファイル)をセットしてパターン認識出来るかどうか検証

※ここでは説明しませんので他のサイトを参考に

 

流れとしてはそんなところでしょうか。流れの中で二つの支援ツールを用意したので以下に貼り付けておきます。ご自由にお使いください。

それぞれの支援ツールは分類器作成用フォルダにコピーしてお使いください。

 

ポジティブリスト作成支援ツール

 

以下のスクリプトをコピペして tool-poslist-maker.py として保存して使用してください

使用方法はスクリプト内に記載しています

動作中の画面は以下の感じです

 

 

----------------------------------------------------------------

# OpenCV機会学習用PosListの作成ツール

# tool-poslist-maker.py
#
# 目的:OpenCV分類器におけるポジティブイメージの範囲指定に必要な
# Poslist.txtの作成を行います
# 学習させたい対象物を画像内で囲うことで、画像上の対象数と最大範囲を
# Poslistの要求形式にて書き出しします
#
# 使用方法:
# 指定の横幅にて縦横比維持で画像表示されますので、
# ダブルクリックで四角形の対角をそれぞれ指定してください。
# 一枚の画像内で、MAXPOINT の設定値まで指定できます。
# 対象物全ての囲いが終われば、(s)キー押下にてPoslistへ書き込み後、
# 次の画像を自動的にロードします
# 作業を途中でやめたい場合は、ESCキー押下で終了します。
# なお、次回開始時は、Poslist.txtをリードして、続きの画像ファイルから
# 作業できるようにしています。
# なお、日本語などの2バイト系文字を含む画像ファイル名は避けてください
# このツールを使う前処理として、画像ファイルは連番(例:0001.jpg)名に
# しておくことをお勧めします
# また、作業中の修正機能は組み込んでいません。対角指定の位置を間違った
# 場合は、その場ESCで終了させ、再度ツールを実行させてください
#
# 2020/05/26 original ver.1.00
# coded by Sirius@星空つづり(岡山アストロクラブ 大島)
#
# 改変使用、改変後の再配布などご自由に。ただし改変後配布の際は、改変者
# 名をこのコメント次行に必ず追記してください
#
#

import glob,os,codecs
import cv2


# mouse callback function ダブルクリックで左上、右下の座標を順に記録
def draw_rect(event,x,y,flag,param):
    global done,sx,sy,ex,ey,PCount
    if event == cv2.EVENT_LBUTTONDBLCLK:
        if PCount < MAXPOINT:
            if done:
                ex.append(x)
                ey.append(y)
                print(PCount+1,') end=',x,y)
                cv2.rectangle(img,(sx[PCount],sy[PCount]),(x,y),(255,255,0),5)
                done = False
                PCount += 1
            else:
                sx.append(x)
                sy.append(y)
                print(PCount+1,') start=',x,y)
                done = True
                cv2.circle(img,(x,y),10,(255,255,255),-1)
        else:
            print('MAX POINTS!')

 

if __name__ == '__main__':

    FILE_PATH = './pos/' # ポジティブイメージ(.jpg)ファイルの格納フォルダ
    FILE_NAME = FILE_PATH + 'poslist.txt'
    
    VIEW_WINDOW_NAME = 'View'
    MAXPOINT = 20
    WINDOW_RESIZE_WIDTH = 800
    msg = 'All input is completed.'

    file_list = sorted(glob.glob(FILE_PATH + '*.jpg'))

    # Poslistが既にあれば、前回の続きからやるようにする
    try:
        with codecs.open(FILE_NAME,'r','utf-8') as fr:
            lines = fr.readlines()
            lineCount = len(lines)
            print('From the last continuation')
            del file_list[0:lineCount]
    except Exception as e:
        print('Create poslist as a new file')

    for imgfile in file_list:
        sx,sy = [],[] #左上座標格納用空リスト
        ex,ey = [],[] #右下座標格納用空リスト
        PCount = 0 #指定した四角形の数
        done = False #左上座標取得済み=True

        img = cv2.imread(imgfile)
        imgfile = os.path.basename(imgfile)
        print('Loading..Image:',imgfile)
        
        # 画像ファイルの大きさを取得
        height = img.shape[0]
        width = img.shape[1]

        # 横幅固定(縦横比はオリジナル維持)のウィンドウに画像ロード
        resizew = WINDOW_RESIZE_WIDTH
        resizeh = int(height * (resizew/width))

        cv2.namedWindow(VIEW_WINDOW_NAME,cv2.WINDOW_NORMAL)
        cv2.resizeWindow(VIEW_WINDOW_NAME,resizew,resizeh)

        cv2.setMouseCallback(VIEW_WINDOW_NAME,draw_rect)

        while True:
            cv2.imshow(VIEW_WINDOW_NAME,img)
            k = cv2.waitKey(20) & 0xFF
            if k == 27: # ESCで終了へ
                break
            elif k == ord('s'): # s押下時、範囲指定が一でもあればそれらの領域数と最大領域を保存
                if PCount > 0:
                    with codecs.open(FILE_NAME,'a','utf-8') as ft:
                        line = '{} {}'.format(imgfile,PCount)
                        ci = 0
                        while ci < PCount:
                            line = line + ' {} {} {} {}'.format(sx[ci],sy[ci],ex[ci],ey[ci])
                            ci += 1
                        line = line + '¥n'
                        ft.write(line)
                        print('Saved..',line)
                    break

        cv2.destroyAllWindows()
        if k == 27:
            msg = 'End with ESC key.'
            break
        else:
            continue
    print(msg)

----------------------------------------------------------------

 

 

ネガティブリスト作成支援ツール

 

以下のスクリプトをコピペして tool-neglist-maker.py として保存して使用してください

使用方法はスクリプト内に記載しています

 

----------------------------------------------------------------

# OpenCV機会学習用NegListの作成ツール
# tool-neglist-maker.py

#
# 目的:OpenCV分類器におけるネガティブイメージのファイルリスト、
# neglist.txt を作成します。
#
# 使用方法:
# /neg フォルダ内のjpg画像に対してフルパスでのファイルリストを作成します
# プログラムを実行するだけです。
#
# なお、日本語などの2バイト系文字を含む画像ファイル名は避けてください
# このツールを使う前処理として、画像ファイルは連番(例:0001.jpg)名に
# しておくことをお勧めします
#
# 2020/05/26 original ver.1.00
# coded by Sirius@星空つづり(岡山アストロクラブ 大島)
#
# 改変使用、改変後の再配布などご自由に。ただし改変後配布の際は、改変者
# 名をこのコメント次行に必ず追記してください
#
#


import glob,codecs,os

if __name__ == '__main__':

    # ネガティブイメージ(.jpg)ファイルの格納フォルダ
    FILE_PATH = './neg/'
    FILE_NAME = FILE_PATH + 'neglist.txt'
    
    msg = 'Create neglist.txt as a new file.'

    file_list = sorted(glob.glob(FILE_PATH + '*.jpg'))
    with codecs.open(FILE_NAME,'w','utf-8') as ft:
        for imgfile in file_list:
            line = os.path.abspath(imgfile) + '¥n'
            ft.write(line)

    print(msg)

----------------------------------------------------------------


2018.01.16 Tuesday

SiriusComp 20180116a バグフィックス版公開

SiriusComp 64 前バージョン 20170707c からのバグフィックスバージョンを公開しました。

修正箇所は一か所です。

 

・SiriusCompのタイムラプス生成動画にて、自動分割された二つ目以降のファイルの先頭に1秒間程度の何も映っていないブラックフレームが挿入されてしますバグを修正

 

前バージョンのみで発生するバグで、これまで、分割ファイルを動画編集ソフトなどで連結・編集される際に、不要なブラックフレームをわざわざ削除してもらっていたとおもいます。

 

これですっきり単純結合や編集をしていただけると思います。

 


2017.07.07 Friday

SiriusComp 64 / 20170707c リリース

先月64bit-OS対応の大規模バージョンアップを行って以来、3度目のマイナーナップになります。

多くのご利用、ご紹介、評価をあちこちでいただき、ユーザーの皆さんには感謝です。

少しでも皆さんの声にお応えするため、ほんの少しですがバージョンアップしました。

 

動画生成系の改善です。

 

・これまで 30 FPS が最大だった動画書き出しを 60 FPS に拡張しました。はき出されるファイルも相当大きいですが、これで4Kフルフレームの出力が可能となりました。(注)別途圧縮エンコードさせて形式変換をかけないと、未圧縮AVI再生ではコマ落ち必須です。

 

・一部の縦サイズ指定のアスペクト比において、元画像によっては横サイズ(自動計算)が16の倍数にならない場合がありました。

再生ソフトによっては再生できなかったり、カラー情報が飛んだりすることがあり、今回のBugFixにて強制的にアスペクト比を16倍数で設定させるように仕様変更しました。

 


2017.06.28 Wednesday

Siriuscomp 64 / 最新リリース 20170628a 公開

6月23日(5日前)の64ビット対応版SiriusComp公開から、これで二度目のバージョンアップになります。

今回のリリースで、特にバグがなければ、しばらく落ち着かせようと思います。

今回のバージョンアップは、主に動画関係の仕様改善で、バグ対応はありません。

 

概要・ダウンロードは、SiriusComp 配布サイトから、

また仕様変更の詳細は ソフト更改履歴ページにてご確認下さい。

 


 

5年ぶりのバージョンアップから、ほぼ二日おきに二度もバージョンアップしてしまって、その間ダウンロードしてくださった1200人超の皆さんに申し訳ない気持ちもありますが、今後しばらくバージョンアップは予定しませんので、よろしければ再ダウンロードしてやってくださいね。

 


2017.06.25 Sunday

SriusComp大幅バージョンアップ版公開しました

5年もほったらかしの間に32bit-OSは廃れつつあり、今や64bit-OSあたりまえのPCの世界。

ようやく先日から取りかかった、比較明合成(暗合成)、タイムラプス動画作成を簡単に行うフリーソフトSiriusComp最新バージョンを公開しました。

 

XPなんかの32bit-OSでも動作はしますが、今回の目玉は64bit-OS対応したことです。

体感的にはあまり変化はないかもしれませんが、ロジック全体を軽めに見直しているので、メモリ消費量は2割程度落とせています。

そのため、古いマシンでも時間さえ我慢すれば粘り強く動きます。

windows8,10を64bit-OSとして入れている場合はパフォーマンスは最高※当社比(笑)です。

 

さて、今回の最新バージョンの主な変更点を書いておきます。

・見た目や操作方法はほとんど変えていません。

 

・64bit化によって、大きな画素数を持つ最近のカメラの元画像からでも処理します。処理速度に最も影響するのはこの画素数ですが、横ピクセル6000程度なら普通に処理してくれます。実験では横13000ピクセルというあり得ない画像をコンポジットするテストも行いましたが、動画も、静止画もさほどストレス無く処理できていました。

 

・静止画合成系のオプションに「カラーブースト」というお遊び機能を付けています。自分的にはちょっとイケてないので、おいおい詰めてゆきます。

 

・もちろんこれまでどおり比較暗合成画像も作れます。ISSの月面通過、金星や水星の太陽面通過など特殊な利用となるでしょうけど、そのときのために残しています。

 

・一番力を入れたのが動画系です。残念ながら圧縮コーデックを直接指定して実行させるオプションは廃止しました。外部エラーを起こす原因となっていなのでなしです。動画は未圧縮非劣化のAVI動画のみでの保存です。ファイルサイズが2GBを超えないように自動分割させる機能は前バージョンと同じです。

 

・動画サイズに 4K 相当の作成オプションを付けました。現状では、4種類 4K,2K,PC(DVD画像相当),スマホ(VHS画像相当)です。ただし、元画像の縦サイズ(たいていは短辺側)のピクセルサイズを基準に、指定された動画サイズの縦いっぱいになるように伸縮させ、横幅は、オリジナル画像のアスペクト比から計算して割り出した動画を作ります。

通常の一眼カメラは3:2、コンデジの多くは4:3、設定を変えて1:1とか16.9などのワイド画面用の撮影もできるのですが、これらのアスペクト比の画像からでも、ピッタリサイズな動画を生成します。

 

・動画は廃止予定としていた回転機能を維持しつつ、ロジックを大幅に高速化しました。縦構図て現場撮影したときなど、動画化する際に回転をかけておくとスマホやテレビなんかでもかっこよく表示されます。

 

・動画に埋め込むことのできるファイル名やEXif撮影日時もテキストフォントを動画の大きさに合わせて調節させるようにしました。

 

・こちらはバグ対応ですが、二日前に公開したバージョンではUFRaw連携で外部現像させ取得したファイルの合成がうまく機能していませんでした。これも完璧に直しています。

 

ダウンロードは配布サイト http://phaku.net/siriuscomp/

少し先にまた小さな改良(バグ対応ではありません)を予定しています。動画系です。

しばらくはちょこちょこチェックしてみてくださいね。

 

siriuscomp windows10
 


2017.06.21 Wednesday

SiriusCompバージョンアップ予告

比較明合成画像やタイムラプス動画を生成するSiriusComp、5年近くバージョンアップしていませんでしたが、近々新バージョンを配布します。

 

まだ、少々手直しやテストが残っていますのが、遅くても二週間以内にはなんとかと思っています。

 

新しいSiriusCompでは、いくつかの問題点を解決し、また不要と思われる機能を割愛するなどしています。

変更点は次のとおりです。

 

・windows8,10などの64bit-OS対応

・Nikon D800などに代表される巨大なピクセルサイズを持つLサイズ画像でもエラー無く動作できるよう対応

・タイムラプス動画で縦ピクセル1080のものをこれまでのアスペクト比16:9より9:6に変更 1620x1080

・エラーの原因が多い動画コーデック選択を廃止し、無圧縮AVIのみとした(2GB自動分割機能はそのまま)

・タイムラプス動画生成時の回転オプションの廃止

・おまけ機能として、カラーブースト(色強調)機能を追加

 

 

公開までもうしばらくお待ちください。
 


2012.10.26 Friday

WEB上の静止画を定期的に取得する簡易ツール

世界中にはたくさんの天文台のスカイカメラがある。
大抵は一分ごととかで画像更新されている静止画だが、そんな星空が拝める素敵なスカイカメラの静止画像を定期的に取得・保存できたらええよな〜ってなことで、ちょちょいと作ってみた。

わざわざソフト配布ベージを作って提供するほどのものでもないので、このブログ記事のリンクだけで済ませておくので、ご入用の方は以下のリンク先を保存でどうぞ。win用です。
アイコンデザインすらしていませんので(^^;

WEB画像定期取得ソフト WebImagePicker

デフォルトでは国立天文台岡山天体物理観測所(OAO)のスカイモニターのURLが出るようにしている。いろいろスカイカメラの画像はあるが、ここのモニター画像はとてもキレイで高感度。オススメのカメラの一つ・・かな。



で、試しにハワイ・マウナケア山頂にあるCFHのスカイカメラを一晩分取得して動画にしてみた。あまり天気が良くない画像で見栄えはしないが、時折晴れて星空が拝める。



スカイカメラだけでなくていろんな「ライブカメラ」の画像も取得して動画にしてみると面白いかもねぇ。


2012.03.17 Saturday

SiriusComp配布ページをリニューアル

比較明合成フリーソフトSiriusCompの配布ページをリニューアルしました。
公開時から、ベタ書きしていたレイアウトの汚い配布ページでしたが、少しまともな見栄えにしてみました。

内容はほとんど変わっていませんが、今回新たに作例ページを別途設けました。また、ベタ書きでは配布ページと同一だったバージョンアップ履歴も別ページに。

今後の付け加えとして、比較明合成の解説ページと、登録制のUser's linkのページでも作ろうかと思っています。・・・いつになることか判りませんが(^^;



2012.03.01 Thursday

流そうか粘ろうか

今日はほぼ独り言モード。

2月中旬に更改したSiriusComp、それ以降すぐさま着手している改修がある。
ところが、ある理由があってまだバージョンアップ版の公開を決め兼ねている。どうしようかと言った感じ。

今回の改修目標としていたのは、天体の日周運動を比較明合成したときの恒星の色不足の件。撮影を始めて間がない人に多い悩みかもしれない。

そもそも、加算合成でもない比較明合成の写真でなぜ色が飛び気味になるのかなんてのは、撮影時に感度上げすぎて撮ってるからというのが結論。
ほなどうするかって・・・絞りを入れるとか、ISOを下げるとかして、単位時間の感度を下げておいて、あとは露出時間で地上景の露出をコントロールするとよい。
カメラのプレビューで恒星が写ってるのか写ってないのかわからないくらいで撮影しても、比較明合成すると案外星は出てくるし色もハッキリする。

画像処理から言うと、同じ対象でも明度がありすぎると彩度が落ちるのは必然で、彩度を上げるためには適当な明度で露出や処理を止めておく必要がある。

とはいえ、星の明るさもいろいろ。とてつもなく明るい金星や木星から暗い星まで様々。
実際撮影していると彩度を上げたくなるのも理解できるし、結果的にそういう処理をする場合もあるかと思う。
フォトレタッチソフトなどで、恒星以外をマスクして彩度を上げる処理を施すことなどさほど難しくはないが、それもできない人はどうする?

そんな長ったらしい前置き的思考が頭の中を駆け巡りながら、結局、星の彩度を上げる仕組みを考えて実装してみた。

「星の彩度」を上げるというからには、画像全体の彩度を単純に上げるということではいけない。
といっても考えた仕組みは簡単で、比較明合成をする過程で、明合成扱いとなるピクセルに対してのみ彩度を上げるという具合。これなら、基本的に光量の変わらない空の背景や地上景の彩度はオリジナルのままでいられる。

ということで、実装してテストしてみたところ、予想どおりの案配だ。

▼彩度強調なしの合成画像


▼実装した彩度強調を使って合成した画像
※地上景に影響なく恒星のみ色強調されていることがわかる


ところで、今回プログラムを改修するに当たって「彩度」って思いの外やっかいなやつだと思った。
RGBカラースペースでは、赤・緑・青の各値を0-255の範囲で表現しているだけで、SiriusCompもこれまではRGBやRGBから計算するL(明度)だけを相手にしてれば良かった。
彩度を変化させるとなると、RGBカラースペースのままでは単純に操作できない。そのため、SiriusComp内部でHSV(色相・彩度・明度)スペースに一度変換して彩度を操作した後、RGBに再変換して合成処理を行うという手間が必要となった。ともあれ、このロジックを組み立てるに当たりいい勉強にはなった気がする。

▼彩度強調を実装中の開発画面


さて、なんで公開をためらっているかなんだが・・・
合成した画像の「星の切れ目」も独自な方法でどうにかなるんじゃないかと思い出したため、思考段階で止まっているからなのである。

星の切れ目については、ステライメージ6.5から実装された比較明合成のバッチコマンドが、割合うまく解決している。連続した2枚・3枚あたりの画像を単純加算して、それを一つの単位として比較明合成するという手法だ。実際やってみると、加算合成する分全体が明るくなるが、レベルのハイライト側を加算枚数で割った値で切り詰めるとバックグラウンドのレベルはオリジナルの状態にほぼ戻り、星の切れ目は結構フラットになっている。結果は良好だ。
頭の中ではどう考えてもすんなりこの結果になるとは思えなかっただけに、よくこの結果に気がついたもんだと感心する。
注意点としては単純加算する枚数を増やしすぎたり、後処理を誤ると見栄えの良くない画像になる。どのみちステイメの場合は後処理は必ず必要なので、とりあえず比較明合成で星景写真をやってみたい人には敷居が高いと思われるかもしれない。

では、SiriusCompはどうするか? 星の切れ目問題、さほど本気で扱う気はしないのだが、もし扱うとしても、同じ方法をとるわけにはいかないし、同じやるなら新しいアイデアを持ち込みたいところ。
処理を必要以上に重たくしたくもないので悩ましいが・・・あれこれ考えてはみるものの・・・まだまだ悩みは続きそうだ。


2012.02.17 Friday

Siriuscompバージョンアップ(比較暗合成モードほか)Rel.20120217a

比較明合成ソフトのSiriuscompをバージョンアップしました。

今回は、2012年6月6日に起きる金星の日面通過という大イベントを意識してのバージョンアップです。

バージョンアップの内容は、以下の三点です。
・静止画合成について「比較暗合成モード」を追加した
・動画のオーバーレイにこれまでのファイル名に加えて、Exifの撮影日時も表示させることにした
・比較明合成モードでの動画作成時に、特定の残像レベルでダークを引いてしまっていたバグを修正(比較明合成モードの動画ではダークを引かない方が品質が良いため)

<普通の比較明合成>

明合成では星が軌跡となっています。

<今回追加した比較暗合成>

暗合成では暗いピクセルを採用して合成するので、星が無くなります。
あるのは・・・地上風景と、ほとんど動かない北極星くらい。

最近流行のISSの太陽面通過や金星の日面通過などでは、暗い影を合成する必要があるので、今回、比較暗合成のモードを追加しました。
・・といっても、数枚程度の暗合成となれば、フォトショップでやった方がつぶしが効いていいかもしれませんが(^^;

私的にはこちらのほうが便利だと思う機能、撮影日時の動画への刻印です。
撮影日・撮影時刻は画像のExif情報から持ってくるので、記録映像にはもってこいです。

<動画への撮影日時のオーバーレイ>

こんな感じで左上に刻印されます。
流星撮影や日面通過などの記録映像に利用する場合は、撮影前にカメラの日時設定をきちんと確認しておきましょう。

ということで、最新版Siriuscompは右側バナーの配布ページにて入手できます。

▲top