null集开放数据、开源算法、免费算力三位一体,为开发者提供高效学习和开发环境、高价值高奖金竞赛项目,支撑高校老师轻松实现AI教学,并助力开发者学习交流,加速落地AI业务场景https://aistudio.baidu.com/aistudio/projectdetail/5714362?contributionType=1
https://github.com/yingeo/yingeo-aihttps://github.com/yingeo/yingeo-ai有商业化公司做落地,做的是收银台视觉识别的项目,初次之外,视觉类的识别项目还是不少的,比如元气森林的柜子很多也是纯视觉的方案,纯视觉方案这块,如果是类似yolo系列的检测这个问题还是挺大的,更新类目不方便,不好处理badcase,在这一块,还是检索方案最优。
全流程:先主体检测+特征提取+faiss检索
predict_system.py
deploy/python/predict_system.py->
SystemPredictor()->
rec_predictor=predict_rec/RecPredictor->
det_predictor=predict_det/DetPredictor->
searcher=faiss.read_index()->
output=system_predictor.predict(img)->picodet
results=det_predictor.predict(img)->
xmin,ymin,xmax,ymax=results['bbox']->
crop_img=img[ymin:ymax,xmin:xmax,:]->
rec_results=rec_predictor.predict(crop_img)->PPLCNetV2
- predictor.run() ->
- feas_norm=np.sqrt(np.sum(np.square(batch_output),axis=1,keepdims=True))->1x512
scores,doc=searcher.search(rec_results,return_k)->
output=self.nms_to_rec_results()
faiss:
向量检索技术在图像识别、图像检索中应用比较广泛,其主要目的是,对于给定的查询向量,在已经建立好的向量库中,与库中所有待查向量进行特征向量的相似度或者距离计算,得到相似度排序。
paddleclas中支持HNSW32、IVF、FLAT三种算法算法,HNSW32是默认的,在检索精度和速度中较好的平衡,图索引方法,只支持添加图像,不支持删除图像特征,基于图的向量检索算法在向量检索的评测中性能是较好的,很多分布式检索都是HNSW32。IVF倒排索引,速度快,精度略低。FLAT暴力检索,精度最高,速度慢。
build_gallery.py
GalleryBuilder(config)->
rec_predict=RecPredictor(config)->
build()->
gallery_images,gallery_docs=split_datafile(config['data_file'],config['image_root'],config['delimiter'])->data_file:构建特征库所需要的标注图像的数据列表,每一行的格式:relative_path,labl;image_root:构建特征库所需要的标注图像所存储的文件夹的位置;delimiter:data_file中每一行的间隔符->
gallery_features=_extract_features(gallery_images,config)->987x512
- batch_img:32
- rec_feat=rec_predictor.predict(batch_img)->
- gallery_features[i-batch_size+1:i+1,:]=rec_feat->
index_method,index,ids=_create_index(config)->
- index=faiss.index_factory(config['embedding_size'],index_method,dist_type)->embedding_size:512,index_method:HNSW32
- index=faiss.IndexIDMap2(index)->
index,ids=_add_gallery(index,ids,gallery_features,gallery_docs,config,operation)->
- index:512,ids:{},gallery_features:987x512,gallery_docs:987,operation:new
- ids_now=(np.arange(0,len(gallery_docs))+start_id)->0,1,2,3,4.....
- index.train(gallery_features)->
- index.add_with_ids(gallery_features,ids_now)->
_save_gallery(config,index,ids)
- faiss.write_index(index,"vector.index")