This page is intended for users in Hong Kong. Go to the page for users in United States.

札幌で夏休みの長期インターンシップレポートその1

2019年夏にインターンシップ参加した大学生のインターンシップレポートを抜粋して紹介します。実務に即した長期インターンシップならではの内容になっています。

インターンシップのテーマ

夏休みの間に商品情報管理プロジェクトに参加し、AWS Lambdaによるサムネイル画像生成処理の最適化を行いました。技術的にはAWS、Node.js、Sharpを扱いました。どれも初めての技術で不安でしたが無事に終わらせることが出来ました。

Lambda関数によるサムネイル生成

現状のサムネイル生成関数はgm(imageMagick)を使用していましたが、圧縮精度と縮小精度の低い画像が生成されるケースがあるため、問題を解決できる代替えライブラリの調査とサムネイル生成関数の開発を行いました。

使用言語をNode.js(Javascript)とPythonの2つに絞りました。Node.jsからはJimpとSharp、PythonからはPillowとOpenCVを選びました。

圧縮と精度の検証

まずサムネイル後の圧縮と処理速度を比較するための検証をします。

最初の検証は下準備となる切り取り処理・拡大縮小のサムネイル処理後に圧縮を行い、次に2つの言語のそれぞれ圧縮されたライブラリを使い、繰り返しサムネイル処理を10回行いました。

使用する画像は下の画像を使います。画像サイズは縦横512pxで容量は60.4 kBです。

サムネイルでは中心から160*390の切り取りと2倍拡大、半分縮小でQuality値は全て同じに固定して圧縮を比較しました。ここでNode.jsは現行との比較のためにgmも追加して比較します。

結果はNode.jsではSharpが最も良くgmより圧縮率が良く、PythonではOpenCVが良かったのですがgmよりも悪い結果でした。一番良いライブラリはSharpとなりました。

gmの縮小とSharpの縮小の画像はお互い変わらない品質で縮小されました。

Node.jsのSharpとPythonのOpenCVを用い拡大縮小を一つにして繰り返し10回行う方法で処理速度を検証した結果はSharpが最も優れていました。

開発と現行との比較

検証結果からNode.jsのSharpを使うことになり、現行の実装を元に2週間で開発しました。

今回のSharpを用いたLambda関数と現行のLambda関数の性能比較し検証します。

処理速度は商品情報管理で行っている写真のRawデータをQuality値を90に固定して2100*2100を1000*1000に縮小するのを3回実行した平均で算出しました。処理速度はCloud Watchから確認します。

結果、オリジナル画像の容量を10%程圧縮できたのと処理速度が平均で約0.6秒高速になりました。

gm(imageMagick)とsharpのオリジナルの圧縮率の比較を一部抜粋します。圧縮率もSharpの方が優れた結果となりました。

スタジオで撮影された大量の商品画像を如何に劣化させず高速にサムネイル処理を施すかが参考になりました。大量の写真データがあるため次は機械学習を用いた画像分類にもチャレンジしてみたいと思います。

ダイアモンドヘッド株式会社's job postings
2 Likes
2 Likes

Weekly ranking

Show other rankings
If this story triggered your interest, go ahead and visit them to learn more