コンピュータビジョンアルゴリズム 問題
github.com上記が該当プロジェクト
下が問題の実行結果
これalgorithms/pixch/verify_staying_shapes.pyの実行結果なんだけどどうやっていいか考えてる。
どうやったら1だけはぶけるようにできるだろう。。。
コンピュータビジョンアルゴリズム 下準備
github.com上で紹介しているコンピュータビジョンの紹介になります。
まず、このプロジェクトは最近話題の機械学習やopencvのような画像解析ライブラリは使っておらず1から全て自作しています!はじめは、学ぶならやっぱり自分で作りながらでしょ、と思いながらやっていったら、どんどん作っていってもうできるところまでやってしまおう!と思っていやり続けています
最初
まず、分析したい動画を用意します。
youtu.be上がサンプル動画です。
動画が用意出来たら次にこの動画を画像のフレームにします。
画像のフレームにするためのツールでffmpegを使います
以下はpythonで実行するコードです。
import subprocess
video_name = "street3"
input_video=video_name + '.mp4'
output_image= video_name + '\\%01d.png'
cmd = "ffmpeg -i "+input_video+' -q:v 8 -vf fps=10 '+output_image
subprocess.call(cmd.split())
上記を実行すると以下のようにvideo_nameに指定したフォルダーに画像が作られます。
画像ができたらこのフォルダをコンピュータビジョンのプロジェクトのディレクトリの下"computer_vision_algorithm3/images/videos/"に置きます。
設置したら次はalgorithms/fundamental/putpix_into_clrgrp.pyを実行します
まずpythonpathにプロジェクトのディレクトリを通します
パスを通したら、algorithms/fundamental/putpix_into_clrgrp.pyを実行します
実行する前にfilenameを実行したいファイル名にdirectoryを"プロジェクトディレクトリ/
images/"以下のディレクトリを指定します。
上記が済んだら、プロジェクトディレクトリから以下を実行します。
py algorithms/fundamental/putpix_into_clrgrp.py
次にalgorithms/fundamental/find_shapes.pyを実行します。putpix_into_clrgrp.pyと同じように実行したいファイル名とディレクトリを指定して実行します。
以下の動画で実行しています。
IT系、科学系ラボのサイトを開設しました!
IT系、科学系の実験、実践に興味がある方はぜひお越しください!
今はコンテンツだけある感じで全然デザインとか読みやすさに欠けてますが、気が向いたらこれから色々もっと読みやすいようにとかデザインもよくしていきたいです。
aws lambda 外部ライブラリを一緒にdeploy
deployしたいコードの階層は以下のようになっています。
lambdaとして実行したいコードはsrc1.services.lambda_functionです。あとの2つ”src2.services.test2”と”src3.services.test3”は外部ライブラリとします。
上記の画像のようにlambda_function.pyはtest2とtest3のtest_print()関数を使うだけです。
それではwindowsでuploadするためにzipファイルを作成します。
デスクトップにzipファイルが作成されました。
中身は次のようになっています。
これをAWS上のlambdaにuploadします。
uploadしたら以下のようにすべてのファイルがuploadされています。
この状態で実行するとlambda_functionがないとエラーがでるので、きちんとlambda_functionのlambda_handerの場所を指定します。
これで外部ライブラリも使えるようになりました。
javascript fetchを使う際の注意点 no-cors を使うとresponseは空になる
googleにGET requestをするとcross origin のエラーがでる
エラー内容
クロスオリジン要求をブロックしました: 同一生成元ポリシーにより、https://www.google.com/ にあるリモートリソースの読み込みは拒否されます (理由: CORS ヘッダー ‘Access-Control-Allow-Origin’ が足りない)。ステータスコード: 200
なので以下のようにcorsを無効にしました。
そしてもう1度実行すると。。。
エラーはでませんがresponse.okの値がfalseになりresponseの中身も空になっています。
しかしブラウザのネットワークを見てみるとgoogleからのページがきちんとかえってきているのが分かります。
今度はデフォルトのcorsが有効な状態で試してみます。
今度はstatus がtrueになりresponseもしっかり入っています。
成功したのは送ってきたサーバがheaderのaccess-control-allow-originを許可してくれているからです。
いろいろなサイトで試しましたがほとんどのサイトはcross orignを許可しておらず、
fetchは見ず知らずのurlにリクエストをするのはものすごい不向きなのが分かりました。
x86 real modeでプログラミングをするための環境構築!!!!
real modeとはなに?
intel プロセッサを搭載しているパソコンを起動した時に一番最初にある”モード”です。
パソコン起動の流れ
パソコンスイッチオン ー> リセットベクタ ー> BIOS ー> bootloader ー> OS
この時、BIOSとBootloaderはreal modeにあります。bootloaderか、OSがreal modeからprotected modeに入りそこからreal modeに戻ることはありませんし、一度は行ってしまうとreal modeに戻ることなんてできません (厳密にいうと、プロセッサのレジスタを変更すれば、protected modeを解除できるみたいなのですが、そうするとOSにどう影響あるの?とかで、それだけの深い知識がないとできないと思います)。
real modeでプログラミングをする大きな利点
なんといってもOSの縛りがなく、x86の機能をふんだんに使える所だと思います。
-
OSの縛り ー アプリのアドレス空間
-
他のアプリに直接アクセスできない(inter-process communicationとかOSが提供しているアプリ同士のやり取りの方法ではなく直接にアクセスするという意味で)
通常アプリはここのアドレス空間を持っていて、他のアプリのアドレスにはアクセスできません。
-
アプリのアドレスは仮想アドレス
アプリのアドレスは仮想アドレスで物理的なアドレスではないです。例えば、あるデバイスのアドレスが0xfff3434にあったとしても、これはたいていの場合、物理的なアドレスでこのアドレスにアクセスするためには仮想アドレスから物理アドレスへ変換しなければいけません。
-
OSの作り方を学べる
-
x86を作りながら学べる
real modeに入り方
ほとんどこちらの資料を参考にしました。
ここでは僕が試したことを書きます。
プログラミング環境
まず以下のassembly プログラムを作成します。ファイル名はboot.sとします。
.code16
.global init
init:
mov $0x0e43, %ax
int $0x10
hlt
.fill 510-(.-init), 1, 0
.word 0xaa55
簡単な説明
.code16は16bitという指定。real modeでは16ビットです。
int $0x10はbiosのinterrupt routineを呼び出しています。
.fill 510-(.-init), 1, 0は510バイトまで0で埋め尽くすという意味だそうです。これはbiosは511と512バイト目に0xaa55をみつけて初めてboot可能なものと認識するためです。
このプログラムは何するの?
このプログラムを実行すると”c”の文字を画面に繰り返し書き込んでいきます。
このプログラムをassemblerでコンパイルします。
as -o boot.o boot.s
次にリンクをします。
ld -o boot.bin --oformat binary -e init boot.o
これでreal modeで動作可能なbinary ファイルができました!
auスマートパス会員なら送料無料【au PAY マーケット】
実際に動かす
ここで通常はemulatorを使われているのが多いのですが僕の場合はちゃんと物理的なコンピュータで試したかったのでusbにコピーして動かしました。
注意!!!
物理的なコンピュータで試すとmaster boot recordを書きかえたりするのでこれを試して普通に起動させようとしたとき起動できなくなる可能性が十分あります!
僕の場合はsuper grub2というのをUSBメモリにいれてそれで通常に起動できるようにしています。
この注意を理解した上でUSBメモリにバイナリファイルをコピーし方は以下になります。
USBメモリをさしてそのUSBメモリのファイルを/devで探します。この例では/dev/sdb1がUSBメモリのファイルでした。
以下のコマンドを実行します。
sudo dd if=boot.bin of=/dev/sdb1 bs=512
これでBIOSの起動の順番をusbメモリを上にして起動すれば先ほど書いたプログラムが実行されます。
実際に実行した様子です。
ただひたすら画面にcを書き込んでいます(笑)
でもこれでreal modeでプログラミングできる環境ができました!これからOSの作り方やx86をきちんと学べるのですごく楽しみです!