AtCoderチャレンジまとめ(0)
やりたいこと
そんなわけでAtCoderにチャレンジ ! の前の準備笑
教科書
けんちょんさんわかりやすい記事ありがとうございますm( )m
A問題の学び
問題分をよく読んで出力形式には注意すること。ex: cout << a << " " << b << endl;の" "を書き忘れる etc ...。
(プロコンの場合)変数名はシンプル。タイピング速度重視。
一行でかけるときはまとめる。 ex: if (c % 2 == 0) cout << "Even" << endl;
stringを受けて文字にアクセスするときはこう↓
string s; cin >> s; int counter = 0; if (s[0] == '1') ++counter;
++iとi++について↓
・ ++i の作用は式の値として、i + 1 の値を返す事、副作用は i に i + 1 の結果が代入される。
・ i++ の作用は式の値として、i の値を返す事、副作用はその後 i に i + 1 の結果が代入される。
B問題の学び
boolの真偽は小文字でtrue, false。大文字で書いちゃダメ。
計算量が少なく、考える時間を短縮したいときはfor分での全探索が有効なケースあり。
n進数の考え方やbit演算ができると良い。
sort大事。
#include <algorithm> int N; int a[100]; // a[0:N] を大きい順にソート sort(a, a + N, greater<int>());
バケット法よく使う。
setが便利。
#include <set> ... set<int> values; // insert するときに重複を取り除いてくれます for (int i = 0; i < N; ++i) { values.insert(d[i]); // 挿入します }
- 最大最小もよく使う。
const int lower = max(A,C); const int upper = min(B,D);
計算の工夫として、N!のSで割った余りを求めたい時は、オーバーフローを防ぐため、N! % Sより、(N%S) * ((N-1)%S)* ・・・としたりする。
a以上b以下の整数のうち条件を満たすものの個数を求める問題ではf(n) := 0以上n以下の整数のうち条件を満たすものの個数のように関数定義するとf(b)-f(a-1)で求めることができる。
C問題の学び
計算量オーダーの考え方が大事。
解き始める前にどのように解くかを計算量やタイプ量、便利関数などを加味してしっかり考えることが大事。ex: 後ろからGreedyした方が簡単 etc...
探索方法大事。
パリティ(「偶数」と「奇数」に関する性質)の考え方大事。
グリッドの作り方例: char c[55][55]; string board[50];
上下左右斜め移動の表し方例 ↓
const int dx[8]={1,0,-1,0,1,-1,-1,1}; const int dy[8]={0,1,0,-1,1,1,-1,-1};
感想
めっちゃ楽しい :D
今後の勉強予定
温湿度・気圧センサモジュールを動かしてみる
やりたいこと
BOSCH BME280センサを動かしてみる
購入先
教科書
準備
ブレッドボード
ジャンパピン
プルアップ用抵抗(10kΩ)x 2
Arduino Nano (Uno)
BME280
配線の仕方
- VCC(3.3Vへ)
- GND(GNDへ)
- SCL(SCK) <- プルアップ抵抗10kΩをはさむ
- SDA(SDI) <- プルアップ抵抗10kΩをはさむ
- CSB(3.3Vへ)
- SDO(GNDへ)
書き込むコード
BME280 – スイッチサイエンスに記載のコードBME280_I2C.inoをそのまま使用
結果
所感
だいたいあってる。安いし、そこそこの値をとるにはバッチリだと思う。
さすがBOSCH :)
参考
ブログ
温度・湿度・気圧センサモジュールの実験 ←わかりやすい
ライブラリ
サーモカメラOWLIFTを動かしてみる
やりたいこと
事前の環境設定
python3
python3のライブラリのみなので、python3環境を用意しておく
既存環境を汚したくない場合、例えばvirtualenvを利用する
$ sudo apt-get install virtualenv $ virtualenv -p python3 "my_env" $ source my_env/bin/activate
抜けたいときは
$ deactivate
参考: venv: Python 仮想環境管理 - Qiita
opencv
$ pip install opencv-python
OWLIFTライブラリのインストール
python library
以下からwhlファイルをダウンロード
以下コマンドでインストール
$ pip3 install owlift-xxx.whl
その他
参考: インフィニテグラ株式会社 | 小型サーマルカメラ OWLIFT
APIドキュメント
サンプルコード
以下からダウンロード
実行結果
USBでカメラをPCを繋いで以下を実行
$ python preview_basic.py
暖房を入れた時のエアコンの吹き出し口が熱を持っていることがわかる↓
蛍光灯に向けるとこんな感じ↓
所感
デバイスやセンサごとに特性があって面白い♪
WideResNetのお勉強
やりたいこと
Wideなネットワークについて理解を深めたい
内容理解
教科書: Residual Network(ResNet)の理解とチューニングのベストプラクティス - DeepAge
スキップコネクションでDeepなネットワークの学習が可能に。
BatchNormは下図の左を用いるとよい。
activationの位置に関して下図の右の方が良い結果に。
WideResNetはこのResNetのフィルタ数を増やすことで、GPUを活用し、浅いネットワークで同等の表現力を持つように改良したもの。kが広さの係数。
Dropoutの入れ方。
実装参考
わかりやすいブログや資料
Global Average Pooling (GAP)
教科書: Global Average Pooling(GAP)を理解してみる - Qiita
通常の全結合
GAP
実装参考
参考ブログ
所感
計算資源や学習対象によって適切なネットワークを選択できるようになりたい!
MobileNetV2のお勉強
やりたいこと
計算処理が軽いDNNの構築。低スペックのPCでもガンガン認識を回したい。
論文
MobileNetsの理解
通常のCNNではチャンネル間の特徴・チャンネル内の特徴(画像内の特徴)をフィルターによってまとめて考えるのに対し、MobileNetsではそれらをdepthwiseとpointwiseの畳み込みに分離し、表現しパラメータを削減している。
また、処理速度と精度を調整するためのwidth multiplierとresolution multiplierというパラメータもうまく設計されている。
参考: MobileNets: CNNのサイズ・計算コストの削減手法_翻訳・要約 - MUSCLE PROGRAMMER's BLOG
通常のCNN
Depthwise Separable Convolution
実装(TBD)
書き次第掲載予定。Tensorflowで書いてみようかな。
V2の理解(TBD)
参考スライド
参考ブログ
深層学習の計算コスト削減、MobileNetの設計思想 | Accel Brain Good Blog !!!
MobileNets: CNNのサイズ・計算コストの削減手法_翻訳・要約 - MUSCLE PROGRAMMER's BLOG
[Survey] MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications - Qiita
参考実装
Tensorflow
mobilenet-v2-tensorflow/models.py at master · timctho/mobilenet-v2-tensorflow · GitHub
models/research/slim/nets/mobilenet at master · tensorflow/models · GitHub
Pytorch
GitHub - kuangliu/pytorch-cifar: 95.16% on CIFAR10 with PyTorch
GitHub - MG2033/MobileNet-V2: A Complete and Simple Implementation of MobileNet-V2 in PyTorch
pytorch-mobilenet/main.py at master · marvis/pytorch-mobilenet · GitHub
GitHub - ericsun99/MobileNet-V2-Pytorch: Model shared. Top1:71.806/Top5:90.410
所感
軽量なDNNの工夫おもしろい。
低スペックPCで認識を回すために引き続きキャッチアップしよう。
CMakeのお勉強(2)
やりたいこと
cmakeについて調べることが多いし、理解も浅いので、理解を深める
教科書
CMake チュートリアル — Cmake-Tutorial
CMake チュートリアル
チュートリアルでは,一般的なビルドシステムの問題点のうち,CMake を利用することで解決できる事項について段階的に述べていきます
Step1: 最小構成
cmake_minimum_required (VERSION 2.6) project (Tutorial) add_executable(Tutorial tutorial.cpp)
tutorial.cpp
// 1つの数値の平方根を計算する単純なプログラム #include <stdio.h> #include <stdlib.h> #include <math.h> int main (int argc, char *argv[]) { if (argc < 2) { fprintf(stdout,"Usage: %s number\n",argv[0]); return 1; } double inputValue = atof(argv[1]); double outputValue = sqrt(inputValue); fprintf(stdout,"The square root of %g is %g\n", inputValue, outputValue); return 0; }
Step2: ライブラリの追加
add_library(MathFunctions mysqrt.cpp)
新しいライブラリを利用するには,ライブラリをビルドするにように,トップレベルの CMakeLists ファイルに add_subdirectory の呼び出しを追加します. また,MathFunctions/mysqrt.h ヘッダファイルにある関数の宣言を見つけられるように,別のインクルードディレクトリも追加します. 最後の修正は,新しいライブラリを実行ファイルに追加することです. トップレベルの CMakeLists の最後の数行は,次のようになります:
include_directories ("${PROJECT_SOURCE_DIR}/MathFunctions") add_subdirectory (MathFunctions) # 実行ファイルを追加 add_executable (Tutorial tutorial.cxx) target_link_libraries (Tutorial MathFunctions)
ライブラリの作成をオプション形式にするには
以下のように記述する
# 自前の演算関数を使うべきか? option (USE_MYMATH "Use tutorial provided math implementation" ON) # MathFunctions ライブラリを追加するか? # if (USE_MYMATH) include_directories ("${PROJECT_SOURCE_DIR}/MathFunctions") add_subdirectory (MathFunctions) set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions) endif (USE_MYMATH) # 実行ファイルを追加 add_executable (Tutorial tutorial.cxx) target_link_libraries (Tutorial ${EXTRA_LIBS})
MathFUnctions をコンパイルして利用するかどうかを決定するために,USE_MYMATHの設定を利用します.
Step3: インストール
インストール規則は,実に簡単です. MathFunctions ライブラリの場合,次の2行を,MathFunctions の CMakeLists ファイルに追加することで, インストールされるライブラリとヘッダファイルを設定します
install (TARGETS MathFunctions DESTINATION bin) install (FILES MathFunctions.h DESTINATION include)
Step5: ファイルを生成するファイルと,生成されたファイルの追加
生成されたソースファイルをアプリケーションのビルドプロセスに組み込む方法について述べます
// 1つの数値の平方根を計算する単純なプログラム #include <stdio.h> #include <stdlib.h> #include <math.h> int main (int argc, char *argv[]) { int i; double result; // 必要な引数を指定するように if (argc < 2) { return 1; } // 出力ファイルを開く FILE *fout = fopen(argv[1],"w"); if (!fout) { return 1; } // 平方根テーブルを持ったソースコードを作成 fprintf(fout,"double sqrtTable[] = {\n"); for (i = 0; i < 10; ++i) { result = sqrt(static_cast<double>(i)); fprintf(fout,"%g,\n",result); } // テーブルの最後を0にする fprintf(fout,"0};\n"); fclose(fout); return 0; }
MakeTable 実行ファイルをビルドするために, 適切なコマンドを MathFunctions の CMakeLists ファイルに追加し,それをビルドプロセスの一部としてを実行します.
# まず,テーブルを生成するための実行ファイルを追加 add_executable(MakeTable MakeTable.cxx) # ソースコードを生成するためのコマンドを追加 add_custom_command ( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/Table.h COMMAND MakeTable ${CMAKE_CURRENT_BINARY_DIR}/Table.h DEPENDS MakeTable ) # インクルードファイルの探索パスに, # バイナリツリーディレクトリを追加 include_directories( ${CMAKE_CURRENT_BINARY_DIR} ) # メインライブラリを追加 add_library(MathFunctions mysqrt.cxx ${CMAKE_CURRENT_BINARY_DIR}/Table.h )
参考:
所感
実際に書いてみないと理解しづらいところも多い。
書きながら勉強してみよう。
CMakeのお勉強(1)
やりたいこと
cmakeについて調べることが多いし、理解も浅いので、理解を深める
教科書
ja/catkin/CMakeLists.txt - ROS Wiki
CMakeLists.txtとは
ファイルCMakeLists.txtは、ソフトウエアパッケージをビルドするためのCMakeビルドシステムへのインプットです。
フォーマット(順序も大事)
必要な CMake Versionの指定 (cmake_minimum_required)
Package Name (project())
ビルドに必要な他の CMake/Catkin packages を見つける (find_package())
Message/Service/Action の生成 (add_message_files(), add_service_files(), add_action_files())
message/service/action generation の呼び出し (generate_messages())
パッケージのビルドに必要な情報の指定 (catkin_package())
ライブラリや実行ファイルのビルド (add_library()/add_executable()/target_link_libraries())
テストコードのビルド (catkin_add_gtest())
Install ルール (install())
CMake Version
cmake_minimum_required(VERSION 2.8.3)
Package name
project(robot_brain)
Tips: CMakeスクリプトの中で、どこで必要であっても ${PROJECT_NAME} 変数を使って、後からこのプロジェクト名を参照出来ます。
CMake Packages
find_package(catkin REQUIRED COMPONENTS nodelet)
Tips:
find_packageにはビルドに必要なコンポーネントだけを指定してください。ランタイムで依存するパッケージを指定するべきでありません。
catkin_INCLUDE_DIRSはcatkinのincludeパスだけではなく、nodeletのincludeパスも含みます
参考: CMakeを使ってみた (7) find_packageとpkg_check_modulesによるライブラリ探索 - wagavulin's blog
find_package() は何をしているのか?
find_packageを通してCMakeがパッケージを見つけたら、そのパッケージについての情報を与えるいくつかのCMake環境変数が生成されます。
↓以下環境変数
_FOUND - ライブラリが見つかったかどうか。見つかればtrueをセット、見つからなければ出力されない INCLUDE_DIRS or INCLUDES - パッケージによってエクスポートされたインクルードパス LIBRARIES or LIBS - パッケージによってエクスポートされたライブラリ _DEFINITIONS - 追加のコンパイルフラグ
catkin_package()
catkin_package()はcatkinで提供されたCMakeマクロです。pkg-configとCMakeファイルを生成するのに必要なcatkin固有の情報をビルドシステムに伝えるために必要です。
ex
catkin_package( INCLUDE_DIRS include LIBRARIES ${PROJECT_NAME} CATKIN_DEPENDS roscpp nodelet DEPENDS eigen opencv)
INCLUDE_DIRS - このパッケージのためのエクスポートされるinclude パス (i.e. cflags)
LIBRARIES - プロジェクトからエクスポートされるライブラリ
CATKIN_DEPENDS - このプロジェクトが依存している他のcatkinプロジェクト
DEPENDS - このプロジェクトが依存している非catkin CMakeのプロジェクト
CFG_EXTRAS - 追加の設定オプション
ビルドターゲットの指定
ビルドターゲットの指定方法にはいろいろありますが、通常は以下の2つのどちらかです:
Executable Target - 実行可能プログラム
Library Target - 実行可能なターゲットがビルド時または実行時に使用するライブラリ
Include パスと Library パス
ターゲットを指定する前に、ターゲットのためのリソース、特にヘッダファイルおよびライブラリをどこで見つけることができるのかを指定する必要があります。
Include Paths - (一般的にC/C++の)コードをビルドするためのヘッダファイルがどこで見つけられるか
Library Paths - 実行可能なターゲットをビルドするのに必要なライブラリがどこにあるか?
include_directories(
, , ..., ) link_directories(
, , ..., )
include_directories()
include_directoriesへの引数は、find_package呼び出しによって生成される*_INCLUDE_DIRS変数と、インクルードする必要がある
include_directories(include ${Boost_INCLUDE_DIRS} ${catkin_INCLUDE_DIRS})
一番最初の引数 "include" は、パッケージ内のinclude/ディレクトリがパスの一部でもあることを示しています。
link_directories()
CMakelink_directories()機能は、追加のライブラリパスを追加するために使われることができます。
link_directores(~/my_libs)
例:
- LINK_DIRECTORIES( ${LINK_DIRECTORIES} /absPath/libtourtre/)
推奨:
- FIND_LIBRARY(TOURTRE_LIBRARY tourtre /absPath/libtourtre)
- TARGET_LINK_LIBRARIES(testOVAS ${TOURTRE_LIBRARY})
実行ファイルのターゲット
ビルドすべき実行可能なターゲットを指定するために、CMake関数のadd_executable()を使わなければなりません。
add_executable(myProgram src/main.cpp src/some_file.cpp src/another_file.cpp)
これは、3つのソースファイル src/main.cpp、src/some_file.cppとsrc/another_file.cppからビルドされるmyProgramと呼ばれる実行可能なターゲットをビルドします。
ライブラリターゲット
CMake関数add_library()は、ビルドする際のライブラリを指定するために使います。デフォルトで、catkinは共有ライブラリをビルドします。
add_library(${PROJECT_NAME} ${${PROJECT_NAME}_SRCS})
target_link_libraries
実行可能なターゲットがどのライブラリにリンクするかを指定するために、target_link_libraries_functionを使ってください。これは一般にadd_executable()の呼びだしの後に実行されます。
add_executable(foo src/foo.cpp) add_library(moo src/moo.cpp) target_link_libraries(foo moo) -- これはfooを libmoo.soにリンクする
Tips: リンクすべきディレクトリ情報がfind_package()経由で自動的に取り込まれるので、ほとんどの使用事例においてlink_directories()を使う必要がないことに注意してください。
インストール可能なターゲットを指定する
自分のコードの"make install" を実行できるようにしたいなら、ターゲットがどこに収まるべきかを指定する必要があります.
これはCMake のinstall() 関数を使い、引数を伴って行われます。
TARGETS - どのターゲットをインストールするか
ARCHIVE DESTINATION - 静的ライブラリとDLL (Windows) .lib のスタブ
LIBRARY DESTINATION - 非DLL 共有ライブラリとモジュール
RUNTIME DESTINATION - 実行可能ターゲットと DLL (Windows) 形式の共有ライブラリ
install(TARGETS ${PROJECT_NAME} ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} )
ヘッダファイルのインストール
ヘッダファイルも"include"フォルダにインストールされ、これはしばしばフォルダ全体のファイルのインストールによって行われます(ファイル名パターンで部分的にフィルタされ、SVNのサブフォルダ群を除きます)。これは以下の様なインストール規則によって行われます:
install(DIRECTORY include/${PROJECT_NAME}/ DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} PATTERN ".svn" EXCLUDE )
install(DIRECTORY include/ DESTINATION ${CATKIN_GLOBAL_INCLUDE_DESTINATION} PATTERN ".svn" EXCLUDE )
roslaunch ファイルやその他のリソースのインストール
launchファイルといったその他のリソースは、${CATKIN_PACKAGE_SHARE_DESTINATIONにインストールされます
install(DIRECTORY launch/ DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/launch PATTERN ".svn" EXCLUDE)
所感
まだひとつひとつのコマンドが実行された時に内部でどのようにつながったり動いているのかが理解できていない。
引き続き学ぶべし