ふらふら Diary (仮)

興味のあることを適当に書いていく感じです

PythonでGUIツール作成するために考えていること

Pythonは何でもできる、ということで何か作りたいなと思い、作っていこうと思う。最終的なアウトプットが具体的に決まっているわけではないが、ひとまずやりたいことを少しずつやっていこうと思う。

やりたいこと

一番はデータの可視化。そのために日付とそれに関連するデータかと。自分で手に入れられるというとやはりお金に絡むことで家計簿みたいな感じかな。あとは日付に関連するというと天気や気温の取得など。他には、スケジュールとか睡眠時間とか読書の記録とか…なんとなく考えているのはあるけど、明確には決めていない。
そしてGUIツールを作りたい、ということで…。初心者すぎるため、ひとまずTkinterでやってみようと思う。

/* 基本情報技術者試験を受けて */

平成29年10月15日(日)に基本情報技術者試験を受けました。合格しました。

 

試験勉強はだいたい1日2時間×3か月程度だと思う。ちなみにこの勉強時間は全然あてにならなくて、後述するが、参考書を買ったのは約1年ぐらい前だったし、私はよく言う事前知識なしの文系でもない。約1年ほど前から勉強を開始していたけど、短期集中していなかったと言うのが正しいと思われる。短期集中できなかったことが第一の失敗。

 

使用した参考書

 合格した人の多くが使用した参考書のひとつ。

キタミ式イラストIT塾 基本情報技術者 平成28年度

キタミ式イラストIT塾 基本情報技術者 平成28年度

 

 平成28年度というところがぽいんと(何がポイントなのか)。最新のを買うのがいいと思います。

 

 これは午後対策で買ったのだけれど、あまり参考にしていない。事前知識で知っているところが多かったので。擬似言語のところを読んだけど、これ問題冊子にちゃんと書いてあって覚えなくてもいいんだね。必死で覚えようとしていた。

 

苦しんで覚えるC言語

苦しんで覚えるC言語

 

 C言語を選択しようということで基本的なところは「苦C」で勉強。

 

改訂新版 基本情報技術者試験 C言語の切り札

改訂新版 基本情報技術者試験 C言語の切り札

 

 過去問の解説が載っているので、時間を測ってやってみた。

 

勉強方法

午前の対策は「キタミ式」を2周読んでひたすら過去問を解く。過去問で間違えたところのうち、「キタミ式」に載っている用語などは確実に覚える。それだけで合格点に達する。ちなみに私は試験1週間前になっても合格点に達していないことがあった。ある程度やれば合格点には達するが、やるだけ満点に近づくものでもなさそう。

午後の対策は半年前からちょーゆるゆるにアルゴリズムの本と「C言語の切り札」を勉強し始めた。午後の試験は全部で6割以上取れば合格なので、アルゴリズムC言語(ソフトウェア開発)で半分ほど取れればよいでしょ、という感じ。すでにやる気がなかった。3か月前から過去問をやり始めた。時間を測らずに解いたところ、すでに合格点に達してしまったので、そこからやる気を失った。午後の試験は時間配分に気を付けないと時間が足りなくなるので、そこの実践はしておいた方がいい。私も1か月前はちゃんと時間を測ってやった。

私はまず、アルゴリズムを30分で解いて、次は1番得意なデータベースを15分弱で解いて、あとは解けそうな選択問題(C言語を除く)、そして最後にC言語30分で解いた。アルゴリズムC言語(ソフトウェア開発)の問題は配点が高く、解くのにも時間がかかるので、その分の時間は必ず確保しておくこと。

おわりに

午後の試験、みんな早く退室してしまうけど、どんな速さで解いているの?私はいつも時間いっぱいかかっていたよ!

試験を受けるのにもお金がかかるので、試験勉強やらずに不合格になるよりはやって不合格の方がいいかなと思う。このままだと午後は合格しても午前は数点足らずに不合格になってしまうと思って、1週間前からやっと本格的に勉強し始めた私が言うのもあれですが。

/* cherry-blossom viewing */

昨日,桜を見に行きました.天候が心配されましたが,この日は雨は降ることなく,時折,日が出てくることもあり,よかったです.
昨年の今頃は桜を見る余裕もなかったので今年は見ることができうれしかったです.

毎年,来年の桜は見られるのだろうか,と思ってしまうので,今年の桜をしっかりと見て春を感じたいと思います.


https://instagram.com/p/09jWbYQF4E/

https://instagram.com/p/09jZemwF4K/

https://instagram.com/p/09jvDGQF4n/

https://instagram.com/p/09j6DJwF47/

https://instagram.com/p/09j9-pQF5A/


残りはInstagram (https://instagram.com/jetarin_a/) に載せていますので,ご覧ください.

/* 理由なく上がったTOEICの点数 */

2015年4月12日に第199回TOEIC公開テスト,同年5月24日に第200回TOEIC公開テストがあるようです (http://www.toeic.or.jp/).

さて,1年前の2014年6月までにTOEIC公開テストのスコアが必要になりました.
このことが分かっていたにも関わらず,勉強していませんでした.

でも,いいスコアが欲しい….少なくとも大学生の平均ぐらいは欲しいということで勉強を始めました.


まず,

はじめての新TOEICテスト 完全攻略バイブル

はじめての新TOEICテスト 完全攻略バイブル

を購入して,やりました.大切なことはリスニングで点数を稼ぐというところですね.リスニングは全く聞き取れないと思い,リーディングを頑張ろうと思ったのですが,リスニングの方が点数がとれるようで.これは2周はやりました.


そして,「はじめての新TOEICテスト 完全攻略バイブル」である程度TOEICがどんなテストであるか分かった後は

TOEICテスト新公式問題集〈Vol.5〉

TOEICテスト新公式問題集〈Vol.5〉

をきっちり2時間計って解きました.

どちらも解くだけではなく,何度も聞いて出てきた単語を覚えて勉強しました.


その後,本格的に勉強し始めて2ヶ月で180点上がりました.無事(?)大学生の平均点ほどのスコアを手に入れたのです.


振り返って思うのは,2ヶ月でこれだけ上がったのは,TOEICがどんなテストであるか事前に知っていたことが大きいと思います.というのも,2013年は4度受験しましたし,2011,2012年ともに2度以上は受験しています.勉強もしていないにも関わらず,受験料を支払うのは愚かだったとは思いますが,これによって少しは良い結果が得られたのではないかと感じます.

人検出における評価指標

提案手法の有効性を示すためには評価実験をします.実験の評価基準にはいくつかありますが,本記事では2つを紹介し,そのうちの1つを詳しく書いていきます.

  • 縦軸にmiss rateを縦軸にFalse Positive Per Window (FPPW)を示すDetection Error Tradeoff (DET)カーブを描く*1

こちらは学習データと同じ大きさの画像を評価用画像として用いて比較実験を行います.

  • 縦軸にDetection Rateを横軸にFalse Positive Per Frameを示すROCカーブを描く*2

こちらは車載カメラや防犯カメラで撮影された画像を評価用画像として用いて比較実験を行います.この場合,画像データセットを用いた場合は,アノテーションデータとして人の存在する位置や大きさが記述されています.このアノテーションデータを用いて検出精度を比較します.


本記事ではmiss rateとFPPWを算出してDETカーブを描く評価指標について述べたいと思います.
まず,miss rate,FPPWは次の式で定義されます.

\text{miss rate} = 1 - \dfrac{\text{人画像を正しく人として識別した数}}{\text{人画像の数}}

\text{FPPW} = \dfrac{\text{背景画像を間違えて人と識別した数}}{\text{背景画像の数}}

評価手順としては,まず,前回の記事と同様にHOG特徴量を算出します.識別器を構築するときと同様,+1には人画像,-1には背景画像のHOG特徴量をそれぞれ算出します.今回は人画像10枚,背景画像10枚として評価を行います.これをexample.datとし,ファイルに書き込みます.そして,コマンドプロンプトを開き,SVM-Light (http://svmlight.joachims.org/)のあるディレクトリに移動します.
その後,前回で作成したmodel_fileを用いて以下のように記述します.

 > svm_classify example.dat model_file output_file

次に作成したoutput_fileを見てみます.

0.1131256
0.57471402
0.32858306
0.2575153
0.62797327
0.39330365
0.68454537
0.7337844
0.53083444
0.55778887
-0.40430174
0.019183116
-0.10045875
-0.19039516
-0.74474677
0.093509865
-0.30452128
-0.24911432
-0.26294845
-0.44431607

このうち,上の10行は人画像,残りは背景画像です.
人と判定するしきい値を0以上とした場合,この中では上の10行と12,26行目の画像は人画像と識別されたということになります.このしきい値を変化させることによってmiss rateとFPPWを算出し,これを曲線で結ぶことによって描画していきます.

二つ以上の手法で検出精度を比較する場合,DETカーブが原点に近く描かれる手法であるということを示します.
人検出の場合,人画像であるにも関わらず,背景画像と識別した誤検出と,背景画像であるにも関わらず,人画像と識別した未検出を算出して精度を比較します.

誤検出も未検出も小さい値を示すことが理想です.

*1:N. Dalal and B. Triggs. Histograms of oriented gradients for human detection. Proceedings of 2005 IEEE Computer Society Conference on Computer Vision and Pattern Recognition, Vol. 1, pp. 886-893, June 2005.

*2:M. Enzweiler and D. M. Gavrila. Monocular pedestrian detection: Survey and experiments. Pattern Analysis and Machine Intelligence, Vol. 31, No. 12, pp. 2179-2195, Dec. 2009.

人検出における識別器構築 -その2-

前回の記事の続きです.

人画像,背景画像を用意した後,これらから特徴量を抽出し,学習した識別器を構築します.今回は,画像特徴としてHOG特徴量を使用し,識別器にSVMを用います*1.なお,本記事では,HOG特徴量の算出については省きます.いろいろなサイトをご覧になれば,詳しく記載されていますので.

SVMについてはSVM-Light (http://svmlight.joachims.org/)を使用します.SVM-Lightで使用できるようにHOG特徴量は以下のように記述できるようにしておきます.

+1 1:0.059147 2:0.047999 3:0.053404 4:0.060847 5:0.041208...
...
-1 1:0.150525 2:0.046580 3:0.052251 4:0.104595 5:0.045420...

+1には人画像,-1には背景画像のHOG特徴量をそれぞれ算出します.これをHOG2.datとし,ファイルに書き込みます.
そして,コマンドプロンプトを開き,SVM-Lightのあるディレクトリに移動します.その後,以下のように記述します.

> svm_learn HOG2.dat model_file

このようにすると以下のように出力され,model_fileというファイルが作られます.今回は,人画像10枚,背景画像10枚で学習しています.実際はもっと画像枚数が多いほうが良いです.画像枚数を増やすほど学習には時間がかかるようになります.
HOG2.datがSVM-Lightと別のディレクトリに保存している場合は

C:\○○\HOG2.dat

とします.model_fileを保存するディレクトリを指定する場合も同様です.

f:id:jetarinA:20150212195512p:plain


識別器構築については以上です.
次回は評価指標などにすることとします.

*1:N. Dalal and B. Triggs. Histograms of oriented gradients for human detection. Proceedings of 2005 IEEE Computer Society on Computer Vision and Pattern Recognition, Vol. 1, pp. 886-893, June 2005.

人検出における識別器構築 -その1-

今回は,人検出を行うための識別器構築をしたいと思います.
なお,本記事では,人画像(ポジティブ・歩行者)は事前に用意しているという前提で話を進めたいと思います.

背景画像(ネガティブ・非歩行者)は,人画像と同じ大きさに切り取られる必要があります.しかし,例えば今回使用したDaimler Mono Ped. Detection Benchmarkのように,背景画像が人画像と同じ大きさで与えられていないものもあります.
その場合は,自分で切り取る必要があります.


negative image

ランダムな位置およびスケールで切り出されたものを人画像と同じ大きさ(48×96ピクセル)で切り取りました.今回は1枚の背景画像について10ヶ所から切り取っています.

  • 29行目で0から入力画像 (src_img) の幅 (src_img.col) からWIDTH (48) の間で乱数を生成させています.
  • 30行目で0から入力画像0から入力画像 (src_img) の高さ (src_img.row) からHEIGHT (96) の間で乱数を生成させています.
  • 31,32行目でWIDTH/2 (48÷2=24) からWIDTH (48) の間,HEIGHT/2 (96÷2=48) からHEIGHT (96) の間で乱数を発生させています.この値はさまざまに変えてもよいと思います.
  • 33行目で
 printf("%d %d\n", a, b);

とありますが,aとbの値を表示させているだけですので不要です.(私の場合は確認のために表示させています.)不要な場合は,

 //printf("%d %d\n", a, b);

コメントアウトするか削除してください.

  • 35行目はroi_imgにsrc_imgに(深い)コピーしています.
  • 36行目はdst_img1をroi_imgから切り取った画像としています.具体的には点(a, b)から幅c,高さdだけ切り取っています.
  • 38行目ではdst_img1を正規化(48×96ピクセルの大きさにする)し,これをdst_img2としています.
  • そして42行目で画像を保存します.

乱数生成については以下のサイトを参考にしました.
C言語による乱数生成


書き方の問題はあるかと思いますが...
識別器構築についてはまた書きたいと思います.