packages feed

fei-cocoapi-0.2.0: examples/Mask.hs

module Main where

import qualified Data.ByteString.Lazy as BS
import qualified Data.ByteString as SBS
import Control.Lens ((^.), (^?), ix)
import qualified Data.Vector as V
import qualified Data.Vector.Storable as SV
import qualified Data.Vector.Unboxed as UV
import qualified Data.Aeson as Aeson
import qualified Data.Array.Repa as RP
import Data.Array.Repa ((:.)(..), Z(..))
import qualified Data.Array.Repa.Repr.ForeignPtr as RF
import Codec.Picture as JP
import Codec.Picture.Repa
import qualified Data.Store as Store
import Control.Exception.Base

import MXNet.Coco.Mask
import MXNet.Coco.Types
import MXNet.Coco.Index

data Y8

class ToDynamicImage a where
    toDynamicImage :: Img a -> DynamicImage

instance ToDynamicImage Y8 where
    toDynamicImage (Img arr0) = ImageY8 $ JP.Image w h (SV.unsafeFromForeignPtr0 (RF.toForeignPtr arr) (h*w*z) )
      where 
        (Z :. h :. w :. z) = RP.extent arr
        arr = RP.computeS arr0    
 
readFromCache path = do
    bs <- SBS.readFile path
    Store.decodeIO bs

readFromJson path = do
    bs <- BS.readFile path
    case Aeson.decode' bs of
        Nothing -> error $ "cannot parse annotation file: " ++ path
        Just inst -> return inst

store path obj = do 
    SBS.writeFile path (Store.encode obj)
    return obj

readAnnotations path =
    readFromCache cache_file `catch` (\ e -> do
        let _ = e :: IOException
        readFromJson path >>= 
            store cache_file)
  where
    cache_file = "./instance.store"

annotatino_file = "/home/jiasen/dschungel/coco/annotations/instances_train2017.json"

main = do
    inst <- readAnnotations annotatino_file
    mapM_ (\cat -> putStrLn $ cat ^. odc_name) $ allCats inst 
    let anno = V.head $ allAnns inst
        imgId = anno ^. ann_image_id
        img   = V.head $ V.filter (\img -> img ^. img_id == imgId) (inst ^. images)
        height = img ^. img_height
        width  = img ^. img_width
    
    store "./imgs.store" $ inst ^. images
    store "./anns.store" $ inst ^. annotations
    store "./cats.store" $ inst ^. categories
    

    -- putStrLn $ show imgId

    -- crle <- case anno ^. ann_segmentation of 
    --     SegRLE cnts _ -> frUncompressedRLE cnts height width
    --     SegPolygon polys -> frPoly (map SV.fromList polys) height width

    -- mask <- decode crle

    -- let Z :. c :. w :. h = RP.extent mask
    --     maskHW = RP.backpermute (Z :. h :. w :. c) (\ (Z :. c :. w :. h) -> Z :. h :. w :. c) mask
    --     maskImg = toDynamicImage $ (Img $ RP.map (*255) maskHW :: Img Y8)

    -- savePngImage "a.png" maskImg

    -- putStrLn $ img ^. img_file_name
    -- putStrLn $ img ^. img_flickr_url
    -- putStrLn $ img ^. img_coco_url