コンピュータビジョンアルゴリズム 問題

github.com上記が該当プロジェクト

 

下が問題の実行結果

これalgorithms/pixch/verify_staying_shapes.pyの実行結果なんだけどどうやっていいか考えてる。

どうやったら1だけはぶけるようにできるだろう。。。

 

 

 

 

 

 

 

 

 

 

自作コンピュータビジョンアルゴリズム

github.com

上記がプロジェクト

このプロジェクトのalgorithm/pixch/find_consecutive_sty_pixch_shapes.pyを実行した結果

これは動画のフレームから形を探し、同じ形を次の画像が探すというアルゴリズムです。

www.youtube.com

 

 

 

 

 

 

 

 

 

 

 

 

コンピュータビジョンアルゴリズム 下準備

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と同じように実行したいファイル名とディレクトリを指定して実行します。

 

以下の動画で実行しています。

www.youtube.com

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

IT系、科学系ラボのサイトを開設しました!

IT系、科学系の実験、実践に興味がある方はぜひお越しください!

今はコンテンツだけある感じで全然デザインとか読みやすさに欠けてますが、気が向いたらこれから色々もっと読みやすいようにとかデザインもよくしていきたいです。

 

https://r-and-dev-k.42web.io

aws lambda 外部ライブラリを一緒にdeploy

deployしたいコードの階層は以下のようになっています。

f:id:majitan:20220213140601p:plain

lambdaとして実行したいコードはsrc1.services.lambda_functionです。あとの2つ”src2.services.test2”と”src3.services.test3”は外部ライブラリとします。

 

上記の画像のようにlambda_function.pyはtest2とtest3のtest_print()関数を使うだけです。

f:id:majitan:20220213140848p:plain

f:id:majitan:20220213140920p:plain

それではwindowsでuploadするためにzipファイルを作成します。

f:id:majitan:20220213141110p:plain

デスクトップにzipファイルが作成されました。

f:id:majitan:20220213141202p:plain

中身は次のようになっています。

f:id:majitan:20220213141258p:plain

これをAWS上のlambdaにuploadします。

f:id:majitan:20220213141429p:plain

f:id:majitan:20220213141523p:plain

uploadしたら以下のようにすべてのファイルがuploadされています。

f:id:majitan:20220213141626p:plain

この状態で実行するとlambda_functionがないとエラーがでるので、きちんとlambda_functionのlambda_handerの場所を指定します。

f:id:majitan:20220213141808p:plain

 

これで外部ライブラリも使えるようになりました。

javascript fetchを使う際の注意点 no-cors を使うとresponseは空になる

googleにGET requestをするとcross origin のエラーがでる

f:id:majitan:20220212192843p:plain

エラー内容

クロスオリジン要求をブロックしました: 同一生成元ポリシーにより、https://www.google.com/ にあるリモートリソースの読み込みは拒否されます (理由: CORS ヘッダー ‘Access-Control-Allow-Origin’ が足りない)。ステータスコード: 200

f:id:majitan:20220212192936p:plain

なので以下のようにcorsを無効にしました。

f:id:majitan:20220212193136p:plain

そしてもう1度実行すると。。。

f:id:majitan:20220212193506p:plain

エラーはでませんがresponse.okの値がfalseになりresponseの中身も空になっています。

 

しかしブラウザのネットワークを見てみるとgoogleからのページがきちんとかえってきているのが分かります。

f:id:majitan:20220212193755p:plain

今度はデフォルトのcorsが有効な状態で試してみます。

f:id:majitan:20220212195259p:plain

今度はstatus がtrueになりresponseもしっかり入っています。

成功したのは送ってきたサーバがheaderのaccess-control-allow-originを許可してくれているからです。

f:id:majitan:20220212195407p:plain

いろいろなサイトで試しましたがほとんどのサイトは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の機能をふんだんに使える所だと思います。

  1. 他のアプリに直接アクセスできない(inter-process communicationとかOSが提供しているアプリ同士のやり取りの方法ではなく直接にアクセスするという意味で)

    通常アプリはここのアドレス空間を持っていて、他のアプリのアドレスにはアクセスできません。

  2. アプリのアドレスは仮想アドレス

    アプリのアドレスは仮想アドレスで物理的なアドレスではないです。例えば、あるデバイスのアドレスが0xfff3434にあったとしても、これはたいていの場合、物理的なアドレスでこのアドレスにアクセスするためには仮想アドレスから物理アドレスへ変換しなければいけません。

  • OSの作り方を学べる

  • x86を作りながら学べる

real modeに入り方

ほとんどこちらの資料を参考にしました。

50linesofco.de

ここでは僕が試したことを書きます。

プログラミング環境

Ubuntu

 

まず以下のassembly プログラムを作成します。ファイル名はboot.sとします。


.code16
.global init

init:
   
   mov $0x0e43, %ax
   int  $0x10
   hlt

.fill 510-(.-init), 1, 0
.word 0xaa55

au PAY マーケット×スマパスプレミアム

簡単な説明

.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メモリを上にして起動すれば先ほど書いたプログラムが実行されます。

 

実際に実行した様子です。

 

f:id:majitan:20220101110244j:plain

ただひたすら画面にcを書き込んでいます(笑)

でもこれでreal modeでプログラミングできる環境ができました!これからOSの作り方やx86をきちんと学べるのですごく楽しみです!