【선박분류】 이미지 상자 치기 코드draw_boxs_in_images

이미지 상자 치기 코드draw_boxs_in_images

a. 코드 제작 배경

알파 프로젝트를 하면서, 완성된 신경망을 통해 나온 결과를 CSV파일이 아닌 직접 눈으로 확인할 필요가 많았다. 예를 들어서 코드를 돌려서 나온 결과는 다음과 같다.

image

이 출력이 정말 좋은 값들로 출력이 된 것인지 확인할 필요가 있었다. 예를 들어 이 데이터를 이용해서 사진에 박스를 처줌으로써 우리의 신경망이 배를 잘 찾았는지 확인하는 것처럼 말이다. <원본> ![image](https://user-images.githubusercontent.com/46951365/79422206-6bc5db80-7ff7-11ea-8e98-2d4a5f6158e8.png) <박스를 친="" 사진=""> ![image](https://user-images.githubusercontent.com/46951365/79422209-6d8f9f00-7ff7-11ea-9dde-ec0106b87da6.png) ### **b.** **완성한 코드** ```python from matplotlib import pyplot as plt import numpy as np import argparse from PIL import Image from matplotlib import pyplot as plt import cv2 import pandas as pd from PIL import ImageFont from PIL import ImageDraw def save_image_with_box(box_info, imageName , start_index, last_index , image_path, save_path): """ box_info : panda로 받아드린 csv파일 image_Name : image_Num.png 파일을 봐야한다. start, last : box_info['file_name'][start ~ last]가 image_Num.png에 대한 정보를 담고 있다. img_path : 이미지가 있는 directory name save_path : 이미지가 저장될 directory name """ try: im = Image.open(image_path + imageName) except : print("no such file in directory : ", imageName) return plt.figure(figsize = (30,30)) plt.imshow(im) color_set = ['r','b','y','g'] for i in range(start_index, last_index+1): point1 = (box_info["point1_x"][i],box_info["point1_y"][i]) point2 = (box_info["point2_x"][i],box_info["point2_y"][i]) point3 = (box_info["point3_x"][i],box_info["point3_y"][i]) point4 = (box_info["point4_x"][i],box_info["point4_y"][i]) plt.plot([point1[0],point2[0]],[point1[1],point2[1]], linewidth=3, color = col-or_set[box_info['class_id'][i] - 1]) plt.plot([point2[0],point3[0]],[point2[1],point3[1]], linewidth=3, color = col-or_set[box_info['class_id'][i] - 1]) plt.plot([point3[0],point4[0]],[point3[1],point4[1]], linewidth=3, color = col-or_set[box_info['class_id'][i] - 1]) plt.plot([point4[0],point1[0]],[point4[1],point1[1]], linewidth=3, color = col-or_set[box_info['class_id'][i] - 1]) plt.savefig(save_path + imageName) plt.close() print("saved : ", imageName) if __name__ == "__main__": # 기본 설정 # image_path = './Alpha-project/images/' # save_path = './Alpha-project/images_with_boxs/' # csv_path = './Alpha-project/baseline.csv' parser = argparse.ArgumentParser(description='draw_rbox_in_images') parser.add_argument('--image_path', type=str, default='images') parser.add_argument('--save_path', type=str, default='images_with_boxs') parser.add_argument('--csv_path', type=str, default='baseline.csv') args = parser.parse_args() image_path = args.image_path + '/' # imagepath == images/ save_path = args.save_path + '/' # save_path == images_with_boxs/ csv_path = args.csv_path #csv file load box_info = pd.read_csv(csv_path) #run start_index = 0 for i in range(len(box_info)+1): try: # i+1번째 파일이 다른 이미지라면, i번째 파일에 대해서 박스가 처진 그림을 그린다. if box_info['file_name'][i][0:-4] != box_info['file_name'][i+1][0:-4]: save_image_with_box(box_info, box_info['file_name'][i] , start_index, i, image_path ,save_path ) start_index = i+1 except: # box_info['file_name'][i+1]가 존재하지 않으면 , 즉 999.png 이후를 바라본다면 save_image_with_box(box_info,box_info['file_name'][i],start_index,i, image_path ,save_path ) ``` ### **c.** **코드 사용하는 방법** **<****실행 방법>** ```python python drawRbox_in_Images.py --image_path=./images --save_path=./images_with_boxs --csv_path=./baseline.csv ``` <****위 실행을 위한 data structure>** drawRbox_in_Images.py images \- 0.png \- 1.png \- 2.png images_with_box \- (empty) baseline.csv **<****세부 사항>** \- images에 있는 사진만 박스 친다. \- test사진 1240장 모두가 꼭 있어야 하는 것은 아니다. ### **d.** **이를 통해 배운 내용: 원하는 코드 찾는 방법** 여러가지 코드를 작성하다 보면, 이런 생각이 들 때가 있다. “내가 하고 있는 작업을 누군가 하지 않았을까?” 이럴 때 다른 사람들의 코드를 찾아보는 방법이 아래의 3가지가 있다. 위의 코드를 만들 때도 이 방법을 사용해서 코드를 찾아보곤 했다. **코드 검색을 위해, 다음을 이용하자.** \1. 케글 - 이미 개발된 코드가 있을 수 있고, discussion에 data augmentation에 대한 정보도 많다 \2. 깃 - 패키지 안에, 검색을 함으로써 이미 만들어진 코드를 검색할 수 있다. \3. 구글 - 어떤 코드, 함수를 찾으려면 위의 방법을 이용하는게 낫다. [~하는 코드]는 구글에서 찾기 힘들다


© All rights reserved By Junha Song.