Briswell Tech Blog

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

2019年のAI振り返り

コーンフレークが食べたくなる今日この頃。
今年も残すところあとわずかとなりました。あっという間でしたね!

さて、今年一年AI分野で多くのニュースがありました。弊社のオフィスでは新聞を取っているのですが、2日に1回は新聞の1面にAI関連の記事が載っていた感じです。

2019年のAIを振り返っていきましょう。

自然言語処理

今年は特に自然言語処理領域の発展が目立ちました。自然言語処理とは「私たち人間が日常書いたり話したりしている言語をコンピュータに処理させる」技術を表します。

例えば
「こーんふれーくがねたりない」
この文は
①コーンフレークが寝足りない
②コーンフレークがね、足りない
の2つの解釈ができます。

人間であれば「コーンフレークは寝ない」と考えるので①ではなく②を選ぶでしょう。ただ、機械はどちらを選んで良いかわかりません。このような自然言語の曖昧さを解消させる技術が発展してきています。

www.itmedia.co.jp

のようにAIが人間の読解力に近づいています。(いや超えていますね...)

また、Googleは2019年10月25日に最新の自然言語処理技術「BERT」を検索エンジンに採用したと発表しました。「BERT」は文脈を理解することができます。

www.blog.google

こちらのGoogleブログに以下のサンプルがあります。

2019 brazil traveler to usa need a visa.

訳は「2019年ブラジル人がアメリカに旅行に行く時ビザは必要か」(ブラジル人→アメリカ)になりますが、以前のGoogleは「to」(→)を理解できず、逆の意味「2019年アメリカ人がブラジルに旅行に行く時ビザは必要か」(アメリカ人→ブラジル)と認識していました。

それが「BERT」を導入することで文脈を正しく理解するようになっています。その結果、これまで文脈を理解されず、検索結果で上位に表示されなかったページが、正しく認識され表示されるようにもなります。(日本の検索エンジンにはまだ導入されていないようです)

ちなみに「自然言語処理」は、弊社Uri&Yuki漫才コンビ「下北ラヴァーズ」でもネタに取り込んでいます。来年の進化に期待です。

画像処理

2019年は画像認識より画像生成の技術が話題になりました。特にディープラーニング技術を応用した「GAN(敵対的生成ネットワーク)」というモデルが注目されました。

GANの仕組みは、美術品の贋作者と鑑定士の関係に例えられます。

贋作者の「Generator」と、贋作を見破ろうとする鑑定士の「Discriminator」という2種類のネットワークから構成されています。Generator(贋作者)は本物にできるだけ近い贋作を作り出し、その贋作をDiscriminator(鑑定士)は見破ります。Discriminator(鑑定士)の見破る能力が上がってくると、Generator(贋作者)もより質の高い贋作を作ります。するとDiscriminator(鑑定士)もまたまた能力を上げて... というのを繰り返し、最終的に本物そっくりのものが作られて
スーパー鑑定士:「これは間違いなく本物です。大切になさってくださいね。」
となるのがGANの仕組みです。

このGANを利用して、実在しないデータを生成したり、存在するデータの特徴に沿って変換ができます。

ウマがリアルタイムでシマウマに変換されます、 これは2つのデータソース間の変換を学習するCycleGANという技術を利用しています。

本物そっくりですね。このような偽造動画はディープフェイクと呼ばれます。 GANによってますますディープフェイクの技術は向上しており、社会問題にもなってきています。

www.kaggle.com

のようにディープフェイク検出がkaggleのコンペにもなっています。
来年は弊社AIチームもkaggleチャレンジ予定です。

AIのツール化

2019年はAI領域ではGUIツールがさらに広まった一年でした。今までは、機械学習モデルを構築したり、データ分析をする場合、プログラミング言語、数学など専門的知識が必要でした。GUIツールでは、プログラミングの記述が不要で、画面操作のみで容易に実行できます。その結果、モデル構築から検証までのスピード・サイクルを早めることもできます。

・サーバー・クラウド 不要!
・専門知識・プログラミング 不要!
・位置設定 不要!
のような、映像を撮影するだけで利用できるAI外観検査ツールも出てきました。

しかし、AI構築が全てツールだけで完結できるわけではありません。解決する課題を見極めたり、必要なデータを収集したり、AI構築するためのリソースはまだとても多いです。

最後に

AI関連の技術のアップデートはとても早く、数年前のものでも古典的な技術になったりします。AI業界で活躍するためには勉強し続けることが大事です。来年もナレッジの蓄積と共有を積極的に行っていきます。

みなさま、良いお年をお迎えください!

株式会社ブリスウェル

nginx リダイレクト記載方法

どうも、こんにちわ。

 

AWS ElasticBeansTalk を使ってとあるPJを進行していたところ、

検索画面で 

検索ボタン押す

結果が表示される

URLバーにカーソル合わせてEnter

 

と押すとなぜか

https://xxx.xxxx.xx/v1/order?orderDateFrom='1111-11-11'

https://xxx.xxxx.xx/v1/order?orderDateFrom='1111-11-11'?orderDateFrom='1111-11-11'

こうなるという... orderDateFrom 君はなぜ2回登場してくるの...

 

Localでは発生しなかったので、EBの nginx.config で記載していた

 

server {
listen 81;
rewrite ^ https://$host$request_uri permanent;

 こいつ怪しくない...??

となりました。

 

Google先生に聞いてみると確かに rewrite より return を使え

みたいなのがちらほらあり、試しに

server {
listen 81;
return 301 https://$host$request_uri;

 に変更したところ発生しなくなった。

 

中々難しいですな... 精進します...

クラスタリング勉強会

昨日は社内で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も必要となる。

 

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

 

 

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

 

 

です!