Briswell Tech Blog

ブリスウェルのテックブログです

クラスタリング勉強会

昨日は社内でAI勉強会(by 大澤さん)を実施しました。

今回は教師なし学習クラスタリングがテーマでした。コンテンツ・シナリオ・説明の仕方、どれもとても分かりやすく、終始惹きつけられました。「試しにやってみよう!」のコーナーは商品色分類という身近なものを題材にしていてとても興味深いものでした。発表後のディスカッションタイムは今までにないくらい白熱していましたね!

来年は外部向けのAIセミナーも開催する予定です。

ビジネス分野での活用例

クラスタリングは、マーケティングの戦略立案・顧客の特性分け・商品のポジショニング分析などに利用されています。

例えば、購買履歴データを分析してお客様のグループ(価格重視型、健康志向型、新商品重視型 等)を作り、そのグループに対して特別なキャンペーンを実施したり、嗜好に合う商品をリコメンドしたり、することで販売促進のための効果的な施作を打てるようになります。

このようなグルーピングをAI(機械学習)の力で行い、新たな気付きを得ることがクラスター分析の魅力です。

医療分野での活用例

最近はどのような分野・用途で利用されているのかな、と色々調べていたところ

昨日のニュース記事

今回研究グループは、複数のディープラーニングと非階層型クラスタリングを用いることで、病理画像から人間が理解できる情報を自動で取得する新たなAI技術の開発に成功。医療分野では今まで、医師が教えた診断をAIが学習する、すなわち教師以上の分類はできない「教師あり学習」が主に使用されてきたが、今回の研究では医師の診断を必要としない「教師なし学習」により獲得した特徴を、人間が理解できるように変換。再発期間のみを用いた最適な重み付けをAIに行わせることで、これまで不可能であったがんの未知なる情報の獲得を目指した。
引用:QLifePro | がんの特徴をAIが自力で獲得、再発診断精度を向上する新たな特徴も発見-理研ほか

のように、医療分野での利用も進められているようです。

AIが人間の理解を深める情報を提供する、さらに新たな気付きを人間に与えてくれるという、AIと人間が補完しあうとても興味深い技術です。

複数のディープラーニングと非階層型クラスタリングを用いる

についてどのようなアルゴリズムが使われているのか気になったので、論文を確認しました。

We then applied a deep autoencoder we had developed for pathology images (Supplementary Fig. 2) to 128 × 128-pixel image patches, clustering the 2048 intermediate-layers to form 100 features (clusters) by k-means clustering.
引用:Nature Communications | Automated acquisition of explainable knowledge from unannotated histopathology images

ディープオートエンコーダで次元圧縮をして、100個のクラスタ数にk-meansのアルゴリズムクラスタリングしているようです。
(「次元圧縮」と「k-meams」は大澤さんの勉強会にも出てきました!)

最後に

AIのアルゴリズムは色々あります。 難しそうな名前のアルゴリズムもその中身を知れば、自分が対象とする問題に適用可能かの判断もできます。 そして、絞り込んだアルゴリズムに対して、問題やデータの特性を見抜くことで実際に使用するアルゴリズムを選択することができるようになります。

理解を深めるために、実際にプログラミングをしてアルゴリズムに触れるのも大事です。
来年予定しているAIセミナーは、ハンズオンも取り込んでいきたいですね。

株式会社ブリスウェル

ブリスウェル ベトナムへの移動方法( NRT -> SGN )

こんにちは。宇佐美です。弊社子会社であるブリスウェル ベトナムへ出張中です。
ベトナムオフィスへの行程をまとめます。
技術とは関係ありませんが、ブリスウェル ベトナム訪問の際の移動時間や費用のベンチマークとしてお役に立てれば幸いです!

フライト

ベトナム航空 (NRT)→(SGN)

  • 2時間前にチェックイン。空席は真ん中の席のみ。
  • 定刻50分前に搭乗口集合。(離陸は定刻20~30分後。)
  • フライト中のMacBook Pro 15inchの使用&充電は禁止と機内放送あり。
  • 機内のディスプレイ不具合で度々操作不能
    • 不具合は周りの5~6席でも発生
    • 解消には電源マーク長押しで再起動 & 5分ほど待つ必要あり。
  • タンソンニャット国際空港(SGN)着陸は到着予定時刻通り。
  • 入国審査通過まで約40分ほど。

両替

直接ホテルへ向かう予定だったので空港内で両替しました。
ググって評判のよい No.5 "EXIMBANK" と記載がある両替所を利用。
レシートも貰えて1 円 = 210.1 ドンで両替しました。
(当日は1円 = 212ドンぐらいのレートだったタイミングでした。)

空港内の両替所でも、レシートなしでいくらか抜かれていたり計算時に数%レートを落とすところもあるようですのでお気をつけください。
No.5の両替所では機械で枚数を数えた紙幣を渡してもらえました。

空港タクシー乗り場

タクシーはボッタクられる場合があるので、評判が良いビナサンタクシーを目指します。

空港到着口を出たら左に突き進みます。
TAXI STANDと記載があるので、深緑色のシャツを着た人がビナサンの係員です。

他の会社の係員も"イエス!ビナサン!"と言いつつ乗せようとするのでお気をつけください。
(当のビナサンの係員はその様子を微笑みながら見守るだけでした。)

空港からブリスウェル ベトナム

空港から20~30分ほど。120,000ドン(=500~600円ほど)で到着です。
なお、タクシーが空港を出る際に料金が10,000ドンかかります。
私は最後の精算時に合わせて請求でしたが、空港で請求されることもあるようです。 

その他 (Grab)

タクシー以外にもGrabというUberのようなサービスもあります。
乗用車かバイクを選べてタクシーより安いです。
スーツケース有りの利用者を見かけたので次回チャレンジしてみたいです。

f:id:usami-t:20191220004522j:plain

スーツケース+ネックピロー+Grab

以上です。

OpenCVで出来ること

Pythonで画像や動画の処理をする時に良く使うのがOpenCVというライブラリです。

弊社でも最近

等で使用しています。

今回のブログでは、OpenCVでどんなことが出来るのかを紹介していきます。

弊社の中で
「ナレッジの蓄積と共有を積極的に行っていこう!」
という機運も高まっており、今後もこのような感じで発信を続けていきたいと思います。
よろしくお願いします。

OpenCVとは

OpenCVとはオープンソースのコンピュータビジョンライブラリです。コンピュータービジョンとは、コンピュータにデジタルな画像・動画をよく理解させることを意味します。OpenCVはその処理をするための様々な機能があります。

BSDライセンスのため、無料で使うことができ、商用利用も可能となっております。簡単な画像処理はもちろん、顔や文字領域の検出、物体の追跡などの様々な機能が用意されており簡単に扱うことが出来ます。

WindowsmacOSLinuxiOSAndroid 等のマルチな環境をサポートしています。

OpenCVのメリットとは

① インストールがとても簡単

Windowsの場合は、pipコマンド
$ pip install opencv-python
 
macOSの場合は、Homebrewを用いてbrewコマンド
$ brew install opencv
でインストール可能です。

② コードがシンプルですぐに試すことが出来る

いつも僕たちを元気付けてくれる弊社の取締役(陽治郎さん)をグレースケール化したい場合

f:id:KenjiU:20191214184005j:plain
yojiro-original.jpg
コードは以下になります。

import cv2

img = cv2.imread('yojiro-original.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
cv2.imwrite('yojiro-gray.jpg',gray)

以下のように変換されます。(掲載許可はいただいております!)
とても簡単ですね。

f:id:KenjiU:20191214184226j:plain
yojiro-gray.jpg

③ 画像解析の前処理が出来る

画像解析は、前処理がとても効果的です。
前処理とは、手元にあるデータを解析する前に、何らかの加工を施すこと。
そうすることで、アルゴリズムが学習しやすくなります。

画像のサイズを統一したり、グレースケール化・コントラスト強調・ノイズ除去等をすることで、より精度の高い機械学習が実行できます。
OpenCVを使えばこのような前処理の作業を簡略化できます。

④ 他のライブラリと組み合わせることが出来る

描画ライブラリのMatplotlibと組み合わせると

import cv2
from matplotlib import pyplot as plt

img = cv2.imread('yojiro-original.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
plt.show()

以下のようにグラフ描画が出来ます。 f:id:KenjiU:20191214185812p:plain

数値計算ライブラリのNumPyと組み合わせると

import cv2
import numpy as np

gamma = 2
lookUpTable = np.zeros((256, 1), dtype = 'uint8')

for i in range(256):
    lookUpTable[i][0] = 255 * pow(float(i) / 255, 1.0 / gamma)

img_src = cv2.imread('briswell-original.jpg', 1)
img_gamma = cv2.LUT(img_src, lookUpTable)
cv2.imwrite('briswell-contrast.jpg', img_gamma)

加工前

f:id:KenjiU:20191214195321j:plain
briswell-original.jpg

加工後

f:id:KenjiU:20191214195620j:plain
briswell-contrast.jpg

のように暗い部分がはっきりと見えるようになります。

まとめ

今回は、OpenCVとは何か、具体的にどのようなことができるのか、について書きました。
画像処理は目に見えて結果が分かりやすいので、プログラミングを学ぶ上でとっつきやすいのではないでしょうか。
オープンソースなので気軽に利用できるのも嬉しいですね。

株式会社ブリスウェル

GitLab CI Doker imageからAWS S3経由でLambdaに更新をかける

とある基幹システムの非同期処理等をAWS Lambda上で構築しようとした際のGitLab CI のご紹介です。

※ただ、結果として非同期処理はElasticBeanstalk の Worker環境で行うことにしたので、本番運用までは行なっていないです。

 

前回同様、test などは省きます

 

- pip install awscli

→EB install

 

- git checkout SendMail

→メールを送信するバッチをGitから持ってくる


- chmod +x .aws-config.sh
- ./.aws-config.sh

AWS の credentials


- export PATH=~/.local/bin:$PATH

→PATH通す


- apt-get update
- apt-get install -y zip unzip

→unzip を install

 

ここまでが事前準備

 

- zip -j SendMail.zip dst/*

→deployしたい対象ソースをzip化


- aws s3 cp SendMail.zip s3://lambda-zip/SendMail.zip

→zip したファイルをS3に置く


- aws lambda update-function-code --function-name SendMail --s3-bucket lambda-zip- --s3-key SendMail.zip --publish --profile=lambda

→置いたzipからLambdaへdeploy

 

これで一応deployはしてくれました。

ただ、本番運用するとなると、実行中のLambdaにdeployする訳にはいかないケースなど出てくると思うので、その辺りは都度調整が必要そう...

 

以上です。

間違い等ございましたらご指摘いただけますと幸いです...

GitLab CI Doker imageからAWS Elastic Beanstalkに更新をかける

  • GitLab CI Doker imageからAWS Elastic Beanstalkに更新をかける

だいぶ放置しました。

最近はGitLab CIから Circle CI に乗り換えたりしているのですが、載せます!

と言ったので、載せます!

 

  • 事前準備編

eb init

コマンドで作成される

.elasticbeanstalk/config.yml

があること

※開発と本番でglobal application_name が異なるため、僕は

.elasticbeanstalk/development/config-dev.yml

.elasticbeanstalk/production/config-prod.yml

 に分けて、後ほどCIで mv コマンドで入れてます。

 

.ebextensions/ の中にやりたい内容があること

僕がやってるのは

https の設定

nginx の設定

env の設定

くらいです。

https の設定で

SSLCertificateArns を間違えて開発と同じでデプロイしておかしくなったこともありました。

 

  • GitLab CI の中身

stages とか、test コマンドなどは省きます。

単純に ElasticBeanstalk に上がるとこらへんのみの Script を記載してます。

- mv .elasticbeanstalk/development/config-dev.yml .elasticbeanstalk/config.yml

これで開発環境のを持ってくる

- mv .ebextensions/development/env-dev.config .ebextensions/env.config

環境変数もついでに持ってくる

- mv .ebextensions/development/load-balancer-dev.config .ebextensions/load-balancer.config

SSLCertificateArnsが違うのでこれも持ってくる

 

- pip install awsebcli --upgrade --user

EB install

- git checkout develop

Git から持ってくる

- chmod +x .eb-config-dev.sh

- ./.eb-config-dev.sh

↑この中にAWS情報を記載しておく

- export PATH=~/.local/bin:$PATH

PATH通す

- eb --version

一応確認しておく

 

- eb use AdminConsoleDevelopment-env

deployしたい環境を記載しておく

- eb status

一応確認しておく

- eb deploy

でデプロイ

 

以上です。

 

これをdevelopブランチとmaster ブランチで分けて記載して環境分ければうまくいくのかなと...

 

個人的に悩んでいるところは、

eb use AdminConsoleDevelopment-env ← ここにdeployをし、稼働開始

その後、新しいソースを乗っけたサーバ

AdminConsoleDevelopment-env-1 ←を作成し、URLスワップを行うと

↑こいつが最新になる

とすると、次回deployする時、またCIの中身を

AdminConsoleDevelopment-env

など、違うアプリーケーション名にしないといけない状態...

これを解決したい...

 

何か誤り等ございましたらご指摘いただけますと幸いです...

AWS認定ソリューションアーキテクト・アソシエイト 取得しました

AWS認定ソリューションアークテクト アソシエイト 取得しました!

 

AWS自体は2013年頃から触りはじめ、今年の頭くらいから取得しようと考えてずるずると11月に...

このままだと!と思い、11月頭に申し込みを行いました。

 

試験まで約2週間

とにかく

https://www.amazon.co.jp/dp/4295005495

 

この本を3度読み直し、触ったことないサービスはできるだけ自分で触ってみて理解を深める。

それ以外の足りない知識は別で調べて記事を読む...

というのを繰り返し行いました。

 

結果は

804/1000

でした。

f:id:Toshi_bw:20191115194620p:plain

 

模擬などと比べ、他の方も言われている通り、日本語がわかりずらい部分が多少ありました...

 

受かってよかった!

AWS Lightsail

今までAWS Lightsail ってメニューになんかいるなー、程度で全く知らなかった。

本日たまたま [Amazon Personalize] のハンズオンセミナー に参加した時に触れてて、初めて触った。

 

料金面でEC2 インスタンスの場合

時間単位の課金 + 従量課金

→そのため、中々正確な金額を見積ことが難しい

Lightsail

→月額固定

これが凄く良い。

 

他にもWordPress Lamp Redmine GetLab などなどが用意されていて、

本当に3クリックくらいで簡単に構築できた。

$3.5出し...一番安いの...

 

更にEC2 への移行もできるらしい....

本番環境等では使えないかもしれないが、気軽に立てて遊んだりするのにはとても良いと感じた。

 

排他制御

Web基幹システム(その他でも)を構築しているとよく後勝ち問題に出くわす。

 

  • 後勝ち問題

f:id:Toshi_bw:20190312100234p:plain

後勝ち問題

上記図のように、Aさんが修正画面起動後にBさんが編集画面を起動、

後に修正画面を開いたBさんが先に保存を行い、Aさんが後で保存を行う。

すると、Bさんの修正をAさんは知らない状態なので、Bさんの修正はAさんによって上書きされてしまう。

Bさんは修正したのにされていないこととなってしまう。

 

Bさんは自分は修正できた!と思っているはずなので、何かしらで後々修正されていないことを知ることとなる。

 

業務的にこのようなことが発生する = AさんとBさんがやりたい業務が異なっており、画面の責務を分割すべき、というのももちろんあるが、一旦そこはおいておく。

(例えばAさんは顧客情報を修正しようとしており、Bさんは顧客ステータスのようなものを修正しようとしていたなど)

 

先ほどの図と同じだが、Aさんが保存をしようとした時に「Bさんが保存処理を行なったため、最初からやり直してください」 or 「Bさんが保存処理を行いました、強制的に保存を行うとBさんの修正を上書きしてしまいます」

といった処理。

具体的にはAさんが修正画面起動時に最終更新日時のようなデータを保持しておき、保存時に現在の最終更新日時と比べる。

異なっていればメッセージを表示することにより、知らずに上書きされることをある程度避けることが可能となる。

(ある程度、というのはAさんがいじわるで、強制保存を行い、Bさんに通達しないケース)

 

この処理が向いているのは、更新頻度が低く、更新者があまりいない、マスタ系に向いている。

 

f:id:Toshi_bw:20190312100904p:plain

悲観的排他制御

ほぼ一緒の図だが、今回はBさんは修正開始で終わっている。

Aさんが修正開始したタイミングで、データに編集中フラグのような物を更新する。

Bさんが修正開始しようとしたタイミングで「Aさんが何時何分から修正中です」

とメッセージを表示し、修正できないようにする方法。

Aさん保存時に編集中フラグをOFFに更新することによって、他のユーザが編集可能となる。

Aさんが途中で画面離脱するケースも想定し、何分以上保存されなかった場合は編集中フラグを自動でOFFにする、というJobも必要となる。

 

この処理が向いているのは割と更新頻度が高く、更新対象者も先ほどよりかは多くいるケース、トランザクション向き。

 

 

システム利用経験が少なかったりするユーザの場合、後勝ちを理解していない場合が多いので、システム利用前に予め説明を行い、何かしらの制御を入れるのが良いと思う。

 

 

です!

 

t1.micro サーバのお話

AWS EC2インスタンス

t1.micro

に対してメンテナンスが入ると通知があった

 

Amazon Web Services is performing a refresh on all Amazon EC2 T1.micro instances. The instance refresh will offer higher host reliability, better CPU performance and match the CPU burst experience of T1.micro instances to be consistent with T2 instances.

 」

t2インスタンス並みにCPUパフォーマンスがあがるよーと。

Starting February 1, 2019, you can stop and restart your Amazon EC2 T1.micro instances to take advantage of the instance refresh. After March 1, 2019, Amazon EC2 T1.micro instances that have not been stopped, will be scheduled for maintenance.

 」

3/1までに停止 → 開始をすることで反映されて、3/1までにやってないインスタンスは強制再起動されるよーと。

 

CPUパフォーマンスが向上するのは良いことなので、先にやってしまおうと。

結構古くから使ってるインスタンスで、社内ツールが配置されているもので対象が3台あった。

社内に通達して、停止 →  開始を3台行う、

内2台は確かにCPUの使用率は格段に下がった!!

ラッキー!

 

けど、うち1台は変わらず。。。

とりあえずAWSサポートに連絡してみると、その子はまだメンテナンス対象になってるよ、反映されてないよと言われる。

→もう一回停止 → 開始やってみる。CPUの向上は見受けられない。。

再度連絡してみる

→まだメンテナンス対象だよー、と。

 

やってるのに。。

もしこのまま対象から外れなかったら3/1 強制再起動??

手動で反映されないなら強制でも反映されなくない??

したら何回も再起動されまくるでしょ??

って連絡してみたら現状は不明ときた。

 

ってことでもうt2インスタンスに入れ替えを行なった。

というお話。

 

いつかはt1 → t2にしといた方がよかったので良いタイミングではあったが、

たまたま社内用で助かった。

 

反省点

・忙しさを理由にギリギリまで放置してた

・もっと早くやってれば計画性を持って入れ替えを行えた

・社内AWS管理が個人依存になっている

 

以上!

 

GitLab CI AWS Elastic Beanstalkとの連携

GitLab CiからAWS Elastic Beanstalk へ更新をかけてみた。

 

ソース直下に

.elasticbeanstalk

フォルダを追加し、config.ymlを作成

内容は公式ドキュメント参照

https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/environment-configuration-methods-before.html

 

続いて、GitLabCIからAWSにアクセスできるように、ソース直下に

.eb-config.sh

ファイルを追加

内容は

--

#!/usr/bin/env bash
set -x
set -e

{
AWS_CONFIG_FILE=~/.aws/config

mkdir ~/.aws
touch $AWS_CONFIG_FILE
chmod 600 $AWS_CONFIG_FILE

echo "[profile bw_package]" >> $AWS_CONFIG_FILE
echo "aws_access_key_id=${AWS_ACCESS_KEY_ID}" >> $AWS_CONFIG_FILE
echo "aws_secret_access_key=${AWS_SECRET_ACCESS_KEY}" >> $AWS_CONFIG_FILE
} &> /dev/null

--

こんな感じで、GitLab CIの環境変数にIAMのアクセスキーとシークレットアクセスキーを設定しておく。

 

後は.gitlab-ci.ymlの設定

今回は下記のような感じにしてみている。

-- 

stages:
- test
- deploy

test:
image: node:latest
stage: test
script:
- npm install
 - npm run build

deploy_aws:
stage: deploy
image: python:3.6-stretch
before_script:
- pip install awsebcli --upgrade --user
- git checkout master
- chmod +x .eb-config.sh
- ./.eb-config.sh
- export PATH=~/.local/bin:$PATH
- eb --version
script:
- eb deploy

--

 

後は便利なところとして、.ebextensions

を同じくソース直下にフォルダ作成して、色々設定してあげるとenv設定とか、ロードバランサー設定とか、様々な設定系が管理できる。

万が一アプリケーション削除などを行ってしまっても、時間経過以外は問題がなくなる。

 

次はLambdaへの試してみた感じを書きます!

 

※様々な記事を参考にさせていただき、ここにたどり着きました。