空飛ぶロボットのつくりかた

ロボットをつくるために必要な技術をまとめます。ロボットの未来についても考えたりします。

proxyのお勉強

プロキシとは、企業などの内部ネットワークとインターネットの境界にあり、内部のコンピュータの「代理」(proxy)としてインターネット上のコンピュータへ接続を行うコンピュータのこと。また、そのような機能を持つサーバソフトウェア。

http://wa3.i-3-i.info/word1752.html

e-words.jp

わかりやすい参考

proxy環境下の設定(ubuntu 14.04) - Qiita

$ export https_proxy="http://username:password@your.proxy.address:proxy.port/"

環境変数の引き継ぎ

sudo -E apt-get ~

環境変数の削除

$ unset https_proxy

avahiのお勉強

f:id:robonchu:20171025213237p:plain

avahi

Avahi(アバヒ)は、Zeroconfのフリーソフトウェア実装であり、マルチキャストDNS/DNS-SD サービスディレクトリのためのシステムを含む。

Avahi - Wikipedia

avahi-daemon - The Avahi mDNS/DNS-SD daemon - Linux Man Pages (8)

[Ubuntu] Avahiのコマンド一覧 - Life with IT

avahiとmDNS - Qiita

hostnameの重複を許す

enable-reflector=yes

ホスト名のコンフリクトについて

avahi daemonは、起動時にはコンフリクトメッセージを出さずにホスト名を取得します。 また、一度ホスト名を決定した後は、ホスト名をキャッシュし、ifup/downで同じホスト名を使い続けるので 一度ホスト名が決まってしまえば 下記のような場合を除いてifup/downで衝突は起きません。

hostname conflict with avahi (post 3.0) · Issue #1426 · pi-hole/pi-hole · GitHub

avahi-daemonのシステムログの内容について | アットマークテクノ ユーザーズサイト

linux - Avahi Hostname Resolution: Is it caching somewhere? - Stack Overflow

linux.die.net

How do I flush out the DNS resolver cache? - Ask Ubuntu

Re: [DNG] how to clear DNS cache

-> /etc/resolv.conf

DNSキャッシュのクリア

How To: Flush Your Local DNS Cache – Liquid Web Knowledge Base

sudo service dns-clean restart

/etc/hosts

127.0.1.1 robonchu

/etc/nsswitch.conf

名前解決の参照順位が設定されている

hosts: files mdns4_minimal [NOTFOUND=return] dns nis

filesは/etc/hostsファイルをdnsは、DNSサーバーを意味します。

mdns:マルチキャストDNS

JVNVU#98589419: マルチキャスト DNS (mDNS) 実装が外部からのユニキャストクエリに応答する問題

nis

ネットワーク・インフォメーション・サービス - Wikipedia

UNIXコマンド、シェルスクリプトのお勉強

Unix Command

  • mkdir app{1..40}

  • pwd

  • clear

  • cd

  • rmdir

  • ls

  • cat text.txt : 全文表示

  • less text.txt

    • /<検索したいワード>
  • mv

  • ctrl+r :直近のコマンドを探す

  • history : 履歴を呼び出す

  • !<historyで出たID> : 履歴のコマンドを実行

  • cd !$ : commadに渡した最後の文字を利用する

  • !pw : pwから始まる直近のコマンドを実行できる

  • man ls

  • mkdir --help

  • touch

vim

  • vi

  • command mode: esc key

    • 保存->:w

    • 抜ける->:q

  • 編集モード: i

  • ln -s

  • unlink

user, group

  • cat /etc/passwd

  • cat /etc/group

  • groups

permission

rwxrw-r--

  • rwx : user

  • rw- : group

  • r-- : other

read,write,execute

  • chmod g+x

  • chmod go+x

  • chmod a-x

  • rwx : 4+2+1 = 7

  • rw- : 4+2+0 = 6

  • r-- : 4+0+0 = 4

  • chmod 764

command make

  • type cat

  • vi hi

#!/bin/bash
echo "hi!"
  • chmod u+x hi

  • ./hi

pathを通す

  • echo $PATH

ここから探してコマンドを実行する

  • printenv

  • export PATH=/:$PATH

  • hi

  • which hi

管理者user

  • ls -l /var/log/message

  • cat !$

  • su -l : root userに切り替える

  • cat /var/log/messages

  • sudo cat /var/log/messages

chown

  • cp /var/log/messages .

  • sudo !!

  • cat messages

  • sudo chown : messages

  • cat messages

text operation

  • wc -l messages

  • head messages

  • head -n 3 messages

  • tail -n 3 messages

  • grep 'etc' messages

redirection,pipe

  • echo "date" > cmd.txt

  • cat cmd.txt

  • echo "free" >> cmd.txt

  • bash < cmd.txt

  • bash < cmd.txt > result.txt

  • cat result.txt

  • ls -l /etc | grep "php" | wc -l

ワイルドカード

  • ls /etc/*.conf

  • ls /etc/c??.*

find,xargs

  • find /etc -name "http*"

  • sudo !!

  • find /etc -name "http*" -type f -exec wc -l {} +

  • find /etc -name "http*" -type f | xargs wc -l

ブレース展開

  • echo {a,b,c}

  • echo {1..10}

  • echo {1..10}{a..g}

  • make test && cd test

  • mkdir app{1..5}

  • touch app{1..5}/test{1..3}{.txt,.jpeg,.gif}

  • rm app{1..5}/test{1..3}{.jpeg,.gif}

shell

./hello a aa aaa

#!/bin/bash
# comment

# $1, $2, ...

echo "hello $1"
echo $0  # ./hello
echo $#  # 3
echo $@  # $* a aa aaa

greeting="hello" #space入れちゃダメ!

echo "hello world"
echo 'hello world'
echo "hello robot"

echo "$greeting world"
echo '$greeting world' #展開されない
echo "${greeting}robot"

echo "foo"; echo "bar"

ディレクト

bin:実行コマンド

etc:設定

home:各ユーザー

sbin:システム管理用のコマンド

usr:一般的なアプリケーション

var:システムのログファイル

参考

https://dotinstall.com/lessons/basic_unix_v2

https://dotinstall.com/lessons/basic_shellscript_v2

Dockerのお勉強

f:id:robonchu:20171023214405p:plain

概要

Build once, run anywhere

Docker - Build, Ship, and Run Any App, Anywhere

VagrantUbuntuを用意する

Vagrantは、開発環境の構築と共有を簡単に行うためのツールです。どこでも同じ環境を再現できるように仮想マシン環境を管理する機能と、Atlasを通して共有する仕組みが提供されています。

開発環境の構築・共有を簡単にするVagrant入門 | Think IT(シンクイット)

A list of base boxes for Vagrant - Vagrantbox.es

Official Ubuntu 14.04 daily Cloud Image amd64 (Development release, No Guest Additions) をインストール

sudo apt-get install vagrant

vagrant box add trusty64 https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box

sudo apt-get install virtualbox

mkdir Docker && cd Docker

vagrant init

vagrant up

vagrant ssh

こうするとvagrant user で以下のように起動できていることが確認できる

vagrant@vagrant-ubuntu-trusty-64:~$

Dockerで環境構築

docker-ceのインストール

Get Docker CE for Ubuntu | Docker Documentation

UbuntuにDocker CEをインストールする - Qiita

確認:sudo docker --version

imageの操作

sudo docker search centos

sudo docker pull centos

sudo docker images

sudo docker inspect centos:latest

sudo docker rmi <id>

sudo docker run centos echo "hello world"

sudo docker ps -a -n=5  (a:過去を表示、-n:最新5つ)

sudo docker rm <id>

sudo docker run -d centos free -s 3

sudo docker ps

sudo docker logs <id>

sudo docker attach --sig-proxy=false <id>

sudo docker kill <id>

sudo docker start <id>

sudo docker run -i -t centos /bin/bash  (-i:インタラクティブ, -t:ターミナル)

touch hello.txt

exit

sudo docker ps -a

sudo docker commit <id> robonchu/hello

sudo docker images

sudo docker run -i -t robonchu/hello /bin/bash

ls

これでhello.txtがあることが確認できる

docker build

emacs -nw Dockerfile

FROM centos

MAINTAINER robonchu <robonchu@gmail.com>

# RUN: build時に実行

RUN echo "now building..."

# CMD: run時に実行

# CMD echo "now running..."

CMD ["echo", "now running..."]

以下でrun commitの動作、つまりimageからcontainer、そして、imageにする動作が行えることが確認できる

sudo docker build -t robonchu/echo .

sudo docker run robonchu/echo

さらに emacs -nw Dockerfile

RUN yum install -y httpd
ADD ./index.html /var/www/html/
EXPOSE 80
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]

emacs -nw index.html

<html>
hello from Docker!
</html>
sudo docker build -t robonchu/httpd .

sudo docker run -p 8080:80 -d robonchu/httpd

ウェブページを開いて、192.168.55.44:8080でhello from Docker!がでていることを確認

Imageをpush

https://hub.docker.com/

上記の登録が必要

sudo docker login

sudo docker push robonchu/httpd

参考

https://dotinstall.com/lessons/basic_docker

Dockerにおけるコンテナのライフサイクル - めもめも

Dockerでよく使うコマンドまとめ | 酒と涙とRubyとRailsと

さわって理解するDocker入門 第1回 | オブジェクトの広場

Dockerコンテナとイメージの仕組みを視覚化してみた | FAworksブログ

Dockerコンテナとイメージの仕組みを視覚化してみた | FAworksブログ

機械学習のお勉強(自作データセットでCNN by pytorch)

f:id:robonchu:20171017221616p:plain

CNNを用いた簡単な2class分類をしてみる

Pytorch tutorial

Training a Classifier — PyTorch Tutorials 1.4.0 documentation

Transfer Learning for Computer Vision Tutorial — PyTorch Tutorials 1.4.0 documentation

Writing Custom Datasets, DataLoaders and Transforms — PyTorch Tutorials 1.4.0 documentation

DataSetの作成

https://download.pytorch.org/tutorial/hymenoptera_data.zip

ここからアリさんとハチさんのデータセットをダウンロード

ディレクトリ構成

  • train

    • ants
    • bees
  • val

    • ants
    • beets

となっている。

このように自分で作ったデータセットを用意してあげる。

DataLoader

# -*- coding: utf-8 -*-
import torch
from torchvision import transforms, datasets

# 取り込んだデータに施す処理を指定
data_transform = transforms.Compose([
        transforms.RandomSizedCrop(224),
        transforms.RandomHorizontalFlip(),
        transforms.ToTensor(),
        transforms.Normalize(mean=[0.485, 0.456, 0.406],
                             std=[0.229, 0.224, 0.225])
    ])

# train data読み込み
hymenoptera_dataset = datasets.ImageFolder(root='hymenoptera_data/train',
                                           transform=data_transform)
dataset_loader = torch.utils.data.DataLoader(hymenoptera_dataset,
                                             batch_size=4, shuffle=True,
                                             num_workers=4)

# test data読み込み
hymenoptera_testset = datasets.ImageFolder(root='hymenoptera_data/val',
                               transform=data_transform)
dataset_testloader = torch.utils.data.DataLoader(hymenoptera_testset, batch_size=4,
                                         shuffle=False, num_workers=4)

classes = ('ants', 'bees')

データセットの形は

for i, data in enumerate(dataset_loader, 0):
    inputs, labels = data
    print inputs.size()
    print labels.size()

->
(4L, 3L, 224L, 224L)
(4L,)

となる。

自作transformsの使い方

class Crop(object):
    """Crop the image.

    Args:
        left_up (tuple): Desired crop left up position.
        right_down (tuple): Desired crop right down position.
    """
    def __init__(self, left_up, right_down):
        self._left_up = left_up
        self._right_down = right_down

    def __call__(self, img):
        image = img.crop((self._left_up[0], self._left_up[1], self._right_down[0], self._right_down[1]))
        return image

これを以下のように使用すれば良い

data_transform = transforms.Compose([
        transforms.Scale(224), 
        Crop((50,100),(100,200)),
        transforms.RandomHorizontalFlip(),
        transforms.ToTensor(),
        transforms.Normalize(mean=[0.5, 0.5, 0.5],
                             std=[0.5, 0.5, 0.5])
    ])

PILの使い方

pytorchの画像の読み込み、処理はPILを使っている

PIL/Pillow チートシート - Qiita

Model Definition

from torch.autograd import Variable
import torch.nn as nn
import torch.nn.functional as F

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 6, 5)
        self.pool = nn.MaxPool2d(2, 2)
        self.conv2 = nn.Conv2d(6, 16, 5)
        self.fc1 = nn.Linear(16 * 53 * 53, 120) # (((224 - 4) / 2 ) - 4) / 2 = 53
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 2)

    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        x = x.view(-1, 16 * 53 * 53)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

net = Net()

Training

import torch.optim as optim

criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)

for epoch in range(1):  # loop over the dataset multiple times

    running_loss = 0.0
    for i, data in enumerate(dataset_loader, 0):
        # get the inputs
        inputs, labels = data

        # wrap them in Variable
        inputs, labels = Variable(inputs), Variable(labels)

        # zero the parameter gradients
        optimizer.zero_grad()

        # forward + backward + optimize
        outputs = net(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        # print statistics
        running_loss += loss.data[0]
        if i % 10 == 9:    # print every 10 mini-batches
            print('[%d, %5d] loss: %.3f' %
                  (epoch + 1, i + 1, running_loss / 10))
            running_loss = 0.0

print('Finished Training')

total evaluation

correct = 0
total = 0
for data in dataset_testloader:
    images, labels = data
    outputs = net(Variable(images))
    _, predicted = torch.max(outputs.data, 1)
    total += labels.size(0)
    correct += (predicted == labels).sum()

print('Accuracy of the network on the test images: %d %%' % (
    100 * correct / total))

each class evaluation

class_correct = list(0. for i in range(2))
class_total = list(0. for i in range(2))
for data in dataset_testloader:
    images, labels = data
    outputs = net(Variable(images))
    _, predicted = torch.max(outputs.data, 1)
    c = (predicted == labels).squeeze()
    try:
        for i in range(4):
            label = labels[i]
            class_correct[label] += c[i]
            class_total[label] += 1
    except:
        break

for i in range(2):
    print('Accuracy of %5s : %2d %%' % (
        classes[i], 100 * class_correct[i] / class_total[i]))

Gitのお勉強

f:id:robonchu:20171023123921p:plain

公式DOCS

Git

Gitの構成

  1. 作業ディレクト

  2. ステージングエリア(インデックス)

  3. リポジトリ(ローカル、リモート)

Gitの設定

git config --global user.name "robo nchu"
git config --global user.email "robonchu@gmail.com"
git config --global color.ui true

ヘルプ:git config --help

はじめてのGit

git init

git add  <file>

git commit <file>

addとcommitをまとめて実行:git commit -am ""

git log 

ワンラインで表示:git log --oneline

変更点を表示:git log -p 

どのファイルに変更が加えられたか:git log --stat

git status

変更分を消す:git checkout -- <file>

変更分の確認:git diff

ステージングエリア上のdiff:git diff --cached

すべてadd:git add .

削除:git rm <file>

移動:git mv <file>

上げたくないファイルがあるとき:.gitignoreファイルを作り、*.logなどを記入。おいた場所の下位すべてに適応される。

git commit -m "message"

直前のコミットの変更:git commit --amend

直前のコミットを取り消す:git reset --hard HEAD

ひとつまえまでのコミットを取り消す:git reset --hard HEAD^

ひとつ前に消したコミットを取り戻す:git reset --hard ORIG_HEAD

git branch hoge

git checkout hoge

masterにhogeを統合:git checkout master -> git merge hoge

branchの削除:git branch -d hoge

git checkout -b hogehoge

コンフリクトの解決

  1. コンフリクトが起きたファイルを開く

  2. >>> or <<< のどちらかを消すor修正する

  3. add

  4. commit

tag

commit jankfdjbnkdlnbk~ のcommit idに名前をつける

直前のコメットにtagをつける:git tag v1.0

git tag -> v1.0

tagをつけたcommitを見る:git show v1.0

任意のコミットにtagをつける:git tag v0.9 jankfdjbnkdlnbk

tagの消し方:git tag -d v0.9

aliasの設定

git config --global alias.co checkout

git config --global alias.st status

-> git st

設定を見る:git config -l

共有レポジトリの作成

共有レポジトリ:share_robot.git

cd share_robot.git

git init --bare

cd ./../my_robot

git remote add origin ./../share_robot.git/

git config -l
    
> core.repositoryformatversion=0
> core.filemode=true
> core.bare=false
> core.logallrefupdates=true
> remote.origin.url=./../share_robot.git/
> remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
   

リモート消すとき:git remote rm origin

origin(share)にpushするとき:git push origin master

clone: git clone ./share_robot.git/ my_robot2

cd my_robot2

modify something 

git add .

git commit -m "modify something"

git push origin master

cd ./../my_robot

git pull origin master

そうするとmy_robot2での変更がmy_robotで反映されていることが確認できる

stash

変更を一時的に退避

一時退避:git stash save

退避した内容確認:git stash list -p

退避した作業を復元:git stash pop

Stash | 逆引きGit | サルでもわかるGit入門 〜バージョン管理を使いこなそう〜 | どこでもプロジェクト管理バックログ

cherry-pick & rebase

わかりやすすぎる👇

初心者でもわかる!リベースの使い方を解説します | Git編:一歩踏み出すフロントエンド入門

ex:

rebase -i HEAD~~

参考

初心者でもほぼ無料でGitの使い方を学べるコンテンツ7選 - paiza開発日誌

Git 学習コース Ⅰ | プログラミングの入門なら基礎から学べるProgate[プロゲート]

もう怖くないGit!チーム開発で必要なGitを完全マスター | Udemy

Pro Git 日本語版電子書籍公開サイト

Git Tutorial - Try Git

サルでもわかるGit入門 〜バージョン管理を使いこなそう〜 | どこでもプロジェクト管理バックログ

機械学習のお勉強(姿勢推定)

DeepPose

  1. PyTorchでDeepPoseを実装してみた - Qiita

  2. PyTorchでDeepPoseを実装してみた PartⅡ - Qiita

データセットのインストール先がわかる方教えてくださいm( )m

OpenPose

全般参考

GitHub - ZheC/Realtime_Multi-Person_Pose_Estimation: Code repo for realtime multi-person pose estimation in CVPR'17 (Oral)

ROS x OpenPose

  1. OpenPoseを動かしてみた。 - Qiita

  2. OpenPoseをROSで動かす - Qiita

  3. OpenPose de ROS - Qiita

  4. GitHub - solbach/openpose-ros: ROS wrapper for openpose

  5. GitHub - solbach/openpose-ros-tue: ROS Wrapper for openpose https://github.com/CMU-Perceptual-Computing-Lab/openpose

  6. GitHub - stevenjj/openpose_ros: A ros wrapper for the CMU openpose library

  7. image_recognition/openpose_ros at master · tue-robotics/image_recognition · GitHub

  8. GitHub - ildoonet/ros-openpose: CMU's OpenPose for ROS

Docker x OpenPose

  1. OpenPoseを動かす (Docker) - Qiita

  2. https://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/master/3rdparty/caffe/docker/gpu/Dockerfile

  3. GitHub - garyfeng/docker-openpose: DockerFile for CMU openpose

  4. https://hub.docker.com/r/chriamue/openpose/

  5. https://hub.docker.com/r/garyfeng/docker-openpose/~/dockerfile/

PyOpenPose

  1. GitHub - FORTH-ModelBasedTracker/PyOpenPose: Python bindings for the Openpose library

keras x OpenPose

GitHub - michalfaber/keras_Realtime_Multi-Person_Pose_Estimation: Keras version of Realtime Multi-Person Pose Estimation project

pytorch x OpenPose 1

GitHub - tensorboy/pytorch_Realtime_Multi-Person_Pose_Estimation: This is a pytorch version of Realtime_Multi-Person_Pose_Estimation, origin code is here https://github.com/ZheC/Realtime_Multi-Person_Pose_Estimation

使い方

  1. Dropbox - pose_model.pthからモデルをダウンロード

  2. git clone https://github.com/tensorboy/pytorch_Realtime_Multi-Person_Pose_Estimation.git

  3. ダウンロードしたpytorchモデルをmodelに移動

  4. python web_demo.py

f:id:robonchu:20171021233018p:plain

my pc のgpuの性能が低いので、とてもゆっくり。。。

pytorch x OpenPose 2

GitHub - umich-vl/pose-hg-train: Training and experimentation code used for "Stacked Hourglass Networks for Human Pose Estimation"

GitHub - bearpaw/pytorch-pose: A PyTorch toolkit for 2D Human Pose Estimation.

try中

Human Pose DataSet

MPII Human Pose Database

OpenFace

GitHub - DeNA/Chainer_Realtime_Multi-Person_Pose_Estimation: Chainer version of Realtime Multi-Person Pose Estiamtion