#opencv#python#COCO#o bject_detection#custom_detection#사물 인식#image#video.processing#py#tensorflow#keras#Jupyter_notebook
안녕하세요. 진우의에서 진우를 맡고 있는 진우입니다.
오늘은 Github의 소스를 참고하고 학습된 Parameter or학습을 통해서 만든 Parameter set을 통해서 사진·영상으로 Object Detection을 소개합니다.
순서를 말씀 드리자면, Image dataset을 모으는 것->Labeling->학습->학습된 Parameter->Test의 순입니다.
먼저 AI학습을 통해서 영상이나 이미지에서 물체를 인식하기 위해서는 가장 먼저 인식하려는 물체가 무엇인지 알아야 하고 컴퓨터에 이 물체(객체)의 정보를 인식시키고 학습하려면 사진에서 해당 오브젝트를 끌고 수많은 Dataset을 만든 후 학습을 해야 합니다.학습을 하는 모델을 선택해야 하는데 활용 용도로 Compute의 속도가 빠른 YOLO, SSD등의 모델을 사용할 수도 있고 더 정확한 Detection때문에 MRCNN모델을 사용할 수도 있습니다. 저는 MRCNN(Mask RCNN)모델(resnet50)깊이를 통해서 학습을 하고 있으며, 직접 학습 모델을 만들어 봐도 좋지만 우선 MRCNN모델을 사용하기로 했습니다. (이후, 실시간 detection에서는 mobile_faster_rcnn을 활용했습니다.)모델에 Dataset을 넣어(MRCNN COCO모델의 경우 xml이 아니라 json형태의 Labeling&Class정보가 있는 파일에서 학습을 하는)학습을 시작하면 모델을 통해서 학습을 하고 이 때 tensorflow-gpu가 호출되고 CPU보다 병렬 처리 성능에서 가장 뛰어난 성능을 가진 GPU(그래픽 카드)가 해당 계산 작업(LOSS를 요구하는 Back-Propagation)을 합니다. 학습이 끝나면.h5확장자의 log파일(Parameter Weight)가 생성됩니다.*여기서 json형태의 파일은 Labeling 나온 각 객체의 polygon형태의 좌표치를 json의 형태로 보존된 파일입니다.생성된 log파일을 통해서 Git에서 받은 MRCNN코드 Sample을 변형해서 자신이 직접 Class를 분류한 담루치에 인식을 실행할 수 있습니다.나는 자동차와 관련된 자율 주행이나 모바일 앱의 이미지 프로세싱 분야에 관심이 있고 사람 얼굴 인식과 자율 주행시에 필요한 차선, 자동차 등을 인식하는 작업을 수행했습니다.
앞으로 처음부터 하나씩 차례로 나의 작업 절차를 소개하도록 하겠습니다.우리 작업 환경은 다음과 같습니다.OS:WindowsGPU:GTX960(4G)RAM:16GPackage:Tensorflow-GPU 1.14.0 ver, keras 2.1.3 verPython:3.6.8 verIDE:Pycharm Community ver, Annotation Tool 1 ver, 그림판(Eclipse&MongoDB, MariaDB를 활용하고 dataset관리를 용이하게 하는 것도 있습니다.)
먼저, MRCNN 모델을 활용하기 위해서는 Git를 통해 모델을 수용해야 합니다.Downloads Mac OS X Windows Linux/Unix Older releases are available and the Git source repository is on GitHub. Latest source Release 2.25.0 Release Notes (2020-01-13) Download 2.25.0 for Windows GUI Clients Git comes with built-in GUI tools ( git-gui , gitk ), but there are several third-party tools…git-scm.comGit을 설치하고 아래 링크는 제가 참고하였던 Git 페이지 입니다.
Mask R-CN for object detection and instance segmentation on Keras and Tensor Flow-matterport/Mask_RCNN github.com 상은 이미지 Object Detection을 위한 것으로 아래는 openc에 있는 detection을 위한 것으로, 다음은 openc
위 소스 다운로드 후 jupyternotebook에서 /Mask_RCNN-master/samples/demo.ipynb에서 Demo를 열 수 있습니다.*jupyter notebook은 anaconda3를 설치할 때 자동으로 설치되며, 다음과 같은 아이콘을 클릭하면 Explore창이 실행되면 jupyter notebook이 실행됩니다.

demo.ipynb 실행 화면 (나는 다른 화상 사진을 사용했습니다)

- 수행결과
- 다음과 같이 미리 학습된 파라미터 파일(mask_rcn_coco.h5)을 통해 80가지(class)의 오브젝트에 대하여 다물체 인식이 가능합니다.
- Custom Object Detection에 앞서서 MRCNN에 대한 개념을 잠깐 보겠습니다.Mask_RCNN은 2014년 RCN에서 점차 모델을 개선해 2017년에 MRCNN으로 발전했고, MRCNN의 전신인 Faster-RCNN을 확장해 Instance Segmentation에 적용하려는 모델로 MRCNN이 나왔습니다.Mask-RCNN은 Faster RCN에서 각 픽셀이 객체인지 아닌지를 판별하는 CNN층(Binary Mask)을 하나 더 두고 있으며, MRCNN은 어떤 모델보다 뛰어난 성능을 발휘했습니다.
- Faster RCNN에서 MRCNN으로 바뀐 점은 (1) ‘bbox 인식을 위한 브랜치’에 병렬적으로 ‘객체 마스크 예측 브랜치’를 추가하고 (2) ROI pooling 대신 ROI Align을 사용합니다.(1) 기존의 Faster RCN을 Object detection 역할을 하도록 하고, 각각 RoI에 masksegmentation을 부여하는 FCN(FN)을 추가했습니다.RoI Align을 통한 위치정보 왜곡방지 기법


- RoI Align에 대한 설명, 간단히 말하면 각 픽셀에서의 비중을 곱함으로써 정확한 위치정보를 가지고 Pooing 하게 된다.Mask Detection의 상당한 성능향상을 보여준다.
- MRCNN은 resnet 네트워크를 사용하는데, 4번째 스테이지의 마지막 Conv Layer에서 Feature를 뽑는다.Resnet 50, Resnet 101을 주로 사용한다.


Loss Function 의 경우 Classi f ication , bbox regression , binary Masking 의 총 합을 전체 Loss 로 구하는데 , – classification : Softmax Cross Entropy – bbox : bbox regression – mask : Binary Cross Entropy
네트워크 구조 비교(RCNN~MRCNN)

지금부터는 나만의 Cus tomdataset을 가지고 학습하기 위한 방법을 알아보도록 하겠습니다.Custom dataset을 이용하려면 먼저 Dataset을 모아야 합니다. 제 경우 많은 Dataset을 모을 수 있는 환경이 조성되어 있지 않기 때문에 차선이라던가 자동차에 대한 이미지 데이터를 모으기 위해서 웹을 이용했습니다.


- 학습을 위해 모은 이미지 이미지 모을 때 저장할 위치는 /Mask_RCNN_master/samples/balloon 폴더 전체를 복사하고 CUSTOM과 같은 이름으로 변경한 후 CUSTOM 폴더 내부에 기존 dataset 폴더에서 기존 dataset 폴더를 삭제하고, val주셨습니다. 친절함 폴더에서 val를 삭제하고, dataset 폴더 내부에 기존 dataset라는 폴더를 작성하시고 dataset 폴더 내부에 사용해주세요.밸리데이션 set는 machine learning 또는 통계의 기본 개념 중 하나입니다. 그런데 실무를 할 때 귀찮은 부분 중 하나여서 간과하기도 합니다. 그냥 training set에서 training 하고 test만 하면 되는데 3months.tistory.com

위와 같은 사진들을 수없이 모으고 컴퓨터는 사족을 못 쓰기 때문에 인식하고 학습하는 오브젝트에 대해서 학습 전에 labeling(Annotation)을 해서 각 오브젝트의 위치정보를 저장하고 있는 json 형태의 file을 추출합니다.Labeling Tool은 아래 링크를 봐주세요Region Shape Loaded Images Region Attributes File Attributes Keyboard Shatcuts L L Loadimages to start annotation or, seeGettingStarted.www.robots.ox.ac.uk(사실, Labeling Tool이 많아서 불편한 Tool을 만드는데 불편합니다 Tool이 많아서 사용하는데 Tool입니다.
Labeling Tool 사용법을 간단하게 적어보겠습니다

- Load or Add Images를 클릭하여 이미지를 불러온다.

2. CoComodel에 맞추어 po lygon 형식을 클릭하여 Labeling을 진행한다.

3. 마우스를 클릭하여 테두리에 따라 그린다.(실제로는 더 많이 그려야 한다.)

4. Region Attributes를 클릭하여 name & class 이름을 적어준다.반드시 Region Attributes이어야 한다.(필자는 처음에 File Attributes로 하였으나, 모든 물체의 인식에 실패하였다.)

5. Annotation -> Save as JSO N으로 저장한다.반드시 json 형태로 한다. CSV 형식(, , )이라고 하면, 다시 패싱하여 json 형태로 어차피 고쳐야 한다.

6. 저장 완료 저장을 하면 해당 이미지가 있는 폴더 안에 JSON 형식의 파일이 생성된다.

*json file Indenataion이 맞지 않지만 대략적으로 위와 같이 저장된다.key : File 이름 size : file sizeregions : Locationname : 형태(Type)region_attributes의 name : name : 저장한 class명 all_points_x : polygon의 각
다음으로 json파일로 학습을 시킬것입니다.조금 전에 복사해 놓은 CUSTOM 폴더에서 ‘balloon’이라고 쓰여졌다py파일을 저는 헷갈리지 않도록 road.py로 이름을 변경해서 활용합니다.road.py를 열면 주석으로 설명되어 있습니다. (road.py에 대한 설명과 수정사항 나열) 저는 pre_trained된 coco weight로 학습을 시킬 예정이기 때문에 나중에 anaconda환경에서 학습할 때 사용하는 명령어를 미리 다음과 같이 고쳐놓겠습니다.

- Training 시 CMD로 건너뛰는 명령어 road.py 이며, 아래 코드는 Weight에 대한 경로 관련 코드입니다. 경로 관련 오류가 발생하면 아래 코드를 수정합니다.

- PATH 코드 아래와 같이 절대 경로로 수정하셔도 됩니다.

다음은 configuartion 관련 코드입니다.mrcnn 폴더의 config.py 상에 Training 설정과 관련된 많은 값들이 있는데, 여기에서는 주요 config를 설정할 수 있습니다. 저는 NAME=”line”으로 하고 있고 사용중인 GPU는 1개이므로 1,NUM_CLASSES는 background(기존 이미지)+CLASS의 수만큼 넣어야 합니다. 저는 Car, Slane, Llane 세 개의 class를 labeling 할 때 작성했기 때문에 1+3이 되겠습니다. STEPS_PER_EPOCH1Epoch(모든 training Data를 한번씩 이용한 것)당 Training Step 수를 결정하고 DETECTION_MIN_CONFIDENCE는 Object Detection을 수행할 때 해당 정밀도 이상에 한하여 Detection함을 의미합니다.


좌:기존 코드 / 우: 수정된 코드 다음은 먼저 작성한 json 파일에서 데이터를 Load 작업을 하는 코드입니다.add_class의 첫 번째 인자는 NAME과 같고, 두 번째 인자는 class의 번호, 세 번째 인자는 Labeling 때 만든 이름입니다.subset위치에 train, val이 있는지 assert에서 확인하고 dataset_dir에 dataset경로를 넣습니다.


- 좌: 기존 코드 / 우: 수정된 코드 기존의 코드는 하나의 class에 대한 학습을 위한 코드이기 때문에 생성하는 클래스 수에 맞춰 name과 id(class 번호)를 넣는 코드를 작성했다.

- 코드 수정 전

- 코드 수정 후

*mrcnn * utils.py 위 utils.py 의 일부 코드를 보면 class_info에 대한 정보를 얻을 수 있고 class_info는 dictionary 형태로 source, id, name이 저장된다.
기존의 코드는 이미지의 수만큼 forloop을 돌면서 regions의 좌표 정보를 polygons에 저장하고 이미지에 좌표 정보를 넣는다. 그러나 여기에서는 다물체에 대한 class 분류는 들어 있지 않으므로 코드를 다음과 같이 수정하였다.class_name을 불러와 num_ids에 각 이미지별로 class_names 값을 넣는다.


- 좌: 기존 코드 / 우: 변경된 코드


- num_ids를 인자에 넣어 s elf.add_image(utils.py)로 전달한다.

- utils.py 의 add_image(imag e_id : 파일명, source : NAME, path : 경로)

*image_info는 list 형태로 정의되어 있습니다(utils.py) **kwargs는 키워드된 가변수의 인자를 함수에 보낼 때 사용하고 num_ids를 받으실 수 있습니다.
기존 load_mask의 “balloon” 을 NAME = “line” 이었기 때문에 “line” 으로 고치겠습니다.

기존 코드에서는 self.ima ge_info[image_id](*image_id=해당 이미지 1장)에 class에 대한 정보는 없고, 새 코드에서는 class 정보를 포함한 self.image_info를 info 변수로 받아 num_ids 값을 받아 Numpy type로 하고, 새 코드에서는 class 정보를 포함하는 self.image_info를 info를 info 변환을 대신합니다(masktype로 변환합니다) [npo 변환을 하고, nums] [ntype으로 변환합니다.(nums] 값을 받아 Nums

- 기존 코드

*수정된 코드 ‘balloon’을 ‘line’으로 수정

def train(model): 함수에서 tr ain 폴더와 val 폴더의 Training Dataset Load(취득)

def train(model): 함수에서 m odel.py의 train 함수를 training 정보를 포함해서 호출합니다.<Epoch수 설정, config.py의 LEARNING_RATE 설정, layers 설정> *Learning rate: 학습에 따라 parameter update시 변화치 정도를 Control*Epoch수: 학습횟수(위에서 Epoch당 training step은 100으로 설정) *layers는 모델에 따라 Control*Epoch수 : 학습횟수 : 학습횟수 : 학습횟수 (위에서 Epoch당 tratrate) cled upd ups “끝” “cled” *lll

color_splash는 Detected Ob ject에 대한 color를 보여주는 함수입니다.

Batch Size 설정 : Batch size = GPU_COUNT x IMAGES_PER_GPU와 training config에 대한 정보를 display 시켜줍니다.

*batch size는 1로 설정되었다 .
나머지 코드는 추가 분석하고 추가로 anaconda Prompt를 실행해 tensor flow가 설치된 가상환경에 접속해 training을 진행하겠습니다. road.py 의 directory 에 cd 명령어로 이동하여 이전에 주석 처리되었던 road.py 의 train 명령어를 복사하여 실행시킵니다.

*training 명령어

- prompt training 실행 화면 training을 진행하여 cmd창에서도 loss 값을 볼 수 있지만 tensorboard에서 GUI로의 training 실행과정을 확인할 수 있습니다.방법! 1. 현재 트레이닝을 하고 log 파일(.h5)이 생성되는 logs 폴더의 directory에 cd명령을 통해 접근합니다.2. tensorboard – logdir=./log 폴더명/명령을 통해 tensorboard를 실행합니다.제 경우 예: C: UsersjinwoMask_RCNN-masterMask_RCN-masterlogs > tensorboard–logdir=./circle20128T1339/3. Chrome 주소창에 localhost:6006을 입력하시면 아래와 같이 LOSS 그래프를 확인하실 수 있습니다.

*tensorboard 실행 시 cmd 창

- tensorboard와 같이 tr aining이 끝나면, logdata에서 .h5(Weight)파일이 생성됩니다.

상기 파일을 /Mask-RCN N-master 폴더에 복사합니다.
저의 .h5 파일 용량이 작은 이유는 저는 training시 config.py에서 “resnet101″이 아닌 “resnet50″을 사용했기 때문입니다.(config.py)

또한 Image에 대한 Resiz ning 여부를 설정할 수 있는데 기본은 square이고 이미지에 대한 resizing max, min 값을 결정하게 됩니다. “none”으로 설정할 때 resizing을 거치지 않고 training을 수행하며, 이때 이미지의 픽셀이 가로, 세로 모두 2^6으로 나누어 떨어지는 수이어야 합니다.(Ex) 640×320, 960×512) 이미지 pixel size가 2^6으로 나누어져 있지 않으면 “square”, “pad64” 등을 사용하거나 dataset을 resizing하여 사용할 수도 있습니다.( none )

아래는 model.py의 일부 코드이며, “none”을 선택할 때는 config.py만 수정하면 되도록 하기 위해 약간의 수정을 하였습니다.

*model.py 이제 학습한 model의 parameterWeight를 이용하여 Object Detection을 합니다.영상에서의 detection을 실행하기 전에 사진(이미지)에서의 detection을 우선 수행하도록 하겠습니다.
inspect_train_image.ipynb 파일을 jupyter notebook에서 열고 소스를 PycharmIDE로 복사합니다.소스를 받아온 후 import balloon 대신 import road하여 Weight path와 Dataset path를 수정합니다.

모드는 테스트 모드에서 i nference이고 gpu를 사용하므로 /gpu:0으로 작성합니다.

Weight를 불러와 test할 image를 선택합니다. ( random . choice , image _ id = x , for image _ id in range ( x ) 등 사용 )

- 이미지 detection까지 실행하는 아래 코드는 추가된 평가함수입니다. 10개의 random에 image를 꺼내어 test 후에 정확도값을 반환한다.( np . mean = 平均 )

Samples 폴더의 shapes.py에서 다물체 객체 인식의 힌트를 얻을 수 있습니다.

- shapes . pyCustom Object Detection 수행 결과


Epoch를 10번만 돌리면 정확도는 높지 않지만 더 많은 Dataset과 긴 Training epoch 수를 가진다면 더 정확한 Detection을 가질 수 있을 겁니다.다음 포스팅에서는 영상에서의 Object detection을 소개하고, Mask_RCNN이 아닌 다른 모델을 사용한 CUSTOMObject Detecion도 소개하겠습니다.MRCNN의 model.py, config.py 코드 분석 소개는 다음에 하겠습니다.
ref https://mylifemystudy.tistory.com/82 ( MRCNN 정리 ) https://3months.tistory.com/118 ( train set & validation set ) https://chess72.tistory.com/132 ( python 경로 관련 설명 ) https://github.com/jinu0124/mask_rcn_master_custom ( 上記 コード 参考 本 )