星空つづり

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

<< June 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 >>

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.25 Thursday

牛窓にて

今季最強寒波といわれた日に少し時間があったので牛窓まで。外気温は-3度だった。

牛窓海水浴場の隣で軽く撮影。

西に傾くオリオン、冬の大三角をワンショット・固定でまず撮影。

周りが明るく、レンズフレアも出るし・・天の川が写り込むほど露出はかけられずちょっとロケーション選びに失敗したな〜

 

Canon EOS6D(SP-4改造) EF16-35 2.8L, 16mm 2.8開放 ISO-3200 15sec,固定撮影

WB=3200K

 

 

こっちは SiriusComp64による比較明合成 総露出50分

 

 


 


2018.01.16 Tuesday

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

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

修正箇所は一か所です。

 

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

 

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

 

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

 


2018.01.07 Sunday

木星と火星の大接近と二重星てんびん座αとのランデブー

この日、木星と火星とか見かけ上の大接近をした。最も接近する時刻を狙って撮影。

近くには、二重星としても有名なてんびん座のアルファ星ズベンエルゲブリがいたので同時にフレーミング。

まるで二重星が二個並んでダブルダブルスターのように。

てんびん座のα1、α2の離角は3分51秒なので、木星と火星の接近ぶりも比較してよくわかる。

木星と火星の大接近

 


 


2017.12.01 Friday

倉敷科学センターにて写真展開催っす

岡山アストロクラブの天体写真展が明日から開催です。

今年に入って3回目の写真展。

今回の会場は倉敷科学センターです。

もちろん入場無料です。

会期は1月21日まで(定例日、年末年始12/28-1/4は休館)とたっぷりあります。

岡山方面にお越しの方はぜひお立ち寄りください。

 

また、今回は初めての試みで、展示作品30点を収めた写真集も頒布(会場では販売不可のため、サンプル展示とお申込み受付のみ)します。

多数のご来場お待ちしていています。

 


 


2017.09.01 Friday

海ほたる

先日、突然な仲間内の意気投合で、岡山県牛窓町のとある海岸へ、海ほたるの撮影に出かけた。
潮が落ち着いて打ち寄せる波が少々穏やかになった頃、目をこらしていると海中に海ほたるの光がポワ〜っといくつか見えだした。
とはいえ、数は少なく、少々残念な面持ちで被写体としてはあきらめかけていたとき、同行者が砂浜に埋もれた大量の海ホタルを発見。
私の車にたまたま積んでいた「ちりとり」と「バケツ」で、それらを海に帰してやったのち、一同撮影開始(笑
おそらくなのだが・・この海岸、観光のために砂浜に海ほたるを蒔くことがあり、数日の内に蒔かれたモノが、その場で埋もれていたものなのかと想像する。なんとも複雑だか、ちゃんと海に帰してやることができたご褒美ということで、いいよね(^^;


撮影日時:2017/09/01 0:00-

Canon EOS 6D / ISO-5000 / Exp=3.2sec

Canon EF 16-35mm 2.8L / 絞り開放 / fl=30mm

SiriusComp 64 にて 136枚を比較明合成


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自動分割機能はそのまま)

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

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

 

 

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


▲top