1.改进CARAFE特征上采样的源码YOLO的人种像分类系统
2.浅谈Golang两种线程安全的map
3.ROS开源项目:(一)中文语音交互系统ROSECHO (二)教学级别无人车Tianracer
4.fetch 详解
5.[源码解读] 深入理解pthread_cond_broadcast在调用之前需要加锁吗?
改进CARAFE特征上采样的YOLO的人种像分类系统
本文研究背景着重于全球化进程中人种识别的重要性,人种分类是源码通过人脸图像中的物理特征分析,来确定个体所属的源码人种群体。随着科技的源码发展,尽管地理隔阂减少,源码但种族间的源码杰克小说源码安装冲突仍需管理和融合。本文的源码系统针对人脸图像中不同群体的个体物理差异,利用改进的源码CARAFE特征图上采样的YOLO算法进行分类。
系统包含多个关键组件:数据集的源码收集和整理,如使用RaceDatasets,源码通过Python脚本转换格式;模型训练,源码如train.py支持自定义数据集训练和多GPU选项;export.py负责模型导出,源码如TorchScript和ONNX格式;ui.py提供图形用户界面,源码用于图像或视频的源码目标检测和分类;val.py用于模型验证,评估指标包括精度和召回率等。源码
在yolov5-CARAFE.py中,CARAFE模块通过预测上采样核并重组特征图,实现了内容感知的上采样,与传统方法相比,它具有更大的感受野和轻量化特性。classify\predict.py则用于图像分类推理,可处理多种数据源。整个系统优化了CARAFE的上采样过程,以提高人脸识别的准确性和效率。
系统结构清晰,包括训练结果的可视化分析,如损失函数、准确率和学习率的变化,以评估模型性能。通过整合源码、数据集和部署教程,系统提供了一个全面的解决方案。
参考文献引用了多项关于人种识别和面部特征研究的学术论文,为模型的开发提供了理论支持。研究者们通过实验验证了改进的CARAFE在人脸种族分类中的有效性,为跨文化交流和全球融合提供技术手段。
浅谈Golang两种线程安全的map
文章标题:浅谈Golang两种线程安全的map
导语:本文将深入探讨Golang中的本地缓存库选择与对比,帮助您解决困惑。
Golang map并发读写测试:
在Golang中,原生的map在并发场景下的读写操作是线程不安全的,无论key是否相同。具体来说,当并发读写map的保存java源码不同key时,运行结果会出现并发错误,因为map在读取时会检查hashWriting标志。如果存在该标志,即表示正在写入,此时会报错。在写入时,会设置该标志:h.flags |= hashWriting。设置完成后,系统会取消该标记。
使用-race编译选项可以检测并发问题,这是通过Golang的源码分析、文章解析和官方博客中详细解释的。
map+读写锁实现:
在官方sync.map库推出之前,推荐使用map与读写锁(RWLock)的组合。通过定义一个匿名结构体变量,包含map、RWLock,可以实现读写操作。
具体操作方法如下:从counter中读取数据,往counter中写入数据。然而,sync.map和这种实现方式有何不同?它在性能优化方面做了哪些改进?
sync.map实现:
sync.map使用读写分离策略,通过空间换取时间,优化了并发性能。相较于map+RWLock的实现,它在某些特定场景中减少锁竞争的可能性,因为可以无锁访问read map,并优先操作read map。如果仅操作read map即可满足需求(如增删改查和遍历),则无需操作write map,后者在读写时需要加锁。
sync.map的源码深入分析:
接下来,我们将着重探讨sync.Map的源码,以理解其运作原理,包括结构体Map、readOnly、entry等。
sync.Map方法介绍:
sync.Map提供了四个关键方法:Store、Load、Delete、Range。具体功能如下:
Load方法:解释Map.dirty如何提升为Map.read的io源码网机制。
Store方法:介绍tryStore函数、unexpungeLocked函数和dirtyLocked函数的实现。
Delete方法:简单总结。
Range方法:简单总结。
sync.Map总结:
sync.Map更适用于读取频率远高于更新频率的场景(appendOnly模式,尤其是key存一次,多次读取且不删除的情况),因为在key存在的情况下,读写删操作可以无锁直接访问readOnly。不建议用于频繁插入与读取新值的场景,因为这会导致dirty频繁操作,需要频繁加锁和更新read。此时,github开源库orcaman/concurrent-map可能更为合适。
设计点:expunged:
expunged是entry.p值的三种状态之一。当使用Store方法插入新key时,会加锁访问dirty,并将readOnly中未被标记为删除的所有entry指针复制到dirty。此时,之前被Delete方法标记为软删除的entry(entry.p被置为nil)都会变为expunged状态。
sync.map其他问题:
sync.map为何不实现len方法?这可能涉及成本与收益的权衡。
orcaman/concurrent-map的适用场景与实现:
orcaman/concurrent-map适用于反复插入与读取新值的场景。其实现思路是对Golang原生map进行分片加锁,降低锁粒度,从而达到最少的锁等待时间(锁冲突)。
它实现简单,部分源码如下,包括数据结构和函数介绍。
后续:
在其他业务场景中,可能需要本地kv缓存组件库,支持键过期时间设置、淘汰策略、存储优化、GC优化等功能。此时,可能需要了解freecache、gocache、fastcache、bigcache、groupcache等组件库。
参考链接:
链接1:/questions//golang-fatal-error-concurrent-map-read-and-map-write/
链接2:/golang/go/issues/
链接3:/golang/go/blob/master/src/sync/map.go
链接4:/orcaman/concurrent-map
ROS开源项目:(一)中文语音交互系统ROSECHO (二)教学级别无人车Tianracer
开发之路永无止境,往往在最后期限的要论文源码白板上写着的计划,往往只是一份空想。年初时,我定下了两个目标,计划在年末完成,然而时间在拖延中流逝,直到如今,我才发现,真正的开源精神并非一个人的单打独斗,而是众人协作的火焰。
记得一年前,我四处奔波,从开源社区汲取养分,同时也渴望贡献出自己的力量。然而,回顾过去,我却发现并没有做出任何贡献。这次,我希望能够集结各路伙伴,如果有志于参与开源项目,我们能共同打造一个GitHub上的百星、千星项目。几位资深程序员已经搭建好了基础,硬件改进较多,但程序完善程度未达预期。我们期望有更多的年轻朋友加入我们,与我们一起学习软件的版本控制、代码规范和团队协作,共同完成复杂的机器人项目,实现成长与蜕变。
(一)中文语音交互系统ROSECHO
ROSECHO的GitHub源码库已准备好,欢迎先star再深入阅读。此代码遵循BSD开源协议。
详细中文介绍文档
面对智能音箱市场,许多人或许会质疑我们的团队为何要涉足这个领域。然而,故事并非如此简单。在年,我们计划为一个大型展厅打造讲解机器人,采用流行于Android系统的接待引导机器人,其语音交互功能本无问题,但当时的挑战在于,尚未有集成cartographer在数千平米展厅中进行建图导航的平头底部源码方案。因此,我们决定打造一款完全基于ROS的讲解机器人。市场上虽然有众多智能音箱,但缺乏适用于ROS二次开发的产品。在科大讯飞一位大佬的介绍下,我们选择了AIUI方案,虽然开发难度大,但高度定制化,非常适合我们这样的开发团队。于是,我们主要任务转变为开发一款能够在ROS下驱动的智能音箱,ROSECHO便由此诞生。
第一版智能音箱在年4月问世,包含W的大喇叭、6环麦克风,以及ROS主控制器,下方控制了一个云迹科技的水滴底盘。了解过ROS星火计划进阶课程的朋友大概知道,课程中的大作业之一是语音命令移动机器人端茶倒水,而我们的任务相当于完成了一个加强版的大作业。
整个机器人在年7月完成,音箱分散到身体各个部分,环麦位于头顶,喇叭置于身体两侧。其他传感器、执行机构、决策、定位导航均基于ROS,定制了条特定问答,调试的机器人在场馆中行走上下坡不抖动,定位准确,7*小时工作稳定。音箱在大机器人上使用效果出色,主要得益于讯飞的降噪和回声消除技术,使得远场对话和全双工对话得以实现。社区中许多小伙伴也尝试了软核解决方案,但由于环境限制较大。于是,我们决定将音箱从大家伙改为普通智能音箱大小,通电即为智能音箱,USB接入ROS后,只需启动launch,即可接收语音识别结果,发送TTS语料,配置网络、接收唤醒角度等。
这次体验深刻地让我认识到,做大容易做小难。过完春节后,年8月ROS暑期夏令营期间,我们做了N款外壳,测试了M种喇叭,贴了P版外围电路,程序则改动不大。主要是由于时间有限,无法进行更多改进。样品均为手工制作,音质上,7w的喇叭配有一个无源辐射板,对于从森海HD入门的人来说,音质虽有瑕疵,但足以满足日常使用。
之前在想法中发布了一个使用视频,大家可参考运行效果。
ROSECHO基本情况介绍完毕,如何开始呢?
从零开始:推荐给手中已有讯飞AIUI评估板的小伙伴,记住,评估板而非麦克风降噪板(外观相似,简单区分是评估板售价元,降噪板元)。手头的评估板可通过3.5mm接口连接普通电脑音箱,再准备一根USB转转换头连接评估板DB9接口。后面需要根据实际串口修改udev规则,理论上可配合ROSECHO软件使用。硬件工作量较大,还需包含移动机器人所需机械设计、电气改造等。好处是拥有AIUI后台,可以定制云端语料和技能,但这又是另一个领域的能力,也不是三下五除二能完成的。
从ROSECHO开始:直接购买ROSECHO,首发的十台会附赠ROS2GO,只需连接自带电源并用USB线连接电脑,配置无线SSID和密码即可。连接方便,我们维护云端语料,人设为智能机器人管家,大家只需关注如何利用识别后的词句控制机器人和进行应答。云端问答AIUI处理,一些自定义问答可在本地程序中处理,务必联网,因为语音识别本身需要网络。具体软件启动和简单demo请查看GitHub软件库的说明。
然后做什么:要实现智能语音交互功能的移动机器人,需要对ROS中的actionlib非常熟悉。我们提供了简单的demo,可以控制机器人在turtlebot stage仿真环境中根据语音指令在两点之间移动,也可以根据唤醒方位进行旋转。之后还需增加音箱的TF变换。
大机器人中的状态机采用层次状态机(Hierarchical state machines),适用于移动机器人的编程,框架准备开源,方便大家开发自己的智能移动机器人策略。参考下面链接,希望深入了解也可以购买译本,肯定是比ROS By Example中的Smach状态机更适合商用级产品开发。
还计划做一套简单的语音遥控指令集,机器人问答库,在iflyos中构建适合机器人的技能库。何时能完成尚不确定,大家一起加油!
(二)教学级别无人车Tianracer
GitHub源码库已准备就绪,欢迎先star再深入阅读。遵循Hypha Racecar的GPLv3协议。
这是最近更新的详细使用手册。相比ROSECHO,Tianracer的基本功能均已完成,至少可以拿来学习建图导航,了解SLAM。
Tianracer是一个经过长时间准备的开源项目,年从林浩鋕手中接过Hypha Racecar后,希望将项目发扬光大。这两年改进了软件框架、周边硬件、机械结构,并增加了新的建图算法,但仍有大量工作待完成。这两个月在知乎想法和微信朋友圈分享了项目的进展,经历了多次迭代,现在大致分为入门、标准、高配三个版本。三个版本的软件统一,可通过环境变量更改设置。
最近整个项目从Tianbot Racecar更名为TianRacer,经过长时间探索,终于实现了合理的传感器与处理器配置。相比Hypha Racecar,处理器从Odroid XU4更改为NVIDIA在上半年推出的Jetson Nano,车前方增加了广角摄像头,利用Nano的深度学习加速,可以接近实时处理图像数据。相比之前的单线激光,广角摄像头大大扩展了后续可实现的功能。
TianRacer基本使用Python编写,从底层驱动到遥控等,目的是方便大家学习和二次开发。同时集成了cartographer和vins-fusion启动文件,可以尝试新的激光与视觉SLAM,基于Nano的深度学习物体识别等也是可以直接运行的。但目前功能尚未有机整合。
从零开始搭建:TianRacer搭建可能难度较大,不仅需要RC竞速车的老玩家进行机械电子改装,还需要对ROS熟悉并修改软件以进行适配,同时可能需要嵌入式程序员的帮助。对于主要关心搭建的朋友,可以参考小林的Hypha Racecar和JetRacer Tamiya版本的搭建指南。
从TianRacer开始:这批开发版本的无人竞速车附赠搭好环境的ROS2GO,TianRacer本身有开机自启功能,利用ROS2GO加上USB线对车体进行网络配置,就可以远程编程和调试。仔细参考提供的TianRacer看云文档(文档积极更新),大部分车体自带的功能都可以实现,包括但不限于建图、定位、导航、识别等。
然后做什么:利用TianRacer学习无人车的基础框架,还可以通过JupyterLab学习Jetson Nano的深度学习算法。未来计划将交通标识识别、行人和车辆检测、车道线检测等无人车基础功能融合,但不确定Jetson Nano的算力是否足够。目标是在校园内进行低成本的无人车竞速比赛,希望像CMU的Mobot室外巡线比赛一样持续发展,至今已举办届。
这个视频是搬运自YouTube。大家可深入了解非结构环境下的导航。对于不清楚结构化环境与非结构化环境的朋友,CMU和恩智浦的比赛完美诠释了两者之间的区别。
一起来玩耍吧!
在开源社区协作方面,我们也是第一次尝试,对于松散的协同开发经验不足,希望参与或组织过大型开源项目的朋友们加入我们,一起努力。有兴趣的朋友可以留言或私信。
前几日与朋友们闲聊时,想起几年前高翔博士赞助一锅粥(orb-ygz-slam)1万元时,我也只能提供支持。这次真心希望可以贡献出代码,实现实实在在的贡献。
年年底发布了开发者申请价格,但数量有限,早已连送带卖售罄。年又有几十位爱好者填写了问卷,忘记查阅。每年的双十一双十二我们都会有优惠活动,感谢大家的关注。
fetch 详解
fetch请æ±åºæ¥äºä¸æ®µæ¶é´,çæçå¨é¡¹ç®ä¸ä½¿ç¨è¿.è¿æ¬¡å¥½å¥½å¦ä¹ æ±æ»ä¸ä¸.
第ä¸: fetchç使ç¨
/github/fetch è¿ä¸ªæ¯fetchçgithub ä¸é¢ç»åºäºfetchç¨æ³.
https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch è¿ä¸ªæ¯fetchçmdnææ¡£,æ´å ç详ç».
æ¥ç两份ææ¡£çæ¶å,githubä¸é¢æ²¡æ设置headers èå¨ mdnä¸æ.ä¸å¼å§æä¹å¾è¿·è«,æåæ读å°äºä¸å¥è¯
å 为fetch ä¼èªå·±çå¹é æ°æ®ç±»å设置 content type, æ以åéjson æè formdata çå ¶ä»æ°æ®ç±»åçæ¶å,ä¸éè¦ä½ æå¨è®¾ç½®.
so intelligently.
æ以å¨å¤§é¨å使ç¨ççæ åµä¸,ç´æ¥ä½¿ç¨å°±è¡. åä¼ ç»çajaxæ¯èµ·æ¥,fetch 使ç¨èµ·æ¥æ´å æ¹ä¾¿,å°äºç¹ççé ç½®,åæ¯åºäºpromise,å¼åè ä¸æ³¨äºä¸å¡å°±è¡.
第äº: fetch ç缺ç¹
1.å ¼å®¹æ§,fetchçå ¼å®¹æ§å¹¶ä¸å¤ªå¥½,ie å safari é½ä¸æ¯æ
å¨ç§»å¨ç«¯åpc端 å ¼å®¹æ§ä¸å¥½å 为 è¿åçreponse body æ¯readable stream ä¸æ¯æ.
解å³æ¹æ¡: 使ç¨ç¬¬ä¸æ¹åº whatwg-fetch, å¦æåæå¨nodeç«¯ä½¿ç¨ isomorphic-fetch .
2.fetch 请æ±é»è®¤ä¸å¸¦cookie
å端请æ±çæ¶åé½ä¼è®¾è®¡å°token æééªè¯,å¾å¤æ¶åæ¯åå¨cookieéé¢ç.fetchéé¢åä¸ä¸ªåæ°credentials设计cookie
credentials æä¸ä¸ªå¼:
omit: é»è®¤å¼ï¼å¿½ç¥cookieçåé
same-origin: 表示cookieåªè½åååéï¼ä¸è½è·¨ååé
include: cookieæ¢å¯ä»¥åååéï¼ä¹å¯ä»¥è·¨ååé ( æ¨è使ç¨)
æ¨è使ç¨include.
3.fetch è·¨åé®é¢
fetchè·¨åä¹æ对åºçåæ°è®¾ç½®mode
same-originï¼è¯¥æ¨¡å¼æ¯ä¸å 许跨åçï¼å®éè¦éµå®åæºçç¥ï¼å¦åæµè§å¨ä¼è¿åä¸ä¸ªerroråç¥ä¸è½è·¨åï¼å ¶å¯¹åºçresponse type为basicã
cors: 该模å¼æ¯æè·¨å请æ±ï¼é¡¾åæä¹å®æ¯ä»¥CORSçå½¢å¼è·¨åï¼å½ç¶è¯¥æ¨¡å¼ä¹å¯ä»¥åå请æ±ä¸éè¦å端é¢å¤çCORSæ¯æï¼å ¶å¯¹åºçresponse type为corsã
no-cors: 该模å¼ç¨äºè·¨å请æ±ä½æ¯æå¡å¨ä¸å¸¦CORSååºå¤´ï¼ä¹å°±æ¯æå¡ç«¯ä¸æ¯æCORSï¼è¿ä¹æ¯fetchçç¹æ®è·¨å请æ±æ¹å¼ï¼å ¶å¯¹åºçresponse type为opaqueã
4.fetch è¿å é®é¢
å½ä¸ä¸ªè¯·æ±åéå®æ,æå¡è¿åç¶æç ,fetch ä¸ä¼rejectè¿ä¸ªresponse,ä»ç¶resolve,ä½æ¯ response.ok ä¼è®¾ç½®æfalse.å¾å¤æ¶åæ们ä¼äºæ¬¡å°è£ fetch reject error.
5 fetch æ æ³ abort è¯·æ± åtimeout
ç®åfetch 没æä¼ ç»ajax çabort æ¹æ³,è¿å¨èæ¡ä¹ä¸
ç»fetchå é¨çpromiseæ·»å ä¸ä¸ªabortæ¹æ³--å®é å°±æ¯rejectä¸ä¸ªerror.
使ç¨promise çrace, å 为promise éé¢çresolve å reject åªè½æ§è¡ä¸æ¬¡, å©ç¨race reject ä¸ä¸ªerror.
ä¸é¢çabort 并没æçæ£çabort æ¤æ¬¡è¯·æ±,åªæ¯éè¿promise promise reject ä¸ä¸ªerrorèå·².æå¨ç¿»é fetchçæºç çæ¶ååç°äºè¿ä¸ª
å¨é ç½®ä¸ç¡®å®åä¸ä¸ªsignal åæ°å¯ä»¥abort 请æ±,åç°æ¯åºäºAbortController,ä½æ¯è¿ä¸ªæ¯ä¸ä¸ªå®éªä¸å±æ§,åºæ¬ä¸è½ä½¿ç¨.
以ä¸æ¯æ对fetchç²æµ çæ»ç»,æä¸è¶³çå°æ¹æ¬¢è¿æåº.
[源码解读] 深入理解pthread_cond_broadcast在调用之前需要加锁吗?
深入探究pthread_cond_broadcast在调用之前是否需要加锁,我们需要先从条件变量的陷阱与思考的角度理解这一概念。
条件变量的使用涉及到多线程编程中的关键同步问题。在使用条件变量进行线程间通信和同步时,必须谨慎处理信号发送与等待线程的唤醒,以避免数据竞争(data race)和事件丢失等问题。
关于pthread_cond_broadcast的问题,其主要作用在于快速唤醒所有等待于给定条件变量上的线程。然而,在执行pthread_cond_broadcast之前是否需要加锁,主要依赖于操作的场景和条件变量的使用方式。
从pthread_cond_broadcast源码级别出发分析,可以发现这种操作主要涉及条件变量的状态管理以及线程等待唤醒的机制。在初始化condition时,有一个与lock相关的数据成员,用于控制条件状态和等待线程的唤醒。返回值中,0表示发送信号成功,这似乎暗示此操作在执行时不需要额外的锁。
但进一步考察,发现实际情况并非如此简单。条件变量的操作往往涉及到多线程环境中的锁与解锁操作。错误观点认为条件变量的broadcast可以独立于任何锁操作之外进行。这种错误观点忽略了在使用条件变量时,必须正确管理线程的锁,以防止数据竞争和事件丢失。
具体而言,使用条件变量时,应确保在进行任何可能导致状态变更的线程操作时,同时使用一个互斥锁(mutex)来保护条件状态的完整性。这样做的目的在于避免多个线程同时访问和修改条件变量的状态,从而消除数据竞争的风险。对于pthread_cond_broadcast这样的唤醒操作,也同样需要通过适当的锁机制来协调其执行和线程等待的处理。
总结,尽管源码级分析显示pthread_cond_broadcast本身可能不显式地要求额外的锁操作,但在实际使用中,确保线程同步的正确实现往往需要一个完整的锁策略。这意味着,正确的实践是在信号发送和等待唤醒的线程操作中始终使用合适的锁,而不仅仅依赖于pthread_cond_broadcast这一特定函数本身。正确地管理锁和条件变量的使用,能够有效预防数据竞争和保证程序的正确执行。