본 논문은 ECCV 2020에 투고된 3D Scene Reconstruction 분야 논문 중 높은 성능을 보인 논문이다.

 

1. Introduction

 컴퓨터 비전 분야에서 우리 주변 세계를 재구성하는 것은 오래된 목표이다. AR, 자율주행과 같은 많은 응용 프로그램이 등장하고, 이는 3D 재구성에 크게 의존한다. 이 재구성은 구조화된 빛, ToF, LIDAR 등과 같은 특수한 센서들을 활용하여 깊이를 측정하고, 이를 3D Model로 융합한다. 이는 효과적이지만 , 가격이 비싸고, 특수한 하드웨어가 필요하다. 

 다른 방법론으로는 단안영상, MVS, Stereo Method 등 RGB 카메라를 사용하여 깊이 지도를 예측한다. 이는 위의 센서들 보다 덜 정확하고, 만족스럽지 못한다고 저자는 설명한다.

 본 논문에서 저자는 Sequnce RGB Image를 가지고, 3D Model을 예측하는 End-to-End Network을 제안한다. 이를 통해 네트워크는 더 많은 정보를 융합하고, 3D Geometric 사전 정보를 학습하여, 더 나은 재구성을 생성한다. 또한, 키프레임을 선택함으로써, 시스템의 복잡성을 줄이고 코스트를 줄인다.

 본 논문의 방법은 Cost volume based MVS(Multi View Stereo), TSDF(Truncated Signed Distance Function) Fusion 방법을 사용한다.

  먼저, RGB Image에서 2D CNN을 통해 Features를 추출하고 이를 Back Project을 통해 3D Feature Volume을 생성한다. 이를 3D CNN을 통해 TSDF Volume으로 재생성한다. 

 

2. Method

Input : length sequnece of RGB Image with intrinsics and pose

아래는 전체 네트워크 구성이다.

2.1 Feautre Volume Construction

 먼저 입력인 시퀀스 이미지를 Backbone Netwokr (2D CNN) 을 통과시켜, 2D Feature를 추출한다. 이후 보유하고 있는 Camera Parameters, Pose와 2D Feature와 수식(1)을 활용하여 World Space의 Voxle 좌표를 구하는 Back Projection을 진행한다. 이를 통해 3D Voxel Volume을 얻을 수 있다. 이러한 Volume은 모든 Sequnce에서 TSDF Fusion과 유사하게 Weighted Average-수식 (2)을 통해 축적되어 하나의 Volume을 얻을 수 있다.

2.2 3D Encoder-Decoder

위에서 축적된 하나의 Volume을 입력으로 한다. AutoEncoder 구조를 활용하여 3D Enoder-Deconder Network를 구성했다. 이를 통해 Feature을 Refine 하고, TSDF Output을 추출한다.

 위 그림처럼 Encoder-Decoder는 residual blocks, Downsampling, Upsampling으로 구성되고 각각은 위와 같다.

 또한 마지막 레이어에 1x1x1 CNN을 사용하여 TSDF Value를 추출한다. Sematic Segmentation Model 또한, 1x1x1 CNN을 통해 Segmentation Logits을 예측한다.

 

3. Implemenation Deatils

해당 부분은 논문에서 따로 살펴보는게 구현 및 이해하기에는 편하다. 하지만 장면의 개수는 짚고 넘어가야 할  것 같다.

본 논문 다음에 나온 NeuraRecon과 다르게, 본 논문은 전체 시퀀스에서 50개의 이미지를 랜덤으로 선택하여 입력으로 사용한다. 해당 부분은 다른 논문들과 많이 다르다. 논문에서는 Backbone Netwokr와 Encoder-Decoder 구성 방법 및 사용한 Loss와 Optimizer 등 다양한 Parameters를 설명하고 있다. 만약 구현을 원한다면 논문과 github를 참고하는 것이 좋을 것 같다.

3. Results

 본 논문은 ScanNet을 활용하여 평가를 진행하였다. 평가 지표는 아래의 표와 같다

나는 3D 재구성을 목적을 두고 해당 논문을 읽고 공부 했기 때문에 3D geometry Metrics에 대해서만 결과를 확인하였다.  본 논문은  컴퓨터 비전 기반의 방법론인 COLMAP, Depth 기반의 방법론들을 비교하였다. 결과는 아래와 같다.

이전의 방법론들 보다 L1 Score에서 많은 차이를 보여주고 있다.

 

본 논문은 기존의 다른 방법과 다르게 Depth Map을 사용하지 않고, End-to-End로 3D Model을 구성할 수 있다. 다음은 본 논문의 성능을 뛰어넘은 NeuralReocon을 포스팅할 예정이다.

 

출처 

Project Page : http://zak.murez.com/atlas/

github : https://github.com/magicleap/Atlas

  • Docker 란?

 

  • Docker 설치 전

먼저 컴퓨터 하드웨어가 가상화를 지원해야만 가능합니다.

그래서 작업 관리자(ctrl + alt + del)에 진입 후 성능에 들어가서 가상화를 확인할 수 있습니다.

 

 

  • Docker 설치

가상화가 사용이 가능하면 Docker 사용이 가능합니다..

 

이전에는 Docker Toolbox를 많이들 사용 했지만 현재는 사용이 불가능하기 때문에 Docker DeskTop for Windows을 사용해야 합니다. Docker 공식 홈페이지에서 가입 후 다운을 진행해주시면 됩니다.

 

Docker Desktop for Windows

 

Docker Desktop for Windows - Docker Hub

Docker Desktop for Windows Docker Desktop for Windows is Docker designed to run on Windows 10. It is a native Windows application that provides an easy-to-use development environment for building, shipping, and running dockerized apps. Docker Desktop for W

hub.docker.com

 

    다운 후 저와 같은 Error가 발생 할 수 있습니다.

다음과 같은 Error 가 나오게 되면 Linux 커널을 업데이트해주시면 됩니다.

 

  • Tutorial 진행

설치가 완료 되면  Docker Desktop을 실행 후 Tutorial을 진행해주시면 됩니다.

 

그리고 CMD창에 아래를 입력하시면 버전을 확인할 수 있습니다.

docker -v 

 

 

 

 

 

  • Image 다운로드

Docker에는 위에서 말한 것처럼 Image와 Container로 구성되어 있습니다.

 

그래서 Docker의  Image 목록을 찾기 위해서는 Docker hub을 통해서 목록을 찾을 수 있습니다.

 

그래서 작업관리자(ctrl + alt + del)에 진입 후 성능에 들어가서 가상화를 확인할 수 있습니그래서 작업 관리자(ctrl + alt + del)에 진입 후 성능에 들어가서 가상화를 확인할 수 있습니다.

 

 

예를 들어 Dokcer의 ubuntu Image을 다운 받고 싶으면 ubuntu 검색을 통해 사용할 수 있습니다.

 

또한 cmd 창에서도 아래의 명령어를 통해 검색이 가능합니다.

 

docker search ubuntu

 

원하는 Image을 찾으셧다면 Image을 아래의 명령어로 다운로드하시면 됩니다.

 

docker pull ubuntu:18.04

 

그러면 다운로드가 완료된 Image을 확인할 수 있습니다

 

  • Container 생성 및 실행

Image을 생성 했으면 해당 Image안에 여러 개의 Container 설치가 가능합니다.

 

아래의 명령어로 Container 생성이 가능합니다.

 

docker run -it --name 이름 Image이름 /bin/bash

 

docker run -it --name Ubuntu ubuntu:18.04 /bin/bash

 

 

 

docker ps -a 

위 명령어로 Container 확인이 가능합니다.

 

Container 시작 방법은 2가지로 첫번째 명령어, 두 번째 프로그램 내에서 가능합니다.

 

docker start 컨테이너이름

 

 

아래의 명령어로 진입이 가능합니다.

 

docker attach 컨테이너이름

 

이상으로 Docker Desktop for Windows 사용법에 대해서 알아보았습니다.

다음에는 Nvidia Docker을 Linux에서 사용해서 포스팅 하겠습니다.

감사합니다.

'Install' 카테고리의 다른 글

Machine Learning & Deep Learing - GPU 환경설정  (0) 2020.11.02
PyTorch_Anaconda & JupterLab Install  (0) 2020.11.02

Stereo Maching을 공부한 후 Vision Based로 더 공부하기 위해서 Shape - From - Shading(SFS)을 공부했다.

 

Shape - From - Shading(SFS)은 빛으로 인해 생기는 그림자의 모양을 통해 3D Shpae을 추정하는 Algortihm이다.

Object에 따라 최적의 광원 위치가 달라지면서, 표면의 반사율과 Texture에 따라 성능이 달라진다.

 

SFS을 공부하기 위해서 논문 "Hand on Shape from Shading'을 읽으면서 공부를 진행했다. 정확한 참고자료는 밑에 기재했다.

 

해당 논문은 Matlab으로 구성되어 있어서 이를 Python으로 재 구현했다.

그래서 논문 결과와 구현 결과를 비교해가면서 공부를 진행했다.

 

1. Terminology

SFS을 공부하기 전에 사용되는 용어를 공부했다.

2. Synthesized image generation

두 번째 챕터에서는 합성된 이미지를 Python을 통해 만들었다.

만드는 순서는 다음과 같다.

해당 순서를 통해 만들어낸 합성 이미지를 보면,

왼쪽 이미지에서 Illumination은 [0. 5, 0, 0.98] 이기 때문에 x축 양의 방향으로 빛이 들어온 합성 이미지를 만들었고, 

오른쪽 이미지에서는 [-0.5, -0.5, 0.98]의 방향을 통해 만들었기 때문에 x축과 y축 음의 방향으로 이미지가 만들어졌다.

3. Finding surface albedo and illumination Direction

세 번째 챕터에서는 2번째 챕터에서 사용한 Surface Albedo와 Illuminatio Direction을 찾았다.

 순서는

 1. 위에서 구한 합성 이미지를 Normalization을 진행

 2. μ_1,μ_2를

 3. E_x, E_y을 찾고 &  이를 Normalization

 4. Illumination & Albedo을 찾는다

 

구현한 결과가 논문 결과와 너무 다르게 나와서 해당 부분을 지속적으로 찾아본 결과 문제점을 파악했다.

논문에 나와있는 합성된 사진에서는 Object 말고 나머지 공간이 매우 적었다. 하지만 구현한  합성 이미지에서는 논문 이미지보다 더 큰 공간을 가지고 있었다. 따라서 이 두 개의 이미지에서 μ_1,μ_2 값이 다르게 나왔다. 그래서 논문과 최대한 비슷한 모양의 이미지를 만들어 결과를 비교했다.

논문의 결과와 유사한 값의 Albedo, illumination이 나왔다.

4. Finding Surface

Python으로 위 식들을 구현한 순서는 아래와 같다.

1. Section 3Finding surface albedo and illumination Direction Algorithm을 통해 Albedo 와 Illumination을 계산

2. Initializations

3. Surface normalConvolution을 위한 필터 생성

4. Iterate

 4.1 Convolution을 통해 Second derivatives인 p1,q1p1, q1을 구하고

 4.2 1에서 구한 AlbedoIllumination을 통해 Reflectance map 계산

 4.3 Reflectancederivatives 계산

 4.4 p , q Updating

 4.5 p와와 qFFT를 통해  Z을 계산

 4.6 다음 Step의 p,q 계산

5. Linear approaches

 5.1 Pentland Approach

 5.2 Shah Approach

 

최종 결과는 Shah Approach가 가장 좋은 결과를 얻을 수 있었다.

 

참고자료

Hands on Shape from Shading, Technical Report, Shireen Y. Elhabian, CVIP, May 2008

 

'Computer Vision > 3D Reconstruction' 카테고리의 다른 글

Stereo Camera Calibration  (0) 2021.01.26
Stereo Matching  (0) 2020.12.26
3D Reconstruction의 다양한 기법  (0) 2020.11.04

이번에는 Stereo Camera Calibration에 대해 공부를 진행했다.

 

1.Stereo Camera Calibration

 

Camera Calibration은 카메라가 가지고 있는 Parameter을 구하는 것을 의미한다.  

해당 Parameter을 구하기 위한 식은 위와 같다

 

1.1 카메라 내부 파라미터(Intrinsic Parameter)

 3차원 공간상에 존재하는 것들을 2차원 Image에 투영시키기 위해 필요한 Parameter

 초점거리, 주점, 비대칭 계수들이 존재한다.

 

카메라 내부 파라미터 들은 공개된 Calibration등을 사용하여 외부 파라미터 보다 쉽게 계산이 가능하다.

1.2 카메라 외부 파라미터(Extrinsic Parameter)

1.3 Algorithm

 알고리즘으로는 4가지 방법이 있다.

 

 

 

2. Python 구현결과

2.1 Camera Calibaration

Cameara Calibration은 좋지 않은 Camera로 인해 왜곡이 발생하기 때문에 이를 해결

1) 먼저 Chess Board의 패턴을 찾고

2) Camera Matrix, 왜곡계수왜곡 계수,회전/이동 Matrix를 찾음

3) 왜곡 보정

2.2 Stereo Camera Calibaration

두대의 Camera을 물리적으로 최대현 평행하게 한다고 해도 여러 이유 때문에 왜곡을 가지게 된다. 따라서 정렬된 영상을 얻기 힘들다.

아래의 사진과 같이 왼쪽 카메라와 오른쪽 카메를 동시에 사용해도 위치가 동일하지 않음.

1) 먼저 Chess Board의 패턴을 찾고

2) Camera Matrix, 왜곡계수왜곡 계수,회전/이동 Matrix를 찾음

3) Stereo Rectify

두 카메라로 촬영된 평면이 동일 선상에 놓일 수 있게 Recify을 진행

 

참고자료

 

OpenCV Stereo Camera Calibration 프로그램

blog.daum.net/pg365/223

'Computer Vision > 3D Reconstruction' 카테고리의 다른 글

Shape - From - Shading(SFS)  (0) 2021.01.26
Stereo Matching  (0) 2020.12.26
3D Reconstruction의 다양한 기법  (0) 2020.11.04

가장 먼저 Stereo Camera Calibration을 하기 전에 Stereo Vision으로 기초를 다졌다.

 

1. Stereo Matching

Stereo Matching은 왼쪽 Image와 오른쪽 Image 사이의 Disparity을 구하는 과정이다.

해당에는 Global과 Local Matching이 존재하고 특징은 위와 같다.

 

 

그래서 나는 Local Matching중에서 SAD와 SSD을 공부했다. 그리고 해당 기법을 Python의 OpenCV를 통해서 구현했다.

 

2. SAD(Sum of Absolute Difference)

SAD는 차이의 절대값을절댓값을 더한 것으로 Sum of Absolute Difference이다. 차이에 절댓값을 취하고 Matching Cost을 계산했다.

 

위는 SAD을 구현한 결과이다.

 

3. SSD(Sum of Squared Difference)

다음으로 구현한 것은 SSD이다. SSD는 Sum of Squared Difference로 차이에 제곱을 취한 후 합산하여 Matching Cost을 계산하는 기법이다.

구현한 결과는 위와 같다.

 

 

 

'Computer Vision > 3D Reconstruction' 카테고리의 다른 글

Shape - From - Shading(SFS)  (0) 2021.01.26
Stereo Camera Calibration  (0) 2021.01.26
3D Reconstruction의 다양한 기법  (0) 2020.11.04

해당 논문을 읽으면서 다양한 3D Reconstruction을 공부했다.

 

1. 3D Shape Extraction

 

3D Shape을 Extraction 하기 위해서는 자연적은 빛을 사용하는 Passive 기법과 추가적인 빛을 발산해서 사용하는 Active 기법이 있다. 

 

2. Passive

Passive Algorithm은 추가적인 빛을 사용하지 않고 환경에 따른 빛에 의존하기 때문에 데이터를 얻기 쉽지만 주변 환경이 변화함에 다라서 신뢰도가 많이 달라지게 된다.

 

2.1 Passive Stereo

2개의 Camera 사용하고 Same Time, Different Viewpoints의 조건을 만족해야 한다.

그리고 카메라의 위치 및 방향, 초점, 길이 등 카메라의 정보가 필요하다.

이 Algorithm은 인간의 양안과 유사하다. 

이것을 사용하기 위해서는 Triangulation(삼각측량)을 사용해서 Detph을 추줄 할 수 있다.

Triangulation(삼각측량)

위 기법으로 Image 두 개를 사용해서 Image의 모든 Pixel의 Depth을 구할 수 있다.

 

2.2 Structure-from-Motion(SFM)

 

 

정적 객체나 장면 주위에 카메라를 이동시켜 가면서 여러 시점에서 촬영한 Image에 Feature Point를 구해(EX SIFT) 이들의 프레임간 대응 관계를 구함으로써 3D Shape을 추정하는 Algorithm이다.

 

SFM을 이용해 각 촬영된 Image의 Feature Point을 얻고 각 촬영 장면마다 Point들과 관계를 서로 매칭하고 계산하여 카메라의 위치를 얻을 수 있다.

 

SFM은 3차원 기하 구조와 카메라 모션 정보를 추출하는 3차원 복원 과정이다.

 

2.3 Shape-from-Texture and Shape-from-Contour

 

표면에 있는 Texture을 통해서 Depth을 추정하는 Alogrithm이다.

 

2.4 Shape-from-Sillhouettes

 

Object의 Sillhouette Image을 사용해서 3D Shpae을 추정하는 Algorithm이다.

복잡하거나 오목한 object를 하면 성능이 낮다.

 

3. Actvie

추가적인 빛을 사용하는 기법이다. Passive와 다르게 레이저와 같이 다른 장치를 사용하고 데이터를 만들어야 하기 때문에 데이터를 수집하기 힘들지만, 주변 환경에 따른 영향력이 적어 신뢰도가 높다.

 

3.1 Active Stereo

 

레이저나 구조화된 빛과 같은 추가적인 빛을 사용한다. 레이저에 의해 찍힌 물체의 표면의 Point을 촬영한 Image들을 사용해 3D Reconstruction 한다. 

빛 또는 질감이 부족한 환경에서 유용하고 외부 광원의 의존성이 적다. 빛을 사용하기 때문에 빛이 강한 햇빛 아래와 거리가 멀어지면 사용이 불가능하다.

 

3.2 Time-of-Flight(ToF)

 

빛을 쏘아서 반사되어 오는 시간을 측정하여 거리를 계산하는 방식이다.

파형의 종류에 따라 Radar, Sonar, Optical Radar라고 부른다.

구성요소로는 4개가 있다

1. Illumination unit(적외선 사용) 2. Optics(반사된 빛을 모아 Image Sensor에 장면을 Image)

3. Image Sensor(PixelIllumination unit에서 물체로 그리고 초점 면 배열로 다시 이동하는데 걸리는 시간을 측정), 

4. Driver Electronics(Illumination unitImage Sensor는 고속 신호로 제어되고 동기화)

 

장점으로는

1. 단순하다 2. 효율적인 Distance Algorithm 3. 속도가 빠르다(한 번의 촬영으로 전체 장면 내에서 거리를 측정할 수 있다)

 

단점으로는

1. 배경 조명이 밝으면 사용이 불가능하다 2. 특정 유형의 ToF 장치는 서로의 측정을 방해하는 간섭이 존재한다. 3. 빛이 여러 경로로 가는 다중반사가 존재한다.

 

3.3 Shape-from-Shadig(SFS)

 

 

빛으로 인해 생기는 그림자의 모양을 통해 3D Shape을 추정하는 Algortihm이다.

Object에 다라 최적의 광원 위치가 달라지면서, 표면의 반사율과 Texture에 따라 성능이 떨어질 수 있다.

 

3.4 Photometric Stereo

 

 

3.3의 방법에 한정된 공간이라는 제약을 추가하여 여러 광원을 사용해서 방향을 바꿔가면서 3D Shape을 추정하는 Algorithm이다. 

Light의 색을 다르게 함으로써 Light Source을 줄이고 더 Detail 한 Texture을 얻을 수 있다.

 

4. 결론

해당 논문을 읽으면서 다양한 기법들을 조금 공부했기 때문에 후에 더 좋은 기법을 위해 해당 기법 중 장치가 필요하지 않은 Passive 기법들을 자세히 공부해 구현해 나갈 생각이다.

참고자료

9781601982858-summary.pdf

 

 

 

'Computer Vision > 3D Reconstruction' 카테고리의 다른 글

Shape - From - Shading(SFS)  (0) 2021.01.26
Stereo Camera Calibration  (0) 2021.01.26
Stereo Matching  (0) 2020.12.26

 

Machine Learning & Deep Learing을 위해 CPU가 아닌 GPU로 학습시키기 위해서 GPU 환경 설정이 필요했다.

 

따라서 PyTorch에서 GPU로 학습 시키기 위한 환경 설정을 해주었다.

 

1. Nvidia Drvier Install

 

www.nvidia.co.kr/Download/index.aspx?lang=kr

 

해당 링크에 들어가면, 각자 그래픽카드에 맞는 Driver를 Install 할 수 있다.

 

다운로드 완료 후 cmd을 사용해 아래 코드를 입력하면 Nvidia Driver가 잘 다운되었는지 확인 할 수 있다.

 

CUDA가 다운로드 되어 있으면 CUDA Version도 확인 할 수 있다.

 

2. CUDA Install

 

CUDA Toolkit을 Install 하기 위해서 위에서 확인했던 GPU(NVIDIA-SMI 445.75)을 확인해야 한다.

 

그래서 나는 CUDA 11.0을 Install 했다.

 

아래의 링크에서 Install 가능하다.

 

developer.nvidia.com/cuda-11.0-download-archive?target_os=Windows&target_arch=x86_64

 

CUDA Toolkit 11.0 Download

Select Target Platform Click on the green buttons that describe your target platform. Only supported platforms will be shown. By downloading and using the software, you agree to fully comply with the terms and conditions of the CUDA EULA. Operating System

developer.nvidia.com

3. cuDNN Install

 

developer.nvidia.com/rdp/cudnn-archive

 

cuDNN Archive

NVIDIA cuDNN is a GPU-accelerated library of primitives for deep neural networks.

developer.nvidia.com

위 링크를 통해 cuDNN을 Install 할 수 있다.

 

4. 환경변수 설정

 

2번에서 CUDA를 Install 했다면

 

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0

 

아래와 같이 CUDA가 Install 되는데 이 파일들을 cuDNN 경로에 이동시킨다.

 

 

 

 

환경 변수 편집에 들어가서 PATH에 들어가서 편집을 진행하면 된다.

 

 

 

 

 

위 그림과 같이 복사를 해 3개를 모두 추가하면 된다.

 

참고자료

1. wordbe.tistory.com/entry/Windows-tensorflow-GPU-%EC%84%A4%EC%B9%98

'Install' 카테고리의 다른 글

Docker란 ? 그리고 Docker 설치 및 사용 for Window  (2) 2021.03.30
PyTorch_Anaconda & JupterLab Install  (0) 2020.11.02

1. Anaconda Install

 

www.anaconda.com/products/individual

 

Anaconda | Individual Edition

Anaconda's open-source Individual Edition is the easiest way to perform Python/R data science and machine learning on a single machine.

www.anaconda.com

Python Version에 맞는 Anaconda를 다운로드한다.

 

2. 가상 환경 생성 후 Anaconda에 PyTorch Install

 

2.1 가상 환경 생성

 

Anaconda Prompt를 실행시킨 후

conda create -y -n PyTorch ipykernel python=3.7.1

위 코드를 입력하면 Conda PyTorch라는 가상 환경을 만들어 준다. 

 

-n 뒤에는 가상환경의 이름을 적어주고 Python Version을 3.7.1로 설정했다.

 

2.1.1 가상환경 복사

 

conda create --name PyTorch --clone base

 

 

2.2 가상환경 진입

activate PyTorch

위 코드를 입려하여 가상 환경으로 진입하여 준다.

 

2.3 가상환경 내 PyTorch 설치

 

pytorch.org/

 

PyTorch

An open source deep learning platform that provides a seamless path from research prototyping to production deployment.

pytorch.org

위 사이트에 들어가 컴퓨터 환경에 맞춰 설정해주면 아래의 Command를 입력하면 된다.

 

 

3. Jupyter에 등록

 

python -m ipykernel install --user --name PyTorch --display-name "PyTorch"

 

위 코드를 입력 한후 아래의 코드를 입력하여 가상 환경을 빠져나온다.

 

conda deactivate

 

이제 JupterLab을 사용하여 확인하면 된다.

 

 

 

4. Jupyter Lab 실행 파일 만들기

 

pip install jupyterlab

위 코드를 cmd에 입력하여 설치할 수 있다.

 

그 후 검색을 통해 JupyterLab 파일을 찾아서 바탕화면이나 시작화면에 고정후 사용하면 된다.

 

 

만약 실행이 되지 않으면 환경 변수에 다음과 같이 추가를 해주면 된다.

 

 

 

 

 

참고자료

1. jsyoo94.tistory.com/12

+ Recent posts