2017-01-24

顔の入れ替えを試してみた【Ubuntu】

ふとしたきっかけで画像の顔だけを入れ替える(正確にはある画像の顔を別の人の顔にする)というプログラムが公開されているのを知ったので、いつも利用しているPCにインストールして試してみました。
思ったより簡単にインストールできたので興味のある方はぜひ試してみてください。

【実行環境】 Ubuntu 16.04


※顔の入れ替えにはPythonが利用されています。もしPythonがインストールされていない場合はインストールしておいてください。


【手順1】 まず、メインとなるPythonプログラムは GitHub で公開されています。
そのため、まずこのプログラムを以下のようにしてダウンロードしましょう。


ダウンロードしたら適当な場所に展開しましょう。


【手順2】 そして、ついでにもうひとつダウンロードする必要があるので以下のようにGitHubのリンク(SourceForge)からダウンロードして中身を展開しておきます。


【手順3】 以下のURLへアクセスし、ページ中央からdlib C++ Libraryをダウンロード、これも展開しておきましょう。



展開したらそのフォルダにターミナルで移動し、以下の順番でコンパイルします。

cd examples
mkdir build
cd build
cmake ..
cmake --build . --config Release

そして、またdlibトップフォルダに戻り、setup.py を実行します。

sudo python setup.py install


【手順4】そして、Pyhon用の OpenCV もインストールしましょう。

sudo apt-get install python-opencv
 
 
では次に【手順1】で展開したフォルダの中に入って「faceswap.py」を
テキストエディタで開くと、

PREDICTOR_PATH = "/home/matt/dlib-18.16/shape_predictor_68_face_landmarks.dat"
 
という行があるはずなので、このパスを【手順2】でダウンロードしたファイルを指定します。

※私の環境では以下のようになりました。

PREDICTOR_PATH = "/home/sukohi/Downloads/shape_predictor_68_face_landmarks.dat"


【顔の入れ替えを実行】
では準備が完了したので実際に試してみましょう。
画像は以下の2枚をPixabay からダウンロードしてきました。

 face.jp

head.jpg

うまくいくと、head.jpg の顔が face.jpg の顔と入れ替えになります。

では、この2つの画像を【手順1】で作成した faceswap のフォルダの中に保存し、
以下のコマンドを実行しましょう。

sudo ./faceswap.py head.jpg face.jpg

うまくいくと output.jpg という画像が作成されているはずです。
上の画像を使って実際に作成されたは以下になります。



どうでしょう、すごくないですか?
お気づきかと思いますが、face.jpg 顔の暗い部分も元画像に適用されて
一枚の写真になっています。
こんなプログラムが公開されているなんてすごい時代になりましたね。

※ちなみに、入れ替えたい顔の目や口元などに髪の毛がかかってしまっていると
あまりうまくいかないパターンもありました。
また、背景にいろいろとものが写っていたりすると顔を検出できないパターンや、
まれなケースでは全く別の部分に顔が移植されてしまうこともありましたので
まだ完璧ではないようですが、こういうのを作る人ってすごいですよね。

今回は以上です。


2016-12-20

ファビコンを自動でつくってくれるサイト「Favicon Generator」を使ってみた。

サイト開発をしていて結構めんどくさい作業なのがファビコンの作成です。
特にこだわらない場合は favicon.ico というファイルを ico 形式の画像を作ってリンクすればいいだけですが、iPhoneなど様々な機種に対応させたい場合は個別に画像を用意してその全てにリンクなど HTML タグを追加しなければいけません。

そこで紹介するのが「Favicon Generator」です。

このサイトは画像を送信するだけで、様々なサイズのファビコンを作成してくれるというとても便利なサイトです。
また、必要なHTMLタグも表示してくれるので、それらをコピーするだけで設定も完了します。

では、作り方をひとつひとつ見ていきましょう。


1.画像のアップロード

画像の赤枠にあるボタンをクリックしてファビコンにしたい画像を選択します。

※注: 最低でも 70 x 70 px 以上の画像を選んでください。推奨は260 x 260 px 以上です。



2.ファビコンの設定をする

ここから iPhone など各機種向けの設定をします。

注意が必要なのは iOS です。
iOS のアイコンは透過画像に対応していません。
そのため、もしファビコンに png などの透過画像が利用されている場合、背景が真っ黒になってしまします。

これを防ぐためには以下の赤枠のラジオボタンにチェックを入れ、その下の色の設定を変更する必要があります。


その他 chrome や windows の設定ができますが、同じように設定を変更すると自動でサンプル画像が変更しますのでお好みの設定に変更してみましょう。

なお、もしファビコンをルートフォルダに設置したくない場合は、最後の項目で調整ができます。(ルートでいい場合はに特に設定する場合は必要ありません。)



3.ファビコンの作成

さぁ、それではファビコンを作成しましょう。
一番下にある以下のボタンをクリックすることで実行できます。


4.ファビコンのダウンロードと設置


まず「Download your package.」の横にある「Favicon package」ボタンをクリックするとダウンロードが始まりますので適当な場所に保存してください。
そして、保存した zip ファイルの中にあるファイル全てをサイトのルートフォルダへ展開します。
(つまり、http://example.com/favicon.ico にアクセスできるようになればOKです)

次に2個めの赤枠内の HTML コードを <head>〜</head>内に書き込みましょう。
これで設定は完了です。

5.テスト

もしきちんと設置されたかをテストしたい場合はチェックコンテンツも提供されていますので使ってみることをおすすめします。


なお、元になるファビコン画像を作りたいときは font-awesome で画像が作成できる fa2pngが便利です。 

今回は以上です。
おつかれさまでした。

2016-12-08

Laravel で全 view からログイン中のユーザー情報を取得する

Laravel を利用して開発をしていると、まだまだ全ての機能を使いきれていないことに気付かされることがあります。
ということで今回は ViewComposer を使って、どのビューからでもログイン中のユーザーにアクセスできるようにしてみたいと思います。

【実行環境】Laravel 5.3


手順は以下の3つです。
  1. ViewComposer を作る
  2. ServiceProvider を作る
  3. ServiceProvider を登録する

ではひとつひとつ見ていきましょう。

1. ViewComposer を作る

まず ViewComposer の作成です。
デフォルトでは専用のフォルダは用意されていませんので app/Http/ViewComposers というフォルダを新たに作成しましょう。
そして、その中に AuthViewComposer.php というファイルを作成&以下のコードを保存します。
 <?php namespace App\Http\ViewComposers;  
 use Illuminate\View\View;  
 class AuthViewComposer  
 {  
   protected $user;  
   public function __construct()  
   {  
     $this->user = \Auth::user();  
   }  
   public function compose(View $view)  
   {  
     $view->with([  
       'user' => $this->user  
     ]);  
   }  
 }  


2.ServiceProvider を作る

次に専用の ServiceProvider を作ります。
app/Providers/ViewComposerServiceProvider.php を作成&以下のコードを保存してください。
 <?php namespace App\Providers;  
 use Illuminate\Support\ServiceProvider;  
 class ViewComposerServiceProvider extends ServiceProvider  
 {  
   public function boot()  
   {  
     \View::composers([  
       \App\Http\ViewComposers\AuthViewComposer::class => 'layouts.*'  
     ]);  
   }  
 }  
※ ちなみに layouts.* の部分ではどの view に適用するかを設定することができます。


3.ServiceProvider を登録する

最後は先ほど作った ViewComposerServiceProvider を config/app.php へ登録します。
 'providers' => [  
   App\Providers\ViewComposerServiceProvider::class,  
 ],  

さあ、以上で設定は完了です。好きな view の中で {{ $user->email }} という風にユーザー情報にアクセスしてみましょう。
なお、念のために、以下のコマンドを実行しておくといいかもしれません。
 composer dumpautoload -o  

今回は以上です。
お疲れ様でした。



2016-11-10

Wikipediaを使って関連キーワード抽出プログラムを作ってみる

関連キーワードが必要になった

現在取り組んでいるプロジェクトの中で、キーワードを入力すると関連するキーワードを

「このキーワードもおすすめですよ」

という具合で表示する機能が必要になりました。

はじめはGoolgeのSuggestを利用すればいいかなと安易に考えていたのですが、この方法では関連するキーワードではなく、追加キーワードの提案という形になってしまいます。

実際の例をご覧ください ⇛ 「明石家さんま」をGoogle Suggestで検索

そうではなく、結果としては「明石家さんま」で検索すると「ビートたけし」や「タモリ」などといった関連するキーワードを取得したかったのでGoogle Suggest の利用は見送ることにしました。
(また、Googleに限らずAPIなどの提供は廃止されるリスクが常につきまとうという理由もありました。)

おもしろいアプローチを見つける

そこで、他の方法はないかとネットを探っているとひとつおもしろいアプローチをしている人がいました。それが以下のページです。

 [Yahoo!WebAPI+TwitterAPI]2つのAPIを組み合わせて関連キーワード抽出ツールを作ってみる

※ブログ記事、カッコ良かったのでオマージュさせていただきました。m_ _m


このページが提案している方法は以下になります。

1.まず Twitter API を使って検索したいキーワードのツイートを取得
2.Yahoo API のキーフレーズ抽出を使ってそのツイートから共通するキーワードを取得する
3.頻出する言葉が関連キーワード

つまり、検索するキーワードと一緒に使われている言葉を抽出するというアプローチです。

早速やってみた、、、しかし!

なるほど。
賢い人がいるものだなと感心し、実際に私もこのアプローチを試してみました。

・・・が!
結果はうまくいきませんでした。

なぜなら、現在Twitter に投稿されるものは無差別投稿しているものも多く、全く関連しないキーワードばかりが抽出されてしまったからです。

しかし、一緒に使われている言葉を抽出するというアプローチ自体はとても良い方法なのでなんとかTwitter以外の方法で考えてみることにしました。

YoutubeやHatena...
どれも納得できるような結果にはなりませんでした。

加えて、やはりAPIはそのうちにサービスが終了してしまうリスクも心にひっかかりこれら方法も断念しました。

そうだ wikipedia を使おう

そして、最終的に考えだしたのが Wikipedia を利用する方法でした。
流れとしては以下になります。

1.検索キーワードのことが書かれたwikipedia のページを読み込む
2.共通するキーワードを抽出(サイト内リンクのテキストを正規表現を使って取得)
3.集計して数が多いものを関連キーワードとする

この方法だと、APIが終了することはないですし読み込むページも1ページのみでいいのでレスポンスも早くすることができます。

さらに、関連語の抽出具合もより精度が上がったように思います。
以下は「明石家さんま」で検索した例です。
  • FNS27時間テレビ
  • ビートたけし
  • FNSの日
  • タモリ
  • 島田紳助
  • SMAP
  • さんま・中居の今夜も眠れない
  • フジテレビジョン 
  • 笑福亭鶴瓶
  • 所ジョージ 
※ちなみに以下のようなキーワード(リンク)は必要ないのでフィルターをかけて抽出しないようにしました。

1.Template: や Help: など wikipedia の特殊なリンク
2.年月日のみのリンク

ということで、このプログラムをクラス化しGitHubで公開していますので、実際のソースはそちらをご覧ください。

※ちなみに上記プログラムではHTTPアクセスにはGuzzleのバージョン6を利用しています。composerを利用してインストールする方法が楽かと思いますが、もしGuzzleを使いたくない人は file_get_contents() に書き換えて利用してみてください。

デモを見る


以上、Wikipediaを使って関連キーワードを抽出する方法でした。




2016-11-01

【Stripe】PHPで課金するための基本設定

課金サービスを簡単に組み込めるサービスとして、審査も必要がなくとても手軽な「stripe」に注目しています。
この記事を投稿する少し前まではトップページにはベータ版だとの記述がありましたが現在はそれもなくなり、本格的に日本でもリリースがされたようです。

そこで、今回は stripe で月額課金を利用するために必要な基本的な設定とアクセスキーの取得法を備忘録として投稿したいと思います。



1.まずはアカウントの作成

以下のURLからアカウントを作成しましょう

https://dashboard.stripe.com/register


2.月額課金するプランを作成

メニューリンクの中から「Plans」をクリックし、その後ページ右上にある「New」をクリックします。


以下のようなプラン作成フォームが表示されます。
最低限必要な項目は以下になります。

  1. ID (←プログラム上で利用する識別IDです。)
  2. Name (←課金名。見てわかりやすい名前をつけましょう)
  3. Currency (←通貨。JPYが日本円です。おそらくデフォルトです)
  4. Amount (←課金額。いくら課金するか?です)
  5. Interval (課金する間隔) 
入力したら、「create plan」 をクリックして保存します。


3.アクセスキーを取得する

ページ右上にある「Your Account」の中にある「Account Settings」をクリック。


現れたダイアログの中にある「API Keys」をクリックすると以下のようにアクセスキーが表示されます。

上がテスト用のキー。
下が本番用のキーになります。



以上がAPIに必要な設定&キーの取得になります。

実際にPHPに組み込むためにはライブラリが用意されていますのでそちらをつかうといいでしょう。

https://stripe.com/docs/libraries#php-library
https://github.com/stripe/stripe-php

Laravelを使っている場合はCashierというパッケージが本家Laravelによって提供されていますのでこちらを使う方がいいでしょう。

https://laravel.com/docs/5.3/billing#stripe-configuration


以上になります。

※それにしてもドンドン便利なサービスが増えてきていろいろな事が簡単にできるようになってきています。それだけ可能性が広がっているということなので今後も楽しみですね。^^



2016-09-10

PHPで国コードとその他情報を取得するクラスを公開しました

最近ウェブサイトの開発のご相談を頂く際にグローバルな視点で物事を考えているクライアント様方が増えてきたように思います。

その中で度々懸案事項となっていたことは、国コードを管理できるパッケージがあまり見つからないということでした。(あるのはありましたが、残念ながら日本語/英語の国名、2桁コード、3桁コード、数字コードが揃っているものではありませんでした)

そこで!
今後のことを考え独自に ISO 3166-1 をベースとしたパッケージを作成し、公開しました。
以下よりダウンロード or Composer によるインストールが可能です。

GitHub | SUKOHI/CountryCode

今回はフレームワークのパッケージではなく、純粋なPHPパッケージとしての公開ですので、いろんな環境でご利用いただけると思います。
みなさんのお役にたてたら嬉しいです(^^)


ちなみに、取得できるデータの例としては以下のような感じです。

【日本の例】

国コード(2桁) ・・・ JP
国コード(3桁) ・・・ JPN
数字コード ・・・ 392
国名 ・・・ Japan(英語)、日本(日本語)

実際の使い方はGitHubの方でご覧ください。

※なお、もし英語、日本語以外で国名を翻訳できる方は「assets/csv/country_codes.csv」にデータを追加するだけで新しい言語に対応ができます。よかったら GitHub にて Pull Request していただけるとなお嬉しいです! m_ _m

ではでは〜。
(最近ブログ記事をさぼってしまっているので時間を見つけて更新しなければ!)


2016-06-22

FlysystemをLaravelで使う

開発サイトの規模が大きくなってきたり、よりセキュアなサーバー環境を整えるためにサーバーを「ウェブサーバー」と「データサーバー」で物理的に分割する場合があると思います。

そして、PHPでファイルをリモートで読み込み/書き込みをするためには「Flysystem」という有名なパッケージを利用すればとても簡単にできるのですが、今回はこの「Flysystem」をLaravel(5.2)で使う方法をお届けしたいと思います。

※ちなみに今回はSFTPを使ってリモートサーバーとの連携をしますが、Flysystemは他にもaws」や「Azure」、その他には「DropBox」との連携までサポートしています。


【環境】

Laravel 5.2
SFTPで自分のVPSへSFTPを使って接続

【インストール】

まずは composer でパッケージのインストールです。
ここではLaravelと統合されているものをインストールします。
(ちなみにGitHubはこちら)
composer require graham-campbell/flysystem
次に私の場合はSFTPでの接続ですので、Flysystemのサブパッケージをインストールします。
league/flysystem-sftp:^1.0
はい。これでインストールは完了です。


【準備】

いつものように ServiceProvider と aliases を config/app.php に設置しましょう。

(ServiceProvider)
 GrahamCampbell\Flysystem\FlysystemServiceProvider::class  


(Aliases)
 'Flysystem' => GrahamCampbell\Flysystem\Facades\Flysystem::class  


そして、以下のコマンドで専用の設定ファイルを publish します。
php artisan vendor:publish
実行すると、configフォルダの中に「flysystem.php」というファイルが作成されていると思いますのでこの中で接続情報を保存します。

※もしコマンドを実行しても flysystem.php が作成されない場合は、以下のコマンドを実行してからもう一度トライしてみてください。
  • composer dumpautoload -o
  • php artisan config:cache

では、実際の中身です。

今回はSFTPでの接続なので「SFTP」のエリアを探して、必要な情報を入力すればOKです。
変更する場所としては、

  • host(IPアドレスなど)
  • port(変えている場合)
  • username
  • password
  • privateKey(プライベート・キーファイルのパス)
  • root(リモートサーバーの保存したいフォルダパス)

あたりになるかと思います。

はい、これで設定は完了です。


【使い方】

(基本的な使い方)

使い方はとても直感的でシンプルです。
次の例は、「test.txt」というファイルを作り、さらにそこに「bar」という文字列を書き込む手準になります。

 \Flysystem::connection('sftp')->put('test.txt', 'bar');  

たったこれだけです。
では逆にその保存した内容を読み込んでみましょう。

 echo \Flysystem::connection('sftp')->read('test.txt');  

これで「bar」が表示されます。


(フォルダを指定して保存)

もし、フォルダを指定して保存したい場合はこのようになります。

 \Flysystem::connection('sftp')->put('test_dir/test.txt', 'bar');  

この場合は、test_dir/test.txt にファイルが保存されます。


(画像を保存)

これもテキストファイルなどとやり方はほぼ同じで、

 $content = file_get_contents(public_path('images/my_photo.jpg'));  
 \Flysystem::connection('sftp')->put('me.jpg', $content); 

とやればOK。
とてもシンプルです。

ちなみに、Laravelを使って保存した画像をサーバーから呼び出して表示するには以下のようにすればいいでしょう。

(コントローラ)
 public function flysystem_image() {  
      $image_contents = \Flysystem::connection('sftp')->read('me.jpg');  
      return response($image_contents, 200)->header('Content-Type', 'image/jpeg');  
 }  

以上、Laravel と Flysystem を使ったサーバーの連携方法でした。
ではでは!