MacbookでDenseCapのLua実装コードを動かしてみた（成功）

###今回、出力された画像

![スクリーンショット 2021-08-08 22.52.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754134/aeff5c58-8f27-f053-23cc-28130f9c8102.png)

![](https://user-images.githubusercontent.com/87643752/128990053-2cb5ce51-7f42-48e4-ae9e-cebe0c8fd5b0.png)

###やったこと

画像の説明文を自動生成する__*Image captioning*モデル__の一つに、画像全体の内容を説明する文章を生成するだけでなく、画像内の各物体（オブジェクト）に、その物体が何なのかを記述した「形容詞＋名詞」形式の説明語句を重ねて表示してくれる__*DenseCap*モデル__があります。

- [DenseCap: Fully Convolutional Localization Networks for Dense Captioning](https://cs.stanford.edu/people/karpathy/densecap/)

画像全体の内容を説明する文も出力されるのですが、その文を構成する複数の単語が、それぞれ画像内のどの（検出された）オブジェクトに対応しているのかを、色で対応づけして視覚的に表示してくれます。

具体的には、検出されたオブジェクトを囲んだ矩形線の「色」と、画像全体の内容を説明したキャプション文を構成する各単語の「色」を揃える、という見せ方が採用されています。

__（ スタンフォード大学のDenseCap研究チームの公式サイトより ）__
![スクリーンショット 2021-08-08 23.23.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754134/0ec2d916-5c52-70e4-c630-fbb89cde4085.png)

今回、GitHubに公開されている__DensCapモデル__のLua実装コードを、Macbook（macOS Catalina）のCPU環境で動かしてみました。

- [github.com/jcjohnson/densecap](https://github.com/jcjohnson/densecap)

###解析対象の画像ファイルを用意

__*imgs*ディレクトリ直下__に、DenseCapに食わせたい画像ファイルを入れます。

```bash:Terminal
electron@diynoMacBook-Pro densecap % ls ./imgs
chrome_ssl_screen.png	resultsfig.png		test003.jpg		test007.jpeg		test010.jpg
elephant.jpg		test001.png		test005.jpg		test008.jpeg		unidentified_guy.png
electron@diynoMacBook-Pro densecap % 
```

```bash:Terminal
electron@diynoMacBook-Pro densecap % open ./imgs/test001.png
```

![test001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754134/0f584e36-80dc-e175-1d76-33dea1643c87.png)


###学習済みモデルで、好きな画像を指定して、推論を実行

デフォルトではGPUで推論が行われるので、CPU環境で実行する場合は、コマンドライン引数として、__*-gpu -1*__を付けないといけない。

> to run in CPU only mode, simply add the flag -gpu -1.

```bash:Terminal
electron@diynoMacBook-Pro densecap % th run_model.lua -input_image imgs/test001.png -gpu -1
1/1 processing image imgs/test001.png	
electron@diynoMacBook-Pro densecap % 
```

実行が終わると、__*vis*__ディレクトリにファイルが出力されると書いてある。
jsonファイルと画像ファイルが吐かれていた。

jsonファイルを__*wc -l*__で行数カウントすると、何と0行。
そして、画像ファイルを__*open*__コマンドで開くと、入力したのと同じ画像が・・・

こりゃ、実行失敗したか？（エラーは吐かれなかった）と肩を落としていたところ、
__*python -m SimpleHTTPServer 8181*__でサーバを立てて、結果を見ておく気力を奮い立たせました。

> This command will write results into the folder vis/data. We have provided a web-based visualizer to view these results; to use it, change to the vis directory and start a local HTTP server:
>
>```bash:
>cd vis
>python -m SimpleHTTPServer 8181
>```

ブラウザ（Google Chrome）のURL窓に、以下のローカルホストのポート8181番の/view_resultsを開くと、なんと、ちゃんと解析処理がされていました（安堵）

> Then point your web browser to http://localhost:8181/view_results.html.

![スクリーンショット 2021-08-08 22.51.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754134/4285c048-47af-de17-4016-591a5dcef0af.png)

```bash:Terminal
electron@diynoMacBook-Pro densecap % cd vis                                                         
electron@diynoMacBook-Pro vis % python -m SimpleHTTPServer 8181                                
Serving HTTP on 0.0.0.0 port 8181 ...
127.0.0.1 - - [08/Aug/2021 22:50:59] "GET /view_results.html HTTP/1.1" 200 -
127.0.0.1 - - [08/Aug/2021 22:50:59] "GET /utils.js HTTP/1.1" 200 -
127.0.0.1 - - [08/Aug/2021 22:50:59] "GET /jquery-1.8.3.min.js HTTP/1.1" 200 -
127.0.0.1 - - [08/Aug/2021 22:50:59] "GET /d3.min.js HTTP/1.1" 200 -
127.0.0.1 - - [08/Aug/2021 22:50:59] "GET /style.css HTTP/1.1" 200 -
127.0.0.1 - - [08/Aug/2021 22:50:59] "GET /data/results.json?sigh=25948 HTTP/1.1" 200 -
127.0.0.1 - - [08/Aug/2021 22:50:59] "GET /data/test001.png HTTP/1.1" 200 -
```

__Toggleボタンを押すと、各オブジェクトの矩形線上に、オブジェクト単位のキャプション文が表示されました。__

![スクリーンショット 2021-08-08 22.51.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754134/d740fa33-c51c-4dcc-9e78-9a3f862e3001.png)

__（ 拡大 ）__

![スクリーンショット 2021-08-08 22.51.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754134/be286d14-1228-1879-4f77-7e75e6cee55c.png)

__More detectionsボタンを押すと、検出された他のオブジェクトについても、矩形線と、オブジェクト単位のキャプション文の表示が、１つずつ増えていく。__

![スクリーンショット 2021-08-08 22.52.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754134/98c06a5a-c084-551a-4783-02708366524b.png)

![スクリーンショット 2021-08-08 22.52.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754134/6f5ed494-4a67-2b5b-ab04-7cd02f9fa813.png)

![スクリーンショット 2021-08-08 22.52.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754134/aeff5c58-8f27-f053-23cc-28130f9c8102.png)

####他の画像も試してみる

__（ 入力画像 )__

![](https://user-images.githubusercontent.com/87643752/128989750-ca7ac3f5-e7d7-478f-b580-5875c9b2f63d.png)

__（ 出力画像 )__

![](https://user-images.githubusercontent.com/87643752/128989991-ba8333f5-0a82-4273-be67-39de4f5efc52.png)

__More detectionsボタンを押すと、検出された他のオブジェクトについても、矩形線と、オブジェクト単位のキャプション文の表示が、１つずつ増えていく。__

![](https://user-images.githubusercontent.com/87643752/128990053-2cb5ce51-7f42-48e4-ae9e-cebe0c8fd5b0.png)


###環境構築

####（１） Luaを入れる

MacbookにLuaとluarocksを入れる。

####（2）luarocks installでライブラリを入れる

MacbookにLuaとluarocksを入れたあと、必要なライブラリを入れます。
ここで、__*luarocks install torch*__にハマりポイントがあったので、出くわした問題を解決したやり方を下の記事に記録しました。

- [【 Macbook環境 】luarocks install torchを実行して、Error: No results matching queryが出たら、github.com/torch/distro.gitから入れてみよう](https://qiita.com/electronics_diy721/items/710c271053ab5d328201)

>```text:
>luarocks install torch
>luarocks install nn
>luarocks install image
>luarocks install lua-cjson
>luarocks install https://raw.githubusercontent.com/qassemoquab/stnbhwd/master/stnbhwd-scm-1.rockspec
>luarocks install https://raw.githubusercontent.com/jcjohnson/torch-rnn/master/torch-rnn-scm-1.rockspec
>```

####（3）DenseCapの学習済みモデルを入れる

__*sh scripts/download_pretrained_model.sh*__を実行する。

- [github.com/jcjohnson/densecap](https://github.com/jcjohnson/densecap)

>
>__Pretrained model__
>You can download a pretrained DenseCap model by running the following script:
>
>```bash: 
>sh scripts/download_pretrained_model.sh
>``` 
>

####（飛ばしてもOK） Luaの対話型インタプリタ環境が立ち上がるか確認

Luaが、このMacbookで問題なく動くことを確認します。

```bash:Terminal
electron@diynoMacBook-Pro densecap % pwd                                                            
/Users/electron/Desktop/densecap
electron@diynoMacBook-Pro densecap % 
electron@diynoMacBook-Pro densecap % th                                                             
 
  ______             __   |  Torch7 
 /_  __/__  ________/ /   |  Scientific computing for Lua. 
  / / / _ \/ __/ __/ _ \  |  Type ? for help 
 /_/  \___/_/  \__/_//_/  |  https://github.com/torch 
                          |  http://torch.ch 
	
th> 
                                                                      [0.0000s]	
th> quit
                                                                      [0.0003s]	
th> exit
Do you really want to exit ([y]/n)? y
electron@diynoMacBook-Pro densecap % 
```

問題ないみたいです。