2017年12月24日 星期日

街道圖片 semantic segmentation 語義分割實作

街道圖片語義分割結果 (只有「人」的部分著色)

所謂 (圖片的) semantic segmentation 語義分割 是指 「如何辨識一張圖片當中哪些 pixels 構成了人、 哪些 pixels 構成了車子、 ... 等等」 這個問題。 理論的部分 ( 知乎簡中原文 itread01 內容農場正體中文) 我也沒研究, 呵呵, 直接省略。 幾個月前上網找到 (僅適用於分析街道圖片的) ENet Semantic Segmentation 實作, 斷斷續續花了幾個週末 建立映射 撰寫 Dockerfile、 修改外包裝 python 程式, 這個週末終於把可用的版本上傳到 Dockerhub 的 ckhung/enet 去。 嗯, 效果不太好... 大家將就玩玩看吧!

  1. grep -i avx /proc/cpuinfo 查看你的 CPU 是否支援 avx 指令。 如果有印出一些東西, 就可以往下做; 如果沒有印任何東西, 只好換一部電腦囉。 詳見 跑 AI 程式時出現 illegal instruction 錯誤
  2. 把一些街道圖片 放在 ~/share/orig/ 底下, 並且建立 ~/share/result/ 跟 ~/share/hilight/ 兩個子目錄。 我蒐集的9張範例圖 是這樣搜尋來的: 「bicycles on the street」 把 bicycles 換成 politician 或 celebrity 等等。
  3. github 把我新增的 semseg.conf、 semseg.py、 hilight.sh 抓回 ~/share 。 因為未來我可能會小小修改這些小程式, 但不會重新打包 docker, 所以 docker 映像檔裡面的這些小程式可能不是最新版。
  4. docker pull ckhung/enet:17C 抓回我所製作的映像檔。 後面的 17C 請依據你下載當時 可用的 tag (版本) 名稱 修改。
  5. 這樣啟動: docker run -it --name ck_enet -v $HOME/share:/root/share ckhung/enet:17C bash 如果按 ^d 離開之後要再進入, 要下: docker start -ai ck_enet 詳見 圖解 docker 狀態轉換
  6. 在 docker 裡面這樣執行: time python ~/share/semseg.py -c ~/share/semseg.conf -o ~/share/result ~/share/orig/*.jpg 其中 -c 指定設定檔; -o 指定輸出目錄; 最後面的參數則是輸入圖檔名稱。
  7. 你可以用看圖軟體查看 ~/share/result/ 底下的成果。 還可以進一步這樣做 cd ~/share/orig/ ; for f in *.jpg ; do ../hilight.sh $f ../result/"${f%.jpg}.png" ../hilight/$f ; done 這會從 orig/ 底下的原圖產生黑白版, 再根據 result/ 底下的對應圖片, 只在 「人像」 的部分套上色彩。
  8. 如果想要研究 「天空」、 「牆壁」、 「人行道」、 「紅綠燈」、 「車子」、 「交通號誌」... 等等其他 18 種類別, 可以根據 create_colormap.py 裡面的數值去修改 hilight.sh 裡面的 rgb(220,20,60) 。 至於 hilight.sh 的運作細節, 請見 ImageMagick mask : 批次遮罩疊圖。。

唉, 效果不太好, 有點失望啊。 希望可以搜尋到效果更好的其他實作。 [12/30 修正 semseg.py 的一個大 bug: (1) 輸出應該要用 .png 不要用 .jpg (2) cv2.resze 的時候, 應該要用 interpolation=cv2.INTER_NEAREST 。 修正這兩處之後, 才可以確保輸出 (最多) 只有 19 個顏色, 而不會多出很多雜訊顏色。 修完之後, 效果略有改善。 原來先前是因為我去改圖片大小, 不慎加入雜訊, 效果才那麼差。]

1 則留言:

  1. 修正 semseg.py 的一個大 bug, 讓輸出結果的顏色數目維持(最多)19個,效果略有改善。

    回覆刪除