项目背景及赛题介绍
卫星的应用十分广泛,许多行业每天都依赖其运作。我们通常会根据高度把人造地球卫星运行的轨道简单地分类为低轨道(200千米~2000千米)、中轨道(2000千米~20000千米)和高轨道(20000千米以上)。
数据集介绍
目标特性
我们把需要解决的问题进一步具体化,概括起来就是星空背景下的序列图像小目标检测。
问题转化
结合目标特性,我们将数据集中的标注点位置视为bbox标记框的中心位置,取中心点上下左右宽度为3个像素,得到目标标注框。左上角的坐标和右下角的坐标值根据长宽偏移量计算得到,这样将问题转化为类别数为2的目标检测问题。
整体开发流程
本项目使用飞桨全流程开发工具PaddleX。整个项目工作主要包括数据预处理、模型训练及导出以及模型部署三部分:
1.数据清洗
2.数据集标注格式转换
from pycocotools.coco import COCO
import os, cv2, shutil
from lxml import etree, objectify
from tqdm import tqdm
from PIL import Image
CKimg_dir = './SpotGEOvoc/VOCImages'
CKanno_dir = './SpotGEOvoc/VOCAnnotations'
def catid2name(coco): # 将名字和id号建立一个字典
classes = dict()
for cat in coco.dataset['categories']:
classes[cat['id']] = cat['name']
# print(str(cat['id'])+":"+cat['name'])
return classes
def get_CK5(origin_anno_dir, origin_image_dir, verbose=False):
dataTypes = ['train']
for dataType in dataTypes:
annFile = '{}_anno.json'.format(dataType)
annpath = os.path.join(origin_anno_dir, annFile)
print(annpath)
coco = COCO(annpath)
classes = catid2name(coco)
imgIds = coco.getImgIds()
# imgIds=imgIds[0:1000]#测试用,抽取10张图片,看下存储效果
for imgId in tqdm(imgIds):
img = coco.loadImgs(imgId)[0]
showbycv(coco, dataType, img, classes, origin_image_dir, verbose=False)
def main():
base_dir = './SpotGEOvoc' # step1 这里是一个新的文件夹,存放转换后的图片和标注
image_dir = os.path.join(base_dir, 'VOCImages') # 在上述文件夹中生成images,annotations两个子文件夹
anno_dir = os.path.join(base_dir, 'VOCAnnotations')
mkr(image_dir)
mkr(anno_dir )
origin_image_dir = './SpotGEOv2' # step 2原始的coco的图像存放位置
origin_anno_dir = './SpotGEOv2' # step 3 原始的coco的标注存放位置
verbose = True # 是否需要看下标记是否正确的开关标记,若是true,就会把标记展示到图片上
get_CK5(origin_anno_dir, origin_image_dir, verbose)
3.将原始训练数据进行训练集和验证集划分
!paddlex --split_dataset --format VOC --dataset_dir MyDataset --val_value 0.2 --test_value 0
!paddlex --export_inference --model_dir=/home/aistudio/output/PPyolov2_r50vd_dcn/best_model --save_dir=/home/aistudio/inference
## python部署流程
import glob
import numpy as np
import threading
import time
import random
import os
import base64
import cv2
import json
import paddlex as pdx
os.environ['CUDA_VISIBLE_DEVICES']='0'
predictor = pdx.deploy.Predictor(model_dir='./infer', use_gpu=True, gpu_id=0, use_trt=True)
def get_images(image_path, support_ext=".jpg|.jpeg|.png"):
if not os.path.exists(image_path):
raise Exception(f"Image path {image_path} invalid")
if os.path.isfile(image_path):
return [image_path]
imgs = []
for item in os.listdir(image_path):
ext = os.path.splitext(item)[1][1:].strip().lower()
if (len(ext) > 0 and ext in support_ext):
item_path = os.path.join(image_path, item)
imgs.append(item_path)
return imgs
def crest_dir_not_exist(path):
if not os.path.exists(path):
os.mkdir(path)
def run(img_path,img_name,save_path):
result = predictor.predict(img_file=img_name, warmup_iters=100, repeats=100)
time2= time.time()
pdx.det.visualize(img_name, result, threshold=0.5, save_dir=save_path)
time3 = time.time()
print("Visual Time: {}s".format(time3-time2))
if __name__ == "__main__":
test_path = 'visual/'
save_path = 'output/visual/'
crest_dir_not_exist(save_path)
L = get_images(test_path)
N = len(L)
print(N)
for i in range(N):
print(L[i])
run(test_path, L[i],save_path)